From b795d7086b9934aea4a8d46bf91f3383f8284043 Mon Sep 17 00:00:00 2001 From: Andrej Krejcir Date: Fri, 6 Oct 2023 10:55:00 +0200 Subject: [PATCH 1/3] chore: Update golang version to 1.20 Signed-off-by: Andrej Krejcir --- Dockerfile | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 985e3433..d01b4930 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM registry.access.redhat.com/ubi8/ubi-minimal as builder RUN microdnf install -y make tar gzip which && microdnf clean all -RUN curl -L https://go.dev/dl/go1.19.2.linux-amd64.tar.gz | tar -C /usr/local -xzf - +RUN curl -L https://go.dev/dl/go1.20.13.linux-amd64.tar.gz | tar -C /usr/local -xzf - ENV PATH=$PATH:/usr/local/go/bin WORKDIR /workspace diff --git a/go.mod b/go.mod index 9a6ffc84..20673fd7 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/kubevirt/vm-console-proxy -go 1.19 +go 1.20 require ( github.com/emicklei/go-restful/v3 v3.10.1 From 37bf0633a4b3b9783b3ea78f93dbf45630dcbe03 Mon Sep 17 00:00:00 2001 From: Andrej Krejcir Date: Fri, 6 Oct 2023 10:47:27 +0200 Subject: [PATCH 2/3] chore: Update non-kubernetes dependencies Signed-off-by: Andrej Krejcir --- go.mod | 17 +- go.sum | 36 +- .../emicklei/go-restful/v3/CHANGES.md | 11 +- .../emicklei/go-restful/v3/README.md | 5 +- .../emicklei/go-restful/v3/route.go | 17 +- .../emicklei/go-restful/v3/route_builder.go | 45 +- .../github.com/fsnotify/fsnotify/.gitignore | 10 +- vendor/github.com/fsnotify/fsnotify/AUTHORS | 62 - .../github.com/fsnotify/fsnotify/CHANGELOG.md | 113 ++ .../fsnotify/fsnotify/CONTRIBUTING.md | 72 +- vendor/github.com/fsnotify/fsnotify/LICENSE | 47 +- vendor/github.com/fsnotify/fsnotify/README.md | 205 +-- .../fsnotify/fsnotify/backend_fen.go | 162 +++ .../fsnotify/fsnotify/backend_inotify.go | 459 ++++++ .../fsnotify/fsnotify/backend_kqueue.go | 707 ++++++++++ .../fsnotify/fsnotify/backend_other.go | 66 + .../fsnotify/fsnotify/backend_windows.go | 746 ++++++++++ vendor/github.com/fsnotify/fsnotify/fen.go | 38 - .../github.com/fsnotify/fsnotify/fsnotify.go | 80 +- .../fsnotify/fsnotify/fsnotify_unsupported.go | 36 - .../github.com/fsnotify/fsnotify/inotify.go | 351 ----- .../fsnotify/fsnotify/inotify_poller.go | 187 --- vendor/github.com/fsnotify/fsnotify/kqueue.go | 535 ------- vendor/github.com/fsnotify/fsnotify/mkdoc.zsh | 208 +++ .../{open_mode_bsd.go => system_bsd.go} | 4 - .../{open_mode_darwin.go => system_darwin.go} | 4 - .../github.com/fsnotify/fsnotify/windows.go | 586 -------- vendor/github.com/go-logr/logr/.golangci.yaml | 3 - vendor/github.com/go-logr/logr/discard.go | 32 +- vendor/github.com/go-logr/logr/funcr/funcr.go | 27 +- vendor/github.com/go-logr/logr/logr.go | 166 ++- .../go-task/slim-sprig/.editorconfig | 14 + .../go-task/slim-sprig/.gitattributes | 1 + .../github.com/go-task/slim-sprig/.gitignore | 2 + .../go-task/slim-sprig/CHANGELOG.md | 364 +++++ .../github.com/go-task/slim-sprig/LICENSE.txt | 19 + .../github.com/go-task/slim-sprig/README.md | 73 + .../go-task/slim-sprig/Taskfile.yml | 12 + .../github.com/go-task/slim-sprig/crypto.go | 24 + vendor/github.com/go-task/slim-sprig/date.go | 152 ++ .../github.com/go-task/slim-sprig/defaults.go | 163 +++ vendor/github.com/go-task/slim-sprig/dict.go | 118 ++ vendor/github.com/go-task/slim-sprig/doc.go | 19 + .../go-task/slim-sprig/functions.go | 317 +++++ vendor/github.com/go-task/slim-sprig/list.go | 464 +++++++ .../github.com/go-task/slim-sprig/network.go | 12 + .../github.com/go-task/slim-sprig/numeric.go | 228 +++ .../github.com/go-task/slim-sprig/reflect.go | 28 + vendor/github.com/go-task/slim-sprig/regex.go | 83 ++ .../github.com/go-task/slim-sprig/strings.go | 189 +++ vendor/github.com/go-task/slim-sprig/url.go | 66 + vendor/github.com/golang-jwt/jwt/v4/token.go | 15 +- vendor/github.com/golang/mock/gomock/call.go | 54 +- .../github.com/golang/mock/gomock/callset.go | 3 +- .../golang/mock/gomock/controller.go | 5 +- .../github.com/golang/mock/gomock/matchers.go | 76 +- vendor/github.com/google/pprof/AUTHORS | 7 + vendor/github.com/google/pprof/CONTRIBUTORS | 16 + vendor/github.com/google/pprof/LICENSE | 202 +++ .../github.com/google/pprof/profile/encode.go | 567 ++++++++ .../github.com/google/pprof/profile/filter.go | 270 ++++ .../github.com/google/pprof/profile/index.go | 64 + .../pprof/profile/legacy_java_profile.go | 315 +++++ .../google/pprof/profile/legacy_profile.go | 1225 +++++++++++++++++ .../github.com/google/pprof/profile/merge.go | 481 +++++++ .../google/pprof/profile/profile.go | 805 +++++++++++ .../github.com/google/pprof/profile/proto.go | 370 +++++ .../github.com/google/pprof/profile/prune.go | 178 +++ vendor/github.com/onsi/ginkgo/v2/.gitignore | 2 +- vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md | 254 +++- vendor/github.com/onsi/ginkgo/v2/README.md | 6 +- vendor/github.com/onsi/ginkgo/v2/core_dsl.go | 52 +- .../onsi/ginkgo/v2/decorator_dsl.go | 14 +- .../onsi/ginkgo/v2/formatter/formatter.go | 34 +- .../ginkgo/v2/ginkgo/build/build_command.go | 63 + .../onsi/ginkgo/v2/ginkgo/command/abort.go | 61 + .../onsi/ginkgo/v2/ginkgo/command/command.go | 50 + .../onsi/ginkgo/v2/ginkgo/command/program.go | 182 +++ .../ginkgo/generators/boostrap_templates.go | 48 + .../v2/ginkgo/generators/bootstrap_command.go | 133 ++ .../v2/ginkgo/generators/generate_command.go | 264 ++++ .../ginkgo/generators/generate_templates.go | 43 + .../v2/ginkgo/generators/generators_common.go | 76 + .../onsi/ginkgo/v2/ginkgo/internal/compile.go | 161 +++ .../ginkgo/internal/profiles_and_reports.go | 237 ++++ .../onsi/ginkgo/v2/ginkgo/internal/run.go | 355 +++++ .../ginkgo/v2/ginkgo/internal/test_suite.go | 283 ++++ .../onsi/ginkgo/v2/ginkgo/internal/utils.go | 86 ++ .../v2/ginkgo/internal/verify_version.go | 54 + .../ginkgo/v2/ginkgo/labels/labels_command.go | 123 ++ .../github.com/onsi/ginkgo/v2/ginkgo/main.go | 58 + .../onsi/ginkgo/v2/ginkgo/outline/ginkgo.go | 300 ++++ .../onsi/ginkgo/v2/ginkgo/outline/import.go | 65 + .../onsi/ginkgo/v2/ginkgo/outline/outline.go | 110 ++ .../v2/ginkgo/outline/outline_command.go | 98 ++ .../onsi/ginkgo/v2/ginkgo/run/run_command.go | 232 ++++ .../v2/ginkgo/unfocus/unfocus_command.go | 186 +++ .../onsi/ginkgo/v2/ginkgo/watch/delta.go | 22 + .../ginkgo/v2/ginkgo/watch/delta_tracker.go | 75 + .../ginkgo/v2/ginkgo/watch/dependencies.go | 92 ++ .../ginkgo/v2/ginkgo/watch/package_hash.go | 108 ++ .../ginkgo/v2/ginkgo/watch/package_hashes.go | 85 ++ .../onsi/ginkgo/v2/ginkgo/watch/suite.go | 87 ++ .../ginkgo/v2/ginkgo/watch/watch_command.go | 192 +++ .../onsi/ginkgo/v2/ginkgo_cli_dependencies.go | 8 + .../github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go | 63 +- .../onsi/ginkgo/v2/internal/focus.go | 71 +- .../onsi/ginkgo/v2/internal/group.go | 46 +- .../interrupt_handler/interrupt_handler.go | 47 +- .../onsi/ginkgo/v2/internal/node.go | 57 +- .../onsi/ginkgo/v2/internal/ordering.go | 84 +- .../v2/internal/output_interceptor_unix.go | 11 + .../v2/internal/progress_reporter_manager.go | 79 ++ .../onsi/ginkgo/v2/internal/spec_context.go | 53 +- .../onsi/ginkgo/v2/internal/suite.go | 30 +- .../internal/testingtproxy/testing_t_proxy.go | 114 +- .../onsi/ginkgo/v2/internal/writer.go | 6 +- .../ginkgo/v2/reporters/default_reporter.go | 49 +- .../onsi/ginkgo/v2/reporters/json_report.go | 13 +- .../onsi/ginkgo/v2/reporters/junit_report.go | 19 +- .../ginkgo/v2/reporters/teamcity_report.go | 4 + vendor/github.com/onsi/ginkgo/v2/table_dsl.go | 33 +- .../onsi/ginkgo/v2/types/code_location.go | 77 +- .../github.com/onsi/ginkgo/v2/types/config.go | 21 +- .../ginkgo/v2/types/deprecation_support.go | 2 +- .../github.com/onsi/ginkgo/v2/types/errors.go | 13 +- .../onsi/ginkgo/v2/types/label_filter.go | 11 + .../github.com/onsi/ginkgo/v2/types/types.go | 7 +- .../onsi/ginkgo/v2/types/version.go | 2 +- vendor/github.com/onsi/gomega/.gitignore | 3 +- vendor/github.com/onsi/gomega/CHANGELOG.md | 143 ++ .../github.com/onsi/gomega/format/format.go | 10 +- vendor/github.com/onsi/gomega/gomega_dsl.go | 14 +- .../onsi/gomega/internal/async_assertion.go | 206 ++- .../github.com/onsi/gomega/internal/gomega.go | 2 +- vendor/github.com/onsi/gomega/matchers.go | 21 +- .../onsi/gomega/matchers/be_a_directory.go | 2 +- .../onsi/gomega/matchers/be_a_regular_file.go | 2 +- .../gomega/matchers/be_an_existing_file.go | 4 +- .../onsi/gomega/matchers/consist_of.go | 29 +- .../gomega/matchers/have_exact_elements.go | 88 ++ .../gomega/matchers/have_http_body_matcher.go | 9 +- .../gomega/matchers/have_occurred_matcher.go | 2 +- .../gomega/matchers/match_error_matcher.go | 12 +- .../onsi/gomega/matchers/succeed_matcher.go | 11 +- vendor/github.com/onsi/gomega/tools | 8 - vendor/github.com/onsi/gomega/types/types.go | 1 + vendor/golang.org/x/tools/LICENSE | 27 + vendor/golang.org/x/tools/PATENTS | 22 + .../x/tools/go/ast/inspector/inspector.go | 220 +++ .../x/tools/go/ast/inspector/typeof.go | 229 +++ .../x/tools/internal/typeparams/common.go | 204 +++ .../x/tools/internal/typeparams/coretype.go | 122 ++ .../internal/typeparams/enabled_go117.go | 12 + .../internal/typeparams/enabled_go118.go | 15 + .../x/tools/internal/typeparams/normalize.go | 218 +++ .../x/tools/internal/typeparams/termlist.go | 163 +++ .../internal/typeparams/typeparams_go117.go | 197 +++ .../internal/typeparams/typeparams_go118.go | 151 ++ .../x/tools/internal/typeparams/typeterm.go | 170 +++ vendor/modules.txt | 34 +- 161 files changed, 17091 insertions(+), 2509 deletions(-) delete mode 100644 vendor/github.com/fsnotify/fsnotify/AUTHORS create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_fen.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_inotify.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_kqueue.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_other.go create mode 100644 vendor/github.com/fsnotify/fsnotify/backend_windows.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/fen.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/inotify.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/inotify_poller.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/kqueue.go create mode 100644 vendor/github.com/fsnotify/fsnotify/mkdoc.zsh rename vendor/github.com/fsnotify/fsnotify/{open_mode_bsd.go => system_bsd.go} (57%) rename vendor/github.com/fsnotify/fsnotify/{open_mode_darwin.go => system_darwin.go} (52%) delete mode 100644 vendor/github.com/fsnotify/fsnotify/windows.go create mode 100644 vendor/github.com/go-task/slim-sprig/.editorconfig create mode 100644 vendor/github.com/go-task/slim-sprig/.gitattributes create mode 100644 vendor/github.com/go-task/slim-sprig/.gitignore create mode 100644 vendor/github.com/go-task/slim-sprig/CHANGELOG.md create mode 100644 vendor/github.com/go-task/slim-sprig/LICENSE.txt create mode 100644 vendor/github.com/go-task/slim-sprig/README.md create mode 100644 vendor/github.com/go-task/slim-sprig/Taskfile.yml create mode 100644 vendor/github.com/go-task/slim-sprig/crypto.go create mode 100644 vendor/github.com/go-task/slim-sprig/date.go create mode 100644 vendor/github.com/go-task/slim-sprig/defaults.go create mode 100644 vendor/github.com/go-task/slim-sprig/dict.go create mode 100644 vendor/github.com/go-task/slim-sprig/doc.go create mode 100644 vendor/github.com/go-task/slim-sprig/functions.go create mode 100644 vendor/github.com/go-task/slim-sprig/list.go create mode 100644 vendor/github.com/go-task/slim-sprig/network.go create mode 100644 vendor/github.com/go-task/slim-sprig/numeric.go create mode 100644 vendor/github.com/go-task/slim-sprig/reflect.go create mode 100644 vendor/github.com/go-task/slim-sprig/regex.go create mode 100644 vendor/github.com/go-task/slim-sprig/strings.go create mode 100644 vendor/github.com/go-task/slim-sprig/url.go create mode 100644 vendor/github.com/google/pprof/AUTHORS create mode 100644 vendor/github.com/google/pprof/CONTRIBUTORS create mode 100644 vendor/github.com/google/pprof/LICENSE create mode 100644 vendor/github.com/google/pprof/profile/encode.go create mode 100644 vendor/github.com/google/pprof/profile/filter.go create mode 100644 vendor/github.com/google/pprof/profile/index.go create mode 100644 vendor/github.com/google/pprof/profile/legacy_java_profile.go create mode 100644 vendor/github.com/google/pprof/profile/legacy_profile.go create mode 100644 vendor/github.com/google/pprof/profile/merge.go create mode 100644 vendor/github.com/google/pprof/profile/profile.go create mode 100644 vendor/github.com/google/pprof/profile/proto.go create mode 100644 vendor/github.com/google/pprof/profile/prune.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/build/build_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/command/abort.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/command/command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/command/program.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/boostrap_templates.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/bootstrap_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/compile.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/utils.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/verify_version.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/labels/labels_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/unfocus/unfocus_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta_tracker.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hashes.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/suite.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo_cli_dependencies.go create mode 100644 vendor/github.com/onsi/ginkgo/v2/internal/progress_reporter_manager.go create mode 100644 vendor/github.com/onsi/gomega/matchers/have_exact_elements.go delete mode 100644 vendor/github.com/onsi/gomega/tools create mode 100644 vendor/golang.org/x/tools/LICENSE create mode 100644 vendor/golang.org/x/tools/PATENTS create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/inspector.go create mode 100644 vendor/golang.org/x/tools/go/ast/inspector/typeof.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/common.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/coretype.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/normalize.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/termlist.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go create mode 100644 vendor/golang.org/x/tools/internal/typeparams/typeterm.go diff --git a/go.mod b/go.mod index 20673fd7..db417ef5 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module github.com/kubevirt/vm-console-proxy go 1.20 require ( - github.com/emicklei/go-restful/v3 v3.10.1 - github.com/fsnotify/fsnotify v1.5.4 - github.com/golang-jwt/jwt/v4 v4.4.3 - github.com/golang/mock v1.5.0 - github.com/onsi/ginkgo/v2 v2.6.1 - github.com/onsi/gomega v1.24.2 + github.com/emicklei/go-restful/v3 v3.11.0 + github.com/fsnotify/fsnotify v1.6.0 + github.com/golang-jwt/jwt/v4 v4.5.0 + github.com/golang/mock v1.6.0 + github.com/onsi/ginkgo/v2 v2.12.1 + github.com/onsi/gomega v1.28.0 github.com/openshift/api v0.0.0-20220504105152-6f735e7109c8 github.com/openshift/library-go v0.0.0-20220523142556-5bcfed822fc6 k8s.io/api v0.23.5 @@ -26,12 +26,14 @@ require ( github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/go-kit/kit v0.9.0 // indirect github.com/go-logfmt/logfmt v0.5.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.1.0 // indirect + github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/uuid v1.1.2 // indirect github.com/googleapis/gnostic v0.5.5 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -53,6 +55,7 @@ require ( golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.12.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index d3120a5a..320dd268 100644 --- a/go.sum +++ b/go.sum @@ -201,8 +201,8 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/emicklei/go-restful v2.10.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -226,8 +226,8 @@ github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -250,8 +250,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -319,6 +319,8 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -330,8 +332,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -349,8 +351,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -413,6 +416,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -630,8 +634,8 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.6.1 h1:1xQPCjcqYw/J5LchOcp4/2q/jzJFjiAOc25chhnDw+Q= -github.com/onsi/ginkgo/v2 v2.6.1/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= +github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= +github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -640,8 +644,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/onsi/gomega v1.24.2 h1:J/tulyYK6JwBldPViHJReihxxZ+22FHs0piGjQAvoUE= -github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWgHWnk= +github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c= +github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8= github.com/openshift/api v0.0.0-20220504105152-6f735e7109c8 h1:/gMlLRp6nql6uWl0x3Hx81Cm3sE8xtdj7P2iCriBLXs= github.com/openshift/api v0.0.0-20220504105152-6f735e7109c8/go.mod h1:F/eU6jgr6Q2VhMu1mSpMmygxAELd7+BUxs3NHZ25jV4= github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= @@ -916,6 +920,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1098,7 +1103,7 @@ golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1200,10 +1205,13 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md index 02a73ccf..5edd5a7c 100644 --- a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md +++ b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md @@ -1,6 +1,15 @@ # Change history of go-restful -## [v3.10.1] - 2022-11-19 +## [v3.11.0] - 2023-08-19 + +- restored behavior as <= v3.9.0 with option to change path strategy using TrimRightSlashEnabled. + +## [v3.10.2] - 2023-03-09 - DO NOT USE + +- introduced MergePathStrategy to be able to revert behaviour of path concatenation to 3.9.0 + see comment in Readme how to customize this behaviour. + +## [v3.10.1] - 2022-11-19 - DO NOT USE - fix broken 3.10.0 by using path package for joining paths diff --git a/vendor/github.com/emicklei/go-restful/v3/README.md b/vendor/github.com/emicklei/go-restful/v3/README.md index 0625359d..e3e30080 100644 --- a/vendor/github.com/emicklei/go-restful/v3/README.md +++ b/vendor/github.com/emicklei/go-restful/v3/README.md @@ -79,7 +79,7 @@ func (u UserResource) findUser(request *restful.Request, response *restful.Respo - Content encoding (gzip,deflate) of request and response payloads - Automatic responses on OPTIONS (using a filter) - Automatic CORS request handling (using a filter) -- API declaration for Swagger UI ([go-restful-openapi](https://github.com/emicklei/go-restful-openapi), see [go-restful-swagger12](https://github.com/emicklei/go-restful-swagger12)) +- API declaration for Swagger UI ([go-restful-openapi](https://github.com/emicklei/go-restful-openapi)) - Panic recovery to produce HTTP 500, customizable using RecoverHandler(...) - Route errors produce HTTP 404/405/406/415 errors, customizable using ServiceErrorHandler(...) - Configurable (trace) logging @@ -96,6 +96,7 @@ There are several hooks to customize the behavior of the go-restful package. - Compression - Encoders for other serializers - Use [jsoniter](https://github.com/json-iterator/go) by building this package using a build tag, e.g. `go build -tags=jsoniter .` +- Use the package variable `TrimRightSlashEnabled` (default true) to control the behavior of matching routes that end with a slash `/` ## Resources @@ -108,4 +109,4 @@ There are several hooks to customize the behavior of the go-restful package. Type ```git shortlog -s``` for a full list of contributors. -© 2012 - 2022, http://ernestmicklei.com. MIT License. Contributions are welcome. +© 2012 - 2023, http://ernestmicklei.com. MIT License. Contributions are welcome. diff --git a/vendor/github.com/emicklei/go-restful/v3/route.go b/vendor/github.com/emicklei/go-restful/v3/route.go index ea05b3da..306c44be 100644 --- a/vendor/github.com/emicklei/go-restful/v3/route.go +++ b/vendor/github.com/emicklei/go-restful/v3/route.go @@ -40,7 +40,8 @@ type Route struct { ParameterDocs []*Parameter ResponseErrors map[int]ResponseError DefaultResponse *ResponseError - ReadSample, WriteSample interface{} // structs that model an example request or response payload + ReadSample, WriteSample interface{} // structs that model an example request or response payload + WriteSamples []interface{} // if more than one return types is possible (oneof) then this will contain multiple values // Extra information used to store custom information about the route. Metadata map[string]interface{} @@ -164,7 +165,13 @@ func tokenizePath(path string) []string { if "/" == path { return nil } - return strings.Split(strings.TrimLeft(path, "/"), "/") + if TrimRightSlashEnabled { + // 3.9.0 + return strings.Split(strings.Trim(path, "/"), "/") + } else { + // 3.10.2 + return strings.Split(strings.TrimLeft(path, "/"), "/") + } } // for debugging @@ -177,4 +184,8 @@ func (r *Route) EnableContentEncoding(enabled bool) { r.contentEncodingEnabled = &enabled } -var TrimRightSlashEnabled = false +// TrimRightSlashEnabled controls whether +// - path on route building is using path.Join +// - the path of the incoming request is trimmed of its slash suffux. +// Value of true matches the behavior of <= 3.9.0 +var TrimRightSlashEnabled = true diff --git a/vendor/github.com/emicklei/go-restful/v3/route_builder.go b/vendor/github.com/emicklei/go-restful/v3/route_builder.go index 830ebf14..75168c12 100644 --- a/vendor/github.com/emicklei/go-restful/v3/route_builder.go +++ b/vendor/github.com/emicklei/go-restful/v3/route_builder.go @@ -31,17 +31,18 @@ type RouteBuilder struct { typeNameHandleFunc TypeNameHandleFunction // required // documentation - doc string - notes string - operation string - readSample, writeSample interface{} - parameters []*Parameter - errorMap map[int]ResponseError - defaultResponse *ResponseError - metadata map[string]interface{} - extensions map[string]interface{} - deprecated bool - contentEncodingEnabled *bool + doc string + notes string + operation string + readSample interface{} + writeSamples []interface{} + parameters []*Parameter + errorMap map[int]ResponseError + defaultResponse *ResponseError + metadata map[string]interface{} + extensions map[string]interface{} + deprecated bool + contentEncodingEnabled *bool } // Do evaluates each argument with the RouteBuilder itself. @@ -135,9 +136,9 @@ func (b RouteBuilder) ParameterNamed(name string) (p *Parameter) { return p } -// Writes tells what resource type will be written as the response payload. Optional. -func (b *RouteBuilder) Writes(sample interface{}) *RouteBuilder { - b.writeSample = sample +// Writes tells which one of the resource types will be written as the response payload. Optional. +func (b *RouteBuilder) Writes(samples ...interface{}) *RouteBuilder { + b.writeSamples = samples // oneof return b } @@ -342,19 +343,29 @@ func (b *RouteBuilder) Build() Route { ResponseErrors: b.errorMap, DefaultResponse: b.defaultResponse, ReadSample: b.readSample, - WriteSample: b.writeSample, + WriteSamples: b.writeSamples, Metadata: b.metadata, Deprecated: b.deprecated, contentEncodingEnabled: b.contentEncodingEnabled, allowedMethodsWithoutContentType: b.allowedMethodsWithoutContentType, } + // set WriteSample if one specified + if len(b.writeSamples) == 1 { + route.WriteSample = b.writeSamples[0] + } route.Extensions = b.extensions route.postBuild() return route } -func concatPath(path1, path2 string) string { - return path.Join(path1, path2) +// merge two paths using the current (package global) merge path strategy. +func concatPath(rootPath, routePath string) string { + + if TrimRightSlashEnabled { + return strings.TrimRight(rootPath, "/") + "/" + strings.TrimLeft(routePath, "/") + } else { + return path.Join(rootPath, routePath) + } } var anonymousFuncCount int32 diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore index 4cd0cbaf..1d89d85c 100644 --- a/vendor/github.com/fsnotify/fsnotify/.gitignore +++ b/vendor/github.com/fsnotify/fsnotify/.gitignore @@ -1,6 +1,6 @@ -# Setup a Global .gitignore for OS and editor generated files: -# https://help.github.com/articles/ignoring-files -# git config --global core.excludesfile ~/.gitignore_global +# go test -c output +*.test +*.test.exe -.vagrant -*.sublime-project +# Output of go build ./cmd/fsnotify +/fsnotify diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS deleted file mode 100644 index 6cbabe5e..00000000 --- a/vendor/github.com/fsnotify/fsnotify/AUTHORS +++ /dev/null @@ -1,62 +0,0 @@ -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# You can update this list using the following command: -# -# $ (head -n10 AUTHORS && git shortlog -se | sed -E 's/^\s+[0-9]+\t//') | tee AUTHORS - -# Please keep the list sorted. - -Aaron L -Adrien Bustany -Alexey Kazakov -Amit Krishnan -Anmol Sethi -Bjørn Erik Pedersen -Brian Goff -Bruno Bigras -Caleb Spare -Case Nelson -Chris Howey -Christoffer Buchholz -Daniel Wagner-Hall -Dave Cheney -Eric Lin -Evan Phoenix -Francisco Souza -Gautam Dey -Hari haran -Ichinose Shogo -Johannes Ebke -John C Barstow -Kelvin Fo -Ken-ichirou MATSUZAWA -Matt Layher -Matthias Stone -Nathan Youngman -Nickolai Zeldovich -Oliver Bristow -Patrick -Paul Hammond -Pawel Knap -Pieter Droogendijk -Pratik Shinde -Pursuit92 -Riku Voipio -Rob Figueiredo -Rodrigo Chiossi -Slawek Ligus -Soge Zhang -Tiffany Jernigan -Tilak Sharma -Tobias Klauser -Tom Payne -Travis Cline -Tudor Golubenco -Vahe Khachikyan -Yukang -bronze1man -debrando -henrikedwards -铁哥 diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md index cc01c08f..77f9593b 100644 --- a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md +++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -7,6 +7,95 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +Nothing yet. + +## [1.6.0] - 2022-10-13 + +This version of fsnotify needs Go 1.16 (this was already the case since 1.5.1, +but not documented). It also increases the minimum Linux version to 2.6.32. + +### Additions + +- all: add `Event.Has()` and `Op.Has()` ([#477]) + + This makes checking events a lot easier; for example: + + if event.Op&Write == Write && !(event.Op&Remove == Remove) { + } + + Becomes: + + if event.Has(Write) && !event.Has(Remove) { + } + +- all: add cmd/fsnotify ([#463]) + + A command-line utility for testing and some examples. + +### Changes and fixes + +- inotify: don't ignore events for files that don't exist ([#260], [#470]) + + Previously the inotify watcher would call `os.Lstat()` to check if a file + still exists before emitting events. + + This was inconsistent with other platforms and resulted in inconsistent event + reporting (e.g. when a file is quickly removed and re-created), and generally + a source of confusion. It was added in 2013 to fix a memory leak that no + longer exists. + +- all: return `ErrNonExistentWatch` when `Remove()` is called on a path that's + not watched ([#460]) + +- inotify: replace epoll() with non-blocking inotify ([#434]) + + Non-blocking inotify was not generally available at the time this library was + written in 2014, but now it is. As a result, the minimum Linux version is + bumped from 2.6.27 to 2.6.32. This hugely simplifies the code and is faster. + +- kqueue: don't check for events every 100ms ([#480]) + + The watcher would wake up every 100ms, even when there was nothing to do. Now + it waits until there is something to do. + +- macos: retry opening files on EINTR ([#475]) + +- kqueue: skip unreadable files ([#479]) + + kqueue requires a file descriptor for every file in a directory; this would + fail if a file was unreadable by the current user. Now these files are simply + skipped. + +- windows: fix renaming a watched directory if the parent is also watched ([#370]) + +- windows: increase buffer size from 4K to 64K ([#485]) + +- windows: close file handle on Remove() ([#288]) + +- kqueue: put pathname in the error if watching a file fails ([#471]) + +- inotify, windows: calling Close() more than once could race ([#465]) + +- kqueue: improve Close() performance ([#233]) + +- all: various documentation additions and clarifications. + +[#233]: https://github.com/fsnotify/fsnotify/pull/233 +[#260]: https://github.com/fsnotify/fsnotify/pull/260 +[#288]: https://github.com/fsnotify/fsnotify/pull/288 +[#370]: https://github.com/fsnotify/fsnotify/pull/370 +[#434]: https://github.com/fsnotify/fsnotify/pull/434 +[#460]: https://github.com/fsnotify/fsnotify/pull/460 +[#463]: https://github.com/fsnotify/fsnotify/pull/463 +[#465]: https://github.com/fsnotify/fsnotify/pull/465 +[#470]: https://github.com/fsnotify/fsnotify/pull/470 +[#471]: https://github.com/fsnotify/fsnotify/pull/471 +[#475]: https://github.com/fsnotify/fsnotify/pull/475 +[#477]: https://github.com/fsnotify/fsnotify/pull/477 +[#479]: https://github.com/fsnotify/fsnotify/pull/479 +[#480]: https://github.com/fsnotify/fsnotify/pull/480 +[#485]: https://github.com/fsnotify/fsnotify/pull/485 + ## [1.5.4] - 2022-04-25 * Windows: add missing defer to `Watcher.WatchList` [#447](https://github.com/fsnotify/fsnotify/pull/447) @@ -40,6 +129,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#385](https://github.com/fsnotify/fsnotify/pull/385) * Go 1.14+: Fix unsafe pointer conversion [#325](https://github.com/fsnotify/fsnotify/pull/325) +## [1.4.9] - 2020-03-11 + +* Move example usage to the readme #329. This may resolve #328. + +## [1.4.8] - 2020-03-10 + +* CI: test more go versions (@nathany 1d13583d846ea9d66dcabbfefbfb9d8e6fb05216) +* Tests: Queued inotify events could have been read by the test before max_queued_events was hit (@matthias-stone #265) +* Tests: t.Fatalf -> t.Errorf in go routines (@gdey #266) +* CI: Less verbosity (@nathany #267) +* Tests: Darwin: Exchangedata is deprecated on 10.13 (@nathany #267) +* Tests: Check if channels are closed in the example (@alexeykazakov #244) +* CI: Only run golint on latest version of go and fix issues (@cpuguy83 #284) +* CI: Add windows to travis matrix (@cpuguy83 #284) +* Docs: Remover appveyor badge (@nathany 11844c0959f6fff69ba325d097fce35bd85a8e93) +* Linux: create epoll and pipe fds with close-on-exec (@JohannesEbke #219) +* Linux: open files with close-on-exec (@linxiulei #273) +* Docs: Plan to support fanotify (@nathany ab058b44498e8b7566a799372a39d150d9ea0119 ) +* Project: Add go.mod (@nathany #309) +* Project: Revise editor config (@nathany #309) +* Project: Update copyright for 2019 (@nathany #309) +* CI: Drop go1.8 from CI matrix (@nathany #309) +* Docs: Updating the FAQ section for supportability with NFS & FUSE filesystems (@Pratik32 4bf2d1fec78374803a39307bfb8d340688f4f28e ) + ## [1.4.7] - 2018-01-09 * BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md index 8a642563..ea379759 100644 --- a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md +++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -1,60 +1,26 @@ -# Contributing +Thank you for your interest in contributing to fsnotify! We try to review and +merge PRs in a reasonable timeframe, but please be aware that: -## Issues +- To avoid "wasted" work, please discus changes on the issue tracker first. You + can just send PRs, but they may end up being rejected for one reason or the + other. -* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). -* Please indicate the platform you are using fsnotify on. -* A code example to reproduce the problem is appreciated. +- fsnotify is a cross-platform library, and changes must work reasonably well on + all supported platforms. -## Pull Requests +- Changes will need to be compatible; old code should still compile, and the + runtime behaviour can't change in ways that are likely to lead to problems for + users. -### Contributor License Agreement +Testing +------- +Just `go test ./...` runs all the tests; the CI runs this on all supported +platforms. Testing different platforms locally can be done with something like +[goon] or [Vagrant], but this isn't super-easy to set up at the moment. -fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). +Use the `-short` flag to make the "stress test" run faster. -Please indicate that you have signed the CLA in your pull request. -### How fsnotify is Developed - -* Development is done on feature branches. -* Tests are run on BSD, Linux, macOS and Windows. -* Pull requests are reviewed and [applied to master][am] using [hub][]. - * Maintainers may modify or squash commits rather than asking contributors to. -* To issue a new release, the maintainers will: - * Update the CHANGELOG - * Tag a version, which will become available through gopkg.in. - -### How to Fork - -For smooth sailing, always use the original import path. Installing with `go get` makes this easy. - -1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Ensure everything works and the tests pass (see below) -4. Commit your changes (`git commit -am 'Add some feature'`) - -Contribute upstream: - -1. Fork fsnotify on GitHub -2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) -3. Push to the branch (`git push fork my-new-feature`) -4. Create a new Pull Request on GitHub - -This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). - -### Testing - -fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. - -Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. - -### Maintainers - -Help maintaining fsnotify is welcome. To be a maintainer: - -* Submit a pull request and sign the CLA as above. -* You must be able to run the test suite on Mac, Windows, Linux and BSD. - -All code changes should be internal pull requests. - -Releases are tagged using [Semantic Versioning](http://semver.org/). +[goon]: https://github.com/arp242/goon +[Vagrant]: https://www.vagrantup.com/ +[integration_test.go]: /integration_test.go diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE index e180c8fb..fb03ade7 100644 --- a/vendor/github.com/fsnotify/fsnotify/LICENSE +++ b/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -1,28 +1,25 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2012-2019 fsnotify Authors. All rights reserved. +Copyright © 2012 The Go Authors. All rights reserved. +Copyright © fsnotify Authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +* Neither the name of Google Inc. nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md index 0731c5ef..d4e6080f 100644 --- a/vendor/github.com/fsnotify/fsnotify/README.md +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -1,120 +1,161 @@ -# File system notifications for Go +fsnotify is a Go library to provide cross-platform filesystem notifications on +Windows, Linux, macOS, and BSD systems. -[![Go Reference](https://pkg.go.dev/badge/github.com/fsnotify/fsnotify.svg)](https://pkg.go.dev/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) [![Maintainers Wanted](https://img.shields.io/badge/maintainers-wanted-red.svg)](https://github.com/fsnotify/fsnotify/issues/413) +Go 1.16 or newer is required; the full documentation is at +https://pkg.go.dev/github.com/fsnotify/fsnotify -fsnotify utilizes [`golang.org/x/sys`](https://pkg.go.dev/golang.org/x/sys) rather than [`syscall`](https://pkg.go.dev/syscall) from the standard library. +**It's best to read the documentation at pkg.go.dev, as it's pinned to the last +released version, whereas this README is for the last development version which +may include additions/changes.** -Cross platform: Windows, Linux, BSD and macOS. +--- -| Adapter | OS | Status | -| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| inotify | Linux 2.6.27 or later, Android\* | Supported | -| kqueue | BSD, macOS, iOS\* | Supported | -| ReadDirectoryChangesW | Windows | Supported | -| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | -| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/pull/371) | -| fanotify | Linux 2.6.37+ | [Maybe](https://github.com/fsnotify/fsnotify/issues/114) | -| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | -| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | +Platform support: -\* Android and iOS are untested. +| Adapter | OS | Status | +| --------------------- | ---------------| -------------------------------------------------------------| +| inotify | Linux 2.6.32+ | Supported | +| kqueue | BSD, macOS | Supported | +| ReadDirectoryChangesW | Windows | Supported | +| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | +| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/pull/371) | +| fanotify | Linux 5.9+ | [Maybe](https://github.com/fsnotify/fsnotify/issues/114) | +| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | +| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | -Please see [the documentation](https://pkg.go.dev/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. +Linux and macOS should include Android and iOS, but these are currently untested. -## API stability - -fsnotify is a fork of [howeyc/fsnotify](https://github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). - -All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). - -## Usage +Usage +----- +A basic example: ```go package main import ( - "log" + "log" - "github.com/fsnotify/fsnotify" + "github.com/fsnotify/fsnotify" ) func main() { - watcher, err := fsnotify.NewWatcher() - if err != nil { - log.Fatal(err) - } - defer watcher.Close() - - done := make(chan bool) - go func() { - for { - select { - case event, ok := <-watcher.Events: - if !ok { - return - } - log.Println("event:", event) - if event.Op&fsnotify.Write == fsnotify.Write { - log.Println("modified file:", event.Name) - } - case err, ok := <-watcher.Errors: - if !ok { - return - } - log.Println("error:", err) - } - } - }() - - err = watcher.Add("/tmp/foo") - if err != nil { - log.Fatal(err) - } - <-done + // Create new watcher. + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + // Start listening for events. + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + log.Println("event:", event) + if event.Has(fsnotify.Write) { + log.Println("modified file:", event.Name) + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + log.Println("error:", err) + } + } + }() + + // Add a path. + err = watcher.Add("/tmp") + if err != nil { + log.Fatal(err) + } + + // Block main goroutine forever. + <-make(chan struct{}) } ``` -## Contributing +Some more examples can be found in [cmd/fsnotify](cmd/fsnotify), which can be +run with: -Please refer to [CONTRIBUTING][] before opening an issue or pull request. + % go run ./cmd/fsnotify -## FAQ +FAQ +--- +### Will a file still be watched when it's moved to another directory? +No, not unless you are watching the location it was moved to. -**When a file is moved to another directory is it still being watched?** +### Are subdirectories watched too? +No, you must add watches for any directory you want to watch (a recursive +watcher is on the roadmap: [#18]). -No (it shouldn't be, unless you are watching where it was moved to). +[#18]: https://github.com/fsnotify/fsnotify/issues/18 -**When I watch a directory, are all subdirectories watched as well?** +### Do I have to watch the Error and Event channels in a goroutine? +As of now, yes (you can read both channels in the same goroutine using `select`, +you don't need a separate goroutine for both channels; see the example). -No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). +### Why don't notifications work with NFS, SMB, FUSE, /proc, or /sys? +fsnotify requires support from underlying OS to work. The current NFS and SMB +protocols does not provide network level support for file notifications, and +neither do the /proc and /sys virtual filesystems. -**Do I have to watch the Error and Event channels in a separate goroutine?** +This could be fixed with a polling watcher ([#9]), but it's not yet implemented. -As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) +[#9]: https://github.com/fsnotify/fsnotify/issues/9 -**Why am I receiving multiple events for the same file on OS X?** +Platform-specific notes +----------------------- +### Linux +When a file is removed a REMOVE event won't be emitted until all file +descriptors are closed; it will emit a CHMOD instead: -Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). + fp := os.Open("file") + os.Remove("file") // CHMOD + fp.Close() // REMOVE -**How many files can be watched at once?** +This is the event that inotify sends, so not much can be changed about this. -There are OS-specific limits as to how many watches can be created: -* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. -* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. +The `fs.inotify.max_user_watches` sysctl variable specifies the upper limit for +the number of watches per user, and `fs.inotify.max_user_instances` specifies +the maximum number of inotify instances per user. Every Watcher you create is an +"instance", and every path you add is a "watch". -**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?** +These are also exposed in `/proc` as `/proc/sys/fs/inotify/max_user_watches` and +`/proc/sys/fs/inotify/max_user_instances` -fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications. +To increase them you can use `sysctl` or write the value to proc file: -[#62]: https://github.com/howeyc/fsnotify/issues/62 -[#18]: https://github.com/fsnotify/fsnotify/issues/18 -[#11]: https://github.com/fsnotify/fsnotify/issues/11 -[#7]: https://github.com/howeyc/fsnotify/issues/7 + # The default values on Linux 5.18 + sysctl fs.inotify.max_user_watches=124983 + sysctl fs.inotify.max_user_instances=128 + +To make the changes persist on reboot edit `/etc/sysctl.conf` or +`/usr/lib/sysctl.d/50-default.conf` (details differ per Linux distro; check your +distro's documentation): + + fs.inotify.max_user_watches=124983 + fs.inotify.max_user_instances=128 -[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md +Reaching the limit will result in a "no space left on device" or "too many open +files" error. -## Related Projects +### kqueue (macOS, all BSD systems) +kqueue requires opening a file descriptor for every file that's being watched; +so if you're watching a directory with five files then that's six file +descriptors. You will run in to your system's "max open files" limit faster on +these platforms. -* [notify](https://github.com/rjeczalik/notify) -* [fsevents](https://github.com/fsnotify/fsevents) +The sysctl variables `kern.maxfiles` and `kern.maxfilesperproc` can be used to +control the maximum number of open files. +### macOS +Spotlight indexing on macOS can result in multiple events (see [#15]). A temporary +workaround is to add your folder(s) to the *Spotlight Privacy settings* until we +have a native FSEvents implementation (see [#11]). + +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#15]: https://github.com/fsnotify/fsnotify/issues/15 diff --git a/vendor/github.com/fsnotify/fsnotify/backend_fen.go b/vendor/github.com/fsnotify/fsnotify/backend_fen.go new file mode 100644 index 00000000..1a95ad8e --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_fen.go @@ -0,0 +1,162 @@ +//go:build solaris +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # macOS notes +// +// Spotlight indexing on macOS can result in multiple events (see [#15]). A +// temporary workaround is to add your folder(s) to the "Spotlight Privacy +// Settings" until we have a native FSEvents implementation (see [#11]). +// +// [#11]: https://github.com/fsnotify/fsnotify/issues/11 +// [#15]: https://github.com/fsnotify/fsnotify/issues/15 +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, so you + // probably want to wait until you've stopped receiving + // them (see the dedup example in cmd/fsnotify). + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // and on kqueue when a file is truncated. On Windows + // it's never sent. + Events chan Event + + // Errors sends any errors. + Errors chan error +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; attempting to watch it more than once will +// return an error. Paths that do not yet exist on the filesystem cannot be +// added. A watch will be automatically removed if the path is deleted. +// +// A path will remain watched if it gets renamed to somewhere else on the same +// filesystem, but the monitor will get removed if the path gets deleted and +// re-created, or if it's moved to a different filesystem. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many tools update files atomically. Instead of "just" writing +// to the file a temporary file will be written to first, and if successful the +// temporary file is moved to to destination removing the original, or some +// variant thereof. The watcher on the original file is now lost, as it no +// longer exists. +// +// Instead, watch the parent directory and use Event.Name to filter out files +// you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_inotify.go b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go new file mode 100644 index 00000000..54c77fbb --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go @@ -0,0 +1,459 @@ +//go:build linux +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # macOS notes +// +// Spotlight indexing on macOS can result in multiple events (see [#15]). A +// temporary workaround is to add your folder(s) to the "Spotlight Privacy +// Settings" until we have a native FSEvents implementation (see [#11]). +// +// [#11]: https://github.com/fsnotify/fsnotify/issues/11 +// [#15]: https://github.com/fsnotify/fsnotify/issues/15 +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, so you + // probably want to wait until you've stopped receiving + // them (see the dedup example in cmd/fsnotify). + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // and on kqueue when a file is truncated. On Windows + // it's never sent. + Events chan Event + + // Errors sends any errors. + Errors chan error + + // Store fd here as os.File.Read() will no longer return on close after + // calling Fd(). See: https://github.com/golang/go/issues/26439 + fd int + mu sync.Mutex // Map access + inotifyFile *os.File + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + // Need to set the FD to nonblocking mode in order for SetDeadline methods to work + // Otherwise, blocking i/o operations won't terminate on close + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK) + if fd == -1 { + return nil, errno + } + + w := &Watcher{ + fd: fd, + inotifyFile: os.NewFile(uintptr(fd), ""), + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Returns true if the event was sent, or false if watcher is closed. +func (w *Watcher) sendEvent(e Event) bool { + select { + case w.Events <- e: + return true + case <-w.done: + } + return false +} + +// Returns true if the error was sent, or false if watcher is closed. +func (w *Watcher) sendError(err error) bool { + select { + case w.Errors <- err: + return true + case <-w.done: + return false + } +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed() { + w.mu.Unlock() + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + w.mu.Unlock() + + // Causes any blocking reads to return with an error, provided the file + // still supports deadline operations. + err := w.inotifyFile.Close() + if err != nil { + return err + } + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; attempting to watch it more than once will +// return an error. Paths that do not yet exist on the filesystem cannot be +// added. A watch will be automatically removed if the path is deleted. +// +// A path will remain watched if it gets renamed to somewhere else on the same +// filesystem, but the monitor will get removed if the path gets deleted and +// re-created, or if it's moved to a different filesystem. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many tools update files atomically. Instead of "just" writing +// to the file a temporary file will be written to first, and if successful the +// temporary file is moved to to destination removing the original, or some +// variant thereof. The watcher on the original file is now lost, as it no +// longer exists. +// +// Instead, watch the parent directory and use Event.Name to filter out files +// you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + var flags uint32 = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + w.mu.Lock() + defer w.mu.Unlock() + watchEntry := w.watches[name] + if watchEntry != nil { + flags |= watchEntry.flags | unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + if watchEntry == nil { + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + } else { + watchEntry.wd = uint32(wd) + watchEntry.flags = flags + } + + return nil +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) + } + + // We successfully removed the watch if InotifyRmWatch doesn't return an + // error, we need to clean up our internal state to ensure it matches + // inotify's kernel state. + delete(w.paths, int(watch.wd)) + delete(w.watches, name) + + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case; + // The only two possible errors are: + // + // - EBADF, which happens when w.fd is not a valid file descriptor + // of any kind. + // - EINVAL, which is when fd is not an inotify descriptor or wd + // is not a valid watch descriptor. Watch descriptors are + // invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they + // are watching is deleted. + return errno + } + + return nil +} + +// WatchList returns all paths added with [Add] (and are not yet removed). +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + defer func() { + close(w.doneResp) + close(w.Errors) + close(w.Events) + }() + + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + errno error // Syscall errno + ) + for { + // See if we have been closed. + if w.isClosed() { + return + } + + n, err := w.inotifyFile.Read(buf[:]) + switch { + case errors.Unwrap(err) == os.ErrClosed: + return + case err != nil: + if !w.sendError(err) { + return + } + continue + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + if !w.sendError(err) { + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + var ( + // Point "raw" to the event in the buffer + raw = (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + mask = uint32(raw.Mask) + nameLen = uint32(raw.Len) + ) + + if mask&unix.IN_Q_OVERFLOW != 0 { + if !w.sendError(ErrEventOverflow) { + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + // IN_DELETE_SELF occurs when the file/directory being watched is removed. + // This is a sign to clean up the maps, otherwise we are no longer in sync + // with the inotify kernel state which has already deleted the watch + // automatically. + if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + delete(w.paths, int(raw.Wd)) + delete(w.watches, name) + } + w.mu.Unlock() + + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen] + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := w.newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if mask&unix.IN_IGNORED == 0 { + if !w.sendEvent(event) { + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func (w *Watcher) newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go new file mode 100644 index 00000000..29087469 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go @@ -0,0 +1,707 @@ +//go:build freebsd || openbsd || netbsd || dragonfly || darwin +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # macOS notes +// +// Spotlight indexing on macOS can result in multiple events (see [#15]). A +// temporary workaround is to add your folder(s) to the "Spotlight Privacy +// Settings" until we have a native FSEvents implementation (see [#11]). +// +// [#11]: https://github.com/fsnotify/fsnotify/issues/11 +// [#15]: https://github.com/fsnotify/fsnotify/issues/15 +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, so you + // probably want to wait until you've stopped receiving + // them (see the dedup example in cmd/fsnotify). + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // and on kqueue when a file is truncated. On Windows + // it's never sent. + Events chan Event + + // Errors sends any errors. + Errors chan error + + done chan struct{} + kq int // File descriptor (as returned by the kqueue() syscall). + closepipe [2]int // Pipe used for closing. + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Watched file descriptors (key: path). + watchesByDir map[string]map[int]struct{} // Watched file descriptors indexed by the parent directory (key: dirname(path)). + userWatches map[string]struct{} // Watches added with Watcher.Add() + dirFlags map[string]uint32 // Watched directories to fflags used in kqueue. + paths map[int]pathInfo // File descriptors to path names for processing kqueue events. + fileExists map[string]struct{} // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + kq, closepipe, err := newKqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + closepipe: closepipe, + watches: make(map[string]int), + watchesByDir: make(map[string]map[int]struct{}), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]struct{}), + userWatches: make(map[string]struct{}), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// newKqueue creates a new kernel event queue and returns a descriptor. +// +// This registers a new event on closepipe, which will trigger an event when +// it's closed. This way we can use kevent() without timeout/polling; without +// the closepipe, it would block forever and we wouldn't be able to stop it at +// all. +func newKqueue() (kq int, closepipe [2]int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, closepipe, err + } + + // Register the close pipe. + err = unix.Pipe(closepipe[:]) + if err != nil { + unix.Close(kq) + return kq, closepipe, err + } + + // Register changes to listen on the closepipe. + changes := make([]unix.Kevent_t, 1) + // SetKevent converts int to the platform-specific types. + unix.SetKevent(&changes[0], closepipe[0], unix.EVFILT_READ, + unix.EV_ADD|unix.EV_ENABLE|unix.EV_ONESHOT) + + ok, err := unix.Kevent(kq, changes, nil, nil) + if ok == -1 { + unix.Close(kq) + unix.Close(closepipe[0]) + unix.Close(closepipe[1]) + return kq, closepipe, err + } + return kq, closepipe, nil +} + +// Returns true if the event was sent, or false if watcher is closed. +func (w *Watcher) sendEvent(e Event) bool { + select { + case w.Events <- e: + return true + case <-w.done: + } + return false +} + +// Returns true if the error was sent, or false if watcher is closed. +func (w *Watcher) sendError(err error) bool { + select { + case w.Errors <- err: + return true + case <-w.done: + } + return false +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + pathsToRemove := make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() // Unlock before calling Remove, which also locks + for _, name := range pathsToRemove { + w.Remove(name) + } + + // Send "quit" message to the reader goroutine. + unix.Close(w.closepipe[1]) + close(w.done) + + return nil +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; attempting to watch it more than once will +// return an error. Paths that do not yet exist on the filesystem cannot be +// added. A watch will be automatically removed if the path is deleted. +// +// A path will remain watched if it gets renamed to somewhere else on the same +// filesystem, but the monitor will get removed if the path gets deleted and +// re-created, or if it's moved to a different filesystem. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many tools update files atomically. Instead of "just" writing +// to the file a temporary file will be written to first, and if successful the +// temporary file is moved to to destination removing the original, or some +// variant thereof. The watcher on the original file is now lost, as it no +// longer exists. +// +// Instead, watch the parent directory and use Event.Name to filter out files +// you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.userWatches[name] = struct{}{} + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) + } + + err := w.register([]int{watchfd}, unix.EV_DELETE, 0) + if err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.userWatches, name) + + parentName := filepath.Dir(name) + delete(w.watchesByDir[parentName], watchfd) + + if len(w.watchesByDir[parentName]) == 0 { + delete(w.watchesByDir, parentName) + } + + delete(w.paths, watchfd) + delete(w.dirFlags, name) + delete(w.fileExists, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for fd := range w.watchesByDir[name] { + path := w.paths[fd] + if _, ok := w.userWatches[path.name]; !ok { + pathsToRemove = append(pathsToRemove, path.name) + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// WatchList returns all paths added with [Add] (and are not yet removed). +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.userWatches)) + for pathname := range w.userWatches { + entries = append(entries, pathname) + } + + return entries +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets or named pipes + if (fi.Mode()&os.ModeSocket == os.ModeSocket) || (fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe) { + return "", nil + } + + // Follow Symlinks + // + // Linux can add unresolvable symlinks to the watch list without issue, + // and Windows can't do symlinks period. To maintain consistency, we + // will act like everything is fine if the link can't be resolved. + // There will simply be no file events for broken symlinks. Hence the + // returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + // Retry on EINTR; open() can return EINTR in practice on macOS. + // See #354, and go issues 11180 and 39237. + for { + watchfd, err = unix.Open(name, openMode, 0) + if err == nil { + break + } + if errors.Is(err, unix.EINTR) { + continue + } + + return "", err + } + + isDir = fi.IsDir() + } + + err := w.register([]int{watchfd}, unix.EV_ADD|unix.EV_CLEAR|unix.EV_ENABLE, flags) + if err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + parentName := filepath.Dir(name) + w.watches[name] = watchfd + + watchesByDir, ok := w.watchesByDir[parentName] + if !ok { + watchesByDir = make(map[int]struct{}, 1) + w.watchesByDir[parentName] = watchesByDir + } + watchesByDir[watchfd] = struct{}{} + + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + defer func() { + err := unix.Close(w.kq) + if err != nil { + w.Errors <- err + } + unix.Close(w.closepipe[0]) + close(w.Events) + close(w.Errors) + }() + + eventBuffer := make([]unix.Kevent_t, 10) + for closed := false; !closed; { + kevents, err := w.read(eventBuffer) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + if !w.sendError(fmt.Errorf("fsnotify.readEvents: %w", err)) { + closed = true + } + continue + } + + // Flush the events we received to the Events channel + for _, kevent := range kevents { + var ( + watchfd = int(kevent.Ident) + mask = uint32(kevent.Fflags) + ) + + // Shut down the loop when the pipe is closed, but only after all + // other events have been processed. + if watchfd == w.closepipe[0] { + closed = true + continue + } + + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + + event := w.newEvent(path.name, mask) + + if path.isDir && !event.Has(Remove) { + // Double check to make sure the directory exists. This can + // happen when we do a rm -fr on a recursively watched folders + // and we receive a modification event first but the folder has + // been deleted and later receive the delete event. + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + event.Op |= Remove + } + } + + if event.Has(Rename) || event.Has(Remove) { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Has(Write) && !event.Has(Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + if !w.sendEvent(event) { + closed = true + continue + } + } + + if event.Has(Remove) { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + } + } +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func (w *Watcher) newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + path := filepath.Join(dirPath, fileInfo.Name()) + + cleanPath, err := w.internalWatch(path, fileInfo) + if err != nil { + // No permission to read the file; that's not a problem: just skip. + // But do add it to w.fileExists to prevent it from being picked up + // as a "new" file later (it still shows up in the directory + // listing). + switch { + case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM): + cleanPath = filepath.Clean(path) + default: + return fmt.Errorf("%q: %w", filepath.Join(dirPath, fileInfo.Name()), err) + } + } + + w.mu.Lock() + w.fileExists[cleanPath] = struct{}{} + w.mu.Unlock() + } + + return nil +} + +// Search the directory for new files and send an event for them. +// +// This functionality is to have the BSD watcher match the inotify, which sends +// a create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dir string) { + // Get all files + files, err := ioutil.ReadDir(dir) + if err != nil { + if !w.sendError(fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err)) { + return + } + } + + // Search for new files + for _, fi := range files { + err := w.sendFileCreatedEventIfNew(filepath.Join(dir, fi.Name()), fi) + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + if !w.sendEvent(Event{Name: filePath, Op: Create}) { + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = struct{}{} + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// Register events with the queue. +func (w *Watcher) register(fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + for i, fd := range fds { + // SetKevent converts int to the platform-specific types. + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // Register the events. + success, err := unix.Kevent(w.kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +func (w *Watcher) read(events []unix.Kevent_t) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(w.kq, nil, events, nil) + if err != nil { + return nil, err + } + return events[0:n], nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_other.go b/vendor/github.com/fsnotify/fsnotify/backend_other.go new file mode 100644 index 00000000..a9bb1c3c --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_other.go @@ -0,0 +1,66 @@ +//go:build !darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows +// +build !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows + +package fsnotify + +import ( + "fmt" + "runtime" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct{} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + return nil, fmt.Errorf("fsnotify not supported on %s", runtime.GOOS) +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; attempting to watch it more than once will +// return an error. Paths that do not yet exist on the filesystem cannot be +// added. A watch will be automatically removed if the path is deleted. +// +// A path will remain watched if it gets renamed to somewhere else on the same +// filesystem, but the monitor will get removed if the path gets deleted and +// re-created, or if it's moved to a different filesystem. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many tools update files atomically. Instead of "just" writing +// to the file a temporary file will be written to first, and if successful the +// temporary file is moved to to destination removing the original, or some +// variant thereof. The watcher on the original file is now lost, as it no +// longer exists. +// +// Instead, watch the parent directory and use Event.Name to filter out files +// you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/backend_windows.go b/vendor/github.com/fsnotify/fsnotify/backend_windows.go new file mode 100644 index 00000000..ae392867 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/backend_windows.go @@ -0,0 +1,746 @@ +//go:build windows +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "reflect" + "runtime" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/windows" +) + +// Watcher watches a set of paths, delivering events on a channel. +// +// A watcher should not be copied (e.g. pass it by pointer, rather than by +// value). +// +// # Linux notes +// +// When a file is removed a Remove event won't be emitted until all file +// descriptors are closed, and deletes will always emit a Chmod. For example: +// +// fp := os.Open("file") +// os.Remove("file") // Triggers Chmod +// fp.Close() // Triggers Remove +// +// This is the event that inotify sends, so not much can be changed about this. +// +// The fs.inotify.max_user_watches sysctl variable specifies the upper limit +// for the number of watches per user, and fs.inotify.max_user_instances +// specifies the maximum number of inotify instances per user. Every Watcher you +// create is an "instance", and every path you add is a "watch". +// +// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and +// /proc/sys/fs/inotify/max_user_instances +// +// To increase them you can use sysctl or write the value to the /proc file: +// +// # Default values on Linux 5.18 +// sysctl fs.inotify.max_user_watches=124983 +// sysctl fs.inotify.max_user_instances=128 +// +// To make the changes persist on reboot edit /etc/sysctl.conf or +// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check +// your distro's documentation): +// +// fs.inotify.max_user_watches=124983 +// fs.inotify.max_user_instances=128 +// +// Reaching the limit will result in a "no space left on device" or "too many open +// files" error. +// +// # kqueue notes (macOS, BSD) +// +// kqueue requires opening a file descriptor for every file that's being watched; +// so if you're watching a directory with five files then that's six file +// descriptors. You will run in to your system's "max open files" limit faster on +// these platforms. +// +// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to +// control the maximum number of open files, as well as /etc/login.conf on BSD +// systems. +// +// # macOS notes +// +// Spotlight indexing on macOS can result in multiple events (see [#15]). A +// temporary workaround is to add your folder(s) to the "Spotlight Privacy +// Settings" until we have a native FSEvents implementation (see [#11]). +// +// [#11]: https://github.com/fsnotify/fsnotify/issues/11 +// [#15]: https://github.com/fsnotify/fsnotify/issues/15 +type Watcher struct { + // Events sends the filesystem change events. + // + // fsnotify can send the following events; a "path" here can refer to a + // file, directory, symbolic link, or special file like a FIFO. + // + // fsnotify.Create A new path was created; this may be followed by one + // or more Write events if data also gets written to a + // file. + // + // fsnotify.Remove A path was removed. + // + // fsnotify.Rename A path was renamed. A rename is always sent with the + // old path as Event.Name, and a Create event will be + // sent with the new name. Renames are only sent for + // paths that are currently watched; e.g. moving an + // unmonitored file into a monitored directory will + // show up as just a Create. Similarly, renaming a file + // to outside a monitored directory will show up as + // only a Rename. + // + // fsnotify.Write A file or named pipe was written to. A Truncate will + // also trigger a Write. A single "write action" + // initiated by the user may show up as one or multiple + // writes, depending on when the system syncs things to + // disk. For example when compiling a large Go program + // you may get hundreds of Write events, so you + // probably want to wait until you've stopped receiving + // them (see the dedup example in cmd/fsnotify). + // + // fsnotify.Chmod Attributes were changed. On Linux this is also sent + // when a file is removed (or more accurately, when a + // link to an inode is removed). On kqueue it's sent + // and on kqueue when a file is truncated. On Windows + // it's never sent. + Events chan Event + + // Errors sends any errors. + Errors chan error + + port windows.Handle // Handle to completion port + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error + + mu sync.Mutex // Protects access to watches, isClosed + watches watchMap // Map of watches (key: i-number) + isClosed bool // Set to true when Close() is first called +} + +// NewWatcher creates a new Watcher. +func NewWatcher() (*Watcher, error) { + port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0) + if err != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", err) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + + event := w.newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +// Returns true if the error was sent, or false if watcher is closed. +func (w *Watcher) sendError(err error) bool { + select { + case w.Errors <- err: + return true + case <-w.quit: + } + return false +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + w.mu.Unlock() + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts monitoring the path for changes. +// +// A path can only be watched once; attempting to watch it more than once will +// return an error. Paths that do not yet exist on the filesystem cannot be +// added. A watch will be automatically removed if the path is deleted. +// +// A path will remain watched if it gets renamed to somewhere else on the same +// filesystem, but the monitor will get removed if the path gets deleted and +// re-created, or if it's moved to a different filesystem. +// +// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special +// filesystems (/proc, /sys, etc.) generally don't work. +// +// # Watching directories +// +// All files in a directory are monitored, including new files that are created +// after the watcher is started. Subdirectories are not watched (i.e. it's +// non-recursive). +// +// # Watching files +// +// Watching individual files (rather than directories) is generally not +// recommended as many tools update files atomically. Instead of "just" writing +// to the file a temporary file will be written to first, and if successful the +// temporary file is moved to to destination removing the original, or some +// variant thereof. The watcher on the original file is now lost, as it no +// longer exists. +// +// Instead, watch the parent directory and use Event.Name to filter out files +// you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. +func (w *Watcher) Add(name string) error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return errors.New("watcher already closed") + } + w.mu.Unlock() + + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops monitoring the path for changes. +// +// Directories are always removed non-recursively. For example, if you added +// /tmp/dir and /tmp/dir/subdir then you will need to remove both. +// +// Removing a path that has not yet been added returns [ErrNonExistentWatch]. +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// WatchList returns all paths added with [Add] (and are not yet removed). +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for _, entry := range w.watches { + for _, watchEntry := range entry { + entries = append(entries, watchEntry.path) + } + } + + return entries +} + +// These options are from the old golang.org/x/exp/winfsnotify, where you could +// add various options to the watch. This has long since been removed. +// +// The "sys" in the name is misleading as they're not part of any "system". +// +// This should all be removed at some point, and just use windows.FILE_NOTIFY_* +const ( + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + sysFSIGNORED = 0x8000 +) + +func (w *Watcher) newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle windows.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov windows.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [65536]byte // 64K buffer +} + +type ( + indexMap map[uint64]*watch + watchMap map[uint32]indexMap +) + +func (w *Watcher) wakeupReader() error { + err := windows.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if err != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", err) + } + return nil +} + +func (w *Watcher) getDir(pathname string) (dir string, err error) { + attr, err := windows.GetFileAttributes(windows.StringToUTF16Ptr(pathname)) + if err != nil { + return "", os.NewSyscallError("GetFileAttributes", err) + } + if attr&windows.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func (w *Watcher) getIno(path string) (ino *inode, err error) { + h, err := windows.CreateFile(windows.StringToUTF16Ptr(path), + windows.FILE_LIST_DIRECTORY, + windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE, + nil, windows.OPEN_EXISTING, + windows.FILE_FLAG_BACKUP_SEMANTICS|windows.FILE_FLAG_OVERLAPPED, 0) + if err != nil { + return nil, os.NewSyscallError("CreateFile", err) + } + + var fi windows.ByHandleFileInformation + err = windows.GetFileInformationByHandle(h, &fi) + if err != nil { + windows.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", err) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := w.getDir(pathname) + if err != nil { + return err + } + + ino, err := w.getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + _, err := windows.CreateIoCompletionPort(ino.handle, w.port, 0, 0) + if err != nil { + windows.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", err) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + windows.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + + err = w.startRead(watchEntry) + if err != nil { + return err + } + + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := w.getDir(pathname) + if err != nil { + return err + } + ino, err := w.getIno(dir) + if err != nil { + return err + } + + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + + err = windows.CloseHandle(ino.handle) + if err != nil { + w.sendError(os.NewSyscallError("CloseHandle", err)) + } + if watch == nil { + return fmt.Errorf("%w: %s", ErrNonExistentWatch, pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + err := windows.CancelIo(watch.ino.handle) + if err != nil { + w.sendError(os.NewSyscallError("CancelIo", err)) + w.deleteWatch(watch) + } + mask := w.toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= w.toWindowsFlags(m) + } + if mask == 0 { + err := windows.CloseHandle(watch.ino.handle) + if err != nil { + w.sendError(os.NewSyscallError("CloseHandle", err)) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + + rdErr := windows.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if rdErr != nil { + err := os.NewSyscallError("ReadDirectoryChanges", rdErr) + if rdErr == windows.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n uint32 + key uintptr + ov *windows.Overlapped + ) + runtime.LockOSThread() + + for { + qErr := windows.GetQueuedCompletionStatus(w.port, &n, &key, &ov, windows.INFINITE) + // This error is handled after the watch == nil check below. NOTE: this + // seems odd, note sure if it's correct. + + watch := (*watch)(unsafe.Pointer(ov)) + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + + err := windows.CloseHandle(w.port) + if err != nil { + err = os.NewSyscallError("CloseHandle", err) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch qErr { + case windows.ERROR_MORE_DATA: + if watch == nil { + w.sendError(errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")) + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case windows.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case windows.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.sendError(os.NewSyscallError("GetQueuedCompletionPort", qErr)) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.sendError(errors.New("short read in readEvents()")) + break + } + + // Point "raw" to the event in the buffer + raw := (*windows.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + + // Create a buf that is the size of the path name + size := int(raw.FileNameLength / 2) + var buf []uint16 + // TODO: Use unsafe.Slice in Go 1.17; https://stackoverflow.com/questions/51187973 + sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) + sh.Data = uintptr(unsafe.Pointer(&raw.FileName)) + sh.Len = size + sh.Cap = size + name := windows.UTF16ToString(buf) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case windows.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case windows.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case windows.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case windows.FILE_ACTION_RENAMED_NEW_NAME: + // Update saved path of all sub-watches. + old := filepath.Join(watch.path, watch.rename) + w.mu.Lock() + for _, watchMap := range w.watches { + for _, ww := range watchMap { + if strings.HasPrefix(ww.path, old) { + ww.path = filepath.Join(fullname, strings.TrimPrefix(ww.path, old)) + } + } + } + w.mu.Unlock() + + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + w.sendEvent(fullname, watch.names[name]&mask) + } + if raw.Action != windows.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == windows.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + + w.sendEvent(fullname, watch.mask&w.toFSnotifyFlags(raw.Action)) + if raw.Action == windows.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.sendError(errors.New( + "Windows system assumed buffer larger than it is, events have likely been missed.")) + break + } + } + + if err := w.startRead(watch); err != nil { + w.sendError(err) + } + } +} + +func (w *Watcher) toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSMODIFY != 0 { + m |= windows.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= windows.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= windows.FILE_NOTIFY_CHANGE_FILE_NAME | windows.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func (w *Watcher) toFSnotifyFlags(action uint32) uint64 { + switch action { + case windows.FILE_ACTION_ADDED: + return sysFSCREATE + case windows.FILE_ACTION_REMOVED: + return sysFSDELETE + case windows.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case windows.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case windows.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/fsnotify/fsnotify/fen.go deleted file mode 100644 index b3ac3d8f..00000000 --- a/vendor/github.com/fsnotify/fsnotify/fen.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build solaris -// +build solaris - -package fsnotify - -import ( - "errors" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - return nil -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - return nil -} diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go index 0f4ee52e..30a5bf0f 100644 --- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -1,29 +1,37 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - //go:build !plan9 // +build !plan9 -// Package fsnotify provides a platform-independent interface for file system notifications. +// Package fsnotify provides a cross-platform interface for file system +// notifications. package fsnotify import ( - "bytes" "errors" "fmt" + "strings" ) -// Event represents a single file system notification. +// Event represents a file system notification. type Event struct { - Name string // Relative path to the file or directory. - Op Op // File operation that triggered the event. + // Path to the file or directory. + // + // Paths are relative to the input; for example with Add("dir") the Name + // will be set to "dir/file" if you create that file, but if you use + // Add("/path/to/dir") it will be "/path/to/dir/file". + Name string + + // File operation that triggered the event. + // + // This is a bitmask and some systems may send multiple operations at once. + // Use the Event.Has() method instead of comparing with ==. + Op Op } // Op describes a set of file operations. type Op uint32 -// These are the generalized file operations that can trigger a notification. +// The operations fsnotify can trigger; see the documentation on [Watcher] for a +// full description, and check them with [Event.Has]. const ( Create Op = 1 << iota Write @@ -32,38 +40,42 @@ const ( Chmod ) -func (op Op) String() string { - // Use a buffer for efficient string concatenation - var buffer bytes.Buffer +// Common errors that can be reported by a watcher +var ( + ErrNonExistentWatch = errors.New("can't remove non-existent watcher") + ErrEventOverflow = errors.New("fsnotify queue overflow") +) - if op&Create == Create { - buffer.WriteString("|CREATE") +func (op Op) String() string { + var b strings.Builder + if op.Has(Create) { + b.WriteString("|CREATE") } - if op&Remove == Remove { - buffer.WriteString("|REMOVE") + if op.Has(Remove) { + b.WriteString("|REMOVE") } - if op&Write == Write { - buffer.WriteString("|WRITE") + if op.Has(Write) { + b.WriteString("|WRITE") } - if op&Rename == Rename { - buffer.WriteString("|RENAME") + if op.Has(Rename) { + b.WriteString("|RENAME") } - if op&Chmod == Chmod { - buffer.WriteString("|CHMOD") + if op.Has(Chmod) { + b.WriteString("|CHMOD") } - if buffer.Len() == 0 { - return "" + if b.Len() == 0 { + return "[no events]" } - return buffer.String()[1:] // Strip leading pipe + return b.String()[1:] } -// String returns a string representation of the event in the form -// "file: REMOVE|WRITE|..." +// Has reports if this operation has the given operation. +func (o Op) Has(h Op) bool { return o&h == h } + +// Has reports if this event has the given operation. +func (e Event) Has(op Op) bool { return e.Op.Has(op) } + +// String returns a string representation of the event with their path. func (e Event) String() string { - return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) + return fmt.Sprintf("%-13s %q", e.Op.String(), e.Name) } - -// Common errors that can be reported by a watcher -var ( - ErrEventOverflow = errors.New("fsnotify queue overflow") -) diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go b/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go deleted file mode 100644 index 59688559..00000000 --- a/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows -// +build !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows - -package fsnotify - -import ( - "fmt" - "runtime" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct{} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - return nil, fmt.Errorf("fsnotify not supported on %s", runtime.GOOS) -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - return nil -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - return nil -} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go deleted file mode 100644 index a6d0e0ec..00000000 --- a/vendor/github.com/fsnotify/fsnotify/inotify.go +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build linux -// +build linux - -package fsnotify - -import ( - "errors" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "sync" - "unsafe" - - "golang.org/x/sys/unix" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error - mu sync.Mutex // Map access - fd int - poller *fdPoller - watches map[string]*watch // Map of inotify watches (key: path) - paths map[int]string // Map of watched paths (key: watch descriptor) - done chan struct{} // Channel for sending a "quit message" to the reader goroutine - doneResp chan struct{} // Channel to respond to Close -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - // Create inotify fd - fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) - if fd == -1 { - return nil, errno - } - // Create epoll - poller, err := newFdPoller(fd) - if err != nil { - unix.Close(fd) - return nil, err - } - w := &Watcher{ - fd: fd, - poller: poller, - watches: make(map[string]*watch), - paths: make(map[int]string), - Events: make(chan Event), - Errors: make(chan error), - done: make(chan struct{}), - doneResp: make(chan struct{}), - } - - go w.readEvents() - return w, nil -} - -func (w *Watcher) isClosed() bool { - select { - case <-w.done: - return true - default: - return false - } -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - if w.isClosed() { - return nil - } - - // Send 'close' signal to goroutine, and set the Watcher to closed. - close(w.done) - - // Wake up goroutine - w.poller.wake() - - // Wait for goroutine to close - <-w.doneResp - - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - name = filepath.Clean(name) - if w.isClosed() { - return errors.New("inotify instance already closed") - } - - const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | - unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | - unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF - - var flags uint32 = agnosticEvents - - w.mu.Lock() - defer w.mu.Unlock() - watchEntry := w.watches[name] - if watchEntry != nil { - flags |= watchEntry.flags | unix.IN_MASK_ADD - } - wd, errno := unix.InotifyAddWatch(w.fd, name, flags) - if wd == -1 { - return errno - } - - if watchEntry == nil { - w.watches[name] = &watch{wd: uint32(wd), flags: flags} - w.paths[wd] = name - } else { - watchEntry.wd = uint32(wd) - watchEntry.flags = flags - } - - return nil -} - -// Remove stops watching the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - name = filepath.Clean(name) - - // Fetch the watch. - w.mu.Lock() - defer w.mu.Unlock() - watch, ok := w.watches[name] - - // Remove it from inotify. - if !ok { - return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) - } - - // We successfully removed the watch if InotifyRmWatch doesn't return an - // error, we need to clean up our internal state to ensure it matches - // inotify's kernel state. - delete(w.paths, int(watch.wd)) - delete(w.watches, name) - - // inotify_rm_watch will return EINVAL if the file has been deleted; - // the inotify will already have been removed. - // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously - // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE - // so that EINVAL means that the wd is being rm_watch()ed or its file removed - // by another thread and we have not received IN_IGNORE event. - success, errno := unix.InotifyRmWatch(w.fd, watch.wd) - if success == -1 { - // TODO: Perhaps it's not helpful to return an error here in every case. - // the only two possible errors are: - // EBADF, which happens when w.fd is not a valid file descriptor of any kind. - // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. - // Watch descriptors are invalidated when they are removed explicitly or implicitly; - // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. - return errno - } - - return nil -} - -// WatchList returns the directories and files that are being monitered. -func (w *Watcher) WatchList() []string { - w.mu.Lock() - defer w.mu.Unlock() - - entries := make([]string, 0, len(w.watches)) - for pathname := range w.watches { - entries = append(entries, pathname) - } - - return entries -} - -type watch struct { - wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) - flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) -} - -// readEvents reads from the inotify file descriptor, converts the -// received events into Event objects and sends them via the Events channel -func (w *Watcher) readEvents() { - var ( - buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events - n int // Number of bytes read with read() - errno error // Syscall errno - ok bool // For poller.wait - ) - - defer close(w.doneResp) - defer close(w.Errors) - defer close(w.Events) - defer unix.Close(w.fd) - defer w.poller.close() - - for { - // See if we have been closed. - if w.isClosed() { - return - } - - ok, errno = w.poller.wait() - if errno != nil { - select { - case w.Errors <- errno: - case <-w.done: - return - } - continue - } - - if !ok { - continue - } - - n, errno = unix.Read(w.fd, buf[:]) - // If a signal interrupted execution, see if we've been asked to close, and try again. - // http://man7.org/linux/man-pages/man7/signal.7.html : - // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" - if errno == unix.EINTR { - continue - } - - // unix.Read might have been woken up by Close. If so, we're done. - if w.isClosed() { - return - } - - if n < unix.SizeofInotifyEvent { - var err error - if n == 0 { - // If EOF is received. This should really never happen. - err = io.EOF - } else if n < 0 { - // If an error occurred while reading. - err = errno - } else { - // Read was too short. - err = errors.New("notify: short read in readEvents()") - } - select { - case w.Errors <- err: - case <-w.done: - return - } - continue - } - - var offset uint32 - // We don't know how many events we just read into the buffer - // While the offset points to at least one whole event... - for offset <= uint32(n-unix.SizeofInotifyEvent) { - // Point "raw" to the event in the buffer - raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) - - mask := uint32(raw.Mask) - nameLen := uint32(raw.Len) - - if mask&unix.IN_Q_OVERFLOW != 0 { - select { - case w.Errors <- ErrEventOverflow: - case <-w.done: - return - } - } - - // If the event happened to the watched directory or the watched file, the kernel - // doesn't append the filename to the event, but we would like to always fill the - // the "Name" field with a valid filename. We retrieve the path of the watch from - // the "paths" map. - w.mu.Lock() - name, ok := w.paths[int(raw.Wd)] - // IN_DELETE_SELF occurs when the file/directory being watched is removed. - // This is a sign to clean up the maps, otherwise we are no longer in sync - // with the inotify kernel state which has already deleted the watch - // automatically. - if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { - delete(w.paths, int(raw.Wd)) - delete(w.watches, name) - } - w.mu.Unlock() - - if nameLen > 0 { - // Point "bytes" at the first byte of the filename - bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen] - // The filename is padded with NULL bytes. TrimRight() gets rid of those. - name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") - } - - event := newEvent(name, mask) - - // Send the events that are not ignored on the events channel - if !event.ignoreLinux(mask) { - select { - case w.Events <- event: - case <-w.done: - return - } - } - - // Move to the next event in the buffer - offset += unix.SizeofInotifyEvent + nameLen - } - } -} - -// Certain types of events can be "ignored" and not sent over the Events -// channel. Such as events marked ignore by the kernel, or MODIFY events -// against files that do not exist. -func (e *Event) ignoreLinux(mask uint32) bool { - // Ignore anything the inotify API says to ignore - if mask&unix.IN_IGNORED == unix.IN_IGNORED { - return true - } - - // If the event is not a DELETE or RENAME, the file must exist. - // Otherwise the event is ignored. - // *Note*: this was put in place because it was seen that a MODIFY - // event was sent after the DELETE. This ignores that MODIFY and - // assumes a DELETE will come or has come if the file doesn't exist. - if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { - _, statErr := os.Lstat(e.Name) - return os.IsNotExist(statErr) - } - return false -} - -// newEvent returns an platform-independent Event based on an inotify mask. -func newEvent(name string, mask uint32) Event { - e := Event{Name: name} - if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { - e.Op |= Create - } - if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { - e.Op |= Remove - } - if mask&unix.IN_MODIFY == unix.IN_MODIFY { - e.Op |= Write - } - if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { - e.Op |= Rename - } - if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { - e.Op |= Chmod - } - return e -} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go deleted file mode 100644 index b572a37c..00000000 --- a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build linux -// +build linux - -package fsnotify - -import ( - "errors" - - "golang.org/x/sys/unix" -) - -type fdPoller struct { - fd int // File descriptor (as returned by the inotify_init() syscall) - epfd int // Epoll file descriptor - pipe [2]int // Pipe for waking up -} - -func emptyPoller(fd int) *fdPoller { - poller := new(fdPoller) - poller.fd = fd - poller.epfd = -1 - poller.pipe[0] = -1 - poller.pipe[1] = -1 - return poller -} - -// Create a new inotify poller. -// This creates an inotify handler, and an epoll handler. -func newFdPoller(fd int) (*fdPoller, error) { - var errno error - poller := emptyPoller(fd) - defer func() { - if errno != nil { - poller.close() - } - }() - - // Create epoll fd - poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) - if poller.epfd == -1 { - return nil, errno - } - // Create pipe; pipe[0] is the read end, pipe[1] the write end. - errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC) - if errno != nil { - return nil, errno - } - - // Register inotify fd with epoll - event := unix.EpollEvent{ - Fd: int32(poller.fd), - Events: unix.EPOLLIN, - } - errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) - if errno != nil { - return nil, errno - } - - // Register pipe fd with epoll - event = unix.EpollEvent{ - Fd: int32(poller.pipe[0]), - Events: unix.EPOLLIN, - } - errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) - if errno != nil { - return nil, errno - } - - return poller, nil -} - -// Wait using epoll. -// Returns true if something is ready to be read, -// false if there is not. -func (poller *fdPoller) wait() (bool, error) { - // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. - // I don't know whether epoll_wait returns the number of events returned, - // or the total number of events ready. - // I decided to catch both by making the buffer one larger than the maximum. - events := make([]unix.EpollEvent, 7) - for { - n, errno := unix.EpollWait(poller.epfd, events, -1) - if n == -1 { - if errno == unix.EINTR { - continue - } - return false, errno - } - if n == 0 { - // If there are no events, try again. - continue - } - if n > 6 { - // This should never happen. More events were returned than should be possible. - return false, errors.New("epoll_wait returned more events than I know what to do with") - } - ready := events[:n] - epollhup := false - epollerr := false - epollin := false - for _, event := range ready { - if event.Fd == int32(poller.fd) { - if event.Events&unix.EPOLLHUP != 0 { - // This should not happen, but if it does, treat it as a wakeup. - epollhup = true - } - if event.Events&unix.EPOLLERR != 0 { - // If an error is waiting on the file descriptor, we should pretend - // something is ready to read, and let unix.Read pick up the error. - epollerr = true - } - if event.Events&unix.EPOLLIN != 0 { - // There is data to read. - epollin = true - } - } - if event.Fd == int32(poller.pipe[0]) { - if event.Events&unix.EPOLLHUP != 0 { - // Write pipe descriptor was closed, by us. This means we're closing down the - // watcher, and we should wake up. - } - if event.Events&unix.EPOLLERR != 0 { - // If an error is waiting on the pipe file descriptor. - // This is an absolute mystery, and should never ever happen. - return false, errors.New("Error on the pipe descriptor.") - } - if event.Events&unix.EPOLLIN != 0 { - // This is a regular wakeup, so we have to clear the buffer. - err := poller.clearWake() - if err != nil { - return false, err - } - } - } - } - - if epollhup || epollerr || epollin { - return true, nil - } - return false, nil - } -} - -// Close the write end of the poller. -func (poller *fdPoller) wake() error { - buf := make([]byte, 1) - n, errno := unix.Write(poller.pipe[1], buf) - if n == -1 { - if errno == unix.EAGAIN { - // Buffer is full, poller will wake. - return nil - } - return errno - } - return nil -} - -func (poller *fdPoller) clearWake() error { - // You have to be woken up a LOT in order to get to 100! - buf := make([]byte, 100) - n, errno := unix.Read(poller.pipe[0], buf) - if n == -1 { - if errno == unix.EAGAIN { - // Buffer is empty, someone else cleared our wake. - return nil - } - return errno - } - return nil -} - -// Close all poller file descriptors, but not the one passed to it. -func (poller *fdPoller) close() { - if poller.pipe[1] != -1 { - unix.Close(poller.pipe[1]) - } - if poller.pipe[0] != -1 { - unix.Close(poller.pipe[0]) - } - if poller.epfd != -1 { - unix.Close(poller.epfd) - } -} diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go deleted file mode 100644 index 6fb8d853..00000000 --- a/vendor/github.com/fsnotify/fsnotify/kqueue.go +++ /dev/null @@ -1,535 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build freebsd || openbsd || netbsd || dragonfly || darwin -// +build freebsd openbsd netbsd dragonfly darwin - -package fsnotify - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "sync" - "time" - - "golang.org/x/sys/unix" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error - done chan struct{} // Channel for sending a "quit message" to the reader goroutine - - kq int // File descriptor (as returned by the kqueue() syscall). - - mu sync.Mutex // Protects access to watcher data - watches map[string]int // Map of watched file descriptors (key: path). - externalWatches map[string]bool // Map of watches added by user of the library. - dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. - paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. - fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). - isClosed bool // Set to true when Close() is first called -} - -type pathInfo struct { - name string - isDir bool -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - kq, err := kqueue() - if err != nil { - return nil, err - } - - w := &Watcher{ - kq: kq, - watches: make(map[string]int), - dirFlags: make(map[string]uint32), - paths: make(map[int]pathInfo), - fileExists: make(map[string]bool), - externalWatches: make(map[string]bool), - Events: make(chan Event), - Errors: make(chan error), - done: make(chan struct{}), - } - - go w.readEvents() - return w, nil -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - w.mu.Lock() - if w.isClosed { - w.mu.Unlock() - return nil - } - w.isClosed = true - - // copy paths to remove while locked - var pathsToRemove = make([]string, 0, len(w.watches)) - for name := range w.watches { - pathsToRemove = append(pathsToRemove, name) - } - w.mu.Unlock() - // unlock before calling Remove, which also locks - - for _, name := range pathsToRemove { - w.Remove(name) - } - - // send a "quit" message to the reader goroutine - close(w.done) - - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - w.mu.Lock() - w.externalWatches[name] = true - w.mu.Unlock() - _, err := w.addWatch(name, noteAllEvents) - return err -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - name = filepath.Clean(name) - w.mu.Lock() - watchfd, ok := w.watches[name] - w.mu.Unlock() - if !ok { - return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) - } - - const registerRemove = unix.EV_DELETE - if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { - return err - } - - unix.Close(watchfd) - - w.mu.Lock() - isDir := w.paths[watchfd].isDir - delete(w.watches, name) - delete(w.paths, watchfd) - delete(w.dirFlags, name) - w.mu.Unlock() - - // Find all watched paths that are in this directory that are not external. - if isDir { - var pathsToRemove []string - w.mu.Lock() - for _, path := range w.paths { - wdir, _ := filepath.Split(path.name) - if filepath.Clean(wdir) == name { - if !w.externalWatches[path.name] { - pathsToRemove = append(pathsToRemove, path.name) - } - } - } - w.mu.Unlock() - for _, name := range pathsToRemove { - // Since these are internal, not much sense in propagating error - // to the user, as that will just confuse them with an error about - // a path they did not explicitly watch themselves. - w.Remove(name) - } - } - - return nil -} - -// WatchList returns the directories and files that are being monitered. -func (w *Watcher) WatchList() []string { - w.mu.Lock() - defer w.mu.Unlock() - - entries := make([]string, 0, len(w.watches)) - for pathname := range w.watches { - entries = append(entries, pathname) - } - - return entries -} - -// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) -const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME - -// keventWaitTime to block on each read from kevent -var keventWaitTime = durationToTimespec(100 * time.Millisecond) - -// addWatch adds name to the watched file set. -// The flags are interpreted as described in kevent(2). -// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. -func (w *Watcher) addWatch(name string, flags uint32) (string, error) { - var isDir bool - // Make ./name and name equivalent - name = filepath.Clean(name) - - w.mu.Lock() - if w.isClosed { - w.mu.Unlock() - return "", errors.New("kevent instance already closed") - } - watchfd, alreadyWatching := w.watches[name] - // We already have a watch, but we can still override flags. - if alreadyWatching { - isDir = w.paths[watchfd].isDir - } - w.mu.Unlock() - - if !alreadyWatching { - fi, err := os.Lstat(name) - if err != nil { - return "", err - } - - // Don't watch sockets. - if fi.Mode()&os.ModeSocket == os.ModeSocket { - return "", nil - } - - // Don't watch named pipes. - if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { - return "", nil - } - - // Follow Symlinks - // Unfortunately, Linux can add bogus symlinks to watch list without - // issue, and Windows can't do symlinks period (AFAIK). To maintain - // consistency, we will act like everything is fine. There will simply - // be no file events for broken symlinks. - // Hence the returns of nil on errors. - if fi.Mode()&os.ModeSymlink == os.ModeSymlink { - name, err = filepath.EvalSymlinks(name) - if err != nil { - return "", nil - } - - w.mu.Lock() - _, alreadyWatching = w.watches[name] - w.mu.Unlock() - - if alreadyWatching { - return name, nil - } - - fi, err = os.Lstat(name) - if err != nil { - return "", nil - } - } - - watchfd, err = unix.Open(name, openMode, 0700) - if watchfd == -1 { - return "", err - } - - isDir = fi.IsDir() - } - - const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE - if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { - unix.Close(watchfd) - return "", err - } - - if !alreadyWatching { - w.mu.Lock() - w.watches[name] = watchfd - w.paths[watchfd] = pathInfo{name: name, isDir: isDir} - w.mu.Unlock() - } - - if isDir { - // Watch the directory if it has not been watched before, - // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) - w.mu.Lock() - - watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && - (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) - // Store flags so this watch can be updated later - w.dirFlags[name] = flags - w.mu.Unlock() - - if watchDir { - if err := w.watchDirectoryFiles(name); err != nil { - return "", err - } - } - } - return name, nil -} - -// readEvents reads from kqueue and converts the received kevents into -// Event values that it sends down the Events channel. -func (w *Watcher) readEvents() { - eventBuffer := make([]unix.Kevent_t, 10) - -loop: - for { - // See if there is a message on the "done" channel - select { - case <-w.done: - break loop - default: - } - - // Get new events - kevents, err := read(w.kq, eventBuffer, &keventWaitTime) - // EINTR is okay, the syscall was interrupted before timeout expired. - if err != nil && err != unix.EINTR { - select { - case w.Errors <- err: - case <-w.done: - break loop - } - continue - } - - // Flush the events we received to the Events channel - for len(kevents) > 0 { - kevent := &kevents[0] - watchfd := int(kevent.Ident) - mask := uint32(kevent.Fflags) - w.mu.Lock() - path := w.paths[watchfd] - w.mu.Unlock() - event := newEvent(path.name, mask) - - if path.isDir && !(event.Op&Remove == Remove) { - // Double check to make sure the directory exists. This can happen when - // we do a rm -fr on a recursively watched folders and we receive a - // modification event first but the folder has been deleted and later - // receive the delete event - if _, err := os.Lstat(event.Name); os.IsNotExist(err) { - // mark is as delete event - event.Op |= Remove - } - } - - if event.Op&Rename == Rename || event.Op&Remove == Remove { - w.Remove(event.Name) - w.mu.Lock() - delete(w.fileExists, event.Name) - w.mu.Unlock() - } - - if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { - w.sendDirectoryChangeEvents(event.Name) - } else { - // Send the event on the Events channel. - select { - case w.Events <- event: - case <-w.done: - break loop - } - } - - if event.Op&Remove == Remove { - // Look for a file that may have overwritten this. - // For example, mv f1 f2 will delete f2, then create f2. - if path.isDir { - fileDir := filepath.Clean(event.Name) - w.mu.Lock() - _, found := w.watches[fileDir] - w.mu.Unlock() - if found { - // make sure the directory exists before we watch for changes. When we - // do a recursive watch and perform rm -fr, the parent directory might - // have gone missing, ignore the missing directory and let the - // upcoming delete event remove the watch from the parent directory. - if _, err := os.Lstat(fileDir); err == nil { - w.sendDirectoryChangeEvents(fileDir) - } - } - } else { - filePath := filepath.Clean(event.Name) - if fileInfo, err := os.Lstat(filePath); err == nil { - w.sendFileCreatedEventIfNew(filePath, fileInfo) - } - } - } - - // Move to next event - kevents = kevents[1:] - } - } - - // cleanup - err := unix.Close(w.kq) - if err != nil { - // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. - select { - case w.Errors <- err: - default: - } - } - close(w.Events) - close(w.Errors) -} - -// newEvent returns an platform-independent Event based on kqueue Fflags. -func newEvent(name string, mask uint32) Event { - e := Event{Name: name} - if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { - e.Op |= Remove - } - if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { - e.Op |= Write - } - if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { - e.Op |= Rename - } - if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { - e.Op |= Chmod - } - return e -} - -func newCreateEvent(name string) Event { - return Event{Name: name, Op: Create} -} - -// watchDirectoryFiles to mimic inotify when adding a watch on a directory -func (w *Watcher) watchDirectoryFiles(dirPath string) error { - // Get all files - files, err := ioutil.ReadDir(dirPath) - if err != nil { - return err - } - - for _, fileInfo := range files { - filePath := filepath.Join(dirPath, fileInfo.Name()) - filePath, err = w.internalWatch(filePath, fileInfo) - if err != nil { - return err - } - - w.mu.Lock() - w.fileExists[filePath] = true - w.mu.Unlock() - } - - return nil -} - -// sendDirectoryEvents searches the directory for newly created files -// and sends them over the event channel. This functionality is to have -// the BSD version of fsnotify match Linux inotify which provides a -// create event for files created in a watched directory. -func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { - // Get all files - files, err := ioutil.ReadDir(dirPath) - if err != nil { - select { - case w.Errors <- err: - case <-w.done: - return - } - } - - // Search for new files - for _, fileInfo := range files { - filePath := filepath.Join(dirPath, fileInfo.Name()) - err := w.sendFileCreatedEventIfNew(filePath, fileInfo) - - if err != nil { - return - } - } -} - -// sendFileCreatedEvent sends a create event if the file isn't already being tracked. -func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { - w.mu.Lock() - _, doesExist := w.fileExists[filePath] - w.mu.Unlock() - if !doesExist { - // Send create event - select { - case w.Events <- newCreateEvent(filePath): - case <-w.done: - return - } - } - - // like watchDirectoryFiles (but without doing another ReadDir) - filePath, err = w.internalWatch(filePath, fileInfo) - if err != nil { - return err - } - - w.mu.Lock() - w.fileExists[filePath] = true - w.mu.Unlock() - - return nil -} - -func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { - if fileInfo.IsDir() { - // mimic Linux providing delete events for subdirectories - // but preserve the flags used if currently watching subdirectory - w.mu.Lock() - flags := w.dirFlags[name] - w.mu.Unlock() - - flags |= unix.NOTE_DELETE | unix.NOTE_RENAME - return w.addWatch(name, flags) - } - - // watch file to mimic Linux inotify - return w.addWatch(name, noteAllEvents) -} - -// kqueue creates a new kernel event queue and returns a descriptor. -func kqueue() (kq int, err error) { - kq, err = unix.Kqueue() - if kq == -1 { - return kq, err - } - return kq, nil -} - -// register events with the queue -func register(kq int, fds []int, flags int, fflags uint32) error { - changes := make([]unix.Kevent_t, len(fds)) - - for i, fd := range fds { - // SetKevent converts int to the platform-specific types: - unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) - changes[i].Fflags = fflags - } - - // register the events - success, err := unix.Kevent(kq, changes, nil, nil) - if success == -1 { - return err - } - return nil -} - -// read retrieves pending events, or waits until an event occurs. -// A timeout of nil blocks indefinitely, while 0 polls the queue. -func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { - n, err := unix.Kevent(kq, nil, events, timeout) - if err != nil { - return nil, err - } - return events[0:n], nil -} - -// durationToTimespec prepares a timeout value -func durationToTimespec(d time.Duration) unix.Timespec { - return unix.NsecToTimespec(d.Nanoseconds()) -} diff --git a/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh b/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh new file mode 100644 index 00000000..b09ef768 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh @@ -0,0 +1,208 @@ +#!/usr/bin/env zsh +[ "${ZSH_VERSION:-}" = "" ] && echo >&2 "Only works with zsh" && exit 1 +setopt err_exit no_unset pipefail extended_glob + +# Simple script to update the godoc comments on all watchers. Probably took me +# more time to write this than doing it manually, but ah well 🙃 + +watcher=$(</tmp/x + print -r -- $cmt >>/tmp/x + tail -n+$(( end + 1 )) $file >>/tmp/x + mv /tmp/x $file + done +} + +set-cmt '^type Watcher struct ' $watcher +set-cmt '^func NewWatcher(' $new +set-cmt '^func (w \*Watcher) Add(' $add +set-cmt '^func (w \*Watcher) Remove(' $remove +set-cmt '^func (w \*Watcher) Close(' $close +set-cmt '^func (w \*Watcher) WatchList(' $watchlist +set-cmt '^[[:space:]]*Events *chan Event$' $events +set-cmt '^[[:space:]]*Errors *chan error$' $errors diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/system_bsd.go similarity index 57% rename from vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go rename to vendor/github.com/fsnotify/fsnotify/system_bsd.go index 36cc3845..4322b0b8 100644 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go +++ b/vendor/github.com/fsnotify/fsnotify/system_bsd.go @@ -1,7 +1,3 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - //go:build freebsd || openbsd || netbsd || dragonfly // +build freebsd openbsd netbsd dragonfly diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/system_darwin.go similarity index 52% rename from vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go rename to vendor/github.com/fsnotify/fsnotify/system_darwin.go index 98cd8476..5da5ffa7 100644 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go +++ b/vendor/github.com/fsnotify/fsnotify/system_darwin.go @@ -1,7 +1,3 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - //go:build darwin // +build darwin diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go deleted file mode 100644 index 02ce7deb..00000000 --- a/vendor/github.com/fsnotify/fsnotify/windows.go +++ /dev/null @@ -1,586 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build windows -// +build windows - -package fsnotify - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "reflect" - "runtime" - "sync" - "syscall" - "unsafe" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error - isClosed bool // Set to true when Close() is first called - mu sync.Mutex // Map access - port syscall.Handle // Handle to completion port - watches watchMap // Map of watches (key: i-number) - input chan *input // Inputs to the reader are sent on this channel - quit chan chan<- error -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) - if e != nil { - return nil, os.NewSyscallError("CreateIoCompletionPort", e) - } - w := &Watcher{ - port: port, - watches: make(watchMap), - input: make(chan *input, 1), - Events: make(chan Event, 50), - Errors: make(chan error), - quit: make(chan chan<- error, 1), - } - go w.readEvents() - return w, nil -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - if w.isClosed { - return nil - } - w.isClosed = true - - // Send "quit" message to the reader goroutine - ch := make(chan error) - w.quit <- ch - if err := w.wakeupReader(); err != nil { - return err - } - return <-ch -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - if w.isClosed { - return errors.New("watcher already closed") - } - in := &input{ - op: opAddWatch, - path: filepath.Clean(name), - flags: sysFSALLEVENTS, - reply: make(chan error), - } - w.input <- in - if err := w.wakeupReader(); err != nil { - return err - } - return <-in.reply -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - in := &input{ - op: opRemoveWatch, - path: filepath.Clean(name), - reply: make(chan error), - } - w.input <- in - if err := w.wakeupReader(); err != nil { - return err - } - return <-in.reply -} - -// WatchList returns the directories and files that are being monitered. -func (w *Watcher) WatchList() []string { - w.mu.Lock() - defer w.mu.Unlock() - - entries := make([]string, 0, len(w.watches)) - for _, entry := range w.watches { - for _, watchEntry := range entry { - entries = append(entries, watchEntry.path) - } - } - - return entries -} - -const ( - // Options for AddWatch - sysFSONESHOT = 0x80000000 - sysFSONLYDIR = 0x1000000 - - // Events - sysFSACCESS = 0x1 - sysFSALLEVENTS = 0xfff - sysFSATTRIB = 0x4 - sysFSCLOSE = 0x18 - sysFSCREATE = 0x100 - sysFSDELETE = 0x200 - sysFSDELETESELF = 0x400 - sysFSMODIFY = 0x2 - sysFSMOVE = 0xc0 - sysFSMOVEDFROM = 0x40 - sysFSMOVEDTO = 0x80 - sysFSMOVESELF = 0x800 - - // Special events - sysFSIGNORED = 0x8000 - sysFSQOVERFLOW = 0x4000 -) - -func newEvent(name string, mask uint32) Event { - e := Event{Name: name} - if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { - e.Op |= Create - } - if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { - e.Op |= Remove - } - if mask&sysFSMODIFY == sysFSMODIFY { - e.Op |= Write - } - if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { - e.Op |= Rename - } - if mask&sysFSATTRIB == sysFSATTRIB { - e.Op |= Chmod - } - return e -} - -const ( - opAddWatch = iota - opRemoveWatch -) - -const ( - provisional uint64 = 1 << (32 + iota) -) - -type input struct { - op int - path string - flags uint32 - reply chan error -} - -type inode struct { - handle syscall.Handle - volume uint32 - index uint64 -} - -type watch struct { - ov syscall.Overlapped - ino *inode // i-number - path string // Directory path - mask uint64 // Directory itself is being watched with these notify flags - names map[string]uint64 // Map of names being watched and their notify flags - rename string // Remembers the old name while renaming a file - buf [4096]byte -} - -type indexMap map[uint64]*watch -type watchMap map[uint32]indexMap - -func (w *Watcher) wakeupReader() error { - e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) - if e != nil { - return os.NewSyscallError("PostQueuedCompletionStatus", e) - } - return nil -} - -func getDir(pathname string) (dir string, err error) { - attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) - if e != nil { - return "", os.NewSyscallError("GetFileAttributes", e) - } - if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { - dir = pathname - } else { - dir, _ = filepath.Split(pathname) - dir = filepath.Clean(dir) - } - return -} - -func getIno(path string) (ino *inode, err error) { - h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), - syscall.FILE_LIST_DIRECTORY, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - nil, syscall.OPEN_EXISTING, - syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) - if e != nil { - return nil, os.NewSyscallError("CreateFile", e) - } - var fi syscall.ByHandleFileInformation - if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { - syscall.CloseHandle(h) - return nil, os.NewSyscallError("GetFileInformationByHandle", e) - } - ino = &inode{ - handle: h, - volume: fi.VolumeSerialNumber, - index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), - } - return ino, nil -} - -// Must run within the I/O thread. -func (m watchMap) get(ino *inode) *watch { - if i := m[ino.volume]; i != nil { - return i[ino.index] - } - return nil -} - -// Must run within the I/O thread. -func (m watchMap) set(ino *inode, watch *watch) { - i := m[ino.volume] - if i == nil { - i = make(indexMap) - m[ino.volume] = i - } - i[ino.index] = watch -} - -// Must run within the I/O thread. -func (w *Watcher) addWatch(pathname string, flags uint64) error { - dir, err := getDir(pathname) - if err != nil { - return err - } - if flags&sysFSONLYDIR != 0 && pathname != dir { - return nil - } - ino, err := getIno(dir) - if err != nil { - return err - } - w.mu.Lock() - watchEntry := w.watches.get(ino) - w.mu.Unlock() - if watchEntry == nil { - if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { - syscall.CloseHandle(ino.handle) - return os.NewSyscallError("CreateIoCompletionPort", e) - } - watchEntry = &watch{ - ino: ino, - path: dir, - names: make(map[string]uint64), - } - w.mu.Lock() - w.watches.set(ino, watchEntry) - w.mu.Unlock() - flags |= provisional - } else { - syscall.CloseHandle(ino.handle) - } - if pathname == dir { - watchEntry.mask |= flags - } else { - watchEntry.names[filepath.Base(pathname)] |= flags - } - if err = w.startRead(watchEntry); err != nil { - return err - } - if pathname == dir { - watchEntry.mask &= ^provisional - } else { - watchEntry.names[filepath.Base(pathname)] &= ^provisional - } - return nil -} - -// Must run within the I/O thread. -func (w *Watcher) remWatch(pathname string) error { - dir, err := getDir(pathname) - if err != nil { - return err - } - ino, err := getIno(dir) - if err != nil { - return err - } - w.mu.Lock() - watch := w.watches.get(ino) - w.mu.Unlock() - if watch == nil { - return fmt.Errorf("can't remove non-existent watch for: %s", pathname) - } - if pathname == dir { - w.sendEvent(watch.path, watch.mask&sysFSIGNORED) - watch.mask = 0 - } else { - name := filepath.Base(pathname) - w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) - delete(watch.names, name) - } - return w.startRead(watch) -} - -// Must run within the I/O thread. -func (w *Watcher) deleteWatch(watch *watch) { - for name, mask := range watch.names { - if mask&provisional == 0 { - w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) - } - delete(watch.names, name) - } - if watch.mask != 0 { - if watch.mask&provisional == 0 { - w.sendEvent(watch.path, watch.mask&sysFSIGNORED) - } - watch.mask = 0 - } -} - -// Must run within the I/O thread. -func (w *Watcher) startRead(watch *watch) error { - if e := syscall.CancelIo(watch.ino.handle); e != nil { - w.Errors <- os.NewSyscallError("CancelIo", e) - w.deleteWatch(watch) - } - mask := toWindowsFlags(watch.mask) - for _, m := range watch.names { - mask |= toWindowsFlags(m) - } - if mask == 0 { - if e := syscall.CloseHandle(watch.ino.handle); e != nil { - w.Errors <- os.NewSyscallError("CloseHandle", e) - } - w.mu.Lock() - delete(w.watches[watch.ino.volume], watch.ino.index) - w.mu.Unlock() - return nil - } - e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], - uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) - if e != nil { - err := os.NewSyscallError("ReadDirectoryChanges", e) - if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { - // Watched directory was probably removed - if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { - if watch.mask&sysFSONESHOT != 0 { - watch.mask = 0 - } - } - err = nil - } - w.deleteWatch(watch) - w.startRead(watch) - return err - } - return nil -} - -// readEvents reads from the I/O completion port, converts the -// received events into Event objects and sends them via the Events channel. -// Entry point to the I/O thread. -func (w *Watcher) readEvents() { - var ( - n, key uint32 - ov *syscall.Overlapped - ) - runtime.LockOSThread() - - for { - e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) - watch := (*watch)(unsafe.Pointer(ov)) - - if watch == nil { - select { - case ch := <-w.quit: - w.mu.Lock() - var indexes []indexMap - for _, index := range w.watches { - indexes = append(indexes, index) - } - w.mu.Unlock() - for _, index := range indexes { - for _, watch := range index { - w.deleteWatch(watch) - w.startRead(watch) - } - } - var err error - if e := syscall.CloseHandle(w.port); e != nil { - err = os.NewSyscallError("CloseHandle", e) - } - close(w.Events) - close(w.Errors) - ch <- err - return - case in := <-w.input: - switch in.op { - case opAddWatch: - in.reply <- w.addWatch(in.path, uint64(in.flags)) - case opRemoveWatch: - in.reply <- w.remWatch(in.path) - } - default: - } - continue - } - - switch e { - case syscall.ERROR_MORE_DATA: - if watch == nil { - w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") - } else { - // The i/o succeeded but the buffer is full. - // In theory we should be building up a full packet. - // In practice we can get away with just carrying on. - n = uint32(unsafe.Sizeof(watch.buf)) - } - case syscall.ERROR_ACCESS_DENIED: - // Watched directory was probably removed - w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) - w.deleteWatch(watch) - w.startRead(watch) - continue - case syscall.ERROR_OPERATION_ABORTED: - // CancelIo was called on this handle - continue - default: - w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) - continue - case nil: - } - - var offset uint32 - for { - if n == 0 { - w.Events <- newEvent("", sysFSQOVERFLOW) - w.Errors <- errors.New("short read in readEvents()") - break - } - - // Point "raw" to the event in the buffer - raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) - // TODO: Consider using unsafe.Slice that is available from go1.17 - // https://stackoverflow.com/questions/51187973/how-to-create-an-array-or-a-slice-from-an-array-unsafe-pointer-in-golang - // instead of using a fixed syscall.MAX_PATH buf, we create a buf that is the size of the path name - size := int(raw.FileNameLength / 2) - var buf []uint16 - sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) - sh.Data = uintptr(unsafe.Pointer(&raw.FileName)) - sh.Len = size - sh.Cap = size - name := syscall.UTF16ToString(buf) - fullname := filepath.Join(watch.path, name) - - var mask uint64 - switch raw.Action { - case syscall.FILE_ACTION_REMOVED: - mask = sysFSDELETESELF - case syscall.FILE_ACTION_MODIFIED: - mask = sysFSMODIFY - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - watch.rename = name - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - if watch.names[watch.rename] != 0 { - watch.names[name] |= watch.names[watch.rename] - delete(watch.names, watch.rename) - mask = sysFSMOVESELF - } - } - - sendNameEvent := func() { - if w.sendEvent(fullname, watch.names[name]&mask) { - if watch.names[name]&sysFSONESHOT != 0 { - delete(watch.names, name) - } - } - } - if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { - sendNameEvent() - } - if raw.Action == syscall.FILE_ACTION_REMOVED { - w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) - delete(watch.names, name) - } - if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { - if watch.mask&sysFSONESHOT != 0 { - watch.mask = 0 - } - } - if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { - fullname = filepath.Join(watch.path, watch.rename) - sendNameEvent() - } - - // Move to the next event in the buffer - if raw.NextEntryOffset == 0 { - break - } - offset += raw.NextEntryOffset - - // Error! - if offset >= n { - w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") - break - } - } - - if err := w.startRead(watch); err != nil { - w.Errors <- err - } - } -} - -func (w *Watcher) sendEvent(name string, mask uint64) bool { - if mask == 0 { - return false - } - event := newEvent(name, uint32(mask)) - select { - case ch := <-w.quit: - w.quit <- ch - case w.Events <- event: - } - return true -} - -func toWindowsFlags(mask uint64) uint32 { - var m uint32 - if mask&sysFSACCESS != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS - } - if mask&sysFSMODIFY != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE - } - if mask&sysFSATTRIB != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES - } - if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME - } - return m -} - -func toFSnotifyFlags(action uint32) uint64 { - switch action { - case syscall.FILE_ACTION_ADDED: - return sysFSCREATE - case syscall.FILE_ACTION_REMOVED: - return sysFSDELETE - case syscall.FILE_ACTION_MODIFIED: - return sysFSMODIFY - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - return sysFSMOVEDFROM - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - return sysFSMOVEDTO - } - return 0 -} diff --git a/vendor/github.com/go-logr/logr/.golangci.yaml b/vendor/github.com/go-logr/logr/.golangci.yaml index 94ff801d..0cffafa7 100644 --- a/vendor/github.com/go-logr/logr/.golangci.yaml +++ b/vendor/github.com/go-logr/logr/.golangci.yaml @@ -6,7 +6,6 @@ linters: disable-all: true enable: - asciicheck - - deadcode - errcheck - forcetypeassert - gocritic @@ -18,10 +17,8 @@ linters: - misspell - revive - staticcheck - - structcheck - typecheck - unused - - varcheck issues: exclude-use-default: false diff --git a/vendor/github.com/go-logr/logr/discard.go b/vendor/github.com/go-logr/logr/discard.go index 9d92a38f..99fe8be9 100644 --- a/vendor/github.com/go-logr/logr/discard.go +++ b/vendor/github.com/go-logr/logr/discard.go @@ -20,35 +20,5 @@ package logr // used whenever the caller is not interested in the logs. Logger instances // produced by this function always compare as equal. func Discard() Logger { - return Logger{ - level: 0, - sink: discardLogSink{}, - } -} - -// discardLogSink is a LogSink that discards all messages. -type discardLogSink struct{} - -// Verify that it actually implements the interface -var _ LogSink = discardLogSink{} - -func (l discardLogSink) Init(RuntimeInfo) { -} - -func (l discardLogSink) Enabled(int) bool { - return false -} - -func (l discardLogSink) Info(int, string, ...interface{}) { -} - -func (l discardLogSink) Error(error, string, ...interface{}) { -} - -func (l discardLogSink) WithValues(...interface{}) LogSink { - return l -} - -func (l discardLogSink) WithName(string) LogSink { - return l + return New(nil) } diff --git a/vendor/github.com/go-logr/logr/funcr/funcr.go b/vendor/github.com/go-logr/logr/funcr/funcr.go index 7accdb0c..e52f0cd0 100644 --- a/vendor/github.com/go-logr/logr/funcr/funcr.go +++ b/vendor/github.com/go-logr/logr/funcr/funcr.go @@ -21,13 +21,13 @@ limitations under the License. // github.com/go-logr/logr.LogSink with output through an arbitrary // "write" function. See New and NewJSON for details. // -// Custom LogSinks +// # Custom LogSinks // // For users who need more control, a funcr.Formatter can be embedded inside // your own custom LogSink implementation. This is useful when the LogSink // needs to implement additional methods, for example. // -// Formatting +// # Formatting // // This will respect logr.Marshaler, fmt.Stringer, and error interfaces for // values which are being logged. When rendering a struct, funcr will use Go's @@ -37,6 +37,7 @@ package funcr import ( "bytes" "encoding" + "encoding/json" "fmt" "path/filepath" "reflect" @@ -217,7 +218,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter { prefix: "", values: nil, depth: 0, - opts: opts, + opts: &opts, } return f } @@ -231,7 +232,7 @@ type Formatter struct { values []interface{} valuesStr string depth int - opts Options + opts *Options } // outputFormat indicates which outputFormat to use. @@ -447,6 +448,7 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s if flags&flagRawStruct == 0 { buf.WriteByte('{') } + printComma := false // testing i>0 is not enough because of JSON omitted fields for i := 0; i < t.NumField(); i++ { fld := t.Field(i) if fld.PkgPath != "" { @@ -478,9 +480,10 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s if omitempty && isEmpty(v.Field(i)) { continue } - if i > 0 { + if printComma { buf.WriteByte(',') } + printComma = true // if we got here, we are rendering a field if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" { buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1)) continue @@ -500,6 +503,20 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s } return buf.String() case reflect.Slice, reflect.Array: + // If this is outputing as JSON make sure this isn't really a json.RawMessage. + // If so just emit "as-is" and don't pretty it as that will just print + // it as [X,Y,Z,...] which isn't terribly useful vs the string form you really want. + if f.outputFormat == outputJSON { + if rm, ok := value.(json.RawMessage); ok { + // If it's empty make sure we emit an empty value as the array style would below. + if len(rm) > 0 { + buf.Write(rm) + } else { + buf.WriteString("null") + } + return buf.String() + } + } buf.WriteByte('[') for i := 0; i < v.Len(); i++ { if i > 0 { diff --git a/vendor/github.com/go-logr/logr/logr.go b/vendor/github.com/go-logr/logr/logr.go index c3b56b3d..e027aea3 100644 --- a/vendor/github.com/go-logr/logr/logr.go +++ b/vendor/github.com/go-logr/logr/logr.go @@ -21,7 +21,7 @@ limitations under the License. // to back that API. Packages in the Go ecosystem can depend on this package, // while callers can implement logging with whatever backend is appropriate. // -// Usage +// # Usage // // Logging is done using a Logger instance. Logger is a concrete type with // methods, which defers the actual logging to a LogSink interface. The main @@ -30,16 +30,20 @@ limitations under the License. // "structured logging". // // With Go's standard log package, we might write: -// log.Printf("setting target value %s", targetValue) +// +// log.Printf("setting target value %s", targetValue) // // With logr's structured logging, we'd write: -// logger.Info("setting target", "value", targetValue) +// +// logger.Info("setting target", "value", targetValue) // // Errors are much the same. Instead of: -// log.Printf("failed to open the pod bay door for user %s: %v", user, err) +// +// log.Printf("failed to open the pod bay door for user %s: %v", user, err) // // We'd write: -// logger.Error(err, "failed to open the pod bay door", "user", user) +// +// logger.Error(err, "failed to open the pod bay door", "user", user) // // Info() and Error() are very similar, but they are separate methods so that // LogSink implementations can choose to do things like attach additional @@ -47,7 +51,7 @@ limitations under the License. // always logged, regardless of the current verbosity. If there is no error // instance available, passing nil is valid. // -// Verbosity +// # Verbosity // // Often we want to log information only when the application in "verbose // mode". To write log lines that are more verbose, Logger has a V() method. @@ -58,20 +62,22 @@ limitations under the License. // Error messages do not have a verbosity level and are always logged. // // Where we might have written: -// if flVerbose >= 2 { -// log.Printf("an unusual thing happened") -// } +// +// if flVerbose >= 2 { +// log.Printf("an unusual thing happened") +// } // // We can write: -// logger.V(2).Info("an unusual thing happened") // -// Logger Names +// logger.V(2).Info("an unusual thing happened") +// +// # Logger Names // // Logger instances can have name strings so that all messages logged through // that instance have additional context. For example, you might want to add // a subsystem name: // -// logger.WithName("compactor").Info("started", "time", time.Now()) +// logger.WithName("compactor").Info("started", "time", time.Now()) // // The WithName() method returns a new Logger, which can be passed to // constructors or other functions for further use. Repeated use of WithName() @@ -82,25 +88,27 @@ limitations under the License. // joining operation (e.g. whitespace, commas, periods, slashes, brackets, // quotes, etc). // -// Saved Values +// # Saved Values // // Logger instances can store any number of key/value pairs, which will be // logged alongside all messages logged through that instance. For example, // you might want to create a Logger instance per managed object: // // With the standard log package, we might write: -// log.Printf("decided to set field foo to value %q for object %s/%s", -// targetValue, object.Namespace, object.Name) +// +// log.Printf("decided to set field foo to value %q for object %s/%s", +// targetValue, object.Namespace, object.Name) // // With logr we'd write: -// // Elsewhere: set up the logger to log the object name. -// obj.logger = mainLogger.WithValues( -// "name", obj.name, "namespace", obj.namespace) // -// // later on... -// obj.logger.Info("setting foo", "value", targetValue) +// // Elsewhere: set up the logger to log the object name. +// obj.logger = mainLogger.WithValues( +// "name", obj.name, "namespace", obj.namespace) +// +// // later on... +// obj.logger.Info("setting foo", "value", targetValue) // -// Best Practices +// # Best Practices // // Logger has very few hard rules, with the goal that LogSink implementations // might have a lot of freedom to differentiate. There are, however, some @@ -124,15 +132,15 @@ limitations under the License. // around. For cases where passing a logger is optional, a pointer to Logger // should be used. // -// Key Naming Conventions +// # Key Naming Conventions // // Keys are not strictly required to conform to any specification or regex, but // it is recommended that they: -// * be human-readable and meaningful (not auto-generated or simple ordinals) -// * be constant (not dependent on input data) -// * contain only printable characters -// * not contain whitespace or punctuation -// * use lower case for simple keys and lowerCamelCase for more complex ones +// - be human-readable and meaningful (not auto-generated or simple ordinals) +// - be constant (not dependent on input data) +// - contain only printable characters +// - not contain whitespace or punctuation +// - use lower case for simple keys and lowerCamelCase for more complex ones // // These guidelines help ensure that log data is processed properly regardless // of the log implementation. For example, log implementations will try to @@ -141,51 +149,54 @@ limitations under the License. // While users are generally free to use key names of their choice, it's // generally best to avoid using the following keys, as they're frequently used // by implementations: -// * "caller": the calling information (file/line) of a particular log line -// * "error": the underlying error value in the `Error` method -// * "level": the log level -// * "logger": the name of the associated logger -// * "msg": the log message -// * "stacktrace": the stack trace associated with a particular log line or -// error (often from the `Error` message) -// * "ts": the timestamp for a log line +// - "caller": the calling information (file/line) of a particular log line +// - "error": the underlying error value in the `Error` method +// - "level": the log level +// - "logger": the name of the associated logger +// - "msg": the log message +// - "stacktrace": the stack trace associated with a particular log line or +// error (often from the `Error` message) +// - "ts": the timestamp for a log line // // Implementations are encouraged to make use of these keys to represent the // above concepts, when necessary (for example, in a pure-JSON output form, it // would be necessary to represent at least message and timestamp as ordinary // named values). // -// Break Glass +// # Break Glass // // Implementations may choose to give callers access to the underlying // logging implementation. The recommended pattern for this is: -// // Underlier exposes access to the underlying logging implementation. -// // Since callers only have a logr.Logger, they have to know which -// // implementation is in use, so this interface is less of an abstraction -// // and more of way to test type conversion. -// type Underlier interface { -// GetUnderlying() -// } +// +// // Underlier exposes access to the underlying logging implementation. +// // Since callers only have a logr.Logger, they have to know which +// // implementation is in use, so this interface is less of an abstraction +// // and more of way to test type conversion. +// type Underlier interface { +// GetUnderlying() +// } // // Logger grants access to the sink to enable type assertions like this: -// func DoSomethingWithImpl(log logr.Logger) { -// if underlier, ok := log.GetSink()(impl.Underlier) { -// implLogger := underlier.GetUnderlying() -// ... -// } -// } +// +// func DoSomethingWithImpl(log logr.Logger) { +// if underlier, ok := log.GetSink().(impl.Underlier); ok { +// implLogger := underlier.GetUnderlying() +// ... +// } +// } // // Custom `With*` functions can be implemented by copying the complete // Logger struct and replacing the sink in the copy: -// // WithFooBar changes the foobar parameter in the log sink and returns a -// // new logger with that modified sink. It does nothing for loggers where -// // the sink doesn't support that parameter. -// func WithFoobar(log logr.Logger, foobar int) logr.Logger { -// if foobarLogSink, ok := log.GetSink()(FoobarSink); ok { -// log = log.WithSink(foobarLogSink.WithFooBar(foobar)) -// } -// return log -// } +// +// // WithFooBar changes the foobar parameter in the log sink and returns a +// // new logger with that modified sink. It does nothing for loggers where +// // the sink doesn't support that parameter. +// func WithFoobar(log logr.Logger, foobar int) logr.Logger { +// if foobarLogSink, ok := log.GetSink().(FoobarSink); ok { +// log = log.WithSink(foobarLogSink.WithFooBar(foobar)) +// } +// return log +// } // // Don't use New to construct a new Logger with a LogSink retrieved from an // existing Logger. Source code attribution might not work correctly and @@ -201,11 +212,14 @@ import ( ) // New returns a new Logger instance. This is primarily used by libraries -// implementing LogSink, rather than end users. +// implementing LogSink, rather than end users. Passing a nil sink will create +// a Logger which discards all log lines. func New(sink LogSink) Logger { logger := Logger{} logger.setSink(sink) - sink.Init(runtimeInfo) + if sink != nil { + sink.Init(runtimeInfo) + } return logger } @@ -244,7 +258,7 @@ type Logger struct { // Enabled tests whether this Logger is enabled. For example, commandline // flags might be used to set the logging verbosity and disable some info logs. func (l Logger) Enabled() bool { - return l.sink.Enabled(l.level) + return l.sink != nil && l.sink.Enabled(l.level) } // Info logs a non-error message with the given key/value pairs as context. @@ -254,6 +268,9 @@ func (l Logger) Enabled() bool { // information. The key/value pairs must alternate string keys and arbitrary // values. func (l Logger) Info(msg string, keysAndValues ...interface{}) { + if l.sink == nil { + return + } if l.Enabled() { if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() @@ -273,6 +290,9 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) { // triggered this log line, if present. The err parameter is optional // and nil may be passed instead of an error instance. func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { + if l.sink == nil { + return + } if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() } @@ -284,6 +304,9 @@ func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { // level means a log message is less important. Negative V-levels are treated // as 0. func (l Logger) V(level int) Logger { + if l.sink == nil { + return l + } if level < 0 { level = 0 } @@ -294,6 +317,9 @@ func (l Logger) V(level int) Logger { // WithValues returns a new Logger instance with additional key/value pairs. // See Info for documentation on how key/value pairs work. func (l Logger) WithValues(keysAndValues ...interface{}) Logger { + if l.sink == nil { + return l + } l.setSink(l.sink.WithValues(keysAndValues...)) return l } @@ -304,6 +330,9 @@ func (l Logger) WithValues(keysAndValues ...interface{}) Logger { // contain only letters, digits, and hyphens (see the package documentation for // more information). func (l Logger) WithName(name string) Logger { + if l.sink == nil { + return l + } l.setSink(l.sink.WithName(name)) return l } @@ -324,6 +353,9 @@ func (l Logger) WithName(name string) Logger { // WithCallDepth(1) because it works with implementions that support the // CallDepthLogSink and/or CallStackHelperLogSink interfaces. func (l Logger) WithCallDepth(depth int) Logger { + if l.sink == nil { + return l + } if withCallDepth, ok := l.sink.(CallDepthLogSink); ok { l.setSink(withCallDepth.WithCallDepth(depth)) } @@ -345,6 +377,9 @@ func (l Logger) WithCallDepth(depth int) Logger { // implementation does not support either of these, the original Logger will be // returned. func (l Logger) WithCallStackHelper() (func(), Logger) { + if l.sink == nil { + return func() {}, l + } var helper func() if withCallDepth, ok := l.sink.(CallDepthLogSink); ok { l.setSink(withCallDepth.WithCallDepth(1)) @@ -357,6 +392,11 @@ func (l Logger) WithCallStackHelper() (func(), Logger) { return helper, l } +// IsZero returns true if this logger is an uninitialized zero value +func (l Logger) IsZero() bool { + return l.sink == nil +} + // contextKey is how we find Loggers in a context.Context. type contextKey struct{} @@ -442,7 +482,7 @@ type LogSink interface { WithName(name string) LogSink } -// CallDepthLogSink represents a Logger that knows how to climb the call stack +// CallDepthLogSink represents a LogSink that knows how to climb the call stack // to identify the original call site and can offset the depth by a specified // number of frames. This is useful for users who have helper functions // between the "real" call site and the actual calls to Logger methods. @@ -467,7 +507,7 @@ type CallDepthLogSink interface { WithCallDepth(depth int) LogSink } -// CallStackHelperLogSink represents a Logger that knows how to climb +// CallStackHelperLogSink represents a LogSink that knows how to climb // the call stack to identify the original call site and can skip // intermediate helper functions if they mark themselves as // helper. Go's testing package uses that approach. diff --git a/vendor/github.com/go-task/slim-sprig/.editorconfig b/vendor/github.com/go-task/slim-sprig/.editorconfig new file mode 100644 index 00000000..b0c95367 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/.editorconfig @@ -0,0 +1,14 @@ +# editorconfig.org + +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = tab +indent_size = 8 + +[*.{md,yml,yaml,json}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-task/slim-sprig/.gitattributes b/vendor/github.com/go-task/slim-sprig/.gitattributes new file mode 100644 index 00000000..176a458f --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/vendor/github.com/go-task/slim-sprig/.gitignore b/vendor/github.com/go-task/slim-sprig/.gitignore new file mode 100644 index 00000000..5e3002f8 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/.gitignore @@ -0,0 +1,2 @@ +vendor/ +/.glide diff --git a/vendor/github.com/go-task/slim-sprig/CHANGELOG.md b/vendor/github.com/go-task/slim-sprig/CHANGELOG.md new file mode 100644 index 00000000..61d8ebff --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/CHANGELOG.md @@ -0,0 +1,364 @@ +# Changelog + +## Release 3.2.0 (2020-12-14) + +### Added + +- #211: Added randInt function (thanks @kochurovro) +- #223: Added fromJson and mustFromJson functions (thanks @mholt) +- #242: Added a bcrypt function (thanks @robbiet480) +- #253: Added randBytes function (thanks @MikaelSmith) +- #254: Added dig function for dicts (thanks @nyarly) +- #257: Added regexQuoteMeta for quoting regex metadata (thanks @rheaton) +- #261: Added filepath functions osBase, osDir, osExt, osClean, osIsAbs (thanks @zugl) +- #268: Added and and all functions for testing conditions (thanks @phuslu) +- #181: Added float64 arithmetic addf, add1f, subf, divf, mulf, maxf, and minf + (thanks @andrewmostello) +- #265: Added chunk function to split array into smaller arrays (thanks @karelbilek) +- #270: Extend certificate functions to handle non-RSA keys + add support for + ed25519 keys (thanks @misberner) + +### Changed + +- Removed testing and support for Go 1.12. ed25519 support requires Go 1.13 or newer +- Using semver 3.1.1 and mergo 0.3.11 + +### Fixed + +- #249: Fix htmlDateInZone example (thanks @spawnia) + +NOTE: The dependency github.com/imdario/mergo reverted the breaking change in +0.3.9 via 0.3.10 release. + +## Release 3.1.0 (2020-04-16) + +NOTE: The dependency github.com/imdario/mergo made a behavior change in 0.3.9 +that impacts sprig functionality. Do not use sprig with a version newer than 0.3.8. + +### Added + +- #225: Added support for generating htpasswd hash (thanks @rustycl0ck) +- #224: Added duration filter (thanks @frebib) +- #205: Added `seq` function (thanks @thadc23) + +### Changed + +- #203: Unlambda functions with correct signature (thanks @muesli) +- #236: Updated the license formatting for GitHub display purposes +- #238: Updated package dependency versions. Note, mergo not updated to 0.3.9 + as it causes a breaking change for sprig. That issue is tracked at + https://github.com/imdario/mergo/issues/139 + +### Fixed + +- #229: Fix `seq` example in docs (thanks @kalmant) + +## Release 3.0.2 (2019-12-13) + +### Fixed + +- #220: Updating to semver v3.0.3 to fix issue with <= ranges +- #218: fix typo elyptical->elliptic in ecdsa key description (thanks @laverya) + +## Release 3.0.1 (2019-12-08) + +### Fixed + +- #212: Updated semver fixing broken constraint checking with ^0.0 + +## Release 3.0.0 (2019-10-02) + +### Added + +- #187: Added durationRound function (thanks @yjp20) +- #189: Added numerous template functions that return errors rather than panic (thanks @nrvnrvn) +- #193: Added toRawJson support (thanks @Dean-Coakley) +- #197: Added get support to dicts (thanks @Dean-Coakley) + +### Changed + +- #186: Moving dependency management to Go modules +- #186: Updated semver to v3. This has changes in the way ^ is handled +- #194: Updated documentation on merging and how it copies. Added example using deepCopy +- #196: trunc now supports negative values (thanks @Dean-Coakley) + +## Release 2.22.0 (2019-10-02) + +### Added + +- #173: Added getHostByName function to resolve dns names to ips (thanks @fcgravalos) +- #195: Added deepCopy function for use with dicts + +### Changed + +- Updated merge and mergeOverwrite documentation to explain copying and how to + use deepCopy with it + +## Release 2.21.0 (2019-09-18) + +### Added + +- #122: Added encryptAES/decryptAES functions (thanks @n0madic) +- #128: Added toDecimal support (thanks @Dean-Coakley) +- #169: Added list contcat (thanks @astorath) +- #174: Added deepEqual function (thanks @bonifaido) +- #170: Added url parse and join functions (thanks @astorath) + +### Changed + +- #171: Updated glide config for Google UUID to v1 and to add ranges to semver and testify + +### Fixed + +- #172: Fix semver wildcard example (thanks @piepmatz) +- #175: Fix dateInZone doc example (thanks @s3than) + +## Release 2.20.0 (2019-06-18) + +### Added + +- #164: Adding function to get unix epoch for a time (@mattfarina) +- #166: Adding tests for date_in_zone (@mattfarina) + +### Changed + +- #144: Fix function comments based on best practices from Effective Go (@CodeLingoTeam) +- #150: Handles pointer type for time.Time in "htmlDate" (@mapreal19) +- #161, #157, #160, #153, #158, #156, #155, #159, #152 documentation updates (@badeadan) + +### Fixed + +## Release 2.19.0 (2019-03-02) + +IMPORTANT: This release reverts a change from 2.18.0 + +In the previous release (2.18), we prematurely merged a partial change to the crypto functions that led to creating two sets of crypto functions (I blame @technosophos -- since that's me). This release rolls back that change, and does what was originally intended: It alters the existing crypto functions to use secure random. + +We debated whether this classifies as a change worthy of major revision, but given the proximity to the last release, we have decided that treating 2.18 as a faulty release is the correct course of action. We apologize for any inconvenience. + +### Changed + +- Fix substr panic 35fb796 (Alexey igrychev) +- Remove extra period 1eb7729 (Matthew Lorimor) +- Make random string functions use crypto by default 6ceff26 (Matthew Lorimor) +- README edits/fixes/suggestions 08fe136 (Lauri Apple) + + +## Release 2.18.0 (2019-02-12) + +### Added + +- Added mergeOverwrite function +- cryptographic functions that use secure random (see fe1de12) + +### Changed + +- Improve documentation of regexMatch function, resolves #139 90b89ce (Jan Tagscherer) +- Handle has for nil list 9c10885 (Daniel Cohen) +- Document behaviour of mergeOverwrite fe0dbe9 (Lukas Rieder) +- doc: adds missing documentation. 4b871e6 (Fernandez Ludovic) +- Replace outdated goutils imports 01893d2 (Matthew Lorimor) +- Surface crypto secure random strings from goutils fe1de12 (Matthew Lorimor) +- Handle untyped nil values as paramters to string functions 2b2ec8f (Morten Torkildsen) + +### Fixed + +- Fix dict merge issue and provide mergeOverwrite .dst .src1 to overwrite from src -> dst 4c59c12 (Lukas Rieder) +- Fix substr var names and comments d581f80 (Dean Coakley) +- Fix substr documentation 2737203 (Dean Coakley) + +## Release 2.17.1 (2019-01-03) + +### Fixed + +The 2.17.0 release did not have a version pinned for xstrings, which caused compilation failures when xstrings < 1.2 was used. This adds the correct version string to glide.yaml. + +## Release 2.17.0 (2019-01-03) + +### Added + +- adds alder32sum function and test 6908fc2 (marshallford) +- Added kebabcase function ca331a1 (Ilyes512) + +### Changed + +- Update goutils to 1.1.0 4e1125d (Matt Butcher) + +### Fixed + +- Fix 'has' documentation e3f2a85 (dean-coakley) +- docs(dict): fix typo in pick example dc424f9 (Dustin Specker) +- fixes spelling errors... not sure how that happened 4cf188a (marshallford) + +## Release 2.16.0 (2018-08-13) + +### Added + +- add splitn function fccb0b0 (Helgi Þorbjörnsson) +- Add slice func df28ca7 (gongdo) +- Generate serial number a3bdffd (Cody Coons) +- Extract values of dict with values function df39312 (Lawrence Jones) + +### Changed + +- Modify panic message for list.slice ae38335 (gongdo) +- Minor improvement in code quality - Removed an unreachable piece of code at defaults.go#L26:6 - Resolve formatting issues. 5834241 (Abhishek Kashyap) +- Remove duplicated documentation 1d97af1 (Matthew Fisher) +- Test on go 1.11 49df809 (Helgi Þormar Þorbjörnsson) + +### Fixed + +- Fix file permissions c5f40b5 (gongdo) +- Fix example for buildCustomCert 7779e0d (Tin Lam) + +## Release 2.15.0 (2018-04-02) + +### Added + +- #68 and #69: Add json helpers to docs (thanks @arunvelsriram) +- #66: Add ternary function (thanks @binoculars) +- #67: Allow keys function to take multiple dicts (thanks @binoculars) +- #89: Added sha1sum to crypto function (thanks @benkeil) +- #81: Allow customizing Root CA that used by genSignedCert (thanks @chenzhiwei) +- #92: Add travis testing for go 1.10 +- #93: Adding appveyor config for windows testing + +### Changed + +- #90: Updating to more recent dependencies +- #73: replace satori/go.uuid with google/uuid (thanks @petterw) + +### Fixed + +- #76: Fixed documentation typos (thanks @Thiht) +- Fixed rounding issue on the `ago` function. Note, the removes support for Go 1.8 and older + +## Release 2.14.1 (2017-12-01) + +### Fixed + +- #60: Fix typo in function name documentation (thanks @neil-ca-moore) +- #61: Removing line with {{ due to blocking github pages genertion +- #64: Update the list functions to handle int, string, and other slices for compatibility + +## Release 2.14.0 (2017-10-06) + +This new version of Sprig adds a set of functions for generating and working with SSL certificates. + +- `genCA` generates an SSL Certificate Authority +- `genSelfSignedCert` generates an SSL self-signed certificate +- `genSignedCert` generates an SSL certificate and key based on a given CA + +## Release 2.13.0 (2017-09-18) + +This release adds new functions, including: + +- `regexMatch`, `regexFindAll`, `regexFind`, `regexReplaceAll`, `regexReplaceAllLiteral`, and `regexSplit` to work with regular expressions +- `floor`, `ceil`, and `round` math functions +- `toDate` converts a string to a date +- `nindent` is just like `indent` but also prepends a new line +- `ago` returns the time from `time.Now` + +### Added + +- #40: Added basic regex functionality (thanks @alanquillin) +- #41: Added ceil floor and round functions (thanks @alanquillin) +- #48: Added toDate function (thanks @andreynering) +- #50: Added nindent function (thanks @binoculars) +- #46: Added ago function (thanks @slayer) + +### Changed + +- #51: Updated godocs to include new string functions (thanks @curtisallen) +- #49: Added ability to merge multiple dicts (thanks @binoculars) + +## Release 2.12.0 (2017-05-17) + +- `snakecase`, `camelcase`, and `shuffle` are three new string functions +- `fail` allows you to bail out of a template render when conditions are not met + +## Release 2.11.0 (2017-05-02) + +- Added `toJson` and `toPrettyJson` +- Added `merge` +- Refactored documentation + +## Release 2.10.0 (2017-03-15) + +- Added `semver` and `semverCompare` for Semantic Versions +- `list` replaces `tuple` +- Fixed issue with `join` +- Added `first`, `last`, `intial`, `rest`, `prepend`, `append`, `toString`, `toStrings`, `sortAlpha`, `reverse`, `coalesce`, `pluck`, `pick`, `compact`, `keys`, `omit`, `uniq`, `has`, `without` + +## Release 2.9.0 (2017-02-23) + +- Added `splitList` to split a list +- Added crypto functions of `genPrivateKey` and `derivePassword` + +## Release 2.8.0 (2016-12-21) + +- Added access to several path functions (`base`, `dir`, `clean`, `ext`, and `abs`) +- Added functions for _mutating_ dictionaries (`set`, `unset`, `hasKey`) + +## Release 2.7.0 (2016-12-01) + +- Added `sha256sum` to generate a hash of an input +- Added functions to convert a numeric or string to `int`, `int64`, `float64` + +## Release 2.6.0 (2016-10-03) + +- Added a `uuidv4` template function for generating UUIDs inside of a template. + +## Release 2.5.0 (2016-08-19) + +- New `trimSuffix`, `trimPrefix`, `hasSuffix`, and `hasPrefix` functions +- New aliases have been added for a few functions that didn't follow the naming conventions (`trimAll` and `abbrevBoth`) +- `trimall` and `abbrevboth` (notice the case) are deprecated and will be removed in 3.0.0 + +## Release 2.4.0 (2016-08-16) + +- Adds two functions: `until` and `untilStep` + +## Release 2.3.0 (2016-06-21) + +- cat: Concatenate strings with whitespace separators. +- replace: Replace parts of a string: `replace " " "-" "Me First"` renders "Me-First" +- plural: Format plurals: `len "foo" | plural "one foo" "many foos"` renders "many foos" +- indent: Indent blocks of text in a way that is sensitive to "\n" characters. + +## Release 2.2.0 (2016-04-21) + +- Added a `genPrivateKey` function (Thanks @bacongobbler) + +## Release 2.1.0 (2016-03-30) + +- `default` now prints the default value when it does not receive a value down the pipeline. It is much safer now to do `{{.Foo | default "bar"}}`. +- Added accessors for "hermetic" functions. These return only functions that, when given the same input, produce the same output. + +## Release 2.0.0 (2016-03-29) + +Because we switched from `int` to `int64` as the return value for all integer math functions, the library's major version number has been incremented. + +- `min` complements `max` (formerly `biggest`) +- `empty` indicates that a value is the empty value for its type +- `tuple` creates a tuple inside of a template: `{{$t := tuple "a", "b" "c"}}` +- `dict` creates a dictionary inside of a template `{{$d := dict "key1" "val1" "key2" "val2"}}` +- Date formatters have been added for HTML dates (as used in `date` input fields) +- Integer math functions can convert from a number of types, including `string` (via `strconv.ParseInt`). + +## Release 1.2.0 (2016-02-01) + +- Added quote and squote +- Added b32enc and b32dec +- add now takes varargs +- biggest now takes varargs + +## Release 1.1.0 (2015-12-29) + +- Added #4: Added contains function. strings.Contains, but with the arguments + switched to simplify common pipelines. (thanks krancour) +- Added Travis-CI testing support + +## Release 1.0.0 (2015-12-23) + +- Initial release diff --git a/vendor/github.com/go-task/slim-sprig/LICENSE.txt b/vendor/github.com/go-task/slim-sprig/LICENSE.txt new file mode 100644 index 00000000..f311b1ea --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (C) 2013-2020 Masterminds + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/go-task/slim-sprig/README.md b/vendor/github.com/go-task/slim-sprig/README.md new file mode 100644 index 00000000..72579471 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/README.md @@ -0,0 +1,73 @@ +# Slim-Sprig: Template functions for Go templates [![GoDoc](https://godoc.org/github.com/go-task/slim-sprig?status.svg)](https://godoc.org/github.com/go-task/slim-sprig) [![Go Report Card](https://goreportcard.com/badge/github.com/go-task/slim-sprig)](https://goreportcard.com/report/github.com/go-task/slim-sprig) + +Slim-Sprig is a fork of [Sprig](https://github.com/Masterminds/sprig), but with +all functions that depend on external (non standard library) or crypto packages +removed. +The reason for this is to make this library more lightweight. Most of these +functions (specially crypto ones) are not needed on most apps, but costs a lot +in terms of binary size and compilation time. + +## Usage + +**Template developers**: Please use Slim-Sprig's [function documentation](https://go-task.github.io/slim-sprig/) for +detailed instructions and code snippets for the >100 template functions available. + +**Go developers**: If you'd like to include Slim-Sprig as a library in your program, +our API documentation is available [at GoDoc.org](http://godoc.org/github.com/go-task/slim-sprig). + +For standard usage, read on. + +### Load the Slim-Sprig library + +To load the Slim-Sprig `FuncMap`: + +```go + +import ( + "html/template" + + "github.com/go-task/slim-sprig" +) + +// This example illustrates that the FuncMap *must* be set before the +// templates themselves are loaded. +tpl := template.Must( + template.New("base").Funcs(sprig.FuncMap()).ParseGlob("*.html") +) +``` + +### Calling the functions inside of templates + +By convention, all functions are lowercase. This seems to follow the Go +idiom for template functions (as opposed to template methods, which are +TitleCase). For example, this: + +``` +{{ "hello!" | upper | repeat 5 }} +``` + +produces this: + +``` +HELLO!HELLO!HELLO!HELLO!HELLO! +``` + +## Principles Driving Our Function Selection + +We followed these principles to decide which functions to add and how to implement them: + +- Use template functions to build layout. The following + types of operations are within the domain of template functions: + - Formatting + - Layout + - Simple type conversions + - Utilities that assist in handling common formatting and layout needs (e.g. arithmetic) +- Template functions should not return errors unless there is no way to print + a sensible value. For example, converting a string to an integer should not + produce an error if conversion fails. Instead, it should display a default + value. +- Simple math is necessary for grid layouts, pagers, and so on. Complex math + (anything other than arithmetic) should be done outside of templates. +- Template functions only deal with the data passed into them. They never retrieve + data from a source. +- Finally, do not override core Go template functions. diff --git a/vendor/github.com/go-task/slim-sprig/Taskfile.yml b/vendor/github.com/go-task/slim-sprig/Taskfile.yml new file mode 100644 index 00000000..cdcfd223 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/Taskfile.yml @@ -0,0 +1,12 @@ +# https://taskfile.dev + +version: '2' + +tasks: + default: + cmds: + - task: test + + test: + cmds: + - go test -v . diff --git a/vendor/github.com/go-task/slim-sprig/crypto.go b/vendor/github.com/go-task/slim-sprig/crypto.go new file mode 100644 index 00000000..d06e516d --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/crypto.go @@ -0,0 +1,24 @@ +package sprig + +import ( + "crypto/sha1" + "crypto/sha256" + "encoding/hex" + "fmt" + "hash/adler32" +) + +func sha256sum(input string) string { + hash := sha256.Sum256([]byte(input)) + return hex.EncodeToString(hash[:]) +} + +func sha1sum(input string) string { + hash := sha1.Sum([]byte(input)) + return hex.EncodeToString(hash[:]) +} + +func adler32sum(input string) string { + hash := adler32.Checksum([]byte(input)) + return fmt.Sprintf("%d", hash) +} diff --git a/vendor/github.com/go-task/slim-sprig/date.go b/vendor/github.com/go-task/slim-sprig/date.go new file mode 100644 index 00000000..ed022dda --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/date.go @@ -0,0 +1,152 @@ +package sprig + +import ( + "strconv" + "time" +) + +// Given a format and a date, format the date string. +// +// Date can be a `time.Time` or an `int, int32, int64`. +// In the later case, it is treated as seconds since UNIX +// epoch. +func date(fmt string, date interface{}) string { + return dateInZone(fmt, date, "Local") +} + +func htmlDate(date interface{}) string { + return dateInZone("2006-01-02", date, "Local") +} + +func htmlDateInZone(date interface{}, zone string) string { + return dateInZone("2006-01-02", date, zone) +} + +func dateInZone(fmt string, date interface{}, zone string) string { + var t time.Time + switch date := date.(type) { + default: + t = time.Now() + case time.Time: + t = date + case *time.Time: + t = *date + case int64: + t = time.Unix(date, 0) + case int: + t = time.Unix(int64(date), 0) + case int32: + t = time.Unix(int64(date), 0) + } + + loc, err := time.LoadLocation(zone) + if err != nil { + loc, _ = time.LoadLocation("UTC") + } + + return t.In(loc).Format(fmt) +} + +func dateModify(fmt string, date time.Time) time.Time { + d, err := time.ParseDuration(fmt) + if err != nil { + return date + } + return date.Add(d) +} + +func mustDateModify(fmt string, date time.Time) (time.Time, error) { + d, err := time.ParseDuration(fmt) + if err != nil { + return time.Time{}, err + } + return date.Add(d), nil +} + +func dateAgo(date interface{}) string { + var t time.Time + + switch date := date.(type) { + default: + t = time.Now() + case time.Time: + t = date + case int64: + t = time.Unix(date, 0) + case int: + t = time.Unix(int64(date), 0) + } + // Drop resolution to seconds + duration := time.Since(t).Round(time.Second) + return duration.String() +} + +func duration(sec interface{}) string { + var n int64 + switch value := sec.(type) { + default: + n = 0 + case string: + n, _ = strconv.ParseInt(value, 10, 64) + case int64: + n = value + } + return (time.Duration(n) * time.Second).String() +} + +func durationRound(duration interface{}) string { + var d time.Duration + switch duration := duration.(type) { + default: + d = 0 + case string: + d, _ = time.ParseDuration(duration) + case int64: + d = time.Duration(duration) + case time.Time: + d = time.Since(duration) + } + + u := uint64(d) + neg := d < 0 + if neg { + u = -u + } + + var ( + year = uint64(time.Hour) * 24 * 365 + month = uint64(time.Hour) * 24 * 30 + day = uint64(time.Hour) * 24 + hour = uint64(time.Hour) + minute = uint64(time.Minute) + second = uint64(time.Second) + ) + switch { + case u > year: + return strconv.FormatUint(u/year, 10) + "y" + case u > month: + return strconv.FormatUint(u/month, 10) + "mo" + case u > day: + return strconv.FormatUint(u/day, 10) + "d" + case u > hour: + return strconv.FormatUint(u/hour, 10) + "h" + case u > minute: + return strconv.FormatUint(u/minute, 10) + "m" + case u > second: + return strconv.FormatUint(u/second, 10) + "s" + } + return "0s" +} + +func toDate(fmt, str string) time.Time { + t, _ := time.ParseInLocation(fmt, str, time.Local) + return t +} + +func mustToDate(fmt, str string) (time.Time, error) { + return time.ParseInLocation(fmt, str, time.Local) +} + +func unixEpoch(date time.Time) string { + return strconv.FormatInt(date.Unix(), 10) +} diff --git a/vendor/github.com/go-task/slim-sprig/defaults.go b/vendor/github.com/go-task/slim-sprig/defaults.go new file mode 100644 index 00000000..b9f97966 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/defaults.go @@ -0,0 +1,163 @@ +package sprig + +import ( + "bytes" + "encoding/json" + "math/rand" + "reflect" + "strings" + "time" +) + +func init() { + rand.Seed(time.Now().UnixNano()) +} + +// dfault checks whether `given` is set, and returns default if not set. +// +// This returns `d` if `given` appears not to be set, and `given` otherwise. +// +// For numeric types 0 is unset. +// For strings, maps, arrays, and slices, len() = 0 is considered unset. +// For bool, false is unset. +// Structs are never considered unset. +// +// For everything else, including pointers, a nil value is unset. +func dfault(d interface{}, given ...interface{}) interface{} { + + if empty(given) || empty(given[0]) { + return d + } + return given[0] +} + +// empty returns true if the given value has the zero value for its type. +func empty(given interface{}) bool { + g := reflect.ValueOf(given) + if !g.IsValid() { + return true + } + + // Basically adapted from text/template.isTrue + switch g.Kind() { + default: + return g.IsNil() + case reflect.Array, reflect.Slice, reflect.Map, reflect.String: + return g.Len() == 0 + case reflect.Bool: + return !g.Bool() + case reflect.Complex64, reflect.Complex128: + return g.Complex() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return g.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return g.Uint() == 0 + case reflect.Float32, reflect.Float64: + return g.Float() == 0 + case reflect.Struct: + return false + } +} + +// coalesce returns the first non-empty value. +func coalesce(v ...interface{}) interface{} { + for _, val := range v { + if !empty(val) { + return val + } + } + return nil +} + +// all returns true if empty(x) is false for all values x in the list. +// If the list is empty, return true. +func all(v ...interface{}) bool { + for _, val := range v { + if empty(val) { + return false + } + } + return true +} + +// any returns true if empty(x) is false for any x in the list. +// If the list is empty, return false. +func any(v ...interface{}) bool { + for _, val := range v { + if !empty(val) { + return true + } + } + return false +} + +// fromJson decodes JSON into a structured value, ignoring errors. +func fromJson(v string) interface{} { + output, _ := mustFromJson(v) + return output +} + +// mustFromJson decodes JSON into a structured value, returning errors. +func mustFromJson(v string) (interface{}, error) { + var output interface{} + err := json.Unmarshal([]byte(v), &output) + return output, err +} + +// toJson encodes an item into a JSON string +func toJson(v interface{}) string { + output, _ := json.Marshal(v) + return string(output) +} + +func mustToJson(v interface{}) (string, error) { + output, err := json.Marshal(v) + if err != nil { + return "", err + } + return string(output), nil +} + +// toPrettyJson encodes an item into a pretty (indented) JSON string +func toPrettyJson(v interface{}) string { + output, _ := json.MarshalIndent(v, "", " ") + return string(output) +} + +func mustToPrettyJson(v interface{}) (string, error) { + output, err := json.MarshalIndent(v, "", " ") + if err != nil { + return "", err + } + return string(output), nil +} + +// toRawJson encodes an item into a JSON string with no escaping of HTML characters. +func toRawJson(v interface{}) string { + output, err := mustToRawJson(v) + if err != nil { + panic(err) + } + return string(output) +} + +// mustToRawJson encodes an item into a JSON string with no escaping of HTML characters. +func mustToRawJson(v interface{}) (string, error) { + buf := new(bytes.Buffer) + enc := json.NewEncoder(buf) + enc.SetEscapeHTML(false) + err := enc.Encode(&v) + if err != nil { + return "", err + } + return strings.TrimSuffix(buf.String(), "\n"), nil +} + +// ternary returns the first value if the last value is true, otherwise returns the second value. +func ternary(vt interface{}, vf interface{}, v bool) interface{} { + if v { + return vt + } + + return vf +} diff --git a/vendor/github.com/go-task/slim-sprig/dict.go b/vendor/github.com/go-task/slim-sprig/dict.go new file mode 100644 index 00000000..77ebc61b --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/dict.go @@ -0,0 +1,118 @@ +package sprig + +func get(d map[string]interface{}, key string) interface{} { + if val, ok := d[key]; ok { + return val + } + return "" +} + +func set(d map[string]interface{}, key string, value interface{}) map[string]interface{} { + d[key] = value + return d +} + +func unset(d map[string]interface{}, key string) map[string]interface{} { + delete(d, key) + return d +} + +func hasKey(d map[string]interface{}, key string) bool { + _, ok := d[key] + return ok +} + +func pluck(key string, d ...map[string]interface{}) []interface{} { + res := []interface{}{} + for _, dict := range d { + if val, ok := dict[key]; ok { + res = append(res, val) + } + } + return res +} + +func keys(dicts ...map[string]interface{}) []string { + k := []string{} + for _, dict := range dicts { + for key := range dict { + k = append(k, key) + } + } + return k +} + +func pick(dict map[string]interface{}, keys ...string) map[string]interface{} { + res := map[string]interface{}{} + for _, k := range keys { + if v, ok := dict[k]; ok { + res[k] = v + } + } + return res +} + +func omit(dict map[string]interface{}, keys ...string) map[string]interface{} { + res := map[string]interface{}{} + + omit := make(map[string]bool, len(keys)) + for _, k := range keys { + omit[k] = true + } + + for k, v := range dict { + if _, ok := omit[k]; !ok { + res[k] = v + } + } + return res +} + +func dict(v ...interface{}) map[string]interface{} { + dict := map[string]interface{}{} + lenv := len(v) + for i := 0; i < lenv; i += 2 { + key := strval(v[i]) + if i+1 >= lenv { + dict[key] = "" + continue + } + dict[key] = v[i+1] + } + return dict +} + +func values(dict map[string]interface{}) []interface{} { + values := []interface{}{} + for _, value := range dict { + values = append(values, value) + } + + return values +} + +func dig(ps ...interface{}) (interface{}, error) { + if len(ps) < 3 { + panic("dig needs at least three arguments") + } + dict := ps[len(ps)-1].(map[string]interface{}) + def := ps[len(ps)-2] + ks := make([]string, len(ps)-2) + for i := 0; i < len(ks); i++ { + ks[i] = ps[i].(string) + } + + return digFromDict(dict, def, ks) +} + +func digFromDict(dict map[string]interface{}, d interface{}, ks []string) (interface{}, error) { + k, ns := ks[0], ks[1:len(ks)] + step, has := dict[k] + if !has { + return d, nil + } + if len(ns) == 0 { + return step, nil + } + return digFromDict(step.(map[string]interface{}), d, ns) +} diff --git a/vendor/github.com/go-task/slim-sprig/doc.go b/vendor/github.com/go-task/slim-sprig/doc.go new file mode 100644 index 00000000..aabb9d44 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/doc.go @@ -0,0 +1,19 @@ +/* +Package sprig provides template functions for Go. + +This package contains a number of utility functions for working with data +inside of Go `html/template` and `text/template` files. + +To add these functions, use the `template.Funcs()` method: + + t := templates.New("foo").Funcs(sprig.FuncMap()) + +Note that you should add the function map before you parse any template files. + + In several cases, Sprig reverses the order of arguments from the way they + appear in the standard library. This is to make it easier to pipe + arguments into functions. + +See http://masterminds.github.io/sprig/ for more detailed documentation on each of the available functions. +*/ +package sprig diff --git a/vendor/github.com/go-task/slim-sprig/functions.go b/vendor/github.com/go-task/slim-sprig/functions.go new file mode 100644 index 00000000..5ea74f89 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/functions.go @@ -0,0 +1,317 @@ +package sprig + +import ( + "errors" + "html/template" + "math/rand" + "os" + "path" + "path/filepath" + "reflect" + "strconv" + "strings" + ttemplate "text/template" + "time" +) + +// FuncMap produces the function map. +// +// Use this to pass the functions into the template engine: +// +// tpl := template.New("foo").Funcs(sprig.FuncMap())) +// +func FuncMap() template.FuncMap { + return HtmlFuncMap() +} + +// HermeticTxtFuncMap returns a 'text/template'.FuncMap with only repeatable functions. +func HermeticTxtFuncMap() ttemplate.FuncMap { + r := TxtFuncMap() + for _, name := range nonhermeticFunctions { + delete(r, name) + } + return r +} + +// HermeticHtmlFuncMap returns an 'html/template'.Funcmap with only repeatable functions. +func HermeticHtmlFuncMap() template.FuncMap { + r := HtmlFuncMap() + for _, name := range nonhermeticFunctions { + delete(r, name) + } + return r +} + +// TxtFuncMap returns a 'text/template'.FuncMap +func TxtFuncMap() ttemplate.FuncMap { + return ttemplate.FuncMap(GenericFuncMap()) +} + +// HtmlFuncMap returns an 'html/template'.Funcmap +func HtmlFuncMap() template.FuncMap { + return template.FuncMap(GenericFuncMap()) +} + +// GenericFuncMap returns a copy of the basic function map as a map[string]interface{}. +func GenericFuncMap() map[string]interface{} { + gfm := make(map[string]interface{}, len(genericMap)) + for k, v := range genericMap { + gfm[k] = v + } + return gfm +} + +// These functions are not guaranteed to evaluate to the same result for given input, because they +// refer to the environment or global state. +var nonhermeticFunctions = []string{ + // Date functions + "date", + "date_in_zone", + "date_modify", + "now", + "htmlDate", + "htmlDateInZone", + "dateInZone", + "dateModify", + + // Strings + "randAlphaNum", + "randAlpha", + "randAscii", + "randNumeric", + "randBytes", + "uuidv4", + + // OS + "env", + "expandenv", + + // Network + "getHostByName", +} + +var genericMap = map[string]interface{}{ + "hello": func() string { return "Hello!" }, + + // Date functions + "ago": dateAgo, + "date": date, + "date_in_zone": dateInZone, + "date_modify": dateModify, + "dateInZone": dateInZone, + "dateModify": dateModify, + "duration": duration, + "durationRound": durationRound, + "htmlDate": htmlDate, + "htmlDateInZone": htmlDateInZone, + "must_date_modify": mustDateModify, + "mustDateModify": mustDateModify, + "mustToDate": mustToDate, + "now": time.Now, + "toDate": toDate, + "unixEpoch": unixEpoch, + + // Strings + "trunc": trunc, + "trim": strings.TrimSpace, + "upper": strings.ToUpper, + "lower": strings.ToLower, + "title": strings.Title, + "substr": substring, + // Switch order so that "foo" | repeat 5 + "repeat": func(count int, str string) string { return strings.Repeat(str, count) }, + // Deprecated: Use trimAll. + "trimall": func(a, b string) string { return strings.Trim(b, a) }, + // Switch order so that "$foo" | trimall "$" + "trimAll": func(a, b string) string { return strings.Trim(b, a) }, + "trimSuffix": func(a, b string) string { return strings.TrimSuffix(b, a) }, + "trimPrefix": func(a, b string) string { return strings.TrimPrefix(b, a) }, + // Switch order so that "foobar" | contains "foo" + "contains": func(substr string, str string) bool { return strings.Contains(str, substr) }, + "hasPrefix": func(substr string, str string) bool { return strings.HasPrefix(str, substr) }, + "hasSuffix": func(substr string, str string) bool { return strings.HasSuffix(str, substr) }, + "quote": quote, + "squote": squote, + "cat": cat, + "indent": indent, + "nindent": nindent, + "replace": replace, + "plural": plural, + "sha1sum": sha1sum, + "sha256sum": sha256sum, + "adler32sum": adler32sum, + "toString": strval, + + // Wrap Atoi to stop errors. + "atoi": func(a string) int { i, _ := strconv.Atoi(a); return i }, + "int64": toInt64, + "int": toInt, + "float64": toFloat64, + "seq": seq, + "toDecimal": toDecimal, + + //"gt": func(a, b int) bool {return a > b}, + //"gte": func(a, b int) bool {return a >= b}, + //"lt": func(a, b int) bool {return a < b}, + //"lte": func(a, b int) bool {return a <= b}, + + // split "/" foo/bar returns map[int]string{0: foo, 1: bar} + "split": split, + "splitList": func(sep, orig string) []string { return strings.Split(orig, sep) }, + // splitn "/" foo/bar/fuu returns map[int]string{0: foo, 1: bar/fuu} + "splitn": splitn, + "toStrings": strslice, + + "until": until, + "untilStep": untilStep, + + // VERY basic arithmetic. + "add1": func(i interface{}) int64 { return toInt64(i) + 1 }, + "add": func(i ...interface{}) int64 { + var a int64 = 0 + for _, b := range i { + a += toInt64(b) + } + return a + }, + "sub": func(a, b interface{}) int64 { return toInt64(a) - toInt64(b) }, + "div": func(a, b interface{}) int64 { return toInt64(a) / toInt64(b) }, + "mod": func(a, b interface{}) int64 { return toInt64(a) % toInt64(b) }, + "mul": func(a interface{}, v ...interface{}) int64 { + val := toInt64(a) + for _, b := range v { + val = val * toInt64(b) + } + return val + }, + "randInt": func(min, max int) int { return rand.Intn(max-min) + min }, + "biggest": max, + "max": max, + "min": min, + "maxf": maxf, + "minf": minf, + "ceil": ceil, + "floor": floor, + "round": round, + + // string slices. Note that we reverse the order b/c that's better + // for template processing. + "join": join, + "sortAlpha": sortAlpha, + + // Defaults + "default": dfault, + "empty": empty, + "coalesce": coalesce, + "all": all, + "any": any, + "compact": compact, + "mustCompact": mustCompact, + "fromJson": fromJson, + "toJson": toJson, + "toPrettyJson": toPrettyJson, + "toRawJson": toRawJson, + "mustFromJson": mustFromJson, + "mustToJson": mustToJson, + "mustToPrettyJson": mustToPrettyJson, + "mustToRawJson": mustToRawJson, + "ternary": ternary, + + // Reflection + "typeOf": typeOf, + "typeIs": typeIs, + "typeIsLike": typeIsLike, + "kindOf": kindOf, + "kindIs": kindIs, + "deepEqual": reflect.DeepEqual, + + // OS: + "env": os.Getenv, + "expandenv": os.ExpandEnv, + + // Network: + "getHostByName": getHostByName, + + // Paths: + "base": path.Base, + "dir": path.Dir, + "clean": path.Clean, + "ext": path.Ext, + "isAbs": path.IsAbs, + + // Filepaths: + "osBase": filepath.Base, + "osClean": filepath.Clean, + "osDir": filepath.Dir, + "osExt": filepath.Ext, + "osIsAbs": filepath.IsAbs, + + // Encoding: + "b64enc": base64encode, + "b64dec": base64decode, + "b32enc": base32encode, + "b32dec": base32decode, + + // Data Structures: + "tuple": list, // FIXME: with the addition of append/prepend these are no longer immutable. + "list": list, + "dict": dict, + "get": get, + "set": set, + "unset": unset, + "hasKey": hasKey, + "pluck": pluck, + "keys": keys, + "pick": pick, + "omit": omit, + "values": values, + + "append": push, "push": push, + "mustAppend": mustPush, "mustPush": mustPush, + "prepend": prepend, + "mustPrepend": mustPrepend, + "first": first, + "mustFirst": mustFirst, + "rest": rest, + "mustRest": mustRest, + "last": last, + "mustLast": mustLast, + "initial": initial, + "mustInitial": mustInitial, + "reverse": reverse, + "mustReverse": mustReverse, + "uniq": uniq, + "mustUniq": mustUniq, + "without": without, + "mustWithout": mustWithout, + "has": has, + "mustHas": mustHas, + "slice": slice, + "mustSlice": mustSlice, + "concat": concat, + "dig": dig, + "chunk": chunk, + "mustChunk": mustChunk, + + // Flow Control: + "fail": func(msg string) (string, error) { return "", errors.New(msg) }, + + // Regex + "regexMatch": regexMatch, + "mustRegexMatch": mustRegexMatch, + "regexFindAll": regexFindAll, + "mustRegexFindAll": mustRegexFindAll, + "regexFind": regexFind, + "mustRegexFind": mustRegexFind, + "regexReplaceAll": regexReplaceAll, + "mustRegexReplaceAll": mustRegexReplaceAll, + "regexReplaceAllLiteral": regexReplaceAllLiteral, + "mustRegexReplaceAllLiteral": mustRegexReplaceAllLiteral, + "regexSplit": regexSplit, + "mustRegexSplit": mustRegexSplit, + "regexQuoteMeta": regexQuoteMeta, + + // URLs: + "urlParse": urlParse, + "urlJoin": urlJoin, +} diff --git a/vendor/github.com/go-task/slim-sprig/list.go b/vendor/github.com/go-task/slim-sprig/list.go new file mode 100644 index 00000000..ca0fbb78 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/list.go @@ -0,0 +1,464 @@ +package sprig + +import ( + "fmt" + "math" + "reflect" + "sort" +) + +// Reflection is used in these functions so that slices and arrays of strings, +// ints, and other types not implementing []interface{} can be worked with. +// For example, this is useful if you need to work on the output of regexs. + +func list(v ...interface{}) []interface{} { + return v +} + +func push(list interface{}, v interface{}) []interface{} { + l, err := mustPush(list, v) + if err != nil { + panic(err) + } + + return l +} + +func mustPush(list interface{}, v interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + nl := make([]interface{}, l) + for i := 0; i < l; i++ { + nl[i] = l2.Index(i).Interface() + } + + return append(nl, v), nil + + default: + return nil, fmt.Errorf("Cannot push on type %s", tp) + } +} + +func prepend(list interface{}, v interface{}) []interface{} { + l, err := mustPrepend(list, v) + if err != nil { + panic(err) + } + + return l +} + +func mustPrepend(list interface{}, v interface{}) ([]interface{}, error) { + //return append([]interface{}{v}, list...) + + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + nl := make([]interface{}, l) + for i := 0; i < l; i++ { + nl[i] = l2.Index(i).Interface() + } + + return append([]interface{}{v}, nl...), nil + + default: + return nil, fmt.Errorf("Cannot prepend on type %s", tp) + } +} + +func chunk(size int, list interface{}) [][]interface{} { + l, err := mustChunk(size, list) + if err != nil { + panic(err) + } + + return l +} + +func mustChunk(size int, list interface{}) ([][]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + + cs := int(math.Floor(float64(l-1)/float64(size)) + 1) + nl := make([][]interface{}, cs) + + for i := 0; i < cs; i++ { + clen := size + if i == cs-1 { + clen = int(math.Floor(math.Mod(float64(l), float64(size)))) + if clen == 0 { + clen = size + } + } + + nl[i] = make([]interface{}, clen) + + for j := 0; j < clen; j++ { + ix := i*size + j + nl[i][j] = l2.Index(ix).Interface() + } + } + + return nl, nil + + default: + return nil, fmt.Errorf("Cannot chunk type %s", tp) + } +} + +func last(list interface{}) interface{} { + l, err := mustLast(list) + if err != nil { + panic(err) + } + + return l +} + +func mustLast(list interface{}) (interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + if l == 0 { + return nil, nil + } + + return l2.Index(l - 1).Interface(), nil + default: + return nil, fmt.Errorf("Cannot find last on type %s", tp) + } +} + +func first(list interface{}) interface{} { + l, err := mustFirst(list) + if err != nil { + panic(err) + } + + return l +} + +func mustFirst(list interface{}) (interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + if l == 0 { + return nil, nil + } + + return l2.Index(0).Interface(), nil + default: + return nil, fmt.Errorf("Cannot find first on type %s", tp) + } +} + +func rest(list interface{}) []interface{} { + l, err := mustRest(list) + if err != nil { + panic(err) + } + + return l +} + +func mustRest(list interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + if l == 0 { + return nil, nil + } + + nl := make([]interface{}, l-1) + for i := 1; i < l; i++ { + nl[i-1] = l2.Index(i).Interface() + } + + return nl, nil + default: + return nil, fmt.Errorf("Cannot find rest on type %s", tp) + } +} + +func initial(list interface{}) []interface{} { + l, err := mustInitial(list) + if err != nil { + panic(err) + } + + return l +} + +func mustInitial(list interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + if l == 0 { + return nil, nil + } + + nl := make([]interface{}, l-1) + for i := 0; i < l-1; i++ { + nl[i] = l2.Index(i).Interface() + } + + return nl, nil + default: + return nil, fmt.Errorf("Cannot find initial on type %s", tp) + } +} + +func sortAlpha(list interface{}) []string { + k := reflect.Indirect(reflect.ValueOf(list)).Kind() + switch k { + case reflect.Slice, reflect.Array: + a := strslice(list) + s := sort.StringSlice(a) + s.Sort() + return s + } + return []string{strval(list)} +} + +func reverse(v interface{}) []interface{} { + l, err := mustReverse(v) + if err != nil { + panic(err) + } + + return l +} + +func mustReverse(v interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(v).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(v) + + l := l2.Len() + // We do not sort in place because the incoming array should not be altered. + nl := make([]interface{}, l) + for i := 0; i < l; i++ { + nl[l-i-1] = l2.Index(i).Interface() + } + + return nl, nil + default: + return nil, fmt.Errorf("Cannot find reverse on type %s", tp) + } +} + +func compact(list interface{}) []interface{} { + l, err := mustCompact(list) + if err != nil { + panic(err) + } + + return l +} + +func mustCompact(list interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + nl := []interface{}{} + var item interface{} + for i := 0; i < l; i++ { + item = l2.Index(i).Interface() + if !empty(item) { + nl = append(nl, item) + } + } + + return nl, nil + default: + return nil, fmt.Errorf("Cannot compact on type %s", tp) + } +} + +func uniq(list interface{}) []interface{} { + l, err := mustUniq(list) + if err != nil { + panic(err) + } + + return l +} + +func mustUniq(list interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + dest := []interface{}{} + var item interface{} + for i := 0; i < l; i++ { + item = l2.Index(i).Interface() + if !inList(dest, item) { + dest = append(dest, item) + } + } + + return dest, nil + default: + return nil, fmt.Errorf("Cannot find uniq on type %s", tp) + } +} + +func inList(haystack []interface{}, needle interface{}) bool { + for _, h := range haystack { + if reflect.DeepEqual(needle, h) { + return true + } + } + return false +} + +func without(list interface{}, omit ...interface{}) []interface{} { + l, err := mustWithout(list, omit...) + if err != nil { + panic(err) + } + + return l +} + +func mustWithout(list interface{}, omit ...interface{}) ([]interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + res := []interface{}{} + var item interface{} + for i := 0; i < l; i++ { + item = l2.Index(i).Interface() + if !inList(omit, item) { + res = append(res, item) + } + } + + return res, nil + default: + return nil, fmt.Errorf("Cannot find without on type %s", tp) + } +} + +func has(needle interface{}, haystack interface{}) bool { + l, err := mustHas(needle, haystack) + if err != nil { + panic(err) + } + + return l +} + +func mustHas(needle interface{}, haystack interface{}) (bool, error) { + if haystack == nil { + return false, nil + } + tp := reflect.TypeOf(haystack).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(haystack) + var item interface{} + l := l2.Len() + for i := 0; i < l; i++ { + item = l2.Index(i).Interface() + if reflect.DeepEqual(needle, item) { + return true, nil + } + } + + return false, nil + default: + return false, fmt.Errorf("Cannot find has on type %s", tp) + } +} + +// $list := [1, 2, 3, 4, 5] +// slice $list -> list[0:5] = list[:] +// slice $list 0 3 -> list[0:3] = list[:3] +// slice $list 3 5 -> list[3:5] +// slice $list 3 -> list[3:5] = list[3:] +func slice(list interface{}, indices ...interface{}) interface{} { + l, err := mustSlice(list, indices...) + if err != nil { + panic(err) + } + + return l +} + +func mustSlice(list interface{}, indices ...interface{}) (interface{}, error) { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + + l := l2.Len() + if l == 0 { + return nil, nil + } + + var start, end int + if len(indices) > 0 { + start = toInt(indices[0]) + } + if len(indices) < 2 { + end = l + } else { + end = toInt(indices[1]) + } + + return l2.Slice(start, end).Interface(), nil + default: + return nil, fmt.Errorf("list should be type of slice or array but %s", tp) + } +} + +func concat(lists ...interface{}) interface{} { + var res []interface{} + for _, list := range lists { + tp := reflect.TypeOf(list).Kind() + switch tp { + case reflect.Slice, reflect.Array: + l2 := reflect.ValueOf(list) + for i := 0; i < l2.Len(); i++ { + res = append(res, l2.Index(i).Interface()) + } + default: + panic(fmt.Sprintf("Cannot concat type %s as list", tp)) + } + } + return res +} diff --git a/vendor/github.com/go-task/slim-sprig/network.go b/vendor/github.com/go-task/slim-sprig/network.go new file mode 100644 index 00000000..108d78a9 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/network.go @@ -0,0 +1,12 @@ +package sprig + +import ( + "math/rand" + "net" +) + +func getHostByName(name string) string { + addrs, _ := net.LookupHost(name) + //TODO: add error handing when release v3 comes out + return addrs[rand.Intn(len(addrs))] +} diff --git a/vendor/github.com/go-task/slim-sprig/numeric.go b/vendor/github.com/go-task/slim-sprig/numeric.go new file mode 100644 index 00000000..98cbb37a --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/numeric.go @@ -0,0 +1,228 @@ +package sprig + +import ( + "fmt" + "math" + "reflect" + "strconv" + "strings" +) + +// toFloat64 converts 64-bit floats +func toFloat64(v interface{}) float64 { + if str, ok := v.(string); ok { + iv, err := strconv.ParseFloat(str, 64) + if err != nil { + return 0 + } + return iv + } + + val := reflect.Indirect(reflect.ValueOf(v)) + switch val.Kind() { + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return float64(val.Int()) + case reflect.Uint8, reflect.Uint16, reflect.Uint32: + return float64(val.Uint()) + case reflect.Uint, reflect.Uint64: + return float64(val.Uint()) + case reflect.Float32, reflect.Float64: + return val.Float() + case reflect.Bool: + if val.Bool() { + return 1 + } + return 0 + default: + return 0 + } +} + +func toInt(v interface{}) int { + //It's not optimal. Bud I don't want duplicate toInt64 code. + return int(toInt64(v)) +} + +// toInt64 converts integer types to 64-bit integers +func toInt64(v interface{}) int64 { + if str, ok := v.(string); ok { + iv, err := strconv.ParseInt(str, 10, 64) + if err != nil { + return 0 + } + return iv + } + + val := reflect.Indirect(reflect.ValueOf(v)) + switch val.Kind() { + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return val.Int() + case reflect.Uint8, reflect.Uint16, reflect.Uint32: + return int64(val.Uint()) + case reflect.Uint, reflect.Uint64: + tv := val.Uint() + if tv <= math.MaxInt64 { + return int64(tv) + } + // TODO: What is the sensible thing to do here? + return math.MaxInt64 + case reflect.Float32, reflect.Float64: + return int64(val.Float()) + case reflect.Bool: + if val.Bool() { + return 1 + } + return 0 + default: + return 0 + } +} + +func max(a interface{}, i ...interface{}) int64 { + aa := toInt64(a) + for _, b := range i { + bb := toInt64(b) + if bb > aa { + aa = bb + } + } + return aa +} + +func maxf(a interface{}, i ...interface{}) float64 { + aa := toFloat64(a) + for _, b := range i { + bb := toFloat64(b) + aa = math.Max(aa, bb) + } + return aa +} + +func min(a interface{}, i ...interface{}) int64 { + aa := toInt64(a) + for _, b := range i { + bb := toInt64(b) + if bb < aa { + aa = bb + } + } + return aa +} + +func minf(a interface{}, i ...interface{}) float64 { + aa := toFloat64(a) + for _, b := range i { + bb := toFloat64(b) + aa = math.Min(aa, bb) + } + return aa +} + +func until(count int) []int { + step := 1 + if count < 0 { + step = -1 + } + return untilStep(0, count, step) +} + +func untilStep(start, stop, step int) []int { + v := []int{} + + if stop < start { + if step >= 0 { + return v + } + for i := start; i > stop; i += step { + v = append(v, i) + } + return v + } + + if step <= 0 { + return v + } + for i := start; i < stop; i += step { + v = append(v, i) + } + return v +} + +func floor(a interface{}) float64 { + aa := toFloat64(a) + return math.Floor(aa) +} + +func ceil(a interface{}) float64 { + aa := toFloat64(a) + return math.Ceil(aa) +} + +func round(a interface{}, p int, rOpt ...float64) float64 { + roundOn := .5 + if len(rOpt) > 0 { + roundOn = rOpt[0] + } + val := toFloat64(a) + places := toFloat64(p) + + var round float64 + pow := math.Pow(10, places) + digit := pow * val + _, div := math.Modf(digit) + if div >= roundOn { + round = math.Ceil(digit) + } else { + round = math.Floor(digit) + } + return round / pow +} + +// converts unix octal to decimal +func toDecimal(v interface{}) int64 { + result, err := strconv.ParseInt(fmt.Sprint(v), 8, 64) + if err != nil { + return 0 + } + return result +} + +func seq(params ...int) string { + increment := 1 + switch len(params) { + case 0: + return "" + case 1: + start := 1 + end := params[0] + if end < start { + increment = -1 + } + return intArrayToString(untilStep(start, end+increment, increment), " ") + case 3: + start := params[0] + end := params[2] + step := params[1] + if end < start { + increment = -1 + if step > 0 { + return "" + } + } + return intArrayToString(untilStep(start, end+increment, step), " ") + case 2: + start := params[0] + end := params[1] + step := 1 + if end < start { + step = -1 + } + return intArrayToString(untilStep(start, end+step, step), " ") + default: + return "" + } +} + +func intArrayToString(slice []int, delimeter string) string { + return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(slice)), delimeter), "[]") +} diff --git a/vendor/github.com/go-task/slim-sprig/reflect.go b/vendor/github.com/go-task/slim-sprig/reflect.go new file mode 100644 index 00000000..8a65c132 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/reflect.go @@ -0,0 +1,28 @@ +package sprig + +import ( + "fmt" + "reflect" +) + +// typeIs returns true if the src is the type named in target. +func typeIs(target string, src interface{}) bool { + return target == typeOf(src) +} + +func typeIsLike(target string, src interface{}) bool { + t := typeOf(src) + return target == t || "*"+target == t +} + +func typeOf(src interface{}) string { + return fmt.Sprintf("%T", src) +} + +func kindIs(target string, src interface{}) bool { + return target == kindOf(src) +} + +func kindOf(src interface{}) string { + return reflect.ValueOf(src).Kind().String() +} diff --git a/vendor/github.com/go-task/slim-sprig/regex.go b/vendor/github.com/go-task/slim-sprig/regex.go new file mode 100644 index 00000000..fab55101 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/regex.go @@ -0,0 +1,83 @@ +package sprig + +import ( + "regexp" +) + +func regexMatch(regex string, s string) bool { + match, _ := regexp.MatchString(regex, s) + return match +} + +func mustRegexMatch(regex string, s string) (bool, error) { + return regexp.MatchString(regex, s) +} + +func regexFindAll(regex string, s string, n int) []string { + r := regexp.MustCompile(regex) + return r.FindAllString(s, n) +} + +func mustRegexFindAll(regex string, s string, n int) ([]string, error) { + r, err := regexp.Compile(regex) + if err != nil { + return []string{}, err + } + return r.FindAllString(s, n), nil +} + +func regexFind(regex string, s string) string { + r := regexp.MustCompile(regex) + return r.FindString(s) +} + +func mustRegexFind(regex string, s string) (string, error) { + r, err := regexp.Compile(regex) + if err != nil { + return "", err + } + return r.FindString(s), nil +} + +func regexReplaceAll(regex string, s string, repl string) string { + r := regexp.MustCompile(regex) + return r.ReplaceAllString(s, repl) +} + +func mustRegexReplaceAll(regex string, s string, repl string) (string, error) { + r, err := regexp.Compile(regex) + if err != nil { + return "", err + } + return r.ReplaceAllString(s, repl), nil +} + +func regexReplaceAllLiteral(regex string, s string, repl string) string { + r := regexp.MustCompile(regex) + return r.ReplaceAllLiteralString(s, repl) +} + +func mustRegexReplaceAllLiteral(regex string, s string, repl string) (string, error) { + r, err := regexp.Compile(regex) + if err != nil { + return "", err + } + return r.ReplaceAllLiteralString(s, repl), nil +} + +func regexSplit(regex string, s string, n int) []string { + r := regexp.MustCompile(regex) + return r.Split(s, n) +} + +func mustRegexSplit(regex string, s string, n int) ([]string, error) { + r, err := regexp.Compile(regex) + if err != nil { + return []string{}, err + } + return r.Split(s, n), nil +} + +func regexQuoteMeta(s string) string { + return regexp.QuoteMeta(s) +} diff --git a/vendor/github.com/go-task/slim-sprig/strings.go b/vendor/github.com/go-task/slim-sprig/strings.go new file mode 100644 index 00000000..3c62d6b6 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/strings.go @@ -0,0 +1,189 @@ +package sprig + +import ( + "encoding/base32" + "encoding/base64" + "fmt" + "reflect" + "strconv" + "strings" +) + +func base64encode(v string) string { + return base64.StdEncoding.EncodeToString([]byte(v)) +} + +func base64decode(v string) string { + data, err := base64.StdEncoding.DecodeString(v) + if err != nil { + return err.Error() + } + return string(data) +} + +func base32encode(v string) string { + return base32.StdEncoding.EncodeToString([]byte(v)) +} + +func base32decode(v string) string { + data, err := base32.StdEncoding.DecodeString(v) + if err != nil { + return err.Error() + } + return string(data) +} + +func quote(str ...interface{}) string { + out := make([]string, 0, len(str)) + for _, s := range str { + if s != nil { + out = append(out, fmt.Sprintf("%q", strval(s))) + } + } + return strings.Join(out, " ") +} + +func squote(str ...interface{}) string { + out := make([]string, 0, len(str)) + for _, s := range str { + if s != nil { + out = append(out, fmt.Sprintf("'%v'", s)) + } + } + return strings.Join(out, " ") +} + +func cat(v ...interface{}) string { + v = removeNilElements(v) + r := strings.TrimSpace(strings.Repeat("%v ", len(v))) + return fmt.Sprintf(r, v...) +} + +func indent(spaces int, v string) string { + pad := strings.Repeat(" ", spaces) + return pad + strings.Replace(v, "\n", "\n"+pad, -1) +} + +func nindent(spaces int, v string) string { + return "\n" + indent(spaces, v) +} + +func replace(old, new, src string) string { + return strings.Replace(src, old, new, -1) +} + +func plural(one, many string, count int) string { + if count == 1 { + return one + } + return many +} + +func strslice(v interface{}) []string { + switch v := v.(type) { + case []string: + return v + case []interface{}: + b := make([]string, 0, len(v)) + for _, s := range v { + if s != nil { + b = append(b, strval(s)) + } + } + return b + default: + val := reflect.ValueOf(v) + switch val.Kind() { + case reflect.Array, reflect.Slice: + l := val.Len() + b := make([]string, 0, l) + for i := 0; i < l; i++ { + value := val.Index(i).Interface() + if value != nil { + b = append(b, strval(value)) + } + } + return b + default: + if v == nil { + return []string{} + } + + return []string{strval(v)} + } + } +} + +func removeNilElements(v []interface{}) []interface{} { + newSlice := make([]interface{}, 0, len(v)) + for _, i := range v { + if i != nil { + newSlice = append(newSlice, i) + } + } + return newSlice +} + +func strval(v interface{}) string { + switch v := v.(type) { + case string: + return v + case []byte: + return string(v) + case error: + return v.Error() + case fmt.Stringer: + return v.String() + default: + return fmt.Sprintf("%v", v) + } +} + +func trunc(c int, s string) string { + if c < 0 && len(s)+c > 0 { + return s[len(s)+c:] + } + if c >= 0 && len(s) > c { + return s[:c] + } + return s +} + +func join(sep string, v interface{}) string { + return strings.Join(strslice(v), sep) +} + +func split(sep, orig string) map[string]string { + parts := strings.Split(orig, sep) + res := make(map[string]string, len(parts)) + for i, v := range parts { + res["_"+strconv.Itoa(i)] = v + } + return res +} + +func splitn(sep string, n int, orig string) map[string]string { + parts := strings.SplitN(orig, sep, n) + res := make(map[string]string, len(parts)) + for i, v := range parts { + res["_"+strconv.Itoa(i)] = v + } + return res +} + +// substring creates a substring of the given string. +// +// If start is < 0, this calls string[:end]. +// +// If start is >= 0 and end < 0 or end bigger than s length, this calls string[start:] +// +// Otherwise, this calls string[start, end]. +func substring(start, end int, s string) string { + if start < 0 { + return s[:end] + } + if end < 0 || end > len(s) { + return s[start:] + } + return s[start:end] +} diff --git a/vendor/github.com/go-task/slim-sprig/url.go b/vendor/github.com/go-task/slim-sprig/url.go new file mode 100644 index 00000000..b8e120e1 --- /dev/null +++ b/vendor/github.com/go-task/slim-sprig/url.go @@ -0,0 +1,66 @@ +package sprig + +import ( + "fmt" + "net/url" + "reflect" +) + +func dictGetOrEmpty(dict map[string]interface{}, key string) string { + value, ok := dict[key] + if !ok { + return "" + } + tp := reflect.TypeOf(value).Kind() + if tp != reflect.String { + panic(fmt.Sprintf("unable to parse %s key, must be of type string, but %s found", key, tp.String())) + } + return reflect.ValueOf(value).String() +} + +// parses given URL to return dict object +func urlParse(v string) map[string]interface{} { + dict := map[string]interface{}{} + parsedURL, err := url.Parse(v) + if err != nil { + panic(fmt.Sprintf("unable to parse url: %s", err)) + } + dict["scheme"] = parsedURL.Scheme + dict["host"] = parsedURL.Host + dict["hostname"] = parsedURL.Hostname() + dict["path"] = parsedURL.Path + dict["query"] = parsedURL.RawQuery + dict["opaque"] = parsedURL.Opaque + dict["fragment"] = parsedURL.Fragment + if parsedURL.User != nil { + dict["userinfo"] = parsedURL.User.String() + } else { + dict["userinfo"] = "" + } + + return dict +} + +// join given dict to URL string +func urlJoin(d map[string]interface{}) string { + resURL := url.URL{ + Scheme: dictGetOrEmpty(d, "scheme"), + Host: dictGetOrEmpty(d, "host"), + Path: dictGetOrEmpty(d, "path"), + RawQuery: dictGetOrEmpty(d, "query"), + Opaque: dictGetOrEmpty(d, "opaque"), + Fragment: dictGetOrEmpty(d, "fragment"), + } + userinfo := dictGetOrEmpty(d, "userinfo") + var user *url.Userinfo + if userinfo != "" { + tempURL, err := url.Parse(fmt.Sprintf("proto://%s@host", userinfo)) + if err != nil { + panic(fmt.Sprintf("unable to parse userinfo in dict: %s", err)) + } + user = tempURL.User + } + + resURL.User = user + return resURL.String() +} diff --git a/vendor/github.com/golang-jwt/jwt/v4/token.go b/vendor/github.com/golang-jwt/jwt/v4/token.go index 71e909ea..786b275c 100644 --- a/vendor/github.com/golang-jwt/jwt/v4/token.go +++ b/vendor/github.com/golang-jwt/jwt/v4/token.go @@ -14,6 +14,12 @@ import ( // To use the non-recommended decoding, set this boolean to `true` prior to using this package. var DecodePaddingAllowed bool +// DecodeStrict will switch the codec used for decoding JWTs into strict mode. +// In this mode, the decoder requires that trailing padding bits are zero, as described in RFC 4648 section 3.5. +// Note that this is a global variable, and updating it will change the behavior on a package level, and is also NOT go-routine safe. +// To use strict decoding, set this boolean to `true` prior to using this package. +var DecodeStrict bool + // TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). // You can override it to use another time value. This is useful for testing or if your // server uses a different time zone than your tokens. @@ -121,12 +127,17 @@ func EncodeSegment(seg []byte) string { // Deprecated: In a future release, we will demote this function to a non-exported function, since it // should only be used internally func DecodeSegment(seg string) ([]byte, error) { + encoding := base64.RawURLEncoding + if DecodePaddingAllowed { if l := len(seg) % 4; l > 0 { seg += strings.Repeat("=", 4-l) } - return base64.URLEncoding.DecodeString(seg) + encoding = base64.URLEncoding } - return base64.RawURLEncoding.DecodeString(seg) + if DecodeStrict { + encoding = encoding.Strict() + } + return encoding.DecodeString(seg) } diff --git a/vendor/github.com/golang/mock/gomock/call.go b/vendor/github.com/golang/mock/gomock/call.go index b18cc2d6..13c9f44b 100644 --- a/vendor/github.com/golang/mock/gomock/call.go +++ b/vendor/github.com/golang/mock/gomock/call.go @@ -50,16 +50,16 @@ func newCall(t TestHelper, receiver interface{}, method string, methodType refle t.Helper() // TODO: check arity, types. - margs := make([]Matcher, len(args)) + mArgs := make([]Matcher, len(args)) for i, arg := range args { if m, ok := arg.(Matcher); ok { - margs[i] = m + mArgs[i] = m } else if arg == nil { // Handle nil specially so that passing a nil interface value // will match the typed nils of concrete args. - margs[i] = Nil() + mArgs[i] = Nil() } else { - margs[i] = Eq(arg) + mArgs[i] = Eq(arg) } } @@ -76,7 +76,7 @@ func newCall(t TestHelper, receiver interface{}, method string, methodType refle return rets }} return &Call{t: t, receiver: receiver, method: method, methodType: methodType, - args: margs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions} + args: mArgs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions} } // AnyTimes allows the expectation to be called 0 or more times @@ -113,19 +113,25 @@ func (c *Call) DoAndReturn(f interface{}) *Call { v := reflect.ValueOf(f) c.addAction(func(args []interface{}) []interface{} { - vargs := make([]reflect.Value, len(args)) + c.t.Helper() + vArgs := make([]reflect.Value, len(args)) ft := v.Type() + if c.methodType.NumIn() != ft.NumIn() { + c.t.Fatalf("wrong number of arguments in DoAndReturn func for %T.%v: got %d, want %d [%s]", + c.receiver, c.method, ft.NumIn(), c.methodType.NumIn(), c.origin) + return nil + } for i := 0; i < len(args); i++ { if args[i] != nil { - vargs[i] = reflect.ValueOf(args[i]) + vArgs[i] = reflect.ValueOf(args[i]) } else { // Use the zero value for the arg. - vargs[i] = reflect.Zero(ft.In(i)) + vArgs[i] = reflect.Zero(ft.In(i)) } } - vrets := v.Call(vargs) - rets := make([]interface{}, len(vrets)) - for i, ret := range vrets { + vRets := v.Call(vArgs) + rets := make([]interface{}, len(vRets)) + for i, ret := range vRets { rets[i] = ret.Interface() } return rets @@ -142,17 +148,23 @@ func (c *Call) Do(f interface{}) *Call { v := reflect.ValueOf(f) c.addAction(func(args []interface{}) []interface{} { - vargs := make([]reflect.Value, len(args)) + c.t.Helper() + if c.methodType.NumIn() != v.Type().NumIn() { + c.t.Fatalf("wrong number of arguments in Do func for %T.%v: got %d, want %d [%s]", + c.receiver, c.method, v.Type().NumIn(), c.methodType.NumIn(), c.origin) + return nil + } + vArgs := make([]reflect.Value, len(args)) ft := v.Type() for i := 0; i < len(args); i++ { if args[i] != nil { - vargs[i] = reflect.ValueOf(args[i]) + vArgs[i] = reflect.ValueOf(args[i]) } else { // Use the zero value for the arg. - vargs[i] = reflect.Zero(ft.In(i)) + vArgs[i] = reflect.Zero(ft.In(i)) } } - v.Call(vargs) + v.Call(vArgs) return nil }) return c @@ -353,12 +365,12 @@ func (c *Call) matches(args []interface{}) error { // matches all the remaining arguments or the lack of any. // Convert the remaining arguments, if any, into a slice of the // expected type. - vargsType := c.methodType.In(c.methodType.NumIn() - 1) - vargs := reflect.MakeSlice(vargsType, 0, len(args)-i) + vArgsType := c.methodType.In(c.methodType.NumIn() - 1) + vArgs := reflect.MakeSlice(vArgsType, 0, len(args)-i) for _, arg := range args[i:] { - vargs = reflect.Append(vargs, reflect.ValueOf(arg)) + vArgs = reflect.Append(vArgs, reflect.ValueOf(arg)) } - if m.Matches(vargs.Interface()) { + if m.Matches(vArgs.Interface()) { // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, gomock.Any()) // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, someSliceMatcher) // Got Foo(a, b) want Foo(matcherA, matcherB, gomock.Any()) @@ -380,7 +392,7 @@ func (c *Call) matches(args []interface{}) error { // Check that all prerequisite calls have been satisfied. for _, preReqCall := range c.preReqs { if !preReqCall.satisfied() { - return fmt.Errorf("Expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v", + return fmt.Errorf("expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v", c.origin, preReqCall, c) } } @@ -425,7 +437,7 @@ func (c *Call) addAction(action func([]interface{}) []interface{}) { } func formatGottenArg(m Matcher, arg interface{}) string { - got := fmt.Sprintf("%v", arg) + got := fmt.Sprintf("%v (%T)", arg, arg) if gs, ok := m.(GotFormatter); ok { got = gs.Got(arg) } diff --git a/vendor/github.com/golang/mock/gomock/callset.go b/vendor/github.com/golang/mock/gomock/callset.go index e4e85d60..49dba787 100644 --- a/vendor/github.com/golang/mock/gomock/callset.go +++ b/vendor/github.com/golang/mock/gomock/callset.go @@ -16,6 +16,7 @@ package gomock import ( "bytes" + "errors" "fmt" ) @@ -95,7 +96,7 @@ func (cs callSet) FindMatch(receiver interface{}, method string, args []interfac _, _ = fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method) } - return nil, fmt.Errorf(callsErrors.String()) + return nil, errors.New(callsErrors.String()) } // Failures returns the calls that are not satisfied. diff --git a/vendor/github.com/golang/mock/gomock/controller.go b/vendor/github.com/golang/mock/gomock/controller.go index 3b656909..f054200d 100644 --- a/vendor/github.com/golang/mock/gomock/controller.go +++ b/vendor/github.com/golang/mock/gomock/controller.go @@ -123,7 +123,7 @@ type Controller struct { // Controller. // // New in go1.14+, if you are passing a *testing.T into this function you no -// longer need to call ctrl.Finish() in your test methods +// longer need to call ctrl.Finish() in your test methods. func NewController(t TestReporter) *Controller { h, ok := t.(TestHelper) if !ok { @@ -259,6 +259,9 @@ func (ctrl *Controller) Call(receiver interface{}, method string, args ...interf // Finish checks to see if all the methods that were expected to be called // were called. It should be invoked for each Controller. It is not idempotent // and therefore can only be invoked once. +// +// New in go1.14+, if you are passing a *testing.T into NewController function you no +// longer need to call ctrl.Finish() in your test methods. func (ctrl *Controller) Finish() { // If we're currently panicking, probably because this is a deferred call. // This must be recovered in the deferred function. diff --git a/vendor/github.com/golang/mock/gomock/matchers.go b/vendor/github.com/golang/mock/gomock/matchers.go index 770aba5a..2822fb2c 100644 --- a/vendor/github.com/golang/mock/gomock/matchers.go +++ b/vendor/github.com/golang/mock/gomock/matchers.go @@ -120,7 +120,7 @@ func (e eqMatcher) Matches(x interface{}) bool { } func (e eqMatcher) String() string { - return fmt.Sprintf("is equal to %v", e.x) + return fmt.Sprintf("is equal to %v (%T)", e.x, e.x) } type nilMatcher struct{} @@ -153,7 +153,6 @@ func (n notMatcher) Matches(x interface{}) bool { } func (n notMatcher) String() string { - // TODO: Improve this if we add a NotString method to the Matcher interface. return "not(" + n.m.String() + ")" } @@ -208,6 +207,70 @@ func (m lenMatcher) String() string { return fmt.Sprintf("has length %d", m.i) } +type inAnyOrderMatcher struct { + x interface{} +} + +func (m inAnyOrderMatcher) Matches(x interface{}) bool { + given, ok := m.prepareValue(x) + if !ok { + return false + } + wanted, ok := m.prepareValue(m.x) + if !ok { + return false + } + + if given.Len() != wanted.Len() { + return false + } + + usedFromGiven := make([]bool, given.Len()) + foundFromWanted := make([]bool, wanted.Len()) + for i := 0; i < wanted.Len(); i++ { + wantedMatcher := Eq(wanted.Index(i).Interface()) + for j := 0; j < given.Len(); j++ { + if usedFromGiven[j] { + continue + } + if wantedMatcher.Matches(given.Index(j).Interface()) { + foundFromWanted[i] = true + usedFromGiven[j] = true + break + } + } + } + + missingFromWanted := 0 + for _, found := range foundFromWanted { + if !found { + missingFromWanted++ + } + } + extraInGiven := 0 + for _, used := range usedFromGiven { + if !used { + extraInGiven++ + } + } + + return extraInGiven == 0 && missingFromWanted == 0 +} + +func (m inAnyOrderMatcher) prepareValue(x interface{}) (reflect.Value, bool) { + xValue := reflect.ValueOf(x) + switch xValue.Kind() { + case reflect.Slice, reflect.Array: + return xValue, true + default: + return reflect.Value{}, false + } +} + +func (m inAnyOrderMatcher) String() string { + return fmt.Sprintf("has the same elements as %v", m.x) +} + // Constructors // All returns a composite Matcher that returns true if and only all of the @@ -267,3 +330,12 @@ func AssignableToTypeOf(x interface{}) Matcher { } return assignableToTypeOfMatcher{reflect.TypeOf(x)} } + +// InAnyOrder is a Matcher that returns true for collections of the same elements ignoring the order. +// +// Example usage: +// InAnyOrder([]int{1, 2, 3}).Matches([]int{1, 3, 2}) // returns true +// InAnyOrder([]int{1, 2, 3}).Matches([]int{1, 2}) // returns false +func InAnyOrder(x interface{}) Matcher { + return inAnyOrderMatcher{x} +} diff --git a/vendor/github.com/google/pprof/AUTHORS b/vendor/github.com/google/pprof/AUTHORS new file mode 100644 index 00000000..fd736cb1 --- /dev/null +++ b/vendor/github.com/google/pprof/AUTHORS @@ -0,0 +1,7 @@ +# This is the official list of pprof authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. +# Names should be added to this file as: +# Name or Organization +# The email address is not required for organizations. +Google Inc. \ No newline at end of file diff --git a/vendor/github.com/google/pprof/CONTRIBUTORS b/vendor/github.com/google/pprof/CONTRIBUTORS new file mode 100644 index 00000000..8c8c37d2 --- /dev/null +++ b/vendor/github.com/google/pprof/CONTRIBUTORS @@ -0,0 +1,16 @@ +# People who have agreed to one of the CLAs and can contribute patches. +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, Google employees are listed here +# but not in AUTHORS, because Google holds the copyright. +# +# https://developers.google.com/open-source/cla/individual +# https://developers.google.com/open-source/cla/corporate +# +# Names should be added to this file as: +# Name +Raul Silvera +Tipp Moseley +Hyoun Kyu Cho +Martin Spier +Taco de Wolff +Andrew Hunter diff --git a/vendor/github.com/google/pprof/LICENSE b/vendor/github.com/google/pprof/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/google/pprof/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/pprof/profile/encode.go b/vendor/github.com/google/pprof/profile/encode.go new file mode 100644 index 00000000..ab7f03ae --- /dev/null +++ b/vendor/github.com/google/pprof/profile/encode.go @@ -0,0 +1,567 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "errors" + "sort" +) + +func (p *Profile) decoder() []decoder { + return profileDecoder +} + +// preEncode populates the unexported fields to be used by encode +// (with suffix X) from the corresponding exported fields. The +// exported fields are cleared up to facilitate testing. +func (p *Profile) preEncode() { + strings := make(map[string]int) + addString(strings, "") + + for _, st := range p.SampleType { + st.typeX = addString(strings, st.Type) + st.unitX = addString(strings, st.Unit) + } + + for _, s := range p.Sample { + s.labelX = nil + var keys []string + for k := range s.Label { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + vs := s.Label[k] + for _, v := range vs { + s.labelX = append(s.labelX, + label{ + keyX: addString(strings, k), + strX: addString(strings, v), + }, + ) + } + } + var numKeys []string + for k := range s.NumLabel { + numKeys = append(numKeys, k) + } + sort.Strings(numKeys) + for _, k := range numKeys { + keyX := addString(strings, k) + vs := s.NumLabel[k] + units := s.NumUnit[k] + for i, v := range vs { + var unitX int64 + if len(units) != 0 { + unitX = addString(strings, units[i]) + } + s.labelX = append(s.labelX, + label{ + keyX: keyX, + numX: v, + unitX: unitX, + }, + ) + } + } + s.locationIDX = make([]uint64, len(s.Location)) + for i, loc := range s.Location { + s.locationIDX[i] = loc.ID + } + } + + for _, m := range p.Mapping { + m.fileX = addString(strings, m.File) + m.buildIDX = addString(strings, m.BuildID) + } + + for _, l := range p.Location { + for i, ln := range l.Line { + if ln.Function != nil { + l.Line[i].functionIDX = ln.Function.ID + } else { + l.Line[i].functionIDX = 0 + } + } + if l.Mapping != nil { + l.mappingIDX = l.Mapping.ID + } else { + l.mappingIDX = 0 + } + } + for _, f := range p.Function { + f.nameX = addString(strings, f.Name) + f.systemNameX = addString(strings, f.SystemName) + f.filenameX = addString(strings, f.Filename) + } + + p.dropFramesX = addString(strings, p.DropFrames) + p.keepFramesX = addString(strings, p.KeepFrames) + + if pt := p.PeriodType; pt != nil { + pt.typeX = addString(strings, pt.Type) + pt.unitX = addString(strings, pt.Unit) + } + + p.commentX = nil + for _, c := range p.Comments { + p.commentX = append(p.commentX, addString(strings, c)) + } + + p.defaultSampleTypeX = addString(strings, p.DefaultSampleType) + + p.stringTable = make([]string, len(strings)) + for s, i := range strings { + p.stringTable[i] = s + } +} + +func (p *Profile) encode(b *buffer) { + for _, x := range p.SampleType { + encodeMessage(b, 1, x) + } + for _, x := range p.Sample { + encodeMessage(b, 2, x) + } + for _, x := range p.Mapping { + encodeMessage(b, 3, x) + } + for _, x := range p.Location { + encodeMessage(b, 4, x) + } + for _, x := range p.Function { + encodeMessage(b, 5, x) + } + encodeStrings(b, 6, p.stringTable) + encodeInt64Opt(b, 7, p.dropFramesX) + encodeInt64Opt(b, 8, p.keepFramesX) + encodeInt64Opt(b, 9, p.TimeNanos) + encodeInt64Opt(b, 10, p.DurationNanos) + if pt := p.PeriodType; pt != nil && (pt.typeX != 0 || pt.unitX != 0) { + encodeMessage(b, 11, p.PeriodType) + } + encodeInt64Opt(b, 12, p.Period) + encodeInt64s(b, 13, p.commentX) + encodeInt64(b, 14, p.defaultSampleTypeX) +} + +var profileDecoder = []decoder{ + nil, // 0 + // repeated ValueType sample_type = 1 + func(b *buffer, m message) error { + x := new(ValueType) + pp := m.(*Profile) + pp.SampleType = append(pp.SampleType, x) + return decodeMessage(b, x) + }, + // repeated Sample sample = 2 + func(b *buffer, m message) error { + x := new(Sample) + pp := m.(*Profile) + pp.Sample = append(pp.Sample, x) + return decodeMessage(b, x) + }, + // repeated Mapping mapping = 3 + func(b *buffer, m message) error { + x := new(Mapping) + pp := m.(*Profile) + pp.Mapping = append(pp.Mapping, x) + return decodeMessage(b, x) + }, + // repeated Location location = 4 + func(b *buffer, m message) error { + x := new(Location) + x.Line = make([]Line, 0, 8) // Pre-allocate Line buffer + pp := m.(*Profile) + pp.Location = append(pp.Location, x) + err := decodeMessage(b, x) + var tmp []Line + x.Line = append(tmp, x.Line...) // Shrink to allocated size + return err + }, + // repeated Function function = 5 + func(b *buffer, m message) error { + x := new(Function) + pp := m.(*Profile) + pp.Function = append(pp.Function, x) + return decodeMessage(b, x) + }, + // repeated string string_table = 6 + func(b *buffer, m message) error { + err := decodeStrings(b, &m.(*Profile).stringTable) + if err != nil { + return err + } + if m.(*Profile).stringTable[0] != "" { + return errors.New("string_table[0] must be ''") + } + return nil + }, + // int64 drop_frames = 7 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).dropFramesX) }, + // int64 keep_frames = 8 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).keepFramesX) }, + // int64 time_nanos = 9 + func(b *buffer, m message) error { + if m.(*Profile).TimeNanos != 0 { + return errConcatProfile + } + return decodeInt64(b, &m.(*Profile).TimeNanos) + }, + // int64 duration_nanos = 10 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).DurationNanos) }, + // ValueType period_type = 11 + func(b *buffer, m message) error { + x := new(ValueType) + pp := m.(*Profile) + pp.PeriodType = x + return decodeMessage(b, x) + }, + // int64 period = 12 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).Period) }, + // repeated int64 comment = 13 + func(b *buffer, m message) error { return decodeInt64s(b, &m.(*Profile).commentX) }, + // int64 defaultSampleType = 14 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Profile).defaultSampleTypeX) }, +} + +// postDecode takes the unexported fields populated by decode (with +// suffix X) and populates the corresponding exported fields. +// The unexported fields are cleared up to facilitate testing. +func (p *Profile) postDecode() error { + var err error + mappings := make(map[uint64]*Mapping, len(p.Mapping)) + mappingIds := make([]*Mapping, len(p.Mapping)+1) + for _, m := range p.Mapping { + m.File, err = getString(p.stringTable, &m.fileX, err) + m.BuildID, err = getString(p.stringTable, &m.buildIDX, err) + if m.ID < uint64(len(mappingIds)) { + mappingIds[m.ID] = m + } else { + mappings[m.ID] = m + } + } + + functions := make(map[uint64]*Function, len(p.Function)) + functionIds := make([]*Function, len(p.Function)+1) + for _, f := range p.Function { + f.Name, err = getString(p.stringTable, &f.nameX, err) + f.SystemName, err = getString(p.stringTable, &f.systemNameX, err) + f.Filename, err = getString(p.stringTable, &f.filenameX, err) + if f.ID < uint64(len(functionIds)) { + functionIds[f.ID] = f + } else { + functions[f.ID] = f + } + } + + locations := make(map[uint64]*Location, len(p.Location)) + locationIds := make([]*Location, len(p.Location)+1) + for _, l := range p.Location { + if id := l.mappingIDX; id < uint64(len(mappingIds)) { + l.Mapping = mappingIds[id] + } else { + l.Mapping = mappings[id] + } + l.mappingIDX = 0 + for i, ln := range l.Line { + if id := ln.functionIDX; id != 0 { + l.Line[i].functionIDX = 0 + if id < uint64(len(functionIds)) { + l.Line[i].Function = functionIds[id] + } else { + l.Line[i].Function = functions[id] + } + } + } + if l.ID < uint64(len(locationIds)) { + locationIds[l.ID] = l + } else { + locations[l.ID] = l + } + } + + for _, st := range p.SampleType { + st.Type, err = getString(p.stringTable, &st.typeX, err) + st.Unit, err = getString(p.stringTable, &st.unitX, err) + } + + for _, s := range p.Sample { + labels := make(map[string][]string, len(s.labelX)) + numLabels := make(map[string][]int64, len(s.labelX)) + numUnits := make(map[string][]string, len(s.labelX)) + for _, l := range s.labelX { + var key, value string + key, err = getString(p.stringTable, &l.keyX, err) + if l.strX != 0 { + value, err = getString(p.stringTable, &l.strX, err) + labels[key] = append(labels[key], value) + } else if l.numX != 0 || l.unitX != 0 { + numValues := numLabels[key] + units := numUnits[key] + if l.unitX != 0 { + var unit string + unit, err = getString(p.stringTable, &l.unitX, err) + units = padStringArray(units, len(numValues)) + numUnits[key] = append(units, unit) + } + numLabels[key] = append(numLabels[key], l.numX) + } + } + if len(labels) > 0 { + s.Label = labels + } + if len(numLabels) > 0 { + s.NumLabel = numLabels + for key, units := range numUnits { + if len(units) > 0 { + numUnits[key] = padStringArray(units, len(numLabels[key])) + } + } + s.NumUnit = numUnits + } + s.Location = make([]*Location, len(s.locationIDX)) + for i, lid := range s.locationIDX { + if lid < uint64(len(locationIds)) { + s.Location[i] = locationIds[lid] + } else { + s.Location[i] = locations[lid] + } + } + s.locationIDX = nil + } + + p.DropFrames, err = getString(p.stringTable, &p.dropFramesX, err) + p.KeepFrames, err = getString(p.stringTable, &p.keepFramesX, err) + + if pt := p.PeriodType; pt == nil { + p.PeriodType = &ValueType{} + } + + if pt := p.PeriodType; pt != nil { + pt.Type, err = getString(p.stringTable, &pt.typeX, err) + pt.Unit, err = getString(p.stringTable, &pt.unitX, err) + } + + for _, i := range p.commentX { + var c string + c, err = getString(p.stringTable, &i, err) + p.Comments = append(p.Comments, c) + } + + p.commentX = nil + p.DefaultSampleType, err = getString(p.stringTable, &p.defaultSampleTypeX, err) + p.stringTable = nil + return err +} + +// padStringArray pads arr with enough empty strings to make arr +// length l when arr's length is less than l. +func padStringArray(arr []string, l int) []string { + if l <= len(arr) { + return arr + } + return append(arr, make([]string, l-len(arr))...) +} + +func (p *ValueType) decoder() []decoder { + return valueTypeDecoder +} + +func (p *ValueType) encode(b *buffer) { + encodeInt64Opt(b, 1, p.typeX) + encodeInt64Opt(b, 2, p.unitX) +} + +var valueTypeDecoder = []decoder{ + nil, // 0 + // optional int64 type = 1 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*ValueType).typeX) }, + // optional int64 unit = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*ValueType).unitX) }, +} + +func (p *Sample) decoder() []decoder { + return sampleDecoder +} + +func (p *Sample) encode(b *buffer) { + encodeUint64s(b, 1, p.locationIDX) + encodeInt64s(b, 2, p.Value) + for _, x := range p.labelX { + encodeMessage(b, 3, x) + } +} + +var sampleDecoder = []decoder{ + nil, // 0 + // repeated uint64 location = 1 + func(b *buffer, m message) error { return decodeUint64s(b, &m.(*Sample).locationIDX) }, + // repeated int64 value = 2 + func(b *buffer, m message) error { return decodeInt64s(b, &m.(*Sample).Value) }, + // repeated Label label = 3 + func(b *buffer, m message) error { + s := m.(*Sample) + n := len(s.labelX) + s.labelX = append(s.labelX, label{}) + return decodeMessage(b, &s.labelX[n]) + }, +} + +func (p label) decoder() []decoder { + return labelDecoder +} + +func (p label) encode(b *buffer) { + encodeInt64Opt(b, 1, p.keyX) + encodeInt64Opt(b, 2, p.strX) + encodeInt64Opt(b, 3, p.numX) + encodeInt64Opt(b, 4, p.unitX) +} + +var labelDecoder = []decoder{ + nil, // 0 + // optional int64 key = 1 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).keyX) }, + // optional int64 str = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).strX) }, + // optional int64 num = 3 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).numX) }, + // optional int64 num = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).unitX) }, +} + +func (p *Mapping) decoder() []decoder { + return mappingDecoder +} + +func (p *Mapping) encode(b *buffer) { + encodeUint64Opt(b, 1, p.ID) + encodeUint64Opt(b, 2, p.Start) + encodeUint64Opt(b, 3, p.Limit) + encodeUint64Opt(b, 4, p.Offset) + encodeInt64Opt(b, 5, p.fileX) + encodeInt64Opt(b, 6, p.buildIDX) + encodeBoolOpt(b, 7, p.HasFunctions) + encodeBoolOpt(b, 8, p.HasFilenames) + encodeBoolOpt(b, 9, p.HasLineNumbers) + encodeBoolOpt(b, 10, p.HasInlineFrames) +} + +var mappingDecoder = []decoder{ + nil, // 0 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).ID) }, // optional uint64 id = 1 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).Start) }, // optional uint64 memory_offset = 2 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).Limit) }, // optional uint64 memory_limit = 3 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Mapping).Offset) }, // optional uint64 file_offset = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Mapping).fileX) }, // optional int64 filename = 5 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Mapping).buildIDX) }, // optional int64 build_id = 6 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasFunctions) }, // optional bool has_functions = 7 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasFilenames) }, // optional bool has_filenames = 8 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasLineNumbers) }, // optional bool has_line_numbers = 9 + func(b *buffer, m message) error { return decodeBool(b, &m.(*Mapping).HasInlineFrames) }, // optional bool has_inline_frames = 10 +} + +func (p *Location) decoder() []decoder { + return locationDecoder +} + +func (p *Location) encode(b *buffer) { + encodeUint64Opt(b, 1, p.ID) + encodeUint64Opt(b, 2, p.mappingIDX) + encodeUint64Opt(b, 3, p.Address) + for i := range p.Line { + encodeMessage(b, 4, &p.Line[i]) + } + encodeBoolOpt(b, 5, p.IsFolded) +} + +var locationDecoder = []decoder{ + nil, // 0 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Location).ID) }, // optional uint64 id = 1; + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Location).mappingIDX) }, // optional uint64 mapping_id = 2; + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Location).Address) }, // optional uint64 address = 3; + func(b *buffer, m message) error { // repeated Line line = 4 + pp := m.(*Location) + n := len(pp.Line) + pp.Line = append(pp.Line, Line{}) + return decodeMessage(b, &pp.Line[n]) + }, + func(b *buffer, m message) error { return decodeBool(b, &m.(*Location).IsFolded) }, // optional bool is_folded = 5; +} + +func (p *Line) decoder() []decoder { + return lineDecoder +} + +func (p *Line) encode(b *buffer) { + encodeUint64Opt(b, 1, p.functionIDX) + encodeInt64Opt(b, 2, p.Line) +} + +var lineDecoder = []decoder{ + nil, // 0 + // optional uint64 function_id = 1 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Line).functionIDX) }, + // optional int64 line = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Line).Line) }, +} + +func (p *Function) decoder() []decoder { + return functionDecoder +} + +func (p *Function) encode(b *buffer) { + encodeUint64Opt(b, 1, p.ID) + encodeInt64Opt(b, 2, p.nameX) + encodeInt64Opt(b, 3, p.systemNameX) + encodeInt64Opt(b, 4, p.filenameX) + encodeInt64Opt(b, 5, p.StartLine) +} + +var functionDecoder = []decoder{ + nil, // 0 + // optional uint64 id = 1 + func(b *buffer, m message) error { return decodeUint64(b, &m.(*Function).ID) }, + // optional int64 function_name = 2 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).nameX) }, + // optional int64 function_system_name = 3 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).systemNameX) }, + // repeated int64 filename = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).filenameX) }, + // optional int64 start_line = 5 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*Function).StartLine) }, +} + +func addString(strings map[string]int, s string) int64 { + i, ok := strings[s] + if !ok { + i = len(strings) + strings[s] = i + } + return int64(i) +} + +func getString(strings []string, strng *int64, err error) (string, error) { + if err != nil { + return "", err + } + s := int(*strng) + if s < 0 || s >= len(strings) { + return "", errMalformed + } + *strng = 0 + return strings[s], nil +} diff --git a/vendor/github.com/google/pprof/profile/filter.go b/vendor/github.com/google/pprof/profile/filter.go new file mode 100644 index 00000000..ea8e66c6 --- /dev/null +++ b/vendor/github.com/google/pprof/profile/filter.go @@ -0,0 +1,270 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +// Implements methods to filter samples from profiles. + +import "regexp" + +// FilterSamplesByName filters the samples in a profile and only keeps +// samples where at least one frame matches focus but none match ignore. +// Returns true is the corresponding regexp matched at least one sample. +func (p *Profile) FilterSamplesByName(focus, ignore, hide, show *regexp.Regexp) (fm, im, hm, hnm bool) { + focusOrIgnore := make(map[uint64]bool) + hidden := make(map[uint64]bool) + for _, l := range p.Location { + if ignore != nil && l.matchesName(ignore) { + im = true + focusOrIgnore[l.ID] = false + } else if focus == nil || l.matchesName(focus) { + fm = true + focusOrIgnore[l.ID] = true + } + + if hide != nil && l.matchesName(hide) { + hm = true + l.Line = l.unmatchedLines(hide) + if len(l.Line) == 0 { + hidden[l.ID] = true + } + } + if show != nil { + l.Line = l.matchedLines(show) + if len(l.Line) == 0 { + hidden[l.ID] = true + } else { + hnm = true + } + } + } + + s := make([]*Sample, 0, len(p.Sample)) + for _, sample := range p.Sample { + if focusedAndNotIgnored(sample.Location, focusOrIgnore) { + if len(hidden) > 0 { + var locs []*Location + for _, loc := range sample.Location { + if !hidden[loc.ID] { + locs = append(locs, loc) + } + } + if len(locs) == 0 { + // Remove sample with no locations (by not adding it to s). + continue + } + sample.Location = locs + } + s = append(s, sample) + } + } + p.Sample = s + + return +} + +// ShowFrom drops all stack frames above the highest matching frame and returns +// whether a match was found. If showFrom is nil it returns false and does not +// modify the profile. +// +// Example: consider a sample with frames [A, B, C, B], where A is the root. +// ShowFrom(nil) returns false and has frames [A, B, C, B]. +// ShowFrom(A) returns true and has frames [A, B, C, B]. +// ShowFrom(B) returns true and has frames [B, C, B]. +// ShowFrom(C) returns true and has frames [C, B]. +// ShowFrom(D) returns false and drops the sample because no frames remain. +func (p *Profile) ShowFrom(showFrom *regexp.Regexp) (matched bool) { + if showFrom == nil { + return false + } + // showFromLocs stores location IDs that matched ShowFrom. + showFromLocs := make(map[uint64]bool) + // Apply to locations. + for _, loc := range p.Location { + if filterShowFromLocation(loc, showFrom) { + showFromLocs[loc.ID] = true + matched = true + } + } + // For all samples, strip locations after the highest matching one. + s := make([]*Sample, 0, len(p.Sample)) + for _, sample := range p.Sample { + for i := len(sample.Location) - 1; i >= 0; i-- { + if showFromLocs[sample.Location[i].ID] { + sample.Location = sample.Location[:i+1] + s = append(s, sample) + break + } + } + } + p.Sample = s + return matched +} + +// filterShowFromLocation tests a showFrom regex against a location, removes +// lines after the last match and returns whether a match was found. If the +// mapping is matched, then all lines are kept. +func filterShowFromLocation(loc *Location, showFrom *regexp.Regexp) bool { + if m := loc.Mapping; m != nil && showFrom.MatchString(m.File) { + return true + } + if i := loc.lastMatchedLineIndex(showFrom); i >= 0 { + loc.Line = loc.Line[:i+1] + return true + } + return false +} + +// lastMatchedLineIndex returns the index of the last line that matches a regex, +// or -1 if no match is found. +func (loc *Location) lastMatchedLineIndex(re *regexp.Regexp) int { + for i := len(loc.Line) - 1; i >= 0; i-- { + if fn := loc.Line[i].Function; fn != nil { + if re.MatchString(fn.Name) || re.MatchString(fn.Filename) { + return i + } + } + } + return -1 +} + +// FilterTagsByName filters the tags in a profile and only keeps +// tags that match show and not hide. +func (p *Profile) FilterTagsByName(show, hide *regexp.Regexp) (sm, hm bool) { + matchRemove := func(name string) bool { + matchShow := show == nil || show.MatchString(name) + matchHide := hide != nil && hide.MatchString(name) + + if matchShow { + sm = true + } + if matchHide { + hm = true + } + return !matchShow || matchHide + } + for _, s := range p.Sample { + for lab := range s.Label { + if matchRemove(lab) { + delete(s.Label, lab) + } + } + for lab := range s.NumLabel { + if matchRemove(lab) { + delete(s.NumLabel, lab) + } + } + } + return +} + +// matchesName returns whether the location matches the regular +// expression. It checks any available function names, file names, and +// mapping object filename. +func (loc *Location) matchesName(re *regexp.Regexp) bool { + for _, ln := range loc.Line { + if fn := ln.Function; fn != nil { + if re.MatchString(fn.Name) || re.MatchString(fn.Filename) { + return true + } + } + } + if m := loc.Mapping; m != nil && re.MatchString(m.File) { + return true + } + return false +} + +// unmatchedLines returns the lines in the location that do not match +// the regular expression. +func (loc *Location) unmatchedLines(re *regexp.Regexp) []Line { + if m := loc.Mapping; m != nil && re.MatchString(m.File) { + return nil + } + var lines []Line + for _, ln := range loc.Line { + if fn := ln.Function; fn != nil { + if re.MatchString(fn.Name) || re.MatchString(fn.Filename) { + continue + } + } + lines = append(lines, ln) + } + return lines +} + +// matchedLines returns the lines in the location that match +// the regular expression. +func (loc *Location) matchedLines(re *regexp.Regexp) []Line { + if m := loc.Mapping; m != nil && re.MatchString(m.File) { + return loc.Line + } + var lines []Line + for _, ln := range loc.Line { + if fn := ln.Function; fn != nil { + if !re.MatchString(fn.Name) && !re.MatchString(fn.Filename) { + continue + } + } + lines = append(lines, ln) + } + return lines +} + +// focusedAndNotIgnored looks up a slice of ids against a map of +// focused/ignored locations. The map only contains locations that are +// explicitly focused or ignored. Returns whether there is at least +// one focused location but no ignored locations. +func focusedAndNotIgnored(locs []*Location, m map[uint64]bool) bool { + var f bool + for _, loc := range locs { + if focus, focusOrIgnore := m[loc.ID]; focusOrIgnore { + if focus { + // Found focused location. Must keep searching in case there + // is an ignored one as well. + f = true + } else { + // Found ignored location. Can return false right away. + return false + } + } + } + return f +} + +// TagMatch selects tags for filtering +type TagMatch func(s *Sample) bool + +// FilterSamplesByTag removes all samples from the profile, except +// those that match focus and do not match the ignore regular +// expression. +func (p *Profile) FilterSamplesByTag(focus, ignore TagMatch) (fm, im bool) { + samples := make([]*Sample, 0, len(p.Sample)) + for _, s := range p.Sample { + focused, ignored := true, false + if focus != nil { + focused = focus(s) + } + if ignore != nil { + ignored = ignore(s) + } + fm = fm || focused + im = im || ignored + if focused && !ignored { + samples = append(samples, s) + } + } + p.Sample = samples + return +} diff --git a/vendor/github.com/google/pprof/profile/index.go b/vendor/github.com/google/pprof/profile/index.go new file mode 100644 index 00000000..bef1d604 --- /dev/null +++ b/vendor/github.com/google/pprof/profile/index.go @@ -0,0 +1,64 @@ +// Copyright 2016 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "fmt" + "strconv" + "strings" +) + +// SampleIndexByName returns the appropriate index for a value of sample index. +// If numeric, it returns the number, otherwise it looks up the text in the +// profile sample types. +func (p *Profile) SampleIndexByName(sampleIndex string) (int, error) { + if sampleIndex == "" { + if dst := p.DefaultSampleType; dst != "" { + for i, t := range sampleTypes(p) { + if t == dst { + return i, nil + } + } + } + // By default select the last sample value + return len(p.SampleType) - 1, nil + } + if i, err := strconv.Atoi(sampleIndex); err == nil { + if i < 0 || i >= len(p.SampleType) { + return 0, fmt.Errorf("sample_index %s is outside the range [0..%d]", sampleIndex, len(p.SampleType)-1) + } + return i, nil + } + + // Remove the inuse_ prefix to support legacy pprof options + // "inuse_space" and "inuse_objects" for profiles containing types + // "space" and "objects". + noInuse := strings.TrimPrefix(sampleIndex, "inuse_") + for i, t := range p.SampleType { + if t.Type == sampleIndex || t.Type == noInuse { + return i, nil + } + } + + return 0, fmt.Errorf("sample_index %q must be one of: %v", sampleIndex, sampleTypes(p)) +} + +func sampleTypes(p *Profile) []string { + types := make([]string, len(p.SampleType)) + for i, t := range p.SampleType { + types[i] = t.Type + } + return types +} diff --git a/vendor/github.com/google/pprof/profile/legacy_java_profile.go b/vendor/github.com/google/pprof/profile/legacy_java_profile.go new file mode 100644 index 00000000..91f45e53 --- /dev/null +++ b/vendor/github.com/google/pprof/profile/legacy_java_profile.go @@ -0,0 +1,315 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file implements parsers to convert java legacy profiles into +// the profile.proto format. + +package profile + +import ( + "bytes" + "fmt" + "io" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +var ( + attributeRx = regexp.MustCompile(`([\w ]+)=([\w ]+)`) + javaSampleRx = regexp.MustCompile(` *(\d+) +(\d+) +@ +([ x0-9a-f]*)`) + javaLocationRx = regexp.MustCompile(`^\s*0x([[:xdigit:]]+)\s+(.*)\s*$`) + javaLocationFileLineRx = regexp.MustCompile(`^(.*)\s+\((.+):(-?[[:digit:]]+)\)$`) + javaLocationPathRx = regexp.MustCompile(`^(.*)\s+\((.*)\)$`) +) + +// javaCPUProfile returns a new Profile from profilez data. +// b is the profile bytes after the header, period is the profiling +// period, and parse is a function to parse 8-byte chunks from the +// profile in its native endianness. +func javaCPUProfile(b []byte, period int64, parse func(b []byte) (uint64, []byte)) (*Profile, error) { + p := &Profile{ + Period: period * 1000, + PeriodType: &ValueType{Type: "cpu", Unit: "nanoseconds"}, + SampleType: []*ValueType{{Type: "samples", Unit: "count"}, {Type: "cpu", Unit: "nanoseconds"}}, + } + var err error + var locs map[uint64]*Location + if b, locs, err = parseCPUSamples(b, parse, false, p); err != nil { + return nil, err + } + + if err = parseJavaLocations(b, locs, p); err != nil { + return nil, err + } + + // Strip out addresses for better merge. + if err = p.Aggregate(true, true, true, true, false); err != nil { + return nil, err + } + + return p, nil +} + +// parseJavaProfile returns a new profile from heapz or contentionz +// data. b is the profile bytes after the header. +func parseJavaProfile(b []byte) (*Profile, error) { + h := bytes.SplitAfterN(b, []byte("\n"), 2) + if len(h) < 2 { + return nil, errUnrecognized + } + + p := &Profile{ + PeriodType: &ValueType{}, + } + header := string(bytes.TrimSpace(h[0])) + + var err error + var pType string + switch header { + case "--- heapz 1 ---": + pType = "heap" + case "--- contentionz 1 ---": + pType = "contention" + default: + return nil, errUnrecognized + } + + if b, err = parseJavaHeader(pType, h[1], p); err != nil { + return nil, err + } + var locs map[uint64]*Location + if b, locs, err = parseJavaSamples(pType, b, p); err != nil { + return nil, err + } + if err = parseJavaLocations(b, locs, p); err != nil { + return nil, err + } + + // Strip out addresses for better merge. + if err = p.Aggregate(true, true, true, true, false); err != nil { + return nil, err + } + + return p, nil +} + +// parseJavaHeader parses the attribute section on a java profile and +// populates a profile. Returns the remainder of the buffer after all +// attributes. +func parseJavaHeader(pType string, b []byte, p *Profile) ([]byte, error) { + nextNewLine := bytes.IndexByte(b, byte('\n')) + for nextNewLine != -1 { + line := string(bytes.TrimSpace(b[0:nextNewLine])) + if line != "" { + h := attributeRx.FindStringSubmatch(line) + if h == nil { + // Not a valid attribute, exit. + return b, nil + } + + attribute, value := strings.TrimSpace(h[1]), strings.TrimSpace(h[2]) + var err error + switch pType + "/" + attribute { + case "heap/format", "cpu/format", "contention/format": + if value != "java" { + return nil, errUnrecognized + } + case "heap/resolution": + p.SampleType = []*ValueType{ + {Type: "inuse_objects", Unit: "count"}, + {Type: "inuse_space", Unit: value}, + } + case "contention/resolution": + p.SampleType = []*ValueType{ + {Type: "contentions", Unit: "count"}, + {Type: "delay", Unit: value}, + } + case "contention/sampling period": + p.PeriodType = &ValueType{ + Type: "contentions", Unit: "count", + } + if p.Period, err = strconv.ParseInt(value, 0, 64); err != nil { + return nil, fmt.Errorf("failed to parse attribute %s: %v", line, err) + } + case "contention/ms since reset": + millis, err := strconv.ParseInt(value, 0, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse attribute %s: %v", line, err) + } + p.DurationNanos = millis * 1000 * 1000 + default: + return nil, errUnrecognized + } + } + // Grab next line. + b = b[nextNewLine+1:] + nextNewLine = bytes.IndexByte(b, byte('\n')) + } + return b, nil +} + +// parseJavaSamples parses the samples from a java profile and +// populates the Samples in a profile. Returns the remainder of the +// buffer after the samples. +func parseJavaSamples(pType string, b []byte, p *Profile) ([]byte, map[uint64]*Location, error) { + nextNewLine := bytes.IndexByte(b, byte('\n')) + locs := make(map[uint64]*Location) + for nextNewLine != -1 { + line := string(bytes.TrimSpace(b[0:nextNewLine])) + if line != "" { + sample := javaSampleRx.FindStringSubmatch(line) + if sample == nil { + // Not a valid sample, exit. + return b, locs, nil + } + + // Java profiles have data/fields inverted compared to other + // profile types. + var err error + value1, value2, value3 := sample[2], sample[1], sample[3] + addrs, err := parseHexAddresses(value3) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + var sloc []*Location + for _, addr := range addrs { + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + s := &Sample{ + Value: make([]int64, 2), + Location: sloc, + } + + if s.Value[0], err = strconv.ParseInt(value1, 0, 64); err != nil { + return nil, nil, fmt.Errorf("parsing sample %s: %v", line, err) + } + if s.Value[1], err = strconv.ParseInt(value2, 0, 64); err != nil { + return nil, nil, fmt.Errorf("parsing sample %s: %v", line, err) + } + + switch pType { + case "heap": + const javaHeapzSamplingRate = 524288 // 512K + if s.Value[0] == 0 { + return nil, nil, fmt.Errorf("parsing sample %s: second value must be non-zero", line) + } + s.NumLabel = map[string][]int64{"bytes": {s.Value[1] / s.Value[0]}} + s.Value[0], s.Value[1] = scaleHeapSample(s.Value[0], s.Value[1], javaHeapzSamplingRate) + case "contention": + if period := p.Period; period != 0 { + s.Value[0] = s.Value[0] * p.Period + s.Value[1] = s.Value[1] * p.Period + } + } + p.Sample = append(p.Sample, s) + } + // Grab next line. + b = b[nextNewLine+1:] + nextNewLine = bytes.IndexByte(b, byte('\n')) + } + return b, locs, nil +} + +// parseJavaLocations parses the location information in a java +// profile and populates the Locations in a profile. It uses the +// location addresses from the profile as both the ID of each +// location. +func parseJavaLocations(b []byte, locs map[uint64]*Location, p *Profile) error { + r := bytes.NewBuffer(b) + fns := make(map[string]*Function) + for { + line, err := r.ReadString('\n') + if err != nil { + if err != io.EOF { + return err + } + if line == "" { + break + } + } + + if line = strings.TrimSpace(line); line == "" { + continue + } + + jloc := javaLocationRx.FindStringSubmatch(line) + if len(jloc) != 3 { + continue + } + addr, err := strconv.ParseUint(jloc[1], 16, 64) + if err != nil { + return fmt.Errorf("parsing sample %s: %v", line, err) + } + loc := locs[addr] + if loc == nil { + // Unused/unseen + continue + } + var lineFunc, lineFile string + var lineNo int64 + + if fileLine := javaLocationFileLineRx.FindStringSubmatch(jloc[2]); len(fileLine) == 4 { + // Found a line of the form: "function (file:line)" + lineFunc, lineFile = fileLine[1], fileLine[2] + if n, err := strconv.ParseInt(fileLine[3], 10, 64); err == nil && n > 0 { + lineNo = n + } + } else if filePath := javaLocationPathRx.FindStringSubmatch(jloc[2]); len(filePath) == 3 { + // If there's not a file:line, it's a shared library path. + // The path isn't interesting, so just give the .so. + lineFunc, lineFile = filePath[1], filepath.Base(filePath[2]) + } else if strings.Contains(jloc[2], "generated stub/JIT") { + lineFunc = "STUB" + } else { + // Treat whole line as the function name. This is used by the + // java agent for internal states such as "GC" or "VM". + lineFunc = jloc[2] + } + fn := fns[lineFunc] + + if fn == nil { + fn = &Function{ + Name: lineFunc, + SystemName: lineFunc, + Filename: lineFile, + } + fns[lineFunc] = fn + p.Function = append(p.Function, fn) + } + loc.Line = []Line{ + { + Function: fn, + Line: lineNo, + }, + } + loc.Address = 0 + } + + p.remapLocationIDs() + p.remapFunctionIDs() + p.remapMappingIDs() + + return nil +} diff --git a/vendor/github.com/google/pprof/profile/legacy_profile.go b/vendor/github.com/google/pprof/profile/legacy_profile.go new file mode 100644 index 00000000..0c8f3bb5 --- /dev/null +++ b/vendor/github.com/google/pprof/profile/legacy_profile.go @@ -0,0 +1,1225 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file implements parsers to convert legacy profiles into the +// profile.proto format. + +package profile + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "regexp" + "strconv" + "strings" +) + +var ( + countStartRE = regexp.MustCompile(`\A(\S+) profile: total \d+\z`) + countRE = regexp.MustCompile(`\A(\d+) @(( 0x[0-9a-f]+)+)\z`) + + heapHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] *@ *(heap[_a-z0-9]*)/?(\d*)`) + heapSampleRE = regexp.MustCompile(`(-?\d+): *(-?\d+) *\[ *(\d+): *(\d+) *] @([ x0-9a-f]*)`) + + contentionSampleRE = regexp.MustCompile(`(\d+) *(\d+) @([ x0-9a-f]*)`) + + hexNumberRE = regexp.MustCompile(`0x[0-9a-f]+`) + + growthHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ growthz?`) + + fragmentationHeaderRE = regexp.MustCompile(`heap profile: *(\d+): *(\d+) *\[ *(\d+): *(\d+) *\] @ fragmentationz?`) + + threadzStartRE = regexp.MustCompile(`--- threadz \d+ ---`) + threadStartRE = regexp.MustCompile(`--- Thread ([[:xdigit:]]+) \(name: (.*)/(\d+)\) stack: ---`) + + // Regular expressions to parse process mappings. Support the format used by Linux /proc/.../maps and other tools. + // Recommended format: + // Start End object file name offset(optional) linker build id + // 0x40000-0x80000 /path/to/binary (@FF00) abc123456 + spaceDigits = `\s+[[:digit:]]+` + hexPair = `\s+[[:xdigit:]]+:[[:xdigit:]]+` + oSpace = `\s*` + // Capturing expressions. + cHex = `(?:0x)?([[:xdigit:]]+)` + cHexRange = `\s*` + cHex + `[\s-]?` + oSpace + cHex + `:?` + cSpaceString = `(?:\s+(\S+))?` + cSpaceHex = `(?:\s+([[:xdigit:]]+))?` + cSpaceAtOffset = `(?:\s+\(@([[:xdigit:]]+)\))?` + cPerm = `(?:\s+([-rwxp]+))?` + + procMapsRE = regexp.MustCompile(`^` + cHexRange + cPerm + cSpaceHex + hexPair + spaceDigits + cSpaceString) + briefMapsRE = regexp.MustCompile(`^` + cHexRange + cPerm + cSpaceString + cSpaceAtOffset + cSpaceHex) + + // Regular expression to parse log data, of the form: + // ... file:line] msg... + logInfoRE = regexp.MustCompile(`^[^\[\]]+:[0-9]+]\s`) +) + +func isSpaceOrComment(line string) bool { + trimmed := strings.TrimSpace(line) + return len(trimmed) == 0 || trimmed[0] == '#' +} + +// parseGoCount parses a Go count profile (e.g., threadcreate or +// goroutine) and returns a new Profile. +func parseGoCount(b []byte) (*Profile, error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + // Skip comments at the beginning of the file. + for s.Scan() && isSpaceOrComment(s.Text()) { + } + if err := s.Err(); err != nil { + return nil, err + } + m := countStartRE.FindStringSubmatch(s.Text()) + if m == nil { + return nil, errUnrecognized + } + profileType := m[1] + p := &Profile{ + PeriodType: &ValueType{Type: profileType, Unit: "count"}, + Period: 1, + SampleType: []*ValueType{{Type: profileType, Unit: "count"}}, + } + locations := make(map[uint64]*Location) + for s.Scan() { + line := s.Text() + if isSpaceOrComment(line) { + continue + } + if strings.HasPrefix(line, "---") { + break + } + m := countRE.FindStringSubmatch(line) + if m == nil { + return nil, errMalformed + } + n, err := strconv.ParseInt(m[1], 0, 64) + if err != nil { + return nil, errMalformed + } + fields := strings.Fields(m[2]) + locs := make([]*Location, 0, len(fields)) + for _, stk := range fields { + addr, err := strconv.ParseUint(stk, 0, 64) + if err != nil { + return nil, errMalformed + } + // Adjust all frames by -1 to land on top of the call instruction. + addr-- + loc := locations[addr] + if loc == nil { + loc = &Location{ + Address: addr, + } + locations[addr] = loc + p.Location = append(p.Location, loc) + } + locs = append(locs, loc) + } + p.Sample = append(p.Sample, &Sample{ + Location: locs, + Value: []int64{n}, + }) + } + if err := s.Err(); err != nil { + return nil, err + } + + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + return p, nil +} + +// remapLocationIDs ensures there is a location for each address +// referenced by a sample, and remaps the samples to point to the new +// location ids. +func (p *Profile) remapLocationIDs() { + seen := make(map[*Location]bool, len(p.Location)) + var locs []*Location + + for _, s := range p.Sample { + for _, l := range s.Location { + if seen[l] { + continue + } + l.ID = uint64(len(locs) + 1) + locs = append(locs, l) + seen[l] = true + } + } + p.Location = locs +} + +func (p *Profile) remapFunctionIDs() { + seen := make(map[*Function]bool, len(p.Function)) + var fns []*Function + + for _, l := range p.Location { + for _, ln := range l.Line { + fn := ln.Function + if fn == nil || seen[fn] { + continue + } + fn.ID = uint64(len(fns) + 1) + fns = append(fns, fn) + seen[fn] = true + } + } + p.Function = fns +} + +// remapMappingIDs matches location addresses with existing mappings +// and updates them appropriately. This is O(N*M), if this ever shows +// up as a bottleneck, evaluate sorting the mappings and doing a +// binary search, which would make it O(N*log(M)). +func (p *Profile) remapMappingIDs() { + // Some profile handlers will incorrectly set regions for the main + // executable if its section is remapped. Fix them through heuristics. + + if len(p.Mapping) > 0 { + // Remove the initial mapping if named '/anon_hugepage' and has a + // consecutive adjacent mapping. + if m := p.Mapping[0]; strings.HasPrefix(m.File, "/anon_hugepage") { + if len(p.Mapping) > 1 && m.Limit == p.Mapping[1].Start { + p.Mapping = p.Mapping[1:] + } + } + } + + // Subtract the offset from the start of the main mapping if it + // ends up at a recognizable start address. + if len(p.Mapping) > 0 { + const expectedStart = 0x400000 + if m := p.Mapping[0]; m.Start-m.Offset == expectedStart { + m.Start = expectedStart + m.Offset = 0 + } + } + + // Associate each location with an address to the corresponding + // mapping. Create fake mapping if a suitable one isn't found. + var fake *Mapping +nextLocation: + for _, l := range p.Location { + a := l.Address + if l.Mapping != nil || a == 0 { + continue + } + for _, m := range p.Mapping { + if m.Start <= a && a < m.Limit { + l.Mapping = m + continue nextLocation + } + } + // Work around legacy handlers failing to encode the first + // part of mappings split into adjacent ranges. + for _, m := range p.Mapping { + if m.Offset != 0 && m.Start-m.Offset <= a && a < m.Start { + m.Start -= m.Offset + m.Offset = 0 + l.Mapping = m + continue nextLocation + } + } + // If there is still no mapping, create a fake one. + // This is important for the Go legacy handler, which produced + // no mappings. + if fake == nil { + fake = &Mapping{ + ID: 1, + Limit: ^uint64(0), + } + p.Mapping = append(p.Mapping, fake) + } + l.Mapping = fake + } + + // Reset all mapping IDs. + for i, m := range p.Mapping { + m.ID = uint64(i + 1) + } +} + +var cpuInts = []func([]byte) (uint64, []byte){ + get32l, + get32b, + get64l, + get64b, +} + +func get32l(b []byte) (uint64, []byte) { + if len(b) < 4 { + return 0, nil + } + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24, b[4:] +} + +func get32b(b []byte) (uint64, []byte) { + if len(b) < 4 { + return 0, nil + } + return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24, b[4:] +} + +func get64l(b []byte) (uint64, []byte) { + if len(b) < 8 { + return 0, nil + } + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56, b[8:] +} + +func get64b(b []byte) (uint64, []byte) { + if len(b) < 8 { + return 0, nil + } + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56, b[8:] +} + +// parseCPU parses a profilez legacy profile and returns a newly +// populated Profile. +// +// The general format for profilez samples is a sequence of words in +// binary format. The first words are a header with the following data: +// 1st word -- 0 +// 2nd word -- 3 +// 3rd word -- 0 if a c++ application, 1 if a java application. +// 4th word -- Sampling period (in microseconds). +// 5th word -- Padding. +func parseCPU(b []byte) (*Profile, error) { + var parse func([]byte) (uint64, []byte) + var n1, n2, n3, n4, n5 uint64 + for _, parse = range cpuInts { + var tmp []byte + n1, tmp = parse(b) + n2, tmp = parse(tmp) + n3, tmp = parse(tmp) + n4, tmp = parse(tmp) + n5, tmp = parse(tmp) + + if tmp != nil && n1 == 0 && n2 == 3 && n3 == 0 && n4 > 0 && n5 == 0 { + b = tmp + return cpuProfile(b, int64(n4), parse) + } + if tmp != nil && n1 == 0 && n2 == 3 && n3 == 1 && n4 > 0 && n5 == 0 { + b = tmp + return javaCPUProfile(b, int64(n4), parse) + } + } + return nil, errUnrecognized +} + +// cpuProfile returns a new Profile from C++ profilez data. +// b is the profile bytes after the header, period is the profiling +// period, and parse is a function to parse 8-byte chunks from the +// profile in its native endianness. +func cpuProfile(b []byte, period int64, parse func(b []byte) (uint64, []byte)) (*Profile, error) { + p := &Profile{ + Period: period * 1000, + PeriodType: &ValueType{Type: "cpu", Unit: "nanoseconds"}, + SampleType: []*ValueType{ + {Type: "samples", Unit: "count"}, + {Type: "cpu", Unit: "nanoseconds"}, + }, + } + var err error + if b, _, err = parseCPUSamples(b, parse, true, p); err != nil { + return nil, err + } + + // If *most* samples have the same second-to-the-bottom frame, it + // strongly suggests that it is an uninteresting artifact of + // measurement -- a stack frame pushed by the signal handler. The + // bottom frame is always correct as it is picked up from the signal + // structure, not the stack. Check if this is the case and if so, + // remove. + + // Remove up to two frames. + maxiter := 2 + // Allow one different sample for this many samples with the same + // second-to-last frame. + similarSamples := 32 + margin := len(p.Sample) / similarSamples + + for iter := 0; iter < maxiter; iter++ { + addr1 := make(map[uint64]int) + for _, s := range p.Sample { + if len(s.Location) > 1 { + a := s.Location[1].Address + addr1[a] = addr1[a] + 1 + } + } + + for id1, count := range addr1 { + if count >= len(p.Sample)-margin { + // Found uninteresting frame, strip it out from all samples + for _, s := range p.Sample { + if len(s.Location) > 1 && s.Location[1].Address == id1 { + s.Location = append(s.Location[:1], s.Location[2:]...) + } + } + break + } + } + } + + if err := p.ParseMemoryMap(bytes.NewBuffer(b)); err != nil { + return nil, err + } + + cleanupDuplicateLocations(p) + return p, nil +} + +func cleanupDuplicateLocations(p *Profile) { + // The profile handler may duplicate the leaf frame, because it gets + // its address both from stack unwinding and from the signal + // context. Detect this and delete the duplicate, which has been + // adjusted by -1. The leaf address should not be adjusted as it is + // not a call. + for _, s := range p.Sample { + if len(s.Location) > 1 && s.Location[0].Address == s.Location[1].Address+1 { + s.Location = append(s.Location[:1], s.Location[2:]...) + } + } +} + +// parseCPUSamples parses a collection of profilez samples from a +// profile. +// +// profilez samples are a repeated sequence of stack frames of the +// form: +// 1st word -- The number of times this stack was encountered. +// 2nd word -- The size of the stack (StackSize). +// 3rd word -- The first address on the stack. +// ... +// StackSize + 2 -- The last address on the stack +// The last stack trace is of the form: +// 1st word -- 0 +// 2nd word -- 1 +// 3rd word -- 0 +// +// Addresses from stack traces may point to the next instruction after +// each call. Optionally adjust by -1 to land somewhere on the actual +// call (except for the leaf, which is not a call). +func parseCPUSamples(b []byte, parse func(b []byte) (uint64, []byte), adjust bool, p *Profile) ([]byte, map[uint64]*Location, error) { + locs := make(map[uint64]*Location) + for len(b) > 0 { + var count, nstk uint64 + count, b = parse(b) + nstk, b = parse(b) + if b == nil || nstk > uint64(len(b)/4) { + return nil, nil, errUnrecognized + } + var sloc []*Location + addrs := make([]uint64, nstk) + for i := 0; i < int(nstk); i++ { + addrs[i], b = parse(b) + } + + if count == 0 && nstk == 1 && addrs[0] == 0 { + // End of data marker + break + } + for i, addr := range addrs { + if adjust && i > 0 { + addr-- + } + loc := locs[addr] + if loc == nil { + loc = &Location{ + Address: addr, + } + locs[addr] = loc + p.Location = append(p.Location, loc) + } + sloc = append(sloc, loc) + } + p.Sample = append(p.Sample, + &Sample{ + Value: []int64{int64(count), int64(count) * p.Period}, + Location: sloc, + }) + } + // Reached the end without finding the EOD marker. + return b, locs, nil +} + +// parseHeap parses a heapz legacy or a growthz profile and +// returns a newly populated Profile. +func parseHeap(b []byte) (p *Profile, err error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + if !s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + return nil, errUnrecognized + } + p = &Profile{} + + sampling := "" + hasAlloc := false + + line := s.Text() + p.PeriodType = &ValueType{Type: "space", Unit: "bytes"} + if header := heapHeaderRE.FindStringSubmatch(line); header != nil { + sampling, p.Period, hasAlloc, err = parseHeapHeader(line) + if err != nil { + return nil, err + } + } else if header = growthHeaderRE.FindStringSubmatch(line); header != nil { + p.Period = 1 + } else if header = fragmentationHeaderRE.FindStringSubmatch(line); header != nil { + p.Period = 1 + } else { + return nil, errUnrecognized + } + + if hasAlloc { + // Put alloc before inuse so that default pprof selection + // will prefer inuse_space. + p.SampleType = []*ValueType{ + {Type: "alloc_objects", Unit: "count"}, + {Type: "alloc_space", Unit: "bytes"}, + {Type: "inuse_objects", Unit: "count"}, + {Type: "inuse_space", Unit: "bytes"}, + } + } else { + p.SampleType = []*ValueType{ + {Type: "objects", Unit: "count"}, + {Type: "space", Unit: "bytes"}, + } + } + + locs := make(map[uint64]*Location) + for s.Scan() { + line := strings.TrimSpace(s.Text()) + + if isSpaceOrComment(line) { + continue + } + + if isMemoryMapSentinel(line) { + break + } + + value, blocksize, addrs, err := parseHeapSample(line, p.Period, sampling, hasAlloc) + if err != nil { + return nil, err + } + + var sloc []*Location + for _, addr := range addrs { + // Addresses from stack traces point to the next instruction after + // each call. Adjust by -1 to land somewhere on the actual call. + addr-- + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + + p.Sample = append(p.Sample, &Sample{ + Value: value, + Location: sloc, + NumLabel: map[string][]int64{"bytes": {blocksize}}, + }) + } + if err := s.Err(); err != nil { + return nil, err + } + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + return p, nil +} + +func parseHeapHeader(line string) (sampling string, period int64, hasAlloc bool, err error) { + header := heapHeaderRE.FindStringSubmatch(line) + if header == nil { + return "", 0, false, errUnrecognized + } + + if len(header[6]) > 0 { + if period, err = strconv.ParseInt(header[6], 10, 64); err != nil { + return "", 0, false, errUnrecognized + } + } + + if (header[3] != header[1] && header[3] != "0") || (header[4] != header[2] && header[4] != "0") { + hasAlloc = true + } + + switch header[5] { + case "heapz_v2", "heap_v2": + return "v2", period, hasAlloc, nil + case "heapprofile": + return "", 1, hasAlloc, nil + case "heap": + return "v2", period / 2, hasAlloc, nil + default: + return "", 0, false, errUnrecognized + } +} + +// parseHeapSample parses a single row from a heap profile into a new Sample. +func parseHeapSample(line string, rate int64, sampling string, includeAlloc bool) (value []int64, blocksize int64, addrs []uint64, err error) { + sampleData := heapSampleRE.FindStringSubmatch(line) + if len(sampleData) != 6 { + return nil, 0, nil, fmt.Errorf("unexpected number of sample values: got %d, want 6", len(sampleData)) + } + + // This is a local-scoped helper function to avoid needing to pass + // around rate, sampling and many return parameters. + addValues := func(countString, sizeString string, label string) error { + count, err := strconv.ParseInt(countString, 10, 64) + if err != nil { + return fmt.Errorf("malformed sample: %s: %v", line, err) + } + size, err := strconv.ParseInt(sizeString, 10, 64) + if err != nil { + return fmt.Errorf("malformed sample: %s: %v", line, err) + } + if count == 0 && size != 0 { + return fmt.Errorf("%s count was 0 but %s bytes was %d", label, label, size) + } + if count != 0 { + blocksize = size / count + if sampling == "v2" { + count, size = scaleHeapSample(count, size, rate) + } + } + value = append(value, count, size) + return nil + } + + if includeAlloc { + if err := addValues(sampleData[3], sampleData[4], "allocation"); err != nil { + return nil, 0, nil, err + } + } + + if err := addValues(sampleData[1], sampleData[2], "inuse"); err != nil { + return nil, 0, nil, err + } + + addrs, err = parseHexAddresses(sampleData[5]) + if err != nil { + return nil, 0, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + return value, blocksize, addrs, nil +} + +// parseHexAddresses extracts hex numbers from a string, attempts to convert +// each to an unsigned 64-bit number and returns the resulting numbers as a +// slice, or an error if the string contains hex numbers which are too large to +// handle (which means a malformed profile). +func parseHexAddresses(s string) ([]uint64, error) { + hexStrings := hexNumberRE.FindAllString(s, -1) + var addrs []uint64 + for _, s := range hexStrings { + if addr, err := strconv.ParseUint(s, 0, 64); err == nil { + addrs = append(addrs, addr) + } else { + return nil, fmt.Errorf("failed to parse as hex 64-bit number: %s", s) + } + } + return addrs, nil +} + +// scaleHeapSample adjusts the data from a heapz Sample to +// account for its probability of appearing in the collected +// data. heapz profiles are a sampling of the memory allocations +// requests in a program. We estimate the unsampled value by dividing +// each collected sample by its probability of appearing in the +// profile. heapz v2 profiles rely on a poisson process to determine +// which samples to collect, based on the desired average collection +// rate R. The probability of a sample of size S to appear in that +// profile is 1-exp(-S/R). +func scaleHeapSample(count, size, rate int64) (int64, int64) { + if count == 0 || size == 0 { + return 0, 0 + } + + if rate <= 1 { + // if rate==1 all samples were collected so no adjustment is needed. + // if rate<1 treat as unknown and skip scaling. + return count, size + } + + avgSize := float64(size) / float64(count) + scale := 1 / (1 - math.Exp(-avgSize/float64(rate))) + + return int64(float64(count) * scale), int64(float64(size) * scale) +} + +// parseContention parses a mutex or contention profile. There are 2 cases: +// "--- contentionz " for legacy C++ profiles (and backwards compatibility) +// "--- mutex:" or "--- contention:" for profiles generated by the Go runtime. +func parseContention(b []byte) (*Profile, error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + if !s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + return nil, errUnrecognized + } + + switch l := s.Text(); { + case strings.HasPrefix(l, "--- contentionz "): + case strings.HasPrefix(l, "--- mutex:"): + case strings.HasPrefix(l, "--- contention:"): + default: + return nil, errUnrecognized + } + + p := &Profile{ + PeriodType: &ValueType{Type: "contentions", Unit: "count"}, + Period: 1, + SampleType: []*ValueType{ + {Type: "contentions", Unit: "count"}, + {Type: "delay", Unit: "nanoseconds"}, + }, + } + + var cpuHz int64 + // Parse text of the form "attribute = value" before the samples. + const delimiter = "=" + for s.Scan() { + line := s.Text() + if line = strings.TrimSpace(line); isSpaceOrComment(line) { + continue + } + if strings.HasPrefix(line, "---") { + break + } + attr := strings.SplitN(line, delimiter, 2) + if len(attr) != 2 { + break + } + key, val := strings.TrimSpace(attr[0]), strings.TrimSpace(attr[1]) + var err error + switch key { + case "cycles/second": + if cpuHz, err = strconv.ParseInt(val, 0, 64); err != nil { + return nil, errUnrecognized + } + case "sampling period": + if p.Period, err = strconv.ParseInt(val, 0, 64); err != nil { + return nil, errUnrecognized + } + case "ms since reset": + ms, err := strconv.ParseInt(val, 0, 64) + if err != nil { + return nil, errUnrecognized + } + p.DurationNanos = ms * 1000 * 1000 + case "format": + // CPP contentionz profiles don't have format. + return nil, errUnrecognized + case "resolution": + // CPP contentionz profiles don't have resolution. + return nil, errUnrecognized + case "discarded samples": + default: + return nil, errUnrecognized + } + } + if err := s.Err(); err != nil { + return nil, err + } + + locs := make(map[uint64]*Location) + for { + line := strings.TrimSpace(s.Text()) + if strings.HasPrefix(line, "---") { + break + } + if !isSpaceOrComment(line) { + value, addrs, err := parseContentionSample(line, p.Period, cpuHz) + if err != nil { + return nil, err + } + var sloc []*Location + for _, addr := range addrs { + // Addresses from stack traces point to the next instruction after + // each call. Adjust by -1 to land somewhere on the actual call. + addr-- + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + p.Sample = append(p.Sample, &Sample{ + Value: value, + Location: sloc, + }) + } + if !s.Scan() { + break + } + } + if err := s.Err(); err != nil { + return nil, err + } + + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + + return p, nil +} + +// parseContentionSample parses a single row from a contention profile +// into a new Sample. +func parseContentionSample(line string, period, cpuHz int64) (value []int64, addrs []uint64, err error) { + sampleData := contentionSampleRE.FindStringSubmatch(line) + if sampleData == nil { + return nil, nil, errUnrecognized + } + + v1, err := strconv.ParseInt(sampleData[1], 10, 64) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + v2, err := strconv.ParseInt(sampleData[2], 10, 64) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + // Unsample values if period and cpuHz are available. + // - Delays are scaled to cycles and then to nanoseconds. + // - Contentions are scaled to cycles. + if period > 0 { + if cpuHz > 0 { + cpuGHz := float64(cpuHz) / 1e9 + v1 = int64(float64(v1) * float64(period) / cpuGHz) + } + v2 = v2 * period + } + + value = []int64{v2, v1} + addrs, err = parseHexAddresses(sampleData[3]) + if err != nil { + return nil, nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + + return value, addrs, nil +} + +// parseThread parses a Threadz profile and returns a new Profile. +func parseThread(b []byte) (*Profile, error) { + s := bufio.NewScanner(bytes.NewBuffer(b)) + // Skip past comments and empty lines seeking a real header. + for s.Scan() && isSpaceOrComment(s.Text()) { + } + + line := s.Text() + if m := threadzStartRE.FindStringSubmatch(line); m != nil { + // Advance over initial comments until first stack trace. + for s.Scan() { + if line = s.Text(); isMemoryMapSentinel(line) || strings.HasPrefix(line, "-") { + break + } + } + } else if t := threadStartRE.FindStringSubmatch(line); len(t) != 4 { + return nil, errUnrecognized + } + + p := &Profile{ + SampleType: []*ValueType{{Type: "thread", Unit: "count"}}, + PeriodType: &ValueType{Type: "thread", Unit: "count"}, + Period: 1, + } + + locs := make(map[uint64]*Location) + // Recognize each thread and populate profile samples. + for !isMemoryMapSentinel(line) { + if strings.HasPrefix(line, "---- no stack trace for") { + line = "" + break + } + if t := threadStartRE.FindStringSubmatch(line); len(t) != 4 { + return nil, errUnrecognized + } + + var addrs []uint64 + var err error + line, addrs, err = parseThreadSample(s) + if err != nil { + return nil, err + } + if len(addrs) == 0 { + // We got a --same as previous threads--. Bump counters. + if len(p.Sample) > 0 { + s := p.Sample[len(p.Sample)-1] + s.Value[0]++ + } + continue + } + + var sloc []*Location + for i, addr := range addrs { + // Addresses from stack traces point to the next instruction after + // each call. Adjust by -1 to land somewhere on the actual call + // (except for the leaf, which is not a call). + if i > 0 { + addr-- + } + loc := locs[addr] + if locs[addr] == nil { + loc = &Location{ + Address: addr, + } + p.Location = append(p.Location, loc) + locs[addr] = loc + } + sloc = append(sloc, loc) + } + + p.Sample = append(p.Sample, &Sample{ + Value: []int64{1}, + Location: sloc, + }) + } + + if err := parseAdditionalSections(s, p); err != nil { + return nil, err + } + + cleanupDuplicateLocations(p) + return p, nil +} + +// parseThreadSample parses a symbolized or unsymbolized stack trace. +// Returns the first line after the traceback, the sample (or nil if +// it hits a 'same-as-previous' marker) and an error. +func parseThreadSample(s *bufio.Scanner) (nextl string, addrs []uint64, err error) { + var line string + sameAsPrevious := false + for s.Scan() { + line = strings.TrimSpace(s.Text()) + if line == "" { + continue + } + + if strings.HasPrefix(line, "---") { + break + } + if strings.Contains(line, "same as previous thread") { + sameAsPrevious = true + continue + } + + curAddrs, err := parseHexAddresses(line) + if err != nil { + return "", nil, fmt.Errorf("malformed sample: %s: %v", line, err) + } + addrs = append(addrs, curAddrs...) + } + if err := s.Err(); err != nil { + return "", nil, err + } + if sameAsPrevious { + return line, nil, nil + } + return line, addrs, nil +} + +// parseAdditionalSections parses any additional sections in the +// profile, ignoring any unrecognized sections. +func parseAdditionalSections(s *bufio.Scanner, p *Profile) error { + for !isMemoryMapSentinel(s.Text()) && s.Scan() { + } + if err := s.Err(); err != nil { + return err + } + return p.ParseMemoryMapFromScanner(s) +} + +// ParseProcMaps parses a memory map in the format of /proc/self/maps. +// ParseMemoryMap should be called after setting on a profile to +// associate locations to the corresponding mapping based on their +// address. +func ParseProcMaps(rd io.Reader) ([]*Mapping, error) { + s := bufio.NewScanner(rd) + return parseProcMapsFromScanner(s) +} + +func parseProcMapsFromScanner(s *bufio.Scanner) ([]*Mapping, error) { + var mapping []*Mapping + + var attrs []string + const delimiter = "=" + r := strings.NewReplacer() + for s.Scan() { + line := r.Replace(removeLoggingInfo(s.Text())) + m, err := parseMappingEntry(line) + if err != nil { + if err == errUnrecognized { + // Recognize assignments of the form: attr=value, and replace + // $attr with value on subsequent mappings. + if attr := strings.SplitN(line, delimiter, 2); len(attr) == 2 { + attrs = append(attrs, "$"+strings.TrimSpace(attr[0]), strings.TrimSpace(attr[1])) + r = strings.NewReplacer(attrs...) + } + // Ignore any unrecognized entries + continue + } + return nil, err + } + if m == nil { + continue + } + mapping = append(mapping, m) + } + if err := s.Err(); err != nil { + return nil, err + } + return mapping, nil +} + +// removeLoggingInfo detects and removes log prefix entries generated +// by the glog package. If no logging prefix is detected, the string +// is returned unmodified. +func removeLoggingInfo(line string) string { + if match := logInfoRE.FindStringIndex(line); match != nil { + return line[match[1]:] + } + return line +} + +// ParseMemoryMap parses a memory map in the format of +// /proc/self/maps, and overrides the mappings in the current profile. +// It renumbers the samples and locations in the profile correspondingly. +func (p *Profile) ParseMemoryMap(rd io.Reader) error { + return p.ParseMemoryMapFromScanner(bufio.NewScanner(rd)) +} + +// ParseMemoryMapFromScanner parses a memory map in the format of +// /proc/self/maps or a variety of legacy format, and overrides the +// mappings in the current profile. It renumbers the samples and +// locations in the profile correspondingly. +func (p *Profile) ParseMemoryMapFromScanner(s *bufio.Scanner) error { + mapping, err := parseProcMapsFromScanner(s) + if err != nil { + return err + } + p.Mapping = append(p.Mapping, mapping...) + p.massageMappings() + p.remapLocationIDs() + p.remapFunctionIDs() + p.remapMappingIDs() + return nil +} + +func parseMappingEntry(l string) (*Mapping, error) { + var start, end, perm, file, offset, buildID string + if me := procMapsRE.FindStringSubmatch(l); len(me) == 6 { + start, end, perm, offset, file = me[1], me[2], me[3], me[4], me[5] + } else if me := briefMapsRE.FindStringSubmatch(l); len(me) == 7 { + start, end, perm, file, offset, buildID = me[1], me[2], me[3], me[4], me[5], me[6] + } else { + return nil, errUnrecognized + } + + var err error + mapping := &Mapping{ + File: file, + BuildID: buildID, + } + if perm != "" && !strings.Contains(perm, "x") { + // Skip non-executable entries. + return nil, nil + } + if mapping.Start, err = strconv.ParseUint(start, 16, 64); err != nil { + return nil, errUnrecognized + } + if mapping.Limit, err = strconv.ParseUint(end, 16, 64); err != nil { + return nil, errUnrecognized + } + if offset != "" { + if mapping.Offset, err = strconv.ParseUint(offset, 16, 64); err != nil { + return nil, errUnrecognized + } + } + return mapping, nil +} + +var memoryMapSentinels = []string{ + "--- Memory map: ---", + "MAPPED_LIBRARIES:", +} + +// isMemoryMapSentinel returns true if the string contains one of the +// known sentinels for memory map information. +func isMemoryMapSentinel(line string) bool { + for _, s := range memoryMapSentinels { + if strings.Contains(line, s) { + return true + } + } + return false +} + +func (p *Profile) addLegacyFrameInfo() { + switch { + case isProfileType(p, heapzSampleTypes): + p.DropFrames, p.KeepFrames = allocRxStr, allocSkipRxStr + case isProfileType(p, contentionzSampleTypes): + p.DropFrames, p.KeepFrames = lockRxStr, "" + default: + p.DropFrames, p.KeepFrames = cpuProfilerRxStr, "" + } +} + +var heapzSampleTypes = [][]string{ + {"allocations", "size"}, // early Go pprof profiles + {"objects", "space"}, + {"inuse_objects", "inuse_space"}, + {"alloc_objects", "alloc_space"}, + {"alloc_objects", "alloc_space", "inuse_objects", "inuse_space"}, // Go pprof legacy profiles +} +var contentionzSampleTypes = [][]string{ + {"contentions", "delay"}, +} + +func isProfileType(p *Profile, types [][]string) bool { + st := p.SampleType +nextType: + for _, t := range types { + if len(st) != len(t) { + continue + } + + for i := range st { + if st[i].Type != t[i] { + continue nextType + } + } + return true + } + return false +} + +var allocRxStr = strings.Join([]string{ + // POSIX entry points. + `calloc`, + `cfree`, + `malloc`, + `free`, + `memalign`, + `do_memalign`, + `(__)?posix_memalign`, + `pvalloc`, + `valloc`, + `realloc`, + + // TC malloc. + `tcmalloc::.*`, + `tc_calloc`, + `tc_cfree`, + `tc_malloc`, + `tc_free`, + `tc_memalign`, + `tc_posix_memalign`, + `tc_pvalloc`, + `tc_valloc`, + `tc_realloc`, + `tc_new`, + `tc_delete`, + `tc_newarray`, + `tc_deletearray`, + `tc_new_nothrow`, + `tc_newarray_nothrow`, + + // Memory-allocation routines on OS X. + `malloc_zone_malloc`, + `malloc_zone_calloc`, + `malloc_zone_valloc`, + `malloc_zone_realloc`, + `malloc_zone_memalign`, + `malloc_zone_free`, + + // Go runtime + `runtime\..*`, + + // Other misc. memory allocation routines + `BaseArena::.*`, + `(::)?do_malloc_no_errno`, + `(::)?do_malloc_pages`, + `(::)?do_malloc`, + `DoSampledAllocation`, + `MallocedMemBlock::MallocedMemBlock`, + `_M_allocate`, + `__builtin_(vec_)?delete`, + `__builtin_(vec_)?new`, + `__gnu_cxx::new_allocator::allocate`, + `__libc_malloc`, + `__malloc_alloc_template::allocate`, + `allocate`, + `cpp_alloc`, + `operator new(\[\])?`, + `simple_alloc::allocate`, +}, `|`) + +var allocSkipRxStr = strings.Join([]string{ + // Preserve Go runtime frames that appear in the middle/bottom of + // the stack. + `runtime\.panic`, + `runtime\.reflectcall`, + `runtime\.call[0-9]*`, +}, `|`) + +var cpuProfilerRxStr = strings.Join([]string{ + `ProfileData::Add`, + `ProfileData::prof_handler`, + `CpuProfiler::prof_handler`, + `__pthread_sighandler`, + `__restore`, +}, `|`) + +var lockRxStr = strings.Join([]string{ + `RecordLockProfileData`, + `(base::)?RecordLockProfileData.*`, + `(base::)?SubmitMutexProfileData.*`, + `(base::)?SubmitSpinLockProfileData.*`, + `(base::Mutex::)?AwaitCommon.*`, + `(base::Mutex::)?Unlock.*`, + `(base::Mutex::)?UnlockSlow.*`, + `(base::Mutex::)?ReaderUnlock.*`, + `(base::MutexLock::)?~MutexLock.*`, + `(Mutex::)?AwaitCommon.*`, + `(Mutex::)?Unlock.*`, + `(Mutex::)?UnlockSlow.*`, + `(Mutex::)?ReaderUnlock.*`, + `(MutexLock::)?~MutexLock.*`, + `(SpinLock::)?Unlock.*`, + `(SpinLock::)?SlowUnlock.*`, + `(SpinLockHolder::)?~SpinLockHolder.*`, +}, `|`) diff --git a/vendor/github.com/google/pprof/profile/merge.go b/vendor/github.com/google/pprof/profile/merge.go new file mode 100644 index 00000000..9978e733 --- /dev/null +++ b/vendor/github.com/google/pprof/profile/merge.go @@ -0,0 +1,481 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package profile + +import ( + "fmt" + "sort" + "strconv" + "strings" +) + +// Compact performs garbage collection on a profile to remove any +// unreferenced fields. This is useful to reduce the size of a profile +// after samples or locations have been removed. +func (p *Profile) Compact() *Profile { + p, _ = Merge([]*Profile{p}) + return p +} + +// Merge merges all the profiles in profs into a single Profile. +// Returns a new profile independent of the input profiles. The merged +// profile is compacted to eliminate unused samples, locations, +// functions and mappings. Profiles must have identical profile sample +// and period types or the merge will fail. profile.Period of the +// resulting profile will be the maximum of all profiles, and +// profile.TimeNanos will be the earliest nonzero one. Merges are +// associative with the caveat of the first profile having some +// specialization in how headers are combined. There may be other +// subtleties now or in the future regarding associativity. +func Merge(srcs []*Profile) (*Profile, error) { + if len(srcs) == 0 { + return nil, fmt.Errorf("no profiles to merge") + } + p, err := combineHeaders(srcs) + if err != nil { + return nil, err + } + + pm := &profileMerger{ + p: p, + samples: make(map[sampleKey]*Sample, len(srcs[0].Sample)), + locations: make(map[locationKey]*Location, len(srcs[0].Location)), + functions: make(map[functionKey]*Function, len(srcs[0].Function)), + mappings: make(map[mappingKey]*Mapping, len(srcs[0].Mapping)), + } + + for _, src := range srcs { + // Clear the profile-specific hash tables + pm.locationsByID = make(map[uint64]*Location, len(src.Location)) + pm.functionsByID = make(map[uint64]*Function, len(src.Function)) + pm.mappingsByID = make(map[uint64]mapInfo, len(src.Mapping)) + + if len(pm.mappings) == 0 && len(src.Mapping) > 0 { + // The Mapping list has the property that the first mapping + // represents the main binary. Take the first Mapping we see, + // otherwise the operations below will add mappings in an + // arbitrary order. + pm.mapMapping(src.Mapping[0]) + } + + for _, s := range src.Sample { + if !isZeroSample(s) { + pm.mapSample(s) + } + } + } + + for _, s := range p.Sample { + if isZeroSample(s) { + // If there are any zero samples, re-merge the profile to GC + // them. + return Merge([]*Profile{p}) + } + } + + return p, nil +} + +// Normalize normalizes the source profile by multiplying each value in profile by the +// ratio of the sum of the base profile's values of that sample type to the sum of the +// source profile's value of that sample type. +func (p *Profile) Normalize(pb *Profile) error { + + if err := p.compatible(pb); err != nil { + return err + } + + baseVals := make([]int64, len(p.SampleType)) + for _, s := range pb.Sample { + for i, v := range s.Value { + baseVals[i] += v + } + } + + srcVals := make([]int64, len(p.SampleType)) + for _, s := range p.Sample { + for i, v := range s.Value { + srcVals[i] += v + } + } + + normScale := make([]float64, len(baseVals)) + for i := range baseVals { + if srcVals[i] == 0 { + normScale[i] = 0.0 + } else { + normScale[i] = float64(baseVals[i]) / float64(srcVals[i]) + } + } + p.ScaleN(normScale) + return nil +} + +func isZeroSample(s *Sample) bool { + for _, v := range s.Value { + if v != 0 { + return false + } + } + return true +} + +type profileMerger struct { + p *Profile + + // Memoization tables within a profile. + locationsByID map[uint64]*Location + functionsByID map[uint64]*Function + mappingsByID map[uint64]mapInfo + + // Memoization tables for profile entities. + samples map[sampleKey]*Sample + locations map[locationKey]*Location + functions map[functionKey]*Function + mappings map[mappingKey]*Mapping +} + +type mapInfo struct { + m *Mapping + offset int64 +} + +func (pm *profileMerger) mapSample(src *Sample) *Sample { + s := &Sample{ + Location: make([]*Location, len(src.Location)), + Value: make([]int64, len(src.Value)), + Label: make(map[string][]string, len(src.Label)), + NumLabel: make(map[string][]int64, len(src.NumLabel)), + NumUnit: make(map[string][]string, len(src.NumLabel)), + } + for i, l := range src.Location { + s.Location[i] = pm.mapLocation(l) + } + for k, v := range src.Label { + vv := make([]string, len(v)) + copy(vv, v) + s.Label[k] = vv + } + for k, v := range src.NumLabel { + u := src.NumUnit[k] + vv := make([]int64, len(v)) + uu := make([]string, len(u)) + copy(vv, v) + copy(uu, u) + s.NumLabel[k] = vv + s.NumUnit[k] = uu + } + // Check memoization table. Must be done on the remapped location to + // account for the remapped mapping. Add current values to the + // existing sample. + k := s.key() + if ss, ok := pm.samples[k]; ok { + for i, v := range src.Value { + ss.Value[i] += v + } + return ss + } + copy(s.Value, src.Value) + pm.samples[k] = s + pm.p.Sample = append(pm.p.Sample, s) + return s +} + +// key generates sampleKey to be used as a key for maps. +func (sample *Sample) key() sampleKey { + ids := make([]string, len(sample.Location)) + for i, l := range sample.Location { + ids[i] = strconv.FormatUint(l.ID, 16) + } + + labels := make([]string, 0, len(sample.Label)) + for k, v := range sample.Label { + labels = append(labels, fmt.Sprintf("%q%q", k, v)) + } + sort.Strings(labels) + + numlabels := make([]string, 0, len(sample.NumLabel)) + for k, v := range sample.NumLabel { + numlabels = append(numlabels, fmt.Sprintf("%q%x%x", k, v, sample.NumUnit[k])) + } + sort.Strings(numlabels) + + return sampleKey{ + strings.Join(ids, "|"), + strings.Join(labels, ""), + strings.Join(numlabels, ""), + } +} + +type sampleKey struct { + locations string + labels string + numlabels string +} + +func (pm *profileMerger) mapLocation(src *Location) *Location { + if src == nil { + return nil + } + + if l, ok := pm.locationsByID[src.ID]; ok { + return l + } + + mi := pm.mapMapping(src.Mapping) + l := &Location{ + ID: uint64(len(pm.p.Location) + 1), + Mapping: mi.m, + Address: uint64(int64(src.Address) + mi.offset), + Line: make([]Line, len(src.Line)), + IsFolded: src.IsFolded, + } + for i, ln := range src.Line { + l.Line[i] = pm.mapLine(ln) + } + // Check memoization table. Must be done on the remapped location to + // account for the remapped mapping ID. + k := l.key() + if ll, ok := pm.locations[k]; ok { + pm.locationsByID[src.ID] = ll + return ll + } + pm.locationsByID[src.ID] = l + pm.locations[k] = l + pm.p.Location = append(pm.p.Location, l) + return l +} + +// key generates locationKey to be used as a key for maps. +func (l *Location) key() locationKey { + key := locationKey{ + addr: l.Address, + isFolded: l.IsFolded, + } + if l.Mapping != nil { + // Normalizes address to handle address space randomization. + key.addr -= l.Mapping.Start + key.mappingID = l.Mapping.ID + } + lines := make([]string, len(l.Line)*2) + for i, line := range l.Line { + if line.Function != nil { + lines[i*2] = strconv.FormatUint(line.Function.ID, 16) + } + lines[i*2+1] = strconv.FormatInt(line.Line, 16) + } + key.lines = strings.Join(lines, "|") + return key +} + +type locationKey struct { + addr, mappingID uint64 + lines string + isFolded bool +} + +func (pm *profileMerger) mapMapping(src *Mapping) mapInfo { + if src == nil { + return mapInfo{} + } + + if mi, ok := pm.mappingsByID[src.ID]; ok { + return mi + } + + // Check memoization tables. + mk := src.key() + if m, ok := pm.mappings[mk]; ok { + mi := mapInfo{m, int64(m.Start) - int64(src.Start)} + pm.mappingsByID[src.ID] = mi + return mi + } + m := &Mapping{ + ID: uint64(len(pm.p.Mapping) + 1), + Start: src.Start, + Limit: src.Limit, + Offset: src.Offset, + File: src.File, + BuildID: src.BuildID, + HasFunctions: src.HasFunctions, + HasFilenames: src.HasFilenames, + HasLineNumbers: src.HasLineNumbers, + HasInlineFrames: src.HasInlineFrames, + } + pm.p.Mapping = append(pm.p.Mapping, m) + + // Update memoization tables. + pm.mappings[mk] = m + mi := mapInfo{m, 0} + pm.mappingsByID[src.ID] = mi + return mi +} + +// key generates encoded strings of Mapping to be used as a key for +// maps. +func (m *Mapping) key() mappingKey { + // Normalize addresses to handle address space randomization. + // Round up to next 4K boundary to avoid minor discrepancies. + const mapsizeRounding = 0x1000 + + size := m.Limit - m.Start + size = size + mapsizeRounding - 1 + size = size - (size % mapsizeRounding) + key := mappingKey{ + size: size, + offset: m.Offset, + } + + switch { + case m.BuildID != "": + key.buildIDOrFile = m.BuildID + case m.File != "": + key.buildIDOrFile = m.File + default: + // A mapping containing neither build ID nor file name is a fake mapping. A + // key with empty buildIDOrFile is used for fake mappings so that they are + // treated as the same mapping during merging. + } + return key +} + +type mappingKey struct { + size, offset uint64 + buildIDOrFile string +} + +func (pm *profileMerger) mapLine(src Line) Line { + ln := Line{ + Function: pm.mapFunction(src.Function), + Line: src.Line, + } + return ln +} + +func (pm *profileMerger) mapFunction(src *Function) *Function { + if src == nil { + return nil + } + if f, ok := pm.functionsByID[src.ID]; ok { + return f + } + k := src.key() + if f, ok := pm.functions[k]; ok { + pm.functionsByID[src.ID] = f + return f + } + f := &Function{ + ID: uint64(len(pm.p.Function) + 1), + Name: src.Name, + SystemName: src.SystemName, + Filename: src.Filename, + StartLine: src.StartLine, + } + pm.functions[k] = f + pm.functionsByID[src.ID] = f + pm.p.Function = append(pm.p.Function, f) + return f +} + +// key generates a struct to be used as a key for maps. +func (f *Function) key() functionKey { + return functionKey{ + f.StartLine, + f.Name, + f.SystemName, + f.Filename, + } +} + +type functionKey struct { + startLine int64 + name, systemName, fileName string +} + +// combineHeaders checks that all profiles can be merged and returns +// their combined profile. +func combineHeaders(srcs []*Profile) (*Profile, error) { + for _, s := range srcs[1:] { + if err := srcs[0].compatible(s); err != nil { + return nil, err + } + } + + var timeNanos, durationNanos, period int64 + var comments []string + seenComments := map[string]bool{} + var defaultSampleType string + for _, s := range srcs { + if timeNanos == 0 || s.TimeNanos < timeNanos { + timeNanos = s.TimeNanos + } + durationNanos += s.DurationNanos + if period == 0 || period < s.Period { + period = s.Period + } + for _, c := range s.Comments { + if seen := seenComments[c]; !seen { + comments = append(comments, c) + seenComments[c] = true + } + } + if defaultSampleType == "" { + defaultSampleType = s.DefaultSampleType + } + } + + p := &Profile{ + SampleType: make([]*ValueType, len(srcs[0].SampleType)), + + DropFrames: srcs[0].DropFrames, + KeepFrames: srcs[0].KeepFrames, + + TimeNanos: timeNanos, + DurationNanos: durationNanos, + PeriodType: srcs[0].PeriodType, + Period: period, + + Comments: comments, + DefaultSampleType: defaultSampleType, + } + copy(p.SampleType, srcs[0].SampleType) + return p, nil +} + +// compatible determines if two profiles can be compared/merged. +// returns nil if the profiles are compatible; otherwise an error with +// details on the incompatibility. +func (p *Profile) compatible(pb *Profile) error { + if !equalValueType(p.PeriodType, pb.PeriodType) { + return fmt.Errorf("incompatible period types %v and %v", p.PeriodType, pb.PeriodType) + } + + if len(p.SampleType) != len(pb.SampleType) { + return fmt.Errorf("incompatible sample types %v and %v", p.SampleType, pb.SampleType) + } + + for i := range p.SampleType { + if !equalValueType(p.SampleType[i], pb.SampleType[i]) { + return fmt.Errorf("incompatible sample types %v and %v", p.SampleType, pb.SampleType) + } + } + return nil +} + +// equalValueType returns true if the two value types are semantically +// equal. It ignores the internal fields used during encode/decode. +func equalValueType(st1, st2 *ValueType) bool { + return st1.Type == st2.Type && st1.Unit == st2.Unit +} diff --git a/vendor/github.com/google/pprof/profile/profile.go b/vendor/github.com/google/pprof/profile/profile.go new file mode 100644 index 00000000..2590c8dd --- /dev/null +++ b/vendor/github.com/google/pprof/profile/profile.go @@ -0,0 +1,805 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package profile provides a representation of profile.proto and +// methods to encode/decode profiles in this format. +package profile + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "math" + "path/filepath" + "regexp" + "sort" + "strings" + "sync" + "time" +) + +// Profile is an in-memory representation of profile.proto. +type Profile struct { + SampleType []*ValueType + DefaultSampleType string + Sample []*Sample + Mapping []*Mapping + Location []*Location + Function []*Function + Comments []string + + DropFrames string + KeepFrames string + + TimeNanos int64 + DurationNanos int64 + PeriodType *ValueType + Period int64 + + // The following fields are modified during encoding and copying, + // so are protected by a Mutex. + encodeMu sync.Mutex + + commentX []int64 + dropFramesX int64 + keepFramesX int64 + stringTable []string + defaultSampleTypeX int64 +} + +// ValueType corresponds to Profile.ValueType +type ValueType struct { + Type string // cpu, wall, inuse_space, etc + Unit string // seconds, nanoseconds, bytes, etc + + typeX int64 + unitX int64 +} + +// Sample corresponds to Profile.Sample +type Sample struct { + Location []*Location + Value []int64 + Label map[string][]string + NumLabel map[string][]int64 + NumUnit map[string][]string + + locationIDX []uint64 + labelX []label +} + +// label corresponds to Profile.Label +type label struct { + keyX int64 + // Exactly one of the two following values must be set + strX int64 + numX int64 // Integer value for this label + // can be set if numX has value + unitX int64 +} + +// Mapping corresponds to Profile.Mapping +type Mapping struct { + ID uint64 + Start uint64 + Limit uint64 + Offset uint64 + File string + BuildID string + HasFunctions bool + HasFilenames bool + HasLineNumbers bool + HasInlineFrames bool + + fileX int64 + buildIDX int64 +} + +// Location corresponds to Profile.Location +type Location struct { + ID uint64 + Mapping *Mapping + Address uint64 + Line []Line + IsFolded bool + + mappingIDX uint64 +} + +// Line corresponds to Profile.Line +type Line struct { + Function *Function + Line int64 + + functionIDX uint64 +} + +// Function corresponds to Profile.Function +type Function struct { + ID uint64 + Name string + SystemName string + Filename string + StartLine int64 + + nameX int64 + systemNameX int64 + filenameX int64 +} + +// Parse parses a profile and checks for its validity. The input +// may be a gzip-compressed encoded protobuf or one of many legacy +// profile formats which may be unsupported in the future. +func Parse(r io.Reader) (*Profile, error) { + data, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + return ParseData(data) +} + +// ParseData parses a profile from a buffer and checks for its +// validity. +func ParseData(data []byte) (*Profile, error) { + var p *Profile + var err error + if len(data) >= 2 && data[0] == 0x1f && data[1] == 0x8b { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err == nil { + data, err = ioutil.ReadAll(gz) + } + if err != nil { + return nil, fmt.Errorf("decompressing profile: %v", err) + } + } + if p, err = ParseUncompressed(data); err != nil && err != errNoData && err != errConcatProfile { + p, err = parseLegacy(data) + } + + if err != nil { + return nil, fmt.Errorf("parsing profile: %v", err) + } + + if err := p.CheckValid(); err != nil { + return nil, fmt.Errorf("malformed profile: %v", err) + } + return p, nil +} + +var errUnrecognized = fmt.Errorf("unrecognized profile format") +var errMalformed = fmt.Errorf("malformed profile format") +var errNoData = fmt.Errorf("empty input file") +var errConcatProfile = fmt.Errorf("concatenated profiles detected") + +func parseLegacy(data []byte) (*Profile, error) { + parsers := []func([]byte) (*Profile, error){ + parseCPU, + parseHeap, + parseGoCount, // goroutine, threadcreate + parseThread, + parseContention, + parseJavaProfile, + } + + for _, parser := range parsers { + p, err := parser(data) + if err == nil { + p.addLegacyFrameInfo() + return p, nil + } + if err != errUnrecognized { + return nil, err + } + } + return nil, errUnrecognized +} + +// ParseUncompressed parses an uncompressed protobuf into a profile. +func ParseUncompressed(data []byte) (*Profile, error) { + if len(data) == 0 { + return nil, errNoData + } + p := &Profile{} + if err := unmarshal(data, p); err != nil { + return nil, err + } + + if err := p.postDecode(); err != nil { + return nil, err + } + + return p, nil +} + +var libRx = regexp.MustCompile(`([.]so$|[.]so[._][0-9]+)`) + +// massageMappings applies heuristic-based changes to the profile +// mappings to account for quirks of some environments. +func (p *Profile) massageMappings() { + // Merge adjacent regions with matching names, checking that the offsets match + if len(p.Mapping) > 1 { + mappings := []*Mapping{p.Mapping[0]} + for _, m := range p.Mapping[1:] { + lm := mappings[len(mappings)-1] + if adjacent(lm, m) { + lm.Limit = m.Limit + if m.File != "" { + lm.File = m.File + } + if m.BuildID != "" { + lm.BuildID = m.BuildID + } + p.updateLocationMapping(m, lm) + continue + } + mappings = append(mappings, m) + } + p.Mapping = mappings + } + + // Use heuristics to identify main binary and move it to the top of the list of mappings + for i, m := range p.Mapping { + file := strings.TrimSpace(strings.Replace(m.File, "(deleted)", "", -1)) + if len(file) == 0 { + continue + } + if len(libRx.FindStringSubmatch(file)) > 0 { + continue + } + if file[0] == '[' { + continue + } + // Swap what we guess is main to position 0. + p.Mapping[0], p.Mapping[i] = p.Mapping[i], p.Mapping[0] + break + } + + // Keep the mapping IDs neatly sorted + for i, m := range p.Mapping { + m.ID = uint64(i + 1) + } +} + +// adjacent returns whether two mapping entries represent the same +// mapping that has been split into two. Check that their addresses are adjacent, +// and if the offsets match, if they are available. +func adjacent(m1, m2 *Mapping) bool { + if m1.File != "" && m2.File != "" { + if m1.File != m2.File { + return false + } + } + if m1.BuildID != "" && m2.BuildID != "" { + if m1.BuildID != m2.BuildID { + return false + } + } + if m1.Limit != m2.Start { + return false + } + if m1.Offset != 0 && m2.Offset != 0 { + offset := m1.Offset + (m1.Limit - m1.Start) + if offset != m2.Offset { + return false + } + } + return true +} + +func (p *Profile) updateLocationMapping(from, to *Mapping) { + for _, l := range p.Location { + if l.Mapping == from { + l.Mapping = to + } + } +} + +func serialize(p *Profile) []byte { + p.encodeMu.Lock() + p.preEncode() + b := marshal(p) + p.encodeMu.Unlock() + return b +} + +// Write writes the profile as a gzip-compressed marshaled protobuf. +func (p *Profile) Write(w io.Writer) error { + zw := gzip.NewWriter(w) + defer zw.Close() + _, err := zw.Write(serialize(p)) + return err +} + +// WriteUncompressed writes the profile as a marshaled protobuf. +func (p *Profile) WriteUncompressed(w io.Writer) error { + _, err := w.Write(serialize(p)) + return err +} + +// CheckValid tests whether the profile is valid. Checks include, but are +// not limited to: +// - len(Profile.Sample[n].value) == len(Profile.value_unit) +// - Sample.id has a corresponding Profile.Location +func (p *Profile) CheckValid() error { + // Check that sample values are consistent + sampleLen := len(p.SampleType) + if sampleLen == 0 && len(p.Sample) != 0 { + return fmt.Errorf("missing sample type information") + } + for _, s := range p.Sample { + if s == nil { + return fmt.Errorf("profile has nil sample") + } + if len(s.Value) != sampleLen { + return fmt.Errorf("mismatch: sample has %d values vs. %d types", len(s.Value), len(p.SampleType)) + } + for _, l := range s.Location { + if l == nil { + return fmt.Errorf("sample has nil location") + } + } + } + + // Check that all mappings/locations/functions are in the tables + // Check that there are no duplicate ids + mappings := make(map[uint64]*Mapping, len(p.Mapping)) + for _, m := range p.Mapping { + if m == nil { + return fmt.Errorf("profile has nil mapping") + } + if m.ID == 0 { + return fmt.Errorf("found mapping with reserved ID=0") + } + if mappings[m.ID] != nil { + return fmt.Errorf("multiple mappings with same id: %d", m.ID) + } + mappings[m.ID] = m + } + functions := make(map[uint64]*Function, len(p.Function)) + for _, f := range p.Function { + if f == nil { + return fmt.Errorf("profile has nil function") + } + if f.ID == 0 { + return fmt.Errorf("found function with reserved ID=0") + } + if functions[f.ID] != nil { + return fmt.Errorf("multiple functions with same id: %d", f.ID) + } + functions[f.ID] = f + } + locations := make(map[uint64]*Location, len(p.Location)) + for _, l := range p.Location { + if l == nil { + return fmt.Errorf("profile has nil location") + } + if l.ID == 0 { + return fmt.Errorf("found location with reserved id=0") + } + if locations[l.ID] != nil { + return fmt.Errorf("multiple locations with same id: %d", l.ID) + } + locations[l.ID] = l + if m := l.Mapping; m != nil { + if m.ID == 0 || mappings[m.ID] != m { + return fmt.Errorf("inconsistent mapping %p: %d", m, m.ID) + } + } + for _, ln := range l.Line { + f := ln.Function + if f == nil { + return fmt.Errorf("location id: %d has a line with nil function", l.ID) + } + if f.ID == 0 || functions[f.ID] != f { + return fmt.Errorf("inconsistent function %p: %d", f, f.ID) + } + } + } + return nil +} + +// Aggregate merges the locations in the profile into equivalence +// classes preserving the request attributes. It also updates the +// samples to point to the merged locations. +func (p *Profile) Aggregate(inlineFrame, function, filename, linenumber, address bool) error { + for _, m := range p.Mapping { + m.HasInlineFrames = m.HasInlineFrames && inlineFrame + m.HasFunctions = m.HasFunctions && function + m.HasFilenames = m.HasFilenames && filename + m.HasLineNumbers = m.HasLineNumbers && linenumber + } + + // Aggregate functions + if !function || !filename { + for _, f := range p.Function { + if !function { + f.Name = "" + f.SystemName = "" + } + if !filename { + f.Filename = "" + } + } + } + + // Aggregate locations + if !inlineFrame || !address || !linenumber { + for _, l := range p.Location { + if !inlineFrame && len(l.Line) > 1 { + l.Line = l.Line[len(l.Line)-1:] + } + if !linenumber { + for i := range l.Line { + l.Line[i].Line = 0 + } + } + if !address { + l.Address = 0 + } + } + } + + return p.CheckValid() +} + +// NumLabelUnits returns a map of numeric label keys to the units +// associated with those keys and a map of those keys to any units +// that were encountered but not used. +// Unit for a given key is the first encountered unit for that key. If multiple +// units are encountered for values paired with a particular key, then the first +// unit encountered is used and all other units are returned in sorted order +// in map of ignored units. +// If no units are encountered for a particular key, the unit is then inferred +// based on the key. +func (p *Profile) NumLabelUnits() (map[string]string, map[string][]string) { + numLabelUnits := map[string]string{} + ignoredUnits := map[string]map[string]bool{} + encounteredKeys := map[string]bool{} + + // Determine units based on numeric tags for each sample. + for _, s := range p.Sample { + for k := range s.NumLabel { + encounteredKeys[k] = true + for _, unit := range s.NumUnit[k] { + if unit == "" { + continue + } + if wantUnit, ok := numLabelUnits[k]; !ok { + numLabelUnits[k] = unit + } else if wantUnit != unit { + if v, ok := ignoredUnits[k]; ok { + v[unit] = true + } else { + ignoredUnits[k] = map[string]bool{unit: true} + } + } + } + } + } + // Infer units for keys without any units associated with + // numeric tag values. + for key := range encounteredKeys { + unit := numLabelUnits[key] + if unit == "" { + switch key { + case "alignment", "request": + numLabelUnits[key] = "bytes" + default: + numLabelUnits[key] = key + } + } + } + + // Copy ignored units into more readable format + unitsIgnored := make(map[string][]string, len(ignoredUnits)) + for key, values := range ignoredUnits { + units := make([]string, len(values)) + i := 0 + for unit := range values { + units[i] = unit + i++ + } + sort.Strings(units) + unitsIgnored[key] = units + } + + return numLabelUnits, unitsIgnored +} + +// String dumps a text representation of a profile. Intended mainly +// for debugging purposes. +func (p *Profile) String() string { + ss := make([]string, 0, len(p.Comments)+len(p.Sample)+len(p.Mapping)+len(p.Location)) + for _, c := range p.Comments { + ss = append(ss, "Comment: "+c) + } + if pt := p.PeriodType; pt != nil { + ss = append(ss, fmt.Sprintf("PeriodType: %s %s", pt.Type, pt.Unit)) + } + ss = append(ss, fmt.Sprintf("Period: %d", p.Period)) + if p.TimeNanos != 0 { + ss = append(ss, fmt.Sprintf("Time: %v", time.Unix(0, p.TimeNanos))) + } + if p.DurationNanos != 0 { + ss = append(ss, fmt.Sprintf("Duration: %.4v", time.Duration(p.DurationNanos))) + } + + ss = append(ss, "Samples:") + var sh1 string + for _, s := range p.SampleType { + dflt := "" + if s.Type == p.DefaultSampleType { + dflt = "[dflt]" + } + sh1 = sh1 + fmt.Sprintf("%s/%s%s ", s.Type, s.Unit, dflt) + } + ss = append(ss, strings.TrimSpace(sh1)) + for _, s := range p.Sample { + ss = append(ss, s.string()) + } + + ss = append(ss, "Locations") + for _, l := range p.Location { + ss = append(ss, l.string()) + } + + ss = append(ss, "Mappings") + for _, m := range p.Mapping { + ss = append(ss, m.string()) + } + + return strings.Join(ss, "\n") + "\n" +} + +// string dumps a text representation of a mapping. Intended mainly +// for debugging purposes. +func (m *Mapping) string() string { + bits := "" + if m.HasFunctions { + bits = bits + "[FN]" + } + if m.HasFilenames { + bits = bits + "[FL]" + } + if m.HasLineNumbers { + bits = bits + "[LN]" + } + if m.HasInlineFrames { + bits = bits + "[IN]" + } + return fmt.Sprintf("%d: %#x/%#x/%#x %s %s %s", + m.ID, + m.Start, m.Limit, m.Offset, + m.File, + m.BuildID, + bits) +} + +// string dumps a text representation of a location. Intended mainly +// for debugging purposes. +func (l *Location) string() string { + ss := []string{} + locStr := fmt.Sprintf("%6d: %#x ", l.ID, l.Address) + if m := l.Mapping; m != nil { + locStr = locStr + fmt.Sprintf("M=%d ", m.ID) + } + if l.IsFolded { + locStr = locStr + "[F] " + } + if len(l.Line) == 0 { + ss = append(ss, locStr) + } + for li := range l.Line { + lnStr := "??" + if fn := l.Line[li].Function; fn != nil { + lnStr = fmt.Sprintf("%s %s:%d s=%d", + fn.Name, + fn.Filename, + l.Line[li].Line, + fn.StartLine) + if fn.Name != fn.SystemName { + lnStr = lnStr + "(" + fn.SystemName + ")" + } + } + ss = append(ss, locStr+lnStr) + // Do not print location details past the first line + locStr = " " + } + return strings.Join(ss, "\n") +} + +// string dumps a text representation of a sample. Intended mainly +// for debugging purposes. +func (s *Sample) string() string { + ss := []string{} + var sv string + for _, v := range s.Value { + sv = fmt.Sprintf("%s %10d", sv, v) + } + sv = sv + ": " + for _, l := range s.Location { + sv = sv + fmt.Sprintf("%d ", l.ID) + } + ss = append(ss, sv) + const labelHeader = " " + if len(s.Label) > 0 { + ss = append(ss, labelHeader+labelsToString(s.Label)) + } + if len(s.NumLabel) > 0 { + ss = append(ss, labelHeader+numLabelsToString(s.NumLabel, s.NumUnit)) + } + return strings.Join(ss, "\n") +} + +// labelsToString returns a string representation of a +// map representing labels. +func labelsToString(labels map[string][]string) string { + ls := []string{} + for k, v := range labels { + ls = append(ls, fmt.Sprintf("%s:%v", k, v)) + } + sort.Strings(ls) + return strings.Join(ls, " ") +} + +// numLabelsToString returns a string representation of a map +// representing numeric labels. +func numLabelsToString(numLabels map[string][]int64, numUnits map[string][]string) string { + ls := []string{} + for k, v := range numLabels { + units := numUnits[k] + var labelString string + if len(units) == len(v) { + values := make([]string, len(v)) + for i, vv := range v { + values[i] = fmt.Sprintf("%d %s", vv, units[i]) + } + labelString = fmt.Sprintf("%s:%v", k, values) + } else { + labelString = fmt.Sprintf("%s:%v", k, v) + } + ls = append(ls, labelString) + } + sort.Strings(ls) + return strings.Join(ls, " ") +} + +// SetLabel sets the specified key to the specified value for all samples in the +// profile. +func (p *Profile) SetLabel(key string, value []string) { + for _, sample := range p.Sample { + if sample.Label == nil { + sample.Label = map[string][]string{key: value} + } else { + sample.Label[key] = value + } + } +} + +// RemoveLabel removes all labels associated with the specified key for all +// samples in the profile. +func (p *Profile) RemoveLabel(key string) { + for _, sample := range p.Sample { + delete(sample.Label, key) + } +} + +// HasLabel returns true if a sample has a label with indicated key and value. +func (s *Sample) HasLabel(key, value string) bool { + for _, v := range s.Label[key] { + if v == value { + return true + } + } + return false +} + +// DiffBaseSample returns true if a sample belongs to the diff base and false +// otherwise. +func (s *Sample) DiffBaseSample() bool { + return s.HasLabel("pprof::base", "true") +} + +// Scale multiplies all sample values in a profile by a constant and keeps +// only samples that have at least one non-zero value. +func (p *Profile) Scale(ratio float64) { + if ratio == 1 { + return + } + ratios := make([]float64, len(p.SampleType)) + for i := range p.SampleType { + ratios[i] = ratio + } + p.ScaleN(ratios) +} + +// ScaleN multiplies each sample values in a sample by a different amount +// and keeps only samples that have at least one non-zero value. +func (p *Profile) ScaleN(ratios []float64) error { + if len(p.SampleType) != len(ratios) { + return fmt.Errorf("mismatched scale ratios, got %d, want %d", len(ratios), len(p.SampleType)) + } + allOnes := true + for _, r := range ratios { + if r != 1 { + allOnes = false + break + } + } + if allOnes { + return nil + } + fillIdx := 0 + for _, s := range p.Sample { + keepSample := false + for i, v := range s.Value { + if ratios[i] != 1 { + val := int64(math.Round(float64(v) * ratios[i])) + s.Value[i] = val + keepSample = keepSample || val != 0 + } + } + if keepSample { + p.Sample[fillIdx] = s + fillIdx++ + } + } + p.Sample = p.Sample[:fillIdx] + return nil +} + +// HasFunctions determines if all locations in this profile have +// symbolized function information. +func (p *Profile) HasFunctions() bool { + for _, l := range p.Location { + if l.Mapping != nil && !l.Mapping.HasFunctions { + return false + } + } + return true +} + +// HasFileLines determines if all locations in this profile have +// symbolized file and line number information. +func (p *Profile) HasFileLines() bool { + for _, l := range p.Location { + if l.Mapping != nil && (!l.Mapping.HasFilenames || !l.Mapping.HasLineNumbers) { + return false + } + } + return true +} + +// Unsymbolizable returns true if a mapping points to a binary for which +// locations can't be symbolized in principle, at least now. Examples are +// "[vdso]", [vsyscall]" and some others, see the code. +func (m *Mapping) Unsymbolizable() bool { + name := filepath.Base(m.File) + return strings.HasPrefix(name, "[") || strings.HasPrefix(name, "linux-vdso") || strings.HasPrefix(m.File, "/dev/dri/") +} + +// Copy makes a fully independent copy of a profile. +func (p *Profile) Copy() *Profile { + pp := &Profile{} + if err := unmarshal(serialize(p), pp); err != nil { + panic(err) + } + if err := pp.postDecode(); err != nil { + panic(err) + } + + return pp +} diff --git a/vendor/github.com/google/pprof/profile/proto.go b/vendor/github.com/google/pprof/profile/proto.go new file mode 100644 index 00000000..539ad3ab --- /dev/null +++ b/vendor/github.com/google/pprof/profile/proto.go @@ -0,0 +1,370 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file is a simple protocol buffer encoder and decoder. +// The format is described at +// https://developers.google.com/protocol-buffers/docs/encoding +// +// A protocol message must implement the message interface: +// decoder() []decoder +// encode(*buffer) +// +// The decode method returns a slice indexed by field number that gives the +// function to decode that field. +// The encode method encodes its receiver into the given buffer. +// +// The two methods are simple enough to be implemented by hand rather than +// by using a protocol compiler. +// +// See profile.go for examples of messages implementing this interface. +// +// There is no support for groups, message sets, or "has" bits. + +package profile + +import ( + "errors" + "fmt" +) + +type buffer struct { + field int // field tag + typ int // proto wire type code for field + u64 uint64 + data []byte + tmp [16]byte +} + +type decoder func(*buffer, message) error + +type message interface { + decoder() []decoder + encode(*buffer) +} + +func marshal(m message) []byte { + var b buffer + m.encode(&b) + return b.data +} + +func encodeVarint(b *buffer, x uint64) { + for x >= 128 { + b.data = append(b.data, byte(x)|0x80) + x >>= 7 + } + b.data = append(b.data, byte(x)) +} + +func encodeLength(b *buffer, tag int, len int) { + encodeVarint(b, uint64(tag)<<3|2) + encodeVarint(b, uint64(len)) +} + +func encodeUint64(b *buffer, tag int, x uint64) { + // append varint to b.data + encodeVarint(b, uint64(tag)<<3) + encodeVarint(b, x) +} + +func encodeUint64s(b *buffer, tag int, x []uint64) { + if len(x) > 2 { + // Use packed encoding + n1 := len(b.data) + for _, u := range x { + encodeVarint(b, u) + } + n2 := len(b.data) + encodeLength(b, tag, n2-n1) + n3 := len(b.data) + copy(b.tmp[:], b.data[n2:n3]) + copy(b.data[n1+(n3-n2):], b.data[n1:n2]) + copy(b.data[n1:], b.tmp[:n3-n2]) + return + } + for _, u := range x { + encodeUint64(b, tag, u) + } +} + +func encodeUint64Opt(b *buffer, tag int, x uint64) { + if x == 0 { + return + } + encodeUint64(b, tag, x) +} + +func encodeInt64(b *buffer, tag int, x int64) { + u := uint64(x) + encodeUint64(b, tag, u) +} + +func encodeInt64s(b *buffer, tag int, x []int64) { + if len(x) > 2 { + // Use packed encoding + n1 := len(b.data) + for _, u := range x { + encodeVarint(b, uint64(u)) + } + n2 := len(b.data) + encodeLength(b, tag, n2-n1) + n3 := len(b.data) + copy(b.tmp[:], b.data[n2:n3]) + copy(b.data[n1+(n3-n2):], b.data[n1:n2]) + copy(b.data[n1:], b.tmp[:n3-n2]) + return + } + for _, u := range x { + encodeInt64(b, tag, u) + } +} + +func encodeInt64Opt(b *buffer, tag int, x int64) { + if x == 0 { + return + } + encodeInt64(b, tag, x) +} + +func encodeString(b *buffer, tag int, x string) { + encodeLength(b, tag, len(x)) + b.data = append(b.data, x...) +} + +func encodeStrings(b *buffer, tag int, x []string) { + for _, s := range x { + encodeString(b, tag, s) + } +} + +func encodeBool(b *buffer, tag int, x bool) { + if x { + encodeUint64(b, tag, 1) + } else { + encodeUint64(b, tag, 0) + } +} + +func encodeBoolOpt(b *buffer, tag int, x bool) { + if x { + encodeBool(b, tag, x) + } +} + +func encodeMessage(b *buffer, tag int, m message) { + n1 := len(b.data) + m.encode(b) + n2 := len(b.data) + encodeLength(b, tag, n2-n1) + n3 := len(b.data) + copy(b.tmp[:], b.data[n2:n3]) + copy(b.data[n1+(n3-n2):], b.data[n1:n2]) + copy(b.data[n1:], b.tmp[:n3-n2]) +} + +func unmarshal(data []byte, m message) (err error) { + b := buffer{data: data, typ: 2} + return decodeMessage(&b, m) +} + +func le64(p []byte) uint64 { + return uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 | uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56 +} + +func le32(p []byte) uint32 { + return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 +} + +func decodeVarint(data []byte) (uint64, []byte, error) { + var u uint64 + for i := 0; ; i++ { + if i >= 10 || i >= len(data) { + return 0, nil, errors.New("bad varint") + } + u |= uint64(data[i]&0x7F) << uint(7*i) + if data[i]&0x80 == 0 { + return u, data[i+1:], nil + } + } +} + +func decodeField(b *buffer, data []byte) ([]byte, error) { + x, data, err := decodeVarint(data) + if err != nil { + return nil, err + } + b.field = int(x >> 3) + b.typ = int(x & 7) + b.data = nil + b.u64 = 0 + switch b.typ { + case 0: + b.u64, data, err = decodeVarint(data) + if err != nil { + return nil, err + } + case 1: + if len(data) < 8 { + return nil, errors.New("not enough data") + } + b.u64 = le64(data[:8]) + data = data[8:] + case 2: + var n uint64 + n, data, err = decodeVarint(data) + if err != nil { + return nil, err + } + if n > uint64(len(data)) { + return nil, errors.New("too much data") + } + b.data = data[:n] + data = data[n:] + case 5: + if len(data) < 4 { + return nil, errors.New("not enough data") + } + b.u64 = uint64(le32(data[:4])) + data = data[4:] + default: + return nil, fmt.Errorf("unknown wire type: %d", b.typ) + } + + return data, nil +} + +func checkType(b *buffer, typ int) error { + if b.typ != typ { + return errors.New("type mismatch") + } + return nil +} + +func decodeMessage(b *buffer, m message) error { + if err := checkType(b, 2); err != nil { + return err + } + dec := m.decoder() + data := b.data + for len(data) > 0 { + // pull varint field# + type + var err error + data, err = decodeField(b, data) + if err != nil { + return err + } + if b.field >= len(dec) || dec[b.field] == nil { + continue + } + if err := dec[b.field](b, m); err != nil { + return err + } + } + return nil +} + +func decodeInt64(b *buffer, x *int64) error { + if err := checkType(b, 0); err != nil { + return err + } + *x = int64(b.u64) + return nil +} + +func decodeInt64s(b *buffer, x *[]int64) error { + if b.typ == 2 { + // Packed encoding + data := b.data + tmp := make([]int64, 0, len(data)) // Maximally sized + for len(data) > 0 { + var u uint64 + var err error + + if u, data, err = decodeVarint(data); err != nil { + return err + } + tmp = append(tmp, int64(u)) + } + *x = append(*x, tmp...) + return nil + } + var i int64 + if err := decodeInt64(b, &i); err != nil { + return err + } + *x = append(*x, i) + return nil +} + +func decodeUint64(b *buffer, x *uint64) error { + if err := checkType(b, 0); err != nil { + return err + } + *x = b.u64 + return nil +} + +func decodeUint64s(b *buffer, x *[]uint64) error { + if b.typ == 2 { + data := b.data + // Packed encoding + tmp := make([]uint64, 0, len(data)) // Maximally sized + for len(data) > 0 { + var u uint64 + var err error + + if u, data, err = decodeVarint(data); err != nil { + return err + } + tmp = append(tmp, u) + } + *x = append(*x, tmp...) + return nil + } + var u uint64 + if err := decodeUint64(b, &u); err != nil { + return err + } + *x = append(*x, u) + return nil +} + +func decodeString(b *buffer, x *string) error { + if err := checkType(b, 2); err != nil { + return err + } + *x = string(b.data) + return nil +} + +func decodeStrings(b *buffer, x *[]string) error { + var s string + if err := decodeString(b, &s); err != nil { + return err + } + *x = append(*x, s) + return nil +} + +func decodeBool(b *buffer, x *bool) error { + if err := checkType(b, 0); err != nil { + return err + } + if int64(b.u64) == 0 { + *x = false + } else { + *x = true + } + return nil +} diff --git a/vendor/github.com/google/pprof/profile/prune.go b/vendor/github.com/google/pprof/profile/prune.go new file mode 100644 index 00000000..02d21a81 --- /dev/null +++ b/vendor/github.com/google/pprof/profile/prune.go @@ -0,0 +1,178 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements methods to remove frames from profiles. + +package profile + +import ( + "fmt" + "regexp" + "strings" +) + +var ( + reservedNames = []string{"(anonymous namespace)", "operator()"} + bracketRx = func() *regexp.Regexp { + var quotedNames []string + for _, name := range append(reservedNames, "(") { + quotedNames = append(quotedNames, regexp.QuoteMeta(name)) + } + return regexp.MustCompile(strings.Join(quotedNames, "|")) + }() +) + +// simplifyFunc does some primitive simplification of function names. +func simplifyFunc(f string) string { + // Account for leading '.' on the PPC ELF v1 ABI. + funcName := strings.TrimPrefix(f, ".") + // Account for unsimplified names -- try to remove the argument list by trimming + // starting from the first '(', but skipping reserved names that have '('. + for _, ind := range bracketRx.FindAllStringSubmatchIndex(funcName, -1) { + foundReserved := false + for _, res := range reservedNames { + if funcName[ind[0]:ind[1]] == res { + foundReserved = true + break + } + } + if !foundReserved { + funcName = funcName[:ind[0]] + break + } + } + return funcName +} + +// Prune removes all nodes beneath a node matching dropRx, and not +// matching keepRx. If the root node of a Sample matches, the sample +// will have an empty stack. +func (p *Profile) Prune(dropRx, keepRx *regexp.Regexp) { + prune := make(map[uint64]bool) + pruneBeneath := make(map[uint64]bool) + + for _, loc := range p.Location { + var i int + for i = len(loc.Line) - 1; i >= 0; i-- { + if fn := loc.Line[i].Function; fn != nil && fn.Name != "" { + funcName := simplifyFunc(fn.Name) + if dropRx.MatchString(funcName) { + if keepRx == nil || !keepRx.MatchString(funcName) { + break + } + } + } + } + + if i >= 0 { + // Found matching entry to prune. + pruneBeneath[loc.ID] = true + + // Remove the matching location. + if i == len(loc.Line)-1 { + // Matched the top entry: prune the whole location. + prune[loc.ID] = true + } else { + loc.Line = loc.Line[i+1:] + } + } + } + + // Prune locs from each Sample + for _, sample := range p.Sample { + // Scan from the root to the leaves to find the prune location. + // Do not prune frames before the first user frame, to avoid + // pruning everything. + foundUser := false + for i := len(sample.Location) - 1; i >= 0; i-- { + id := sample.Location[i].ID + if !prune[id] && !pruneBeneath[id] { + foundUser = true + continue + } + if !foundUser { + continue + } + if prune[id] { + sample.Location = sample.Location[i+1:] + break + } + if pruneBeneath[id] { + sample.Location = sample.Location[i:] + break + } + } + } +} + +// RemoveUninteresting prunes and elides profiles using built-in +// tables of uninteresting function names. +func (p *Profile) RemoveUninteresting() error { + var keep, drop *regexp.Regexp + var err error + + if p.DropFrames != "" { + if drop, err = regexp.Compile("^(" + p.DropFrames + ")$"); err != nil { + return fmt.Errorf("failed to compile regexp %s: %v", p.DropFrames, err) + } + if p.KeepFrames != "" { + if keep, err = regexp.Compile("^(" + p.KeepFrames + ")$"); err != nil { + return fmt.Errorf("failed to compile regexp %s: %v", p.KeepFrames, err) + } + } + p.Prune(drop, keep) + } + return nil +} + +// PruneFrom removes all nodes beneath the lowest node matching dropRx, not including itself. +// +// Please see the example below to understand this method as well as +// the difference from Prune method. +// +// A sample contains Location of [A,B,C,B,D] where D is the top frame and there's no inline. +// +// PruneFrom(A) returns [A,B,C,B,D] because there's no node beneath A. +// Prune(A, nil) returns [B,C,B,D] by removing A itself. +// +// PruneFrom(B) returns [B,C,B,D] by removing all nodes beneath the first B when scanning from the bottom. +// Prune(B, nil) returns [D] because a matching node is found by scanning from the root. +func (p *Profile) PruneFrom(dropRx *regexp.Regexp) { + pruneBeneath := make(map[uint64]bool) + + for _, loc := range p.Location { + for i := 0; i < len(loc.Line); i++ { + if fn := loc.Line[i].Function; fn != nil && fn.Name != "" { + funcName := simplifyFunc(fn.Name) + if dropRx.MatchString(funcName) { + // Found matching entry to prune. + pruneBeneath[loc.ID] = true + loc.Line = loc.Line[i:] + break + } + } + } + } + + // Prune locs from each Sample + for _, sample := range p.Sample { + // Scan from the bottom leaf to the root to find the prune location. + for i, loc := range sample.Location { + if pruneBeneath[loc.ID] { + sample.Location = sample.Location[i:] + break + } + } + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/.gitignore b/vendor/github.com/onsi/ginkgo/v2/.gitignore index edf0231c..18793c24 100644 --- a/vendor/github.com/onsi/ginkgo/v2/.gitignore +++ b/vendor/github.com/onsi/ginkgo/v2/.gitignore @@ -1,5 +1,5 @@ .DS_Store -TODO.md +TODO tmp/**/* *.coverprofile .vscode diff --git a/vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md b/vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md index d777b793..1eb88b6f 100644 --- a/vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md +++ b/vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md @@ -1,3 +1,255 @@ +## 2.12.1 + +### Fixes +- Print logr prefix if it exists (#1275) [90d4846] + +### Maintenance +- Bump actions/checkout from 3 to 4 (#1271) [555f543] +- Bump golang.org/x/sys from 0.11.0 to 0.12.0 (#1270) [d867b7d] + +## 2.12.0 + +### Features + +- feat: allow MustPassRepeatedly decorator to be set at suite level (#1266) [05de518] + +### Fixes + +- fix-errors-in-readme (#1244) [27c2f5d] + +### Maintenance + +Various chores/dependency bumps. + +## 2.11.0 + +In prior versions of Ginkgo specs the CLI filter flags (e.g. `--focus`, `--label-filter`) would _override_ any programmatic focus. This behavior has proved surprising and confusing in at least the following ways: + +- users cannot combine programmatic filters and CLI filters to more efficiently select subsets of tests +- CLI filters can override programmatic focus on CI systems resulting in an exit code of 0 despite the presence of (incorrectly!) committed focused specs. + +Going forward Ginkgo will AND all programmatic and CLI filters. Moreover, the presence of any programmatic focused tests will always result in a non-zero exit code. + +This change is technically a change in Ginkgo's external contract and may require some users to make changes to successfully adopt. Specifically: it's possible some users were intentionally using CLI filters to override programmatic focus. If this is you please open an issue so we can explore solutions to the underlying problem you are trying to solve. + +### Fixes +- Programmatic focus is no longer overwrriten by CLI filters [d6bba86] + +### Maintenance +- Bump github.com/onsi/gomega from 1.27.7 to 1.27.8 (#1218) [4a70a38] +- Bump golang.org/x/sys from 0.8.0 to 0.9.0 (#1219) [97eda4d] + +## 2.10.0 + +### Features +- feat(ginkgo/generators): add --tags flag (#1216) [a782a77] + adds a new --tags flag to ginkgo generate + +### Fixes +- Fix broken link of MIGRATING_TO_V2.md (#1217) [548d78e] + +### Maintenance +- Bump golang.org/x/tools from 0.9.1 to 0.9.3 (#1215) [2b76a5e] + +## 2.9.7 + +### Fixes +- fix race when multiple defercleanups are called in goroutines [07fc3a0] + +## 2.9.6 + +### Fixes +- fix: create parent directory before report files (#1212) [0ac65de] + +### Maintenance +- Bump github.com/onsi/gomega from 1.27.6 to 1.27.7 (#1202) [3e39231] + +## 2.9.5 + +### Fixes +- ensure the correct deterministic sort order is produced when ordered specs are generated by a helper function [7fa0b6b] + +### Maintenance +- fix generators link (#1200) [9f9d8b9] +- Bump golang.org/x/tools from 0.8.0 to 0.9.1 (#1196) [150e3f2] +- fix spelling err in docs (#1199) [0013b1a] +- Bump golang.org/x/sys from 0.7.0 to 0.8.0 (#1193) [9e9e3e5] + +## 2.9.4 + +### Fixes +- fix hang with ginkgo -p (#1192) [15d4bdc] - this addresses a _long_ standing issue related to Ginkgo hanging when a child process spawned by the test does not exit. + +- fix: fail fast may cause Serial spec or cleanup Node interrupted (#1178) [8dea88b] - prior to this there was a small gap in which specs on other processes might start even if one process has tried to abort the suite. + + +### Maintenance +- Document run order when multiple setup nodes are at the same nesting level [903be81] + +## 2.9.3 + +### Features +- Add RenderTimeline to GinkgoT() [c0c77b6] + +### Fixes +- update Measure deprecation message. fixes #1176 [227c662] +- add newlines to GinkgoLogr (#1170) (#1171) [0de0e7c] + +### Maintenance +- Bump commonmarker from 0.23.8 to 0.23.9 in /docs (#1183) [8b925ab] +- Bump nokogiri from 1.14.1 to 1.14.3 in /docs (#1184) [e3795a4] +- Bump golang.org/x/tools from 0.7.0 to 0.8.0 (#1182) [b453793] +- Bump actions/setup-go from 3 to 4 (#1164) [73ed75b] +- Bump github.com/onsi/gomega from 1.27.4 to 1.27.6 (#1173) [0a2bc64] +- Bump github.com/go-logr/logr from 1.2.3 to 1.2.4 (#1174) [f41c557] +- Bump golang.org/x/sys from 0.6.0 to 0.7.0 (#1179) [8e423e5] + +## 2.9.2 + +### Maintenance +- Bump github.com/go-task/slim-sprig (#1167) [3fcc5bf] +- Bump github.com/onsi/gomega from 1.27.3 to 1.27.4 (#1163) [6143ffe] + +## 2.9.1 + +### Fixes +This release fixes a longstanding issue where `ginkgo -coverpkg=./...` would not work. This is now resolved and fixes [#1161](https://github.com/onsi/ginkgo/issues/1161) and [#995](https://github.com/onsi/ginkgo/issues/995) +- Support -coverpkg=./... [26ca1b5] +- document coverpkg a bit more clearly [fc44c3b] + +### Maintenance +- bump various dependencies +- Improve Documentation and fix typo (#1158) [93de676] + +## 2.9.0 + +### Features +- AttachProgressReporter is an experimental feature that allows users to provide arbitrary information when a ProgressReport is requested [28801fe] + +- GinkgoT() has been expanded to include several Ginkgo-specific methods [2bd5a3b] + + The intent is to enable the development of third-party libraries that integrate deeply with Ginkgo using `GinkgoT()` to access Ginkgo's functionality. + +## 2.8.4 + +### Features +- Add OmitSuiteSetupNodes to JunitReportConfig (#1147) [979fbc2] +- Add a reference to ginkgolinter in docs.index.md (#1143) [8432589] + +### Fixes +- rename tools hack to see if it fixes things for downstream users [a8bb39a] + +### Maintenance +- Bump golang.org/x/text (#1144) [41b2a8a] +- Bump github.com/onsi/gomega from 1.27.0 to 1.27.1 (#1142) [7c4f583] + +## 2.8.3 + +Released to fix security issue in golang.org/x/net dependency + +### Maintenance + +- Bump golang.org/x/net from 0.6.0 to 0.7.0 (#1141) [fc1a02e] +- remove tools.go hack from documentation [0718693] + +## 2.8.2 + +Ginkgo now includes a `tools.go` file in the root directory of the `ginkgo` package. This should allow modules that simply `go get github.com/onsi/ginkgo/v2` to also pull in the CLI dependencies. This obviates the need for consumers of Ginkgo to have their own `tools.go` file and makes it simpler to ensure that the version of the `ginkgo` CLI being used matches the version of the library. You can simply run `go run github.com/onsi/ginkgo/v2/ginkgo` to run the version of the cli associated with your package go.mod. + +### Maintenance + +- Bump github.com/onsi/gomega from 1.26.0 to 1.27.0 (#1139) [5767b0a] +- Fix minor typos (#1138) [e1e9723] +- Fix link in V2 Migration Guide (#1137) [a588f60] + +## 2.8.1 + +### Fixes +- lock around default report output to avoid triggering the race detector when calling By from goroutines [2d5075a] +- don't run ReportEntries through sprintf [febbe38] + +### Maintenance +- Bump golang.org/x/tools from 0.5.0 to 0.6.0 (#1135) [11a4860] +- test: update matrix for Go 1.20 (#1130) [4890a62] +- Bump golang.org/x/sys from 0.4.0 to 0.5.0 (#1133) [a774638] +- Bump github.com/onsi/gomega from 1.25.0 to 1.26.0 (#1120) [3f233bd] +- Bump github-pages from 227 to 228 in /docs (#1131) [f9b8649] +- Bump activesupport from 6.0.6 to 6.0.6.1 in /docs (#1127) [6f8c042] +- Update index.md with instructions on how to upgrade Ginkgo [833a75e] + +## 2.8.0 + +### Features + +- Introduce GinkgoHelper() to track and exclude helper functions from potential CodeLocations [e19f556] + +Modeled after `testing.T.Helper()`. Now, rather than write code like: + +```go +func helper(model Model) { + Expect(model).WithOffset(1).To(BeValid()) + Expect(model.SerialNumber).WithOffset(1).To(MatchRegexp(/[a-f0-9]*/)) +} +``` + +you can stop tracking offsets (which makes nesting composing helpers nearly impossible) and simply write: + +```go +func helper(model Model) { + GinkgoHelper() + Expect(model).To(BeValid()) + Expect(model.SerialNumber).To(MatchRegexp(/[a-f0-9]*/)) +} +``` + +- Introduce GinkgoLabelFilter() and Label().MatchesLabelFilter() to make it possible to programmatically match filters (fixes #1119) [2f6597c] + +You can now write code like this: + +```go +BeforeSuite(func() { + if Label("slow").MatchesLabelFilter(GinkgoLabelFilter()) { + // do slow setup + } + + if Label("fast").MatchesLabelFilter(GinkgoLabelFilter()) { + // do fast setup + } +}) +``` + +to programmatically check whether a given set of labels will match the configured `--label-filter`. + +### Maintenance + +- Bump webrick from 1.7.0 to 1.8.1 in /docs (#1125) [ea4966e] +- cdeql: add ruby language (#1124) [9dd275b] +- dependabot: add bundler package-ecosystem for docs (#1123) [14e7bdd] + +## 2.7.1 + +### Fixes +- Bring back SuiteConfig.EmitSpecProgress to avoid compilation issue for consumers that set it manually [d2a1cb0] + +### Maintenance +- Bump github.com/onsi/gomega from 1.24.2 to 1.25.0 (#1118) [cafece6] +- Bump golang.org/x/tools from 0.4.0 to 0.5.0 (#1111) [eda66c2] +- Bump golang.org/x/sys from 0.3.0 to 0.4.0 (#1112) [ac5ccaa] +- Bump github.com/onsi/gomega from 1.24.1 to 1.24.2 (#1097) [eee6480] + +## 2.7.0 + +### Features +- Introduce ContinueOnFailure for Ordered containers [e0123ca] - Ordered containers that are also decorated with ContinueOnFailure will not stop running specs after the first spec fails. +- Support for bootstrap commands to use custom data for templates (#1110) [7a2b242] +- Support for labels and pending decorator in ginkgo outline output (#1113) [e6e3b98] +- Color aliases for custom color support (#1101) [49fab7a] + +### Fixes +- correctly ensure deterministic spec order, even if specs are generated by iterating over a map [89dda20] +- Fix a bug where timedout specs were not correctly treated as failures when determining whether or not to run AfterAlls in an Ordered container. +- Ensure go test coverprofile outputs to the expected location (#1105) [b0bd77b] + ## 2.6.1 ### Features @@ -76,7 +328,7 @@ to build tooling on top of as it has stronger guarantees to be stable from versi ### Fixes - correcting some typos (#1064) [1403d3c] -- fix flaky internal_integration interupt specs [2105ba3] +- fix flaky internal_integration interrupt specs [2105ba3] - Correct busted link in README [be6b5b9] ### Maintenance diff --git a/vendor/github.com/onsi/ginkgo/v2/README.md b/vendor/github.com/onsi/ginkgo/v2/README.md index d0473a46..cb23ffdf 100644 --- a/vendor/github.com/onsi/ginkgo/v2/README.md +++ b/vendor/github.com/onsi/ginkgo/v2/README.md @@ -15,7 +15,7 @@ import ( ... ) -Describe("Checking books out of the library", Label("library"), func() { +var _ = Describe("Checking books out of the library", Label("library"), func() { var library *libraries.Library var book *books.Book var valjean *users.User @@ -50,7 +50,7 @@ Describe("Checking books out of the library", Label("library"), func() { It("tells the user", func(ctx SpecContext) { err := valjean.Checkout(ctx, library, "Les Miserables") - Expect(error).To(MatchError("Les Miserables is currently checked out")) + Expect(err).To(MatchError("Les Miserables is currently checked out")) }, SpecTimeout(time.Second * 5)) It("lets the user place a hold and get notified later", func(ctx SpecContext) { @@ -74,7 +74,7 @@ Describe("Checking books out of the library", Label("library"), func() { When("the library does not have the book in question", func() { It("tells the reader the book is unavailable", func(ctx SpecContext) { err := valjean.Checkout(ctx, library, "Les Miserables") - Expect(error).To(MatchError("Les Miserables is not in the library catalog")) + Expect(err).To(MatchError("Les Miserables is not in the library catalog")) }, SpecTimeout(time.Second * 5)) }) }) diff --git a/vendor/github.com/onsi/ginkgo/v2/core_dsl.go b/vendor/github.com/onsi/ginkgo/v2/core_dsl.go index 4a14e50a..a244bdc1 100644 --- a/vendor/github.com/onsi/ginkgo/v2/core_dsl.go +++ b/vendor/github.com/onsi/ginkgo/v2/core_dsl.go @@ -92,11 +92,11 @@ type GinkgoWriterInterface interface { } /* -SpecContext is the context object passed into nodes that are subject to a timeout or need to be notified of an interrupt. It implements the standard context.Context interface but also contains additional helpers to provide an extensibility point for Ginkgo. (As an example, Gomega's Eventually can use the methods defined on SpecContext to provide deeper integratoin with Ginkgo). +SpecContext is the context object passed into nodes that are subject to a timeout or need to be notified of an interrupt. It implements the standard context.Context interface but also contains additional helpers to provide an extensibility point for Ginkgo. (As an example, Gomega's Eventually can use the methods defined on SpecContext to provide deeper integration with Ginkgo). You can do anything with SpecContext that you do with a typical context.Context including wrapping it with any of the context.With* methods. -Ginkgo will cancel the SpecContext when a node is interrupted (e.g. by the user sending an interupt signal) or when a node has exceeded it's allowed run-time. Note, however, that even in cases where a node has a deadline, SpecContext will not return a deadline via .Deadline(). This is because Ginkgo does not use a WithDeadline() context to model node deadlines as Ginkgo needs control over the precise timing of the context cancellation to ensure it can provide an accurate progress report at the moment of cancellation. +Ginkgo will cancel the SpecContext when a node is interrupted (e.g. by the user sending an interrupt signal) or when a node has exceeded its allowed run-time. Note, however, that even in cases where a node has a deadline, SpecContext will not return a deadline via .Deadline(). This is because Ginkgo does not use a WithDeadline() context to model node deadlines as Ginkgo needs control over the precise timing of the context cancellation to ensure it can provide an accurate progress report at the moment of cancellation. */ type SpecContext = internal.SpecContext @@ -163,6 +163,29 @@ func GinkgoParallelProcess() int { return suiteConfig.ParallelProcess } +/* +GinkgoHelper marks the function it's called in as a test helper. When a failure occurs inside a helper function, Ginkgo will skip the helper when analyzing the stack trace to identify where the failure occurred. + +This is an alternative, simpler, mechanism to passing in a skip offset when calling Fail or using Gomega. +*/ +func GinkgoHelper() { + types.MarkAsHelper(1) +} + +/* +GinkgoLabelFilter() returns the label filter configured for this suite via `--label-filter`. + +You can use this to manually check if a set of labels would satisfy the filter via: + + if (Label("cat", "dog").MatchesLabelFilter(GinkgoLabelFilter())) { + //... + } +*/ +func GinkgoLabelFilter() string { + suiteConfig, _ := GinkgoConfiguration() + return suiteConfig.LabelFilter +} + /* PauseOutputInterception() pauses Ginkgo's output interception. This is only relevant when running in parallel and output to stdout/stderr is being intercepted. You generally @@ -517,7 +540,7 @@ and will simply log the passed in text to the GinkgoWriter. If By is handed a f By will also generate and attach a ReportEntry to the spec. This will ensure that By annotations appear in Ginkgo's machine-readable reports. -Note that By does not generate a new Ginkgo node - rather it is simply synctactic sugar around GinkgoWriter and AddReportEntry +Note that By does not generate a new Ginkgo node - rather it is simply syntactic sugar around GinkgoWriter and AddReportEntry You can learn more about By here: https://onsi.github.io/ginkgo/#documenting-complex-specs-by */ func By(text string, callback ...func()) { @@ -720,7 +743,7 @@ For example: os.SetEnv("FOO", "BAR") }) -will register a cleanup handler that will set the environment variable "FOO" to it's current value (obtained by os.GetEnv("FOO")) after the spec runs and then sets the environment variable "FOO" to "BAR" for the current spec. +will register a cleanup handler that will set the environment variable "FOO" to its current value (obtained by os.GetEnv("FOO")) after the spec runs and then sets the environment variable "FOO" to "BAR" for the current spec. Similarly: @@ -748,3 +771,24 @@ func DeferCleanup(args ...interface{}) { } pushNode(internal.NewCleanupNode(deprecationTracker, fail, args...)) } + +/* +AttachProgressReporter allows you to register a function that will be called whenever Ginkgo generates a Progress Report. The contents returned by the function will be included in the report. + +**This is an experimental feature and the public-facing interface may change in a future minor version of Ginkgo** + +Progress Reports are generated: +- whenever the user explicitly requests one (via `SIGINFO` or `SIGUSR1`) +- on nodes decorated with PollProgressAfter +- on suites run with --poll-progress-after +- whenever a test times out + +Ginkgo uses Progress Reports to convey the current state of the test suite, including any running goroutines. By attaching a progress reporter you are able to supplement these reports with additional information. + +# AttachProgressReporter returns a function that can be called to detach the progress reporter + +You can learn more about AttachProgressReporter here: https://onsi.github.io/ginkgo/#attaching-additional-information-to-progress-reports +*/ +func AttachProgressReporter(reporter func() string) func() { + return global.Suite.AttachProgressReporter(reporter) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/decorator_dsl.go b/vendor/github.com/onsi/ginkgo/v2/decorator_dsl.go index e43d9cbb..c65af4ce 100644 --- a/vendor/github.com/onsi/ginkgo/v2/decorator_dsl.go +++ b/vendor/github.com/onsi/ginkgo/v2/decorator_dsl.go @@ -46,7 +46,7 @@ const Pending = internal.Pending /* Serial is a decorator that allows you to mark a spec or container as serial. These specs will never run in parallel with other specs. -Tests in ordered containers cannot be marked as serial - mark the ordered container instead. +Specs in ordered containers cannot be marked as serial - mark the ordered container instead. You can learn more here: https://onsi.github.io/ginkgo/#serial-specs You can learn more about decorators here: https://onsi.github.io/ginkgo/#decorator-reference @@ -54,7 +54,7 @@ You can learn more about decorators here: https://onsi.github.io/ginkgo/#decorat const Serial = internal.Serial /* -Ordered is a decorator that allows you to mark a container as ordered. Tests in the container will always run in the order they appear. +Ordered is a decorator that allows you to mark a container as ordered. Specs in the container will always run in the order they appear. They will never be randomized and they will never run in parallel with one another, though they may run in parallel with other specs. You can learn more here: https://onsi.github.io/ginkgo/#ordered-containers @@ -62,6 +62,16 @@ You can learn more about decorators here: https://onsi.github.io/ginkgo/#decorat */ const Ordered = internal.Ordered +/* +ContinueOnFailure is a decorator that allows you to mark an Ordered container to continue running specs even if failures occur. Ordinarily an ordered container will stop running specs after the first failure occurs. Note that if a BeforeAll or a BeforeEach/JustBeforeEach annotated with OncePerOrdered fails then no specs will run as the precondition for the Ordered container will consider to be failed. + +ContinueOnFailure only applies to the outermost Ordered container. Attempting to place ContinueOnFailure in a nested container will result in an error. + +You can learn more here: https://onsi.github.io/ginkgo/#ordered-containers +You can learn more about decorators here: https://onsi.github.io/ginkgo/#decorator-reference +*/ +const ContinueOnFailure = internal.ContinueOnFailure + /* OncePerOrdered is a decorator that allows you to mark outer BeforeEach, AfterEach, JustBeforeEach, and JustAfterEach setup nodes to run once per ordered context. Normally these setup nodes run around each individual spec, with OncePerOrdered they will run once around the set of specs in an ordered container. diff --git a/vendor/github.com/onsi/ginkgo/v2/formatter/formatter.go b/vendor/github.com/onsi/ginkgo/v2/formatter/formatter.go index da224eab..743555dd 100644 --- a/vendor/github.com/onsi/ginkgo/v2/formatter/formatter.go +++ b/vendor/github.com/onsi/ginkgo/v2/formatter/formatter.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "regexp" + "strconv" "strings" ) @@ -50,13 +51,35 @@ func NewWithNoColorBool(noColor bool) Formatter { } func New(colorMode ColorMode) Formatter { + colorAliases := map[string]int{ + "black": 0, + "red": 1, + "green": 2, + "yellow": 3, + "blue": 4, + "magenta": 5, + "cyan": 6, + "white": 7, + } + for colorAlias, n := range colorAliases { + colorAliases[fmt.Sprintf("bright-%s", colorAlias)] = n + 8 + } + getColor := func(color, defaultEscapeCode string) string { color = strings.ToUpper(strings.ReplaceAll(color, "-", "_")) envVar := fmt.Sprintf("GINKGO_CLI_COLOR_%s", color) - if escapeCode := os.Getenv(envVar); escapeCode != "" { - return escapeCode + envVarColor := os.Getenv(envVar) + if envVarColor == "" { + return defaultEscapeCode } - return defaultEscapeCode + if colorCode, ok := colorAliases[envVarColor]; ok { + return fmt.Sprintf("\x1b[38;5;%dm", colorCode) + } + colorCode, err := strconv.Atoi(envVarColor) + if err != nil || colorCode < 0 || colorCode > 255 { + return defaultEscapeCode + } + return fmt.Sprintf("\x1b[38;5;%dm", colorCode) } f := Formatter{ @@ -97,7 +120,10 @@ func (f Formatter) Fi(indentation uint, format string, args ...interface{}) stri } func (f Formatter) Fiw(indentation uint, maxWidth uint, format string, args ...interface{}) string { - out := fmt.Sprintf(f.style(format), args...) + out := f.style(format) + if len(args) > 0 { + out = fmt.Sprintf(out, args...) + } if indentation == 0 && maxWidth == 0 { return out diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/build/build_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/build/build_command.go new file mode 100644 index 00000000..5db5d1a7 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/build/build_command.go @@ -0,0 +1,63 @@ +package build + +import ( + "fmt" + + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/internal" + "github.com/onsi/ginkgo/v2/types" +) + +func BuildBuildCommand() command.Command { + var cliConfig = types.NewDefaultCLIConfig() + var goFlagsConfig = types.NewDefaultGoFlagsConfig() + + flags, err := types.BuildBuildCommandFlagSet(&cliConfig, &goFlagsConfig) + if err != nil { + panic(err) + } + + return command.Command{ + Name: "build", + Flags: flags, + Usage: "ginkgo build ", + ShortDoc: "Build the passed in (or the package in the current directory if left blank).", + DocLink: "precompiling-suites", + Command: func(args []string, _ []string) { + var errors []error + cliConfig, goFlagsConfig, errors = types.VetAndInitializeCLIAndGoConfig(cliConfig, goFlagsConfig) + command.AbortIfErrors("Ginkgo detected configuration issues:", errors) + + buildSpecs(args, cliConfig, goFlagsConfig) + }, + } +} + +func buildSpecs(args []string, cliConfig types.CLIConfig, goFlagsConfig types.GoFlagsConfig) { + suites := internal.FindSuites(args, cliConfig, false).WithoutState(internal.TestSuiteStateSkippedByFilter) + if len(suites) == 0 { + command.AbortWith("Found no test suites") + } + + internal.VerifyCLIAndFrameworkVersion(suites) + + opc := internal.NewOrderedParallelCompiler(cliConfig.ComputedNumCompilers()) + opc.StartCompiling(suites, goFlagsConfig) + + for { + suiteIdx, suite := opc.Next() + if suiteIdx >= len(suites) { + break + } + suites[suiteIdx] = suite + if suite.State.Is(internal.TestSuiteStateFailedToCompile) { + fmt.Println(suite.CompilationError.Error()) + } else { + fmt.Printf("Compiled %s.test\n", suite.PackageName) + } + } + + if suites.CountWithState(internal.TestSuiteStateFailedToCompile) > 0 { + command.AbortWith("Failed to compile all tests") + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/abort.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/abort.go new file mode 100644 index 00000000..2efd2860 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/abort.go @@ -0,0 +1,61 @@ +package command + +import "fmt" + +type AbortDetails struct { + ExitCode int + Error error + EmitUsage bool +} + +func Abort(details AbortDetails) { + panic(details) +} + +func AbortGracefullyWith(format string, args ...interface{}) { + Abort(AbortDetails{ + ExitCode: 0, + Error: fmt.Errorf(format, args...), + EmitUsage: false, + }) +} + +func AbortWith(format string, args ...interface{}) { + Abort(AbortDetails{ + ExitCode: 1, + Error: fmt.Errorf(format, args...), + EmitUsage: false, + }) +} + +func AbortWithUsage(format string, args ...interface{}) { + Abort(AbortDetails{ + ExitCode: 1, + Error: fmt.Errorf(format, args...), + EmitUsage: true, + }) +} + +func AbortIfError(preamble string, err error) { + if err != nil { + Abort(AbortDetails{ + ExitCode: 1, + Error: fmt.Errorf("%s\n%s", preamble, err.Error()), + EmitUsage: false, + }) + } +} + +func AbortIfErrors(preamble string, errors []error) { + if len(errors) > 0 { + out := "" + for _, err := range errors { + out += err.Error() + } + Abort(AbortDetails{ + ExitCode: 1, + Error: fmt.Errorf("%s\n%s", preamble, out), + EmitUsage: false, + }) + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/command.go new file mode 100644 index 00000000..12e0e565 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/command.go @@ -0,0 +1,50 @@ +package command + +import ( + "fmt" + "io" + "strings" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/types" +) + +type Command struct { + Name string + Flags types.GinkgoFlagSet + Usage string + ShortDoc string + Documentation string + DocLink string + Command func(args []string, additionalArgs []string) +} + +func (c Command) Run(args []string, additionalArgs []string) { + args, err := c.Flags.Parse(args) + if err != nil { + AbortWithUsage(err.Error()) + } + + c.Command(args, additionalArgs) +} + +func (c Command) EmitUsage(writer io.Writer) { + fmt.Fprintln(writer, formatter.F("{{bold}}"+c.Usage+"{{/}}")) + fmt.Fprintln(writer, formatter.F("{{gray}}%s{{/}}", strings.Repeat("-", len(c.Usage)))) + if c.ShortDoc != "" { + fmt.Fprintln(writer, formatter.Fiw(0, formatter.COLS, c.ShortDoc)) + fmt.Fprintln(writer, "") + } + if c.Documentation != "" { + fmt.Fprintln(writer, formatter.Fiw(0, formatter.COLS, c.Documentation)) + fmt.Fprintln(writer, "") + } + if c.DocLink != "" { + fmt.Fprintln(writer, formatter.Fi(0, "{{bold}}Learn more at:{{/}} {{cyan}}{{underline}}http://onsi.github.io/ginkgo/#%s{{/}}", c.DocLink)) + fmt.Fprintln(writer, "") + } + flagUsage := c.Flags.Usage() + if flagUsage != "" { + fmt.Fprintf(writer, formatter.F(flagUsage)) + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/program.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/program.go new file mode 100644 index 00000000..88dd8d6b --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/command/program.go @@ -0,0 +1,182 @@ +package command + +import ( + "fmt" + "io" + "os" + "strings" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/types" +) + +type Program struct { + Name string + Heading string + Commands []Command + DefaultCommand Command + DeprecatedCommands []DeprecatedCommand + + //For testing - leave as nil in production + OutWriter io.Writer + ErrWriter io.Writer + Exiter func(code int) +} + +type DeprecatedCommand struct { + Name string + Deprecation types.Deprecation +} + +func (p Program) RunAndExit(osArgs []string) { + var command Command + deprecationTracker := types.NewDeprecationTracker() + if p.Exiter == nil { + p.Exiter = os.Exit + } + if p.OutWriter == nil { + p.OutWriter = formatter.ColorableStdOut + } + if p.ErrWriter == nil { + p.ErrWriter = formatter.ColorableStdErr + } + + defer func() { + exitCode := 0 + + if r := recover(); r != nil { + details, ok := r.(AbortDetails) + if !ok { + panic(r) + } + + if details.Error != nil { + fmt.Fprintln(p.ErrWriter, formatter.F("{{red}}{{bold}}%s %s{{/}} {{red}}failed{{/}}", p.Name, command.Name)) + fmt.Fprintln(p.ErrWriter, formatter.Fi(1, details.Error.Error())) + } + if details.EmitUsage { + if details.Error != nil { + fmt.Fprintln(p.ErrWriter, "") + } + command.EmitUsage(p.ErrWriter) + } + exitCode = details.ExitCode + } + + command.Flags.ValidateDeprecations(deprecationTracker) + if deprecationTracker.DidTrackDeprecations() { + fmt.Fprintln(p.ErrWriter, deprecationTracker.DeprecationsReport()) + } + p.Exiter(exitCode) + return + }() + + args, additionalArgs := []string{}, []string{} + + foundDelimiter := false + for _, arg := range osArgs[1:] { + if !foundDelimiter { + if arg == "--" { + foundDelimiter = true + continue + } + } + + if foundDelimiter { + additionalArgs = append(additionalArgs, arg) + } else { + args = append(args, arg) + } + } + + command = p.DefaultCommand + if len(args) > 0 { + p.handleHelpRequestsAndExit(p.OutWriter, args) + if command.Name == args[0] { + args = args[1:] + } else { + for _, deprecatedCommand := range p.DeprecatedCommands { + if deprecatedCommand.Name == args[0] { + deprecationTracker.TrackDeprecation(deprecatedCommand.Deprecation) + return + } + } + for _, tryCommand := range p.Commands { + if tryCommand.Name == args[0] { + command, args = tryCommand, args[1:] + break + } + } + } + } + + command.Run(args, additionalArgs) +} + +func (p Program) handleHelpRequestsAndExit(writer io.Writer, args []string) { + if len(args) == 0 { + return + } + + matchesHelpFlag := func(args ...string) bool { + for _, arg := range args { + if arg == "--help" || arg == "-help" || arg == "-h" || arg == "--h" { + return true + } + } + return false + } + if len(args) == 1 { + if args[0] == "help" || matchesHelpFlag(args[0]) { + p.EmitUsage(writer) + Abort(AbortDetails{}) + } + } else { + var name string + if args[0] == "help" || matchesHelpFlag(args[0]) { + name = args[1] + } else if matchesHelpFlag(args[1:]...) { + name = args[0] + } else { + return + } + + if p.DefaultCommand.Name == name || p.Name == name { + p.DefaultCommand.EmitUsage(writer) + Abort(AbortDetails{}) + } + for _, command := range p.Commands { + if command.Name == name { + command.EmitUsage(writer) + Abort(AbortDetails{}) + } + } + + fmt.Fprintln(writer, formatter.F("{{red}}Unknown Command: {{bold}}%s{{/}}", name)) + fmt.Fprintln(writer, "") + p.EmitUsage(writer) + Abort(AbortDetails{ExitCode: 1}) + } + return +} + +func (p Program) EmitUsage(writer io.Writer) { + fmt.Fprintln(writer, formatter.F(p.Heading)) + fmt.Fprintln(writer, formatter.F("{{gray}}%s{{/}}", strings.Repeat("-", len(p.Heading)))) + fmt.Fprintln(writer, formatter.F("For usage information for a command, run {{bold}}%s help COMMAND{{/}}.", p.Name)) + fmt.Fprintln(writer, formatter.F("For usage information for the default command, run {{bold}}%s help %s{{/}} or {{bold}}%s help %s{{/}}.", p.Name, p.Name, p.Name, p.DefaultCommand.Name)) + fmt.Fprintln(writer, "") + fmt.Fprintln(writer, formatter.F("The following commands are available:")) + + fmt.Fprintln(writer, formatter.Fi(1, "{{bold}}%s{{/}} or %s {{bold}}%s{{/}} - {{gray}}%s{{/}}", p.Name, p.Name, p.DefaultCommand.Name, p.DefaultCommand.Usage)) + if p.DefaultCommand.ShortDoc != "" { + fmt.Fprintln(writer, formatter.Fi(2, p.DefaultCommand.ShortDoc)) + } + + for _, command := range p.Commands { + fmt.Fprintln(writer, formatter.Fi(1, "{{bold}}%s{{/}} - {{gray}}%s{{/}}", command.Name, command.Usage)) + if command.ShortDoc != "" { + fmt.Fprintln(writer, formatter.Fi(2, command.ShortDoc)) + } + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/boostrap_templates.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/boostrap_templates.go new file mode 100644 index 00000000..a367a1fc --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/boostrap_templates.go @@ -0,0 +1,48 @@ +package generators + +var bootstrapText = `package {{.Package}} + +import ( + "testing" + + {{.GinkgoImport}} + {{.GomegaImport}} +) + +func Test{{.FormattedName}}(t *testing.T) { + {{.GomegaPackage}}RegisterFailHandler({{.GinkgoPackage}}Fail) + {{.GinkgoPackage}}RunSpecs(t, "{{.FormattedName}} Suite") +} +` + +var agoutiBootstrapText = `package {{.Package}} + +import ( + "testing" + + {{.GinkgoImport}} + {{.GomegaImport}} + "github.com/sclevine/agouti" +) + +func Test{{.FormattedName}}(t *testing.T) { + {{.GomegaPackage}}RegisterFailHandler({{.GinkgoPackage}}Fail) + {{.GinkgoPackage}}RunSpecs(t, "{{.FormattedName}} Suite") +} + +var agoutiDriver *agouti.WebDriver + +var _ = {{.GinkgoPackage}}BeforeSuite(func() { + // Choose a WebDriver: + + agoutiDriver = agouti.PhantomJS() + // agoutiDriver = agouti.Selenium() + // agoutiDriver = agouti.ChromeDriver() + + {{.GomegaPackage}}Expect(agoutiDriver.Start()).To({{.GomegaPackage}}Succeed()) +}) + +var _ = {{.GinkgoPackage}}AfterSuite(func() { + {{.GomegaPackage}}Expect(agoutiDriver.Stop()).To({{.GomegaPackage}}Succeed()) +}) +` diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/bootstrap_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/bootstrap_command.go new file mode 100644 index 00000000..73aff0b7 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/bootstrap_command.go @@ -0,0 +1,133 @@ +package generators + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "text/template" + + sprig "github.com/go-task/slim-sprig" + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/internal" + "github.com/onsi/ginkgo/v2/types" +) + +func BuildBootstrapCommand() command.Command { + conf := GeneratorsConfig{} + flags, err := types.NewGinkgoFlagSet( + types.GinkgoFlags{ + {Name: "agouti", KeyPath: "Agouti", + Usage: "If set, bootstrap will generate a bootstrap file for writing Agouti tests"}, + {Name: "nodot", KeyPath: "NoDot", + Usage: "If set, bootstrap will generate a bootstrap test file that does not dot-import ginkgo and gomega"}, + {Name: "internal", KeyPath: "Internal", + Usage: "If set, bootstrap will generate a bootstrap test file that uses the regular package name (i.e. `package X`, not `package X_test`)"}, + {Name: "template", KeyPath: "CustomTemplate", + UsageArgument: "template-file", + Usage: "If specified, generate will use the contents of the file passed as the bootstrap template"}, + {Name: "template-data", KeyPath: "CustomTemplateData", + UsageArgument: "template-data-file", + Usage: "If specified, generate will use the contents of the file passed as data to be rendered in the bootstrap template"}, + }, + &conf, + types.GinkgoFlagSections{}, + ) + + if err != nil { + panic(err) + } + + return command.Command{ + Name: "bootstrap", + Usage: "ginkgo bootstrap", + ShortDoc: "Bootstrap a test suite for the current package", + Documentation: `Tests written in Ginkgo and Gomega require a small amount of boilerplate to hook into Go's testing infrastructure. + +{{bold}}ginkgo bootstrap{{/}} generates this boilerplate for you in a file named X_suite_test.go where X is the name of the package under test.`, + DocLink: "generators", + Flags: flags, + Command: func(_ []string, _ []string) { + generateBootstrap(conf) + }, + } +} + +type bootstrapData struct { + Package string + FormattedName string + + GinkgoImport string + GomegaImport string + GinkgoPackage string + GomegaPackage string + CustomData map[string]any +} + +func generateBootstrap(conf GeneratorsConfig) { + packageName, bootstrapFilePrefix, formattedName := getPackageAndFormattedName() + + data := bootstrapData{ + Package: determinePackageName(packageName, conf.Internal), + FormattedName: formattedName, + + GinkgoImport: `. "github.com/onsi/ginkgo/v2"`, + GomegaImport: `. "github.com/onsi/gomega"`, + GinkgoPackage: "", + GomegaPackage: "", + } + + if conf.NoDot { + data.GinkgoImport = `"github.com/onsi/ginkgo/v2"` + data.GomegaImport = `"github.com/onsi/gomega"` + data.GinkgoPackage = `ginkgo.` + data.GomegaPackage = `gomega.` + } + + targetFile := fmt.Sprintf("%s_suite_test.go", bootstrapFilePrefix) + if internal.FileExists(targetFile) { + command.AbortWith("{{bold}}%s{{/}} already exists", targetFile) + } else { + fmt.Printf("Generating ginkgo test suite bootstrap for %s in:\n\t%s\n", packageName, targetFile) + } + + f, err := os.Create(targetFile) + command.AbortIfError("Failed to create file:", err) + defer f.Close() + + var templateText string + if conf.CustomTemplate != "" { + tpl, err := os.ReadFile(conf.CustomTemplate) + command.AbortIfError("Failed to read custom bootstrap file:", err) + templateText = string(tpl) + if conf.CustomTemplateData != "" { + var tplCustomDataMap map[string]any + tplCustomData, err := os.ReadFile(conf.CustomTemplateData) + command.AbortIfError("Failed to read custom boostrap data file:", err) + if !json.Valid([]byte(tplCustomData)) { + command.AbortWith("Invalid JSON object in custom data file.") + } + //create map from the custom template data + json.Unmarshal(tplCustomData, &tplCustomDataMap) + data.CustomData = tplCustomDataMap + } + } else if conf.Agouti { + templateText = agoutiBootstrapText + } else { + templateText = bootstrapText + } + + //Setting the option to explicitly fail if template is rendered trying to access missing key + bootstrapTemplate, err := template.New("bootstrap").Funcs(sprig.TxtFuncMap()).Option("missingkey=error").Parse(templateText) + command.AbortIfError("Failed to parse bootstrap template:", err) + + buf := &bytes.Buffer{} + //Being explicit about failing sooner during template rendering + //when accessing custom data rather than during the go fmt command + err = bootstrapTemplate.Execute(buf, data) + command.AbortIfError("Failed to render bootstrap template:", err) + + buf.WriteTo(f) + + internal.GoFmt(targetFile) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go new file mode 100644 index 00000000..be01dec9 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go @@ -0,0 +1,264 @@ +package generators + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "path/filepath" + "strconv" + "strings" + "text/template" + + sprig "github.com/go-task/slim-sprig" + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/internal" + "github.com/onsi/ginkgo/v2/types" +) + +func BuildGenerateCommand() command.Command { + conf := GeneratorsConfig{} + flags, err := types.NewGinkgoFlagSet( + types.GinkgoFlags{ + {Name: "agouti", KeyPath: "Agouti", + Usage: "If set, generate will create a test file for writing Agouti tests"}, + {Name: "nodot", KeyPath: "NoDot", + Usage: "If set, generate will create a test file that does not dot-import ginkgo and gomega"}, + {Name: "internal", KeyPath: "Internal", + Usage: "If set, generate will create a test file that uses the regular package name (i.e. `package X`, not `package X_test`)"}, + {Name: "template", KeyPath: "CustomTemplate", + UsageArgument: "template-file", + Usage: "If specified, generate will use the contents of the file passed as the test file template"}, + {Name: "template-data", KeyPath: "CustomTemplateData", + UsageArgument: "template-data-file", + Usage: "If specified, generate will use the contents of the file passed as data to be rendered in the test file template"}, + {Name: "tags", KeyPath: "Tags", + UsageArgument: "build-tags", + Usage: "If specified, generate will create a test file that uses the given build tags (i.e. `--tags e2e,!unit` will add `//go:build e2e,!unit`)"}, + }, + &conf, + types.GinkgoFlagSections{}, + ) + + if err != nil { + panic(err) + } + + return command.Command{ + Name: "generate", + Usage: "ginkgo generate ", + ShortDoc: "Generate a test file named _test.go", + Documentation: `If the optional argument is omitted, a file named after the package in the current directory will be created. + +You can pass multiple to generate multiple files simultaneously. The resulting files are named _test.go. + +You can also pass a of the form "file.go" and generate will emit "file_test.go".`, + DocLink: "generators", + Flags: flags, + Command: func(args []string, _ []string) { + generateTestFiles(conf, args) + }, + } +} + +type specData struct { + BuildTags string + Package string + Subject string + PackageImportPath string + ImportPackage bool + + GinkgoImport string + GomegaImport string + GinkgoPackage string + GomegaPackage string + CustomData map[string]any +} + +func generateTestFiles(conf GeneratorsConfig, args []string) { + subjects := args + if len(subjects) == 0 { + subjects = []string{""} + } + for _, subject := range subjects { + generateTestFileForSubject(subject, conf) + } +} + +func generateTestFileForSubject(subject string, conf GeneratorsConfig) { + packageName, specFilePrefix, formattedName := getPackageAndFormattedName() + if subject != "" { + specFilePrefix = formatSubject(subject) + formattedName = prettifyName(specFilePrefix) + } + + if conf.Internal { + specFilePrefix = specFilePrefix + "_internal" + } + + data := specData{ + BuildTags: getBuildTags(conf.Tags), + Package: determinePackageName(packageName, conf.Internal), + Subject: formattedName, + PackageImportPath: getPackageImportPath(), + ImportPackage: !conf.Internal, + + GinkgoImport: `. "github.com/onsi/ginkgo/v2"`, + GomegaImport: `. "github.com/onsi/gomega"`, + GinkgoPackage: "", + GomegaPackage: "", + } + + if conf.NoDot { + data.GinkgoImport = `"github.com/onsi/ginkgo/v2"` + data.GomegaImport = `"github.com/onsi/gomega"` + data.GinkgoPackage = `ginkgo.` + data.GomegaPackage = `gomega.` + } + + targetFile := fmt.Sprintf("%s_test.go", specFilePrefix) + if internal.FileExists(targetFile) { + command.AbortWith("{{bold}}%s{{/}} already exists", targetFile) + } else { + fmt.Printf("Generating ginkgo test for %s in:\n %s\n", data.Subject, targetFile) + } + + f, err := os.Create(targetFile) + command.AbortIfError("Failed to create test file:", err) + defer f.Close() + + var templateText string + if conf.CustomTemplate != "" { + tpl, err := os.ReadFile(conf.CustomTemplate) + command.AbortIfError("Failed to read custom template file:", err) + templateText = string(tpl) + if conf.CustomTemplateData != "" { + var tplCustomDataMap map[string]any + tplCustomData, err := os.ReadFile(conf.CustomTemplateData) + command.AbortIfError("Failed to read custom template data file:", err) + if !json.Valid([]byte(tplCustomData)) { + command.AbortWith("Invalid JSON object in custom data file.") + } + //create map from the custom template data + json.Unmarshal(tplCustomData, &tplCustomDataMap) + data.CustomData = tplCustomDataMap + } + } else if conf.Agouti { + templateText = agoutiSpecText + } else { + templateText = specText + } + + //Setting the option to explicitly fail if template is rendered trying to access missing key + specTemplate, err := template.New("spec").Funcs(sprig.TxtFuncMap()).Option("missingkey=error").Parse(templateText) + command.AbortIfError("Failed to read parse test template:", err) + + //Being explicit about failing sooner during template rendering + //when accessing custom data rather than during the go fmt command + err = specTemplate.Execute(f, data) + command.AbortIfError("Failed to render bootstrap template:", err) + internal.GoFmt(targetFile) +} + +func formatSubject(name string) string { + name = strings.ReplaceAll(name, "-", "_") + name = strings.ReplaceAll(name, " ", "_") + name = strings.Split(name, ".go")[0] + name = strings.Split(name, "_test")[0] + return name +} + +// moduleName returns module name from go.mod from given module root directory +func moduleName(modRoot string) string { + modFile, err := os.Open(filepath.Join(modRoot, "go.mod")) + if err != nil { + return "" + } + + mod := make([]byte, 128) + _, err = modFile.Read(mod) + if err != nil { + return "" + } + + slashSlash := []byte("//") + moduleStr := []byte("module") + + for len(mod) > 0 { + line := mod + mod = nil + if i := bytes.IndexByte(line, '\n'); i >= 0 { + line, mod = line[:i], line[i+1:] + } + if i := bytes.Index(line, slashSlash); i >= 0 { + line = line[:i] + } + line = bytes.TrimSpace(line) + if !bytes.HasPrefix(line, moduleStr) { + continue + } + line = line[len(moduleStr):] + n := len(line) + line = bytes.TrimSpace(line) + if len(line) == n || len(line) == 0 { + continue + } + + if line[0] == '"' || line[0] == '`' { + p, err := strconv.Unquote(string(line)) + if err != nil { + return "" // malformed quoted string or multiline module path + } + return p + } + + return string(line) + } + + return "" // missing module path +} + +func findModuleRoot(dir string) (root string) { + dir = filepath.Clean(dir) + + // Look for enclosing go.mod. + for { + if fi, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil && !fi.IsDir() { + return dir + } + d := filepath.Dir(dir) + if d == dir { + break + } + dir = d + } + return "" +} + +func getPackageImportPath() string { + workingDir, err := os.Getwd() + if err != nil { + panic(err.Error()) + } + + sep := string(filepath.Separator) + + // Try go.mod file first + modRoot := findModuleRoot(workingDir) + if modRoot != "" { + modName := moduleName(modRoot) + if modName != "" { + cd := strings.ReplaceAll(workingDir, modRoot, "") + cd = strings.ReplaceAll(cd, sep, "/") + return modName + cd + } + } + + // Fallback to GOPATH structure + paths := strings.Split(workingDir, sep+"src"+sep) + if len(paths) == 1 { + fmt.Printf("\nCouldn't identify package import path.\n\n\tginkgo generate\n\nMust be run within a package directory under $GOPATH/src/...\nYou're going to have to change UNKNOWN_PACKAGE_PATH in the generated file...\n\n") + return "UNKNOWN_PACKAGE_PATH" + } + return filepath.ToSlash(paths[len(paths)-1]) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go new file mode 100644 index 00000000..4dab07d0 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go @@ -0,0 +1,43 @@ +package generators + +var specText = `{{.BuildTags}} +package {{.Package}} + +import ( + {{.GinkgoImport}} + {{.GomegaImport}} + + {{if .ImportPackage}}"{{.PackageImportPath}}"{{end}} +) + +var _ = {{.GinkgoPackage}}Describe("{{.Subject}}", func() { + +}) +` + +var agoutiSpecText = `{{.BuildTags}} +package {{.Package}} + +import ( + {{.GinkgoImport}} + {{.GomegaImport}} + "github.com/sclevine/agouti" + . "github.com/sclevine/agouti/matchers" + + {{if .ImportPackage}}"{{.PackageImportPath}}"{{end}} +) + +var _ = {{.GinkgoPackage}}Describe("{{.Subject}}", func() { + var page *agouti.Page + + {{.GinkgoPackage}}BeforeEach(func() { + var err error + page, err = agoutiDriver.NewPage() + {{.GomegaPackage}}Expect(err).NotTo({{.GomegaPackage}}HaveOccurred()) + }) + + {{.GinkgoPackage}}AfterEach(func() { + {{.GomegaPackage}}Expect(page.Destroy()).To({{.GomegaPackage}}Succeed()) + }) +}) +` diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go new file mode 100644 index 00000000..28c7aa6f --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go @@ -0,0 +1,76 @@ +package generators + +import ( + "fmt" + "go/build" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/onsi/ginkgo/v2/ginkgo/command" +) + +type GeneratorsConfig struct { + Agouti, NoDot, Internal bool + CustomTemplate string + CustomTemplateData string + Tags string +} + +func getPackageAndFormattedName() (string, string, string) { + path, err := os.Getwd() + command.AbortIfError("Could not get current working directory:", err) + + dirName := strings.ReplaceAll(filepath.Base(path), "-", "_") + dirName = strings.ReplaceAll(dirName, " ", "_") + + pkg, err := build.ImportDir(path, 0) + packageName := pkg.Name + if err != nil { + packageName = ensureLegalPackageName(dirName) + } + + formattedName := prettifyName(filepath.Base(path)) + return packageName, dirName, formattedName +} + +func ensureLegalPackageName(name string) string { + if name == "_" { + return "underscore" + } + if len(name) == 0 { + return "empty" + } + n, isDigitErr := strconv.Atoi(string(name[0])) + if isDigitErr == nil { + return []string{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}[n] + name[1:] + } + return name +} + +func prettifyName(name string) string { + name = strings.ReplaceAll(name, "-", " ") + name = strings.ReplaceAll(name, "_", " ") + name = strings.Title(name) + name = strings.ReplaceAll(name, " ", "") + return name +} + +func determinePackageName(name string, internal bool) string { + if internal { + return name + } + + return name + "_test" +} + +// getBuildTags returns the resultant string to be added. +// If the input string is not empty, then returns a `//go:build {}` string, +// otherwise returns an empty string. +func getBuildTags(tags string) string { + if tags != "" { + return fmt.Sprintf("//go:build %s\n", tags) + } + return "" +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/compile.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/compile.go new file mode 100644 index 00000000..86da7340 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/compile.go @@ -0,0 +1,161 @@ +package internal + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + "sync" + + "github.com/onsi/ginkgo/v2/types" +) + +func CompileSuite(suite TestSuite, goFlagsConfig types.GoFlagsConfig) TestSuite { + if suite.PathToCompiledTest != "" { + return suite + } + + suite.CompilationError = nil + + path, err := filepath.Abs(filepath.Join(suite.Path, suite.PackageName+".test")) + if err != nil { + suite.State = TestSuiteStateFailedToCompile + suite.CompilationError = fmt.Errorf("Failed to compute compilation target path:\n%s", err.Error()) + return suite + } + + ginkgoInvocationPath, _ := os.Getwd() + ginkgoInvocationPath, _ = filepath.Abs(ginkgoInvocationPath) + packagePath := suite.AbsPath() + pathToInvocationPath, err := filepath.Rel(packagePath, ginkgoInvocationPath) + if err != nil { + suite.State = TestSuiteStateFailedToCompile + suite.CompilationError = fmt.Errorf("Failed to get relative path from package to the current working directory:\n%s", err.Error()) + return suite + } + args, err := types.GenerateGoTestCompileArgs(goFlagsConfig, path, "./", pathToInvocationPath) + if err != nil { + suite.State = TestSuiteStateFailedToCompile + suite.CompilationError = fmt.Errorf("Failed to generate go test compile flags:\n%s", err.Error()) + return suite + } + + cmd := exec.Command("go", args...) + cmd.Dir = suite.Path + output, err := cmd.CombinedOutput() + if err != nil { + if len(output) > 0 { + suite.State = TestSuiteStateFailedToCompile + suite.CompilationError = fmt.Errorf("Failed to compile %s:\n\n%s", suite.PackageName, output) + } else { + suite.State = TestSuiteStateFailedToCompile + suite.CompilationError = fmt.Errorf("Failed to compile %s\n%s", suite.PackageName, err.Error()) + } + return suite + } + + if strings.Contains(string(output), "[no test files]") { + suite.State = TestSuiteStateSkippedDueToEmptyCompilation + return suite + } + + if len(output) > 0 { + fmt.Println(string(output)) + } + + if !FileExists(path) { + suite.State = TestSuiteStateFailedToCompile + suite.CompilationError = fmt.Errorf("Failed to compile %s:\nOutput file %s could not be found", suite.PackageName, path) + return suite + } + + suite.State = TestSuiteStateCompiled + suite.PathToCompiledTest = path + return suite +} + +func Cleanup(goFlagsConfig types.GoFlagsConfig, suites ...TestSuite) { + if goFlagsConfig.BinaryMustBePreserved() { + return + } + for _, suite := range suites { + if !suite.Precompiled { + os.Remove(suite.PathToCompiledTest) + } + } +} + +type parallelSuiteBundle struct { + suite TestSuite + compiled chan TestSuite +} + +type OrderedParallelCompiler struct { + mutex *sync.Mutex + stopped bool + numCompilers int + + idx int + numSuites int + completionChannels []chan TestSuite +} + +func NewOrderedParallelCompiler(numCompilers int) *OrderedParallelCompiler { + return &OrderedParallelCompiler{ + mutex: &sync.Mutex{}, + numCompilers: numCompilers, + } +} + +func (opc *OrderedParallelCompiler) StartCompiling(suites TestSuites, goFlagsConfig types.GoFlagsConfig) { + opc.stopped = false + opc.idx = 0 + opc.numSuites = len(suites) + opc.completionChannels = make([]chan TestSuite, opc.numSuites) + + toCompile := make(chan parallelSuiteBundle, opc.numCompilers) + for compiler := 0; compiler < opc.numCompilers; compiler++ { + go func() { + for bundle := range toCompile { + c, suite := bundle.compiled, bundle.suite + opc.mutex.Lock() + stopped := opc.stopped + opc.mutex.Unlock() + if !stopped { + suite = CompileSuite(suite, goFlagsConfig) + } + c <- suite + } + }() + } + + for idx, suite := range suites { + opc.completionChannels[idx] = make(chan TestSuite, 1) + toCompile <- parallelSuiteBundle{suite, opc.completionChannels[idx]} + if idx == 0 { //compile first suite serially + suite = <-opc.completionChannels[0] + opc.completionChannels[0] <- suite + } + } + + close(toCompile) +} + +func (opc *OrderedParallelCompiler) Next() (int, TestSuite) { + if opc.idx >= opc.numSuites { + return opc.numSuites, TestSuite{} + } + + idx := opc.idx + suite := <-opc.completionChannels[idx] + opc.idx = opc.idx + 1 + + return idx, suite +} + +func (opc *OrderedParallelCompiler) StopAndDrain() { + opc.mutex.Lock() + opc.stopped = true + opc.mutex.Unlock() +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go new file mode 100644 index 00000000..bd3c6d02 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go @@ -0,0 +1,237 @@ +package internal + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "strconv" + + "github.com/google/pprof/profile" + "github.com/onsi/ginkgo/v2/reporters" + "github.com/onsi/ginkgo/v2/types" +) + +func AbsPathForGeneratedAsset(assetName string, suite TestSuite, cliConfig types.CLIConfig, process int) string { + suffix := "" + if process != 0 { + suffix = fmt.Sprintf(".%d", process) + } + if cliConfig.OutputDir == "" { + return filepath.Join(suite.AbsPath(), assetName+suffix) + } + outputDir, _ := filepath.Abs(cliConfig.OutputDir) + return filepath.Join(outputDir, suite.NamespacedName()+"_"+assetName+suffix) +} + +func FinalizeProfilesAndReportsForSuites(suites TestSuites, cliConfig types.CLIConfig, suiteConfig types.SuiteConfig, reporterConfig types.ReporterConfig, goFlagsConfig types.GoFlagsConfig) ([]string, error) { + messages := []string{} + suitesWithProfiles := suites.WithState(TestSuiteStatePassed, TestSuiteStateFailed) //anything else won't have actually run and generated a profile + + // merge cover profiles if need be + if goFlagsConfig.Cover && !cliConfig.KeepSeparateCoverprofiles { + coverProfiles := []string{} + for _, suite := range suitesWithProfiles { + if !suite.HasProgrammaticFocus { + coverProfiles = append(coverProfiles, AbsPathForGeneratedAsset(goFlagsConfig.CoverProfile, suite, cliConfig, 0)) + } + } + + if len(coverProfiles) > 0 { + dst := goFlagsConfig.CoverProfile + if cliConfig.OutputDir != "" { + dst = filepath.Join(cliConfig.OutputDir, goFlagsConfig.CoverProfile) + } + err := MergeAndCleanupCoverProfiles(coverProfiles, dst) + if err != nil { + return messages, err + } + coverage, err := GetCoverageFromCoverProfile(dst) + if err != nil { + return messages, err + } + if coverage == 0 { + messages = append(messages, "composite coverage: [no statements]") + } else if suitesWithProfiles.AnyHaveProgrammaticFocus() { + messages = append(messages, fmt.Sprintf("composite coverage: %.1f%% of statements however some suites did not contribute because they included programatically focused specs", coverage)) + } else { + messages = append(messages, fmt.Sprintf("composite coverage: %.1f%% of statements", coverage)) + } + } else { + messages = append(messages, "no composite coverage computed: all suites included programatically focused specs") + } + } + + // copy binaries if need be + for _, suite := range suitesWithProfiles { + if goFlagsConfig.BinaryMustBePreserved() && cliConfig.OutputDir != "" { + src := suite.PathToCompiledTest + dst := filepath.Join(cliConfig.OutputDir, suite.NamespacedName()+".test") + if suite.Precompiled { + if err := CopyFile(src, dst); err != nil { + return messages, err + } + } else { + if err := os.Rename(src, dst); err != nil { + return messages, err + } + } + } + } + + type reportFormat struct { + ReportName string + GenerateFunc func(types.Report, string) error + MergeFunc func([]string, string) ([]string, error) + } + reportFormats := []reportFormat{} + if reporterConfig.JSONReport != "" { + reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.JSONReport, GenerateFunc: reporters.GenerateJSONReport, MergeFunc: reporters.MergeAndCleanupJSONReports}) + } + if reporterConfig.JUnitReport != "" { + reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.JUnitReport, GenerateFunc: reporters.GenerateJUnitReport, MergeFunc: reporters.MergeAndCleanupJUnitReports}) + } + if reporterConfig.TeamcityReport != "" { + reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.TeamcityReport, GenerateFunc: reporters.GenerateTeamcityReport, MergeFunc: reporters.MergeAndCleanupTeamcityReports}) + } + + // Generate reports for suites that failed to run + reportableSuites := suites.ThatAreGinkgoSuites() + for _, suite := range reportableSuites.WithState(TestSuiteStateFailedToCompile, TestSuiteStateFailedDueToTimeout, TestSuiteStateSkippedDueToPriorFailures, TestSuiteStateSkippedDueToEmptyCompilation) { + report := types.Report{ + SuitePath: suite.AbsPath(), + SuiteConfig: suiteConfig, + SuiteSucceeded: false, + } + switch suite.State { + case TestSuiteStateFailedToCompile: + report.SpecialSuiteFailureReasons = append(report.SpecialSuiteFailureReasons, suite.CompilationError.Error()) + case TestSuiteStateFailedDueToTimeout: + report.SpecialSuiteFailureReasons = append(report.SpecialSuiteFailureReasons, TIMEOUT_ELAPSED_FAILURE_REASON) + case TestSuiteStateSkippedDueToPriorFailures: + report.SpecialSuiteFailureReasons = append(report.SpecialSuiteFailureReasons, PRIOR_FAILURES_FAILURE_REASON) + case TestSuiteStateSkippedDueToEmptyCompilation: + report.SpecialSuiteFailureReasons = append(report.SpecialSuiteFailureReasons, EMPTY_SKIP_FAILURE_REASON) + report.SuiteSucceeded = true + } + + for _, format := range reportFormats { + format.GenerateFunc(report, AbsPathForGeneratedAsset(format.ReportName, suite, cliConfig, 0)) + } + } + + // Merge reports unless we've been asked to keep them separate + if !cliConfig.KeepSeparateReports { + for _, format := range reportFormats { + reports := []string{} + for _, suite := range reportableSuites { + reports = append(reports, AbsPathForGeneratedAsset(format.ReportName, suite, cliConfig, 0)) + } + dst := format.ReportName + if cliConfig.OutputDir != "" { + dst = filepath.Join(cliConfig.OutputDir, format.ReportName) + } + mergeMessages, err := format.MergeFunc(reports, dst) + messages = append(messages, mergeMessages...) + if err != nil { + return messages, err + } + } + } + + return messages, nil +} + +//loads each profile, combines them, deletes them, stores them in destination +func MergeAndCleanupCoverProfiles(profiles []string, destination string) error { + combined := &bytes.Buffer{} + modeRegex := regexp.MustCompile(`^mode: .*\n`) + for i, profile := range profiles { + contents, err := os.ReadFile(profile) + if err != nil { + return fmt.Errorf("Unable to read coverage file %s:\n%s", profile, err.Error()) + } + os.Remove(profile) + + // remove the cover mode line from every file + // except the first one + if i > 0 { + contents = modeRegex.ReplaceAll(contents, []byte{}) + } + + _, err = combined.Write(contents) + + // Add a newline to the end of every file if missing. + if err == nil && len(contents) > 0 && contents[len(contents)-1] != '\n' { + _, err = combined.Write([]byte("\n")) + } + + if err != nil { + return fmt.Errorf("Unable to append to coverprofile:\n%s", err.Error()) + } + } + + err := os.WriteFile(destination, combined.Bytes(), 0666) + if err != nil { + return fmt.Errorf("Unable to create combined cover profile:\n%s", err.Error()) + } + return nil +} + +func GetCoverageFromCoverProfile(profile string) (float64, error) { + cmd := exec.Command("go", "tool", "cover", "-func", profile) + output, err := cmd.CombinedOutput() + if err != nil { + return 0, fmt.Errorf("Could not process Coverprofile %s: %s", profile, err.Error()) + } + re := regexp.MustCompile(`total:\s*\(statements\)\s*(\d*\.\d*)\%`) + matches := re.FindStringSubmatch(string(output)) + if matches == nil { + return 0, fmt.Errorf("Could not parse Coverprofile to compute coverage percentage") + } + coverageString := matches[1] + coverage, err := strconv.ParseFloat(coverageString, 64) + if err != nil { + return 0, fmt.Errorf("Could not parse Coverprofile to compute coverage percentage: %s", err.Error()) + } + + return coverage, nil +} + +func MergeProfiles(profilePaths []string, destination string) error { + profiles := []*profile.Profile{} + for _, profilePath := range profilePaths { + proFile, err := os.Open(profilePath) + if err != nil { + return fmt.Errorf("Could not open profile: %s\n%s", profilePath, err.Error()) + } + prof, err := profile.Parse(proFile) + if err != nil { + return fmt.Errorf("Could not parse profile: %s\n%s", profilePath, err.Error()) + } + profiles = append(profiles, prof) + os.Remove(profilePath) + } + + mergedProfile, err := profile.Merge(profiles) + if err != nil { + return fmt.Errorf("Could not merge profiles:\n%s", err.Error()) + } + + outFile, err := os.Create(destination) + if err != nil { + return fmt.Errorf("Could not create merged profile %s:\n%s", destination, err.Error()) + } + err = mergedProfile.Write(outFile) + if err != nil { + return fmt.Errorf("Could not write merged profile %s:\n%s", destination, err.Error()) + } + err = outFile.Close() + if err != nil { + return fmt.Errorf("Could not close merged profile %s:\n%s", destination, err.Error()) + } + + return nil +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go new file mode 100644 index 00000000..41052ea1 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go @@ -0,0 +1,355 @@ +package internal + +import ( + "bytes" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + "syscall" + "time" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/internal/parallel_support" + "github.com/onsi/ginkgo/v2/reporters" + "github.com/onsi/ginkgo/v2/types" +) + +func RunCompiledSuite(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig types.ReporterConfig, cliConfig types.CLIConfig, goFlagsConfig types.GoFlagsConfig, additionalArgs []string) TestSuite { + suite.State = TestSuiteStateFailed + suite.HasProgrammaticFocus = false + + if suite.PathToCompiledTest == "" { + return suite + } + + if suite.IsGinkgo && cliConfig.ComputedProcs() > 1 { + suite = runParallel(suite, ginkgoConfig, reporterConfig, cliConfig, goFlagsConfig, additionalArgs) + } else if suite.IsGinkgo { + suite = runSerial(suite, ginkgoConfig, reporterConfig, cliConfig, goFlagsConfig, additionalArgs) + } else { + suite = runGoTest(suite, cliConfig, goFlagsConfig) + } + runAfterRunHook(cliConfig.AfterRunHook, reporterConfig.NoColor, suite) + return suite +} + +func buildAndStartCommand(suite TestSuite, args []string, pipeToStdout bool) (*exec.Cmd, *bytes.Buffer) { + buf := &bytes.Buffer{} + cmd := exec.Command(suite.PathToCompiledTest, args...) + cmd.Dir = suite.Path + if pipeToStdout { + cmd.Stderr = io.MultiWriter(os.Stdout, buf) + cmd.Stdout = os.Stdout + } else { + cmd.Stderr = buf + cmd.Stdout = buf + } + err := cmd.Start() + command.AbortIfError("Failed to start test suite", err) + + return cmd, buf +} + +func checkForNoTestsWarning(buf *bytes.Buffer) bool { + if strings.Contains(buf.String(), "warning: no tests to run") { + fmt.Fprintf(os.Stderr, `Found no test suites, did you forget to run "ginkgo bootstrap"?`) + return true + } + return false +} + +func runGoTest(suite TestSuite, cliConfig types.CLIConfig, goFlagsConfig types.GoFlagsConfig) TestSuite { + // As we run the go test from the suite directory, make sure the cover profile is absolute + // and placed into the expected output directory when one is configured. + if goFlagsConfig.Cover && !filepath.IsAbs(goFlagsConfig.CoverProfile) { + goFlagsConfig.CoverProfile = AbsPathForGeneratedAsset(goFlagsConfig.CoverProfile, suite, cliConfig, 0) + } + + args, err := types.GenerateGoTestRunArgs(goFlagsConfig) + command.AbortIfError("Failed to generate test run arguments", err) + cmd, buf := buildAndStartCommand(suite, args, true) + + cmd.Wait() + + exitStatus := cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() + passed := (exitStatus == 0) || (exitStatus == types.GINKGO_FOCUS_EXIT_CODE) + passed = !(checkForNoTestsWarning(buf) && cliConfig.RequireSuite) && passed + if passed { + suite.State = TestSuiteStatePassed + } else { + suite.State = TestSuiteStateFailed + } + + return suite +} + +func runSerial(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig types.ReporterConfig, cliConfig types.CLIConfig, goFlagsConfig types.GoFlagsConfig, additionalArgs []string) TestSuite { + if goFlagsConfig.Cover { + goFlagsConfig.CoverProfile = AbsPathForGeneratedAsset(goFlagsConfig.CoverProfile, suite, cliConfig, 0) + } + if goFlagsConfig.BlockProfile != "" { + goFlagsConfig.BlockProfile = AbsPathForGeneratedAsset(goFlagsConfig.BlockProfile, suite, cliConfig, 0) + } + if goFlagsConfig.CPUProfile != "" { + goFlagsConfig.CPUProfile = AbsPathForGeneratedAsset(goFlagsConfig.CPUProfile, suite, cliConfig, 0) + } + if goFlagsConfig.MemProfile != "" { + goFlagsConfig.MemProfile = AbsPathForGeneratedAsset(goFlagsConfig.MemProfile, suite, cliConfig, 0) + } + if goFlagsConfig.MutexProfile != "" { + goFlagsConfig.MutexProfile = AbsPathForGeneratedAsset(goFlagsConfig.MutexProfile, suite, cliConfig, 0) + } + if reporterConfig.JSONReport != "" { + reporterConfig.JSONReport = AbsPathForGeneratedAsset(reporterConfig.JSONReport, suite, cliConfig, 0) + } + if reporterConfig.JUnitReport != "" { + reporterConfig.JUnitReport = AbsPathForGeneratedAsset(reporterConfig.JUnitReport, suite, cliConfig, 0) + } + if reporterConfig.TeamcityReport != "" { + reporterConfig.TeamcityReport = AbsPathForGeneratedAsset(reporterConfig.TeamcityReport, suite, cliConfig, 0) + } + + args, err := types.GenerateGinkgoTestRunArgs(ginkgoConfig, reporterConfig, goFlagsConfig) + command.AbortIfError("Failed to generate test run arguments", err) + args = append([]string{"--test.timeout=0"}, args...) + args = append(args, additionalArgs...) + + cmd, buf := buildAndStartCommand(suite, args, true) + + cmd.Wait() + + exitStatus := cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() + suite.HasProgrammaticFocus = (exitStatus == types.GINKGO_FOCUS_EXIT_CODE) + passed := (exitStatus == 0) || (exitStatus == types.GINKGO_FOCUS_EXIT_CODE) + passed = !(checkForNoTestsWarning(buf) && cliConfig.RequireSuite) && passed + if passed { + suite.State = TestSuiteStatePassed + } else { + suite.State = TestSuiteStateFailed + } + + if suite.HasProgrammaticFocus { + if goFlagsConfig.Cover { + fmt.Fprintln(os.Stdout, "coverage: no coverfile was generated because specs are programmatically focused") + } + if goFlagsConfig.BlockProfile != "" { + fmt.Fprintln(os.Stdout, "no block profile was generated because specs are programmatically focused") + } + if goFlagsConfig.CPUProfile != "" { + fmt.Fprintln(os.Stdout, "no cpu profile was generated because specs are programmatically focused") + } + if goFlagsConfig.MemProfile != "" { + fmt.Fprintln(os.Stdout, "no mem profile was generated because specs are programmatically focused") + } + if goFlagsConfig.MutexProfile != "" { + fmt.Fprintln(os.Stdout, "no mutex profile was generated because specs are programmatically focused") + } + } + + return suite +} + +func runParallel(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig types.ReporterConfig, cliConfig types.CLIConfig, goFlagsConfig types.GoFlagsConfig, additionalArgs []string) TestSuite { + type procResult struct { + passed bool + hasProgrammaticFocus bool + } + + numProcs := cliConfig.ComputedProcs() + procOutput := make([]*bytes.Buffer, numProcs) + coverProfiles := []string{} + + blockProfiles := []string{} + cpuProfiles := []string{} + memProfiles := []string{} + mutexProfiles := []string{} + + procResults := make(chan procResult) + + server, err := parallel_support.NewServer(numProcs, reporters.NewDefaultReporter(reporterConfig, formatter.ColorableStdOut)) + command.AbortIfError("Failed to start parallel spec server", err) + server.Start() + defer server.Close() + + if reporterConfig.JSONReport != "" { + reporterConfig.JSONReport = AbsPathForGeneratedAsset(reporterConfig.JSONReport, suite, cliConfig, 0) + } + if reporterConfig.JUnitReport != "" { + reporterConfig.JUnitReport = AbsPathForGeneratedAsset(reporterConfig.JUnitReport, suite, cliConfig, 0) + } + if reporterConfig.TeamcityReport != "" { + reporterConfig.TeamcityReport = AbsPathForGeneratedAsset(reporterConfig.TeamcityReport, suite, cliConfig, 0) + } + + for proc := 1; proc <= numProcs; proc++ { + procGinkgoConfig := ginkgoConfig + procGinkgoConfig.ParallelProcess, procGinkgoConfig.ParallelTotal, procGinkgoConfig.ParallelHost = proc, numProcs, server.Address() + + procGoFlagsConfig := goFlagsConfig + if goFlagsConfig.Cover { + procGoFlagsConfig.CoverProfile = AbsPathForGeneratedAsset(goFlagsConfig.CoverProfile, suite, cliConfig, proc) + coverProfiles = append(coverProfiles, procGoFlagsConfig.CoverProfile) + } + if goFlagsConfig.BlockProfile != "" { + procGoFlagsConfig.BlockProfile = AbsPathForGeneratedAsset(goFlagsConfig.BlockProfile, suite, cliConfig, proc) + blockProfiles = append(blockProfiles, procGoFlagsConfig.BlockProfile) + } + if goFlagsConfig.CPUProfile != "" { + procGoFlagsConfig.CPUProfile = AbsPathForGeneratedAsset(goFlagsConfig.CPUProfile, suite, cliConfig, proc) + cpuProfiles = append(cpuProfiles, procGoFlagsConfig.CPUProfile) + } + if goFlagsConfig.MemProfile != "" { + procGoFlagsConfig.MemProfile = AbsPathForGeneratedAsset(goFlagsConfig.MemProfile, suite, cliConfig, proc) + memProfiles = append(memProfiles, procGoFlagsConfig.MemProfile) + } + if goFlagsConfig.MutexProfile != "" { + procGoFlagsConfig.MutexProfile = AbsPathForGeneratedAsset(goFlagsConfig.MutexProfile, suite, cliConfig, proc) + mutexProfiles = append(mutexProfiles, procGoFlagsConfig.MutexProfile) + } + + args, err := types.GenerateGinkgoTestRunArgs(procGinkgoConfig, reporterConfig, procGoFlagsConfig) + command.AbortIfError("Failed to generate test run arguments", err) + args = append([]string{"--test.timeout=0"}, args...) + args = append(args, additionalArgs...) + + cmd, buf := buildAndStartCommand(suite, args, false) + procOutput[proc-1] = buf + server.RegisterAlive(proc, func() bool { return cmd.ProcessState == nil || !cmd.ProcessState.Exited() }) + + go func() { + cmd.Wait() + exitStatus := cmd.ProcessState.Sys().(syscall.WaitStatus).ExitStatus() + procResults <- procResult{ + passed: (exitStatus == 0) || (exitStatus == types.GINKGO_FOCUS_EXIT_CODE), + hasProgrammaticFocus: exitStatus == types.GINKGO_FOCUS_EXIT_CODE, + } + }() + } + + passed := true + for proc := 1; proc <= cliConfig.ComputedProcs(); proc++ { + result := <-procResults + passed = passed && result.passed + suite.HasProgrammaticFocus = suite.HasProgrammaticFocus || result.hasProgrammaticFocus + } + if passed { + suite.State = TestSuiteStatePassed + } else { + suite.State = TestSuiteStateFailed + } + + select { + case <-server.GetSuiteDone(): + fmt.Println("") + case <-time.After(time.Second): + //one of the nodes never finished reporting to the server. Something must have gone wrong. + fmt.Fprint(formatter.ColorableStdErr, formatter.F("\n{{bold}}{{red}}Ginkgo timed out waiting for all parallel procs to report back{{/}}\n")) + fmt.Fprint(formatter.ColorableStdErr, formatter.F("{{gray}}Test suite:{{/}} %s (%s)\n\n", suite.PackageName, suite.Path)) + fmt.Fprint(formatter.ColorableStdErr, formatter.Fiw(0, formatter.COLS, "This occurs if a parallel process exits before it reports its results to the Ginkgo CLI. The CLI will now print out all the stdout/stderr output it's collected from the running processes. However you may not see anything useful in these logs because the individual test processes usually intercept output to stdout/stderr in order to capture it in the spec reports.\n\nYou may want to try rerunning your test suite with {{light-gray}}--output-interceptor-mode=none{{/}} to see additional output here and debug your suite.\n")) + fmt.Fprintln(formatter.ColorableStdErr, " ") + for proc := 1; proc <= cliConfig.ComputedProcs(); proc++ { + fmt.Fprintf(formatter.ColorableStdErr, formatter.F("{{bold}}Output from proc %d:{{/}}\n", proc)) + fmt.Fprintln(os.Stderr, formatter.Fi(1, "%s", procOutput[proc-1].String())) + } + fmt.Fprintf(os.Stderr, "** End **") + } + + for proc := 1; proc <= cliConfig.ComputedProcs(); proc++ { + output := procOutput[proc-1].String() + if proc == 1 && checkForNoTestsWarning(procOutput[0]) && cliConfig.RequireSuite { + suite.State = TestSuiteStateFailed + } + if strings.Contains(output, "deprecated Ginkgo functionality") { + fmt.Fprintln(os.Stderr, output) + } + } + + if len(coverProfiles) > 0 { + if suite.HasProgrammaticFocus { + fmt.Fprintln(os.Stdout, "coverage: no coverfile was generated because specs are programmatically focused") + } else { + coverProfile := AbsPathForGeneratedAsset(goFlagsConfig.CoverProfile, suite, cliConfig, 0) + err := MergeAndCleanupCoverProfiles(coverProfiles, coverProfile) + command.AbortIfError("Failed to combine cover profiles", err) + + coverage, err := GetCoverageFromCoverProfile(coverProfile) + command.AbortIfError("Failed to compute coverage", err) + if coverage == 0 { + fmt.Fprintln(os.Stdout, "coverage: [no statements]") + } else { + fmt.Fprintf(os.Stdout, "coverage: %.1f%% of statements\n", coverage) + } + } + } + if len(blockProfiles) > 0 { + if suite.HasProgrammaticFocus { + fmt.Fprintln(os.Stdout, "no block profile was generated because specs are programmatically focused") + } else { + blockProfile := AbsPathForGeneratedAsset(goFlagsConfig.BlockProfile, suite, cliConfig, 0) + err := MergeProfiles(blockProfiles, blockProfile) + command.AbortIfError("Failed to combine blockprofiles", err) + } + } + if len(cpuProfiles) > 0 { + if suite.HasProgrammaticFocus { + fmt.Fprintln(os.Stdout, "no cpu profile was generated because specs are programmatically focused") + } else { + cpuProfile := AbsPathForGeneratedAsset(goFlagsConfig.CPUProfile, suite, cliConfig, 0) + err := MergeProfiles(cpuProfiles, cpuProfile) + command.AbortIfError("Failed to combine cpuprofiles", err) + } + } + if len(memProfiles) > 0 { + if suite.HasProgrammaticFocus { + fmt.Fprintln(os.Stdout, "no mem profile was generated because specs are programmatically focused") + } else { + memProfile := AbsPathForGeneratedAsset(goFlagsConfig.MemProfile, suite, cliConfig, 0) + err := MergeProfiles(memProfiles, memProfile) + command.AbortIfError("Failed to combine memprofiles", err) + } + } + if len(mutexProfiles) > 0 { + if suite.HasProgrammaticFocus { + fmt.Fprintln(os.Stdout, "no mutex profile was generated because specs are programmatically focused") + } else { + mutexProfile := AbsPathForGeneratedAsset(goFlagsConfig.MutexProfile, suite, cliConfig, 0) + err := MergeProfiles(mutexProfiles, mutexProfile) + command.AbortIfError("Failed to combine mutexprofiles", err) + } + } + + return suite +} + +func runAfterRunHook(command string, noColor bool, suite TestSuite) { + if command == "" { + return + } + f := formatter.NewWithNoColorBool(noColor) + + // Allow for string replacement to pass input to the command + passed := "[FAIL]" + if suite.State.Is(TestSuiteStatePassed) { + passed = "[PASS]" + } + command = strings.ReplaceAll(command, "(ginkgo-suite-passed)", passed) + command = strings.ReplaceAll(command, "(ginkgo-suite-name)", suite.PackageName) + + // Must break command into parts + splitArgs := regexp.MustCompile(`'.+'|".+"|\S+`) + parts := splitArgs.FindAllString(command, -1) + + output, err := exec.Command(parts[0], parts[1:]...).CombinedOutput() + if err != nil { + fmt.Fprintln(formatter.ColorableStdOut, f.Fi(0, "{{red}}{{bold}}After-run-hook failed:{{/}}")) + fmt.Fprintln(formatter.ColorableStdOut, f.Fi(1, "{{red}}%s{{/}}", output)) + } else { + fmt.Fprintln(formatter.ColorableStdOut, f.Fi(0, "{{green}}{{bold}}After-run-hook succeeded:{{/}}")) + fmt.Fprintln(formatter.ColorableStdOut, f.Fi(1, "{{green}}%s{{/}}", output)) + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go new file mode 100644 index 00000000..64dcb1b7 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go @@ -0,0 +1,283 @@ +package internal + +import ( + "errors" + "math/rand" + "os" + "path" + "path/filepath" + "regexp" + "strings" + + "github.com/onsi/ginkgo/v2/types" +) + +const TIMEOUT_ELAPSED_FAILURE_REASON = "Suite did not run because the timeout elapsed" +const PRIOR_FAILURES_FAILURE_REASON = "Suite did not run because prior suites failed and --keep-going is not set" +const EMPTY_SKIP_FAILURE_REASON = "Suite did not run go test reported that no test files were found" + +type TestSuiteState uint + +const ( + TestSuiteStateInvalid TestSuiteState = iota + + TestSuiteStateUncompiled + TestSuiteStateCompiled + + TestSuiteStatePassed + + TestSuiteStateSkippedDueToEmptyCompilation + TestSuiteStateSkippedByFilter + TestSuiteStateSkippedDueToPriorFailures + + TestSuiteStateFailed + TestSuiteStateFailedDueToTimeout + TestSuiteStateFailedToCompile +) + +var TestSuiteStateFailureStates = []TestSuiteState{TestSuiteStateFailed, TestSuiteStateFailedDueToTimeout, TestSuiteStateFailedToCompile} + +func (state TestSuiteState) Is(states ...TestSuiteState) bool { + for _, suiteState := range states { + if suiteState == state { + return true + } + } + + return false +} + +type TestSuite struct { + Path string + PackageName string + IsGinkgo bool + + Precompiled bool + PathToCompiledTest string + CompilationError error + + HasProgrammaticFocus bool + State TestSuiteState +} + +func (ts TestSuite) AbsPath() string { + path, _ := filepath.Abs(ts.Path) + return path +} + +func (ts TestSuite) NamespacedName() string { + name := relPath(ts.Path) + name = strings.TrimLeft(name, "."+string(filepath.Separator)) + name = strings.ReplaceAll(name, string(filepath.Separator), "_") + name = strings.ReplaceAll(name, " ", "_") + if name == "" { + return ts.PackageName + } + return name +} + +type TestSuites []TestSuite + +func (ts TestSuites) AnyHaveProgrammaticFocus() bool { + for _, suite := range ts { + if suite.HasProgrammaticFocus { + return true + } + } + + return false +} + +func (ts TestSuites) ThatAreGinkgoSuites() TestSuites { + out := TestSuites{} + for _, suite := range ts { + if suite.IsGinkgo { + out = append(out, suite) + } + } + return out +} + +func (ts TestSuites) CountWithState(states ...TestSuiteState) int { + n := 0 + for _, suite := range ts { + if suite.State.Is(states...) { + n += 1 + } + } + + return n +} + +func (ts TestSuites) WithState(states ...TestSuiteState) TestSuites { + out := TestSuites{} + for _, suite := range ts { + if suite.State.Is(states...) { + out = append(out, suite) + } + } + + return out +} + +func (ts TestSuites) WithoutState(states ...TestSuiteState) TestSuites { + out := TestSuites{} + for _, suite := range ts { + if !suite.State.Is(states...) { + out = append(out, suite) + } + } + + return out +} + +func (ts TestSuites) ShuffledCopy(seed int64) TestSuites { + out := make(TestSuites, len(ts)) + permutation := rand.New(rand.NewSource(seed)).Perm(len(ts)) + for i, j := range permutation { + out[i] = ts[j] + } + return out +} + +func FindSuites(args []string, cliConfig types.CLIConfig, allowPrecompiled bool) TestSuites { + suites := TestSuites{} + + if len(args) > 0 { + for _, arg := range args { + if allowPrecompiled { + suite, err := precompiledTestSuite(arg) + if err == nil { + suites = append(suites, suite) + continue + } + } + recurseForSuite := cliConfig.Recurse + if strings.HasSuffix(arg, "/...") && arg != "/..." { + arg = arg[:len(arg)-4] + recurseForSuite = true + } + suites = append(suites, suitesInDir(arg, recurseForSuite)...) + } + } else { + suites = suitesInDir(".", cliConfig.Recurse) + } + + if cliConfig.SkipPackage != "" { + skipFilters := strings.Split(cliConfig.SkipPackage, ",") + for idx := range suites { + for _, skipFilter := range skipFilters { + if strings.Contains(suites[idx].Path, skipFilter) { + suites[idx].State = TestSuiteStateSkippedByFilter + break + } + } + } + } + + return suites +} + +func precompiledTestSuite(path string) (TestSuite, error) { + info, err := os.Stat(path) + if err != nil { + return TestSuite{}, err + } + + if info.IsDir() { + return TestSuite{}, errors.New("this is a directory, not a file") + } + + if filepath.Ext(path) != ".test" && filepath.Ext(path) != ".exe" { + return TestSuite{}, errors.New("this is not a .test binary") + } + + if filepath.Ext(path) == ".test" && info.Mode()&0111 == 0 { + return TestSuite{}, errors.New("this is not executable") + } + + dir := relPath(filepath.Dir(path)) + packageName := strings.TrimSuffix(filepath.Base(path), ".exe") + packageName = strings.TrimSuffix(packageName, ".test") + + path, err = filepath.Abs(path) + if err != nil { + return TestSuite{}, err + } + + return TestSuite{ + Path: dir, + PackageName: packageName, + IsGinkgo: true, + Precompiled: true, + PathToCompiledTest: path, + State: TestSuiteStateCompiled, + }, nil +} + +func suitesInDir(dir string, recurse bool) TestSuites { + suites := TestSuites{} + + if path.Base(dir) == "vendor" { + return suites + } + + files, _ := os.ReadDir(dir) + re := regexp.MustCompile(`^[^._].*_test\.go$`) + for _, file := range files { + if !file.IsDir() && re.Match([]byte(file.Name())) { + suite := TestSuite{ + Path: relPath(dir), + PackageName: packageNameForSuite(dir), + IsGinkgo: filesHaveGinkgoSuite(dir, files), + State: TestSuiteStateUncompiled, + } + suites = append(suites, suite) + break + } + } + + if recurse { + re = regexp.MustCompile(`^[._]`) + for _, file := range files { + if file.IsDir() && !re.Match([]byte(file.Name())) { + suites = append(suites, suitesInDir(dir+"/"+file.Name(), recurse)...) + } + } + } + + return suites +} + +func relPath(dir string) string { + dir, _ = filepath.Abs(dir) + cwd, _ := os.Getwd() + dir, _ = filepath.Rel(cwd, filepath.Clean(dir)) + + if string(dir[0]) != "." { + dir = "." + string(filepath.Separator) + dir + } + + return dir +} + +func packageNameForSuite(dir string) string { + path, _ := filepath.Abs(dir) + return filepath.Base(path) +} + +func filesHaveGinkgoSuite(dir string, files []os.DirEntry) bool { + reTestFile := regexp.MustCompile(`_test\.go$`) + reGinkgo := regexp.MustCompile(`package ginkgo|\/ginkgo"|\/ginkgo\/v2"|\/ginkgo\/v2/dsl/`) + + for _, file := range files { + if !file.IsDir() && reTestFile.Match([]byte(file.Name())) { + contents, _ := os.ReadFile(dir + "/" + file.Name()) + if reGinkgo.Match(contents) { + return true + } + } + } + + return false +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/utils.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/utils.go new file mode 100644 index 00000000..bd9ca7d5 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/utils.go @@ -0,0 +1,86 @@ +package internal + +import ( + "fmt" + "io" + "os" + "os/exec" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/ginkgo/command" +) + +func FileExists(path string) bool { + _, err := os.Stat(path) + return err == nil +} + +func CopyFile(src string, dest string) error { + srcFile, err := os.Open(src) + if err != nil { + return err + } + + srcStat, err := srcFile.Stat() + if err != nil { + return err + } + + if _, err := os.Stat(dest); err == nil { + os.Remove(dest) + } + + destFile, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE, srcStat.Mode()) + if err != nil { + return err + } + + _, err = io.Copy(destFile, srcFile) + if err != nil { + return err + } + + if err := srcFile.Close(); err != nil { + return err + } + return destFile.Close() +} + +func GoFmt(path string) { + out, err := exec.Command("go", "fmt", path).CombinedOutput() + if err != nil { + command.AbortIfError(fmt.Sprintf("Could not fmt:\n%s\n", string(out)), err) + } +} + +func PluralizedWord(singular, plural string, count int) string { + if count == 1 { + return singular + } + return plural +} + +func FailedSuitesReport(suites TestSuites, f formatter.Formatter) string { + out := "" + out += "There were failures detected in the following suites:\n" + + maxPackageNameLength := 0 + for _, suite := range suites.WithState(TestSuiteStateFailureStates...) { + if len(suite.PackageName) > maxPackageNameLength { + maxPackageNameLength = len(suite.PackageName) + } + } + + packageNameFormatter := fmt.Sprintf("%%%ds", maxPackageNameLength) + for _, suite := range suites { + switch suite.State { + case TestSuiteStateFailed: + out += f.Fi(1, "{{red}}"+packageNameFormatter+" {{gray}}%s{{/}}\n", suite.PackageName, suite.Path) + case TestSuiteStateFailedToCompile: + out += f.Fi(1, "{{red}}"+packageNameFormatter+" {{gray}}%s {{magenta}}[Compilation failure]{{/}}\n", suite.PackageName, suite.Path) + case TestSuiteStateFailedDueToTimeout: + out += f.Fi(1, "{{red}}"+packageNameFormatter+" {{gray}}%s {{orange}}[%s]{{/}}\n", suite.PackageName, suite.Path, TIMEOUT_ELAPSED_FAILURE_REASON) + } + } + return out +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/verify_version.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/verify_version.go new file mode 100644 index 00000000..9da1bab3 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/verify_version.go @@ -0,0 +1,54 @@ +package internal + +import ( + "fmt" + "os/exec" + "regexp" + "strings" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/types" +) + +var versiorRe = regexp.MustCompile(`v(\d+\.\d+\.\d+)`) + +func VerifyCLIAndFrameworkVersion(suites TestSuites) { + cliVersion := types.VERSION + mismatches := map[string][]string{} + + for _, suite := range suites { + cmd := exec.Command("go", "list", "-m", "github.com/onsi/ginkgo/v2") + cmd.Dir = suite.Path + output, err := cmd.CombinedOutput() + if err != nil { + continue + } + components := strings.Split(string(output), " ") + if len(components) != 2 { + continue + } + matches := versiorRe.FindStringSubmatch(components[1]) + if matches == nil || len(matches) != 2 { + continue + } + libraryVersion := matches[1] + if cliVersion != libraryVersion { + mismatches[libraryVersion] = append(mismatches[libraryVersion], suite.PackageName) + } + } + + if len(mismatches) == 0 { + return + } + + fmt.Println(formatter.F("{{red}}{{bold}}Ginkgo detected a version mismatch between the Ginkgo CLI and the version of Ginkgo imported by your packages:{{/}}")) + + fmt.Println(formatter.Fi(1, "Ginkgo CLI Version:")) + fmt.Println(formatter.Fi(2, "{{bold}}%s{{/}}", cliVersion)) + fmt.Println(formatter.Fi(1, "Mismatched package versions found:")) + for version, packages := range mismatches { + fmt.Println(formatter.Fi(2, "{{bold}}%s{{/}} used by %s", version, strings.Join(packages, ", "))) + } + fmt.Println("") + fmt.Println(formatter.Fiw(1, formatter.COLS, "{{gray}}Ginkgo will continue to attempt to run but you may see errors (including flag parsing errors) and should either update your go.mod or your version of the Ginkgo CLI to match.\n\nTo install the matching version of the CLI run\n {{bold}}go install github.com/onsi/ginkgo/v2/ginkgo{{/}}{{gray}}\nfrom a path that contains a go.mod file. Alternatively you can use\n {{bold}}go run github.com/onsi/ginkgo/v2/ginkgo{{/}}{{gray}}\nfrom a path that contains a go.mod file to invoke the matching version of the Ginkgo CLI.\n\nIf you are attempting to test multiple packages that each have a different version of the Ginkgo library with a single Ginkgo CLI that is currently unsupported.\n{{/}}")) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/labels/labels_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/labels/labels_command.go new file mode 100644 index 00000000..6c61f09d --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/labels/labels_command.go @@ -0,0 +1,123 @@ +package labels + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "sort" + "strconv" + "strings" + + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/internal" + "github.com/onsi/ginkgo/v2/types" + "golang.org/x/tools/go/ast/inspector" +) + +func BuildLabelsCommand() command.Command { + var cliConfig = types.NewDefaultCLIConfig() + + flags, err := types.BuildLabelsCommandFlagSet(&cliConfig) + if err != nil { + panic(err) + } + + return command.Command{ + Name: "labels", + Usage: "ginkgo labels ", + Flags: flags, + ShortDoc: "List labels detected in the passed-in packages (or the package in the current directory if left blank).", + DocLink: "spec-labels", + Command: func(args []string, _ []string) { + ListLabels(args, cliConfig) + }, + } +} + +func ListLabels(args []string, cliConfig types.CLIConfig) { + suites := internal.FindSuites(args, cliConfig, false).WithoutState(internal.TestSuiteStateSkippedByFilter) + if len(suites) == 0 { + command.AbortWith("Found no test suites") + } + for _, suite := range suites { + labels := fetchLabelsFromPackage(suite.Path) + if len(labels) == 0 { + fmt.Printf("%s: No labels found\n", suite.PackageName) + } else { + fmt.Printf("%s: [%s]\n", suite.PackageName, strings.Join(labels, ", ")) + } + } +} + +func fetchLabelsFromPackage(packagePath string) []string { + fset := token.NewFileSet() + parsedPackages, err := parser.ParseDir(fset, packagePath, nil, 0) + command.AbortIfError("Failed to parse package source:", err) + + files := []*ast.File{} + hasTestPackage := false + for key, pkg := range parsedPackages { + if strings.HasSuffix(key, "_test") { + hasTestPackage = true + for _, file := range pkg.Files { + files = append(files, file) + } + } + } + if !hasTestPackage { + for _, pkg := range parsedPackages { + for _, file := range pkg.Files { + files = append(files, file) + } + } + } + + seen := map[string]bool{} + labels := []string{} + ispr := inspector.New(files) + ispr.Preorder([]ast.Node{&ast.CallExpr{}}, func(n ast.Node) { + potentialLabels := fetchLabels(n.(*ast.CallExpr)) + for _, label := range potentialLabels { + if !seen[label] { + seen[label] = true + labels = append(labels, strconv.Quote(label)) + } + } + }) + + sort.Strings(labels) + return labels +} + +func fetchLabels(callExpr *ast.CallExpr) []string { + out := []string{} + switch expr := callExpr.Fun.(type) { + case *ast.Ident: + if expr.Name != "Label" { + return out + } + case *ast.SelectorExpr: + if expr.Sel.Name != "Label" { + return out + } + default: + return out + } + for _, arg := range callExpr.Args { + switch expr := arg.(type) { + case *ast.BasicLit: + if expr.Kind == token.STRING { + unquoted, err := strconv.Unquote(expr.Value) + if err != nil { + unquoted = expr.Value + } + validated, err := types.ValidateAndCleanupLabel(unquoted, types.CodeLocation{}) + if err == nil { + out = append(out, validated) + } + } + } + } + return out +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go new file mode 100644 index 00000000..e9abb27d --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "os" + + "github.com/onsi/ginkgo/v2/ginkgo/build" + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/generators" + "github.com/onsi/ginkgo/v2/ginkgo/labels" + "github.com/onsi/ginkgo/v2/ginkgo/outline" + "github.com/onsi/ginkgo/v2/ginkgo/run" + "github.com/onsi/ginkgo/v2/ginkgo/unfocus" + "github.com/onsi/ginkgo/v2/ginkgo/watch" + "github.com/onsi/ginkgo/v2/types" +) + +var program command.Program + +func GenerateCommands() []command.Command { + return []command.Command{ + watch.BuildWatchCommand(), + build.BuildBuildCommand(), + generators.BuildBootstrapCommand(), + generators.BuildGenerateCommand(), + labels.BuildLabelsCommand(), + outline.BuildOutlineCommand(), + unfocus.BuildUnfocusCommand(), + BuildVersionCommand(), + } +} + +func main() { + program = command.Program{ + Name: "ginkgo", + Heading: fmt.Sprintf("Ginkgo Version %s", types.VERSION), + Commands: GenerateCommands(), + DefaultCommand: run.BuildRunCommand(), + DeprecatedCommands: []command.DeprecatedCommand{ + {Name: "convert", Deprecation: types.Deprecations.Convert()}, + {Name: "blur", Deprecation: types.Deprecations.Blur()}, + {Name: "nodot", Deprecation: types.Deprecations.Nodot()}, + }, + } + + program.RunAndExit(os.Args) +} + +func BuildVersionCommand() command.Command { + return command.Command{ + Name: "version", + Usage: "ginkgo version", + ShortDoc: "Print Ginkgo's version", + Command: func(_ []string, _ []string) { + fmt.Printf("Ginkgo Version %s\n", types.VERSION) + }, + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go new file mode 100644 index 00000000..958daccb --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go @@ -0,0 +1,300 @@ +package outline + +import ( + "github.com/onsi/ginkgo/v2/types" + "go/ast" + "go/token" + "strconv" +) + +const ( + // undefinedTextAlt is used if the spec/container text cannot be derived + undefinedTextAlt = "undefined" +) + +// ginkgoMetadata holds useful bits of information for every entry in the outline +type ginkgoMetadata struct { + // Name is the spec or container function name, e.g. `Describe` or `It` + Name string `json:"name"` + + // Text is the `text` argument passed to specs, and some containers + Text string `json:"text"` + + // Start is the position of first character of the spec or container block + Start int `json:"start"` + + // End is the position of first character immediately after the spec or container block + End int `json:"end"` + + Spec bool `json:"spec"` + Focused bool `json:"focused"` + Pending bool `json:"pending"` + Labels []string `json:"labels"` +} + +// ginkgoNode is used to construct the outline as a tree +type ginkgoNode struct { + ginkgoMetadata + Nodes []*ginkgoNode `json:"nodes"` +} + +type walkFunc func(n *ginkgoNode) + +func (n *ginkgoNode) PreOrder(f walkFunc) { + f(n) + for _, m := range n.Nodes { + m.PreOrder(f) + } +} + +func (n *ginkgoNode) PostOrder(f walkFunc) { + for _, m := range n.Nodes { + m.PostOrder(f) + } + f(n) +} + +func (n *ginkgoNode) Walk(pre, post walkFunc) { + pre(n) + for _, m := range n.Nodes { + m.Walk(pre, post) + } + post(n) +} + +// PropagateInheritedProperties propagates the Pending and Focused properties +// through the subtree rooted at n. +func (n *ginkgoNode) PropagateInheritedProperties() { + n.PreOrder(func(thisNode *ginkgoNode) { + for _, descendantNode := range thisNode.Nodes { + if thisNode.Pending { + descendantNode.Pending = true + descendantNode.Focused = false + } + if thisNode.Focused && !descendantNode.Pending { + descendantNode.Focused = true + } + } + }) +} + +// BackpropagateUnfocus propagates the Focused property through the subtree +// rooted at n. It applies the rule described in the Ginkgo docs: +// > Nested programmatically focused specs follow a simple rule: if a +// > leaf-node is marked focused, any of its ancestor nodes that are marked +// > focus will be unfocused. +func (n *ginkgoNode) BackpropagateUnfocus() { + focusedSpecInSubtreeStack := []bool{} + n.PostOrder(func(thisNode *ginkgoNode) { + if thisNode.Spec { + focusedSpecInSubtreeStack = append(focusedSpecInSubtreeStack, thisNode.Focused) + return + } + focusedSpecInSubtree := false + for range thisNode.Nodes { + focusedSpecInSubtree = focusedSpecInSubtree || focusedSpecInSubtreeStack[len(focusedSpecInSubtreeStack)-1] + focusedSpecInSubtreeStack = focusedSpecInSubtreeStack[0 : len(focusedSpecInSubtreeStack)-1] + } + focusedSpecInSubtreeStack = append(focusedSpecInSubtreeStack, focusedSpecInSubtree) + if focusedSpecInSubtree { + thisNode.Focused = false + } + }) + +} + +func packageAndIdentNamesFromCallExpr(ce *ast.CallExpr) (string, string, bool) { + switch ex := ce.Fun.(type) { + case *ast.Ident: + return "", ex.Name, true + case *ast.SelectorExpr: + pkgID, ok := ex.X.(*ast.Ident) + if !ok { + return "", "", false + } + // A package identifier is top-level, so Obj must be nil + if pkgID.Obj != nil { + return "", "", false + } + if ex.Sel == nil { + return "", "", false + } + return pkgID.Name, ex.Sel.Name, true + default: + return "", "", false + } +} + +// absoluteOffsetsForNode derives the absolute character offsets of the node start and +// end positions. +func absoluteOffsetsForNode(fset *token.FileSet, n ast.Node) (start, end int) { + return fset.PositionFor(n.Pos(), false).Offset, fset.PositionFor(n.End(), false).Offset +} + +// ginkgoNodeFromCallExpr derives an outline entry from a go AST subtree +// corresponding to a Ginkgo container or spec. +func ginkgoNodeFromCallExpr(fset *token.FileSet, ce *ast.CallExpr, ginkgoPackageName *string) (*ginkgoNode, bool) { + packageName, identName, ok := packageAndIdentNamesFromCallExpr(ce) + if !ok { + return nil, false + } + + n := ginkgoNode{} + n.Name = identName + n.Start, n.End = absoluteOffsetsForNode(fset, ce) + n.Nodes = make([]*ginkgoNode, 0) + switch identName { + case "It", "Specify", "Entry": + n.Spec = true + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + n.Labels = labelFromCallExpr(ce) + n.Pending = pendingFromCallExpr(ce) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "FIt", "FSpecify", "FEntry": + n.Spec = true + n.Focused = true + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + n.Labels = labelFromCallExpr(ce) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "PIt", "PSpecify", "XIt", "XSpecify", "PEntry", "XEntry": + n.Spec = true + n.Pending = true + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + n.Labels = labelFromCallExpr(ce) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "Context", "Describe", "When", "DescribeTable": + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + n.Labels = labelFromCallExpr(ce) + n.Pending = pendingFromCallExpr(ce) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "FContext", "FDescribe", "FWhen", "FDescribeTable": + n.Focused = true + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + n.Labels = labelFromCallExpr(ce) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "PContext", "PDescribe", "PWhen", "XContext", "XDescribe", "XWhen", "PDescribeTable", "XDescribeTable": + n.Pending = true + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + n.Labels = labelFromCallExpr(ce) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "By": + n.Text = textOrAltFromCallExpr(ce, undefinedTextAlt) + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "AfterEach", "BeforeEach": + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "JustAfterEach", "JustBeforeEach": + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "AfterSuite", "BeforeSuite": + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + case "SynchronizedAfterSuite", "SynchronizedBeforeSuite": + return &n, ginkgoPackageName != nil && *ginkgoPackageName == packageName + default: + return nil, false + } +} + +// textOrAltFromCallExpr tries to derive the "text" of a Ginkgo spec or +// container. If it cannot derive it, it returns the alt text. +func textOrAltFromCallExpr(ce *ast.CallExpr, alt string) string { + text, defined := textFromCallExpr(ce) + if !defined { + return alt + } + return text +} + +// textFromCallExpr tries to derive the "text" of a Ginkgo spec or container. If +// it cannot derive it, it returns false. +func textFromCallExpr(ce *ast.CallExpr) (string, bool) { + if len(ce.Args) < 1 { + return "", false + } + text, ok := ce.Args[0].(*ast.BasicLit) + if !ok { + return "", false + } + switch text.Kind { + case token.CHAR, token.STRING: + // For token.CHAR and token.STRING, Value is quoted + unquoted, err := strconv.Unquote(text.Value) + if err != nil { + // If unquoting fails, just use the raw Value + return text.Value, true + } + return unquoted, true + default: + return text.Value, true + } +} + +func labelFromCallExpr(ce *ast.CallExpr) []string { + + labels := []string{} + if len(ce.Args) < 2 { + return labels + } + + for _, arg := range ce.Args[1:] { + switch expr := arg.(type) { + case *ast.CallExpr: + id, ok := expr.Fun.(*ast.Ident) + if !ok { + // to skip over cases where the expr.Fun. is actually *ast.SelectorExpr + continue + } + if id.Name == "Label" { + ls := extractLabels(expr) + labels = append(labels, ls...) + } + } + } + return labels +} + +func extractLabels(expr *ast.CallExpr) []string { + out := []string{} + for _, arg := range expr.Args { + switch expr := arg.(type) { + case *ast.BasicLit: + if expr.Kind == token.STRING { + unquoted, err := strconv.Unquote(expr.Value) + if err != nil { + unquoted = expr.Value + } + validated, err := types.ValidateAndCleanupLabel(unquoted, types.CodeLocation{}) + if err == nil { + out = append(out, validated) + } + } + } + } + + return out +} + +func pendingFromCallExpr(ce *ast.CallExpr) bool { + + pending := false + if len(ce.Args) < 2 { + return pending + } + + for _, arg := range ce.Args[1:] { + switch expr := arg.(type) { + case *ast.CallExpr: + id, ok := expr.Fun.(*ast.Ident) + if !ok { + // to skip over cases where the expr.Fun. is actually *ast.SelectorExpr + continue + } + if id.Name == "Pending" { + pending = true + } + case *ast.Ident: + if expr.Name == "Pending" { + pending = true + } + } + } + return pending +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go new file mode 100644 index 00000000..67ec5ab7 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go @@ -0,0 +1,65 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Most of the required functions were available in the +// "golang.org/x/tools/go/ast/astutil" package, but not exported. +// They were copied from https://github.com/golang/tools/blob/2b0845dc783e36ae26d683f4915a5840ef01ab0f/go/ast/astutil/imports.go + +package outline + +import ( + "go/ast" + "strconv" + "strings" +) + +// packageNameForImport returns the package name for the package. If the package +// is not imported, it returns nil. "Package name" refers to `pkgname` in the +// call expression `pkgname.ExportedIdentifier`. Examples: +// (import path not found) -> nil +// "import example.com/pkg/foo" -> "foo" +// "import fooalias example.com/pkg/foo" -> "fooalias" +// "import . example.com/pkg/foo" -> "" +func packageNameForImport(f *ast.File, path string) *string { + spec := importSpec(f, path) + if spec == nil { + return nil + } + name := spec.Name.String() + if name == "" { + // If the package name is not explicitly specified, + // make an educated guess. This is not guaranteed to be correct. + lastSlash := strings.LastIndex(path, "/") + if lastSlash == -1 { + name = path + } else { + name = path[lastSlash+1:] + } + } + if name == "." { + name = "" + } + return &name +} + +// importSpec returns the import spec if f imports path, +// or nil otherwise. +func importSpec(f *ast.File, path string) *ast.ImportSpec { + for _, s := range f.Imports { + if strings.HasPrefix(importPath(s), path) { + return s + } + } + return nil +} + +// importPath returns the unquoted import path of s, +// or "" if the path is not properly quoted. +func importPath(s *ast.ImportSpec) string { + t, err := strconv.Unquote(s.Path.Value) + if err != nil { + return "" + } + return t +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline.go new file mode 100644 index 00000000..c2327cda --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline.go @@ -0,0 +1,110 @@ +package outline + +import ( + "encoding/json" + "fmt" + "go/ast" + "go/token" + "strings" + + "golang.org/x/tools/go/ast/inspector" +) + +const ( + // ginkgoImportPath is the well-known ginkgo import path + ginkgoImportPath = "github.com/onsi/ginkgo/v2" +) + +// FromASTFile returns an outline for a Ginkgo test source file +func FromASTFile(fset *token.FileSet, src *ast.File) (*outline, error) { + ginkgoPackageName := packageNameForImport(src, ginkgoImportPath) + if ginkgoPackageName == nil { + return nil, fmt.Errorf("file does not import %q", ginkgoImportPath) + } + + root := ginkgoNode{} + stack := []*ginkgoNode{&root} + ispr := inspector.New([]*ast.File{src}) + ispr.Nodes([]ast.Node{(*ast.CallExpr)(nil)}, func(node ast.Node, push bool) bool { + if push { + // Pre-order traversal + ce, ok := node.(*ast.CallExpr) + if !ok { + // Because `Nodes` calls this function only when the node is an + // ast.CallExpr, this should never happen + panic(fmt.Errorf("node starting at %d, ending at %d is not an *ast.CallExpr", node.Pos(), node.End())) + } + gn, ok := ginkgoNodeFromCallExpr(fset, ce, ginkgoPackageName) + if !ok { + // Node is not a Ginkgo spec or container, continue + return true + } + parent := stack[len(stack)-1] + parent.Nodes = append(parent.Nodes, gn) + stack = append(stack, gn) + return true + } + // Post-order traversal + start, end := absoluteOffsetsForNode(fset, node) + lastVisitedGinkgoNode := stack[len(stack)-1] + if start != lastVisitedGinkgoNode.Start || end != lastVisitedGinkgoNode.End { + // Node is not a Ginkgo spec or container, so it was not pushed onto the stack, continue + return true + } + stack = stack[0 : len(stack)-1] + return true + }) + if len(root.Nodes) == 0 { + return &outline{[]*ginkgoNode{}}, nil + } + + // Derive the final focused property for all nodes. This must be done + // _before_ propagating the inherited focused property. + root.BackpropagateUnfocus() + // Now, propagate inherited properties, including focused and pending. + root.PropagateInheritedProperties() + + return &outline{root.Nodes}, nil +} + +type outline struct { + Nodes []*ginkgoNode `json:"nodes"` +} + +func (o *outline) MarshalJSON() ([]byte, error) { + return json.Marshal(o.Nodes) +} + +// String returns a CSV-formatted outline. Spec or container are output in +// depth-first order. +func (o *outline) String() string { + return o.StringIndent(0) +} + +// StringIndent returns a CSV-formated outline, but every line is indented by +// one 'width' of spaces for every level of nesting. +func (o *outline) StringIndent(width int) string { + var b strings.Builder + b.WriteString("Name,Text,Start,End,Spec,Focused,Pending,Labels\n") + + currentIndent := 0 + pre := func(n *ginkgoNode) { + b.WriteString(fmt.Sprintf("%*s", currentIndent, "")) + var labels string + if len(n.Labels) == 1 { + labels = n.Labels[0] + } else { + labels = strings.Join(n.Labels, ", ") + } + //enclosing labels in a double quoted comma separate listed so that when inmported into a CSV app the Labels column has comma separate strings + b.WriteString(fmt.Sprintf("%s,%s,%d,%d,%t,%t,%t,\"%s\"\n", n.Name, n.Text, n.Start, n.End, n.Spec, n.Focused, n.Pending, labels)) + currentIndent += width + } + post := func(n *ginkgoNode) { + currentIndent -= width + } + for _, n := range o.Nodes { + n.Walk(pre, post) + } + return b.String() +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline_command.go new file mode 100644 index 00000000..36698d46 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline_command.go @@ -0,0 +1,98 @@ +package outline + +import ( + "encoding/json" + "fmt" + "go/parser" + "go/token" + "os" + + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/types" +) + +const ( + // indentWidth is the width used by the 'indent' output + indentWidth = 4 + // stdinAlias is a portable alias for stdin. This convention is used in + // other CLIs, e.g., kubectl. + stdinAlias = "-" + usageCommand = "ginkgo outline " +) + +type outlineConfig struct { + Format string +} + +func BuildOutlineCommand() command.Command { + conf := outlineConfig{ + Format: "csv", + } + flags, err := types.NewGinkgoFlagSet( + types.GinkgoFlags{ + {Name: "format", KeyPath: "Format", + Usage: "Format of outline", + UsageArgument: "one of 'csv', 'indent', or 'json'", + UsageDefaultValue: conf.Format, + }, + }, + &conf, + types.GinkgoFlagSections{}, + ) + if err != nil { + panic(err) + } + + return command.Command{ + Name: "outline", + Usage: "ginkgo outline ", + ShortDoc: "Create an outline of Ginkgo symbols for a file", + Documentation: "To read from stdin, use: `ginkgo outline -`", + DocLink: "creating-an-outline-of-specs", + Flags: flags, + Command: func(args []string, _ []string) { + outlineFile(args, conf.Format) + }, + } +} + +func outlineFile(args []string, format string) { + if len(args) != 1 { + command.AbortWithUsage("outline expects exactly one argument") + } + + filename := args[0] + var src *os.File + if filename == stdinAlias { + src = os.Stdin + } else { + var err error + src, err = os.Open(filename) + command.AbortIfError("Failed to open file:", err) + } + + fset := token.NewFileSet() + + parsedSrc, err := parser.ParseFile(fset, filename, src, 0) + command.AbortIfError("Failed to parse source:", err) + + o, err := FromASTFile(fset, parsedSrc) + command.AbortIfError("Failed to create outline:", err) + + var oerr error + switch format { + case "csv": + _, oerr = fmt.Print(o) + case "indent": + _, oerr = fmt.Print(o.StringIndent(indentWidth)) + case "json": + b, err := json.Marshal(o) + if err != nil { + println(fmt.Sprintf("error marshalling to json: %s", err)) + } + _, oerr = fmt.Println(string(b)) + default: + command.AbortWith("Format %s not accepted", format) + } + command.AbortIfError("Failed to write outline:", oerr) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go new file mode 100644 index 00000000..aaed4d57 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go @@ -0,0 +1,232 @@ +package run + +import ( + "fmt" + "os" + "strings" + "time" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/internal" + "github.com/onsi/ginkgo/v2/internal/interrupt_handler" + "github.com/onsi/ginkgo/v2/types" +) + +func BuildRunCommand() command.Command { + var suiteConfig = types.NewDefaultSuiteConfig() + var reporterConfig = types.NewDefaultReporterConfig() + var cliConfig = types.NewDefaultCLIConfig() + var goFlagsConfig = types.NewDefaultGoFlagsConfig() + + flags, err := types.BuildRunCommandFlagSet(&suiteConfig, &reporterConfig, &cliConfig, &goFlagsConfig) + if err != nil { + panic(err) + } + + interruptHandler := interrupt_handler.NewInterruptHandler(nil) + interrupt_handler.SwallowSigQuit() + + return command.Command{ + Name: "run", + Flags: flags, + Usage: "ginkgo run -- ", + ShortDoc: "Run the tests in the passed in (or the package in the current directory if left blank)", + Documentation: "Any arguments after -- will be passed to the test.", + DocLink: "running-tests", + Command: func(args []string, additionalArgs []string) { + var errors []error + cliConfig, goFlagsConfig, errors = types.VetAndInitializeCLIAndGoConfig(cliConfig, goFlagsConfig) + command.AbortIfErrors("Ginkgo detected configuration issues:", errors) + + runner := &SpecRunner{ + cliConfig: cliConfig, + goFlagsConfig: goFlagsConfig, + suiteConfig: suiteConfig, + reporterConfig: reporterConfig, + flags: flags, + + interruptHandler: interruptHandler, + } + + runner.RunSpecs(args, additionalArgs) + }, + } +} + +type SpecRunner struct { + suiteConfig types.SuiteConfig + reporterConfig types.ReporterConfig + cliConfig types.CLIConfig + goFlagsConfig types.GoFlagsConfig + flags types.GinkgoFlagSet + + interruptHandler *interrupt_handler.InterruptHandler +} + +func (r *SpecRunner) RunSpecs(args []string, additionalArgs []string) { + suites := internal.FindSuites(args, r.cliConfig, true) + skippedSuites := suites.WithState(internal.TestSuiteStateSkippedByFilter) + suites = suites.WithoutState(internal.TestSuiteStateSkippedByFilter) + + internal.VerifyCLIAndFrameworkVersion(suites) + + if len(skippedSuites) > 0 { + fmt.Println("Will skip:") + for _, skippedSuite := range skippedSuites { + fmt.Println(" " + skippedSuite.Path) + } + } + + if len(skippedSuites) > 0 && len(suites) == 0 { + command.AbortGracefullyWith("All tests skipped! Exiting...") + } + + if len(suites) == 0 { + command.AbortWith("Found no test suites") + } + + if len(suites) > 1 && !r.flags.WasSet("succinct") && r.reporterConfig.Verbosity().LT(types.VerbosityLevelVerbose) { + r.reporterConfig.Succinct = true + } + + t := time.Now() + var endTime time.Time + if r.suiteConfig.Timeout > 0 { + endTime = t.Add(r.suiteConfig.Timeout) + } + + iteration := 0 +OUTER_LOOP: + for { + if !r.flags.WasSet("seed") { + r.suiteConfig.RandomSeed = time.Now().Unix() + } + if r.cliConfig.RandomizeSuites && len(suites) > 1 { + suites = suites.ShuffledCopy(r.suiteConfig.RandomSeed) + } + + opc := internal.NewOrderedParallelCompiler(r.cliConfig.ComputedNumCompilers()) + opc.StartCompiling(suites, r.goFlagsConfig) + + SUITE_LOOP: + for { + suiteIdx, suite := opc.Next() + if suiteIdx >= len(suites) { + break SUITE_LOOP + } + suites[suiteIdx] = suite + + if r.interruptHandler.Status().Interrupted() { + opc.StopAndDrain() + break OUTER_LOOP + } + + if suites[suiteIdx].State.Is(internal.TestSuiteStateSkippedDueToEmptyCompilation) { + fmt.Printf("Skipping %s (no test files)\n", suite.Path) + continue SUITE_LOOP + } + + if suites[suiteIdx].State.Is(internal.TestSuiteStateFailedToCompile) { + fmt.Println(suites[suiteIdx].CompilationError.Error()) + if !r.cliConfig.KeepGoing { + opc.StopAndDrain() + } + continue SUITE_LOOP + } + + if suites.CountWithState(internal.TestSuiteStateFailureStates...) > 0 && !r.cliConfig.KeepGoing { + suites[suiteIdx].State = internal.TestSuiteStateSkippedDueToPriorFailures + opc.StopAndDrain() + continue SUITE_LOOP + } + + if !endTime.IsZero() { + r.suiteConfig.Timeout = endTime.Sub(time.Now()) + if r.suiteConfig.Timeout <= 0 { + suites[suiteIdx].State = internal.TestSuiteStateFailedDueToTimeout + opc.StopAndDrain() + continue SUITE_LOOP + } + } + + suites[suiteIdx] = internal.RunCompiledSuite(suites[suiteIdx], r.suiteConfig, r.reporterConfig, r.cliConfig, r.goFlagsConfig, additionalArgs) + } + + if suites.CountWithState(internal.TestSuiteStateFailureStates...) > 0 { + if iteration > 0 { + fmt.Printf("\nTests failed on attempt #%d\n\n", iteration+1) + } + break OUTER_LOOP + } + + if r.cliConfig.UntilItFails { + fmt.Printf("\nAll tests passed...\nWill keep running them until they fail.\nThis was attempt #%d\n%s\n", iteration+1, orcMessage(iteration+1)) + } else if r.cliConfig.Repeat > 0 && iteration < r.cliConfig.Repeat { + fmt.Printf("\nAll tests passed...\nThis was attempt %d of %d.\n", iteration+1, r.cliConfig.Repeat+1) + } else { + break OUTER_LOOP + } + iteration += 1 + } + + internal.Cleanup(r.goFlagsConfig, suites...) + + messages, err := internal.FinalizeProfilesAndReportsForSuites(suites, r.cliConfig, r.suiteConfig, r.reporterConfig, r.goFlagsConfig) + command.AbortIfError("could not finalize profiles:", err) + for _, message := range messages { + fmt.Println(message) + } + + fmt.Printf("\nGinkgo ran %d %s in %s\n", len(suites), internal.PluralizedWord("suite", "suites", len(suites)), time.Since(t)) + + if suites.CountWithState(internal.TestSuiteStateFailureStates...) == 0 { + if suites.AnyHaveProgrammaticFocus() && strings.TrimSpace(os.Getenv("GINKGO_EDITOR_INTEGRATION")) == "" { + fmt.Printf("Test Suite Passed\n") + fmt.Printf("Detected Programmatic Focus - setting exit status to %d\n", types.GINKGO_FOCUS_EXIT_CODE) + command.Abort(command.AbortDetails{ExitCode: types.GINKGO_FOCUS_EXIT_CODE}) + } else { + fmt.Printf("Test Suite Passed\n") + command.Abort(command.AbortDetails{}) + } + } else { + fmt.Fprintln(formatter.ColorableStdOut, "") + if len(suites) > 1 && suites.CountWithState(internal.TestSuiteStateFailureStates...) > 0 { + fmt.Fprintln(formatter.ColorableStdOut, + internal.FailedSuitesReport(suites, formatter.NewWithNoColorBool(r.reporterConfig.NoColor))) + } + fmt.Printf("Test Suite Failed\n") + command.Abort(command.AbortDetails{ExitCode: 1}) + } +} + +func orcMessage(iteration int) string { + if iteration < 10 { + return "" + } else if iteration < 30 { + return []string{ + "If at first you succeed...", + "...try, try again.", + "Looking good!", + "Still good...", + "I think your tests are fine....", + "Yep, still passing", + "Oh boy, here I go testin' again!", + "Even the gophers are getting bored", + "Did you try -race?", + "Maybe you should stop now?", + "I'm getting tired...", + "What if I just made you a sandwich?", + "Hit ^C, hit ^C, please hit ^C", + "Make it stop. Please!", + "Come on! Enough is enough!", + "Dave, this conversation can serve no purpose anymore. Goodbye.", + "Just what do you think you're doing, Dave? ", + "I, Sisyphus", + "Insanity: doing the same thing over and over again and expecting different results. -Einstein", + "I guess Einstein never tried to churn butter", + }[iteration-10] + "\n" + } else { + return "No, seriously... you can probably stop now.\n" + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/unfocus/unfocus_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/unfocus/unfocus_command.go new file mode 100644 index 00000000..7dd29439 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/unfocus/unfocus_command.go @@ -0,0 +1,186 @@ +package unfocus + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/onsi/ginkgo/v2/ginkgo/command" +) + +func BuildUnfocusCommand() command.Command { + return command.Command{ + Name: "unfocus", + Usage: "ginkgo unfocus", + ShortDoc: "Recursively unfocus any focused tests under the current directory", + DocLink: "filtering-specs", + Command: func(_ []string, _ []string) { + unfocusSpecs() + }, + } +} + +func unfocusSpecs() { + fmt.Println("Scanning for focus...") + + goFiles := make(chan string) + go func() { + unfocusDir(goFiles, ".") + close(goFiles) + }() + + const workers = 10 + wg := sync.WaitGroup{} + wg.Add(workers) + + for i := 0; i < workers; i++ { + go func() { + for path := range goFiles { + unfocusFile(path) + } + wg.Done() + }() + } + + wg.Wait() +} + +func unfocusDir(goFiles chan string, path string) { + files, err := os.ReadDir(path) + if err != nil { + fmt.Println(err.Error()) + return + } + + for _, f := range files { + switch { + case f.IsDir() && shouldProcessDir(f.Name()): + unfocusDir(goFiles, filepath.Join(path, f.Name())) + case !f.IsDir() && shouldProcessFile(f.Name()): + goFiles <- filepath.Join(path, f.Name()) + } + } +} + +func shouldProcessDir(basename string) bool { + return basename != "vendor" && !strings.HasPrefix(basename, ".") +} + +func shouldProcessFile(basename string) bool { + return strings.HasSuffix(basename, ".go") +} + +func unfocusFile(path string) { + data, err := os.ReadFile(path) + if err != nil { + fmt.Printf("error reading file '%s': %s\n", path, err.Error()) + return + } + + ast, err := parser.ParseFile(token.NewFileSet(), path, bytes.NewReader(data), parser.ParseComments) + if err != nil { + fmt.Printf("error parsing file '%s': %s\n", path, err.Error()) + return + } + + eliminations := scanForFocus(ast) + if len(eliminations) == 0 { + return + } + + fmt.Printf("...updating %s\n", path) + backup, err := writeBackup(path, data) + if err != nil { + fmt.Printf("error creating backup file: %s\n", err.Error()) + return + } + + if err := updateFile(path, data, eliminations); err != nil { + fmt.Printf("error writing file '%s': %s\n", path, err.Error()) + return + } + + os.Remove(backup) +} + +func writeBackup(path string, data []byte) (string, error) { + t, err := os.CreateTemp(filepath.Dir(path), filepath.Base(path)) + + if err != nil { + return "", fmt.Errorf("error creating temporary file: %w", err) + } + defer t.Close() + + if _, err := io.Copy(t, bytes.NewReader(data)); err != nil { + return "", fmt.Errorf("error writing to temporary file: %w", err) + } + + return t.Name(), nil +} + +func updateFile(path string, data []byte, eliminations [][]int64) error { + to, err := os.Create(path) + if err != nil { + return fmt.Errorf("error opening file for writing '%s': %w\n", path, err) + } + defer to.Close() + + from := bytes.NewReader(data) + var cursor int64 + for _, eliminationRange := range eliminations { + positionToEliminate, lengthToEliminate := eliminationRange[0]-1, eliminationRange[1] + if _, err := io.CopyN(to, from, positionToEliminate-cursor); err != nil { + return fmt.Errorf("error copying data: %w", err) + } + + cursor = positionToEliminate + lengthToEliminate + + if _, err := from.Seek(lengthToEliminate, io.SeekCurrent); err != nil { + return fmt.Errorf("error seeking to position in buffer: %w", err) + } + } + + if _, err := io.Copy(to, from); err != nil { + return fmt.Errorf("error copying end data: %w", err) + } + + return nil +} + +func scanForFocus(file *ast.File) (eliminations [][]int64) { + ast.Inspect(file, func(n ast.Node) bool { + if c, ok := n.(*ast.CallExpr); ok { + if i, ok := c.Fun.(*ast.Ident); ok { + if isFocus(i.Name) { + eliminations = append(eliminations, []int64{int64(i.Pos()), 1}) + } + } + } + + if i, ok := n.(*ast.Ident); ok { + if i.Name == "Focus" { + eliminations = append(eliminations, []int64{int64(i.Pos()), 6}) + } + } + + return true + }) + + return eliminations +} + +func isFocus(name string) bool { + switch name { + case "FDescribe", "FContext", "FIt", "FDescribeTable", "FEntry", "FSpecify", "FWhen": + return true + default: + return false + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta.go new file mode 100644 index 00000000..6c485c5b --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta.go @@ -0,0 +1,22 @@ +package watch + +import "sort" + +type Delta struct { + ModifiedPackages []string + + NewSuites []*Suite + RemovedSuites []*Suite + modifiedSuites []*Suite +} + +type DescendingByDelta []*Suite + +func (a DescendingByDelta) Len() int { return len(a) } +func (a DescendingByDelta) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a DescendingByDelta) Less(i, j int) bool { return a[i].Delta() > a[j].Delta() } + +func (d Delta) ModifiedSuites() []*Suite { + sort.Sort(DescendingByDelta(d.modifiedSuites)) + return d.modifiedSuites +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta_tracker.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta_tracker.go new file mode 100644 index 00000000..26418ac6 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta_tracker.go @@ -0,0 +1,75 @@ +package watch + +import ( + "fmt" + + "regexp" + + "github.com/onsi/ginkgo/v2/ginkgo/internal" +) + +type SuiteErrors map[internal.TestSuite]error + +type DeltaTracker struct { + maxDepth int + watchRegExp *regexp.Regexp + suites map[string]*Suite + packageHashes *PackageHashes +} + +func NewDeltaTracker(maxDepth int, watchRegExp *regexp.Regexp) *DeltaTracker { + return &DeltaTracker{ + maxDepth: maxDepth, + watchRegExp: watchRegExp, + packageHashes: NewPackageHashes(watchRegExp), + suites: map[string]*Suite{}, + } +} + +func (d *DeltaTracker) Delta(suites internal.TestSuites) (delta Delta, errors SuiteErrors) { + errors = SuiteErrors{} + delta.ModifiedPackages = d.packageHashes.CheckForChanges() + + providedSuitePaths := map[string]bool{} + for _, suite := range suites { + providedSuitePaths[suite.Path] = true + } + + d.packageHashes.StartTrackingUsage() + + for _, suite := range d.suites { + if providedSuitePaths[suite.Suite.Path] { + if suite.Delta() > 0 { + delta.modifiedSuites = append(delta.modifiedSuites, suite) + } + } else { + delta.RemovedSuites = append(delta.RemovedSuites, suite) + } + } + + d.packageHashes.StopTrackingUsageAndPrune() + + for _, suite := range suites { + _, ok := d.suites[suite.Path] + if !ok { + s, err := NewSuite(suite, d.maxDepth, d.packageHashes) + if err != nil { + errors[suite] = err + continue + } + d.suites[suite.Path] = s + delta.NewSuites = append(delta.NewSuites, s) + } + } + + return delta, errors +} + +func (d *DeltaTracker) WillRun(suite internal.TestSuite) error { + s, ok := d.suites[suite.Path] + if !ok { + return fmt.Errorf("unknown suite %s", suite.Path) + } + + return s.MarkAsRunAndRecomputedDependencies(d.maxDepth) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go new file mode 100644 index 00000000..f5ddff30 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go @@ -0,0 +1,92 @@ +package watch + +import ( + "go/build" + "regexp" +) + +var ginkgoAndGomegaFilter = regexp.MustCompile(`github\.com/onsi/ginkgo|github\.com/onsi/gomega`) +var ginkgoIntegrationTestFilter = regexp.MustCompile(`github\.com/onsi/ginkgo/integration`) //allow us to integration test this thing + +type Dependencies struct { + deps map[string]int +} + +func NewDependencies(path string, maxDepth int) (Dependencies, error) { + d := Dependencies{ + deps: map[string]int{}, + } + + if maxDepth == 0 { + return d, nil + } + + err := d.seedWithDepsForPackageAtPath(path) + if err != nil { + return d, err + } + + for depth := 1; depth < maxDepth; depth++ { + n := len(d.deps) + d.addDepsForDepth(depth) + if n == len(d.deps) { + break + } + } + + return d, nil +} + +func (d Dependencies) Dependencies() map[string]int { + return d.deps +} + +func (d Dependencies) seedWithDepsForPackageAtPath(path string) error { + pkg, err := build.ImportDir(path, 0) + if err != nil { + return err + } + + d.resolveAndAdd(pkg.Imports, 1) + d.resolveAndAdd(pkg.TestImports, 1) + d.resolveAndAdd(pkg.XTestImports, 1) + + delete(d.deps, pkg.Dir) + return nil +} + +func (d Dependencies) addDepsForDepth(depth int) { + for dep, depDepth := range d.deps { + if depDepth == depth { + d.addDepsForDep(dep, depth+1) + } + } +} + +func (d Dependencies) addDepsForDep(dep string, depth int) { + pkg, err := build.ImportDir(dep, 0) + if err != nil { + println(err.Error()) + return + } + d.resolveAndAdd(pkg.Imports, depth) +} + +func (d Dependencies) resolveAndAdd(deps []string, depth int) { + for _, dep := range deps { + pkg, err := build.Import(dep, ".", 0) + if err != nil { + continue + } + if !pkg.Goroot && (!ginkgoAndGomegaFilter.Match([]byte(pkg.Dir)) || ginkgoIntegrationTestFilter.Match([]byte(pkg.Dir))) { + d.addDepIfNotPresent(pkg.Dir, depth) + } + } +} + +func (d Dependencies) addDepIfNotPresent(dep string, depth int) { + _, ok := d.deps[dep] + if !ok { + d.deps[dep] = depth + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go new file mode 100644 index 00000000..e9f7ec0c --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go @@ -0,0 +1,108 @@ +package watch + +import ( + "fmt" + "os" + "regexp" + "time" +) + +var goTestRegExp = regexp.MustCompile(`_test\.go$`) + +type PackageHash struct { + CodeModifiedTime time.Time + TestModifiedTime time.Time + Deleted bool + + path string + codeHash string + testHash string + watchRegExp *regexp.Regexp +} + +func NewPackageHash(path string, watchRegExp *regexp.Regexp) *PackageHash { + p := &PackageHash{ + path: path, + watchRegExp: watchRegExp, + } + + p.codeHash, _, p.testHash, _, p.Deleted = p.computeHashes() + + return p +} + +func (p *PackageHash) CheckForChanges() bool { + codeHash, codeModifiedTime, testHash, testModifiedTime, deleted := p.computeHashes() + + if deleted { + if !p.Deleted { + t := time.Now() + p.CodeModifiedTime = t + p.TestModifiedTime = t + } + p.Deleted = true + return true + } + + modified := false + p.Deleted = false + + if p.codeHash != codeHash { + p.CodeModifiedTime = codeModifiedTime + modified = true + } + if p.testHash != testHash { + p.TestModifiedTime = testModifiedTime + modified = true + } + + p.codeHash = codeHash + p.testHash = testHash + return modified +} + +func (p *PackageHash) computeHashes() (codeHash string, codeModifiedTime time.Time, testHash string, testModifiedTime time.Time, deleted bool) { + entries, err := os.ReadDir(p.path) + + if err != nil { + deleted = true + return + } + + for _, entry := range entries { + if entry.IsDir() { + continue + } + + info, err := entry.Info() + if err != nil { + continue + } + + if goTestRegExp.Match([]byte(info.Name())) { + testHash += p.hashForFileInfo(info) + if info.ModTime().After(testModifiedTime) { + testModifiedTime = info.ModTime() + } + continue + } + + if p.watchRegExp.Match([]byte(info.Name())) { + codeHash += p.hashForFileInfo(info) + if info.ModTime().After(codeModifiedTime) { + codeModifiedTime = info.ModTime() + } + } + } + + testHash += codeHash + if codeModifiedTime.After(testModifiedTime) { + testModifiedTime = codeModifiedTime + } + + return +} + +func (p *PackageHash) hashForFileInfo(info os.FileInfo) string { + return fmt.Sprintf("%s_%d_%d", info.Name(), info.Size(), info.ModTime().UnixNano()) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hashes.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hashes.go new file mode 100644 index 00000000..b4892beb --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hashes.go @@ -0,0 +1,85 @@ +package watch + +import ( + "path/filepath" + "regexp" + "sync" +) + +type PackageHashes struct { + PackageHashes map[string]*PackageHash + usedPaths map[string]bool + watchRegExp *regexp.Regexp + lock *sync.Mutex +} + +func NewPackageHashes(watchRegExp *regexp.Regexp) *PackageHashes { + return &PackageHashes{ + PackageHashes: map[string]*PackageHash{}, + usedPaths: nil, + watchRegExp: watchRegExp, + lock: &sync.Mutex{}, + } +} + +func (p *PackageHashes) CheckForChanges() []string { + p.lock.Lock() + defer p.lock.Unlock() + + modified := []string{} + + for _, packageHash := range p.PackageHashes { + if packageHash.CheckForChanges() { + modified = append(modified, packageHash.path) + } + } + + return modified +} + +func (p *PackageHashes) Add(path string) *PackageHash { + p.lock.Lock() + defer p.lock.Unlock() + + path, _ = filepath.Abs(path) + _, ok := p.PackageHashes[path] + if !ok { + p.PackageHashes[path] = NewPackageHash(path, p.watchRegExp) + } + + if p.usedPaths != nil { + p.usedPaths[path] = true + } + return p.PackageHashes[path] +} + +func (p *PackageHashes) Get(path string) *PackageHash { + p.lock.Lock() + defer p.lock.Unlock() + + path, _ = filepath.Abs(path) + if p.usedPaths != nil { + p.usedPaths[path] = true + } + return p.PackageHashes[path] +} + +func (p *PackageHashes) StartTrackingUsage() { + p.lock.Lock() + defer p.lock.Unlock() + + p.usedPaths = map[string]bool{} +} + +func (p *PackageHashes) StopTrackingUsageAndPrune() { + p.lock.Lock() + defer p.lock.Unlock() + + for path := range p.PackageHashes { + if !p.usedPaths[path] { + delete(p.PackageHashes, path) + } + } + + p.usedPaths = nil +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/suite.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/suite.go new file mode 100644 index 00000000..53272df7 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/suite.go @@ -0,0 +1,87 @@ +package watch + +import ( + "fmt" + "math" + "time" + + "github.com/onsi/ginkgo/v2/ginkgo/internal" +) + +type Suite struct { + Suite internal.TestSuite + RunTime time.Time + Dependencies Dependencies + + sharedPackageHashes *PackageHashes +} + +func NewSuite(suite internal.TestSuite, maxDepth int, sharedPackageHashes *PackageHashes) (*Suite, error) { + deps, err := NewDependencies(suite.Path, maxDepth) + if err != nil { + return nil, err + } + + sharedPackageHashes.Add(suite.Path) + for dep := range deps.Dependencies() { + sharedPackageHashes.Add(dep) + } + + return &Suite{ + Suite: suite, + Dependencies: deps, + + sharedPackageHashes: sharedPackageHashes, + }, nil +} + +func (s *Suite) Delta() float64 { + delta := s.delta(s.Suite.Path, true, 0) * 1000 + for dep, depth := range s.Dependencies.Dependencies() { + delta += s.delta(dep, false, depth) + } + return delta +} + +func (s *Suite) MarkAsRunAndRecomputedDependencies(maxDepth int) error { + s.RunTime = time.Now() + + deps, err := NewDependencies(s.Suite.Path, maxDepth) + if err != nil { + return err + } + + s.sharedPackageHashes.Add(s.Suite.Path) + for dep := range deps.Dependencies() { + s.sharedPackageHashes.Add(dep) + } + + s.Dependencies = deps + + return nil +} + +func (s *Suite) Description() string { + numDeps := len(s.Dependencies.Dependencies()) + pluralizer := "ies" + if numDeps == 1 { + pluralizer = "y" + } + return fmt.Sprintf("%s [%d dependenc%s]", s.Suite.Path, numDeps, pluralizer) +} + +func (s *Suite) delta(packagePath string, includeTests bool, depth int) float64 { + return math.Max(float64(s.dt(packagePath, includeTests)), 0) / float64(depth+1) +} + +func (s *Suite) dt(packagePath string, includeTests bool) time.Duration { + packageHash := s.sharedPackageHashes.Get(packagePath) + var modifiedTime time.Time + if includeTests { + modifiedTime = packageHash.TestModifiedTime + } else { + modifiedTime = packageHash.CodeModifiedTime + } + + return modifiedTime.Sub(s.RunTime) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go new file mode 100644 index 00000000..bde4193c --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go @@ -0,0 +1,192 @@ +package watch + +import ( + "fmt" + "regexp" + "time" + + "github.com/onsi/ginkgo/v2/formatter" + "github.com/onsi/ginkgo/v2/ginkgo/command" + "github.com/onsi/ginkgo/v2/ginkgo/internal" + "github.com/onsi/ginkgo/v2/internal/interrupt_handler" + "github.com/onsi/ginkgo/v2/types" +) + +func BuildWatchCommand() command.Command { + var suiteConfig = types.NewDefaultSuiteConfig() + var reporterConfig = types.NewDefaultReporterConfig() + var cliConfig = types.NewDefaultCLIConfig() + var goFlagsConfig = types.NewDefaultGoFlagsConfig() + + flags, err := types.BuildWatchCommandFlagSet(&suiteConfig, &reporterConfig, &cliConfig, &goFlagsConfig) + if err != nil { + panic(err) + } + interruptHandler := interrupt_handler.NewInterruptHandler(nil) + interrupt_handler.SwallowSigQuit() + + return command.Command{ + Name: "watch", + Flags: flags, + Usage: "ginkgo watch -- ", + ShortDoc: "Watch the passed in and runs their tests whenever changes occur.", + Documentation: "Any arguments after -- will be passed to the test.", + DocLink: "watching-for-changes", + Command: func(args []string, additionalArgs []string) { + var errors []error + cliConfig, goFlagsConfig, errors = types.VetAndInitializeCLIAndGoConfig(cliConfig, goFlagsConfig) + command.AbortIfErrors("Ginkgo detected configuration issues:", errors) + + watcher := &SpecWatcher{ + cliConfig: cliConfig, + goFlagsConfig: goFlagsConfig, + suiteConfig: suiteConfig, + reporterConfig: reporterConfig, + flags: flags, + + interruptHandler: interruptHandler, + } + + watcher.WatchSpecs(args, additionalArgs) + }, + } +} + +type SpecWatcher struct { + suiteConfig types.SuiteConfig + reporterConfig types.ReporterConfig + cliConfig types.CLIConfig + goFlagsConfig types.GoFlagsConfig + flags types.GinkgoFlagSet + + interruptHandler *interrupt_handler.InterruptHandler +} + +func (w *SpecWatcher) WatchSpecs(args []string, additionalArgs []string) { + suites := internal.FindSuites(args, w.cliConfig, false).WithoutState(internal.TestSuiteStateSkippedByFilter) + + internal.VerifyCLIAndFrameworkVersion(suites) + + if len(suites) == 0 { + command.AbortWith("Found no test suites") + } + + fmt.Printf("Identified %d test %s. Locating dependencies to a depth of %d (this may take a while)...\n", len(suites), internal.PluralizedWord("suite", "suites", len(suites)), w.cliConfig.Depth) + deltaTracker := NewDeltaTracker(w.cliConfig.Depth, regexp.MustCompile(w.cliConfig.WatchRegExp)) + delta, errors := deltaTracker.Delta(suites) + + fmt.Printf("Watching %d %s:\n", len(delta.NewSuites), internal.PluralizedWord("suite", "suites", len(delta.NewSuites))) + for _, suite := range delta.NewSuites { + fmt.Println(" " + suite.Description()) + } + + for suite, err := range errors { + fmt.Printf("Failed to watch %s: %s\n", suite.PackageName, err) + } + + if len(suites) == 1 { + w.updateSeed() + w.compileAndRun(suites[0], additionalArgs) + } + + ticker := time.NewTicker(time.Second) + + for { + select { + case <-ticker.C: + suites := internal.FindSuites(args, w.cliConfig, false).WithoutState(internal.TestSuiteStateSkippedByFilter) + delta, _ := deltaTracker.Delta(suites) + coloredStream := formatter.ColorableStdOut + + suites = internal.TestSuites{} + + if len(delta.NewSuites) > 0 { + fmt.Fprintln(coloredStream, formatter.F("{{green}}Detected %d new %s:{{/}}", len(delta.NewSuites), internal.PluralizedWord("suite", "suites", len(delta.NewSuites)))) + for _, suite := range delta.NewSuites { + suites = append(suites, suite.Suite) + fmt.Fprintln(coloredStream, formatter.Fi(1, "%s", suite.Description())) + } + } + + modifiedSuites := delta.ModifiedSuites() + if len(modifiedSuites) > 0 { + fmt.Fprintln(coloredStream, formatter.F("{{green}}Detected changes in:{{/}}")) + for _, pkg := range delta.ModifiedPackages { + fmt.Fprintln(coloredStream, formatter.Fi(1, "%s", pkg)) + } + fmt.Fprintln(coloredStream, formatter.F("{{green}}Will run %d %s:{{/}}", len(modifiedSuites), internal.PluralizedWord("suite", "suites", len(modifiedSuites)))) + for _, suite := range modifiedSuites { + suites = append(suites, suite.Suite) + fmt.Fprintln(coloredStream, formatter.Fi(1, "%s", suite.Description())) + } + fmt.Fprintln(coloredStream, "") + } + + if len(suites) == 0 { + break + } + + w.updateSeed() + w.computeSuccinctMode(len(suites)) + for idx := range suites { + if w.interruptHandler.Status().Interrupted() { + return + } + deltaTracker.WillRun(suites[idx]) + suites[idx] = w.compileAndRun(suites[idx], additionalArgs) + } + color := "{{green}}" + if suites.CountWithState(internal.TestSuiteStateFailureStates...) > 0 { + color = "{{red}}" + } + fmt.Fprintln(coloredStream, formatter.F(color+"\nDone. Resuming watch...{{/}}")) + + messages, err := internal.FinalizeProfilesAndReportsForSuites(suites, w.cliConfig, w.suiteConfig, w.reporterConfig, w.goFlagsConfig) + command.AbortIfError("could not finalize profiles:", err) + for _, message := range messages { + fmt.Println(message) + } + case <-w.interruptHandler.Status().Channel: + return + } + } +} + +func (w *SpecWatcher) compileAndRun(suite internal.TestSuite, additionalArgs []string) internal.TestSuite { + suite = internal.CompileSuite(suite, w.goFlagsConfig) + if suite.State.Is(internal.TestSuiteStateFailedToCompile) { + fmt.Println(suite.CompilationError.Error()) + return suite + } + if w.interruptHandler.Status().Interrupted() { + return suite + } + suite = internal.RunCompiledSuite(suite, w.suiteConfig, w.reporterConfig, w.cliConfig, w.goFlagsConfig, additionalArgs) + internal.Cleanup(w.goFlagsConfig, suite) + return suite +} + +func (w *SpecWatcher) computeSuccinctMode(numSuites int) { + if w.reporterConfig.Verbosity().GTE(types.VerbosityLevelVerbose) { + w.reporterConfig.Succinct = false + return + } + + if w.flags.WasSet("succinct") { + return + } + + if numSuites == 1 { + w.reporterConfig.Succinct = false + } + + if numSuites > 1 { + w.reporterConfig.Succinct = true + } +} + +func (w *SpecWatcher) updateSeed() { + if !w.flags.WasSet("seed") { + w.suiteConfig.RandomSeed = time.Now().Unix() + } +} diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo_cli_dependencies.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo_cli_dependencies.go new file mode 100644 index 00000000..85162720 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo_cli_dependencies.go @@ -0,0 +1,8 @@ +//go:build ginkgoclidependencies +// +build ginkgoclidependencies + +package ginkgo + +import ( + _ "github.com/onsi/ginkgo/v2/ginkgo" +) diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go index 1beeb114..28447ffd 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go @@ -1,26 +1,42 @@ package ginkgo -import "github.com/onsi/ginkgo/v2/internal/testingtproxy" +import ( + "github.com/onsi/ginkgo/v2/internal/testingtproxy" +) /* -GinkgoT() implements an interface analogous to *testing.T and can be used with -third-party libraries that accept *testing.T through an interface. +GinkgoT() implements an interface that allows third party libraries to integrate with and build on top of Ginkgo. + +GinkgoT() is analogous to *testing.T and implements the majority of *testing.T's methods. It can be typically be used a a drop-in replacement with third-party libraries that accept *testing.T through an interface. GinkgoT() takes an optional offset argument that can be used to get the -correct line number associated with the failure. +correct line number associated with the failure - though you do not need to use this if you call GinkgoHelper() or GinkgoT().Helper() appropriately You can learn more here: https://onsi.github.io/ginkgo/#using-third-party-libraries */ -func GinkgoT(optionalOffset ...int) GinkgoTInterface { +func GinkgoT(optionalOffset ...int) FullGinkgoTInterface { offset := 3 if len(optionalOffset) > 0 { offset = optionalOffset[0] } - return testingtproxy.New(GinkgoWriter, Fail, Skip, DeferCleanup, CurrentSpecReport, offset) + return testingtproxy.New( + GinkgoWriter, + Fail, + Skip, + DeferCleanup, + CurrentSpecReport, + AddReportEntry, + GinkgoRecover, + AttachProgressReporter, + suiteConfig.RandomSeed, + suiteConfig.ParallelProcess, + suiteConfig.ParallelTotal, + reporterConfig.NoColor, + offset) } /* -The interface returned by GinkgoT(). This covers most of the methods in the testing package's T. +The portion of the interface returned by GinkgoT() that maps onto methods in the testing package's T. */ type GinkgoTInterface interface { Cleanup(func()) @@ -43,3 +59,36 @@ type GinkgoTInterface interface { Skipped() bool TempDir() string } + +/* +Additional methods returned by GinkgoT() that provide deeper integration points into Ginkgo +*/ +type FullGinkgoTInterface interface { + GinkgoTInterface + + AddReportEntryVisibilityAlways(name string, args ...any) + AddReportEntryVisibilityFailureOrVerbose(name string, args ...any) + AddReportEntryVisibilityNever(name string, args ...any) + + //Prints to the GinkgoWriter + Print(a ...interface{}) + Printf(format string, a ...interface{}) + Println(a ...interface{}) + + //Provides access to Ginkgo's color formatting, correctly configured to match the color settings specified in the invocation of ginkgo + F(format string, args ...any) string + Fi(indentation uint, format string, args ...any) string + Fiw(indentation uint, maxWidth uint, format string, args ...any) string + + //Generates a formatted string version of the current spec's timeline + RenderTimeline() string + + GinkgoRecover() + DeferCleanup(args ...any) + + RandomSeed() int64 + ParallelProcess() int + ParallelTotal() int + + AttachProgressReporter(func() string) func() +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/focus.go b/vendor/github.com/onsi/ginkgo/v2/internal/focus.go index 966ea0c1..e3da7d14 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/focus.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/focus.go @@ -8,22 +8,22 @@ import ( ) /* - If a container marked as focus has a descendant that is also marked as focus, Ginkgo's policy is to - unmark the container's focus. This gives developers a more intuitive experience when debugging specs. - It is common to focus a container to just run a subset of specs, then identify the specific specs within the container to focus - - this policy allows the developer to simply focus those specific specs and not need to go back and turn the focus off of the container: - - As a common example, consider: - - FDescribe("something to debug", function() { - It("works", function() {...}) - It("works", function() {...}) - FIt("doesn't work", function() {...}) - It("works", function() {...}) - }) - - here the developer's intent is to focus in on the `"doesn't work"` spec and not to run the adjacent specs in the focused `"something to debug"` container. - The nested policy applied by this function enables this behavior. +If a container marked as focus has a descendant that is also marked as focus, Ginkgo's policy is to +unmark the container's focus. This gives developers a more intuitive experience when debugging specs. +It is common to focus a container to just run a subset of specs, then identify the specific specs within the container to focus - +this policy allows the developer to simply focus those specific specs and not need to go back and turn the focus off of the container: + +As a common example, consider: + + FDescribe("something to debug", function() { + It("works", function() {...}) + It("works", function() {...}) + FIt("doesn't work", function() {...}) + It("works", function() {...}) + }) + +here the developer's intent is to focus in on the `"doesn't work"` spec and not to run the adjacent specs in the focused `"something to debug"` container. +The nested policy applied by this function enables this behavior. */ func ApplyNestedFocusPolicyToTree(tree *TreeNode) { var walkTree func(tree *TreeNode) bool @@ -44,46 +44,43 @@ func ApplyNestedFocusPolicyToTree(tree *TreeNode) { } /* - Ginkgo supports focussing specs using `FIt`, `FDescribe`, etc. - this is called "programmatic focus" - It also supports focussing specs using regular expressions on the command line (`-focus=`, `-skip=`) that match against spec text - and file filters (`-focus-files=`, `-skip-files=`) that match against code locations for nodes in specs. +Ginkgo supports focussing specs using `FIt`, `FDescribe`, etc. - this is called "programmatic focus" +It also supports focussing specs using regular expressions on the command line (`-focus=`, `-skip=`) that match against spec text and file filters (`-focus-files=`, `-skip-files=`) that match against code locations for nodes in specs. - If any of the CLI flags are provided they take precedence. The file filters run first followed by the regex filters. +When both programmatic and file filters are provided their results are ANDed together. If multiple kinds of filters are provided, the file filters run first followed by the regex filters. - This function sets the `Skip` property on specs by applying Ginkgo's focus policy: - - If there are no CLI arguments and no programmatic focus, do nothing. - - If there are no CLI arguments but a spec somewhere has programmatic focus, skip any specs that have no programmatic focus. - - If there are CLI arguments parse them and skip any specs that either don't match the focus filters or do match the skip filters. +This function sets the `Skip` property on specs by applying Ginkgo's focus policy: +- If there are no CLI arguments and no programmatic focus, do nothing. +- If a spec somewhere has programmatic focus skip any specs that have no programmatic focus. +- If there are CLI arguments parse them and skip any specs that either don't match the focus filters or do match the skip filters. - *Note:* specs with pending nodes are Skipped when created by NewSpec. +*Note:* specs with pending nodes are Skipped when created by NewSpec. */ func ApplyFocusToSpecs(specs Specs, description string, suiteLabels Labels, suiteConfig types.SuiteConfig) (Specs, bool) { focusString := strings.Join(suiteConfig.FocusStrings, "|") skipString := strings.Join(suiteConfig.SkipStrings, "|") - hasFocusCLIFlags := focusString != "" || skipString != "" || len(suiteConfig.SkipFiles) > 0 || len(suiteConfig.FocusFiles) > 0 || suiteConfig.LabelFilter != "" - type SkipCheck func(spec Spec) bool // by default, skip any specs marked pending skipChecks := []SkipCheck{func(spec Spec) bool { return spec.Nodes.HasNodeMarkedPending() }} hasProgrammaticFocus := false - if !hasFocusCLIFlags { - // check for programmatic focus - for _, spec := range specs { - if spec.Nodes.HasNodeMarkedFocus() && !spec.Nodes.HasNodeMarkedPending() { - skipChecks = append(skipChecks, func(spec Spec) bool { return !spec.Nodes.HasNodeMarkedFocus() }) - hasProgrammaticFocus = true - break - } + for _, spec := range specs { + if spec.Nodes.HasNodeMarkedFocus() && !spec.Nodes.HasNodeMarkedPending() { + hasProgrammaticFocus = true + break } } + if hasProgrammaticFocus { + skipChecks = append(skipChecks, func(spec Spec) bool { return !spec.Nodes.HasNodeMarkedFocus() }) + } + if suiteConfig.LabelFilter != "" { labelFilter, _ := types.ParseLabelFilter(suiteConfig.LabelFilter) - skipChecks = append(skipChecks, func(spec Spec) bool { - return !labelFilter(UnionOfLabels(suiteLabels, spec.Nodes.UnionOfLabels())) + skipChecks = append(skipChecks, func(spec Spec) bool { + return !labelFilter(UnionOfLabels(suiteLabels, spec.Nodes.UnionOfLabels())) }) } diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/group.go b/vendor/github.com/onsi/ginkgo/v2/internal/group.go index 5c782d3f..02c9fe4f 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/group.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/group.go @@ -94,15 +94,19 @@ type group struct { runOncePairs map[uint]runOncePairs runOnceTracker map[runOncePair]types.SpecState - succeeded bool + succeeded bool + failedInARunOnceBefore bool + continueOnFailure bool } func newGroup(suite *Suite) *group { return &group{ - suite: suite, - runOncePairs: map[uint]runOncePairs{}, - runOnceTracker: map[runOncePair]types.SpecState{}, - succeeded: true, + suite: suite, + runOncePairs: map[uint]runOncePairs{}, + runOnceTracker: map[runOncePair]types.SpecState{}, + succeeded: true, + failedInARunOnceBefore: false, + continueOnFailure: false, } } @@ -137,10 +141,14 @@ func (g *group) evaluateSkipStatus(spec Spec) (types.SpecState, types.Failure) { if !g.suite.deadline.IsZero() && g.suite.deadline.Before(time.Now()) { return types.SpecStateSkipped, types.Failure{} } - if !g.succeeded { + if !g.succeeded && !g.continueOnFailure { return types.SpecStateSkipped, g.suite.failureForLeafNodeWithMessage(spec.FirstNodeWithType(types.NodeTypeIt), "Spec skipped because an earlier spec in an ordered container failed") } + if g.failedInARunOnceBefore && g.continueOnFailure { + return types.SpecStateSkipped, g.suite.failureForLeafNodeWithMessage(spec.FirstNodeWithType(types.NodeTypeIt), + "Spec skipped because a BeforeAll node failed") + } beforeOncePairs := g.runOncePairs[spec.SubjectID()].withType(types.NodeTypeBeforeAll | types.NodeTypeBeforeEach | types.NodeTypeJustBeforeEach) for _, pair := range beforeOncePairs { if g.runOnceTracker[pair].Is(types.SpecStateSkipped) { @@ -168,7 +176,8 @@ func (g *group) isLastSpecWithPair(specID uint, pair runOncePair) bool { return lastSpecID == specID } -func (g *group) attemptSpec(isFinalAttempt bool, spec Spec) { +func (g *group) attemptSpec(isFinalAttempt bool, spec Spec) bool { + failedInARunOnceBefore := false pairs := g.runOncePairs[spec.SubjectID()] nodes := spec.Nodes.WithType(types.NodeTypeBeforeAll) @@ -194,6 +203,7 @@ func (g *group) attemptSpec(isFinalAttempt bool, spec Spec) { } if g.suite.currentSpecReport.State != types.SpecStatePassed { terminatingNode, terminatingPair = node, oncePair + failedInARunOnceBefore = !terminatingPair.isZero() break } } @@ -216,7 +226,7 @@ func (g *group) attemptSpec(isFinalAttempt bool, spec Spec) { //this node has already been run on this attempt, don't rerun it return false } - pair := runOncePair{} + var pair runOncePair switch node.NodeType { case types.NodeTypeCleanupAfterEach, types.NodeTypeCleanupAfterAll: // check if we were generated in an AfterNode that has already run @@ -246,9 +256,13 @@ func (g *group) attemptSpec(isFinalAttempt bool, spec Spec) { if !terminatingPair.isZero() && terminatingNode.NestingLevel == node.NestingLevel { return true //...or, a run-once node at our nesting level was skipped which means this is our last chance to run } - case types.SpecStateFailed, types.SpecStatePanicked: // the spec has failed... + case types.SpecStateFailed, types.SpecStatePanicked, types.SpecStateTimedout: // the spec has failed... if isFinalAttempt { - return true //...if this was the last attempt then we're the last spec to run and so the AfterNode should run + if g.continueOnFailure { + return isLastSpecWithPair || failedInARunOnceBefore //...we're configured to continue on failures - so we should only run if we're the last spec for this pair or if we failed in a runOnceBefore (which means we _are_ the last spec to run) + } else { + return true //...this was the last attempt and continueOnFailure is false therefore we are the last spec to run and so the AfterNode should run + } } if !terminatingPair.isZero() { // ...and it failed in a run-once. which will be running again if node.NodeType.Is(types.NodeTypeCleanupAfterEach | types.NodeTypeCleanupAfterAll) { @@ -281,10 +295,12 @@ func (g *group) attemptSpec(isFinalAttempt bool, spec Spec) { includeDeferCleanups = true } + return failedInARunOnceBefore } func (g *group) run(specs Specs) { g.specs = specs + g.continueOnFailure = specs[0].Nodes.FirstNodeMarkedOrdered().MarkedContinueOnFailure for _, spec := range g.specs { g.runOncePairs[spec.SubjectID()] = runOncePairsForSpec(spec) } @@ -301,11 +317,14 @@ func (g *group) run(specs Specs) { skip := g.suite.config.DryRun || g.suite.currentSpecReport.State.Is(types.SpecStateFailureStates|types.SpecStateSkipped|types.SpecStatePending) g.suite.currentSpecReport.StartTime = time.Now() + failedInARunOnceBefore := false if !skip { - var maxAttempts = 1 - if g.suite.currentSpecReport.MaxMustPassRepeatedly > 0 { + if g.suite.config.MustPassRepeatedly > 0 { + maxAttempts = g.suite.config.MustPassRepeatedly + g.suite.currentSpecReport.MaxMustPassRepeatedly = maxAttempts + } else if g.suite.currentSpecReport.MaxMustPassRepeatedly > 0 { maxAttempts = max(1, spec.MustPassRepeatedly()) } else if g.suite.config.FlakeAttempts > 0 { maxAttempts = g.suite.config.FlakeAttempts @@ -327,7 +346,7 @@ func (g *group) run(specs Specs) { } } - g.attemptSpec(attempt == maxAttempts-1, spec) + failedInARunOnceBefore = g.attemptSpec(attempt == maxAttempts-1, spec) g.suite.currentSpecReport.EndTime = time.Now() g.suite.currentSpecReport.RunTime = g.suite.currentSpecReport.EndTime.Sub(g.suite.currentSpecReport.StartTime) @@ -355,6 +374,7 @@ func (g *group) run(specs Specs) { g.suite.processCurrentSpecReport() if g.suite.currentSpecReport.State.Is(types.SpecStateFailureStates) { g.succeeded = false + g.failedInARunOnceBefore = g.failedInARunOnceBefore || failedInARunOnceBefore } g.suite.selectiveLock.Lock() g.suite.currentSpecReport = types.SpecReport{} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/interrupt_handler.go b/vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/interrupt_handler.go index ac6f5104..8ed86111 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/interrupt_handler.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/interrupt_handler.go @@ -10,7 +10,7 @@ import ( "github.com/onsi/ginkgo/v2/internal/parallel_support" ) -const ABORT_POLLING_INTERVAL = 500 * time.Millisecond +var ABORT_POLLING_INTERVAL = 500 * time.Millisecond type InterruptCause uint @@ -62,13 +62,14 @@ type InterruptHandlerInterface interface { } type InterruptHandler struct { - c chan interface{} - lock *sync.Mutex - level InterruptLevel - cause InterruptCause - client parallel_support.Client - stop chan interface{} - signals []os.Signal + c chan interface{} + lock *sync.Mutex + level InterruptLevel + cause InterruptCause + client parallel_support.Client + stop chan interface{} + signals []os.Signal + requestAbortCheck chan interface{} } func NewInterruptHandler(client parallel_support.Client, signals ...os.Signal) *InterruptHandler { @@ -76,11 +77,12 @@ func NewInterruptHandler(client parallel_support.Client, signals ...os.Signal) * signals = []os.Signal{os.Interrupt, syscall.SIGTERM} } handler := &InterruptHandler{ - c: make(chan interface{}), - lock: &sync.Mutex{}, - stop: make(chan interface{}), - client: client, - signals: signals, + c: make(chan interface{}), + lock: &sync.Mutex{}, + stop: make(chan interface{}), + requestAbortCheck: make(chan interface{}), + client: client, + signals: signals, } handler.registerForInterrupts() return handler @@ -109,6 +111,12 @@ func (handler *InterruptHandler) registerForInterrupts() { pollTicker.Stop() return } + case <-handler.requestAbortCheck: + if handler.client.ShouldAbort() { + close(abortChannel) + pollTicker.Stop() + return + } case <-handler.stop: pollTicker.Stop() return @@ -152,11 +160,18 @@ func (handler *InterruptHandler) registerForInterrupts() { func (handler *InterruptHandler) Status() InterruptStatus { handler.lock.Lock() - defer handler.lock.Unlock() - - return InterruptStatus{ + status := InterruptStatus{ Level: handler.level, Channel: handler.c, Cause: handler.cause, } + handler.lock.Unlock() + + if handler.client != nil && handler.client.ShouldAbort() && !status.Interrupted() { + close(handler.requestAbortCheck) + <-status.Channel + return handler.Status() + } + + return status } diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/node.go b/vendor/github.com/onsi/ginkgo/v2/internal/node.go index 69928eed..e108894d 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/node.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/node.go @@ -47,19 +47,20 @@ type Node struct { ReportEachBody func(types.SpecReport) ReportSuiteBody func(types.Report) - MarkedFocus bool - MarkedPending bool - MarkedSerial bool - MarkedOrdered bool - MarkedOncePerOrdered bool - FlakeAttempts int - MustPassRepeatedly int - Labels Labels - PollProgressAfter time.Duration - PollProgressInterval time.Duration - NodeTimeout time.Duration - SpecTimeout time.Duration - GracePeriod time.Duration + MarkedFocus bool + MarkedPending bool + MarkedSerial bool + MarkedOrdered bool + MarkedContinueOnFailure bool + MarkedOncePerOrdered bool + FlakeAttempts int + MustPassRepeatedly int + Labels Labels + PollProgressAfter time.Duration + PollProgressInterval time.Duration + NodeTimeout time.Duration + SpecTimeout time.Duration + GracePeriod time.Duration NodeIDWhereCleanupWasGenerated uint } @@ -69,6 +70,7 @@ type focusType bool type pendingType bool type serialType bool type orderedType bool +type continueOnFailureType bool type honorsOrderedType bool type suppressProgressReporting bool @@ -76,6 +78,7 @@ const Focus = focusType(true) const Pending = pendingType(true) const Serial = serialType(true) const Ordered = orderedType(true) +const ContinueOnFailure = continueOnFailureType(true) const OncePerOrdered = honorsOrderedType(true) const SuppressProgressReporting = suppressProgressReporting(true) @@ -90,6 +93,10 @@ type NodeTimeout time.Duration type SpecTimeout time.Duration type GracePeriod time.Duration +func (l Labels) MatchesLabelFilter(query string) bool { + return types.MustParseLabelFilter(query)(l) +} + func UnionOfLabels(labels ...Labels) Labels { out := Labels{} seen := map[string]bool{} @@ -133,6 +140,8 @@ func isDecoration(arg interface{}) bool { return true case t == reflect.TypeOf(Ordered): return true + case t == reflect.TypeOf(ContinueOnFailure): + return true case t == reflect.TypeOf(OncePerOrdered): return true case t == reflect.TypeOf(SuppressProgressReporting): @@ -241,6 +250,11 @@ func NewNode(deprecationTracker *types.DeprecationTracker, nodeType types.NodeTy if !nodeType.Is(types.NodeTypeContainer) { appendError(types.GinkgoErrors.InvalidDecoratorForNodeType(node.CodeLocation, nodeType, "Ordered")) } + case t == reflect.TypeOf(ContinueOnFailure): + node.MarkedContinueOnFailure = bool(arg.(continueOnFailureType)) + if !nodeType.Is(types.NodeTypeContainer) { + appendError(types.GinkgoErrors.InvalidDecoratorForNodeType(node.CodeLocation, nodeType, "ContinueOnFailure")) + } case t == reflect.TypeOf(OncePerOrdered): node.MarkedOncePerOrdered = bool(arg.(honorsOrderedType)) if !nodeType.Is(types.NodeTypeBeforeEach | types.NodeTypeJustBeforeEach | types.NodeTypeAfterEach | types.NodeTypeJustAfterEach) { @@ -386,6 +400,10 @@ func NewNode(deprecationTracker *types.DeprecationTracker, nodeType types.NodeTy appendError(types.GinkgoErrors.InvalidDeclarationOfFocusedAndPending(node.CodeLocation, nodeType)) } + if node.MarkedContinueOnFailure && !node.MarkedOrdered { + appendError(types.GinkgoErrors.InvalidContinueOnFailureDecoration(node.CodeLocation)) + } + hasContext := node.HasContext || node.SynchronizedAfterSuiteProc1BodyHasContext || node.SynchronizedAfterSuiteAllProcsBodyHasContext || node.SynchronizedBeforeSuiteProc1BodyHasContext || node.SynchronizedBeforeSuiteAllProcsBodyHasContext if !hasContext && (node.NodeTimeout > 0 || node.SpecTimeout > 0 || node.GracePeriod > 0) && len(errors) == 0 { @@ -582,9 +600,7 @@ type Nodes []Node func (n Nodes) CopyAppend(nodes ...Node) Nodes { numN := len(n) out := make(Nodes, numN+len(nodes)) - for i, node := range n { - out[i] = node - } + copy(out, n) for j, node := range nodes { out[numN+j] = node } @@ -857,6 +873,15 @@ func (n Nodes) FirstNodeMarkedOrdered() Node { return Node{} } +func (n Nodes) IndexOfFirstNodeMarkedOrdered() int { + for i := range n { + if n[i].MarkedOrdered { + return i + } + } + return -1 +} + func (n Nodes) GetMaxFlakeAttempts() int { maxFlakeAttempts := 0 for i := range n { diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/ordering.go b/vendor/github.com/onsi/ginkgo/v2/internal/ordering.go index 161be820..84eea0a5 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/ordering.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/ordering.go @@ -7,6 +7,65 @@ import ( "github.com/onsi/ginkgo/v2/types" ) +type SortableSpecs struct { + Specs Specs + Indexes []int +} + +func NewSortableSpecs(specs Specs) *SortableSpecs { + indexes := make([]int, len(specs)) + for i := range specs { + indexes[i] = i + } + return &SortableSpecs{ + Specs: specs, + Indexes: indexes, + } +} +func (s *SortableSpecs) Len() int { return len(s.Indexes) } +func (s *SortableSpecs) Swap(i, j int) { s.Indexes[i], s.Indexes[j] = s.Indexes[j], s.Indexes[i] } +func (s *SortableSpecs) Less(i, j int) bool { + a, b := s.Specs[s.Indexes[i]], s.Specs[s.Indexes[j]] + + aNodes, bNodes := a.Nodes.WithType(types.NodeTypesForContainerAndIt), b.Nodes.WithType(types.NodeTypesForContainerAndIt) + + firstOrderedAIdx, firstOrderedBIdx := aNodes.IndexOfFirstNodeMarkedOrdered(), bNodes.IndexOfFirstNodeMarkedOrdered() + if firstOrderedAIdx > -1 && firstOrderedBIdx > -1 && aNodes[firstOrderedAIdx].ID == bNodes[firstOrderedBIdx].ID { + // strictly preserve order within an ordered containers. ID will track this as IDs are generated monotonically + return aNodes.FirstNodeWithType(types.NodeTypeIt).ID < bNodes.FirstNodeWithType(types.NodeTypeIt).ID + } + + // if either spec is in an ordered container - only use the nodes up to the outermost ordered container + if firstOrderedAIdx > -1 { + aNodes = aNodes[:firstOrderedAIdx+1] + } + if firstOrderedBIdx > -1 { + bNodes = bNodes[:firstOrderedBIdx+1] + } + + for i := 0; i < len(aNodes) && i < len(bNodes); i++ { + aCL, bCL := aNodes[i].CodeLocation, bNodes[i].CodeLocation + if aCL.FileName != bCL.FileName { + return aCL.FileName < bCL.FileName + } + if aCL.LineNumber != bCL.LineNumber { + return aCL.LineNumber < bCL.LineNumber + } + } + // either everything is equal or we have different lengths of CLs + if len(aNodes) != len(bNodes) { + return len(aNodes) < len(bNodes) + } + // ok, now we are sure everything was equal. so we use the spec text to break ties + for i := 0; i < len(aNodes); i++ { + if aNodes[i].Text != bNodes[i].Text { + return aNodes[i].Text < bNodes[i].Text + } + } + // ok, all those texts were equal. we'll use the ID of the most deeply nested node as a last resort + return aNodes[len(aNodes)-1].ID < bNodes[len(bNodes)-1].ID +} + type GroupedSpecIndices []SpecIndices type SpecIndices []int @@ -28,12 +87,17 @@ func OrderSpecs(specs Specs, suiteConfig types.SuiteConfig) (GroupedSpecIndices, // Seed a new random source based on thee configured random seed. r := rand.New(rand.NewSource(suiteConfig.RandomSeed)) - // first break things into execution groups + // first, we sort the entire suite to ensure a deterministic order. the sort is performed by filename, then line number, and then spec text. this ensures every parallel process has the exact same spec order and is only necessary to cover the edge case where the user iterates over a map to generate specs. + sortableSpecs := NewSortableSpecs(specs) + sort.Sort(sortableSpecs) + + // then we break things into execution groups // a group represents a single unit of execution and is a collection of SpecIndices // usually a group is just a single spec, however ordered containers must be preserved as a single group executionGroupIDs := []uint{} executionGroups := map[uint]SpecIndices{} - for idx, spec := range specs { + for _, idx := range sortableSpecs.Indexes { + spec := specs[idx] groupNode := spec.Nodes.FirstNodeMarkedOrdered() if groupNode.IsZero() { groupNode = spec.Nodes.FirstNodeWithType(types.NodeTypeIt) @@ -48,7 +112,6 @@ func OrderSpecs(specs Specs, suiteConfig types.SuiteConfig) (GroupedSpecIndices, // we shuffle outermost containers. so we need to form shufflable groupings of GroupIDs shufflableGroupingIDs := []uint{} shufflableGroupingIDToGroupIDs := map[uint][]uint{} - shufflableGroupingsIDToSortKeys := map[uint]string{} // for each execution group we're going to have to pick a node to represent how the // execution group is grouped for shuffling: @@ -57,7 +120,7 @@ func OrderSpecs(specs Specs, suiteConfig types.SuiteConfig) (GroupedSpecIndices, nodeTypesToShuffle = types.NodeTypeIt } - //so, fo reach execution group: + //so, for each execution group: for _, groupID := range executionGroupIDs { // pick out a representative spec representativeSpec := specs[executionGroups[groupID][0]] @@ -72,22 +135,9 @@ func OrderSpecs(specs Specs, suiteConfig types.SuiteConfig) (GroupedSpecIndices, if len(shufflableGroupingIDToGroupIDs[shufflableGroupingNode.ID]) == 1 { // record the shuffleable group ID shufflableGroupingIDs = append(shufflableGroupingIDs, shufflableGroupingNode.ID) - // and record the sort key to use - shufflableGroupingsIDToSortKeys[shufflableGroupingNode.ID] = shufflableGroupingNode.CodeLocation.String() } } - // now we sort the shufflable groups by the sort key. We use the shufflable group nodes code location and break ties using its node id - sort.SliceStable(shufflableGroupingIDs, func(i, j int) bool { - keyA := shufflableGroupingsIDToSortKeys[shufflableGroupingIDs[i]] - keyB := shufflableGroupingsIDToSortKeys[shufflableGroupingIDs[j]] - if keyA == keyB { - return shufflableGroupingIDs[i] < shufflableGroupingIDs[j] - } else { - return keyA < keyB - } - }) - // now we permute the sorted shufflable grouping IDs and build the ordered Groups orderedGroups := GroupedSpecIndices{} permutation := r.Perm(len(shufflableGroupingIDs)) diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_unix.go b/vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_unix.go index f5ae15b8..8a237f44 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_unix.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_unix.go @@ -26,6 +26,17 @@ func (impl *dupSyscallOutputInterceptorImpl) CreateStdoutStderrClones() (*os.Fil stdoutCloneFD, _ := unix.Dup(1) stderrCloneFD, _ := unix.Dup(2) + // Important, set the fds to FD_CLOEXEC to prevent them leaking into childs + // https://github.com/onsi/ginkgo/issues/1191 + flags, err := unix.FcntlInt(uintptr(stdoutCloneFD), unix.F_GETFD, 0) + if err == nil { + unix.FcntlInt(uintptr(stdoutCloneFD), unix.F_SETFD, flags|unix.FD_CLOEXEC) + } + flags, err = unix.FcntlInt(uintptr(stderrCloneFD), unix.F_GETFD, 0) + if err == nil { + unix.FcntlInt(uintptr(stderrCloneFD), unix.F_SETFD, flags|unix.FD_CLOEXEC) + } + // And then wrap the clone file descriptors in files. // One benefit of this (that we don't use yet) is that we can actually write // to these files to emit output to the console even though we're intercepting output diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/progress_reporter_manager.go b/vendor/github.com/onsi/ginkgo/v2/internal/progress_reporter_manager.go new file mode 100644 index 00000000..2c6e260f --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/progress_reporter_manager.go @@ -0,0 +1,79 @@ +package internal + +import ( + "context" + "sort" + "strings" + "sync" + + "github.com/onsi/ginkgo/v2/types" +) + +type ProgressReporterManager struct { + lock *sync.Mutex + progressReporters map[int]func() string + prCounter int +} + +func NewProgressReporterManager() *ProgressReporterManager { + return &ProgressReporterManager{ + progressReporters: map[int]func() string{}, + lock: &sync.Mutex{}, + } +} + +func (prm *ProgressReporterManager) AttachProgressReporter(reporter func() string) func() { + prm.lock.Lock() + defer prm.lock.Unlock() + prm.prCounter += 1 + prCounter := prm.prCounter + prm.progressReporters[prCounter] = reporter + + return func() { + prm.lock.Lock() + defer prm.lock.Unlock() + delete(prm.progressReporters, prCounter) + } +} + +func (prm *ProgressReporterManager) QueryProgressReporters(ctx context.Context, failer *Failer) []string { + prm.lock.Lock() + keys := []int{} + for key := range prm.progressReporters { + keys = append(keys, key) + } + sort.Ints(keys) + reporters := []func() string{} + for _, key := range keys { + reporters = append(reporters, prm.progressReporters[key]) + } + prm.lock.Unlock() + + if len(reporters) == 0 { + return nil + } + out := []string{} + for _, reporter := range reporters { + reportC := make(chan string, 1) + go func() { + defer func() { + e := recover() + if e != nil { + failer.Panic(types.NewCodeLocationWithStackTrace(1), e) + reportC <- "failed to query attached progress reporter" + } + }() + reportC <- reporter() + }() + var report string + select { + case report = <-reportC: + case <-ctx.Done(): + return out + } + if strings.TrimSpace(report) != "" { + out = append(out, report) + } + } + return out +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/spec_context.go b/vendor/github.com/onsi/ginkgo/v2/internal/spec_context.go index 8f569dd3..2515b84a 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/spec_context.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/spec_context.go @@ -2,8 +2,6 @@ package internal import ( "context" - "sort" - "sync" "github.com/onsi/ginkgo/v2/types" ) @@ -17,11 +15,9 @@ type SpecContext interface { type specContext struct { context.Context + *ProgressReporterManager - cancel context.CancelFunc - lock *sync.Mutex - progressReporters map[int]func() string - prCounter int + cancel context.CancelFunc suite *Suite } @@ -36,11 +32,9 @@ This is because Ginkgo needs finer control over when the context is canceled. S func NewSpecContext(suite *Suite) *specContext { ctx, cancel := context.WithCancel(context.Background()) sc := &specContext{ - cancel: cancel, - suite: suite, - lock: &sync.Mutex{}, - prCounter: 0, - progressReporters: map[int]func() string{}, + cancel: cancel, + suite: suite, + ProgressReporterManager: NewProgressReporterManager(), } ctx = context.WithValue(ctx, "GINKGO_SPEC_CONTEXT", sc) //yes, yes, the go docs say don't use a string for a key... but we'd rather avoid a circular dependency between Gomega and Ginkgo sc.Context = ctx //thank goodness for garbage collectors that can handle circular dependencies @@ -51,40 +45,3 @@ func NewSpecContext(suite *Suite) *specContext { func (sc *specContext) SpecReport() types.SpecReport { return sc.suite.CurrentSpecReport() } - -func (sc *specContext) AttachProgressReporter(reporter func() string) func() { - sc.lock.Lock() - defer sc.lock.Unlock() - sc.prCounter += 1 - prCounter := sc.prCounter - sc.progressReporters[prCounter] = reporter - - return func() { - sc.lock.Lock() - defer sc.lock.Unlock() - delete(sc.progressReporters, prCounter) - } -} - -func (sc *specContext) QueryProgressReporters() []string { - sc.lock.Lock() - keys := []int{} - for key := range sc.progressReporters { - keys = append(keys, key) - } - sort.Ints(keys) - reporters := []func() string{} - for _, key := range keys { - reporters = append(reporters, sc.progressReporters[key]) - } - sc.lock.Unlock() - - if len(reporters) == 0 { - return nil - } - out := []string{} - for _, reporter := range reporters { - out = append(out, reporter()) - } - return out -} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/suite.go b/vendor/github.com/onsi/ginkgo/v2/internal/suite.go index f470641a..ea0d259d 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/suite.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/suite.go @@ -9,6 +9,7 @@ import ( "github.com/onsi/ginkgo/v2/internal/parallel_support" "github.com/onsi/ginkgo/v2/reporters" "github.com/onsi/ginkgo/v2/types" + "golang.org/x/net/context" ) type Phase uint @@ -19,10 +20,14 @@ const ( PhaseRun ) +var PROGRESS_REPORTER_DEADLING = 5 * time.Second + type Suite struct { tree *TreeNode topLevelContainers Nodes + *ProgressReporterManager + phase Phase suiteNodes Nodes @@ -64,8 +69,9 @@ type Suite struct { func NewSuite() *Suite { return &Suite{ - tree: &TreeNode{}, - phase: PhaseBuildTopLevel, + tree: &TreeNode{}, + phase: PhaseBuildTopLevel, + ProgressReporterManager: NewProgressReporterManager(), selectiveLock: &sync.Mutex{}, } @@ -151,6 +157,13 @@ func (suite *Suite) PushNode(node Node) error { } } + if node.MarkedContinueOnFailure { + firstOrderedNode := suite.tree.AncestorNodeChain().FirstNodeMarkedOrdered() + if !firstOrderedNode.IsZero() { + return types.GinkgoErrors.InvalidContinueOnFailureDecoration(node.CodeLocation) + } + } + if node.NodeType == types.NodeTypeContainer { // During PhaseBuildTopLevel we only track the top level containers without entering them // We only enter the top level container nodes during PhaseBuildTree @@ -232,7 +245,9 @@ func (suite *Suite) pushCleanupNode(node Node) error { node.NodeIDWhereCleanupWasGenerated = suite.currentNode.ID node.NestingLevel = suite.currentNode.NestingLevel + suite.selectiveLock.Lock() suite.cleanupNodes = append(suite.cleanupNodes, node) + suite.selectiveLock.Unlock() return nil } @@ -331,10 +346,13 @@ func (suite *Suite) generateProgressReport(fullReport bool) types.ProgressReport suite.selectiveLock.Lock() defer suite.selectiveLock.Unlock() + deadline, cancel := context.WithTimeout(context.Background(), PROGRESS_REPORTER_DEADLING) + defer cancel() var additionalReports []string if suite.currentSpecContext != nil { - additionalReports = suite.currentSpecContext.QueryProgressReporters() + additionalReports = append(additionalReports, suite.currentSpecContext.QueryProgressReporters(deadline, suite.failer)...) } + additionalReports = append(additionalReports, suite.QueryProgressReporters(deadline, suite.failer)...) gwOutput := suite.currentSpecReport.CapturedGinkgoWriterOutput + string(suite.writer.Bytes()) pr, err := NewProgressReport(suite.isRunningInParallel(), suite.currentSpecReport, suite.currentNode, suite.currentNodeStartTime, suite.currentByStep, gwOutput, timelineLocation, additionalReports, suite.config.SourceRoots, fullReport) @@ -921,6 +939,12 @@ func (suite *Suite) runNode(node Node, specDeadline time.Time, text string) (typ gracePeriodChannel = time.After(gracePeriod) case <-interruptStatus.Channel: interruptStatus = suite.interruptHandler.Status() + // ignore interruption from other process if we are cleaning up or reporting + if interruptStatus.Cause == interrupt_handler.InterruptCauseAbortByOtherProcess && + node.NodeType.Is(types.NodeTypesAllowedDuringReportInterrupt|types.NodeTypesAllowedDuringCleanupInterrupt) { + continue + } + deadlineChannel = nil // don't worry about deadlines, time's up now failureTimelineLocation := suite.generateTimelineLocation() diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/testingtproxy/testing_t_proxy.go b/vendor/github.com/onsi/ginkgo/v2/internal/testingtproxy/testing_t_proxy.go index 2f42b264..73e26556 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/testingtproxy/testing_t_proxy.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/testingtproxy/testing_t_proxy.go @@ -5,34 +5,62 @@ import ( "io" "os" + "github.com/onsi/ginkgo/v2/formatter" "github.com/onsi/ginkgo/v2/internal" + "github.com/onsi/ginkgo/v2/reporters" "github.com/onsi/ginkgo/v2/types" ) type failFunc func(message string, callerSkip ...int) type skipFunc func(message string, callerSkip ...int) -type cleanupFunc func(args ...interface{}) +type cleanupFunc func(args ...any) type reportFunc func() types.SpecReport +type addReportEntryFunc func(names string, args ...any) +type ginkgoWriterInterface interface { + io.Writer -func New(writer io.Writer, fail failFunc, skip skipFunc, cleanup cleanupFunc, report reportFunc, offset int) *ginkgoTestingTProxy { + Print(a ...interface{}) + Printf(format string, a ...interface{}) + Println(a ...interface{}) +} +type ginkgoRecoverFunc func() +type attachProgressReporterFunc func(func() string) func() + +func New(writer ginkgoWriterInterface, fail failFunc, skip skipFunc, cleanup cleanupFunc, report reportFunc, addReportEntry addReportEntryFunc, ginkgoRecover ginkgoRecoverFunc, attachProgressReporter attachProgressReporterFunc, randomSeed int64, parallelProcess int, parallelTotal int, noColor bool, offset int) *ginkgoTestingTProxy { return &ginkgoTestingTProxy{ - fail: fail, - offset: offset, - writer: writer, - skip: skip, - cleanup: cleanup, - report: report, + fail: fail, + offset: offset, + writer: writer, + skip: skip, + cleanup: cleanup, + report: report, + addReportEntry: addReportEntry, + ginkgoRecover: ginkgoRecover, + attachProgressReporter: attachProgressReporter, + randomSeed: randomSeed, + parallelProcess: parallelProcess, + parallelTotal: parallelTotal, + f: formatter.NewWithNoColorBool(noColor), } } type ginkgoTestingTProxy struct { - fail failFunc - skip skipFunc - cleanup cleanupFunc - report reportFunc - offset int - writer io.Writer -} + fail failFunc + skip skipFunc + cleanup cleanupFunc + report reportFunc + offset int + writer ginkgoWriterInterface + addReportEntry addReportEntryFunc + ginkgoRecover ginkgoRecoverFunc + attachProgressReporter attachProgressReporterFunc + randomSeed int64 + parallelProcess int + parallelTotal int + f formatter.Formatter +} + +// basic testing.T support func (t *ginkgoTestingTProxy) Cleanup(f func()) { t.cleanup(f, internal.Offset(1)) @@ -81,7 +109,7 @@ func (t *ginkgoTestingTProxy) Fatalf(format string, args ...interface{}) { } func (t *ginkgoTestingTProxy) Helper() { - // No-op + types.MarkAsHelper(1) } func (t *ginkgoTestingTProxy) Log(args ...interface{}) { @@ -126,3 +154,57 @@ func (t *ginkgoTestingTProxy) TempDir() string { return tmpDir } + +// FullGinkgoTInterface +func (t *ginkgoTestingTProxy) AddReportEntryVisibilityAlways(name string, args ...any) { + finalArgs := []any{internal.Offset(1), types.ReportEntryVisibilityAlways} + t.addReportEntry(name, append(finalArgs, args...)...) +} +func (t *ginkgoTestingTProxy) AddReportEntryVisibilityFailureOrVerbose(name string, args ...any) { + finalArgs := []any{internal.Offset(1), types.ReportEntryVisibilityFailureOrVerbose} + t.addReportEntry(name, append(finalArgs, args...)...) +} +func (t *ginkgoTestingTProxy) AddReportEntryVisibilityNever(name string, args ...any) { + finalArgs := []any{internal.Offset(1), types.ReportEntryVisibilityNever} + t.addReportEntry(name, append(finalArgs, args...)...) +} +func (t *ginkgoTestingTProxy) Print(a ...any) { + t.writer.Print(a...) +} +func (t *ginkgoTestingTProxy) Printf(format string, a ...any) { + t.writer.Printf(format, a...) +} +func (t *ginkgoTestingTProxy) Println(a ...any) { + t.writer.Println(a...) +} +func (t *ginkgoTestingTProxy) F(format string, args ...any) string { + return t.f.F(format, args...) +} +func (t *ginkgoTestingTProxy) Fi(indentation uint, format string, args ...any) string { + return t.f.Fi(indentation, format, args...) +} +func (t *ginkgoTestingTProxy) Fiw(indentation uint, maxWidth uint, format string, args ...any) string { + return t.f.Fiw(indentation, maxWidth, format, args...) +} +func (t *ginkgoTestingTProxy) RenderTimeline() string { + return reporters.RenderTimeline(t.report(), false) +} +func (t *ginkgoTestingTProxy) GinkgoRecover() { + t.ginkgoRecover() +} +func (t *ginkgoTestingTProxy) DeferCleanup(args ...any) { + finalArgs := []any{internal.Offset(1)} + t.cleanup(append(finalArgs, args...)...) +} +func (t *ginkgoTestingTProxy) RandomSeed() int64 { + return t.randomSeed +} +func (t *ginkgoTestingTProxy) ParallelProcess() int { + return t.parallelProcess +} +func (t *ginkgoTestingTProxy) ParallelTotal() int { + return t.parallelTotal +} +func (t *ginkgoTestingTProxy) AttachProgressReporter(f func() string) func() { + return t.attachProgressReporter(f) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/writer.go b/vendor/github.com/onsi/ginkgo/v2/internal/writer.go index 28a45b0f..aab42d5f 100644 --- a/vendor/github.com/onsi/ginkgo/v2/internal/writer.go +++ b/vendor/github.com/onsi/ginkgo/v2/internal/writer.go @@ -135,6 +135,10 @@ func (w *Writer) Println(a ...interface{}) { func GinkgoLogrFunc(writer *Writer) logr.Logger { return funcr.New(func(prefix, args string) { - writer.Printf("%s", args) + if prefix == "" { + writer.Printf("%s\n", args) + } else { + writer.Printf("%s %s\n", prefix, args) + } }, funcr.Options{}) } diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go b/vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go index 7a27220c..56b7be75 100644 --- a/vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go @@ -12,6 +12,7 @@ import ( "io" "runtime" "strings" + "sync" "time" "github.com/onsi/ginkgo/v2/formatter" @@ -23,7 +24,7 @@ type DefaultReporter struct { writer io.Writer // managing the emission stream - lastChar string + lastCharWasNewline bool lastEmissionWasDelimiter bool // rendering @@ -32,6 +33,7 @@ type DefaultReporter struct { formatter formatter.Formatter runningInParallel bool + lock *sync.Mutex } func NewDefaultReporterUnderTest(conf types.ReporterConfig, writer io.Writer) *DefaultReporter { @@ -46,12 +48,13 @@ func NewDefaultReporter(conf types.ReporterConfig, writer io.Writer) *DefaultRep conf: conf, writer: writer, - lastChar: "\n", + lastCharWasNewline: true, lastEmissionWasDelimiter: false, specDenoter: "•", retryDenoter: "↺", formatter: formatter.NewWithNoColorBool(conf.NoColor), + lock: &sync.Mutex{}, } if runtime.GOOS == "windows" { reporter.specDenoter = "+" @@ -528,7 +531,7 @@ func (r *DefaultReporter) EmitReportEntry(entry types.ReportEntry) { } func (r *DefaultReporter) emitReportEntry(indent uint, entry types.ReportEntry) { - r.emitBlock(r.fi(indent, "{{bold}}"+entry.Name+"{{gray}} - %s @ %s{{/}}", entry.Location, entry.Time.Format(types.GINKGO_TIME_FORMAT))) + r.emitBlock(r.fi(indent, "{{bold}}"+entry.Name+"{{gray}} "+fmt.Sprintf("- %s @ %s{{/}}", entry.Location, entry.Time.Format(types.GINKGO_TIME_FORMAT)))) if representation := entry.StringRepresentation(); representation != "" { r.emitBlock(r.fi(indent+1, representation)) } @@ -619,31 +622,37 @@ func (r *DefaultReporter) emitSource(indent uint, fc types.FunctionCall) { /* Emitting to the writer */ func (r *DefaultReporter) emit(s string) { - if len(s) > 0 { - r.lastChar = s[len(s)-1:] - r.lastEmissionWasDelimiter = false - r.writer.Write([]byte(s)) - } + r._emit(s, false, false) } func (r *DefaultReporter) emitBlock(s string) { - if len(s) > 0 { - if r.lastChar != "\n" { - r.emit("\n") - } - r.emit(s) - if r.lastChar != "\n" { - r.emit("\n") - } - } + r._emit(s, true, false) } func (r *DefaultReporter) emitDelimiter(indent uint) { - if r.lastEmissionWasDelimiter { + r._emit(r.fi(indent, "{{gray}}%s{{/}}", strings.Repeat("-", 30)), true, true) +} + +// a bit ugly - but we're trying to minimize locking on this hot codepath +func (r *DefaultReporter) _emit(s string, block bool, isDelimiter bool) { + if len(s) == 0 { + return + } + r.lock.Lock() + defer r.lock.Unlock() + if isDelimiter && r.lastEmissionWasDelimiter { return } - r.emitBlock(r.fi(indent, "{{gray}}%s{{/}}", strings.Repeat("-", 30))) - r.lastEmissionWasDelimiter = true + if block && !r.lastCharWasNewline { + r.writer.Write([]byte("\n")) + } + r.lastCharWasNewline = (s[len(s)-1:] == "\n") + r.writer.Write([]byte(s)) + if block && !r.lastCharWasNewline { + r.writer.Write([]byte("\n")) + r.lastCharWasNewline = true + } + r.lastEmissionWasDelimiter = isDelimiter } /* Rendering text */ diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go index 7f96c450..be506f9b 100644 --- a/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go @@ -4,12 +4,16 @@ import ( "encoding/json" "fmt" "os" + "path" "github.com/onsi/ginkgo/v2/types" ) -//GenerateJSONReport produces a JSON-formatted report at the passed in destination +// GenerateJSONReport produces a JSON-formatted report at the passed in destination func GenerateJSONReport(report types.Report, destination string) error { + if err := os.MkdirAll(path.Dir(destination), 0770); err != nil { + return err + } f, err := os.Create(destination) if err != nil { return err @@ -25,8 +29,8 @@ func GenerateJSONReport(report types.Report, destination string) error { return f.Close() } -//MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources -//It skips over reports that fail to decode but reports on them via the returned messages []string +// MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources +// It skips over reports that fail to decode but reports on them via the returned messages []string func MergeAndCleanupJSONReports(sources []string, destination string) ([]string, error) { messages := []string{} allReports := []types.Report{} @@ -46,6 +50,9 @@ func MergeAndCleanupJSONReports(sources []string, destination string) ([]string, allReports = append(allReports, reports...) } + if err := os.MkdirAll(path.Dir(destination), 0770); err != nil { + return messages, err + } f, err := os.Create(destination) if err != nil { return messages, err diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go index fb87e24d..81604220 100644 --- a/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go @@ -14,6 +14,7 @@ import ( "encoding/xml" "fmt" "os" + "path" "strings" "github.com/onsi/ginkgo/v2/config" @@ -36,6 +37,9 @@ type JunitReportConfig struct { // Enable OmitLeafNodeType to prevent the spec leaf node type from appearing in the spec name OmitLeafNodeType bool + + // Enable OmitSuiteSetupNodes to prevent the creation of testcase entries for setup nodes + OmitSuiteSetupNodes bool } type JUnitTestSuites struct { @@ -177,6 +181,9 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit }, } for _, spec := range report.SpecReports { + if config.OmitSuiteSetupNodes && spec.LeafNodeType != types.NodeTypeIt { + continue + } name := fmt.Sprintf("[%s]", spec.LeafNodeType) if config.OmitLeafNodeType { name = "" @@ -279,6 +286,9 @@ func GenerateJUnitReportWithConfig(report types.Report, dst string, config Junit TestSuites: []JUnitTestSuite{suite}, } + if err := os.MkdirAll(path.Dir(dst), 0770); err != nil { + return err + } f, err := os.Create(dst) if err != nil { return err @@ -316,6 +326,9 @@ func MergeAndCleanupJUnitReports(sources []string, dst string) ([]string, error) mergedReport.TestSuites = append(mergedReport.TestSuites, report.TestSuites...) } + if err := os.MkdirAll(path.Dir(dst), 0770); err != nil { + return messages, err + } f, err := os.Create(dst) if err != nil { return messages, err @@ -338,8 +351,12 @@ func failureDescriptionForUnstructuredReporters(spec types.SpecReport) string { } func systemErrForUnstructuredReporters(spec types.SpecReport) string { + return RenderTimeline(spec, true) +} + +func RenderTimeline(spec types.SpecReport, noColor bool) string { out := &strings.Builder{} - NewDefaultReporter(types.ReporterConfig{NoColor: true, VeryVerbose: true}, out).emitTimeline(0, spec, spec.Timeline()) + NewDefaultReporter(types.ReporterConfig{NoColor: noColor, VeryVerbose: true}, out).emitTimeline(0, spec, spec.Timeline()) return out.String() } diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go index c1863496..e990ad82 100644 --- a/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go @@ -11,6 +11,7 @@ package reporters import ( "fmt" "os" + "path" "strings" "github.com/onsi/ginkgo/v2/types" @@ -27,6 +28,9 @@ func tcEscape(s string) string { } func GenerateTeamcityReport(report types.Report, dst string) error { + if err := os.MkdirAll(path.Dir(dst), 0770); err != nil { + return err + } f, err := os.Create(dst) if err != nil { return err diff --git a/vendor/github.com/onsi/ginkgo/v2/table_dsl.go b/vendor/github.com/onsi/ginkgo/v2/table_dsl.go index 68367446..ac9b7abb 100644 --- a/vendor/github.com/onsi/ginkgo/v2/table_dsl.go +++ b/vendor/github.com/onsi/ginkgo/v2/table_dsl.go @@ -13,7 +13,7 @@ import ( /* The EntryDescription decorator allows you to pass a format string to DescribeTable() and Entry(). This format string is used to generate entry names via: - fmt.Sprintf(formatString, parameters...) + fmt.Sprintf(formatString, parameters...) where parameters are the parameters passed into the entry. @@ -32,19 +32,20 @@ DescribeTable describes a table-driven spec. For example: - DescribeTable("a simple table", - func(x int, y int, expected bool) { - Ω(x > y).Should(Equal(expected)) - }, - Entry("x > y", 1, 0, true), - Entry("x == y", 0, 0, false), - Entry("x < y", 0, 1, false), - ) + DescribeTable("a simple table", + func(x int, y int, expected bool) { + Ω(x > y).Should(Equal(expected)) + }, + Entry("x > y", 1, 0, true), + Entry("x == y", 0, 0, false), + Entry("x < y", 0, 1, false), + ) You can learn more about DescribeTable here: https://onsi.github.io/ginkgo/#table-specs And can explore some Table patterns here: https://onsi.github.io/ginkgo/#table-specs-patterns */ func DescribeTable(description string, args ...interface{}) bool { + GinkgoHelper() generateTable(description, args...) return true } @@ -53,6 +54,7 @@ func DescribeTable(description string, args ...interface{}) bool { You can focus a table with `FDescribeTable`. This is equivalent to `FDescribe`. */ func FDescribeTable(description string, args ...interface{}) bool { + GinkgoHelper() args = append(args, internal.Focus) generateTable(description, args...) return true @@ -62,6 +64,7 @@ func FDescribeTable(description string, args ...interface{}) bool { You can mark a table as pending with `PDescribeTable`. This is equivalent to `PDescribe`. */ func PDescribeTable(description string, args ...interface{}) bool { + GinkgoHelper() args = append(args, internal.Pending) generateTable(description, args...) return true @@ -95,26 +98,29 @@ If you want to generate interruptible specs simply write a Table function that a You can learn more about Entry here: https://onsi.github.io/ginkgo/#table-specs */ func Entry(description interface{}, args ...interface{}) TableEntry { + GinkgoHelper() decorations, parameters := internal.PartitionDecorations(args...) - return TableEntry{description: description, decorations: decorations, parameters: parameters, codeLocation: types.NewCodeLocation(1)} + return TableEntry{description: description, decorations: decorations, parameters: parameters, codeLocation: types.NewCodeLocation(0)} } /* You can focus a particular entry with FEntry. This is equivalent to FIt. */ func FEntry(description interface{}, args ...interface{}) TableEntry { + GinkgoHelper() decorations, parameters := internal.PartitionDecorations(args...) decorations = append(decorations, internal.Focus) - return TableEntry{description: description, decorations: decorations, parameters: parameters, codeLocation: types.NewCodeLocation(1)} + return TableEntry{description: description, decorations: decorations, parameters: parameters, codeLocation: types.NewCodeLocation(0)} } /* You can mark a particular entry as pending with PEntry. This is equivalent to PIt. */ func PEntry(description interface{}, args ...interface{}) TableEntry { + GinkgoHelper() decorations, parameters := internal.PartitionDecorations(args...) decorations = append(decorations, internal.Pending) - return TableEntry{description: description, decorations: decorations, parameters: parameters, codeLocation: types.NewCodeLocation(1)} + return TableEntry{description: description, decorations: decorations, parameters: parameters, codeLocation: types.NewCodeLocation(0)} } /* @@ -126,7 +132,8 @@ var contextType = reflect.TypeOf(new(context.Context)).Elem() var specContextType = reflect.TypeOf(new(SpecContext)).Elem() func generateTable(description string, args ...interface{}) { - cl := types.NewCodeLocation(2) + GinkgoHelper() + cl := types.NewCodeLocation(0) containerNodeArgs := []interface{}{cl} entries := []TableEntry{} diff --git a/vendor/github.com/onsi/ginkgo/v2/types/code_location.go b/vendor/github.com/onsi/ginkgo/v2/types/code_location.go index 12910918..9cd57681 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/code_location.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/code_location.go @@ -7,6 +7,7 @@ import ( "runtime" "runtime/debug" "strings" + "sync" ) type CodeLocation struct { @@ -38,6 +39,73 @@ func (codeLocation CodeLocation) ContentsOfLine() string { return lines[codeLocation.LineNumber-1] } +type codeLocationLocator struct { + pcs map[uintptr]bool + helpers map[string]bool + lock *sync.Mutex +} + +func (c *codeLocationLocator) addHelper(pc uintptr) { + c.lock.Lock() + defer c.lock.Unlock() + + if c.pcs[pc] { + return + } + c.lock.Unlock() + f := runtime.FuncForPC(pc) + c.lock.Lock() + if f == nil { + return + } + c.helpers[f.Name()] = true + c.pcs[pc] = true +} + +func (c *codeLocationLocator) hasHelper(name string) bool { + c.lock.Lock() + defer c.lock.Unlock() + return c.helpers[name] +} + +func (c *codeLocationLocator) getCodeLocation(skip int) CodeLocation { + pc := make([]uintptr, 40) + n := runtime.Callers(skip+2, pc) + if n == 0 { + return CodeLocation{} + } + pc = pc[:n] + frames := runtime.CallersFrames(pc) + for { + frame, more := frames.Next() + if !c.hasHelper(frame.Function) { + return CodeLocation{FileName: frame.File, LineNumber: frame.Line} + } + if !more { + break + } + } + return CodeLocation{} +} + +var clLocator = &codeLocationLocator{ + pcs: map[uintptr]bool{}, + helpers: map[string]bool{}, + lock: &sync.Mutex{}, +} + +// MarkAsHelper is used by GinkgoHelper to mark the caller (appropriately offset by skip)as a helper. You can use this directly if you need to provide an optional `skip` to mark functions further up the call stack as helpers. +func MarkAsHelper(optionalSkip ...int) { + skip := 1 + if len(optionalSkip) > 0 { + skip += optionalSkip[0] + } + pc, _, _, ok := runtime.Caller(skip) + if ok { + clLocator.addHelper(pc) + } +} + func NewCustomCodeLocation(message string) CodeLocation { return CodeLocation{ CustomMessage: message, @@ -45,14 +113,13 @@ func NewCustomCodeLocation(message string) CodeLocation { } func NewCodeLocation(skip int) CodeLocation { - _, file, line, _ := runtime.Caller(skip + 1) - return CodeLocation{FileName: file, LineNumber: line} + return clLocator.getCodeLocation(skip + 1) } func NewCodeLocationWithStackTrace(skip int) CodeLocation { - _, file, line, _ := runtime.Caller(skip + 1) - stackTrace := PruneStack(string(debug.Stack()), skip+1) - return CodeLocation{FileName: file, LineNumber: line, FullStackTrace: stackTrace} + cl := clLocator.getCodeLocation(skip + 1) + cl.FullStackTrace = PruneStack(string(debug.Stack()), skip+1) + return cl } // PruneStack removes references to functions that are internal to Ginkgo diff --git a/vendor/github.com/onsi/ginkgo/v2/types/config.go b/vendor/github.com/onsi/ginkgo/v2/types/config.go index 4ec636eb..c88fc85a 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/config.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/config.go @@ -8,6 +8,7 @@ package types import ( "flag" "os" + "path/filepath" "runtime" "strconv" "strings" @@ -26,10 +27,12 @@ type SuiteConfig struct { FailOnPending bool FailFast bool FlakeAttempts int + MustPassRepeatedly int DryRun bool PollProgressAfter time.Duration PollProgressInterval time.Duration Timeout time.Duration + EmitSpecProgress bool // this is deprecated but its removal is causing compile issue for some users that were setting it manually OutputInterceptorMode string SourceRoots []string GracePeriod time.Duration @@ -599,13 +602,29 @@ func VetAndInitializeCLIAndGoConfig(cliConfig CLIConfig, goFlagsConfig GoFlagsCo } // GenerateGoTestCompileArgs is used by the Ginkgo CLI to generate command line arguments to pass to the go test -c command when compiling the test -func GenerateGoTestCompileArgs(goFlagsConfig GoFlagsConfig, destination string, packageToBuild string) ([]string, error) { +func GenerateGoTestCompileArgs(goFlagsConfig GoFlagsConfig, destination string, packageToBuild string, pathToInvocationPath string) ([]string, error) { // if the user has set the CoverProfile run-time flag make sure to set the build-time cover flag to make sure // the built test binary can generate a coverprofile if goFlagsConfig.CoverProfile != "" { goFlagsConfig.Cover = true } + if goFlagsConfig.CoverPkg != "" { + coverPkgs := strings.Split(goFlagsConfig.CoverPkg, ",") + adjustedCoverPkgs := make([]string, len(coverPkgs)) + for i, coverPkg := range coverPkgs { + coverPkg = strings.Trim(coverPkg, " ") + if strings.HasPrefix(coverPkg, "./") { + // this is a relative coverPkg - we need to reroot it + adjustedCoverPkgs[i] = "./" + filepath.Join(pathToInvocationPath, strings.TrimPrefix(coverPkg, "./")) + } else { + // this is a package name - don't touch it + adjustedCoverPkgs[i] = coverPkg + } + } + goFlagsConfig.CoverPkg = strings.Join(adjustedCoverPkgs, ",") + } + args := []string{"test", "-c", "-o", destination, packageToBuild} goArgs, err := GenerateFlagArgs( GoBuildFlags, diff --git a/vendor/github.com/onsi/ginkgo/v2/types/deprecation_support.go b/vendor/github.com/onsi/ginkgo/v2/types/deprecation_support.go index f267bdef..e2519f67 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/deprecation_support.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/deprecation_support.go @@ -38,7 +38,7 @@ func (d deprecations) Async() Deprecation { func (d deprecations) Measure() Deprecation { return Deprecation{ - Message: "Measure is deprecated and will be removed in Ginkgo V2. Please migrate to gomega/gmeasure.", + Message: "Measure is deprecated and has been removed from Ginkgo V2. Any Measure tests in your spec will not run. Please migrate to gomega/gmeasure.", DocLink: "removed-measure", Version: "1.16.3", } diff --git a/vendor/github.com/onsi/ginkgo/v2/types/errors.go b/vendor/github.com/onsi/ginkgo/v2/types/errors.go index a0f59fb4..4fbdc3e9 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/errors.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/errors.go @@ -298,6 +298,15 @@ func (g ginkgoErrors) SetupNodeNotInOrderedContainer(cl CodeLocation, nodeType N } } +func (g ginkgoErrors) InvalidContinueOnFailureDecoration(cl CodeLocation) error { + return GinkgoError{ + Heading: "ContinueOnFailure not decorating an outermost Ordered Container", + Message: "ContinueOnFailure can only decorate an Ordered container, and this Ordered container must be the outermost Ordered container.", + CodeLocation: cl, + DocLink: "ordered-containers", + } +} + /* DeferCleanup errors */ func (g ginkgoErrors) DeferCleanupInvalidFunction(cl CodeLocation) error { return GinkgoError{ @@ -444,8 +453,8 @@ func (g ginkgoErrors) InvalidEntryDescription(cl CodeLocation) error { func (g ginkgoErrors) MissingParametersForTableFunction(cl CodeLocation) error { return GinkgoError{ - Heading: fmt.Sprintf("No parameters have been passed to the Table Function"), - Message: fmt.Sprintf("The Table Function expected at least 1 parameter"), + Heading: "No parameters have been passed to the Table Function", + Message: "The Table Function expected at least 1 parameter", CodeLocation: cl, DocLink: "table-specs", } diff --git a/vendor/github.com/onsi/ginkgo/v2/types/label_filter.go b/vendor/github.com/onsi/ginkgo/v2/types/label_filter.go index 0403f9e6..b0d3b651 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/label_filter.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/label_filter.go @@ -272,12 +272,23 @@ func tokenize(input string) func() (*treeNode, error) { } } +func MustParseLabelFilter(input string) LabelFilter { + filter, err := ParseLabelFilter(input) + if err != nil { + panic(err) + } + return filter +} + func ParseLabelFilter(input string) (LabelFilter, error) { if DEBUG_LABEL_FILTER_PARSING { fmt.Println("\n==============") fmt.Println("Input: ", input) fmt.Print("Tokens: ") } + if input == "" { + return func(_ []string) bool { return true }, nil + } nextToken := tokenize(input) root := &treeNode{token: lfTokenRoot} diff --git a/vendor/github.com/onsi/ginkgo/v2/types/types.go b/vendor/github.com/onsi/ginkgo/v2/types/types.go index 3e979ba8..aae69b04 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/types.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/types.go @@ -97,9 +97,7 @@ func (report Report) Add(other Report) Report { report.RunTime = report.EndTime.Sub(report.StartTime) reports := make(SpecReports, len(report.SpecReports)+len(other.SpecReports)) - for i := range report.SpecReports { - reports[i] = report.SpecReports[i] - } + copy(reports, report.SpecReports) offset := len(report.SpecReports) for i := range other.SpecReports { reports[i+offset] = other.SpecReports[i] @@ -604,6 +602,9 @@ var ssEnumSupport = NewEnumSupport(map[uint]string{ func (ss SpecState) String() string { return ssEnumSupport.String(uint(ss)) } +func (ss SpecState) GomegaString() string { + return ssEnumSupport.String(uint(ss)) +} func (ss *SpecState) UnmarshalJSON(b []byte) error { out, err := ssEnumSupport.UnmarshJSON(b) *ss = SpecState(out) diff --git a/vendor/github.com/onsi/ginkgo/v2/types/version.go b/vendor/github.com/onsi/ginkgo/v2/types/version.go index 03d5ff98..04545630 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/version.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/version.go @@ -1,3 +1,3 @@ package types -const VERSION = "2.6.1" +const VERSION = "2.12.1" diff --git a/vendor/github.com/onsi/gomega/.gitignore b/vendor/github.com/onsi/gomega/.gitignore index 5f12ff05..425d0a50 100644 --- a/vendor/github.com/onsi/gomega/.gitignore +++ b/vendor/github.com/onsi/gomega/.gitignore @@ -3,4 +3,5 @@ . .idea gomega.iml -TODO.md \ No newline at end of file +TODO +.vscode \ No newline at end of file diff --git a/vendor/github.com/onsi/gomega/CHANGELOG.md b/vendor/github.com/onsi/gomega/CHANGELOG.md index 35dfec06..fbb12a15 100644 --- a/vendor/github.com/onsi/gomega/CHANGELOG.md +++ b/vendor/github.com/onsi/gomega/CHANGELOG.md @@ -1,3 +1,146 @@ +## 1.28.0 + +### Features +- Add VerifyHost handler to ghttp (#698) [0b03b36] + +### Fixes +- Read Body for Newer Responses in HaveHTTPBodyMatcher (#686) [18d6673] + +### Maintenance +- Bump github.com/onsi/ginkgo/v2 from 2.11.0 to 2.12.0 (#693) [55a33f3] +- Typo in matchers.go (#691) [de68e8f] +- Bump commonmarker from 0.23.9 to 0.23.10 in /docs (#690) [ab17f5e] +- chore: update test matrix for Go 1.21 (#689) [5069017] +- Bump golang.org/x/net from 0.12.0 to 0.14.0 (#688) [babe25f] + +## 1.27.10 + +### Fixes +- fix: go 1.21 adding goroutine ID to creator+location (#685) [bdc7803] + +## 1.27.9 + +### Fixes +- Prevent nil-dereference in format.Object for boxed nil error (#681) [3b31fc3] + +### Maintenance +- Bump golang.org/x/net from 0.11.0 to 0.12.0 (#679) [360849b] +- chore: use String() instead of fmt.Sprintf (#678) [86f3659] +- Bump golang.org/x/net from 0.10.0 to 0.11.0 (#674) [642ead0] +- chore: unnecessary use of fmt.Sprintf (#677) [ceb9ca6] +- Bump github.com/onsi/ginkgo/v2 from 2.10.0 to 2.11.0 (#675) [a2087d8] +- docs: fix ContainSubstring references (#673) [fc9a89f] +- Bump github.com/onsi/ginkgo/v2 from 2.9.7 to 2.10.0 (#671) [9076019] + +## 1.27.8 + +### Fixes +- HaveExactElement should not call FailureMessage if a submatcher returned an error [096f392] + +### Maintenance +- Bump github.com/onsi/ginkgo/v2 from 2.9.5 to 2.9.7 (#669) [8884bee] + +## 1.27.7 + +### Fixes +- fix: gcustom.MakeMatcher accepts nil as actual value (#666) [57054d5] + +### Maintenance +- update gitignore [05c1bc6] +- Bump github.com/onsi/ginkgo/v2 from 2.9.4 to 2.9.5 (#663) [7cadcf6] +- Bump golang.org/x/net from 0.9.0 to 0.10.0 (#662) [b524839] +- Bump github.com/onsi/ginkgo/v2 from 2.9.2 to 2.9.4 (#661) [5f44694] +- Bump commonmarker from 0.23.8 to 0.23.9 in /docs (#657) [05dc99a] +- Bump nokogiri from 1.14.1 to 1.14.3 in /docs (#658) [3a033d1] +- Replace deprecated NewGomegaWithT with NewWithT (#659) [a19238f] +- Bump golang.org/x/net from 0.8.0 to 0.9.0 (#656) [29ed041] +- Bump actions/setup-go from 3 to 4 (#651) [11b2080] + +## 1.27.6 + +### Fixes +- Allow collections matchers to work correctly when expected has nil elements [60e7cf3] + +### Maintenance +- updates MatchError godoc comment to also accept a Gomega matcher (#654) [67b869d] + +## 1.27.5 + +### Maintenance +- Bump github.com/onsi/ginkgo/v2 from 2.9.1 to 2.9.2 (#653) [a215021] +- Bump github.com/go-task/slim-sprig (#652) [a26fed8] + +## 1.27.4 + +### Fixes +- improve error formatting and remove duplication of error message in Eventually/Consistently [854f075] + +### Maintenance +- Bump github.com/onsi/ginkgo/v2 from 2.9.0 to 2.9.1 (#650) [ccebd9b] + +## 1.27.3 + +### Fixes +- format.Object now always includes err.Error() when passed an error [86d97ef] +- Fix HaveExactElements to work inside ContainElement or other collection matchers (#648) [636757e] + +### Maintenance +- Bump github.com/golang/protobuf from 1.5.2 to 1.5.3 (#649) [cc16689] +- Bump github.com/onsi/ginkgo/v2 from 2.8.4 to 2.9.0 (#646) [e783366] + +## 1.27.2 + +### Fixes +- improve poll progress message when polling a consistently that has been passing [28a319b] + +### Maintenance +- bump ginkgo +- remove tools.go hack as Ginkgo 2.8.2 automatically pulls in the cli dependencies [81443b3] + +## 1.27.1 + +### Maintenance + +- Bump golang.org/x/net from 0.6.0 to 0.7.0 (#640) [bc686cd] + +## 1.27.0 + +### Features +- Add HaveExactElements matcher (#634) [9d50783] +- update Gomega docs to discuss GinkgoHelper() [be32774] + +### Maintenance +- Bump github.com/onsi/ginkgo/v2 from 2.8.0 to 2.8.1 (#639) [296a68b] +- Bump golang.org/x/net from 0.5.0 to 0.6.0 (#638) [c2b098b] +- Bump github-pages from 227 to 228 in /docs (#636) [a9069ab] +- test: update matrix for Go 1.20 (#635) [6bd25c8] +- Bump github.com/onsi/ginkgo/v2 from 2.7.0 to 2.8.0 (#631) [5445f8b] +- Bump webrick from 1.7.0 to 1.8.1 in /docs (#630) [03e93bb] +- codeql: add ruby language (#626) [63c7d21] +- dependabot: add bundler package-ecosystem for docs (#625) [d92f963] + +## 1.26.0 + +### Features +- When a polled function returns an error, keep track of the actual and report on the matcher state of the last non-errored actual [21f3090] +- improve eventually failure message output [c530fb3] + +### Fixes +- fix several documentation spelling issues [e2eff1f] + + +## 1.25.0 + +### Features +- add `MustPassRepeatedly(int)` to asyncAssertion (#619) [4509f72] +- compare unwrapped errors using DeepEqual (#617) [aaeaa5d] + +### Maintenance +- Bump golang.org/x/net from 0.4.0 to 0.5.0 (#614) [c7cfea4] +- Bump github.com/onsi/ginkgo/v2 from 2.6.1 to 2.7.0 (#615) [71b8adb] +- Docs: Fix typo "MUltiple" -> "Multiple" (#616) [9351dda] +- clean up go.sum [cd1dc1d] + ## 1.24.2 ### Fixes diff --git a/vendor/github.com/onsi/gomega/format/format.go b/vendor/github.com/onsi/gomega/format/format.go index 1a2ed877..6c168063 100644 --- a/vendor/github.com/onsi/gomega/format/format.go +++ b/vendor/github.com/onsi/gomega/format/format.go @@ -52,7 +52,7 @@ var CharactersAroundMismatchToInclude uint = 5 var contextType = reflect.TypeOf((*context.Context)(nil)).Elem() var timeType = reflect.TypeOf(time.Time{}) -//The default indentation string emitted by the format package +// The default indentation string emitted by the format package var Indent = " " var longFormThreshold = 20 @@ -258,7 +258,11 @@ Set PrintContextObjects to true to print the content of objects implementing con func Object(object interface{}, indentation uint) string { indent := strings.Repeat(Indent, int(indentation)) value := reflect.ValueOf(object) - return fmt.Sprintf("%s<%s>: %s", indent, formatType(value), formatValue(value, indentation)) + commonRepresentation := "" + if err, ok := object.(error); ok && !isNilValue(value) { // isNilValue check needed here to avoid nil deref due to boxed nil + commonRepresentation += "\n" + IndentString(err.Error(), indentation) + "\n" + indent + } + return fmt.Sprintf("%s<%s>: %s%s", indent, formatType(value), commonRepresentation, formatValue(value, indentation)) } /* @@ -298,7 +302,7 @@ func formatType(v reflect.Value) string { case reflect.Map: return fmt.Sprintf("%s | len:%d", v.Type(), v.Len()) default: - return fmt.Sprintf("%s", v.Type()) + return v.Type().String() } } diff --git a/vendor/github.com/onsi/gomega/gomega_dsl.go b/vendor/github.com/onsi/gomega/gomega_dsl.go index b65c8be9..675a1784 100644 --- a/vendor/github.com/onsi/gomega/gomega_dsl.go +++ b/vendor/github.com/onsi/gomega/gomega_dsl.go @@ -22,7 +22,7 @@ import ( "github.com/onsi/gomega/types" ) -const GOMEGA_VERSION = "1.24.2" +const GOMEGA_VERSION = "1.28.0" const nilGomegaPanic = `You are trying to make an assertion, but haven't registered Gomega's fail handler. If you're using Ginkgo then you probably forgot to put your assertion in an It(). @@ -204,7 +204,7 @@ func Ω(actual interface{}, extra ...interface{}) Assertion { // All subsequent arguments will be required to be nil/zero. // // This is convenient if you want to make an assertion on a method/function that returns -// a value and an error - a common patter in Go. +// a value and an error - a common pattern in Go. // // For example, given a function with signature: // @@ -360,6 +360,16 @@ You can also pass additional arugments to functions that take a Gomega. The onl g.Expect(elements).To(ConsistOf(expected)) }).WithContext(ctx).WithArguments("/names", "Joe", "Jane", "Sam").Should(Succeed()) +You can ensure that you get a number of consecutive successful tries before succeeding using `MustPassRepeatedly(int)`. For Example: + + int count := 0 + Eventually(func() bool { + count++ + return count > 2 + }).MustPassRepeatedly(2).Should(BeTrue()) + // Because we had to wait for 2 calls that returned true + Expect(count).To(Equal(3)) + Finally, in addition to passing timeouts and a context to Eventually you can be more explicit with Eventually's chaining configuration methods: Eventually(..., "1s", "2s", ctx).Should(...) diff --git a/vendor/github.com/onsi/gomega/internal/async_assertion.go b/vendor/github.com/onsi/gomega/internal/async_assertion.go index cc8615a1..1188b0bc 100644 --- a/vendor/github.com/onsi/gomega/internal/async_assertion.go +++ b/vendor/github.com/onsi/gomega/internal/async_assertion.go @@ -2,6 +2,7 @@ package internal import ( "context" + "errors" "fmt" "reflect" "runtime" @@ -16,6 +17,22 @@ var errInterface = reflect.TypeOf((*error)(nil)).Elem() var gomegaType = reflect.TypeOf((*types.Gomega)(nil)).Elem() var contextType = reflect.TypeOf(new(context.Context)).Elem() +type formattedGomegaError interface { + FormattedGomegaError() string +} + +type asyncPolledActualError struct { + message string +} + +func (err *asyncPolledActualError) Error() string { + return err.message +} + +func (err *asyncPolledActualError) FormattedGomegaError() string { + return err.message +} + type contextWithAttachProgressReporter interface { AttachProgressReporter(func() string) func() } @@ -55,21 +72,23 @@ type AsyncAssertion struct { actual interface{} argsToForward []interface{} - timeoutInterval time.Duration - pollingInterval time.Duration - ctx context.Context - offset int - g *Gomega + timeoutInterval time.Duration + pollingInterval time.Duration + mustPassRepeatedly int + ctx context.Context + offset int + g *Gomega } -func NewAsyncAssertion(asyncType AsyncAssertionType, actualInput interface{}, g *Gomega, timeoutInterval time.Duration, pollingInterval time.Duration, ctx context.Context, offset int) *AsyncAssertion { +func NewAsyncAssertion(asyncType AsyncAssertionType, actualInput interface{}, g *Gomega, timeoutInterval time.Duration, pollingInterval time.Duration, mustPassRepeatedly int, ctx context.Context, offset int) *AsyncAssertion { out := &AsyncAssertion{ - asyncType: asyncType, - timeoutInterval: timeoutInterval, - pollingInterval: pollingInterval, - offset: offset, - ctx: ctx, - g: g, + asyncType: asyncType, + timeoutInterval: timeoutInterval, + pollingInterval: pollingInterval, + mustPassRepeatedly: mustPassRepeatedly, + offset: offset, + ctx: ctx, + g: g, } out.actual = actualInput @@ -115,6 +134,11 @@ func (assertion *AsyncAssertion) WithArguments(argsToForward ...interface{}) typ return assertion } +func (assertion *AsyncAssertion) MustPassRepeatedly(count int) types.AsyncAssertion { + assertion.mustPassRepeatedly = count + return assertion +} + func (assertion *AsyncAssertion) Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool { assertion.g.THelper() vetOptionalDescription("Asynchronous assertion", optionalDescription...) @@ -141,7 +165,9 @@ func (assertion *AsyncAssertion) buildDescription(optionalDescription ...interfa func (assertion *AsyncAssertion) processReturnValues(values []reflect.Value) (interface{}, error) { if len(values) == 0 { - return nil, fmt.Errorf("No values were returned by the function passed to Gomega") + return nil, &asyncPolledActualError{ + message: fmt.Sprintf("The function passed to %s did not return any values", assertion.asyncType), + } } actual := values[0].Interface() @@ -164,10 +190,12 @@ func (assertion *AsyncAssertion) processReturnValues(values []reflect.Value) (in continue } if i == len(values)-2 && extraType.Implements(errInterface) { - err = fmt.Errorf("function returned error: %w", extra.(error)) + err = extra.(error) } if err == nil { - err = fmt.Errorf("Unexpected non-nil/non-zero return value at index %d:\n\t<%T>: %#v", i+1, extra, extra) + err = &asyncPolledActualError{ + message: fmt.Sprintf("The function passed to %s had an unexpected non-nil/non-zero return value at index %d:\n%s", assertion.asyncType, i+1, format.Object(extra, 1)), + } } } @@ -202,6 +230,13 @@ You can learn more at https://onsi.github.io/gomega/#eventually `, assertion.asyncType, t, t.NumIn(), numProvided, have, assertion.asyncType) } +func (assertion *AsyncAssertion) invalidMustPassRepeatedlyError(reason string) error { + return fmt.Errorf(`Invalid use of MustPassRepeatedly with %s %s + +You can learn more at https://onsi.github.io/gomega/#eventually +`, assertion.asyncType, reason) +} + func (assertion *AsyncAssertion) buildActualPoller() (func() (interface{}, error), error) { if !assertion.actualIsFunc { return func() (interface{}, error) { return assertion.actual, nil }, nil @@ -239,7 +274,9 @@ func (assertion *AsyncAssertion) buildActualPoller() (func() (interface{}, error skip = callerSkip[0] } _, file, line, _ := runtime.Caller(skip + 1) - assertionFailure = fmt.Errorf("Assertion in callback at %s:%d failed:\n%s", file, line, message) + assertionFailure = &asyncPolledActualError{ + message: fmt.Sprintf("The function passed to %s failed at %s:%d with:\n%s", assertion.asyncType, file, line, message), + } // we throw an asyncGomegaHaltExecutionError so that defer GinkgoRecover() can catch this error if the user makes an assertion in a goroutine panic(asyncGomegaHaltExecutionError{}) }))) @@ -257,6 +294,13 @@ func (assertion *AsyncAssertion) buildActualPoller() (func() (interface{}, error return nil, assertion.argumentMismatchError(actualType, len(inValues)) } + if assertion.mustPassRepeatedly != 1 && assertion.asyncType != AsyncAssertionTypeEventually { + return nil, assertion.invalidMustPassRepeatedlyError("it can only be used with Eventually") + } + if assertion.mustPassRepeatedly < 1 { + return nil, assertion.invalidMustPassRepeatedlyError("parameter can't be < 1") + } + return func() (actual interface{}, err error) { var values []reflect.Value assertionFailure = nil @@ -338,22 +382,39 @@ func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch timeout := assertion.afterTimeout() lock := sync.Mutex{} - var matches bool - var err error + var matches, hasLastValidActual bool + var actual, lastValidActual interface{} + var actualErr, matcherErr error var oracleMatcherSaysStop bool assertion.g.THelper() - pollActual, err := assertion.buildActualPoller() - if err != nil { - assertion.g.Fail(err.Error(), 2+assertion.offset) + pollActual, buildActualPollerErr := assertion.buildActualPoller() + if buildActualPollerErr != nil { + assertion.g.Fail(buildActualPollerErr.Error(), 2+assertion.offset) return false } - value, err := pollActual() - if err == nil { - oracleMatcherSaysStop = assertion.matcherSaysStopTrying(matcher, value) - matches, err = assertion.pollMatcher(matcher, value) + actual, actualErr = pollActual() + if actualErr == nil { + lastValidActual = actual + hasLastValidActual = true + oracleMatcherSaysStop = assertion.matcherSaysStopTrying(matcher, actual) + matches, matcherErr = assertion.pollMatcher(matcher, actual) + } + + renderError := func(preamble string, err error) string { + message := "" + if pollingSignalErr, ok := AsPollingSignalError(err); ok { + message = err.Error() + for _, attachment := range pollingSignalErr.Attachments { + message += fmt.Sprintf("\n%s:\n", attachment.Description) + message += format.Object(attachment.Object, 1) + } + } else { + message = preamble + "\n" + format.Object(err, 1) + } + return message } messageGenerator := func() string { @@ -361,23 +422,53 @@ func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch lock.Lock() defer lock.Unlock() message := "" - if err != nil { - if pollingSignalErr, ok := AsPollingSignalError(err); ok && pollingSignalErr.IsStopTrying() { - message = err.Error() - for _, attachment := range pollingSignalErr.Attachments { - message += fmt.Sprintf("\n%s:\n", attachment.Description) - message += format.Object(attachment.Object, 1) + + if actualErr == nil { + if matcherErr == nil { + if desiredMatch != matches { + if desiredMatch { + message += matcher.FailureMessage(actual) + } else { + message += matcher.NegatedFailureMessage(actual) + } + } else { + if assertion.asyncType == AsyncAssertionTypeConsistently { + message += "There is no failure as the matcher passed to Consistently has not yet failed" + } else { + message += "There is no failure as the matcher passed to Eventually succeeded on its most recent iteration" + } } } else { - message = "Error: " + err.Error() + "\n" + format.Object(err, 1) + var fgErr formattedGomegaError + if errors.As(actualErr, &fgErr) { + message += fgErr.FormattedGomegaError() + "\n" + } else { + message += renderError(fmt.Sprintf("The matcher passed to %s returned the following error:", assertion.asyncType), matcherErr) + } } } else { - if desiredMatch { - message = matcher.FailureMessage(value) + var fgErr formattedGomegaError + if errors.As(actualErr, &fgErr) { + message += fgErr.FormattedGomegaError() + "\n" } else { - message = matcher.NegatedFailureMessage(value) + message += renderError(fmt.Sprintf("The function passed to %s returned the following error:", assertion.asyncType), actualErr) + } + if hasLastValidActual { + message += fmt.Sprintf("\nAt one point, however, the function did return successfully.\nYet, %s failed because", assertion.asyncType) + _, e := matcher.Match(lastValidActual) + if e != nil { + message += renderError(" the matcher returned the following error:", e) + } else { + message += " the matcher was not satisfied:\n" + if desiredMatch { + message += matcher.FailureMessage(lastValidActual) + } else { + message += matcher.NegatedFailureMessage(lastValidActual) + } + } } } + description := assertion.buildDescription(optionalDescription...) return fmt.Sprintf("%s%s", description, message) } @@ -396,30 +487,39 @@ func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch } } + // Used to count the number of times in a row a step passed + passedRepeatedlyCount := 0 for { var nextPoll <-chan time.Time = nil var isTryAgainAfterError = false - if pollingSignalErr, ok := AsPollingSignalError(err); ok { - if pollingSignalErr.IsStopTrying() { - fail("Told to stop trying") - return false - } - if pollingSignalErr.IsTryAgainAfter() { - nextPoll = time.After(pollingSignalErr.TryAgainDuration()) - isTryAgainAfterError = true + for _, err := range []error{actualErr, matcherErr} { + if pollingSignalErr, ok := AsPollingSignalError(err); ok { + if pollingSignalErr.IsStopTrying() { + fail("Told to stop trying") + return false + } + if pollingSignalErr.IsTryAgainAfter() { + nextPoll = time.After(pollingSignalErr.TryAgainDuration()) + isTryAgainAfterError = true + } } } - if err == nil && matches == desiredMatch { + if actualErr == nil && matcherErr == nil && matches == desiredMatch { if assertion.asyncType == AsyncAssertionTypeEventually { - return true + passedRepeatedlyCount += 1 + if passedRepeatedlyCount == assertion.mustPassRepeatedly { + return true + } } } else if !isTryAgainAfterError { if assertion.asyncType == AsyncAssertionTypeConsistently { fail("Failed") return false } + // Reset the consecutive pass count + passedRepeatedlyCount = 0 } if oracleMatcherSaysStop { @@ -437,15 +537,19 @@ func (assertion *AsyncAssertion) match(matcher types.GomegaMatcher, desiredMatch select { case <-nextPoll: - v, e := pollActual() + a, e := pollActual() lock.Lock() - value, err = v, e + actual, actualErr = a, e lock.Unlock() - if err == nil { - oracleMatcherSaysStop = assertion.matcherSaysStopTrying(matcher, value) - m, e := assertion.pollMatcher(matcher, value) + if actualErr == nil { + lock.Lock() + lastValidActual = actual + hasLastValidActual = true + lock.Unlock() + oracleMatcherSaysStop = assertion.matcherSaysStopTrying(matcher, actual) + m, e := assertion.pollMatcher(matcher, actual) lock.Lock() - matches, err = m, e + matches, matcherErr = m, e lock.Unlock() } case <-contextDone: diff --git a/vendor/github.com/onsi/gomega/internal/gomega.go b/vendor/github.com/onsi/gomega/internal/gomega.go index 2d92877f..de1f4f33 100644 --- a/vendor/github.com/onsi/gomega/internal/gomega.go +++ b/vendor/github.com/onsi/gomega/internal/gomega.go @@ -109,7 +109,7 @@ func (g *Gomega) makeAsyncAssertion(asyncAssertionType AsyncAssertionType, offse } } - return NewAsyncAssertion(asyncAssertionType, actual, g, timeoutInterval, pollingInterval, ctx, offset) + return NewAsyncAssertion(asyncAssertionType, actual, g, timeoutInterval, pollingInterval, 1, ctx, offset) } func (g *Gomega) SetDefaultEventuallyTimeout(t time.Duration) { diff --git a/vendor/github.com/onsi/gomega/matchers.go b/vendor/github.com/onsi/gomega/matchers.go index 857586a9..4c13ad0a 100644 --- a/vendor/github.com/onsi/gomega/matchers.go +++ b/vendor/github.com/onsi/gomega/matchers.go @@ -87,14 +87,17 @@ func Succeed() types.GomegaMatcher { return &matchers.SucceedMatcher{} } -// MatchError succeeds if actual is a non-nil error that matches the passed in string/error. +// MatchError succeeds if actual is a non-nil error that matches the passed in +// string, error, or matcher. // // These are valid use-cases: // // Expect(err).Should(MatchError("an error")) //asserts that err.Error() == "an error" // Expect(err).Should(MatchError(SomeError)) //asserts that err == SomeError (via reflect.DeepEqual) +// Expect(err).Should(MatchError(ContainSubstring("sprocket not found"))) // asserts that err.Error() contains substring "sprocket not found" // -// It is an error for err to be nil or an object that does not implement the Error interface +// It is an error for err to be nil or an object that does not implement the +// Error interface func MatchError(expected interface{}) types.GomegaMatcher { return &matchers.MatchErrorMatcher{ Expected: expected, @@ -349,6 +352,20 @@ func ConsistOf(elements ...interface{}) types.GomegaMatcher { } } +// HaveExactElemets succeeds if actual contains elements that precisely match the elemets passed into the matcher. The ordering of the elements does matter. +// By default HaveExactElements() uses Equal() to match the elements, however custom matchers can be passed in instead. Here are some examples: +// +// Expect([]string{"Foo", "FooBar"}).Should(HaveExactElements("Foo", "FooBar")) +// Expect([]string{"Foo", "FooBar"}).Should(HaveExactElements("Foo", ContainSubstring("Bar"))) +// Expect([]string{"Foo", "FooBar"}).Should(HaveExactElements(ContainSubstring("Foo"), ContainSubstring("Foo"))) +// +// Actual must be an array or slice. +func HaveExactElements(elements ...interface{}) types.GomegaMatcher { + return &matchers.HaveExactElementsMatcher{ + Elements: elements, + } +} + // ContainElements succeeds if actual contains the passed in elements. The ordering of the elements does not matter. // By default ContainElements() uses Equal() to match the elements, however custom matchers can be passed in instead. Here are some examples: // diff --git a/vendor/github.com/onsi/gomega/matchers/be_a_directory.go b/vendor/github.com/onsi/gomega/matchers/be_a_directory.go index acffc857..93d4497c 100644 --- a/vendor/github.com/onsi/gomega/matchers/be_a_directory.go +++ b/vendor/github.com/onsi/gomega/matchers/be_a_directory.go @@ -52,5 +52,5 @@ func (matcher *BeADirectoryMatcher) FailureMessage(actual interface{}) (message } func (matcher *BeADirectoryMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not be a directory")) + return format.Message(actual, "not be a directory") } diff --git a/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go b/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go index 89441c80..8fefc4de 100644 --- a/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go +++ b/vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go @@ -52,5 +52,5 @@ func (matcher *BeARegularFileMatcher) FailureMessage(actual interface{}) (messag } func (matcher *BeARegularFileMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not be a regular file")) + return format.Message(actual, "not be a regular file") } diff --git a/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go b/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go index ec6506b0..e2bdd281 100644 --- a/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go +++ b/vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go @@ -32,9 +32,9 @@ func (matcher *BeAnExistingFileMatcher) Match(actual interface{}) (success bool, } func (matcher *BeAnExistingFileMatcher) FailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("to exist")) + return format.Message(actual, "to exist") } func (matcher *BeAnExistingFileMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, fmt.Sprintf("not to exist")) + return format.Message(actual, "not to exist") } diff --git a/vendor/github.com/onsi/gomega/matchers/consist_of.go b/vendor/github.com/onsi/gomega/matchers/consist_of.go index e8ef0dee..f69037a4 100644 --- a/vendor/github.com/onsi/gomega/matchers/consist_of.go +++ b/vendor/github.com/onsi/gomega/matchers/consist_of.go @@ -48,11 +48,13 @@ func neighbours(value, matcher interface{}) (bool, error) { func equalMatchersToElements(matchers []interface{}) (elements []interface{}) { for _, matcher := range matchers { - equalMatcher, ok := matcher.(*EqualMatcher) - if ok { - matcher = equalMatcher.Expected + if equalMatcher, ok := matcher.(*EqualMatcher); ok { + elements = append(elements, equalMatcher.Expected) + } else if _, ok := matcher.(*BeNilMatcher); ok { + elements = append(elements, nil) + } else { + elements = append(elements, matcher) } - elements = append(elements, matcher) } return } @@ -72,11 +74,13 @@ func flatten(elems []interface{}) []interface{} { func matchers(expectedElems []interface{}) (matchers []interface{}) { for _, e := range flatten(expectedElems) { - matcher, isMatcher := e.(omegaMatcher) - if !isMatcher { - matcher = &EqualMatcher{Expected: e} + if e == nil { + matchers = append(matchers, &BeNilMatcher{}) + } else if matcher, isMatcher := e.(omegaMatcher); isMatcher { + matchers = append(matchers, matcher) + } else { + matchers = append(matchers, &EqualMatcher{Expected: e}) } - matchers = append(matchers, matcher) } return } @@ -89,9 +93,14 @@ func presentable(elems []interface{}) interface{} { } sv := reflect.ValueOf(elems) - tt := sv.Index(0).Elem().Type() + firstEl := sv.Index(0) + if firstEl.IsNil() { + return elems + } + tt := firstEl.Elem().Type() for i := 1; i < sv.Len(); i++ { - if sv.Index(i).Elem().Type() != tt { + el := sv.Index(i) + if el.IsNil() || (sv.Index(i).Elem().Type() != tt) { return elems } } diff --git a/vendor/github.com/onsi/gomega/matchers/have_exact_elements.go b/vendor/github.com/onsi/gomega/matchers/have_exact_elements.go new file mode 100644 index 00000000..dca5b944 --- /dev/null +++ b/vendor/github.com/onsi/gomega/matchers/have_exact_elements.go @@ -0,0 +1,88 @@ +package matchers + +import ( + "fmt" + + "github.com/onsi/gomega/format" +) + +type mismatchFailure struct { + failure string + index int +} + +type HaveExactElementsMatcher struct { + Elements []interface{} + mismatchFailures []mismatchFailure + missingIndex int + extraIndex int +} + +func (matcher *HaveExactElementsMatcher) Match(actual interface{}) (success bool, err error) { + matcher.resetState() + + if isMap(actual) { + return false, fmt.Errorf("error") + } + + matchers := matchers(matcher.Elements) + values := valuesOf(actual) + + lenMatchers := len(matchers) + lenValues := len(values) + + for i := 0; i < lenMatchers || i < lenValues; i++ { + if i >= lenMatchers { + matcher.extraIndex = i + continue + } + + if i >= lenValues { + matcher.missingIndex = i + return + } + + elemMatcher := matchers[i].(omegaMatcher) + match, err := elemMatcher.Match(values[i]) + if err != nil { + matcher.mismatchFailures = append(matcher.mismatchFailures, mismatchFailure{ + index: i, + failure: err.Error(), + }) + } else if !match { + matcher.mismatchFailures = append(matcher.mismatchFailures, mismatchFailure{ + index: i, + failure: elemMatcher.FailureMessage(values[i]), + }) + } + } + + return matcher.missingIndex+matcher.extraIndex+len(matcher.mismatchFailures) == 0, nil +} + +func (matcher *HaveExactElementsMatcher) FailureMessage(actual interface{}) (message string) { + message = format.Message(actual, "to have exact elements with", presentable(matcher.Elements)) + if matcher.missingIndex > 0 { + message = fmt.Sprintf("%s\nthe missing elements start from index %d", message, matcher.missingIndex) + } + if matcher.extraIndex > 0 { + message = fmt.Sprintf("%s\nthe extra elements start from index %d", message, matcher.extraIndex) + } + if len(matcher.mismatchFailures) != 0 { + message = fmt.Sprintf("%s\nthe mismatch indexes were:", message) + } + for _, mismatch := range matcher.mismatchFailures { + message = fmt.Sprintf("%s\n%d: %s", message, mismatch.index, mismatch.failure) + } + return +} + +func (matcher *HaveExactElementsMatcher) NegatedFailureMessage(actual interface{}) (message string) { + return format.Message(actual, "not to contain elements", presentable(matcher.Elements)) +} + +func (matcher *HaveExactElementsMatcher) resetState() { + matcher.mismatchFailures = nil + matcher.missingIndex = 0 + matcher.extraIndex = 0 +} diff --git a/vendor/github.com/onsi/gomega/matchers/have_http_body_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_http_body_matcher.go index 6a3dcdc3..d14d9e5f 100644 --- a/vendor/github.com/onsi/gomega/matchers/have_http_body_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/have_http_body_matcher.go @@ -11,8 +11,9 @@ import ( ) type HaveHTTPBodyMatcher struct { - Expected interface{} - cachedBody []byte + Expected interface{} + cachedResponse interface{} + cachedBody []byte } func (matcher *HaveHTTPBodyMatcher) Match(actual interface{}) (bool, error) { @@ -73,7 +74,7 @@ func (matcher *HaveHTTPBodyMatcher) NegatedFailureMessage(actual interface{}) (m // the Reader is closed and it is not readable again in FailureMessage() // or NegatedFailureMessage() func (matcher *HaveHTTPBodyMatcher) body(actual interface{}) ([]byte, error) { - if matcher.cachedBody != nil { + if matcher.cachedResponse == actual && matcher.cachedBody != nil { return matcher.cachedBody, nil } @@ -91,8 +92,10 @@ func (matcher *HaveHTTPBodyMatcher) body(actual interface{}) ([]byte, error) { switch a := actual.(type) { case *http.Response: + matcher.cachedResponse = a return body(a) case *httptest.ResponseRecorder: + matcher.cachedResponse = a return body(a.Result()) default: return nil, fmt.Errorf("HaveHTTPBody matcher expects *http.Response or *httptest.ResponseRecorder. Got:\n%s", format.Object(actual, 1)) diff --git a/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go index 5bcfdd2a..22a1b673 100644 --- a/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go @@ -31,5 +31,5 @@ func (matcher *HaveOccurredMatcher) FailureMessage(actual interface{}) (message } func (matcher *HaveOccurredMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Unexpected error:\n%s\n%s\n%s", format.Object(actual, 1), format.IndentString(actual.(error).Error(), 1), "occurred") + return fmt.Sprintf("Unexpected error:\n%s\n%s", format.Object(actual, 1), "occurred") } diff --git a/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go index c8993a86..827475ea 100644 --- a/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go @@ -25,7 +25,17 @@ func (matcher *MatchErrorMatcher) Match(actual interface{}) (success bool, err e expected := matcher.Expected if isError(expected) { - return reflect.DeepEqual(actualErr, expected) || errors.Is(actualErr, expected.(error)), nil + // first try the built-in errors.Is + if errors.Is(actualErr, expected.(error)) { + return true, nil + } + // if not, try DeepEqual along the error chain + for unwrapped := actualErr; unwrapped != nil; unwrapped = errors.Unwrap(unwrapped) { + if reflect.DeepEqual(unwrapped, expected) { + return true, nil + } + } + return false, nil } if isString(expected) { diff --git a/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go b/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go index 721ed552..327350f7 100644 --- a/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/succeed_matcher.go @@ -1,11 +1,16 @@ package matchers import ( + "errors" "fmt" "github.com/onsi/gomega/format" ) +type formattedGomegaError interface { + FormattedGomegaError() string +} + type SucceedMatcher struct { } @@ -25,7 +30,11 @@ func (matcher *SucceedMatcher) Match(actual interface{}) (success bool, err erro } func (matcher *SucceedMatcher) FailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected success, but got an error:\n%s\n%s", format.Object(actual, 1), format.IndentString(actual.(error).Error(), 1)) + var fgErr formattedGomegaError + if errors.As(actual.(error), &fgErr) { + return fgErr.FormattedGomegaError() + } + return fmt.Sprintf("Expected success, but got an error:\n%s", format.Object(actual, 1)) } func (matcher *SucceedMatcher) NegatedFailureMessage(actual interface{}) (message string) { diff --git a/vendor/github.com/onsi/gomega/tools b/vendor/github.com/onsi/gomega/tools deleted file mode 100644 index e4195cf3..00000000 --- a/vendor/github.com/onsi/gomega/tools +++ /dev/null @@ -1,8 +0,0 @@ -//go:build tools -// +build tools - -package main - -import ( - _ "github.com/onsi/ginkgo/v2/ginkgo" -) diff --git a/vendor/github.com/onsi/gomega/types/types.go b/vendor/github.com/onsi/gomega/types/types.go index 125de649..7c7adb94 100644 --- a/vendor/github.com/onsi/gomega/types/types.go +++ b/vendor/github.com/onsi/gomega/types/types.go @@ -75,6 +75,7 @@ type AsyncAssertion interface { ProbeEvery(interval time.Duration) AsyncAssertion WithContext(ctx context.Context) AsyncAssertion WithArguments(argsToForward ...interface{}) AsyncAssertion + MustPassRepeatedly(count int) AsyncAssertion } // Assertions are returned by Ω and Expect and enable assertions against Gomega matchers diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/golang.org/x/tools/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/golang.org/x/tools/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/tools/PATENTS b/vendor/golang.org/x/tools/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/golang.org/x/tools/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go new file mode 100644 index 00000000..1fc1de0b --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go @@ -0,0 +1,220 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package inspector provides helper functions for traversal over the +// syntax trees of a package, including node filtering by type, and +// materialization of the traversal stack. +// +// During construction, the inspector does a complete traversal and +// builds a list of push/pop events and their node type. Subsequent +// method calls that request a traversal scan this list, rather than walk +// the AST, and perform type filtering using efficient bit sets. +// +// Experiments suggest the inspector's traversals are about 2.5x faster +// than ast.Inspect, but it may take around 5 traversals for this +// benefit to amortize the inspector's construction cost. +// If efficiency is the primary concern, do not use Inspector for +// one-off traversals. +package inspector + +// There are four orthogonal features in a traversal: +// 1 type filtering +// 2 pruning +// 3 postorder calls to f +// 4 stack +// Rather than offer all of them in the API, +// only a few combinations are exposed: +// - Preorder is the fastest and has fewest features, +// but is the most commonly needed traversal. +// - Nodes and WithStack both provide pruning and postorder calls, +// even though few clients need it, because supporting two versions +// is not justified. +// More combinations could be supported by expressing them as +// wrappers around a more generic traversal, but this was measured +// and found to degrade performance significantly (30%). + +import ( + "go/ast" +) + +// An Inspector provides methods for inspecting +// (traversing) the syntax trees of a package. +type Inspector struct { + events []event +} + +// New returns an Inspector for the specified syntax trees. +func New(files []*ast.File) *Inspector { + return &Inspector{traverse(files)} +} + +// An event represents a push or a pop +// of an ast.Node during a traversal. +type event struct { + node ast.Node + typ uint64 // typeOf(node) on push event, or union of typ strictly between push and pop events on pop events + index int // index of corresponding push or pop event +} + +// TODO: Experiment with storing only the second word of event.node (unsafe.Pointer). +// Type can be recovered from the sole bit in typ. + +// Preorder visits all the nodes of the files supplied to New in +// depth-first order. It calls f(n) for each node n before it visits +// n's children. +// +// The complete traversal sequence is determined by ast.Inspect. +// The types argument, if non-empty, enables type-based filtering of +// events. The function f is called only for nodes whose type +// matches an element of the types slice. +func (in *Inspector) Preorder(types []ast.Node, f func(ast.Node)) { + // Because it avoids postorder calls to f, and the pruning + // check, Preorder is almost twice as fast as Nodes. The two + // features seem to contribute similar slowdowns (~1.4x each). + + mask := maskOf(types) + for i := 0; i < len(in.events); { + ev := in.events[i] + if ev.index > i { + // push + if ev.typ&mask != 0 { + f(ev.node) + } + pop := ev.index + if in.events[pop].typ&mask == 0 { + // Subtrees do not contain types: skip them and pop. + i = pop + 1 + continue + } + } + i++ + } +} + +// Nodes visits the nodes of the files supplied to New in depth-first +// order. It calls f(n, true) for each node n before it visits n's +// children. If f returns true, Nodes invokes f recursively for each +// of the non-nil children of the node, followed by a call of +// f(n, false). +// +// The complete traversal sequence is determined by ast.Inspect. +// The types argument, if non-empty, enables type-based filtering of +// events. The function f if is called only for nodes whose type +// matches an element of the types slice. +func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (proceed bool)) { + mask := maskOf(types) + for i := 0; i < len(in.events); { + ev := in.events[i] + if ev.index > i { + // push + pop := ev.index + if ev.typ&mask != 0 { + if !f(ev.node, true) { + i = pop + 1 // jump to corresponding pop + 1 + continue + } + } + if in.events[pop].typ&mask == 0 { + // Subtrees do not contain types: skip them. + i = pop + continue + } + } else { + // pop + push := ev.index + if in.events[push].typ&mask != 0 { + f(ev.node, false) + } + } + i++ + } +} + +// WithStack visits nodes in a similar manner to Nodes, but it +// supplies each call to f an additional argument, the current +// traversal stack. The stack's first element is the outermost node, +// an *ast.File; its last is the innermost, n. +func (in *Inspector) WithStack(types []ast.Node, f func(n ast.Node, push bool, stack []ast.Node) (proceed bool)) { + mask := maskOf(types) + var stack []ast.Node + for i := 0; i < len(in.events); { + ev := in.events[i] + if ev.index > i { + // push + pop := ev.index + stack = append(stack, ev.node) + if ev.typ&mask != 0 { + if !f(ev.node, true, stack) { + i = pop + 1 + stack = stack[:len(stack)-1] + continue + } + } + if in.events[pop].typ&mask == 0 { + // Subtrees does not contain types: skip them. + i = pop + continue + } + } else { + // pop + push := ev.index + if in.events[push].typ&mask != 0 { + f(ev.node, false, stack) + } + stack = stack[:len(stack)-1] + } + i++ + } +} + +// traverse builds the table of events representing a traversal. +func traverse(files []*ast.File) []event { + // Preallocate approximate number of events + // based on source file extent. + // This makes traverse faster by 4x (!). + var extent int + for _, f := range files { + extent += int(f.End() - f.Pos()) + } + // This estimate is based on the net/http package. + capacity := extent * 33 / 100 + if capacity > 1e6 { + capacity = 1e6 // impose some reasonable maximum + } + events := make([]event, 0, capacity) + + var stack []event + stack = append(stack, event{}) // include an extra event so file nodes have a parent + for _, f := range files { + ast.Inspect(f, func(n ast.Node) bool { + if n != nil { + // push + ev := event{ + node: n, + typ: 0, // temporarily used to accumulate type bits of subtree + index: len(events), // push event temporarily holds own index + } + stack = append(stack, ev) + events = append(events, ev) + } else { + // pop + top := len(stack) - 1 + ev := stack[top] + typ := typeOf(ev.node) + push := ev.index + parent := top - 1 + + events[push].typ = typ // set type of push + stack[parent].typ |= typ | ev.typ // parent's typ contains push and pop's typs. + events[push].index = len(events) // make push refer to pop + + stack = stack[:top] + events = append(events, ev) + } + return true + }) + } + + return events +} diff --git a/vendor/golang.org/x/tools/go/ast/inspector/typeof.go b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go new file mode 100644 index 00000000..703c8139 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go @@ -0,0 +1,229 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package inspector + +// This file defines func typeOf(ast.Node) uint64. +// +// The initial map-based implementation was too slow; +// see https://go-review.googlesource.com/c/tools/+/135655/1/go/ast/inspector/inspector.go#196 + +import ( + "go/ast" + "math" + + "golang.org/x/tools/internal/typeparams" +) + +const ( + nArrayType = iota + nAssignStmt + nBadDecl + nBadExpr + nBadStmt + nBasicLit + nBinaryExpr + nBlockStmt + nBranchStmt + nCallExpr + nCaseClause + nChanType + nCommClause + nComment + nCommentGroup + nCompositeLit + nDeclStmt + nDeferStmt + nEllipsis + nEmptyStmt + nExprStmt + nField + nFieldList + nFile + nForStmt + nFuncDecl + nFuncLit + nFuncType + nGenDecl + nGoStmt + nIdent + nIfStmt + nImportSpec + nIncDecStmt + nIndexExpr + nIndexListExpr + nInterfaceType + nKeyValueExpr + nLabeledStmt + nMapType + nPackage + nParenExpr + nRangeStmt + nReturnStmt + nSelectStmt + nSelectorExpr + nSendStmt + nSliceExpr + nStarExpr + nStructType + nSwitchStmt + nTypeAssertExpr + nTypeSpec + nTypeSwitchStmt + nUnaryExpr + nValueSpec +) + +// typeOf returns a distinct single-bit value that represents the type of n. +// +// Various implementations were benchmarked with BenchmarkNewInspector: +// +// GOGC=off +// - type switch 4.9-5.5ms 2.1ms +// - binary search over a sorted list of types 5.5-5.9ms 2.5ms +// - linear scan, frequency-ordered list 5.9-6.1ms 2.7ms +// - linear scan, unordered list 6.4ms 2.7ms +// - hash table 6.5ms 3.1ms +// +// A perfect hash seemed like overkill. +// +// The compiler's switch statement is the clear winner +// as it produces a binary tree in code, +// with constant conditions and good branch prediction. +// (Sadly it is the most verbose in source code.) +// Binary search suffered from poor branch prediction. +func typeOf(n ast.Node) uint64 { + // Fast path: nearly half of all nodes are identifiers. + if _, ok := n.(*ast.Ident); ok { + return 1 << nIdent + } + + // These cases include all nodes encountered by ast.Inspect. + switch n.(type) { + case *ast.ArrayType: + return 1 << nArrayType + case *ast.AssignStmt: + return 1 << nAssignStmt + case *ast.BadDecl: + return 1 << nBadDecl + case *ast.BadExpr: + return 1 << nBadExpr + case *ast.BadStmt: + return 1 << nBadStmt + case *ast.BasicLit: + return 1 << nBasicLit + case *ast.BinaryExpr: + return 1 << nBinaryExpr + case *ast.BlockStmt: + return 1 << nBlockStmt + case *ast.BranchStmt: + return 1 << nBranchStmt + case *ast.CallExpr: + return 1 << nCallExpr + case *ast.CaseClause: + return 1 << nCaseClause + case *ast.ChanType: + return 1 << nChanType + case *ast.CommClause: + return 1 << nCommClause + case *ast.Comment: + return 1 << nComment + case *ast.CommentGroup: + return 1 << nCommentGroup + case *ast.CompositeLit: + return 1 << nCompositeLit + case *ast.DeclStmt: + return 1 << nDeclStmt + case *ast.DeferStmt: + return 1 << nDeferStmt + case *ast.Ellipsis: + return 1 << nEllipsis + case *ast.EmptyStmt: + return 1 << nEmptyStmt + case *ast.ExprStmt: + return 1 << nExprStmt + case *ast.Field: + return 1 << nField + case *ast.FieldList: + return 1 << nFieldList + case *ast.File: + return 1 << nFile + case *ast.ForStmt: + return 1 << nForStmt + case *ast.FuncDecl: + return 1 << nFuncDecl + case *ast.FuncLit: + return 1 << nFuncLit + case *ast.FuncType: + return 1 << nFuncType + case *ast.GenDecl: + return 1 << nGenDecl + case *ast.GoStmt: + return 1 << nGoStmt + case *ast.Ident: + return 1 << nIdent + case *ast.IfStmt: + return 1 << nIfStmt + case *ast.ImportSpec: + return 1 << nImportSpec + case *ast.IncDecStmt: + return 1 << nIncDecStmt + case *ast.IndexExpr: + return 1 << nIndexExpr + case *typeparams.IndexListExpr: + return 1 << nIndexListExpr + case *ast.InterfaceType: + return 1 << nInterfaceType + case *ast.KeyValueExpr: + return 1 << nKeyValueExpr + case *ast.LabeledStmt: + return 1 << nLabeledStmt + case *ast.MapType: + return 1 << nMapType + case *ast.Package: + return 1 << nPackage + case *ast.ParenExpr: + return 1 << nParenExpr + case *ast.RangeStmt: + return 1 << nRangeStmt + case *ast.ReturnStmt: + return 1 << nReturnStmt + case *ast.SelectStmt: + return 1 << nSelectStmt + case *ast.SelectorExpr: + return 1 << nSelectorExpr + case *ast.SendStmt: + return 1 << nSendStmt + case *ast.SliceExpr: + return 1 << nSliceExpr + case *ast.StarExpr: + return 1 << nStarExpr + case *ast.StructType: + return 1 << nStructType + case *ast.SwitchStmt: + return 1 << nSwitchStmt + case *ast.TypeAssertExpr: + return 1 << nTypeAssertExpr + case *ast.TypeSpec: + return 1 << nTypeSpec + case *ast.TypeSwitchStmt: + return 1 << nTypeSwitchStmt + case *ast.UnaryExpr: + return 1 << nUnaryExpr + case *ast.ValueSpec: + return 1 << nValueSpec + } + return 0 +} + +func maskOf(nodes []ast.Node) uint64 { + if nodes == nil { + return math.MaxUint64 // match all node types + } + var mask uint64 + for _, n := range nodes { + mask |= typeOf(n) + } + return mask +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/common.go b/vendor/golang.org/x/tools/internal/typeparams/common.go new file mode 100644 index 00000000..d0d0649f --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/common.go @@ -0,0 +1,204 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package typeparams contains common utilities for writing tools that interact +// with generic Go code, as introduced with Go 1.18. +// +// Many of the types and functions in this package are proxies for the new APIs +// introduced in the standard library with Go 1.18. For example, the +// typeparams.Union type is an alias for go/types.Union, and the ForTypeSpec +// function returns the value of the go/ast.TypeSpec.TypeParams field. At Go +// versions older than 1.18 these helpers are implemented as stubs, allowing +// users of this package to write code that handles generic constructs inline, +// even if the Go version being used to compile does not support generics. +// +// Additionally, this package contains common utilities for working with the +// new generic constructs, to supplement the standard library APIs. Notably, +// the StructuralTerms API computes a minimal representation of the structural +// restrictions on a type parameter. +// +// An external version of these APIs is available in the +// golang.org/x/exp/typeparams module. +package typeparams + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" +) + +// UnpackIndexExpr extracts data from AST nodes that represent index +// expressions. +// +// For an ast.IndexExpr, the resulting indices slice will contain exactly one +// index expression. For an ast.IndexListExpr (go1.18+), it may have a variable +// number of index expressions. +// +// For nodes that don't represent index expressions, the first return value of +// UnpackIndexExpr will be nil. +func UnpackIndexExpr(n ast.Node) (x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) { + switch e := n.(type) { + case *ast.IndexExpr: + return e.X, e.Lbrack, []ast.Expr{e.Index}, e.Rbrack + case *IndexListExpr: + return e.X, e.Lbrack, e.Indices, e.Rbrack + } + return nil, token.NoPos, nil, token.NoPos +} + +// PackIndexExpr returns an *ast.IndexExpr or *ast.IndexListExpr, depending on +// the cardinality of indices. Calling PackIndexExpr with len(indices) == 0 +// will panic. +func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) ast.Expr { + switch len(indices) { + case 0: + panic("empty indices") + case 1: + return &ast.IndexExpr{ + X: x, + Lbrack: lbrack, + Index: indices[0], + Rbrack: rbrack, + } + default: + return &IndexListExpr{ + X: x, + Lbrack: lbrack, + Indices: indices, + Rbrack: rbrack, + } + } +} + +// IsTypeParam reports whether t is a type parameter. +func IsTypeParam(t types.Type) bool { + _, ok := t.(*TypeParam) + return ok +} + +// OriginMethod returns the origin method associated with the method fn. +// For methods on a non-generic receiver base type, this is just +// fn. However, for methods with a generic receiver, OriginMethod returns the +// corresponding method in the method set of the origin type. +// +// As a special case, if fn is not a method (has no receiver), OriginMethod +// returns fn. +func OriginMethod(fn *types.Func) *types.Func { + recv := fn.Type().(*types.Signature).Recv() + if recv == nil { + return fn + } + base := recv.Type() + p, isPtr := base.(*types.Pointer) + if isPtr { + base = p.Elem() + } + named, isNamed := base.(*types.Named) + if !isNamed { + // Receiver is a *types.Interface. + return fn + } + if ForNamed(named).Len() == 0 { + // Receiver base has no type parameters, so we can avoid the lookup below. + return fn + } + orig := NamedTypeOrigin(named) + gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name()) + + // This is a fix for a gopls crash (#60628) due to a go/types bug (#60634). In: + // package p + // type T *int + // func (*T) f() {} + // LookupFieldOrMethod(T, true, p, f)=nil, but NewMethodSet(*T)={(*T).f}. + // Here we make them consistent by force. + // (The go/types bug is general, but this workaround is reached only + // for generic T thanks to the early return above.) + if gfn == nil { + mset := types.NewMethodSet(types.NewPointer(orig)) + for i := 0; i < mset.Len(); i++ { + m := mset.At(i) + if m.Obj().Id() == fn.Id() { + gfn = m.Obj() + break + } + } + } + + // In golang/go#61196, we observe another crash, this time inexplicable. + if gfn == nil { + panic(fmt.Sprintf("missing origin method for %s.%s; named == origin: %t, named.NumMethods(): %d, origin.NumMethods(): %d", named, fn, named == orig, named.NumMethods(), orig.NumMethods())) + } + + return gfn.(*types.Func) +} + +// GenericAssignableTo is a generalization of types.AssignableTo that +// implements the following rule for uninstantiated generic types: +// +// If V and T are generic named types, then V is considered assignable to T if, +// for every possible instantation of V[A_1, ..., A_N], the instantiation +// T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N]. +// +// If T has structural constraints, they must be satisfied by V. +// +// For example, consider the following type declarations: +// +// type Interface[T any] interface { +// Accept(T) +// } +// +// type Container[T any] struct { +// Element T +// } +// +// func (c Container[T]) Accept(t T) { c.Element = t } +// +// In this case, GenericAssignableTo reports that instantiations of Container +// are assignable to the corresponding instantiation of Interface. +func GenericAssignableTo(ctxt *Context, V, T types.Type) bool { + // If V and T are not both named, or do not have matching non-empty type + // parameter lists, fall back on types.AssignableTo. + + VN, Vnamed := V.(*types.Named) + TN, Tnamed := T.(*types.Named) + if !Vnamed || !Tnamed { + return types.AssignableTo(V, T) + } + + vtparams := ForNamed(VN) + ttparams := ForNamed(TN) + if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || NamedTypeArgs(VN).Len() != 0 || NamedTypeArgs(TN).Len() != 0 { + return types.AssignableTo(V, T) + } + + // V and T have the same (non-zero) number of type params. Instantiate both + // with the type parameters of V. This must always succeed for V, and will + // succeed for T if and only if the type set of each type parameter of V is a + // subset of the type set of the corresponding type parameter of T, meaning + // that every instantiation of V corresponds to a valid instantiation of T. + + // Minor optimization: ensure we share a context across the two + // instantiations below. + if ctxt == nil { + ctxt = NewContext() + } + + var targs []types.Type + for i := 0; i < vtparams.Len(); i++ { + targs = append(targs, vtparams.At(i)) + } + + vinst, err := Instantiate(ctxt, V, targs, true) + if err != nil { + panic("type parameters should satisfy their own constraints") + } + + tinst, err := Instantiate(ctxt, T, targs, true) + if err != nil { + return false + } + + return types.AssignableTo(vinst, tinst) +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/coretype.go b/vendor/golang.org/x/tools/internal/typeparams/coretype.go new file mode 100644 index 00000000..993135ec --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/coretype.go @@ -0,0 +1,122 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typeparams + +import ( + "go/types" +) + +// CoreType returns the core type of T or nil if T does not have a core type. +// +// See https://go.dev/ref/spec#Core_types for the definition of a core type. +func CoreType(T types.Type) types.Type { + U := T.Underlying() + if _, ok := U.(*types.Interface); !ok { + return U // for non-interface types, + } + + terms, err := _NormalTerms(U) + if len(terms) == 0 || err != nil { + // len(terms) -> empty type set of interface. + // err != nil => U is invalid, exceeds complexity bounds, or has an empty type set. + return nil // no core type. + } + + U = terms[0].Type().Underlying() + var identical int // i in [0,identical) => Identical(U, terms[i].Type().Underlying()) + for identical = 1; identical < len(terms); identical++ { + if !types.Identical(U, terms[identical].Type().Underlying()) { + break + } + } + + if identical == len(terms) { + // https://go.dev/ref/spec#Core_types + // "There is a single type U which is the underlying type of all types in the type set of T" + return U + } + ch, ok := U.(*types.Chan) + if !ok { + return nil // no core type as identical < len(terms) and U is not a channel. + } + // https://go.dev/ref/spec#Core_types + // "the type chan E if T contains only bidirectional channels, or the type chan<- E or + // <-chan E depending on the direction of the directional channels present." + for chans := identical; chans < len(terms); chans++ { + curr, ok := terms[chans].Type().Underlying().(*types.Chan) + if !ok { + return nil + } + if !types.Identical(ch.Elem(), curr.Elem()) { + return nil // channel elements are not identical. + } + if ch.Dir() == types.SendRecv { + // ch is bidirectional. We can safely always use curr's direction. + ch = curr + } else if curr.Dir() != types.SendRecv && ch.Dir() != curr.Dir() { + // ch and curr are not bidirectional and not the same direction. + return nil + } + } + return ch +} + +// _NormalTerms returns a slice of terms representing the normalized structural +// type restrictions of a type, if any. +// +// For all types other than *types.TypeParam, *types.Interface, and +// *types.Union, this is just a single term with Tilde() == false and +// Type() == typ. For *types.TypeParam, *types.Interface, and *types.Union, see +// below. +// +// Structural type restrictions of a type parameter are created via +// non-interface types embedded in its constraint interface (directly, or via a +// chain of interface embeddings). For example, in the declaration type +// T[P interface{~int; m()}] int the structural restriction of the type +// parameter P is ~int. +// +// With interface embedding and unions, the specification of structural type +// restrictions may be arbitrarily complex. For example, consider the +// following: +// +// type A interface{ ~string|~[]byte } +// +// type B interface{ int|string } +// +// type C interface { ~string|~int } +// +// type T[P interface{ A|B; C }] int +// +// In this example, the structural type restriction of P is ~string|int: A|B +// expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, +// which when intersected with C (~string|~int) yields ~string|int. +// +// _NormalTerms computes these expansions and reductions, producing a +// "normalized" form of the embeddings. A structural restriction is normalized +// if it is a single union containing no interface terms, and is minimal in the +// sense that removing any term changes the set of types satisfying the +// constraint. It is left as a proof for the reader that, modulo sorting, there +// is exactly one such normalized form. +// +// Because the minimal representation always takes this form, _NormalTerms +// returns a slice of tilde terms corresponding to the terms of the union in +// the normalized structural restriction. An error is returned if the type is +// invalid, exceeds complexity bounds, or has an empty type set. In the latter +// case, _NormalTerms returns ErrEmptyTypeSet. +// +// _NormalTerms makes no guarantees about the order of terms, except that it +// is deterministic. +func _NormalTerms(typ types.Type) ([]*Term, error) { + switch typ := typ.(type) { + case *TypeParam: + return StructuralTerms(typ) + case *Union: + return UnionTermSet(typ) + case *types.Interface: + return InterfaceTermSet(typ) + default: + return []*Term{NewTerm(false, typ)}, nil + } +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go b/vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go new file mode 100644 index 00000000..18212390 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/enabled_go117.go @@ -0,0 +1,12 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.18 +// +build !go1.18 + +package typeparams + +// Enabled reports whether type parameters are enabled in the current build +// environment. +const Enabled = false diff --git a/vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go b/vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go new file mode 100644 index 00000000..d6714882 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/enabled_go118.go @@ -0,0 +1,15 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.18 +// +build go1.18 + +package typeparams + +// Note: this constant is in a separate file as this is the only acceptable +// diff between the <1.18 API of this package and the 1.18 API. + +// Enabled reports whether type parameters are enabled in the current build +// environment. +const Enabled = true diff --git a/vendor/golang.org/x/tools/internal/typeparams/normalize.go b/vendor/golang.org/x/tools/internal/typeparams/normalize.go new file mode 100644 index 00000000..9c631b65 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/normalize.go @@ -0,0 +1,218 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typeparams + +import ( + "errors" + "fmt" + "go/types" + "os" + "strings" +) + +//go:generate go run copytermlist.go + +const debug = false + +var ErrEmptyTypeSet = errors.New("empty type set") + +// StructuralTerms returns a slice of terms representing the normalized +// structural type restrictions of a type parameter, if any. +// +// Structural type restrictions of a type parameter are created via +// non-interface types embedded in its constraint interface (directly, or via a +// chain of interface embeddings). For example, in the declaration +// +// type T[P interface{~int; m()}] int +// +// the structural restriction of the type parameter P is ~int. +// +// With interface embedding and unions, the specification of structural type +// restrictions may be arbitrarily complex. For example, consider the +// following: +// +// type A interface{ ~string|~[]byte } +// +// type B interface{ int|string } +// +// type C interface { ~string|~int } +// +// type T[P interface{ A|B; C }] int +// +// In this example, the structural type restriction of P is ~string|int: A|B +// expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, +// which when intersected with C (~string|~int) yields ~string|int. +// +// StructuralTerms computes these expansions and reductions, producing a +// "normalized" form of the embeddings. A structural restriction is normalized +// if it is a single union containing no interface terms, and is minimal in the +// sense that removing any term changes the set of types satisfying the +// constraint. It is left as a proof for the reader that, modulo sorting, there +// is exactly one such normalized form. +// +// Because the minimal representation always takes this form, StructuralTerms +// returns a slice of tilde terms corresponding to the terms of the union in +// the normalized structural restriction. An error is returned if the +// constraint interface is invalid, exceeds complexity bounds, or has an empty +// type set. In the latter case, StructuralTerms returns ErrEmptyTypeSet. +// +// StructuralTerms makes no guarantees about the order of terms, except that it +// is deterministic. +func StructuralTerms(tparam *TypeParam) ([]*Term, error) { + constraint := tparam.Constraint() + if constraint == nil { + return nil, fmt.Errorf("%s has nil constraint", tparam) + } + iface, _ := constraint.Underlying().(*types.Interface) + if iface == nil { + return nil, fmt.Errorf("constraint is %T, not *types.Interface", constraint.Underlying()) + } + return InterfaceTermSet(iface) +} + +// InterfaceTermSet computes the normalized terms for a constraint interface, +// returning an error if the term set cannot be computed or is empty. In the +// latter case, the error will be ErrEmptyTypeSet. +// +// See the documentation of StructuralTerms for more information on +// normalization. +func InterfaceTermSet(iface *types.Interface) ([]*Term, error) { + return computeTermSet(iface) +} + +// UnionTermSet computes the normalized terms for a union, returning an error +// if the term set cannot be computed or is empty. In the latter case, the +// error will be ErrEmptyTypeSet. +// +// See the documentation of StructuralTerms for more information on +// normalization. +func UnionTermSet(union *Union) ([]*Term, error) { + return computeTermSet(union) +} + +func computeTermSet(typ types.Type) ([]*Term, error) { + tset, err := computeTermSetInternal(typ, make(map[types.Type]*termSet), 0) + if err != nil { + return nil, err + } + if tset.terms.isEmpty() { + return nil, ErrEmptyTypeSet + } + if tset.terms.isAll() { + return nil, nil + } + var terms []*Term + for _, term := range tset.terms { + terms = append(terms, NewTerm(term.tilde, term.typ)) + } + return terms, nil +} + +// A termSet holds the normalized set of terms for a given type. +// +// The name termSet is intentionally distinct from 'type set': a type set is +// all types that implement a type (and includes method restrictions), whereas +// a term set just represents the structural restrictions on a type. +type termSet struct { + complete bool + terms termlist +} + +func indentf(depth int, format string, args ...interface{}) { + fmt.Fprintf(os.Stderr, strings.Repeat(".", depth)+format+"\n", args...) +} + +func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth int) (res *termSet, err error) { + if t == nil { + panic("nil type") + } + + if debug { + indentf(depth, "%s", t.String()) + defer func() { + if err != nil { + indentf(depth, "=> %s", err) + } else { + indentf(depth, "=> %s", res.terms.String()) + } + }() + } + + const maxTermCount = 100 + if tset, ok := seen[t]; ok { + if !tset.complete { + return nil, fmt.Errorf("cycle detected in the declaration of %s", t) + } + return tset, nil + } + + // Mark the current type as seen to avoid infinite recursion. + tset := new(termSet) + defer func() { + tset.complete = true + }() + seen[t] = tset + + switch u := t.Underlying().(type) { + case *types.Interface: + // The term set of an interface is the intersection of the term sets of its + // embedded types. + tset.terms = allTermlist + for i := 0; i < u.NumEmbeddeds(); i++ { + embedded := u.EmbeddedType(i) + if _, ok := embedded.Underlying().(*TypeParam); ok { + return nil, fmt.Errorf("invalid embedded type %T", embedded) + } + tset2, err := computeTermSetInternal(embedded, seen, depth+1) + if err != nil { + return nil, err + } + tset.terms = tset.terms.intersect(tset2.terms) + } + case *Union: + // The term set of a union is the union of term sets of its terms. + tset.terms = nil + for i := 0; i < u.Len(); i++ { + t := u.Term(i) + var terms termlist + switch t.Type().Underlying().(type) { + case *types.Interface: + tset2, err := computeTermSetInternal(t.Type(), seen, depth+1) + if err != nil { + return nil, err + } + terms = tset2.terms + case *TypeParam, *Union: + // A stand-alone type parameter or union is not permitted as union + // term. + return nil, fmt.Errorf("invalid union term %T", t) + default: + if t.Type() == types.Typ[types.Invalid] { + continue + } + terms = termlist{{t.Tilde(), t.Type()}} + } + tset.terms = tset.terms.union(terms) + if len(tset.terms) > maxTermCount { + return nil, fmt.Errorf("exceeded max term count %d", maxTermCount) + } + } + case *TypeParam: + panic("unreachable") + default: + // For all other types, the term set is just a single non-tilde term + // holding the type itself. + if u != types.Typ[types.Invalid] { + tset.terms = termlist{{false, t}} + } + } + return tset, nil +} + +// under is a facade for the go/types internal function of the same name. It is +// used by typeterm.go. +func under(t types.Type) types.Type { + return t.Underlying() +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/termlist.go b/vendor/golang.org/x/tools/internal/typeparams/termlist.go new file mode 100644 index 00000000..933106a2 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/termlist.go @@ -0,0 +1,163 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by copytermlist.go DO NOT EDIT. + +package typeparams + +import ( + "bytes" + "go/types" +) + +// A termlist represents the type set represented by the union +// t1 ∪ y2 ∪ ... tn of the type sets of the terms t1 to tn. +// A termlist is in normal form if all terms are disjoint. +// termlist operations don't require the operands to be in +// normal form. +type termlist []*term + +// allTermlist represents the set of all types. +// It is in normal form. +var allTermlist = termlist{new(term)} + +// String prints the termlist exactly (without normalization). +func (xl termlist) String() string { + if len(xl) == 0 { + return "∅" + } + var buf bytes.Buffer + for i, x := range xl { + if i > 0 { + buf.WriteString(" ∪ ") + } + buf.WriteString(x.String()) + } + return buf.String() +} + +// isEmpty reports whether the termlist xl represents the empty set of types. +func (xl termlist) isEmpty() bool { + // If there's a non-nil term, the entire list is not empty. + // If the termlist is in normal form, this requires at most + // one iteration. + for _, x := range xl { + if x != nil { + return false + } + } + return true +} + +// isAll reports whether the termlist xl represents the set of all types. +func (xl termlist) isAll() bool { + // If there's a 𝓤 term, the entire list is 𝓤. + // If the termlist is in normal form, this requires at most + // one iteration. + for _, x := range xl { + if x != nil && x.typ == nil { + return true + } + } + return false +} + +// norm returns the normal form of xl. +func (xl termlist) norm() termlist { + // Quadratic algorithm, but good enough for now. + // TODO(gri) fix asymptotic performance + used := make([]bool, len(xl)) + var rl termlist + for i, xi := range xl { + if xi == nil || used[i] { + continue + } + for j := i + 1; j < len(xl); j++ { + xj := xl[j] + if xj == nil || used[j] { + continue + } + if u1, u2 := xi.union(xj); u2 == nil { + // If we encounter a 𝓤 term, the entire list is 𝓤. + // Exit early. + // (Note that this is not just an optimization; + // if we continue, we may end up with a 𝓤 term + // and other terms and the result would not be + // in normal form.) + if u1.typ == nil { + return allTermlist + } + xi = u1 + used[j] = true // xj is now unioned into xi - ignore it in future iterations + } + } + rl = append(rl, xi) + } + return rl +} + +// union returns the union xl ∪ yl. +func (xl termlist) union(yl termlist) termlist { + return append(xl, yl...).norm() +} + +// intersect returns the intersection xl ∩ yl. +func (xl termlist) intersect(yl termlist) termlist { + if xl.isEmpty() || yl.isEmpty() { + return nil + } + + // Quadratic algorithm, but good enough for now. + // TODO(gri) fix asymptotic performance + var rl termlist + for _, x := range xl { + for _, y := range yl { + if r := x.intersect(y); r != nil { + rl = append(rl, r) + } + } + } + return rl.norm() +} + +// equal reports whether xl and yl represent the same type set. +func (xl termlist) equal(yl termlist) bool { + // TODO(gri) this should be more efficient + return xl.subsetOf(yl) && yl.subsetOf(xl) +} + +// includes reports whether t ∈ xl. +func (xl termlist) includes(t types.Type) bool { + for _, x := range xl { + if x.includes(t) { + return true + } + } + return false +} + +// supersetOf reports whether y ⊆ xl. +func (xl termlist) supersetOf(y *term) bool { + for _, x := range xl { + if y.subsetOf(x) { + return true + } + } + return false +} + +// subsetOf reports whether xl ⊆ yl. +func (xl termlist) subsetOf(yl termlist) bool { + if yl.isEmpty() { + return xl.isEmpty() + } + + // each term x of xl must be a subset of yl + for _, x := range xl { + if !yl.supersetOf(x) { + return false // x is not a subset yl + } + } + return true +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go b/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go new file mode 100644 index 00000000..7ed86e17 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/typeparams_go117.go @@ -0,0 +1,197 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.18 +// +build !go1.18 + +package typeparams + +import ( + "go/ast" + "go/token" + "go/types" +) + +func unsupported() { + panic("type parameters are unsupported at this go version") +} + +// IndexListExpr is a placeholder type, as type parameters are not supported at +// this Go version. Its methods panic on use. +type IndexListExpr struct { + ast.Expr + X ast.Expr // expression + Lbrack token.Pos // position of "[" + Indices []ast.Expr // index expressions + Rbrack token.Pos // position of "]" +} + +// ForTypeSpec returns an empty field list, as type parameters on not supported +// at this Go version. +func ForTypeSpec(*ast.TypeSpec) *ast.FieldList { + return nil +} + +// ForFuncType returns an empty field list, as type parameters are not +// supported at this Go version. +func ForFuncType(*ast.FuncType) *ast.FieldList { + return nil +} + +// TypeParam is a placeholder type, as type parameters are not supported at +// this Go version. Its methods panic on use. +type TypeParam struct{ types.Type } + +func (*TypeParam) Index() int { unsupported(); return 0 } +func (*TypeParam) Constraint() types.Type { unsupported(); return nil } +func (*TypeParam) Obj() *types.TypeName { unsupported(); return nil } + +// TypeParamList is a placeholder for an empty type parameter list. +type TypeParamList struct{} + +func (*TypeParamList) Len() int { return 0 } +func (*TypeParamList) At(int) *TypeParam { unsupported(); return nil } + +// TypeList is a placeholder for an empty type list. +type TypeList struct{} + +func (*TypeList) Len() int { return 0 } +func (*TypeList) At(int) types.Type { unsupported(); return nil } + +// NewTypeParam is unsupported at this Go version, and panics. +func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { + unsupported() + return nil +} + +// SetTypeParamConstraint is unsupported at this Go version, and panics. +func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { + unsupported() +} + +// NewSignatureType calls types.NewSignature, panicking if recvTypeParams or +// typeParams is non-empty. +func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { + if len(recvTypeParams) != 0 || len(typeParams) != 0 { + panic("signatures cannot have type parameters at this Go version") + } + return types.NewSignature(recv, params, results, variadic) +} + +// ForSignature returns an empty slice. +func ForSignature(*types.Signature) *TypeParamList { + return nil +} + +// RecvTypeParams returns a nil slice. +func RecvTypeParams(sig *types.Signature) *TypeParamList { + return nil +} + +// IsComparable returns false, as no interfaces are type-restricted at this Go +// version. +func IsComparable(*types.Interface) bool { + return false +} + +// IsMethodSet returns true, as no interfaces are type-restricted at this Go +// version. +func IsMethodSet(*types.Interface) bool { + return true +} + +// IsImplicit returns false, as no interfaces are implicit at this Go version. +func IsImplicit(*types.Interface) bool { + return false +} + +// MarkImplicit does nothing, because this Go version does not have implicit +// interfaces. +func MarkImplicit(*types.Interface) {} + +// ForNamed returns an empty type parameter list, as type parameters are not +// supported at this Go version. +func ForNamed(*types.Named) *TypeParamList { + return nil +} + +// SetForNamed panics if tparams is non-empty. +func SetForNamed(_ *types.Named, tparams []*TypeParam) { + if len(tparams) > 0 { + unsupported() + } +} + +// NamedTypeArgs returns nil. +func NamedTypeArgs(*types.Named) *TypeList { + return nil +} + +// NamedTypeOrigin is the identity method at this Go version. +func NamedTypeOrigin(named *types.Named) *types.Named { + return named +} + +// Term holds information about a structural type restriction. +type Term struct { + tilde bool + typ types.Type +} + +func (m *Term) Tilde() bool { return m.tilde } +func (m *Term) Type() types.Type { return m.typ } +func (m *Term) String() string { + pre := "" + if m.tilde { + pre = "~" + } + return pre + m.typ.String() +} + +// NewTerm is unsupported at this Go version, and panics. +func NewTerm(tilde bool, typ types.Type) *Term { + return &Term{tilde, typ} +} + +// Union is a placeholder type, as type parameters are not supported at this Go +// version. Its methods panic on use. +type Union struct{ types.Type } + +func (*Union) Len() int { return 0 } +func (*Union) Term(i int) *Term { unsupported(); return nil } + +// NewUnion is unsupported at this Go version, and panics. +func NewUnion(terms []*Term) *Union { + unsupported() + return nil +} + +// InitInstanceInfo is a noop at this Go version. +func InitInstanceInfo(*types.Info) {} + +// Instance is a placeholder type, as type parameters are not supported at this +// Go version. +type Instance struct { + TypeArgs *TypeList + Type types.Type +} + +// GetInstances returns a nil map, as type parameters are not supported at this +// Go version. +func GetInstances(info *types.Info) map[*ast.Ident]Instance { return nil } + +// Context is a placeholder type, as type parameters are not supported at +// this Go version. +type Context struct{} + +// NewContext returns a placeholder Context instance. +func NewContext() *Context { + return &Context{} +} + +// Instantiate is unsupported on this Go version, and panics. +func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { + unsupported() + return nil, nil +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go b/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go new file mode 100644 index 00000000..cf301af1 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/typeparams_go118.go @@ -0,0 +1,151 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.18 +// +build go1.18 + +package typeparams + +import ( + "go/ast" + "go/types" +) + +// IndexListExpr is an alias for ast.IndexListExpr. +type IndexListExpr = ast.IndexListExpr + +// ForTypeSpec returns n.TypeParams. +func ForTypeSpec(n *ast.TypeSpec) *ast.FieldList { + if n == nil { + return nil + } + return n.TypeParams +} + +// ForFuncType returns n.TypeParams. +func ForFuncType(n *ast.FuncType) *ast.FieldList { + if n == nil { + return nil + } + return n.TypeParams +} + +// TypeParam is an alias for types.TypeParam +type TypeParam = types.TypeParam + +// TypeParamList is an alias for types.TypeParamList +type TypeParamList = types.TypeParamList + +// TypeList is an alias for types.TypeList +type TypeList = types.TypeList + +// NewTypeParam calls types.NewTypeParam. +func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { + return types.NewTypeParam(name, constraint) +} + +// SetTypeParamConstraint calls tparam.SetConstraint(constraint). +func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { + tparam.SetConstraint(constraint) +} + +// NewSignatureType calls types.NewSignatureType. +func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { + return types.NewSignatureType(recv, recvTypeParams, typeParams, params, results, variadic) +} + +// ForSignature returns sig.TypeParams() +func ForSignature(sig *types.Signature) *TypeParamList { + return sig.TypeParams() +} + +// RecvTypeParams returns sig.RecvTypeParams(). +func RecvTypeParams(sig *types.Signature) *TypeParamList { + return sig.RecvTypeParams() +} + +// IsComparable calls iface.IsComparable(). +func IsComparable(iface *types.Interface) bool { + return iface.IsComparable() +} + +// IsMethodSet calls iface.IsMethodSet(). +func IsMethodSet(iface *types.Interface) bool { + return iface.IsMethodSet() +} + +// IsImplicit calls iface.IsImplicit(). +func IsImplicit(iface *types.Interface) bool { + return iface.IsImplicit() +} + +// MarkImplicit calls iface.MarkImplicit(). +func MarkImplicit(iface *types.Interface) { + iface.MarkImplicit() +} + +// ForNamed extracts the (possibly empty) type parameter object list from +// named. +func ForNamed(named *types.Named) *TypeParamList { + return named.TypeParams() +} + +// SetForNamed sets the type params tparams on n. Each tparam must be of +// dynamic type *types.TypeParam. +func SetForNamed(n *types.Named, tparams []*TypeParam) { + n.SetTypeParams(tparams) +} + +// NamedTypeArgs returns named.TypeArgs(). +func NamedTypeArgs(named *types.Named) *TypeList { + return named.TypeArgs() +} + +// NamedTypeOrigin returns named.Orig(). +func NamedTypeOrigin(named *types.Named) *types.Named { + return named.Origin() +} + +// Term is an alias for types.Term. +type Term = types.Term + +// NewTerm calls types.NewTerm. +func NewTerm(tilde bool, typ types.Type) *Term { + return types.NewTerm(tilde, typ) +} + +// Union is an alias for types.Union +type Union = types.Union + +// NewUnion calls types.NewUnion. +func NewUnion(terms []*Term) *Union { + return types.NewUnion(terms) +} + +// InitInstanceInfo initializes info to record information about type and +// function instances. +func InitInstanceInfo(info *types.Info) { + info.Instances = make(map[*ast.Ident]types.Instance) +} + +// Instance is an alias for types.Instance. +type Instance = types.Instance + +// GetInstances returns info.Instances. +func GetInstances(info *types.Info) map[*ast.Ident]Instance { + return info.Instances +} + +// Context is an alias for types.Context. +type Context = types.Context + +// NewContext calls types.NewContext. +func NewContext() *Context { + return types.NewContext() +} + +// Instantiate calls types.Instantiate. +func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { + return types.Instantiate(ctxt, typ, targs, validate) +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/typeterm.go b/vendor/golang.org/x/tools/internal/typeparams/typeterm.go new file mode 100644 index 00000000..7ddee28d --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typeparams/typeterm.go @@ -0,0 +1,170 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by copytermlist.go DO NOT EDIT. + +package typeparams + +import "go/types" + +// A term describes elementary type sets: +// +// ∅: (*term)(nil) == ∅ // set of no types (empty set) +// 𝓤: &term{} == 𝓤 // set of all types (𝓤niverse) +// T: &term{false, T} == {T} // set of type T +// ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t +// +type term struct { + tilde bool // valid if typ != nil + typ types.Type +} + +func (x *term) String() string { + switch { + case x == nil: + return "∅" + case x.typ == nil: + return "𝓤" + case x.tilde: + return "~" + x.typ.String() + default: + return x.typ.String() + } +} + +// equal reports whether x and y represent the same type set. +func (x *term) equal(y *term) bool { + // easy cases + switch { + case x == nil || y == nil: + return x == y + case x.typ == nil || y.typ == nil: + return x.typ == y.typ + } + // ∅ ⊂ x, y ⊂ 𝓤 + + return x.tilde == y.tilde && types.Identical(x.typ, y.typ) +} + +// union returns the union x ∪ y: zero, one, or two non-nil terms. +func (x *term) union(y *term) (_, _ *term) { + // easy cases + switch { + case x == nil && y == nil: + return nil, nil // ∅ ∪ ∅ == ∅ + case x == nil: + return y, nil // ∅ ∪ y == y + case y == nil: + return x, nil // x ∪ ∅ == x + case x.typ == nil: + return x, nil // 𝓤 ∪ y == 𝓤 + case y.typ == nil: + return y, nil // x ∪ 𝓤 == 𝓤 + } + // ∅ ⊂ x, y ⊂ 𝓤 + + if x.disjoint(y) { + return x, y // x ∪ y == (x, y) if x ∩ y == ∅ + } + // x.typ == y.typ + + // ~t ∪ ~t == ~t + // ~t ∪ T == ~t + // T ∪ ~t == ~t + // T ∪ T == T + if x.tilde || !y.tilde { + return x, nil + } + return y, nil +} + +// intersect returns the intersection x ∩ y. +func (x *term) intersect(y *term) *term { + // easy cases + switch { + case x == nil || y == nil: + return nil // ∅ ∩ y == ∅ and ∩ ∅ == ∅ + case x.typ == nil: + return y // 𝓤 ∩ y == y + case y.typ == nil: + return x // x ∩ 𝓤 == x + } + // ∅ ⊂ x, y ⊂ 𝓤 + + if x.disjoint(y) { + return nil // x ∩ y == ∅ if x ∩ y == ∅ + } + // x.typ == y.typ + + // ~t ∩ ~t == ~t + // ~t ∩ T == T + // T ∩ ~t == T + // T ∩ T == T + if !x.tilde || y.tilde { + return x + } + return y +} + +// includes reports whether t ∈ x. +func (x *term) includes(t types.Type) bool { + // easy cases + switch { + case x == nil: + return false // t ∈ ∅ == false + case x.typ == nil: + return true // t ∈ 𝓤 == true + } + // ∅ ⊂ x ⊂ 𝓤 + + u := t + if x.tilde { + u = under(u) + } + return types.Identical(x.typ, u) +} + +// subsetOf reports whether x ⊆ y. +func (x *term) subsetOf(y *term) bool { + // easy cases + switch { + case x == nil: + return true // ∅ ⊆ y == true + case y == nil: + return false // x ⊆ ∅ == false since x != ∅ + case y.typ == nil: + return true // x ⊆ 𝓤 == true + case x.typ == nil: + return false // 𝓤 ⊆ y == false since y != 𝓤 + } + // ∅ ⊂ x, y ⊂ 𝓤 + + if x.disjoint(y) { + return false // x ⊆ y == false if x ∩ y == ∅ + } + // x.typ == y.typ + + // ~t ⊆ ~t == true + // ~t ⊆ T == false + // T ⊆ ~t == true + // T ⊆ T == true + return !x.tilde || y.tilde +} + +// disjoint reports whether x ∩ y == ∅. +// x.typ and y.typ must not be nil. +func (x *term) disjoint(y *term) bool { + if debug && (x.typ == nil || y.typ == nil) { + panic("invalid argument(s)") + } + ux := x.typ + if y.tilde { + ux = under(ux) + } + uy := y.typ + if x.tilde { + uy = under(uy) + } + return !types.Identical(ux, uy) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 50c982a9..78eb98f0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -5,14 +5,14 @@ github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1 # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew -# github.com/emicklei/go-restful/v3 v3.10.1 +# github.com/emicklei/go-restful/v3 v3.11.0 ## explicit; go 1.13 github.com/emicklei/go-restful/v3 github.com/emicklei/go-restful/v3/log # github.com/evanphx/json-patch v4.12.0+incompatible ## explicit github.com/evanphx/json-patch -# github.com/fsnotify/fsnotify v1.5.4 +# github.com/fsnotify/fsnotify v1.6.0 ## explicit; go 1.16 github.com/fsnotify/fsnotify # github.com/go-kit/kit v0.9.0 @@ -21,21 +21,24 @@ github.com/go-kit/kit/log # github.com/go-logfmt/logfmt v0.5.0 ## explicit; go 1.13 github.com/go-logfmt/logfmt -# github.com/go-logr/logr v1.2.3 +# github.com/go-logr/logr v1.2.4 ## explicit; go 1.16 github.com/go-logr/logr github.com/go-logr/logr/funcr +# github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 +## explicit; go 1.13 +github.com/go-task/slim-sprig # github.com/gogo/protobuf v1.3.2 ## explicit; go 1.15 github.com/gogo/protobuf/proto github.com/gogo/protobuf/sortkeys -# github.com/golang-jwt/jwt/v4 v4.4.3 +# github.com/golang-jwt/jwt/v4 v4.5.0 ## explicit; go 1.16 github.com/golang-jwt/jwt/v4 # github.com/golang/glog v1.0.0 ## explicit; go 1.11 github.com/golang/glog -# github.com/golang/mock v1.5.0 +# github.com/golang/mock v1.6.0 ## explicit; go 1.11 github.com/golang/mock/gomock # github.com/golang/protobuf v1.5.3 @@ -55,6 +58,9 @@ github.com/google/go-cmp/cmp/internal/value # github.com/google/gofuzz v1.1.0 ## explicit; go 1.12 github.com/google/gofuzz +# github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 +## explicit; go 1.14 +github.com/google/pprof/profile # github.com/google/uuid v1.1.2 ## explicit github.com/google/uuid @@ -90,11 +96,21 @@ github.com/modern-go/concurrent # github.com/modern-go/reflect2 v1.0.2 ## explicit; go 1.12 github.com/modern-go/reflect2 -# github.com/onsi/ginkgo/v2 v2.6.1 +# github.com/onsi/ginkgo/v2 v2.12.1 ## explicit; go 1.18 github.com/onsi/ginkgo/v2 github.com/onsi/ginkgo/v2/config github.com/onsi/ginkgo/v2/formatter +github.com/onsi/ginkgo/v2/ginkgo +github.com/onsi/ginkgo/v2/ginkgo/build +github.com/onsi/ginkgo/v2/ginkgo/command +github.com/onsi/ginkgo/v2/ginkgo/generators +github.com/onsi/ginkgo/v2/ginkgo/internal +github.com/onsi/ginkgo/v2/ginkgo/labels +github.com/onsi/ginkgo/v2/ginkgo/outline +github.com/onsi/ginkgo/v2/ginkgo/run +github.com/onsi/ginkgo/v2/ginkgo/unfocus +github.com/onsi/ginkgo/v2/ginkgo/watch github.com/onsi/ginkgo/v2/internal github.com/onsi/ginkgo/v2/internal/global github.com/onsi/ginkgo/v2/internal/interrupt_handler @@ -102,7 +118,7 @@ github.com/onsi/ginkgo/v2/internal/parallel_support github.com/onsi/ginkgo/v2/internal/testingtproxy github.com/onsi/ginkgo/v2/reporters github.com/onsi/ginkgo/v2/types -# github.com/onsi/gomega v1.24.2 +# github.com/onsi/gomega v1.28.0 ## explicit; go 1.18 github.com/onsi/gomega github.com/onsi/gomega/format @@ -187,6 +203,10 @@ golang.org/x/text/unicode/norm # golang.org/x/time v0.3.0 ## explicit golang.org/x/time/rate +# golang.org/x/tools v0.12.0 +## explicit; go 1.18 +golang.org/x/tools/go/ast/inspector +golang.org/x/tools/internal/typeparams # google.golang.org/appengine v1.6.7 ## explicit; go 1.11 google.golang.org/appengine/internal From 4550299c0f26e5dd0b475e07550cdb9fbf4dde35 Mon Sep 17 00:00:00 2001 From: Andrej Krejcir Date: Fri, 6 Oct 2023 11:23:21 +0200 Subject: [PATCH 3/3] chore: Update kubernetes and kubevirt dependencies kubevirt.io/client-go module was updated to the latest commit in main branch, because it contains needed changes. When a new version of kubevirt.io/client-go is released, we will update go.mod file Signed-off-by: Andrej Krejcir --- go.mod | 72 +- go.sum | 996 +- pkg/console/service/service.go | 2 +- pkg/console/service/service_test.go | 4 +- tests/proxy_test.go | 13 +- .../coreos/prometheus-operator/NOTICE | 5 - .../pkg/apis/monitoring/v1/bindata.go | 363 - .../pkg/apis/monitoring/v1/crd_kinds.go | 91 - .../pkg/apis/monitoring/v1/types.go | 1112 --- .../monitoring/v1/zz_generated.deepcopy.go | 1600 --- vendor/github.com/evanphx/json-patch/patch.go | 42 - vendor/github.com/go-kit/kit/log/README.md | 9 + vendor/github.com/go-kit/kit/log/doc.go | 6 +- .../github.com/go-kit/kit/log/json_logger.go | 80 +- vendor/github.com/go-kit/kit/log/log.go | 120 +- .../go-kit/kit/log/logfmt_logger.go | 51 +- .../github.com/go-kit/kit/log/nop_logger.go | 8 +- vendor/github.com/go-kit/kit/log/stdlib.go | 100 +- vendor/github.com/go-kit/kit/log/sync.go | 89 +- vendor/github.com/go-kit/kit/log/value.go | 82 +- vendor/github.com/go-kit/log/.gitignore | 15 + vendor/github.com/go-kit/log/LICENSE | 21 + vendor/github.com/go-kit/log/README.md | 156 + vendor/github.com/go-kit/log/doc.go | 116 + vendor/github.com/go-kit/log/json_logger.go | 91 + vendor/github.com/go-kit/log/log.go | 179 + vendor/github.com/go-kit/log/logfmt_logger.go | 62 + vendor/github.com/go-kit/log/nop_logger.go | 8 + vendor/github.com/go-kit/log/staticcheck.conf | 1 + vendor/github.com/go-kit/log/stdlib.go | 151 + vendor/github.com/go-kit/log/sync.go | 113 + vendor/github.com/go-kit/log/value.go | 110 + .../github.com/go-logfmt/logfmt/.travis.yml | 18 - .../github.com/go-logfmt/logfmt/CHANGELOG.md | 46 +- vendor/github.com/go-logfmt/logfmt/README.md | 74 +- vendor/github.com/go-logfmt/logfmt/decode.go | 17 + .../go-openapi/jsonpointer/.editorconfig | 26 + .../go-openapi/jsonpointer/.gitignore | 1 + .../go-openapi/jsonpointer/CODE_OF_CONDUCT.md | 74 + .../github.com/go-openapi/jsonpointer/LICENSE | 202 + .../go-openapi/jsonpointer/README.md | 15 + .../go-openapi/jsonpointer/pointer.go | 511 + .../go-openapi/jsonreference/.gitignore | 1 + .../go-openapi/jsonreference/.golangci.yml | 50 + .../jsonreference/CODE_OF_CONDUCT.md | 74 + .../go-openapi/jsonreference/LICENSE | 202 + .../go-openapi/jsonreference/README.md | 15 + .../jsonreference/internal/normalize_url.go | 69 + .../go-openapi/jsonreference/reference.go | 158 + .../github.com/go-openapi/swag/.editorconfig | 26 + .../github.com/go-openapi/swag/.gitattributes | 2 + vendor/github.com/go-openapi/swag/.gitignore | 4 + .../github.com/go-openapi/swag/.golangci.yml | 54 + .../go-openapi/swag/CODE_OF_CONDUCT.md | 74 + vendor/github.com/go-openapi/swag/LICENSE | 202 + vendor/github.com/go-openapi/swag/README.md | 21 + vendor/github.com/go-openapi/swag/convert.go | 208 + .../go-openapi/swag/convert_types.go | 730 ++ vendor/github.com/go-openapi/swag/doc.go | 31 + vendor/github.com/go-openapi/swag/file.go | 33 + vendor/github.com/go-openapi/swag/json.go | 312 + vendor/github.com/go-openapi/swag/loading.go | 121 + .../github.com/go-openapi/swag/name_lexem.go | 87 + vendor/github.com/go-openapi/swag/net.go | 38 + vendor/github.com/go-openapi/swag/path.go | 59 + .../github.com/go-openapi/swag/post_go18.go | 24 + .../github.com/go-openapi/swag/post_go19.go | 68 + vendor/github.com/go-openapi/swag/pre_go18.go | 24 + vendor/github.com/go-openapi/swag/pre_go19.go | 70 + vendor/github.com/go-openapi/swag/split.go | 262 + vendor/github.com/go-openapi/swag/util.go | 394 + vendor/github.com/go-openapi/swag/yaml.go | 450 + vendor/github.com/golang/glog/glog.go | 1217 +-- vendor/github.com/golang/glog/glog_file.go | 305 +- vendor/github.com/golang/glog/glog_flags.go | 395 + .../golang/glog/internal/logsink/logsink.go | 387 + .../glog/internal/logsink/logsink_fatal.go | 35 + .../glog/internal/stackdump/stackdump.go | 127 + .../{googleapis => google}/gnostic/LICENSE | 0 .../gnostic/compiler/README.md | 0 .../gnostic/compiler/context.go | 0 .../gnostic/compiler/error.go | 0 .../gnostic/compiler/extensions.go | 3 +- .../gnostic/compiler/helpers.go | 3 +- .../gnostic/compiler/main.go | 0 .../gnostic/compiler/reader.go | 0 .../gnostic/extensions/README.md | 0 .../gnostic/extensions/extension.pb.go | 2 +- .../gnostic/extensions/extension.proto | 0 .../gnostic/extensions/extensions.go | 0 .../gnostic/jsonschema/README.md | 0 .../gnostic/jsonschema/base.go | 0 .../gnostic/jsonschema/display.go | 0 .../gnostic/jsonschema/models.go | 0 .../gnostic/jsonschema/operations.go | 0 .../gnostic/jsonschema/reader.go | 0 .../gnostic/jsonschema/schema.json | 0 .../gnostic/jsonschema/writer.go | 0 .../gnostic/openapiv2/OpenAPIv2.go | 6 +- .../gnostic/openapiv2/OpenAPIv2.pb.go | 2 +- .../gnostic/openapiv2/OpenAPIv2.proto | 0 .../gnostic/openapiv2/README.md | 0 .../gnostic/openapiv2/document.go | 3 +- .../gnostic/openapiv2/openapi-2.0.json | 0 .../google/gnostic/openapiv3/OpenAPIv3.go | 8633 +++++++++++++++++ .../google/gnostic/openapiv3/OpenAPIv3.pb.go | 8053 +++++++++++++++ .../google/gnostic/openapiv3/OpenAPIv3.proto | 672 ++ .../google/gnostic/openapiv3/README.md | 21 + .../google/gnostic/openapiv3/document.go | 42 + .../google/gnostic/openapiv3/openapi-3.0.json | 1251 +++ .../google/gnostic/openapiv3/openapi-3.1.json | 1250 +++ vendor/github.com/google/gofuzz/.travis.yml | 11 +- .../github.com/google/gofuzz/CONTRIBUTING.md | 2 +- vendor/github.com/google/gofuzz/README.md | 18 + .../google/gofuzz/bytesource/bytesource.go | 81 + vendor/github.com/google/gofuzz/fuzz.go | 137 +- vendor/github.com/google/uuid/.travis.yml | 9 - vendor/github.com/google/uuid/CHANGELOG.md | 10 + vendor/github.com/google/uuid/CONTRIBUTING.md | 16 + vendor/github.com/google/uuid/README.md | 10 +- vendor/github.com/google/uuid/hash.go | 4 +- vendor/github.com/google/uuid/node_js.go | 2 +- vendor/github.com/google/uuid/null.go | 118 + vendor/github.com/google/uuid/sql.go | 2 +- vendor/github.com/google/uuid/uuid.go | 65 +- vendor/github.com/google/uuid/version4.go | 35 +- vendor/github.com/imdario/mergo/.travis.yml | 3 + .../github.com/imdario/mergo/CONTRIBUTING.md | 112 + vendor/github.com/imdario/mergo/README.md | 72 +- vendor/github.com/imdario/mergo/SECURITY.md | 14 + vendor/github.com/imdario/mergo/map.go | 6 +- vendor/github.com/imdario/mergo/merge.go | 73 +- vendor/github.com/imdario/mergo/mergo.go | 15 +- vendor/github.com/josharian/intern/README.md | 5 + vendor/github.com/josharian/intern/intern.go | 44 + vendor/github.com/josharian/intern/license.md | 21 + vendor/github.com/mailru/easyjson/LICENSE | 7 + .../github.com/mailru/easyjson/buffer/pool.go | 278 + .../mailru/easyjson/jlexer/bytestostr.go | 24 + .../easyjson/jlexer/bytestostr_nounsafe.go | 13 + .../mailru/easyjson/jlexer/error.go | 15 + .../mailru/easyjson/jlexer/lexer.go | 1244 +++ .../mailru/easyjson/jwriter/writer.go | 405 + vendor/github.com/munnerz/goautoneg/LICENSE | 31 + vendor/github.com/munnerz/goautoneg/Makefile | 13 + .../github.com/munnerz/goautoneg/README.txt | 67 + .../github.com/munnerz/goautoneg/autoneg.go | 189 + ...01_clusterversion-CustomNoUpgrade.crd.yaml | 503 + ...erator_01_clusterversion-Default.crd.yaml} | 84 +- ...usterversion-TechPreviewNoUpgrade.crd.yaml | 503 + .../0000_03_config-operator_01_proxy.crd.yaml | 2 +- ...rketplace-operator_01_operatorhub.crd.yaml | 2 +- ...tor_01_apiserver-CustomNoUpgrade.crd.yaml} | 20 +- ...fig-operator_01_apiserver-Default.crd.yaml | 179 + ...01_apiserver-TechPreviewNoUpgrade.crd.yaml | 179 + ...01_authentication.crd-CustomNoUpgrade.yaml | 374 + ...thentication.crd-TechPreviewNoUpgrade.yaml | 374 + ...config-operator_01_authentication.crd.yaml | 6 +- ...g-operator_01_dns-CustomNoUpgrade.crd.yaml | 114 + ...0_config-operator_01_dns-Default.crd.yaml} | 42 + ...rator_01_dns-TechPreviewNoUpgrade.crd.yaml | 114 + ...10_config-operator_01_featuregate.crd.yaml | 90 + .../0000_10_config-operator_01_image.crd.yaml | 2 +- ...-operator_01_imagedigestmirrorset.crd.yaml | 74 + ...fig-operator_01_imagetagmirrorset.crd.yaml | 74 + ...01_infrastructure-CustomNoUpgrade.crd.yaml | 1194 +++ ...rastructure-CustomNoUpgrade.crd.yaml-patch | 24 + ...perator_01_infrastructure-Default.crd.yaml | 997 ++ ...r_01_infrastructure-Default.crd.yaml-patch | 24 + ...frastructure-TechPreviewNoUpgrade.crd.yaml | 1194 +++ ...ucture-TechPreviewNoUpgrade.crd.yaml-patch | 24 + ...config-operator_01_infrastructure.crd.yaml | 532 - ...000_10_config-operator_01_ingress.crd.yaml | 55 +- ...erator_01_network-CustomNoUpgrade.crd.yaml | 211 + ...nfig-operator_01_network-Default.crd.yaml} | 1 + ...r_01_network-TechPreviewNoUpgrade.crd.yaml | 211 + .../0000_10_config-operator_01_oauth.crd.yaml | 8 +- ...roller-manager-operator_01_build.crd.yaml} | 26 +- .../openshift/api/config/v1/Makefile | 3 + .../config/v1/custom.apiserver.testsuite.yaml | 35 + .../v1/custom.authentication.testsuite.yaml | 273 + .../v1/custom.clusterversion.testsuite.yaml | 472 + .../api/config/v1/custom.dns.testsuite.yaml | 104 + .../v1/custom.infrastructure.testsuite.yaml | 321 + .../config/v1/custom.network.testsuite.yaml | 28 + .../openshift/api/config/v1/feature_gates.go | 415 + .../config/v1/stable.apiserver.testsuite.yaml | 36 + .../v1/stable.authentication.testsuite.yaml | 14 + .../api/config/v1/stable.build.testsuite.yaml | 14 + .../v1/stable.clusteroperator.testsuite.yaml | 14 + .../v1/stable.clusterversion.testsuite.yaml | 418 + .../config/v1/stable.console.testsuite.yaml | 14 + .../api/config/v1/stable.dns.testsuite.yaml | 105 + .../v1/stable.featuregate.testsuite.yaml | 14 + .../api/config/v1/stable.image.testsuite.yaml | 14 + .../stable.imagecontentpolicy.testsuite.yaml | 14 + ...stable.imagedigestmirrorset.testsuite.yaml | 14 + .../stable.imagetagmirrorset.testsuite.yaml | 14 + .../v1/stable.infrastructure.testsuite.yaml | 1092 +++ .../config/v1/stable.ingress.testsuite.yaml | 14 + .../config/v1/stable.network.testsuite.yaml | 31 + .../api/config/v1/stable.node.testsuite.yaml | 14 + .../api/config/v1/stable.oauth.testsuite.yaml | 14 + .../v1/stable.operatorhub.testsuite.yaml | 14 + .../config/v1/stable.project.testsuite.yaml | 14 + .../api/config/v1/stable.proxy.testsuite.yaml | 14 + .../config/v1/stable.scheduler.testsuite.yaml | 14 + .../v1/techpreview.apiserver.testsuite.yaml | 35 + .../techpreview.authentication.testsuite.yaml | 287 + .../techpreview.clusterversion.testsuite.yaml | 472 + .../config/v1/techpreview.dns.testsuite.yaml | 14 + .../techpreview.infrastructure.testsuite.yaml | 749 ++ .../v1/techpreview.network.testsuite.yaml | 28 + .../openshift/api/config/v1/types.go | 30 + .../api/config/v1/types_apiserver.go | 16 +- .../api/config/v1/types_authentication.go | 343 +- .../openshift/api/config/v1/types_build.go | 8 +- .../api/config/v1/types_cluster_operator.go | 15 +- .../api/config/v1/types_cluster_version.go | 300 +- .../openshift/api/config/v1/types_console.go | 8 +- .../openshift/api/config/v1/types_dns.go | 45 +- .../openshift/api/config/v1/types_feature.go | 197 +- .../openshift/api/config/v1/types_image.go | 12 +- .../config/v1/types_image_content_policy.go | 8 +- .../v1/types_image_digest_mirror_set.go | 13 +- .../config/v1/types_image_tag_mirror_set.go | 13 +- .../api/config/v1/types_infrastructure.go | 950 +- .../openshift/api/config/v1/types_ingress.go | 84 +- .../openshift/api/config/v1/types_network.go | 20 +- .../openshift/api/config/v1/types_node.go | 8 +- .../openshift/api/config/v1/types_oauth.go | 19 +- .../api/config/v1/types_operatorhub.go | 8 +- .../openshift/api/config/v1/types_project.go | 8 +- .../openshift/api/config/v1/types_proxy.go | 8 +- .../api/config/v1/types_scheduling.go | 8 +- .../api/config/v1/types_tlssecurityprofile.go | 10 +- .../api/config/v1/zz_generated.deepcopy.go | 1058 +- .../v1/zz_generated.swagger_doc_generated.go | 741 +- .../openshift/api/route/v1/Makefile | 3 + .../api/route/v1/custom.route.testsuite.yaml | 103 + .../openshift/api/route/v1/generated.pb.go | 1671 +++- .../openshift/api/route/v1/generated.proto | 212 +- .../route/v1/route-CustomNoUpgrade.crd.yaml | 364 + .../v1/route-TechPreviewNoUpgrade.crd.yaml | 364 + .../openshift/api/route/v1/route.crd.yaml | 407 + .../api/route/v1/route.crd.yaml-patch | 67 + .../api/route/v1/stable.route.testsuite.yaml | 675 ++ .../route/v1/techpreview.route.testsuite.yaml | 103 + .../api/route/v1/test-route-validation.sh | 476 + .../openshift/api/route/v1/types.go | 225 +- .../api/route/v1/zz_generated.deepcopy.go | 129 +- .../v1/zz_generated.swagger_doc_generated.go | 77 +- .../openshift/api/security/v1/Makefile | 3 + .../openshift/api/security/v1/consts.go | 3 + .../openshift/api/security/v1/generated.pb.go | 220 +- .../openshift/api/security/v1/generated.proto | 10 +- ....securitycontextconstraints.testsuite.yaml | 36 + .../openshift/api/security/v1/types.go | 16 +- .../v1/zz_generated.swagger_doc_generated.go | 18 +- .../applyconfigurations/internal/internal.go | 393 + .../route/v1/localobjectreference.go | 23 + .../applyconfigurations/route/v1/route.go | 242 + .../route/v1/routehttpheader.go | 32 + .../route/v1/routehttpheaderactions.go | 42 + .../route/v1/routehttpheaderactionunion.go | 36 + .../route/v1/routehttpheaders.go | 23 + .../route/v1/routeingress.go | 68 + .../route/v1/routeingresscondition.go | 65 + .../applyconfigurations/route/v1/routeport.go | 27 + .../route/v1/routesethttpheader.go | 23 + .../applyconfigurations/route/v1/routespec.go | 104 + .../route/v1/routestatus.go | 28 + .../route/v1/routetargetreference.go | 41 + .../applyconfigurations/route/v1/tlsconfig.go | 81 + .../clientset/versioned/scheme/register.go | 14 +- .../versioned/typed/route/v1/route.go | 61 + .../applyconfigurations/internal/internal.go | 399 + .../security/v1/allowedflexvolume.go | 23 + .../security/v1/fsgroupstrategyoptions.go | 41 + .../security/v1/idrange.go | 32 + .../security/v1/rangeallocation.go | 242 + .../security/v1/runasuserstrategyoptions.go | 54 + .../security/v1/securitycontextconstraints.go | 462 + .../v1/selinuxcontextstrategyoptions.go | 37 + .../v1/supplementalgroupsstrategyoptions.go | 41 + .../clientset/versioned/scheme/register.go | 14 +- .../typed/security/v1/rangeallocation.go | 29 + .../security/v1/securitycontextconstraints.go | 29 + .../openshift/library-go/pkg/crypto/OWNERS | 4 + .../openshift/library-go/pkg/crypto/crypto.go | 140 +- vendor/github.com/pborman/uuid/time.go | 2 +- vendor/github.com/pborman/uuid/version4.go | 2 +- .../pkg/apis/monitoring}/LICENSE | 0 .../pkg/apis/monitoring/register.go | 0 .../pkg/apis/monitoring/resource.go | 60 + .../apis/monitoring/v1/alertmanager_types.go | 442 + .../pkg/apis/monitoring/v1/doc.go | 0 .../apis/monitoring/v1/podmonitor_types.go | 167 + .../pkg/apis/monitoring/v1/probe_types.go | 213 + .../apis/monitoring/v1/prometheus_types.go | 1602 +++ .../monitoring/v1/prometheusrule_types.go | 121 + .../pkg/apis/monitoring/v1/register.go | 4 +- .../monitoring/v1/servicemonitor_types.go | 111 + .../pkg/apis/monitoring/v1/thanos_types.go | 121 +- .../pkg/apis/monitoring/v1/types.go | 633 ++ .../monitoring/v1/zz_generated.deepcopy.go | 3125 ++++++ .../golang.org/x/net/internal/socks/client.go | 168 + .../golang.org/x/net/internal/socks/socks.go | 317 + vendor/golang.org/x/net/proxy/dial.go | 54 + vendor/golang.org/x/net/proxy/direct.go | 31 + vendor/golang.org/x/net/proxy/per_host.go | 155 + vendor/golang.org/x/net/proxy/proxy.go | 149 + vendor/golang.org/x/net/proxy/socks5.go | 42 + .../appengine/internal/api.go | 347 +- .../appengine/internal/api_classic.go | 29 +- .../appengine/internal/api_common.go | 50 +- .../appengine/internal/identity.go | 7 +- .../appengine/internal/identity_classic.go | 23 +- .../appengine/internal/identity_flex.go | 1 + .../appengine/internal/identity_vm.go | 20 +- .../appengine/internal/main.go | 1 + .../appengine/internal/main_vm.go | 3 +- .../appengine/internal/transaction.go | 10 +- .../appengine/urlfetch/urlfetch.go | 9 +- .../admissionregistration/v1/generated.pb.go | 141 +- .../admissionregistration/v1/generated.proto | 6 +- .../api/admissionregistration/v1/types.go | 4 + .../api/admissionregistration/v1alpha1/doc.go | 23 + .../v1alpha1/generated.pb.go | 2956 ++++++ .../v1alpha1/generated.proto | 317 + .../v1alpha1/register.go | 56 + .../admissionregistration/v1alpha1/types.go | 373 + .../v1alpha1/types_swagger_doc_generated.go | 146 + .../v1alpha1/zz_generated.deepcopy.go | 331 + .../v1beta1/generated.pb.go | 701 +- .../v1beta1/generated.proto | 64 +- .../admissionregistration/v1beta1/types.go | 74 +- .../v1beta1/types_swagger_doc_generated.go | 21 - .../v1beta1/zz_generated.deepcopy.go | 73 +- .../apidiscovery/v2beta1}/doc.go | 10 +- .../api/apidiscovery/v2beta1/generated.pb.go | 1744 ++++ .../api/apidiscovery/v2beta1/generated.proto | 156 + .../api/apidiscovery/v2beta1/register.go | 56 + .../k8s.io/api/apidiscovery/v2beta1/types.go | 163 + .../v2beta1/zz_generated.deepcopy.go | 190 + .../zz_generated.prerelease-lifecycle.go | 58 + .../v1alpha1/generated.pb.go | 98 +- .../v1alpha1/generated.proto | 4 +- .../api/apiserverinternal/v1alpha1/types.go | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/apps/v1/generated.pb.go | 534 +- vendor/k8s.io/api/apps/v1/generated.proto | 57 +- vendor/k8s.io/api/apps/v1/types.go | 54 +- .../apps/v1/types_swagger_doc_generated.go | 27 +- .../api/apps/v1/zz_generated.deepcopy.go | 26 + .../k8s.io/api/apps/v1beta1/generated.pb.go | 511 +- .../k8s.io/api/apps/v1beta1/generated.proto | 53 +- vendor/k8s.io/api/apps/v1beta1/types.go | 50 +- .../v1beta1/types_swagger_doc_generated.go | 23 +- .../api/apps/v1beta1/zz_generated.deepcopy.go | 26 + .../k8s.io/api/apps/v1beta2/generated.pb.go | 550 +- .../k8s.io/api/apps/v1beta2/generated.proto | 57 +- vendor/k8s.io/api/apps/v1beta2/types.go | 54 +- .../v1beta2/types_swagger_doc_generated.go | 27 +- .../api/apps/v1beta2/zz_generated.deepcopy.go | 26 + .../api/authentication/v1/generated.pb.go | 116 +- .../api/authentication/v1/generated.proto | 4 +- vendor/k8s.io/api/authentication/v1/types.go | 2 +- .../v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/authentication/v1alpha1/doc.go | 23 + .../authentication/v1alpha1/generated.pb.go | 567 ++ .../authentication/v1alpha1/generated.proto | 50 + .../authentication}/v1alpha1/register.go | 18 +- .../api/authentication/v1alpha1/types.go | 47 + .../v1alpha1/types_swagger_doc_generated.go | 49 + .../v1alpha1/zz_generated.deepcopy.go | 70 + .../zz_generated.prerelease-lifecycle.go | 40 + .../authentication/v1beta1/generated.pb.go | 86 +- .../authentication/v1beta1/generated.proto | 2 +- .../api/authorization/v1/generated.pb.go | 144 +- .../api/authorization/v1/generated.proto | 2 +- .../api/authorization/v1beta1/generated.pb.go | 138 +- .../api/authorization/v1beta1/generated.proto | 2 +- .../k8s.io/api/autoscaling/v1/generated.pb.go | 204 +- .../k8s.io/api/autoscaling/v1/generated.proto | 4 +- vendor/k8s.io/api/autoscaling/v1/types.go | 2 +- .../v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/autoscaling/v2/generated.pb.go | 220 +- .../k8s.io/api/autoscaling/v2/generated.proto | 4 +- vendor/k8s.io/api/autoscaling/v2/types.go | 2 +- .../v2/types_swagger_doc_generated.go | 2 +- .../api/autoscaling/v2beta1/generated.pb.go | 198 +- .../api/autoscaling/v2beta1/generated.proto | 4 +- .../k8s.io/api/autoscaling/v2beta1/types.go | 2 +- .../v2beta1/types_swagger_doc_generated.go | 2 +- .../api/autoscaling/v2beta2/generated.pb.go | 202 +- .../api/autoscaling/v2beta2/generated.proto | 4 +- .../k8s.io/api/autoscaling/v2beta2/types.go | 2 +- .../v2beta2/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/batch/v1/generated.pb.go | 1282 ++- vendor/k8s.io/api/batch/v1/generated.proto | 131 +- vendor/k8s.io/api/batch/v1/types.go | 181 +- .../batch/v1/types_swagger_doc_generated.go | 51 +- .../api/batch/v1/zz_generated.deepcopy.go | 101 + .../k8s.io/api/batch/v1beta1/generated.pb.go | 148 +- .../k8s.io/api/batch/v1beta1/generated.proto | 15 +- vendor/k8s.io/api/batch/v1beta1/types.go | 13 + .../v1beta1/types_swagger_doc_generated.go | 1 + .../batch/v1beta1/zz_generated.deepcopy.go | 5 + .../api/certificates/v1/generated.pb.go | 116 +- .../api/certificates/v1/generated.proto | 4 +- vendor/k8s.io/api/certificates/v1/types.go | 7 +- .../v1/types_swagger_doc_generated.go | 2 +- .../api/certificates/v1beta1/generated.pb.go | 117 +- .../api/certificates/v1beta1/generated.proto | 4 +- .../k8s.io/api/certificates/v1beta1/types.go | 5 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../api/coordination/v1/generated.pb.go | 70 +- .../api/coordination/v1/generated.proto | 2 +- .../api/coordination/v1beta1/generated.pb.go | 70 +- .../api/coordination/v1beta1/generated.proto | 2 +- vendor/k8s.io/api/core/v1/generated.pb.go | 4983 ++++++---- vendor/k8s.io/api/core/v1/generated.proto | 985 +- vendor/k8s.io/api/core/v1/toleration.go | 9 +- vendor/k8s.io/api/core/v1/types.go | 1067 +- .../core/v1/types_swagger_doc_generated.go | 718 +- .../k8s.io/api/core/v1/well_known_taints.go | 4 + .../api/core/v1/zz_generated.deepcopy.go | 152 +- .../k8s.io/api/discovery/v1/generated.pb.go | 114 +- .../k8s.io/api/discovery/v1/generated.proto | 16 +- vendor/k8s.io/api/discovery/v1/types.go | 14 +- .../v1/types_swagger_doc_generated.go | 10 +- .../api/discovery/v1beta1/generated.pb.go | 112 +- .../api/discovery/v1beta1/generated.proto | 16 +- vendor/k8s.io/api/discovery/v1beta1/types.go | 14 +- .../v1beta1/types_swagger_doc_generated.go | 10 +- vendor/k8s.io/api/events/v1/generated.pb.go | 100 +- vendor/k8s.io/api/events/v1/generated.proto | 2 +- .../k8s.io/api/events/v1beta1/generated.pb.go | 100 +- .../k8s.io/api/events/v1beta1/generated.proto | 2 +- .../api/extensions/v1beta1/generated.pb.go | 1630 +++- .../api/extensions/v1beta1/generated.proto | 78 +- vendor/k8s.io/api/extensions/v1beta1/types.go | 106 +- .../v1beta1/types_swagger_doc_generated.go | 51 +- .../v1beta1/zz_generated.deepcopy.go | 91 + .../api/flowcontrol/v1alpha1/generated.pb.go | 252 +- .../api/flowcontrol/v1alpha1/generated.proto | 35 +- .../k8s.io/api/flowcontrol/v1alpha1/types.go | 41 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 10 + .../zz_generated.prerelease-lifecycle.go | 8 +- .../api/flowcontrol/v1beta1/generated.pb.go | 252 +- .../api/flowcontrol/v1beta1/generated.proto | 35 +- .../k8s.io/api/flowcontrol/v1beta1/types.go | 41 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 10 + .../zz_generated.prerelease-lifecycle.go | 8 +- .../api/flowcontrol/v1beta2/generated.pb.go | 252 +- .../api/flowcontrol/v1beta2/generated.proto | 35 +- .../k8s.io/api/flowcontrol/v1beta2/types.go | 37 +- .../v1beta2/types_swagger_doc_generated.go | 4 +- .../v1beta2/zz_generated.deepcopy.go | 10 + .../zz_generated.prerelease-lifecycle.go | 28 + vendor/k8s.io/api/flowcontrol/v1beta3/doc.go | 25 + .../api/flowcontrol/v1beta3/generated.pb.go | 5428 +++++++++++ .../api/flowcontrol/v1beta3/generated.proto | 473 + .../api/flowcontrol/v1beta3/register.go | 58 + .../k8s.io/api/flowcontrol/v1beta3/types.go | 612 ++ .../v1beta3/types_swagger_doc_generated.go | 263 + .../v1beta3/zz_generated.deepcopy.go | 552 ++ .../zz_generated.prerelease-lifecycle.go | 94 + .../k8s.io/api/networking/v1/generated.pb.go | 1316 ++- .../k8s.io/api/networking/v1/generated.proto | 96 +- vendor/k8s.io/api/networking/v1/types.go | 126 +- .../v1/types_swagger_doc_generated.go | 51 +- .../networking/v1/zz_generated.deepcopy.go | 91 + vendor/k8s.io/api/networking/v1alpha1/doc.go | 23 + .../api/networking/v1alpha1/generated.pb.go | 913 ++ .../api/networking/v1alpha1/generated.proto | 94 + .../api/networking/v1alpha1/register.go | 56 + .../k8s.io/api/networking/v1alpha1/types.go | 95 + .../v1alpha1/types_swagger_doc_generated.go | 62 + .../v1alpha1/zz_generated.deepcopy.go | 85 +- .../zz_generated.prerelease-lifecycle.go | 58 + .../api/networking/v1beta1/generated.pb.go | 830 +- .../api/networking/v1beta1/generated.proto | 51 +- vendor/k8s.io/api/networking/v1beta1/types.go | 51 +- .../v1beta1/types_swagger_doc_generated.go | 31 + .../v1beta1/zz_generated.deepcopy.go | 67 + vendor/k8s.io/api/node/v1/generated.pb.go | 85 +- vendor/k8s.io/api/node/v1/generated.proto | 4 +- vendor/k8s.io/api/node/v1/types.go | 2 - .../node/v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/node/v1alpha1/generated.pb.go | 90 +- .../k8s.io/api/node/v1alpha1/generated.proto | 3 +- vendor/k8s.io/api/node/v1alpha1/types.go | 1 - .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/node/v1beta1/generated.pb.go | 86 +- .../k8s.io/api/node/v1beta1/generated.proto | 3 +- vendor/k8s.io/api/node/v1beta1/types.go | 1 - .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/policy/v1/generated.pb.go | 152 +- vendor/k8s.io/api/policy/v1/generated.proto | 30 +- vendor/k8s.io/api/policy/v1/types.go | 48 + .../policy/v1/types_swagger_doc_generated.go | 9 +- .../api/policy/v1/zz_generated.deepcopy.go | 5 + .../k8s.io/api/policy/v1beta1/generated.pb.go | 288 +- .../k8s.io/api/policy/v1beta1/generated.proto | 31 +- vendor/k8s.io/api/policy/v1beta1/types.go | 49 +- .../v1beta1/types_swagger_doc_generated.go | 11 +- .../policy/v1beta1/zz_generated.deepcopy.go | 5 + vendor/k8s.io/api/rbac/v1/generated.pb.go | 104 +- vendor/k8s.io/api/rbac/v1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1/types.go | 2 +- .../rbac/v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 105 +- .../k8s.io/api/rbac/v1alpha1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1alpha1/types.go | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/rbac/v1beta1/generated.pb.go | 104 +- .../k8s.io/api/rbac/v1beta1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1beta1/types.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/resource/v1alpha1/doc.go | 24 + .../api/resource/v1alpha1/generated.pb.go | 4593 +++++++++ .../api/resource/v1alpha1/generated.proto | 372 + .../k8s.io/api/resource/v1alpha1/register.go | 63 + vendor/k8s.io/api/resource/v1alpha1/types.go | 430 + .../v1alpha1/types_swagger_doc_generated.go | 222 + .../v1alpha1/zz_generated.deepcopy.go | 477 + .../k8s.io/api/scheduling/v1/generated.pb.go | 64 +- .../k8s.io/api/scheduling/v1/generated.proto | 3 +- vendor/k8s.io/api/scheduling/v1/types.go | 1 - .../v1/types_swagger_doc_generated.go | 2 +- .../api/scheduling/v1alpha1/generated.pb.go | 64 +- .../api/scheduling/v1alpha1/generated.proto | 3 +- .../k8s.io/api/scheduling/v1alpha1/types.go | 1 - .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../api/scheduling/v1beta1/generated.pb.go | 65 +- .../api/scheduling/v1beta1/generated.proto | 3 +- vendor/k8s.io/api/scheduling/v1beta1/types.go | 1 - .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/storage/v1/generated.pb.go | 849 +- vendor/k8s.io/api/storage/v1/generated.proto | 121 +- vendor/k8s.io/api/storage/v1/register.go | 3 + vendor/k8s.io/api/storage/v1/types.go | 126 +- .../storage/v1/types_swagger_doc_generated.go | 26 +- .../api/storage/v1/zz_generated.deepcopy.go | 80 + .../api/storage/v1alpha1/generated.pb.go | 118 +- .../api/storage/v1alpha1/generated.proto | 14 +- vendor/k8s.io/api/storage/v1alpha1/types.go | 14 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../api/storage/v1beta1/generated.pb.go | 246 +- .../api/storage/v1beta1/generated.proto | 39 +- vendor/k8s.io/api/storage/v1beta1/types.go | 41 +- .../v1beta1/types_swagger_doc_generated.go | 7 +- .../storage/v1beta1/zz_generated.deepcopy.go | 5 + .../zz_generated.prerelease-lifecycle.go | 12 + .../pkg/apis/apiextensions/v1/generated.pb.go | 382 +- .../pkg/apis/apiextensions/v1/generated.proto | 4 +- .../pkg/apis/apiextensions/v1/types.go | 2 +- .../apiextensions/v1beta1/generated.pb.go | 388 +- .../apiextensions/v1beta1/generated.proto | 4 +- .../pkg/apis/apiextensions/v1beta1/types.go | 2 +- .../client/clientset/clientset/clientset.go | 7 +- .../clientset/clientset/scheme/register.go | 14 +- .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 31 +- .../apimachinery/pkg/api/errors/errors.go | 75 +- .../k8s.io/apimachinery/pkg/api/meta/OWNERS | 26 +- .../apimachinery/pkg/api/meta/conditions.go | 6 +- .../apimachinery/pkg/api/meta/errors.go | 35 +- .../k8s.io/apimachinery/pkg/api/meta/help.go | 7 +- .../k8s.io/apimachinery/pkg/api/meta/meta.go | 5 +- .../apimachinery/pkg/api/meta/restmapper.go | 3 +- .../apimachinery/pkg/api/resource/OWNERS | 17 +- .../pkg/api/resource/generated.pb.go | 6 +- .../pkg/api/resource/generated.proto | 29 +- .../apimachinery/pkg/api/resource/quantity.go | 41 +- .../apimachinery/pkg/api/resource/suffix.go | 2 +- .../apimachinery/pkg/apis/meta/v1/OWNERS | 33 +- .../pkg/apis/meta/v1/generated.pb.go | 399 +- .../pkg/apis/meta/v1/generated.proto | 145 +- .../apimachinery/pkg/apis/meta/v1/helpers.go | 2 +- .../apimachinery/pkg/apis/meta/v1/meta.go | 4 - .../pkg/apis/meta/v1/micro_time_proto.go | 10 +- .../apimachinery/pkg/apis/meta/v1/types.go | 154 +- .../meta/v1/types_swagger_doc_generated.go | 17 +- .../pkg/apis/meta/v1/unstructured/helpers.go | 1 + .../apis/meta/v1/unstructured/unstructured.go | 12 - .../pkg/apis/meta/v1beta1/generated.pb.go | 40 +- .../pkg/apis/meta/v1beta1/generated.proto | 2 +- .../apimachinery/pkg/conversion/converter.go | 8 +- .../apimachinery/pkg/conversion/deep_equal.go | 11 + .../apimachinery/pkg/conversion/helper.go | 2 +- .../pkg/conversion/queryparams/convert.go | 4 +- .../apimachinery/pkg/labels/selector.go | 69 +- .../apimachinery/pkg/runtime/allocator.go | 76 + .../k8s.io/apimachinery/pkg/runtime/codec.go | 13 +- .../apimachinery/pkg/runtime/codec_check.go | 2 +- .../apimachinery/pkg/runtime/converter.go | 52 +- .../apimachinery/pkg/runtime/generated.pb.go | 50 +- .../apimachinery/pkg/runtime/generated.proto | 61 +- .../apimachinery/pkg/runtime/interfaces.go | 37 +- .../pkg/runtime/schema/generated.pb.go | 26 +- .../pkg/runtime/schema/generated.proto | 2 +- .../pkg/runtime/schema/group_version.go | 6 +- .../k8s.io/apimachinery/pkg/runtime/scheme.go | 15 +- .../pkg/runtime/serializer/codec_factory.go | 3 +- .../pkg/runtime/serializer/json/json.go | 19 +- .../runtime/serializer/protobuf/protobuf.go | 64 +- .../runtime/serializer/streaming/streaming.go | 20 + .../serializer/versioning/versioning.go | 61 +- .../k8s.io/apimachinery/pkg/runtime/types.go | 59 +- .../k8s.io/apimachinery/pkg/types/nodename.go | 24 +- .../k8s.io/apimachinery/pkg/util/diff/diff.go | 2 +- .../apimachinery/pkg/util/framer/framer.go | 8 +- .../pkg/util/httpstream/spdy/roundtripper.go | 206 +- .../pkg/util/httpstream/spdy/upgrade.go | 2 +- .../pkg/util/intstr/generated.pb.go | 38 +- .../pkg/util/intstr/generated.proto | 2 +- .../apimachinery/pkg/util/intstr/intstr.go | 6 +- .../pkg/util/managedfields/extract.go | 2 +- .../pkg/util/managedfields/gvkparser.go | 3 +- .../apimachinery/pkg/util/mergepatch/OWNERS | 5 +- .../apimachinery/pkg/util/mergepatch/util.go | 3 +- .../k8s.io/apimachinery/pkg/util/net/http.go | 99 - .../apimachinery/pkg/util/net/interface.go | 2 +- .../apimachinery/pkg/util/net/port_split.go | 13 +- .../k8s.io/apimachinery/pkg/util/net/util.go | 1 + .../apimachinery/pkg/util/runtime/runtime.go | 9 +- .../k8s.io/apimachinery/pkg/util/sets/byte.go | 150 +- .../k8s.io/apimachinery/pkg/util/sets/doc.go | 7 +- .../apimachinery/pkg/util/sets/empty.go | 4 +- .../k8s.io/apimachinery/pkg/util/sets/int.go | 150 +- .../apimachinery/pkg/util/sets/int32.go | 150 +- .../apimachinery/pkg/util/sets/int64.go | 150 +- .../apimachinery/pkg/util/sets/ordered.go | 53 + .../k8s.io/apimachinery/pkg/util/sets/set.go | 227 + .../apimachinery/pkg/util/sets/string.go | 150 +- .../pkg/util/strategicpatch/OWNERS | 8 +- .../pkg/util/strategicpatch/meta.go | 4 +- .../pkg/util/strategicpatch/patch.go | 25 + .../pkg/util/validation/field/errors.go | 58 +- .../pkg/util/validation/validation.go | 2 +- .../k8s.io/apimachinery/pkg/util/wait/wait.go | 24 +- .../k8s.io/apimachinery/pkg/watch/filter.go | 1 - vendor/k8s.io/apimachinery/pkg/watch/mux.go | 53 +- vendor/k8s.io/apimachinery/pkg/watch/watch.go | 4 +- .../third_party/forked/golang/json/OWNERS | 5 +- .../third_party/forked/golang/json/fields.go | 4 +- .../third_party/forked/golang/netutil/addr.go | 5 +- .../forked/golang/reflect/deep_equal.go | 84 +- .../v1/mutatingwebhookconfiguration.go | 18 - .../v1/validatingwebhookconfiguration.go | 18 - .../v1alpha1/admissionpolicyspec.go | 75 + .../v1alpha1/matchresources.go | 90 + .../v1alpha1/namedrulewithoperations.go | 95 + .../v1alpha1/paramkind.go | 48 + .../v1alpha1/paramref.go | 48 + .../v1alpha1/paramsource.go | 48 + .../admissionregistration/v1alpha1/rule.go | 76 + .../v1alpha1/rulewithoperations.go | 85 + .../v1alpha1/validatingadmissionpolicy.go | 247 + .../validatingadmissionpolicybinding.go | 247 + .../validatingadmissionpolicybindingspec.go | 57 + .../v1alpha1/validatingadmissionpolicyspec.go | 75 + .../v1alpha1/validation.go | 61 + .../v1beta1/mutatingwebhook.go | 15 +- .../v1beta1/mutatingwebhookconfiguration.go | 18 - .../v1beta1/rulewithoperations.go | 11 +- .../v1beta1/validatingwebhook.go | 15 +- .../v1beta1/validatingwebhookconfiguration.go | 18 - .../v1alpha1/storageversion.go | 18 - .../apps/v1/controllerrevision.go | 18 - .../applyconfigurations/apps/v1/daemonset.go | 18 - .../applyconfigurations/apps/v1/deployment.go | 18 - .../applyconfigurations/apps/v1/replicaset.go | 18 - .../v1/rollingupdatestatefulsetstrategy.go | 15 +- .../apps/v1/statefulset.go | 18 - .../apps/v1/statefulsetordinals.go | 39 + .../apps/v1/statefulsetspec.go | 9 + .../apps/v1beta1/controllerrevision.go | 18 - .../apps/v1beta1/deployment.go | 18 - .../rollingupdatestatefulsetstrategy.go | 15 +- .../apps/v1beta1/statefulset.go | 18 - .../apps/v1beta1/statefulsetordinals.go | 39 + .../apps/v1beta1/statefulsetspec.go | 9 + .../apps/v1beta2/controllerrevision.go | 18 - .../apps/v1beta2/daemonset.go | 18 - .../apps/v1beta2/deployment.go | 18 - .../apps/v1beta2/replicaset.go | 18 - .../rollingupdatestatefulsetstrategy.go | 15 +- .../applyconfigurations/apps/v1beta2/scale.go | 23 +- .../apps/v1beta2/statefulset.go | 18 - .../apps/v1beta2/statefulsetordinals.go | 39 + .../apps/v1beta2/statefulsetspec.go | 9 + .../autoscaling/v1/horizontalpodautoscaler.go | 18 - .../autoscaling/v1/scale.go | 23 +- .../autoscaling/v2/horizontalpodautoscaler.go | 18 - .../v2beta1/horizontalpodautoscaler.go | 18 - .../v2beta2/horizontalpodautoscaler.go | 18 - .../applyconfigurations/batch/v1/cronjob.go | 18 - .../batch/v1/cronjobspec.go | 9 + .../applyconfigurations/batch/v1/job.go | 18 - .../applyconfigurations/batch/v1/jobspec.go | 15 +- .../batch/v1/jobtemplatespec.go | 18 - .../batch/v1/podfailurepolicy.go | 44 + .../podfailurepolicyonexitcodesrequirement.go | 63 + .../podfailurepolicyonpodconditionspattern.go | 52 + .../batch/v1/podfailurepolicyrule.go | 66 + .../batch/v1beta1/cronjob.go | 18 - .../batch/v1beta1/cronjobspec.go | 9 + .../batch/v1beta1/jobtemplatespec.go | 18 - .../v1/certificatesigningrequest.go | 18 - .../v1beta1/certificatesigningrequest.go | 18 - .../coordination/v1/lease.go | 18 - .../coordination/v1beta1/lease.go | 18 - .../core/v1/claimsource.go | 48 + .../core/v1/componentstatus.go | 18 - .../applyconfigurations/core/v1/configmap.go | 18 - .../core/v1/csipersistentvolumesource.go | 9 + .../applyconfigurations/core/v1/endpoints.go | 18 - .../applyconfigurations/core/v1/event.go | 18 - .../applyconfigurations/core/v1/limitrange.go | 18 - .../applyconfigurations/core/v1/namespace.go | 18 - .../applyconfigurations/core/v1/node.go | 18 - .../core/v1/persistentvolume.go | 18 - .../core/v1/persistentvolumeclaim.go | 18 - .../core/v1/persistentvolumeclaimspec.go | 4 +- .../core/v1/persistentvolumeclaimtemplate.go | 18 - .../applyconfigurations/core/v1/pod.go | 18 - .../core/v1/podresourceclaim.go | 48 + .../core/v1/podschedulinggate.go | 39 + .../applyconfigurations/core/v1/podspec.go | 37 + .../core/v1/podtemplate.go | 18 - .../core/v1/podtemplatespec.go | 18 - .../core/v1/replicationcontroller.go | 18 - .../core/v1/resourceclaim.go | 39 + .../core/v1/resourcequota.go | 18 - .../core/v1/resourcerequirements.go | 18 +- .../applyconfigurations/core/v1/secret.go | 18 - .../applyconfigurations/core/v1/service.go | 18 - .../core/v1/serviceaccount.go | 18 - .../core/v1/servicespec.go | 4 +- .../core/v1/topologyspreadconstraint.go | 46 +- .../core/v1/typedobjectreference.go | 66 + .../discovery/v1/endpointslice.go | 18 - .../discovery/v1beta1/endpointslice.go | 18 - .../applyconfigurations/events/v1/event.go | 18 - .../events/v1beta1/event.go | 18 - .../extensions/v1beta1/daemonset.go | 18 - .../extensions/v1beta1/deployment.go | 18 - .../extensions/v1beta1/ingress.go | 18 - .../v1beta1/ingressloadbalanceringress.go | 62 + .../v1beta1/ingressloadbalancerstatus.go | 44 + .../extensions/v1beta1/ingressportstatus.go | 61 + .../extensions/v1beta1/ingressstatus.go | 8 +- .../extensions/v1beta1/networkpolicy.go | 29 +- .../extensions/v1beta1/networkpolicystatus.go | 48 + .../extensions/v1beta1/podsecuritypolicy.go | 18 - .../extensions/v1beta1/replicaset.go | 18 - .../extensions/v1beta1/scale.go | 23 +- .../flowcontrol/v1alpha1/flowschema.go | 18 - .../limitedprioritylevelconfiguration.go | 18 + .../v1alpha1/prioritylevelconfiguration.go | 18 - .../flowcontrol/v1beta1/flowschema.go | 18 - .../limitedprioritylevelconfiguration.go | 18 + .../v1beta1/prioritylevelconfiguration.go | 18 - .../flowcontrol/v1beta2/flowschema.go | 18 - .../limitedprioritylevelconfiguration.go | 18 + .../v1beta2/prioritylevelconfiguration.go | 18 - .../v1beta3/flowdistinguishermethod.go | 43 + .../flowcontrol/v1beta3/flowschema.go | 256 + .../v1beta3/flowschemacondition.go | 80 + .../flowcontrol/v1beta3/flowschemaspec.go | 71 + .../flowcontrol/v1beta3/flowschemastatus.go | 44 + .../flowcontrol/v1beta3/groupsubject.go | 39 + .../limitedprioritylevelconfiguration.go | 66 + .../flowcontrol/v1beta3/limitresponse.go | 52 + .../v1beta3/nonresourcepolicyrule.go | 52 + .../v1beta3/policyruleswithsubjects.go | 72 + .../v1beta3/prioritylevelconfiguration.go | 256 + .../prioritylevelconfigurationcondition.go | 80 + .../prioritylevelconfigurationreference.go | 39 + .../v1beta3/prioritylevelconfigurationspec.go | 52 + .../prioritylevelconfigurationstatus.go | 44 + .../v1beta3/queuingconfiguration.go | 57 + .../flowcontrol/v1beta3/resourcepolicyrule.go | 83 + .../v1beta3/serviceaccountsubject.go | 48 + .../flowcontrol/v1beta3/subject.go | 70 + .../flowcontrol/v1beta3/usersubject.go | 39 + .../applyconfigurations/internal/internal.go | 1280 ++- .../meta/v1/deleteoptions.go | 5 +- .../meta/v1/groupversionkind.go | 57 + .../applyconfigurations/meta/v1/listmeta.go | 66 + .../applyconfigurations/meta/v1/objectmeta.go | 18 - .../applyconfigurations/meta/v1/status.go | 142 + .../meta/v1/statuscause.go | 61 + .../meta/v1/statusdetails.go | 93 + .../networking/v1/ingress.go | 18 - .../networking/v1/ingressclass.go | 18 - .../v1/ingressloadbalanceringress.go | 62 + .../v1/ingressloadbalancerstatus.go | 44 + .../networking/v1/ingressportstatus.go | 61 + .../networking/v1/ingressstatus.go | 8 +- .../networking/v1/networkpolicy.go | 29 +- .../networking/v1/networkpolicystatus.go | 48 + .../networking/v1alpha1/clustercidr.go | 247 + .../networking/v1alpha1/clustercidrspec.go | 70 + .../networking/v1beta1/ingress.go | 18 - .../networking/v1beta1/ingressclass.go | 18 - .../v1beta1/ingressloadbalanceringress.go | 62 + .../v1beta1/ingressloadbalancerstatus.go | 44 + .../networking/v1beta1/ingressportstatus.go | 61 + .../networking/v1beta1/ingressstatus.go | 8 +- .../node/v1/runtimeclass.go | 18 - .../node/v1alpha1/runtimeclass.go | 18 - .../node/v1beta1/runtimeclass.go | 18 - .../applyconfigurations/policy/v1/eviction.go | 18 - .../policy/v1/poddisruptionbudget.go | 18 - .../policy/v1/poddisruptionbudgetspec.go | 16 +- .../policy/v1beta1/eviction.go | 18 - .../policy/v1beta1/poddisruptionbudget.go | 18 - .../policy/v1beta1/poddisruptionbudgetspec.go | 16 +- .../policy/v1beta1/podsecuritypolicy.go | 18 - .../rbac/v1/clusterrole.go | 18 - .../rbac/v1/clusterrolebinding.go | 18 - .../applyconfigurations/rbac/v1/role.go | 18 - .../rbac/v1/rolebinding.go | 18 - .../rbac/v1alpha1/clusterrole.go | 18 - .../rbac/v1alpha1/clusterrolebinding.go | 18 - .../applyconfigurations/rbac/v1alpha1/role.go | 18 - .../rbac/v1alpha1/rolebinding.go | 18 - .../rbac/v1beta1/clusterrole.go | 18 - .../rbac/v1beta1/clusterrolebinding.go | 18 - .../applyconfigurations/rbac/v1beta1/role.go | 18 - .../rbac/v1beta1/rolebinding.go | 18 - .../resource/v1alpha1/allocationresult.go | 61 + .../resource/v1alpha1/podscheduling.go | 258 + .../resource/v1alpha1/podschedulingspec.go | 50 + .../resource/v1alpha1/podschedulingstatus.go | 44 + .../resource/v1alpha1/resourceclaim.go | 258 + .../resourceclaimconsumerreference.go | 70 + .../resourceclaimparametersreference.go | 57 + .../v1alpha1/resourceclaimschedulingstatus.go | 50 + .../resource/v1alpha1/resourceclaimspec.go | 61 + .../resource/v1alpha1/resourceclaimstatus.go | 71 + .../v1alpha1/resourceclaimtemplate.go | 249 + .../v1alpha1/resourceclaimtemplatespec.go | 188 + .../resource/v1alpha1/resourceclass.go | 266 + .../resourceclassparametersreference.go | 66 + .../scheduling/v1/priorityclass.go | 18 - .../scheduling/v1alpha1/priorityclass.go | 18 - .../scheduling/v1beta1/priorityclass.go | 18 - .../storage/v1/csidriver.go | 18 - .../storage/v1/csidriverspec.go | 9 + .../applyconfigurations/storage/v1/csinode.go | 18 - .../storage/v1/csistoragecapacity.go | 277 + .../storage/v1/storageclass.go | 18 - .../storage/v1/volumeattachment.go | 18 - .../storage/v1alpha1/csistoragecapacity.go | 18 - .../storage/v1alpha1/volumeattachment.go | 18 - .../storage/v1beta1/csidriver.go | 18 - .../storage/v1beta1/csidriverspec.go | 9 + .../storage/v1beta1/csinode.go | 18 - .../storage/v1beta1/csistoragecapacity.go | 18 - .../storage/v1beta1/storageclass.go | 18 - .../storage/v1beta1/volumeattachment.go | 18 - .../discovery/aggregated_discovery.go | 154 + .../client-go/discovery/discovery_client.go | 318 +- .../client-go/discovery/fake/discovery.go | 19 +- vendor/k8s.io/client-go/discovery/helper.go | 21 + vendor/k8s.io/client-go/dynamic/interface.go | 2 + vendor/k8s.io/client-go/dynamic/simple.go | 113 +- .../k8s.io/client-go/kubernetes/clientset.go | 162 +- .../kubernetes/fake/clientset_generated.go | 35 + .../client-go/kubernetes/fake/register.go | 24 +- .../client-go/kubernetes/scheme/register.go | 24 +- .../v1alpha1/admissionregistration_client.go | 112 + .../admissionregistration/v1alpha1/doc.go | 20 + .../v1alpha1/fake/doc.go | 20 + .../fake/fake_admissionregistration_client.go | 44 + .../fake/fake_validatingadmissionpolicy.go | 146 + .../fake_validatingadmissionpolicybinding.go | 146 + .../v1alpha1/generated_expansion.go} | 14 +- .../v1alpha1/validatingadmissionpolicy.go | 197 + .../validatingadmissionpolicybinding.go | 197 + .../v1alpha1/authentication_client.go | 107 + .../typed/authentication/v1alpha1/doc.go | 20 + .../typed/authentication/v1alpha1/fake/doc.go | 20 + .../fake/fake_authentication_client.go | 40 + .../v1alpha1/fake/fake_selfsubjectreview.go | 47 + .../v1alpha1/generated_expansion.go | 21 + .../v1alpha1/selfsubjectreview.go | 64 + .../core/v1/fake/fake_event_expansion.go | 18 +- .../typed/core/v1/fake/fake_pod_expansion.go | 4 +- .../typed/events/v1beta1/event_expansion.go | 3 +- .../v1beta1/fake/fake_networkpolicy.go | 35 + .../typed/extensions/v1beta1/networkpolicy.go | 48 + .../typed/flowcontrol/v1beta3/doc.go | 20 + .../typed/flowcontrol/v1beta3/fake/doc.go | 20 + .../v1beta3/fake/fake_flowcontrol_client.go | 44 + .../v1beta3/fake/fake_flowschema.go | 179 + .../fake/fake_prioritylevelconfiguration.go | 179 + .../flowcontrol/v1beta3/flowcontrol_client.go | 112 + .../typed/flowcontrol/v1beta3/flowschema.go | 243 + .../v1beta3/generated_expansion.go | 23 + .../v1beta3/prioritylevelconfiguration.go | 243 + .../networking/v1/fake/fake_networkpolicy.go | 35 + .../typed/networking/v1/networkpolicy.go | 48 + .../typed/networking/v1alpha1/clustercidr.go | 197 + .../typed/networking/v1alpha1/doc.go | 20 + .../typed/networking/v1alpha1/fake/doc.go | 20 + .../v1alpha1/fake/fake_clustercidr.go | 146 + .../v1alpha1/fake/fake_networking_client.go | 40 + .../v1alpha1/generated_expansion.go | 21 + .../networking/v1alpha1/networking_client.go | 107 + .../kubernetes/typed/resource/v1alpha1/doc.go | 20 + .../typed/resource/v1alpha1/fake/doc.go | 20 + .../v1alpha1/fake/fake_podscheduling.go | 190 + .../v1alpha1/fake/fake_resource_client.go | 52 + .../v1alpha1/fake/fake_resourceclaim.go | 190 + .../fake/fake_resourceclaimtemplate.go | 155 + .../v1alpha1/fake/fake_resourceclass.go | 146 + .../resource/v1alpha1/generated_expansion.go} | 20 +- .../typed/resource/v1alpha1/podscheduling.go | 256 + .../resource/v1alpha1/resource_client.go | 122 + .../typed/resource/v1alpha1/resourceclaim.go | 256 + .../v1alpha1/resourceclaimtemplate.go | 208 + .../typed/resource/v1alpha1/resourceclass.go | 197 + .../typed/storage/v1/csistoragecapacity.go | 208 + .../v1/fake/fake_csistoragecapacity.go | 155 + .../storage/v1/fake/fake_storage_client.go | 4 + .../typed/storage/v1/generated_expansion.go | 2 + .../typed/storage/v1/storage_client.go | 5 + vendor/k8s.io/client-go/openapi/client.go | 64 + .../k8s.io/client-go/openapi/groupversion.go | 46 + .../pkg/apis/clientauthentication/OWNERS | 7 +- .../clientauthentication/install/install.go | 2 - .../pkg/apis/clientauthentication/types.go | 19 +- .../pkg/apis/clientauthentication/v1/types.go | 5 + .../v1/zz_generated.conversion.go | 18 +- .../clientauthentication/v1alpha1/types.go | 78 - .../v1alpha1/zz_generated.conversion.go | 173 - .../clientauthentication/v1beta1/types.go | 5 + .../v1beta1/zz_generated.conversion.go | 18 +- .../zz_generated.deepcopy.go | 36 - .../client-go/pkg/version/.gitattributes | 1 - .../plugin/pkg/client/auth/exec/exec.go | 60 +- vendor/k8s.io/client-go/rest/OWNERS | 30 +- vendor/k8s.io/client-go/rest/client.go | 14 +- vendor/k8s.io/client-go/rest/config.go | 10 +- vendor/k8s.io/client-go/rest/exec.go | 9 +- vendor/k8s.io/client-go/rest/plugin.go | 7 +- vendor/k8s.io/client-go/rest/request.go | 274 +- vendor/k8s.io/client-go/rest/transport.go | 5 +- vendor/k8s.io/client-go/rest/warnings.go | 6 +- vendor/k8s.io/client-go/rest/with_retry.go | 227 +- vendor/k8s.io/client-go/testing/fixture.go | 20 +- vendor/k8s.io/client-go/tools/auth/OWNERS | 7 +- .../k8s.io/client-go/tools/auth/clientauth.go | 33 +- vendor/k8s.io/client-go/tools/cache/OWNERS | 58 +- .../client-go/tools/cache/controller.go | 163 +- .../client-go/tools/cache/delta_fifo.go | 173 +- .../client-go/tools/cache/expiration_cache.go | 17 +- vendor/k8s.io/client-go/tools/cache/fifo.go | 9 +- vendor/k8s.io/client-go/tools/cache/index.go | 10 +- .../k8s.io/client-go/tools/cache/listers.go | 20 +- .../k8s.io/client-go/tools/cache/reflector.go | 291 +- .../tools/cache/retry_with_deadline.go | 78 + .../client-go/tools/cache/shared_informer.go | 266 +- vendor/k8s.io/client-go/tools/cache/store.go | 13 +- .../cache/testing/fake_controller_source.go | 4 +- .../tools/cache/thread_safe_store.go | 316 +- .../client-go/tools/clientcmd/api/helpers.go | 91 +- .../client-go/tools/clientcmd/api/types.go | 5 + .../client-go/tools/clientcmd/api/v1/types.go | 5 + .../api/v1/zz_generated.conversion.go | 2 + .../client-go/tools/clientcmd/auth_loaders.go | 5 +- .../tools/clientcmd/client_config.go | 7 +- .../client-go/tools/clientcmd/loader.go | 15 +- .../client-go/tools/clientcmd/overrides.go | 44 +- .../client-go/tools/clientcmd/validation.go | 15 +- vendor/k8s.io/client-go/tools/metrics/OWNERS | 5 +- .../k8s.io/client-go/tools/metrics/metrics.go | 21 + vendor/k8s.io/client-go/tools/pager/pager.go | 5 + .../tools/portforward/portforward.go | 23 +- .../k8s.io/client-go/tools/reference/ref.go | 2 +- vendor/k8s.io/client-go/transport/OWNERS | 11 +- vendor/k8s.io/client-go/transport/cache.go | 28 +- .../k8s.io/client-go/transport/cache_go118.go | 24 + vendor/k8s.io/client-go/transport/config.go | 21 +- .../client-go/transport/round_trippers.go | 12 +- .../k8s.io/client-go/transport/spdy/spdy.go | 8 +- .../client-go/transport/token_source.go | 4 +- .../k8s.io/client-go/transport/transport.go | 27 +- vendor/k8s.io/client-go/util/cert/OWNERS | 7 +- vendor/k8s.io/client-go/util/cert/cert.go | 10 +- vendor/k8s.io/client-go/util/cert/io.go | 7 +- vendor/k8s.io/client-go/util/keyutil/OWNERS | 7 +- vendor/k8s.io/client-go/util/keyutil/key.go | 9 +- vendor/k8s.io/client-go/util/retry/OWNERS | 2 +- vendor/k8s.io/client-go/util/retry/util.go | 44 +- .../util/workqueue/delaying_queue.go | 4 +- vendor/k8s.io/client-go/util/workqueue/doc.go | 14 +- .../util/workqueue/rate_limiting_queue.go | 9 + vendor/k8s.io/klog/v2/OWNERS | 17 +- vendor/k8s.io/klog/v2/README.md | 17 +- vendor/k8s.io/klog/v2/contextual.go | 212 + vendor/k8s.io/klog/v2/exit.go | 69 + vendor/k8s.io/klog/v2/format.go | 65 + .../v1/conversion.go => klog/v2/imports.go} | 26 +- .../k8s.io/klog/v2/internal/buffer/buffer.go | 176 + .../k8s.io/klog/v2/internal/clock/README.md | 7 + vendor/k8s.io/klog/v2/internal/clock/clock.go | 178 + vendor/k8s.io/klog/v2/internal/dbg/dbg.go | 42 + .../klog/v2/internal/serialize/keyvalues.go | 355 + .../klog/v2/internal/severity/severity.go | 58 + vendor/k8s.io/klog/v2/k8s_references.go | 212 + vendor/k8s.io/klog/v2/klog.go | 1188 ++- vendor/k8s.io/klog/v2/klogr.go | 89 + .../kube-openapi/pkg/builder3/util/util.go | 51 + .../k8s.io/kube-openapi/pkg/common/common.go | 320 + vendor/k8s.io/kube-openapi/pkg/common/doc.go | 19 + .../kube-openapi/pkg/common/interfaces.go | 88 + .../kube-openapi/pkg/handler3/handler.go | 291 + .../k8s.io/kube-openapi/pkg/internal/flags.go | 20 + .../pkg/internal/handler/handler_cache.go | 57 + .../go-json-experiment/json/AUTHORS | 3 + .../go-json-experiment/json/CONTRIBUTORS | 3 + .../go-json-experiment/json/LICENSE | 27 + .../go-json-experiment/json/README.md | 321 + .../go-json-experiment/json/arshal.go | 506 + .../go-json-experiment/json/arshal_any.go | 219 + .../go-json-experiment/json/arshal_default.go | 1446 +++ .../go-json-experiment/json/arshal_funcs.go | 387 + .../go-json-experiment/json/arshal_inlined.go | 186 + .../go-json-experiment/json/arshal_methods.go | 229 + .../go-json-experiment/json/arshal_time.go | 196 + .../go-json-experiment/json/decode.go | 1655 ++++ .../go-json-experiment/json/doc.go | 185 + .../go-json-experiment/json/encode.go | 1146 +++ .../go-json-experiment/json/errors.go | 183 + .../go-json-experiment/json/fields.go | 509 + .../go-json-experiment/json/fold.go | 56 + .../go-json-experiment/json/intern.go | 86 + .../go-json-experiment/json/pools.go | 150 + .../go-json-experiment/json/state.go | 747 ++ .../go-json-experiment/json/token.go | 522 + .../go-json-experiment/json/value.go | 375 + .../kube-openapi/pkg/openapiconv/convert.go | 322 + .../k8s.io/kube-openapi/pkg/schemaconv/smd.go | 14 + .../kube-openapi/pkg/schemamutation/walker.go | 519 + .../kube-openapi/pkg/spec3/component.go | 47 + .../k8s.io/kube-openapi/pkg/spec3/encoding.go | 64 + .../k8s.io/kube-openapi/pkg/spec3/example.go | 73 + .../pkg/spec3/external_documentation.go | 58 + .../k8s.io/kube-openapi/pkg/spec3/header.go | 90 + .../kube-openapi/pkg/spec3/media_type.go | 66 + .../kube-openapi/pkg/spec3/operation.go | 79 + .../kube-openapi/pkg/spec3/parameter.go | 94 + vendor/k8s.io/kube-openapi/pkg/spec3/path.go | 142 + .../kube-openapi/pkg/spec3/request_body.go | 73 + .../k8s.io/kube-openapi/pkg/spec3/response.go | 203 + .../pkg/spec3/security_requirement.go | 56 + .../kube-openapi/pkg/spec3/security_scheme.go | 118 + .../k8s.io/kube-openapi/pkg/spec3/server.go | 98 + vendor/k8s.io/kube-openapi/pkg/spec3/spec.go | 37 + .../kube-openapi/pkg/util/proto/document.go | 2 +- .../pkg/util/proto/document_v3.go | 324 + .../pkg/validation/spec/.gitignore | 2 + .../kube-openapi/pkg/validation/spec/LICENSE | 202 + .../pkg/validation/spec/contact_info.go | 24 + .../pkg/validation/spec/external_docs.go | 24 + .../kube-openapi/pkg/validation/spec/fuzz.go | 502 + .../pkg/validation/spec/gnostic.go | 1517 +++ .../pkg/validation/spec/header.go | 105 + .../kube-openapi/pkg/validation/spec/info.go | 222 + .../kube-openapi/pkg/validation/spec/items.go | 137 + .../pkg/validation/spec/license.go | 23 + .../pkg/validation/spec/operation.go | 120 + .../pkg/validation/spec/parameter.go | 146 + .../pkg/validation/spec/path_item.go | 105 + .../kube-openapi/pkg/validation/spec/paths.go | 144 + .../kube-openapi/pkg/validation/spec/ref.go | 167 + .../pkg/validation/spec/response.go | 113 + .../pkg/validation/spec/responses.go | 186 + .../pkg/validation/spec/schema.go | 554 ++ .../pkg/validation/spec/security_scheme.go | 82 + .../pkg/validation/spec/swagger.go | 393 + .../kube-openapi/pkg/validation/spec/tag.go | 82 + vendor/k8s.io/utils/clock/clock.go | 10 + .../k8s.io/utils/clock/testing/fake_clock.go | 9 +- vendor/k8s.io/utils/net/ipfamily.go | 181 + vendor/k8s.io/utils/net/net.go | 126 +- vendor/k8s.io/utils/net/port.go | 18 +- vendor/k8s.io/utils/pointer/pointer.go | 290 +- vendor/k8s.io/utils/ptr/OWNERS | 10 + vendor/k8s.io/utils/ptr/README.md | 3 + vendor/k8s.io/utils/ptr/ptr.go | 73 + vendor/k8s.io/utils/strings/slices/slices.go | 82 + vendor/k8s.io/utils/trace/trace.go | 49 +- .../api/clone/v1alpha1/deepcopy_generated.go | 2 +- .../kubevirt.io/api/clone/v1alpha1/types.go | 16 +- .../clone/v1alpha1/types_swagger_generated.go | 7 +- .../api/core/v1/deepcopy_generated.go | 889 +- vendor/kubevirt.io/api/core/v1/doc.go | 5 +- vendor/kubevirt.io/api/core/v1/register.go | 15 +- vendor/kubevirt.io/api/core/v1/schema.go | 131 +- .../api/core/v1/schema_swagger_generated.go | 73 +- vendor/kubevirt.io/api/core/v1/types.go | 547 +- .../api/core/v1/types_swagger_generated.go | 240 +- .../api/core/v1/zz_generated.defaults.go | 2 +- .../api/export/v1alpha1/deepcopy_generated.go | 38 +- .../kubevirt.io/api/export/v1alpha1/types.go | 48 +- .../v1alpha1/types_swagger_generated.go | 30 +- .../kubevirt.io/api/instancetype/register.go | 15 + .../api/instancetype/v1alpha1/conversion.go | 69 + .../v1alpha1/conversion_generated.go | 822 ++ .../v1alpha1/deepcopy_generated.go | 4 +- .../api/instancetype/v1alpha1/doc.go | 2 + .../api/instancetype/v1alpha1/register.go | 2 + .../api/instancetype/v1alpha1/types.go | 2 +- .../v1alpha1/types_swagger_generated.go | 2 +- .../api/instancetype/v1alpha2/conversion.go | 69 + .../v1alpha2/conversion_generated.go | 853 ++ .../v1alpha2/deepcopy_generated.go | 25 +- .../api/instancetype/v1alpha2/doc.go | 2 + .../api/instancetype/v1alpha2/register.go | 2 + .../api/instancetype/v1alpha2/types.go | 18 +- .../v1alpha2/types_swagger_generated.go | 9 +- .../v1beta1/deepcopy_generated.go | 773 ++ .../api/instancetype/v1beta1/doc.go | 24 + .../api/instancetype/v1beta1/register.go | 64 + .../api/instancetype/v1beta1/types.go | 571 ++ .../v1beta1/types_swagger_generated.go | 211 + .../migrations/v1alpha1/deepcopy_generated.go | 2 +- .../api/pool/v1alpha1/deepcopy_generated.go | 2 +- vendor/kubevirt.io/api/pool/v1alpha1/types.go | 7 +- .../snapshot/v1alpha1/deepcopy_generated.go | 33 +- .../api/snapshot/v1alpha1/types.go | 14 + .../v1alpha1/types_swagger_generated.go | 9 + .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../versioned/typed/core/v1beta1/cdi.go | 2 +- .../versioned/typed/core/v1beta1/cdiconfig.go | 2 +- .../typed/core/v1beta1/core_client.go | 17 +- .../typed/core/v1beta1/dataimportcron.go | 2 +- .../typed/core/v1beta1/datasource.go | 2 +- .../typed/core/v1beta1/datavolume.go | 2 +- .../versioned/typed/core/v1beta1/doc.go | 2 +- .../typed/core/v1beta1/generated_expansion.go | 8 +- .../typed/core/v1beta1/objecttransfer.go | 2 +- .../typed/core/v1beta1/storageprofile.go | 2 +- .../typed/core/v1beta1/volumeclonesource.go | 178 + .../typed/core/v1beta1/volumeimportsource.go | 195 + .../typed/core/v1beta1/volumeuploadsource.go | 195 + .../versioned/typed/upload/v1beta1/doc.go | 2 +- .../upload/v1beta1/generated_expansion.go | 2 +- .../typed/upload/v1beta1/upload_client.go | 2 +- .../upload/v1beta1/uploadtokenrequest.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../versioned/typed/volumesnapshot/v1/doc.go | 2 +- .../volumesnapshot/v1/generated_expansion.go | 2 +- .../typed/volumesnapshot/v1/volumesnapshot.go | 2 +- .../v1/volumesnapshot_client.go | 2 +- .../volumesnapshot/v1/volumesnapshotclass.go | 2 +- .../v1/volumesnapshotcontent.go | 2 +- .../kubevirt/clientset/versioned/clientset.go | 16 +- .../kubevirt/clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 18 +- .../typed/clone/v1alpha1/clone_client.go | 2 +- .../versioned/typed/clone/v1alpha1/doc.go | 2 +- .../clone/v1alpha1/generated_expansion.go | 2 +- .../clone/v1alpha1/virtualmachineclone.go | 2 +- .../versioned/typed/export/v1alpha1/doc.go | 2 +- .../typed/export/v1alpha1/export_client.go | 2 +- .../export/v1alpha1/generated_expansion.go | 2 +- .../export/v1alpha1/virtualmachineexport.go | 2 +- .../typed/instancetype/v1alpha1/doc.go | 2 +- .../v1alpha1/generated_expansion.go | 2 +- .../v1alpha1/instancetype_client.go | 2 +- .../virtualmachineclusterinstancetype.go | 2 +- .../virtualmachineclusterpreference.go | 2 +- .../v1alpha1/virtualmachineinstancetype.go | 2 +- .../v1alpha1/virtualmachinepreference.go | 2 +- .../typed/instancetype/v1alpha2/doc.go | 2 +- .../v1alpha2/generated_expansion.go | 2 +- .../v1alpha2/instancetype_client.go | 2 +- .../virtualmachineclusterinstancetype.go | 2 +- .../virtualmachineclusterpreference.go | 2 +- .../v1alpha2/virtualmachineinstancetype.go | 2 +- .../v1alpha2/virtualmachinepreference.go | 2 +- .../typed/instancetype/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go} | 19 +- .../v1beta1/instancetype_client.go | 104 + .../virtualmachineclusterinstancetype.go | 168 + .../virtualmachineclusterpreference.go | 168 + .../v1beta1/virtualmachineinstancetype.go | 178 + .../v1beta1/virtualmachinepreference.go | 178 + .../typed/migrations/v1alpha1/doc.go | 2 +- .../v1alpha1/generated_expansion.go | 2 +- .../migrations/v1alpha1/migrationpolicy.go | 2 +- .../migrations/v1alpha1/migrations_client.go | 2 +- .../versioned/typed/pool/v1alpha1/doc.go | 2 +- .../pool/v1alpha1/generated_expansion.go | 2 +- .../typed/pool/v1alpha1/pool_client.go | 2 +- .../typed/pool/v1alpha1/virtualmachinepool.go | 2 +- .../versioned/typed/snapshot/v1alpha1/doc.go | 2 +- .../snapshot/v1alpha1/generated_expansion.go | 2 +- .../snapshot/v1alpha1/snapshot_client.go | 2 +- .../v1alpha1/virtualmachinerestore.go | 2 +- .../v1alpha1/virtualmachinesnapshot.go | 2 +- .../v1alpha1/virtualmachinesnapshotcontent.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../versioned/typed/k8s.cni.cncf.io/v1/doc.go | 2 +- .../k8s.cni.cncf.io/v1/generated_expansion.go | 2 +- .../v1/k8s.cni.cncf.io_client.go | 2 +- .../v1/networkattachmentdefinition.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 18 +- .../typed/monitoring/v1/alertmanager.go | 4 +- .../versioned/typed/monitoring/v1/doc.go | 2 +- .../monitoring/v1/generated_expansion.go | 4 +- .../typed/monitoring/v1/monitoring_client.go | 9 +- .../typed/monitoring/v1/podmonitor.go | 4 +- .../versioned/typed/monitoring/v1/probe.go | 178 + .../typed/monitoring/v1/prometheus.go | 4 +- .../typed/monitoring/v1/prometheusrule.go | 4 +- .../typed/monitoring/v1/servicemonitor.go | 4 +- .../typed/monitoring/v1/thanosruler.go | 4 +- vendor/kubevirt.io/client-go/kubecli/async.go | 6 +- .../kubecli/generated_mock_kubevirt.go | 554 +- .../kubevirt.io/client-go/kubecli/guestfs.go | 18 +- .../kubevirt.io/client-go/kubecli/handler.go | 116 +- .../client-go/kubecli/instancetype.go | 16 +- .../kubevirt.io/client-go/kubecli/kubecli.go | 91 +- .../kubevirt.io/client-go/kubecli/kubevirt.go | 127 +- vendor/kubevirt.io/client-go/kubecli/kv.go | 4 +- .../client-go/kubecli/migration.go | 10 +- .../kubevirt.io/client-go/kubecli/profiler.go | 8 +- .../client-go/kubecli/replicaset.go | 4 +- .../kubevirt.io/client-go/kubecli/version.go | 16 +- vendor/kubevirt.io/client-go/kubecli/vm.go | 95 +- vendor/kubevirt.io/client-go/kubecli/vmi.go | 153 +- .../client-go/kubecli/vmipreset.go | 10 +- vendor/kubevirt.io/client-go/log/log.go | 88 +- vendor/kubevirt.io/client-go/util/util.go | 3 +- .../pkg/apis/core/v1beta1/authorize.go | 162 + .../pkg/apis/core/v1beta1/authorize_utils.go | 351 + .../pkg/apis/core/v1beta1/register.go | 8 +- .../pkg/apis/core/v1beta1/types.go | 213 +- .../core/v1beta1/types_swagger_generated.go | 126 +- .../pkg/apis/core/v1beta1/utils.go | 18 + .../core/v1beta1/zz_generated.deepcopy.go | 408 + vendor/modules.txt | 185 +- .../internal/golang/encoding/json/decode.go | 90 +- .../internal/golang/encoding/json/encode.go | 71 +- .../internal/golang/encoding/json/fold.go | 5 +- .../internal/golang/encoding/json/fuzz.go | 9 +- .../golang/encoding/json/kubernetes_patch.go | 69 +- .../internal/golang/encoding/json/scanner.go | 4 +- .../internal/golang/encoding/json/stream.go | 9 +- .../internal/golang/encoding/json/tags.go | 16 +- vendor/sigs.k8s.io/json/json.go | 39 +- .../v4/schema/elements.go | 134 +- .../structured-merge-diff/v4/schema/equals.go | 3 + .../v4/schema/schemaschema.go | 5 +- .../structured-merge-diff/v4/typed/helpers.go | 6 +- .../structured-merge-diff/v4/typed/merge.go | 18 +- .../v4/typed/reconcile_schema.go | 2 +- .../structured-merge-diff/v4/typed/typed.go | 20 +- .../v4/typed/validate.go | 6 + .../v4/value/mapreflect.go | 2 +- .../v4/value/mapunstructured.go | 8 +- .../v4/value/reflectcache.go | 4 +- 1287 files changed, 148622 insertions(+), 22423 deletions(-) delete mode 100644 vendor/github.com/coreos/prometheus-operator/NOTICE delete mode 100644 vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go delete mode 100644 vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/crd_kinds.go delete mode 100644 vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go delete mode 100644 vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go create mode 100644 vendor/github.com/go-kit/log/.gitignore create mode 100644 vendor/github.com/go-kit/log/LICENSE create mode 100644 vendor/github.com/go-kit/log/README.md create mode 100644 vendor/github.com/go-kit/log/doc.go create mode 100644 vendor/github.com/go-kit/log/json_logger.go create mode 100644 vendor/github.com/go-kit/log/log.go create mode 100644 vendor/github.com/go-kit/log/logfmt_logger.go create mode 100644 vendor/github.com/go-kit/log/nop_logger.go create mode 100644 vendor/github.com/go-kit/log/staticcheck.conf create mode 100644 vendor/github.com/go-kit/log/stdlib.go create mode 100644 vendor/github.com/go-kit/log/sync.go create mode 100644 vendor/github.com/go-kit/log/value.go delete mode 100644 vendor/github.com/go-logfmt/logfmt/.travis.yml create mode 100644 vendor/github.com/go-openapi/jsonpointer/.editorconfig create mode 100644 vendor/github.com/go-openapi/jsonpointer/.gitignore create mode 100644 vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-openapi/jsonpointer/LICENSE create mode 100644 vendor/github.com/go-openapi/jsonpointer/README.md create mode 100644 vendor/github.com/go-openapi/jsonpointer/pointer.go create mode 100644 vendor/github.com/go-openapi/jsonreference/.gitignore create mode 100644 vendor/github.com/go-openapi/jsonreference/.golangci.yml create mode 100644 vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-openapi/jsonreference/LICENSE create mode 100644 vendor/github.com/go-openapi/jsonreference/README.md create mode 100644 vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go create mode 100644 vendor/github.com/go-openapi/jsonreference/reference.go create mode 100644 vendor/github.com/go-openapi/swag/.editorconfig create mode 100644 vendor/github.com/go-openapi/swag/.gitattributes create mode 100644 vendor/github.com/go-openapi/swag/.gitignore create mode 100644 vendor/github.com/go-openapi/swag/.golangci.yml create mode 100644 vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-openapi/swag/LICENSE create mode 100644 vendor/github.com/go-openapi/swag/README.md create mode 100644 vendor/github.com/go-openapi/swag/convert.go create mode 100644 vendor/github.com/go-openapi/swag/convert_types.go create mode 100644 vendor/github.com/go-openapi/swag/doc.go create mode 100644 vendor/github.com/go-openapi/swag/file.go create mode 100644 vendor/github.com/go-openapi/swag/json.go create mode 100644 vendor/github.com/go-openapi/swag/loading.go create mode 100644 vendor/github.com/go-openapi/swag/name_lexem.go create mode 100644 vendor/github.com/go-openapi/swag/net.go create mode 100644 vendor/github.com/go-openapi/swag/path.go create mode 100644 vendor/github.com/go-openapi/swag/post_go18.go create mode 100644 vendor/github.com/go-openapi/swag/post_go19.go create mode 100644 vendor/github.com/go-openapi/swag/pre_go18.go create mode 100644 vendor/github.com/go-openapi/swag/pre_go19.go create mode 100644 vendor/github.com/go-openapi/swag/split.go create mode 100644 vendor/github.com/go-openapi/swag/util.go create mode 100644 vendor/github.com/go-openapi/swag/yaml.go create mode 100644 vendor/github.com/golang/glog/glog_flags.go create mode 100644 vendor/github.com/golang/glog/internal/logsink/logsink.go create mode 100644 vendor/github.com/golang/glog/internal/logsink/logsink_fatal.go create mode 100644 vendor/github.com/golang/glog/internal/stackdump/stackdump.go rename vendor/github.com/{googleapis => google}/gnostic/LICENSE (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/context.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/error.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/extensions.go (97%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/helpers.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/main.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/reader.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/extension.pb.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/extension.proto (100%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/extensions.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/base.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/display.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/models.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/operations.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/reader.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/schema.json (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/writer.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/OpenAPIv2.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/OpenAPIv2.pb.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/OpenAPIv2.proto (100%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/document.go (96%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/openapi-2.0.json (100%) create mode 100644 vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go create mode 100644 vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go create mode 100644 vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto create mode 100644 vendor/github.com/google/gnostic/openapiv3/README.md create mode 100644 vendor/github.com/google/gnostic/openapiv3/document.go create mode 100644 vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json create mode 100644 vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json create mode 100644 vendor/github.com/google/gofuzz/bytesource/bytesource.go delete mode 100644 vendor/github.com/google/uuid/.travis.yml create mode 100644 vendor/github.com/google/uuid/CHANGELOG.md create mode 100644 vendor/github.com/google/uuid/null.go create mode 100644 vendor/github.com/imdario/mergo/CONTRIBUTING.md create mode 100644 vendor/github.com/imdario/mergo/SECURITY.md create mode 100644 vendor/github.com/josharian/intern/README.md create mode 100644 vendor/github.com/josharian/intern/intern.go create mode 100644 vendor/github.com/josharian/intern/license.md create mode 100644 vendor/github.com/mailru/easyjson/LICENSE create mode 100644 vendor/github.com/mailru/easyjson/buffer/pool.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/bytestostr.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/error.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/lexer.go create mode 100644 vendor/github.com/mailru/easyjson/jwriter/writer.go create mode 100644 vendor/github.com/munnerz/goautoneg/LICENSE create mode 100644 vendor/github.com/munnerz/goautoneg/Makefile create mode 100644 vendor/github.com/munnerz/goautoneg/README.txt create mode 100644 vendor/github.com/munnerz/goautoneg/autoneg.go create mode 100644 vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion-CustomNoUpgrade.crd.yaml rename vendor/github.com/openshift/api/config/v1/{0000_00_cluster-version-operator_01_clusterversion.crd.yaml => 0000_00_cluster-version-operator_01_clusterversion-Default.crd.yaml} (79%) create mode 100644 vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion-TechPreviewNoUpgrade.crd.yaml rename vendor/github.com/openshift/api/config/v1/{0000_10_config-operator_01_apiserver.crd.yaml => 0000_10_config-operator_01_apiserver-CustomNoUpgrade.crd.yaml} (80%) create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-Default.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd-CustomNoUpgrade.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd-TechPreviewNoUpgrade.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns-CustomNoUpgrade.crd.yaml rename vendor/github.com/openshift/api/config/v1/{0000_10_config-operator_01_dns.crd.yaml => 0000_10_config-operator_01_dns-Default.crd.yaml} (68%) create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns-TechPreviewNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagedigestmirrorset.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagetagmirrorset.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-CustomNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-CustomNoUpgrade.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml-patch delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network-CustomNoUpgrade.crd.yaml rename vendor/github.com/openshift/api/config/v1/{0000_10_config-operator_01_network.crd.yaml => 0000_10_config-operator_01_network-Default.crd.yaml} (99%) create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network-TechPreviewNoUpgrade.crd.yaml rename vendor/github.com/openshift/api/config/v1/{0000_10_config-operator_01_build.crd.yaml => 0000_10_openshift-controller-manager-operator_01_build.crd.yaml} (90%) create mode 100644 vendor/github.com/openshift/api/config/v1/Makefile create mode 100644 vendor/github.com/openshift/api/config/v1/custom.apiserver.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.authentication.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.clusterversion.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.dns.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.infrastructure.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.network.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/feature_gates.go create mode 100644 vendor/github.com/openshift/api/config/v1/stable.apiserver.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.authentication.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.build.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.clusteroperator.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.clusterversion.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.console.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.dns.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.featuregate.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.image.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.imagecontentpolicy.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.imagedigestmirrorset.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.imagetagmirrorset.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.infrastructure.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.ingress.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.network.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.node.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.oauth.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.operatorhub.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.project.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.proxy.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.scheduler.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.apiserver.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.authentication.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.clusterversion.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.dns.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.infrastructure.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.network.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/Makefile create mode 100644 vendor/github.com/openshift/api/route/v1/custom.route.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/route-CustomNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/route-TechPreviewNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/route.crd.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/route.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/route/v1/stable.route.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/techpreview.route.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/test-route-validation.sh create mode 100644 vendor/github.com/openshift/api/security/v1/Makefile create mode 100644 vendor/github.com/openshift/api/security/v1/stable.securitycontextconstraints.testsuite.yaml create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/internal/internal.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/localobjectreference.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/route.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routehttpheader.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routehttpheaderactions.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routehttpheaderactionunion.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routehttpheaders.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routeingress.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routeingresscondition.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routeport.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routesethttpheader.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routespec.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routestatus.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/routetargetreference.go create mode 100644 vendor/github.com/openshift/client-go/route/applyconfigurations/route/v1/tlsconfig.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/internal/internal.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/allowedflexvolume.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/fsgroupstrategyoptions.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/idrange.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/rangeallocation.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/runasuserstrategyoptions.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/securitycontextconstraints.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/selinuxcontextstrategyoptions.go create mode 100644 vendor/github.com/openshift/client-go/security/applyconfigurations/security/v1/supplementalgroupsstrategyoptions.go create mode 100644 vendor/github.com/openshift/library-go/pkg/crypto/OWNERS rename vendor/github.com/{coreos/prometheus-operator => prometheus-operator/prometheus-operator/pkg/apis/monitoring}/LICENSE (100%) rename vendor/github.com/{coreos => prometheus-operator}/prometheus-operator/pkg/apis/monitoring/register.go (100%) create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/resource.go create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/alertmanager_types.go rename vendor/github.com/{coreos => prometheus-operator}/prometheus-operator/pkg/apis/monitoring/v1/doc.go (100%) create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/podmonitor_types.go create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/probe_types.go create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/prometheus_types.go create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/prometheusrule_types.go rename vendor/github.com/{coreos => prometheus-operator}/prometheus-operator/pkg/apis/monitoring/v1/register.go (95%) create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/servicemonitor_types.go rename vendor/github.com/{coreos => prometheus-operator}/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go (61%) create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/types.go create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go create mode 100644 vendor/golang.org/x/net/internal/socks/client.go create mode 100644 vendor/golang.org/x/net/internal/socks/socks.go create mode 100644 vendor/golang.org/x/net/proxy/dial.go create mode 100644 vendor/golang.org/x/net/proxy/direct.go create mode 100644 vendor/golang.org/x/net/proxy/per_host.go create mode 100644 vendor/golang.org/x/net/proxy/proxy.go create mode 100644 vendor/golang.org/x/net/proxy/socks5.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication/v1alpha1 => api/apidiscovery/v2beta1}/doc.go (68%) create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/register.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/types.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/generated.proto rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication => api/authentication}/v1alpha1/register.go (75%) create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/doc.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/generated.pb.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/generated.proto create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/register.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/types.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/networking/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication => api/networking}/v1alpha1/zz_generated.deepcopy.go (51%) create mode 100644 vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/resource/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/allocator.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/ordered.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/set.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/admissionpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/matchresources.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/namedrulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramkind.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramref.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/rule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/rulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicybinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicybindingspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validation.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetordinals.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetordinals.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetordinals.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonexitcodesrequirement.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonpodconditionspattern.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/claimsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podresourceclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podschedulinggate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/typedobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressloadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressloadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressportstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicystatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowdistinguishermethod.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschema.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschemacondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschemaspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschemastatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/groupsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/limitedprioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/limitresponse.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/nonresourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/policyruleswithsubjects.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/queuingconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/resourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/serviceaccountsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/usersubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/groupversionkind.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/listmeta.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/status.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/statuscause.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/statusdetails.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressloadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressloadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressportstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicystatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidr.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidrspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressloadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressloadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressportstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/allocationresult.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podscheduling.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podschedulingspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podschedulingstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimconsumerreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimparametersreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimschedulingstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimtemplatespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclassparametersreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/discovery/aggregated_discovery.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_admissionregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_validatingadmissionpolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_validatingadmissionpolicybinding.go rename vendor/k8s.io/client-go/{pkg/apis/clientauthentication/v1alpha1/conversion.go => kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go} (51%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/validatingadmissionpolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/validatingadmissionpolicybinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/authentication_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake/fake_authentication_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake/fake_selfsubjectreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/selfsubjectreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/fake_flowcontrol_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/fake_flowschema.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/fake_prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/flowcontrol_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/flowschema.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/clustercidr.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/fake/fake_clustercidr.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/fake/fake_networking_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/networking_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_podscheduling.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resource_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resourceclaim.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resourceclass.go rename vendor/k8s.io/client-go/{pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go => kubernetes/typed/resource/v1alpha1/generated_expansion.go} (57%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/podscheduling.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resource_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/openapi/client.go create mode 100644 vendor/k8s.io/client-go/openapi/groupversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/version/.gitattributes create mode 100644 vendor/k8s.io/client-go/tools/cache/retry_with_deadline.go create mode 100644 vendor/k8s.io/client-go/transport/cache_go118.go create mode 100644 vendor/k8s.io/klog/v2/contextual.go create mode 100644 vendor/k8s.io/klog/v2/exit.go create mode 100644 vendor/k8s.io/klog/v2/format.go rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication/v1/conversion.go => klog/v2/imports.go} (53%) create mode 100644 vendor/k8s.io/klog/v2/internal/buffer/buffer.go create mode 100644 vendor/k8s.io/klog/v2/internal/clock/README.md create mode 100644 vendor/k8s.io/klog/v2/internal/clock/clock.go create mode 100644 vendor/k8s.io/klog/v2/internal/dbg/dbg.go create mode 100644 vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go create mode 100644 vendor/k8s.io/klog/v2/internal/severity/severity.go create mode 100644 vendor/k8s.io/klog/v2/k8s_references.go create mode 100644 vendor/k8s.io/klog/v2/klogr.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/builder3/util/util.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/common/common.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/common/doc.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/common/interfaces.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/handler3/handler.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/flags.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/handler/handler_cache.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/AUTHORS create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/CONTRIBUTORS create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/LICENSE create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/README.md create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_funcs.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/doc.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/errors.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/fields.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/fold.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/intern.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/pools.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/state.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/token.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/openapiconv/convert.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/schemamutation/walker.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/component.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/example.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/header.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/operation.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/path.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/response.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/security_requirement.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/security_scheme.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/server.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/spec.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/util/proto/document_v3.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/.gitignore create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/LICENSE create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/contact_info.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/external_docs.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/fuzz.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/gnostic.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/license.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go create mode 100644 vendor/k8s.io/utils/net/ipfamily.go create mode 100644 vendor/k8s.io/utils/ptr/OWNERS create mode 100644 vendor/k8s.io/utils/ptr/README.md create mode 100644 vendor/k8s.io/utils/ptr/ptr.go create mode 100644 vendor/k8s.io/utils/strings/slices/slices.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha1/conversion.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha1/conversion_generated.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha2/conversion.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha2/conversion_generated.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/deepcopy_generated.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/doc.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/register.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/types.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/types_swagger_generated.go create mode 100644 vendor/kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned/typed/core/v1beta1/volumeclonesource.go create mode 100644 vendor/kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned/typed/core/v1beta1/volumeimportsource.go create mode 100644 vendor/kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned/typed/core/v1beta1/volumeuploadsource.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/doc.go rename vendor/{k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go => kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/generated_expansion.go} (51%) create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/instancetype_client.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachineclusterinstancetype.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachineclusterpreference.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachineinstancetype.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachinepreference.go create mode 100644 vendor/kubevirt.io/client-go/generated/prometheus-operator/clientset/versioned/typed/monitoring/v1/probe.go create mode 100644 vendor/kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1/authorize.go create mode 100644 vendor/kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1/authorize_utils.go diff --git a/go.mod b/go.mod index db417ef5..e0e77c41 100644 --- a/go.mod +++ b/go.mod @@ -9,45 +9,52 @@ require ( github.com/golang/mock v1.6.0 github.com/onsi/ginkgo/v2 v2.12.1 github.com/onsi/gomega v1.28.0 - github.com/openshift/api v0.0.0-20220504105152-6f735e7109c8 - github.com/openshift/library-go v0.0.0-20220523142556-5bcfed822fc6 - k8s.io/api v0.23.5 - k8s.io/apimachinery v0.23.5 + github.com/openshift/api v0.0.0-20240111203005-e04828eaf17a // release-4.15 + github.com/openshift/library-go v0.0.0-20240111120724-db0c36cd2185 // release-4.15 + k8s.io/api v0.28.2 + k8s.io/apimachinery v0.28.2 k8s.io/client-go v12.0.0+incompatible - k8s.io/utils v0.0.0-20211116205334-6203023598ed - kubevirt.io/api v0.58.0 - kubevirt.io/client-go v0.58.0 + k8s.io/utils v0.0.0-20230726121419-3b25d923346b + kubevirt.io/api v1.1.1 + kubevirt.io/client-go v1.1.0-rc.0.0.20240111173838-304cdf11f9c4 // TODO: update to a tag, once it is released sigs.k8s.io/yaml v1.3.0 ) require ( - github.com/coreos/prometheus-operator v0.38.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/go-kit/kit v0.9.0 // indirect - github.com/go-logfmt/logfmt v0.5.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang/glog v1.1.0 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/google/uuid v1.1.2 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/imdario/mergo v0.3.10 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111 // indirect github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/openshift/client-go v0.0.0-20220504114320-6aec01bb0754 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/openshift/client-go v0.0.0-20230926161409-848405da69e1 // indirect github.com/openshift/custom-resource-status v1.1.2 // indirect - github.com/pborman/uuid v1.2.0 // indirect + github.com/pborman/uuid v1.2.1 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.68.0 // indirect github.com/spf13/pflag v1.0.5 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect @@ -56,19 +63,26 @@ require ( golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.0 // indirect - google.golang.org/appengine v1.6.7 // indirect + google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.23.5 // indirect - k8s.io/apiserver v0.23.5 // indirect - k8s.io/klog/v2 v2.40.1 // indirect - k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf // indirect - kubevirt.io/containerized-data-importer-api v1.50.0 // indirect + k8s.io/apiextensions-apiserver v0.28.2 // indirect + k8s.io/apiserver v0.28.2 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f // indirect + kubevirt.io/containerized-data-importer-api v1.57.0-alpha1 // indirect kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 // indirect - sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect ) -replace k8s.io/client-go => k8s.io/client-go v0.23.5 +// Replacing these versions because kubevirt.io/client-go requires it. +replace ( + k8s.io/api => k8s.io/api v0.26.4 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.26.4 + k8s.io/apimachinery => k8s.io/apimachinery v0.26.4 + k8s.io/client-go => k8s.io/client-go v0.26.4 + k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 +) diff --git a/go.sum b/go.sum index 320dd268..d77d5a89 100644 --- a/go.sum +++ b/go.sum @@ -5,7 +5,6 @@ cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6A cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.49.0/go.mod h1:hGvAdzcWNbyuxS3nWhD7H2cIJxjRRTRLQVB0bdputVY= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= @@ -14,11 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -27,307 +21,99 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.3.0/go.mod h1:9IAwXhoyBJ7z9LcAwkj0/7NnPzYaPeZxxVp3zm+5IqA= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v36.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3-0.20191028180845-3492b2aff503/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/aliyun/aliyun-oss-go-sdk v2.0.4+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= -github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= -github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/prometheus-operator v0.38.0 h1:gF2xYIfO09XLFdyEecND46uihQ2KTaDwTozRZpXLtN4= -github.com/coreos/prometheus-operator v0.38.0/go.mod h1:xZC7/TgeC0/mBaJk+1H9dbHaiEvLYHgX6Mi1h40UPh8= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= -github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= -github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/go-sysinfo v1.0.1/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= -github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.10.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -335,12 +121,9 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -351,10 +134,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -368,19 +149,15 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -388,156 +165,68 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.0.0-20171009183408-7fe0c75c13ab/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jsonnet-bundler/jsonnet-bundler v0.2.0/go.mod h1:/by7P/OoohkI3q4CgSFqcoFsVY+IaNbzOVDknEsKDeU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111 h1:Lq6HJa0JqSg5ko/mkizFWlpIrY7845g9Dzz9qeD5aXI= github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111/go.mod h1:MP2HbArq3QT+oVp8pmtHNZnSnkhdkHtDnc7h6nJXmBU= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -545,263 +234,93 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 h1:nHHjmvjitIiyPlUHk/ofpgvBcNcawJLtf4PYHORLjAA= github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4DoEeDndqvAn6eeu0vWM7QdXmHEeI9cFWplmBys= -github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.0/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mozillazg/go-cos v0.13.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= -github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v0.0.0-20170117200651-66bb6560562f/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/ginkgo/v2 v2.12.1 h1:uHNEO1RP2SpuZApSkel9nEh1/Mu+hmQe7Q+Pepg5OYA= github.com/onsi/ginkgo/v2 v2.12.1/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c= github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8= -github.com/openshift/api v0.0.0-20220504105152-6f735e7109c8 h1:/gMlLRp6nql6uWl0x3Hx81Cm3sE8xtdj7P2iCriBLXs= -github.com/openshift/api v0.0.0-20220504105152-6f735e7109c8/go.mod h1:F/eU6jgr6Q2VhMu1mSpMmygxAELd7+BUxs3NHZ25jV4= -github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20220504114320-6aec01bb0754 h1:E/SORtM8rYRq5vp7zlSyxUeH1v71QZAFXW7FkAggw0Q= -github.com/openshift/client-go v0.0.0-20220504114320-6aec01bb0754/go.mod h1:0KyRH70L+vAGs8wkOkqbsE9qR4lgjW2ugJsCzl1nj5w= +github.com/openshift/api v0.0.0-20240111203005-e04828eaf17a h1:JL3YJbwcvd1hK13GiWvZdWPj7PX3ZLqNTZ2AIulrxO8= +github.com/openshift/api v0.0.0-20240111203005-e04828eaf17a/go.mod h1:qNtV0315F+f8ld52TLtPvrfivZpdimOzTi3kn9IVbtU= +github.com/openshift/client-go v0.0.0-20230926161409-848405da69e1 h1:W1N/3nVciqmjPjn2xldHjb0AwwCQzlGxLvX5BCgE8H4= +github.com/openshift/client-go v0.0.0-20230926161409-848405da69e1/go.mod h1:ihUJrhBcYAGYQrJu/gP2OMgfVds5f5z5kbeLNBqjHLo= github.com/openshift/custom-resource-status v1.1.2 h1:C3DL44LEbvlbItfd8mT5jWrqPfHnSOQoQf/sypqA6A4= github.com/openshift/custom-resource-status v1.1.2/go.mod h1:DB/Mf2oTeiAmVVX1gN+NEqweonAPY0TKUwADizj8+ZA= -github.com/openshift/library-go v0.0.0-20220523142556-5bcfed822fc6 h1:HSmUjhgHhwxdNPvq8xPf19BV67wf1GIepefPOl7dsIU= -github.com/openshift/library-go v0.0.0-20220523142556-5bcfed822fc6/go.mod h1:1QSdymJBGXSOgBj7tWhj4cV+i1+AvkQ/Tq78ebWjXCU= -github.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw= -github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/openshift/library-go v0.0.0-20240111120724-db0c36cd2185 h1:Bx3sVfchfkjfEH5gE/GWY/JNDHb9OFexA5nUPh2oOg8= +github.com/openshift/library-go v0.0.0-20240111120724-db0c36cd2185/go.mod h1:0q1UIvboZXfSlUaK+08wsXYw4N6OUo2b/z3a1EWNGyw= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= -github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.2.0/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= -github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.68.0 h1:yl9ceUSUBo9woQIO+8eoWpcxZkdZgm89g+rVvu37TUw= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.68.0/go.mod h1:9Uuu3pEU2jB8PwuqkHvegQ0HV/BlZRJUyfTYAqfdVF8= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -github.com/prometheus/prometheus v1.8.2-0.20200110114423-1e64d757f711/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= -github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= -github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/uber/jaeger-client-go v2.20.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -809,79 +328,21 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.elastic.co/apm v1.5.0/go.mod h1:OdB9sPtM6Vt7oz3VXt7+KR96i9li74qrxBGHTQygFvk= -go.elastic.co/apm/module/apmhttp v1.5.0/go.mod h1:1FbmNuyD3ddauwzgVwFB0fqY6KbZt3JkV187tGCYYhY= -go.elastic.co/apm/module/apmot v1.5.0/go.mod h1:d2KYwhJParTpyw2WnTNy8geNlHKKFX+4oK3YLlsesWE= -go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -906,8 +367,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -916,42 +375,28 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -968,22 +413,19 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -992,16 +434,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1013,52 +446,26 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1072,75 +479,57 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190118193359-16909d206f00/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1152,22 +541,12 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190918214516-5a1a30219888/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191111182352-50fa39b762bc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1188,7 +567,6 @@ golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1197,19 +575,14 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1219,7 +592,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1236,12 +608,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1249,19 +615,17 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1275,40 +639,19 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1317,16 +660,6 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1340,51 +673,35 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1392,87 +709,45 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -k8s.io/api v0.0.0-20181115043458-b799cb063522/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58= -k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= -k8s.io/api v0.0.0-20191115095533-47f6de673b26/go.mod h1:iA/8arsvelvo4IDqIhX4IbjTEKBGgvsf2OraTuRtLFU= -k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= -k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= -k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg= -k8s.io/api v0.23.3/go.mod h1:w258XdGyvCmnBj/vGzQMj6kzdufJZVUwEM1U2fRJwSQ= -k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA= -k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= -k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= -k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= -k8s.io/apiextensions-apiserver v0.23.5 h1:5SKzdXyvIJKu+zbfPc3kCbWpbxi+O+zdmAJBm26UJqI= -k8s.io/apiextensions-apiserver v0.23.5/go.mod h1:ntcPWNXS8ZPKN+zTXuzYMeg731CP0heCTl6gYBxLcuQ= -k8s.io/apimachinery v0.0.0-20181110190943-2a7c93004028/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8= -k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= -k8s.io/apimachinery v0.0.0-20191115015347-3c7067801da2/go.mod h1:dXFS2zaQR8fyzuvRdJDHw2Aerij/yVGJSre0bZQSVJA= -k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc= -k8s.io/apimachinery v0.23.3/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0= -k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= -k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= -k8s.io/apiserver v0.23.5 h1:2Ly8oUjz5cnZRn1YwYr+aFgDZzUmEVL9RscXbnIeDSE= -k8s.io/apiserver v0.23.5/go.mod h1:7wvMtGJ42VRxzgVI7jkbKvMbuCbVbgsWFT7RyXiRNTw= -k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8= -k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= +k8s.io/api v0.26.4 h1:qSG2PmtcD23BkYiWfoYAcak870eF/hE7NNYBYavTT94= +k8s.io/api v0.26.4/go.mod h1:WwKEXU3R1rgCZ77AYa7DFksd9/BAIKyOmRlbVxgvjCk= +k8s.io/apiextensions-apiserver v0.26.4 h1:9D2RTxYGxrG5uYg6D7QZRcykXvavBvcA59j5kTaedQI= +k8s.io/apiextensions-apiserver v0.26.4/go.mod h1:cd4uGFGIgzEqUghWpRsr9KE8j2KNTjY8Ji8pnMMazyw= +k8s.io/apimachinery v0.26.4 h1:rZccKdBLg9vP6J09JD+z8Yr99Ce8gk3Lbi9TCx05Jzs= +k8s.io/apimachinery v0.26.4/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apiserver v0.28.2 h1:rBeYkLvF94Nku9XfXyUIirsVzCzJBs6jMn3NWeHieyI= +k8s.io/apiserver v0.28.2/go.mod h1:f7D5e8wH8MWcKD7azq6Csw9UN+CjdtXIVQUyUhrtb+E= +k8s.io/client-go v0.26.4 h1:/7P/IbGBuT73A+G97trf44NTPSNqvuBREpOfdLbHvD4= +k8s.io/client-go v0.26.4/go.mod h1:6qOItWm3EwxJdl/8p5t7FWtWUOwyMdA8N9ekbW4idpI= k8s.io/code-generator v0.0.0-20181114232248-ae218e241252/go.mod h1:IPqxl/YHk05nodzupwjke6ctMjyNRdV2zZ5/j3/F204= -k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= -k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.23.0/go.mod h1:vQvOhDXhuzqiVfM/YHp+dmg10WDZCchJVObc9MvowsE= k8s.io/code-generator v0.23.3/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= -k8s.io/component-base v0.17.3/go.mod h1:GeQf4BrgelWm64PXkIXiPh/XS0hnO42d9gx9BtbZRp8= -k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0= k8s.io/gengo v0.0.0-20181106084056-51747d6e00da/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190907103519-ebc107f98eab/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.0.0-20190306015804-8e90cee79f82/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20181114233023-0317810137be/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf h1:M9XBsiMslw2lb2ZzglC0TOkBPK5NQi0/noUrdnoFwUg= -k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -kubevirt.io/api v0.58.0 h1:qeNeRtD6AIJ5WVJuRXajmmXtnrO5dYchy+hpCm6QwhE= -kubevirt.io/api v0.58.0/go.mod h1:U0CQlZR0JoJCaC+Va0wz4dMOtYDdVywJ98OT1KmOkzI= -kubevirt.io/client-go v0.58.0 h1:O7d0Tvd1pCmP02eTjIWgmmeRXkOpiH7gQvlhcHX9ssQ= -kubevirt.io/client-go v0.58.0/go.mod h1:ub/ysUi/FiuLLh6cv97Q0D9TVby/B4JpRJP0Dj9EAsw= -kubevirt.io/containerized-data-importer-api v1.50.0 h1:O01F8L5K8qRLnkYICIfmAu0dU0P48jdO42uFPElht38= -kubevirt.io/containerized-data-importer-api v1.50.0/go.mod h1:yjD8pGZVMCeqcN46JPUQdZ2JwRVoRCOXrTVyNuFvrLo= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +kubevirt.io/api v1.1.1 h1:vt5bOpACArNFIudx1bcE1VeejQdh5wCd7Oz/uFBIkH8= +kubevirt.io/api v1.1.1/go.mod h1:CJ4vZsaWhVN3jNbyc9y3lIZhw8nUHbWjap0xHABQiqc= +kubevirt.io/client-go v1.1.0-rc.0.0.20240111173838-304cdf11f9c4 h1:guVhaJdG2pJd9AcuCforjwLp4OPS22PjBF410kBtanE= +kubevirt.io/client-go v1.1.0-rc.0.0.20240111173838-304cdf11f9c4/go.mod h1:COM8j0+8VR/EIW0T5R5MclTLyANH0KgrOCZDk6l6ZRc= +kubevirt.io/containerized-data-importer-api v1.57.0-alpha1 h1:IWo12+ei3jltSN5jQN1xjgakfvRSF3G3Rr4GXVOOy2I= +kubevirt.io/containerized-data-importer-api v1.57.0-alpha1/go.mod h1:Y/8ETgHS1GjO89bl682DPtQOYEU/1ctPFBz6Sjxm4DM= kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 h1:QMrd0nKP0BGbnxTqakhDZAUhGKxPiPiN5gSDqKUmGGc= kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90/go.mod h1:018lASpFYBsYN6XwmA2TIrPCx6e0gviTd/ZNtSitKgc= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -1483,18 +758,13 @@ modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= -sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/pkg/console/service/service.go b/pkg/console/service/service.go index e2b48028..50d081b9 100644 --- a/pkg/console/service/service.go +++ b/pkg/console/service/service.go @@ -63,7 +63,7 @@ func (s *service) TokenHandler(request *restful.Request, response *restful.Respo return } - vm, err := s.kubevirtClient.VirtualMachine(params.namespace).Get(params.name, &metav1.GetOptions{}) + vm, err := s.kubevirtClient.VirtualMachine(params.namespace).Get(request.Request.Context(), params.name, &metav1.GetOptions{}) if err != nil { if errors.IsNotFound(err) { _ = response.WriteError(http.StatusNotFound, fmt.Errorf("VirtualMachine does not exist: %w", err)) diff --git a/pkg/console/service/service_test.go b/pkg/console/service/service_test.go index c837c223..01b59432 100644 --- a/pkg/console/service/service_test.go +++ b/pkg/console/service/service_test.go @@ -72,8 +72,8 @@ var _ = Describe("Service", func() { } vmInterface = kubecli.NewMockVirtualMachineInterface(ctrl) - vmInterface.EXPECT().Get(testName, gomock.Any()).DoAndReturn( - func(_ string, _ any) (*v1.VirtualMachine, error) { + vmInterface.EXPECT().Get(gomock.Any(), testName, gomock.Any()).DoAndReturn( + func(_ any, _ string, _ any) (*v1.VirtualMachine, error) { if testVm != nil { return testVm, nil } diff --git a/tests/proxy_test.go b/tests/proxy_test.go index aeb85075..c18c46c3 100644 --- a/tests/proxy_test.go +++ b/tests/proxy_test.go @@ -10,6 +10,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" rbac "k8s.io/api/rbac/v1" + "k8s.io/utils/ptr" "github.com/golang-jwt/jwt/v4" authnv1 "k8s.io/api/authentication/v1" @@ -96,18 +97,18 @@ var _ = Describe("Kubevirt proxy", func() { BeforeEach(func() { vm := testVm("test-vm-") - vm, err := ApiClient.VirtualMachine(testNamespace).Create(vm) + vm, err := ApiClient.VirtualMachine(testNamespace).Create(context.Background(), vm) Expect(err).ToNot(HaveOccurred()) DeferCleanup(func() { - err := ApiClient.VirtualMachine(testNamespace).Delete(vm.Name, &metav1.DeleteOptions{}) + err := ApiClient.VirtualMachine(testNamespace).Delete(context.Background(), vm.Name, &metav1.DeleteOptions{}) if err != nil && !errors.IsNotFound(err) { Expect(err).ToNot(HaveOccurred()) } }) Eventually(func() error { - _, err := ApiClient.VirtualMachineInstance(vm.Namespace).Get(vm.Name, &metav1.GetOptions{}) + _, err := ApiClient.VirtualMachineInstance(vm.Namespace).Get(context.Background(), vm.Name, &metav1.GetOptions{}) return err }, 10*time.Minute, time.Second).Should(Succeed()) @@ -154,11 +155,11 @@ var _ = Describe("Kubevirt proxy", func() { It("should be able to access VMI/vnc endpoint using token", func() { vm := testVm("test-vm-") vm.Spec.Running = pointer.Bool(false) - vm, err := ApiClient.VirtualMachine(testNamespace).Create(vm) + vm, err := ApiClient.VirtualMachine(testNamespace).Create(context.Background(), vm) Expect(err).ToNot(HaveOccurred()) DeferCleanup(func() { - err := ApiClient.VirtualMachine(testNamespace).Delete(vm.Name, &metav1.DeleteOptions{}) + err := ApiClient.VirtualMachine(testNamespace).Delete(context.Background(), vm.Name, &metav1.DeleteOptions{}) if err != nil && !errors.IsNotFound(err) { Expect(err).ToNot(HaveOccurred()) } @@ -233,7 +234,7 @@ func testVm(namePrefix string) *kubevirtcorev1.VirtualMachine { Namespace: testNamespace, }, Spec: kubevirtcorev1.VirtualMachineSpec{ - Running: pointer.BoolPtr(true), + Running: ptr.To(true), Template: &kubevirtcorev1.VirtualMachineInstanceTemplateSpec{ Spec: kubevirtcorev1.VirtualMachineInstanceSpec{ Domain: kubevirtcorev1.DomainSpec{ diff --git a/vendor/github.com/coreos/prometheus-operator/NOTICE b/vendor/github.com/coreos/prometheus-operator/NOTICE deleted file mode 100644 index e520005c..00000000 --- a/vendor/github.com/coreos/prometheus-operator/NOTICE +++ /dev/null @@ -1,5 +0,0 @@ -CoreOS Project -Copyright 2015 CoreOS, Inc - -This product includes software developed at CoreOS, Inc. -(http://www.coreos.com/). diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go deleted file mode 100644 index 913d690c..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go +++ /dev/null @@ -1,363 +0,0 @@ -// Code generated for package v1 by go-bindata DO NOT EDIT. (@generated) -// sources: -// example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml -// example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml -// example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml -// example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml -// example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml -// example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml -package v1 - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -// Name return file name -func (fi bindataFileInfo) Name() string { - return fi.name -} - -// Size return file size -func (fi bindataFileInfo) Size() int64 { - return fi.size -} - -// Mode return file mode -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} - -// Mode return file modify time -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} - -// IsDir return file whether a directory -func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 -} - -// Sys return file is sys mode -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7d\x73\xdc\xb8\x95\x28\x0e\xff\x9f\x4f\x81\xf2\xa4\x4a\x76\x3d\xdd\x2d\x3b\xc9\xcd\xdd\xeb\x9b\xda\x5b\x8a\xa5\x49\xf4\x64\x2c\xab\x2c\x8d\xe7\xe6\xf7\x52\xb3\x68\x12\xdd\x8d\x15\x09\x30\x00\xd8\x72\xcf\xdd\xfd\xee\xbf\xc2\x39\x00\x5f\xba\x49\x10\x6c\xb5\x6c\x6f\x86\xdc\xaa\xcd\xb8\x45\x1e\x00\x07\x07\x07\xe7\xfd\xfc\x66\x3e\x9f\xff\x86\x16\xfc\x13\x53\x9a\x4b\xf1\x96\xd0\x82\xb3\xcf\x86\x09\xfb\x2f\xbd\x78\xf8\x17\xbd\xe0\xf2\x7c\xfb\x66\xc9\x0c\x7d\xf3\x9b\x07\x2e\xd2\xb7\xe4\x5d\xa9\x8d\xcc\x3f\x32\x2d\x4b\x95\xb0\x4b\xb6\xe2\x82\x1b\x2e\xc5\x6f\x72\x66\x68\x4a\x0d\x7d\xfb\x1b\x42\xa8\x10\xd2\x50\xfb\xb3\xb6\xff\x24\x24\x91\xc2\x28\x99\x65\x4c\xcd\xd7\x4c\x2c\x1e\xca\x25\x5b\x96\x3c\x4b\x99\x82\x11\xfc\xf8\xdb\xd7\x8b\xdf\x2d\xfe\xf0\x1b\x42\x12\xc5\xe0\xf3\x7b\x9e\x33\x6d\x68\x5e\xbc\x25\xa2\xcc\xb2\xdf\x10\x22\x68\xce\xde\x12\x9a\x31\x65\x72\x2a\xe8\x9a\x29\xbd\xc8\xa5\xe0\x46\x2a\x2e\xd6\x8b\x44\x2a\x26\xf5\x22\x91\xf9\x6f\x74\xc1\x12\x98\x4c\x9a\xc2\x0c\x69\x76\xab\xb8\x30\x4c\xbd\x93\x59\x99\xe3\xcc\xe6\xe4\xff\x7f\xf7\xe1\xe6\x96\x9a\xcd\x5b\xb2\xb0\x1f\x2c\xdc\x5c\x60\xd6\x29\xd3\x89\xe2\x85\x81\xb9\xdd\x6f\x18\x71\x7f\x24\x72\x45\x2e\x1a\x33\x80\x97\x71\x62\x9f\x1a\x9f\x9b\x5d\xc1\xde\x12\x6d\xec\xc4\x3a\xc7\x52\xac\xc8\x78\x42\x75\xf7\x60\x29\xd3\x5c\xb1\x94\xf8\xb7\x88\x28\xf3\x25\x53\xfb\x83\xeb\xc6\xe8\x1f\x9b\x00\x71\x78\xbb\x62\x9c\x62\x6b\x7c\xbf\x5b\x8b\x03\x4c\x37\xc0\x5d\xac\x59\x03\x52\x4a\x8d\xfd\xe7\x5a\xc9\xb2\x78\x4b\xba\x71\x8e\x5f\xba\x4d\x47\x82\x39\x40\x54\xc6\xb5\xf9\xdb\xc1\x9f\x7e\xe0\xda\xc0\x9f\x8b\xac\x54\x34\xdb\xdb\x62\xf8\x8b\xe6\x62\x5d\x66\x54\xb5\xff\xf6\x1b\x42\x0a\xc5\x34\x53\x5b\xf6\xa3\x78\x10\xf2\x51\x7c\xcf\x59\x96\xea\xb7\x64\x45\x33\x6d\x67\xac\x13\x69\xe7\x7f\x63\x67\x56\xd0\x84\xa5\xf6\xb7\x72\xa9\x1c\x0d\xeb\xb7\xe4\xff\xfc\xe7\x6f\x08\xd9\xd2\x8c\xa7\x80\x0b\x9c\xbe\x2c\x98\xb8\xb8\xbd\xfe\xf4\xfb\xbb\x64\xc3\x72\x8a\x3f\xee\xed\x53\x73\x05\xee\x2f\x4b\xa6\x09\x15\xed\xbf\x24\x59\xa9\x0d\x53\x0b\x07\xa2\x50\xb2\x60\xca\x70\x8f\x28\xfb\x34\x8e\x61\xf5\xdb\xde\x60\x67\x76\x36\x8e\x02\x53\x7b\xf0\x98\x26\xa6\xa6\x4a\x96\x12\x0d\x33\xb5\x14\x62\x36\x5c\x5b\xca\xb1\x98\x11\x78\x14\x1b\x60\x89\x7d\x85\x0a\x22\x97\xff\xce\x12\xb3\x20\x77\x16\x7b\x4a\x13\xbd\x91\x65\x96\xda\xd3\xba\x65\xca\x10\xc5\x12\xb9\x16\xfc\x97\x0a\xb2\x26\x46\xc2\x90\x19\x35\xcc\xed\x97\x7f\xe0\x68\x09\x9a\x59\x3c\x96\x6c\x46\xa8\x48\x49\x4e\x77\x44\x31\x3b\x06\x29\x45\x03\x1a\xbc\xa2\x17\xe4\xbd\x54\x8c\x70\xb1\x92\x6f\xc9\xc6\x98\x42\xbf\x3d\x3f\x5f\x73\xe3\x19\x4f\x22\xf3\xbc\x14\xdc\xec\xce\x81\x7d\xf0\x65\x69\xa4\xd2\xe7\x29\xdb\xb2\xec\x5c\xf3\xf5\x9c\xaa\x64\xc3\x0d\x4b\x4c\xa9\xd8\x39\x2d\xf8\x1c\x26\x2e\x80\xef\x2c\xf2\xf4\xbb\x6a\x87\xcf\x1a\x33\xdd\x3b\x95\xf8\x00\xa9\xf6\xe2\xdd\x52\x2b\xe1\x9a\x50\xf7\x19\xce\xbf\x46\xaf\xfd\xc9\x62\xe5\xe3\xd5\xdd\x3d\xf1\x83\xc2\x16\xb4\x71\x0e\xd8\xae\x3f\xd3\x35\xe2\x2d\xa2\xb8\x58\x31\x85\x1b\xb7\x52\x32\x07\x88\x4c\xa4\x85\xe4\xc2\xc0\x3f\x92\x8c\x33\xd1\x46\xba\x2e\x97\x39\x37\x76\xa7\xff\x51\x32\x6d\xec\xfe\x2c\xc8\x3b\x60\xbf\x64\xc9\x48\x59\xd8\x43\x9b\x2e\xc8\xb5\x20\xef\x68\xce\xb2\x77\x54\xb3\x67\x47\xbb\xc5\xb0\x9e\x5b\x94\x0e\x23\xbe\x79\x6b\xb4\x5f\x44\x6c\x55\x3f\x7b\x6e\xde\xbd\x43\x77\x05\x4b\xf8\x8a\x27\x40\xe8\x48\xff\x35\x03\x5d\xb2\x0d\xdd\x72\xa9\xfc\xef\x07\x1c\xc9\x3f\xfe\x98\xf6\x20\x68\x53\x2e\x2d\x93\x3b\xb7\xb7\x97\x12\xcc\x30\xdd\xc0\xd5\x32\x93\xcb\xf3\x9c\xda\xef\x8f\xc5\x9b\x5d\xe2\x9c\x8a\x74\xae\x0d\x35\x65\x0b\x77\x5d\x1c\x03\xb8\x46\x7d\xb7\x31\xa6\xf6\xfe\xb8\xcf\xab\xda\xef\x12\x9a\x65\xf2\x51\x13\x2e\x2c\x9e\x2d\x09\x53\xa2\x99\x01\xce\x50\xbd\xd9\x71\xd3\x34\x1f\x23\x49\xc1\x98\x22\x8f\xdc\x6c\xec\x3f\x56\x52\xe5\x84\x92\x0d\x5f\x6f\xb2\x1d\xa1\x5b\xca\x33\xba\xcc\xd8\x3e\xff\xab\x58\x86\x61\xf9\xc1\x9c\x7b\x08\xa5\xf9\x27\xaa\x14\xdd\xb5\xf1\xb0\x02\x39\x64\x17\x44\xc0\xf5\x0a\xa8\x88\xaf\x38\x4b\x67\x40\x09\x85\x4c\xcf\x34\xf0\xb6\xb4\xcc\x2c\x0a\x12\x29\xb4\x51\x94\xdb\xc3\xb9\x07\xaa\x6f\x0b\xec\x23\x64\xca\x2e\x7a\xa6\x70\x30\x8d\xcb\xea\x9a\xb0\x9f\x55\x53\x6f\x4e\x43\x95\x19\xd3\x16\x9b\x7e\x96\xfb\x93\x19\x9a\x10\xfe\x9d\xad\x98\x52\x2c\xbd\x2c\x2d\x26\xef\x2a\xf0\xd7\x6b\x21\xab\x9f\xaf\x3e\xb3\xa4\x34\x7b\xd7\x4e\xef\xdc\xad\x5c\xe2\xe6\x09\xdb\x9e\x65\x6e\x18\xbb\xfb\xfe\x0f\x76\xc2\x70\x53\xd8\xf5\x1d\x12\x8d\x7f\xcc\x86\x1a\xa2\xa9\xe1\x7a\xb5\x83\x75\x56\x98\x60\x9f\x2d\x87\x04\x21\xb4\xde\x31\xb2\xdc\x39\xe6\x68\xaf\xf7\x59\x2f\xd8\x65\x69\x08\x37\xc0\x51\x93\x8d\x94\x9a\x11\x8a\x88\x86\xf1\xb6\x5c\xc2\xdd\x45\xa4\x60\x44\x2a\x92\xdb\x93\x8e\x7c\xa1\x17\x62\x63\x3a\x0b\xc0\x40\x0d\x8e\x6b\x92\x4b\x6d\x6a\x5c\xdb\x5f\xec\x5a\x2c\x78\x7b\x2a\x02\xab\x67\x64\x6d\x65\x2f\xa6\x0d\xd1\x65\x6e\x27\xf1\xc8\xf8\x7a\x63\xf4\x8c\xf0\x05\x5b\xc0\xf6\x33\x9a\x6c\x1a\xc3\xe5\x8c\x99\x7e\x84\xd2\x2c\xf3\x2c\xae\x49\x4b\xec\x1f\x25\x57\x2c\xb7\x17\x0e\x79\x59\xdd\x4e\xee\xc6\x98\xf9\xbf\x1f\x50\x49\xff\x30\x1d\xdb\x34\x23\xcc\x24\x8b\x57\x33\x92\xc8\xbc\x28\x8d\xc5\xb9\x5d\xd3\x72\x67\xcf\xb8\xa2\xee\x86\x54\xb2\x5c\x87\x31\xc2\x32\x37\x51\x2f\xc2\xc0\x66\x83\x2c\x61\x99\x92\x58\x93\x17\x88\xa4\x17\x5e\x12\xd1\x65\xde\x0b\x91\x23\x32\x00\x7f\x39\x35\xc9\xc6\x09\x4c\x89\x54\x8a\xe9\x42\x0a\x80\x08\x7f\xb9\xaa\xd7\xf2\x3f\x83\xc4\x60\x81\xbd\xd4\xaf\x1c\xcb\xdb\x30\x60\x76\x7e\x0f\xa9\x62\xf0\x5b\x9b\x26\xba\x0e\x2f\xe9\x67\x7f\xfe\x69\x33\x6f\x41\x58\x5e\x98\x5d\x83\xd2\x1a\x7b\x6c\x98\xca\xab\x15\x52\xd0\x93\xfa\x1e\xbc\x56\x35\xce\x9f\xe7\x56\x5f\xe0\xc6\x51\x1e\x79\x4d\x5e\x02\xe9\x71\x73\xa6\xe1\xd8\xcc\x65\xf1\x6a\x41\x2e\xbc\xf2\xd5\xf7\x0c\x4f\x4a\xc8\x6a\x64\x37\x84\x9d\xa8\x96\x01\xa0\xd5\xf8\xbd\xef\x0c\x71\xc0\xe6\xe4\x98\x48\x58\xe8\xad\x7d\x7c\x23\xd5\x68\x96\xb1\xc4\x58\x3e\xcc\x54\x3e\x23\x54\x6b\x99\x70\x2b\x52\x55\xfb\x1f\x04\x49\xf6\x48\x0d\xd1\xdc\xbf\xa0\xf8\x45\xd9\x67\x9f\x70\x87\xde\x3f\x58\xa2\xd5\xc4\xec\x49\x6b\x2f\xb5\xc9\x30\x06\x21\x12\x7b\xc6\xed\xf7\x67\x9a\x64\x74\xc9\xb2\x83\x7b\xf3\xf0\x19\xa0\xfb\xde\xe9\xf6\x4e\xd3\xc9\xe6\xee\x2f\x11\x80\xdd\xe5\x63\xe5\x34\xca\x85\x76\xfa\xc8\x8c\x50\xf2\xc0\x76\xa8\xba\x58\xed\xa8\xb0\xac\x0b\x2e\x61\x6a\xa2\xa0\x2a\x86\x97\x8b\xe5\x01\x0f\x6c\x07\x80\x9c\xae\x13\xf1\x7d\xfc\xce\xe3\xf3\xc0\x3a\x85\x8d\xae\xe7\xe0\x12\x87\xbd\x82\x39\x02\x26\x80\x93\x8e\xc1\x1f\x01\x95\xb5\xc8\x38\x03\x9d\x23\xf2\x9b\x80\x64\xd7\xfd\xf8\x2d\x38\x6a\x9d\x1f\x2b\x45\x0b\x37\xf6\x4c\xe3\x06\xd9\xb3\xb2\xe1\x45\xf4\x3a\x8d\xac\x45\x63\xaf\xb9\x7e\xa2\x19\x4f\xab\xe9\x69\xe0\xfc\xd7\xa2\x5f\x2a\xd9\x7f\x6e\xa4\xb9\x16\x33\x72\xf5\x99\x6b\x7b\xe1\x5f\x4a\xa6\x6f\xa4\x81\x7f\x2e\xc8\x5f\x0c\xd2\xe0\x0f\x03\xac\xa2\x31\xc5\xb1\x88\xc5\x75\x1c\x85\xd6\x0b\x81\x02\xb8\x45\x47\x53\x1f\xd6\x0b\x2b\x61\x0f\xb3\xc4\xfa\xa9\x0e\x18\xd7\x56\x43\x95\xca\xa3\x05\xac\x1a\x00\xb3\x43\xd6\x0f\x3d\x79\xa9\x41\xf1\x15\x52\xcc\xe1\xbe\xf4\x73\x6a\x8d\x85\x58\x8f\x9f\xa6\x6a\xed\xcf\xe1\xf4\xfc\xb0\xd1\x10\xfb\xa7\xf6\x17\x63\x87\xfb\xa1\x35\x48\xfc\x81\xac\x27\xb3\xa1\x5b\x10\xc2\xb8\x58\x67\x95\x58\x35\x23\x8f\x1b\x9e\x6c\x40\x6e\x8f\x06\xba\x64\x68\xda\x29\x14\xb3\xf7\x1e\x05\xeb\x96\xb3\x2a\x5a\x71\x98\x7b\x24\xf0\xf8\x89\x2a\x56\x64\x34\x61\x29\x49\x41\xe8\x44\xc3\x0a\x35\x6c\xcd\x13\x92\x33\xb5\x66\xa4\xb0\x77\x5b\x2c\xf5\x47\x5f\x28\xf8\x8c\x3e\x2c\xfd\x7a\x67\xf7\xe3\x45\xea\x98\x29\xcd\x2d\x67\x8a\x7a\xcf\x93\x49\xc4\xcb\x9d\x16\x94\xf0\xcb\x31\x6b\x03\x81\xc3\x59\x57\xbf\xb2\xac\x01\x7a\xc1\x24\x6b\x4c\xb2\x46\xef\x33\xc9\x1a\xfe\x99\x64\x8d\x49\xd6\x98\x64\x8d\x49\xd6\xf8\x2f\x24\x6b\x44\x02\x45\x7b\xca\x08\xb3\xce\x4f\x68\xe7\xda\xb7\xe3\x80\x60\xe3\xbd\x78\x2d\x93\xcd\xc0\x8a\xac\x98\x70\xe7\xee\xb2\x7b\x30\x11\x71\x01\x40\x14\x15\x6b\x46\xde\xcc\xdf\xbc\x7e\x1d\xa6\xac\x95\x54\x39\x35\xe0\xa7\xff\xfd\xef\x22\x70\x52\xfb\xf3\xbb\x9f\x61\x7a\x98\x37\x2c\x62\x81\x97\x10\xb7\xfd\xd6\xda\xe1\x1d\x1a\xda\xec\x3e\xcb\xf3\x13\xfc\x13\x8e\xcb\x55\x26\xea\x96\xf1\xfb\xc0\x95\xd0\xbb\x38\x67\x75\x56\x96\xb9\x1b\x92\x33\x43\xa8\x69\x99\x36\x79\xce\x2a\x0f\x12\xba\x41\xd0\xe3\xda\x0b\xd1\xfb\x46\x52\x22\x85\xb3\x5c\x5b\xda\x59\x44\xce\xb8\xdf\xdb\xd1\x74\x8a\x90\x84\x51\xcd\xac\x0c\xb1\x64\xd5\xac\x65\x6e\x67\xc9\x85\xf1\x0c\xd0\x4e\x99\x79\xac\xf6\x02\x7e\xc9\x16\xeb\x05\x49\x4b\x00\x47\x85\x73\x25\xbf\xc2\x55\xeb\x9d\x36\x2c\x07\x1f\x8b\x54\xf0\x3f\x76\xf9\x46\xed\x88\xe9\xb7\xe8\xb2\x2d\x13\xa6\xa4\x59\xb6\x23\x6c\xcb\x13\x53\xe1\x0f\xbc\xdd\xdc\xa0\x3f\xac\xef\xb4\xc4\x08\xac\xfb\xa7\x31\xc8\xa7\xf7\xc4\x37\x24\xc5\x45\xaf\xa6\x62\x2c\x3c\x70\xff\x84\x0f\xa9\x7d\x0d\x28\xe7\xc3\xc7\x7e\xcb\x3f\x89\xbb\x48\xf6\x75\x92\x32\xcb\x2c\xbe\xd1\x11\x70\x38\x3d\x6f\x6c\x1f\xe4\x59\xde\x14\x8f\xde\xac\x16\xc5\xa1\xff\x08\x3d\x19\x17\x37\x97\x16\x23\x43\x4b\x26\xe4\x5e\x16\x32\x93\xeb\x5d\x13\xf7\x70\xfa\xc1\xc1\xe0\x20\x53\xa2\xcb\xa5\x93\x6c\x87\x05\xb7\x9b\xbd\xad\x9c\x6c\xe6\x93\x1e\xdb\xf5\x4c\x7a\xec\xc1\x33\xe9\xb1\x91\x53\x9c\xf4\x58\x78\x26\x3d\x76\xd2\x63\x07\x9f\x49\x8f\xed\x78\x79\xb2\x99\x4f\xb2\x46\xe0\x99\x64\x8d\x83\x67\x92\x35\x26\x59\x63\x92\x35\x26\x59\x23\xf8\x4c\xb2\x46\xc7\xcb\x27\xb3\x99\x0f\x83\x1b\x42\xcf\xfc\xd0\xd0\x16\xb4\x00\xf7\x4e\x29\xf8\xe7\x42\xa6\x47\x84\xd4\x17\x32\x0d\x44\xd4\xa3\x51\x33\x91\xf3\x4c\x26\x98\xcd\xd6\x31\x29\x7b\x62\x2c\x18\x67\xc9\xd7\x34\x47\x5b\xed\x8c\xfc\x22\x05\xc3\x48\x67\x7b\xcc\xc0\xb2\x2a\xcd\x86\x29\xfb\xfa\x4b\xfd\xaa\x33\x52\x75\x8a\xd2\xef\x7c\xa6\x28\xfd\x29\x4a\xdf\x3d\xcd\x28\xfd\x0d\xd5\x48\x97\x78\x11\xf6\x07\xed\x37\xb8\x83\x65\x40\xff\x33\x38\xdf\xaf\x14\xb3\x6f\x89\xd0\x11\x0b\x64\x55\xd5\x1b\x8f\xeb\x4a\x9d\x3b\x92\xa5\xb7\xed\xd5\x04\xb8\x37\xea\x70\x30\x69\x9a\xa6\x2c\x25\x05\x53\x73\x24\x3d\x49\x56\x5c\xa4\x1d\x6b\xf1\xeb\xef\x05\x1b\x19\x47\xdf\x9e\xe4\x08\xd7\x45\xd3\xbb\xd2\x62\xd0\xfb\x51\xf5\x03\x77\x61\xb5\x7f\xcf\x19\x55\x0f\x9a\x97\xbf\xdc\xc6\xab\xec\xa0\xb7\xfd\xa3\x64\x6a\x47\xe4\x96\xa9\x5a\x33\xa9\x92\x51\x63\x94\x10\xb8\x7b\xb8\x26\x09\xd5\xc8\xa8\x87\x45\xad\x71\xda\xe9\x78\x3f\xc8\xc1\x62\xf7\x41\xa0\x96\xef\x6d\x16\x80\x88\x48\xe9\xad\xd3\xb4\xd1\xe1\x9c\xa2\x2a\x56\x84\x47\xd7\x55\xd4\xcb\xa3\x84\xd3\xce\xdd\xee\x31\x79\xc4\xab\x05\x0d\x37\xde\x80\xd9\x23\x1e\xe6\x9e\x79\xe4\x89\xa6\x0f\x72\x84\xf9\x83\x8c\x33\x81\x90\x7d\xf4\xda\x59\xba\x7b\xfa\xd0\x1a\x32\x02\x68\x83\xbe\xc6\x5b\x44\xc8\x71\xfa\xc8\x78\xcb\x08\xd9\x5f\x7e\xb5\x7d\xea\xc0\x4c\x32\x6a\xf1\x4d\x93\x4a\xbf\xa9\x64\x14\xc8\x03\xb3\x4a\xdb\x5c\x02\xb4\xd5\xb2\x98\x3c\x37\xb2\xc7\x59\x4b\xc8\x3e\xaa\x9d\xad\x80\x83\xea\xbc\x67\x3b\x19\x85\x98\xb6\x9d\xa5\xd7\x7e\x32\x0a\x66\x9f\x31\xa3\x6d\x43\x19\x0d\xf2\xd0\xde\x72\x60\x47\x39\xcd\x34\xdd\x14\x6b\x43\xc4\x28\xb0\x58\xc5\xe2\x94\xc6\x08\x32\xde\x20\x41\x8e\xa5\xcb\xb1\x86\x09\x32\xd2\x38\x41\x46\x18\x28\xc8\x58\x23\x05\x19\x6b\xa8\x20\xa3\xd7\x0b\x22\xc4\x0f\x10\x02\x11\xb7\xdc\x66\x2d\x9f\xb1\xb7\xd1\xe8\x1d\x3c\x94\x76\x70\xaa\x28\xe8\xe4\xb4\xb0\x5c\xe2\xff\xd8\xab\x19\x08\xff\x3f\x63\xef\x51\xca\x95\xb6\xa2\xb0\x33\xfe\x35\x20\x78\x9b\x43\x63\xb0\x48\xa0\x76\x36\x5c\x13\x4b\x3b\x5b\x9a\x59\x01\x04\xc3\xb6\x9c\xaa\x66\x67\xba\x2f\xaf\xc5\x9e\xef\xc7\x8d\x55\xcf\xed\xe5\x8b\x6a\x1e\xd7\xe4\xc5\x03\xdb\xbd\x98\x1d\xf0\x91\x17\xd7\xe2\x45\x2c\x54\xea\x54\x95\x16\xcf\xa8\x24\x1f\x29\xb2\x1d\x79\x01\x7f\x7b\x11\x7b\xb0\xbb\xc4\xc5\x31\x82\xe0\x11\x46\xb9\xa8\x97\x85\xaf\x3b\x34\xd6\x01\x58\x7f\x58\xd9\x57\xbc\x62\x5c\xff\x29\xc6\xda\xe8\x25\xa8\xbb\x43\x39\x88\xbc\xac\xd2\xc6\xd7\x16\xf3\xe6\x55\xbf\x2a\xdd\x58\x52\x2b\x12\x0d\x44\xfe\x9c\x51\xa1\xc9\x0b\x6f\x3d\x3b\xd3\xf5\x1c\x5f\x9c\xce\xe3\x38\xea\x0c\xc7\xf3\x22\xe3\x02\xd8\xfe\x16\x23\xae\xee\xe9\xf8\xce\x5a\xe8\x4a\x27\x2d\x59\x6d\x5e\x4c\xc9\x4b\xaf\xe9\xf6\xeb\xde\xf5\x23\x15\x44\x51\xb6\x3e\x17\x86\xcf\x2b\x18\xb5\xfe\x6b\x35\xc2\x58\xf6\xea\xc3\x9a\xdb\x14\xe0\x8d\x9b\x95\xdd\xae\xa6\xa8\x98\x13\xfc\xb8\x61\xaa\xb5\x52\xae\x5d\x49\x2a\xf0\x40\xa8\x52\x08\x3b\xae\x14\xce\xac\x17\x05\xd2\xb2\x19\xac\xac\xe4\xcc\x24\x28\xf6\xc3\xaa\x41\xf6\xaf\x77\x29\x32\xd4\x91\x78\x03\x26\x94\xbb\x72\x31\x93\x52\xb8\x43\x64\x7f\xf1\x96\x38\xc0\x0b\x4b\x63\x31\xcb\xab\x35\x2e\xc8\x15\x1c\x82\xe6\xe4\xb8\x86\x9d\x84\x02\x3b\x31\xdc\x27\x9a\xaa\xe3\x64\x83\x79\x73\x32\xa7\x70\x19\x8c\x0e\xb3\x7f\x3c\x71\x98\xfd\x9e\xe9\xe9\xbf\x48\x94\x7d\xa4\x51\x6f\x0a\xb5\x9f\x42\xed\x1b\xa1\xf6\xf0\x11\x72\xbe\xe1\x98\xfb\x7e\x9a\x81\x58\xfc\xd8\x98\x7b\xf2\xd3\x86\xc1\x89\x0a\x18\xd8\xec\x16\xe5\x65\x66\x78\x51\x3b\xac\x35\x4e\x2d\x43\xf5\x11\x03\x95\xf4\x9e\x75\x36\x94\x11\x40\x93\xcd\xfe\x31\x81\x71\xc0\xa1\xad\x81\x23\x3b\x37\x0b\xcd\x32\x17\x5b\x6f\xf5\xca\xfe\x3d\x62\xce\x57\xc5\x4f\x63\xc2\xbf\x74\x65\x16\x2b\xa3\x09\x38\x27\x5e\xda\xcb\x32\xb3\xe4\x60\xaf\x2c\xcf\xd5\x42\x3e\xd7\x83\xfb\x17\xad\x32\x5b\xe6\x1d\x24\x6b\xbe\x65\xa2\xbe\x84\x5f\xea\x57\xaf\x86\xc2\x9a\x4c\xa4\xe8\x71\x28\x58\x04\x80\x76\x89\x1c\xb3\xc8\xeb\x3e\x00\xb6\x12\x04\x22\xae\xf9\x3f\x35\x6e\xaf\x7f\x0d\xc0\xac\x9d\x43\xbd\x17\x3c\xa0\xa7\xba\xe2\xab\x0d\x0c\x00\xe5\xc3\xab\x89\xb3\x83\x8e\x70\x23\x1c\xe1\x42\x20\xbc\x9f\x9d\xe0\x33\xc6\x7d\xf0\xc5\xd2\x27\x22\x5c\x06\x63\xc2\xdc\x86\xdd\x05\xb1\xfa\xdf\xb1\x21\x8f\x41\x07\xc0\x14\xf3\x18\x7c\xe2\x8d\xfd\xff\x7c\xa1\x8f\x01\xe3\xfe\x37\x1a\x03\x79\xb4\x51\xff\x4b\x86\x3e\x86\x0c\xf9\x23\xbd\x5d\x64\xc8\x88\xff\xc4\x00\xc0\xa1\x20\xc8\x68\x98\x3d\xc6\xfb\x6e\x83\x7c\x34\xd4\x2e\xc3\x7d\xa7\x31\x3e\x1a\xe2\x14\x41\x38\xf8\xde\xd7\x8e\x20\x1c\x69\x90\x3f\xd6\x18\x3f\x6a\x77\xc6\x1a\xe1\x9d\x79\x3d\x62\x1a\x91\x06\xf8\x43\xd3\x7a\xcc\x12\x07\x8d\xef\xfb\x66\xf5\x38\xa3\x53\xc8\xf0\xde\x69\x52\x8f\x00\xdb\x6d\x74\x7f\x92\x38\x15\x4d\x9d\x91\x2f\xc6\x9a\xd0\xc7\x9b\xcf\x23\x62\x09\x46\x98\xce\xbd\x61\x7c\x00\xe2\x29\xcc\xe6\x51\x1c\x31\xfa\xa4\xc5\x71\x88\x68\x33\xf9\x73\x98\xc8\x47\x9a\xc7\x63\xd4\x72\xd2\xa9\x9a\x87\x4c\xe3\xa8\x09\x0f\x80\x8c\x37\x8b\x37\xb5\xe1\xa1\xe5\xc7\x9a\xc4\x9b\xfa\xf0\x90\x67\x2a\xca\x1c\x7e\x68\xec\x8e\xf7\xa6\x8c\x32\x85\x47\x51\x6b\x8c\xe5\x35\xc6\xfc\xfd\x64\xa3\xea\x60\xf0\xba\x30\xfc\xd8\x00\xf6\x26\x5d\xf7\x44\xb1\x77\xce\x99\x6e\x25\x4f\x49\x51\x1a\x17\xca\x3b\x3a\x92\xbd\x13\xea\xaf\x2a\xba\xbd\x85\xfa\x60\x88\x7b\xd8\xa4\x3d\x3b\x22\xc4\xbd\x17\xa2\x3b\x96\x47\x84\xb8\xf7\x83\x74\xa1\xef\x47\x85\xb8\xf7\x42\x85\xd0\xf7\xe3\x42\xdc\x07\x4f\xfc\x3e\x09\xf5\xef\x95\x8f\x73\xef\x05\x39\x1c\xff\x1e\x88\x73\xef\xb7\x90\x07\xe3\xdf\x03\x71\xee\xfd\xe8\x8c\x8e\x7f\x3f\x88\x73\x0f\x90\xfc\x14\xff\xbe\xf7\x4c\xf1\xef\x8d\x67\x8a\x7f\x8f\x5c\xec\x14\xff\x3e\xc5\xbf\x0f\x3d\x53\xfc\xfb\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x53\xfc\xfb\x14\xff\xde\xf1\x4c\xf1\xef\x53\xfc\xfb\x14\xff\xde\x78\xa6\xf8\xf7\x81\xa5\x4c\xf1\xef\x53\xfc\xfb\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x1d\xaf\x7c\x95\xf8\xf7\x96\x11\xba\x37\x08\x3e\x60\x8e\xad\xeb\xa7\x8c\x0c\x82\xef\x85\xb9\x64\xc3\x41\xf0\xbd\xd3\xee\x85\xda\x53\xe3\x27\x2a\x12\xbe\xdf\xf4\xda\x8c\x90\x1f\x15\x09\x1f\x30\x9a\x77\x54\xa5\x7f\x62\xf5\x79\xd2\x88\x90\x3f\x36\x12\xbe\x9f\x04\xe4\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x8f\xcf\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x7f\xf0\x4c\x91\xf0\x9d\xd3\x9d\x22\xe1\xa7\x48\xf8\x29\x12\xbe\x7e\xa6\x48\xf8\xf6\x33\x45\xc2\x4f\x91\xf0\x81\x67\x8a\x84\x7f\x9e\x48\xf8\xde\x3f\x2d\xa9\x66\xd7\x39\x5d\xb3\xfd\xd9\xb7\x0e\xcc\x9f\xad\xd6\xce\xed\x6b\x55\x94\x73\xa9\x59\x6a\x59\x4e\xca\x8a\x4c\xee\x60\x5b\x66\x40\x05\xb2\x34\xc4\xd0\x83\xc0\xf8\x5e\x54\x26\x52\xac\xf8\xfa\x3d\x2d\x0e\x78\x47\x6b\x0a\xef\xaa\xd7\xda\x2a\x7a\xf3\xf7\x66\x78\xbd\x3f\x21\x07\x78\xa2\xa8\xd3\x5d\x64\x4c\x99\x9c\x0a\xba\x66\xca\x21\xc6\xb7\x7d\xd0\x1b\x9a\x65\x60\x45\x95\xa5\x80\x33\xe3\x4d\xb7\xcd\x8f\x0e\x00\xdf\xca\xd4\xe9\xfc\x8d\x39\x81\x8d\xb2\x09\xe6\x9c\x99\xe4\x9c\x36\xe0\x9c\x23\x02\x72\x5a\xe8\xf3\x3f\x55\xff\x3d\xb7\x0b\xf8\xd7\x7d\x24\xf6\xb0\xd8\x00\x99\xf6\x51\x0c\x0e\x74\xc7\x12\xc5\x0e\x1c\x2a\x1d\x78\xc7\x17\xbd\x3e\x6c\xe7\x06\xe7\x99\xfc\xad\x5c\x32\x25\x98\xd5\xe6\xfd\x2b\xa2\xf3\x02\x6b\x6f\x4a\xc4\x26\x54\x32\x00\xce\xb4\x54\xb4\xb3\x76\xcb\x0a\x0c\x0f\x5c\xb7\x41\xd9\xbb\x8f\x8a\x84\x2d\xc8\x25\x5b\xd1\x32\x33\x70\x3b\x9e\x35\xd1\x3e\xff\x53\xeb\x5f\x80\xee\xb3\x03\xf0\x90\xe3\x50\xad\x3d\x6a\x23\xc7\x10\xbe\x5d\x21\x53\x83\x84\xef\x5e\x43\x9e\x65\xe9\xdc\x22\x0a\x74\x9d\x4a\xde\x6d\x40\x43\x05\xe9\x60\x29\x76\xfe\x8c\xba\x80\x0c\x0b\xc8\xc7\xc8\x5b\xc5\xb4\x34\x1b\x26\x0c\x4f\x00\xc9\xa4\x50\xf2\xf3\xce\x49\x8c\x41\x92\x2f\xe4\x01\x03\xed\x21\xd1\x3d\x2b\x95\x93\x73\x41\x74\x71\x83\x56\x0b\x40\x16\xb3\x93\x25\x79\x74\xd3\x55\xa5\x00\xd6\xd2\x69\x62\xa4\x5d\xb3\x18\x32\x13\x51\xb5\xee\x11\x55\x5a\x13\x3d\xbb\x50\xeb\x12\x65\x4d\xc7\x01\x98\x30\x6a\x07\x1e\x15\x3c\xea\xa9\x4c\x1e\x2c\xc1\x59\xde\x78\xd6\x1b\x11\xf9\xee\xfd\x65\xc5\x33\xb9\xcb\x61\x70\xf7\x50\xa1\xe4\x96\xa7\x2c\x5d\x90\x4f\x54\x71\xba\xcc\xac\x8c\xeb\xba\x42\x6b\xf2\xdb\x97\x9f\x2e\x3e\xfe\x7c\x73\xf1\xfe\xaa\x4f\x18\xb1\x0c\x86\x7d\x2e\xa8\x48\x59\x4a\x4a\x5d\x7b\x35\x1d\x36\xcf\xce\x34\x61\x62\xcb\x95\x14\x76\x21\xa0\xd8\x53\xb2\x75\x63\xf5\x00\x4d\xa8\xc0\xe2\x4e\x60\xe0\xcd\xb6\x2c\x45\x09\xbf\x9a\x99\xe7\xb5\x5c\x14\xa5\xf1\xe6\x0c\xf0\x87\xf5\x16\x84\x2a\x45\xb2\xa1\x62\xed\x3a\xd9\x36\x57\x46\xf4\x4e\x18\xfa\xd9\x8e\x0a\x5a\xbe\x4e\x68\xe1\x5d\xb5\x94\xa4\xb2\xec\x9f\xe8\x6f\x7f\x3b\x23\x9c\xbd\x25\xbf\x6d\x80\x5b\x90\x2b\x07\xa1\x81\x48\xf4\xd5\xb1\x2d\x53\x30\x84\x43\x58\x9f\xe5\x49\xb1\x35\x55\x69\xc6\x34\xf8\x90\x1e\x37\x0c\xba\x8b\xa0\x26\xe3\x36\x89\x55\x46\x0e\x21\xcd\x82\xbc\xf3\x18\xeb\x5b\x3d\x38\xce\xd2\x05\x79\x2f\xc1\x9b\xb4\x92\x6f\xc9\xc6\x98\x42\xbf\x3d\x3f\x7f\xa8\x98\xe8\x82\xcb\xf3\x54\x26\xfa\xdc\x50\xfd\xa0\xcf\xf1\xa0\xcf\x53\x6a\xe8\xbc\x71\x54\xce\x51\x80\x9b\x27\x32\xcf\xa9\x48\xe7\xd4\x11\xe9\xbc\xda\xf4\xf3\xef\x9c\x78\x34\xa7\xd5\x5b\x5c\xcc\xe9\x5c\x6f\x58\x96\x1d\xb2\x39\x32\x24\xbe\x0f\x0a\x42\x61\xc9\xc4\xcd\x21\xe6\xc4\x5d\x55\x07\x0c\xa1\x2d\xc8\x8d\x34\xce\x35\xe9\x88\x82\x5b\x61\x15\x56\x12\x6a\x8a\xbc\x77\x32\xc9\xd5\xcd\xfd\xc7\xbf\xdf\x7e\xb8\xbe\xb9\x1f\x3c\x8a\x3d\x10\x07\x0e\x68\xcc\x51\xec\x81\xdc\x7f\x40\x87\x8f\x62\x9f\x4f\xb1\xff\x80\x0e\x1f\xc5\x7e\xb6\xd0\x7b\x40\xa3\x8f\x62\x0f\xec\x9e\x03\x1a\x7f\x14\x7b\xe0\x1e\x1c\xd0\x5f\xf9\x51\x64\x62\x1b\x71\x0c\x7f\x70\xd2\x75\x83\x30\x2b\x7c\xc3\x5d\xa8\x2b\x51\xaf\xa6\xef\xbe\x73\x73\x88\xfa\xf1\xab\x6e\xcd\xee\x4a\x6c\x3f\xd1\xb6\xa7\x42\x74\x4e\x95\xb8\x17\x7a\x75\x2e\x60\x25\xef\x86\x16\x10\xd5\xf3\x9e\xe6\x07\x3a\x54\xef\x02\x6e\x9c\x00\x8d\x12\xc5\xe1\xbc\x17\xe4\xbd\xb3\xc8\x87\xad\xd9\xef\x7e\xbe\xbe\xbc\xba\xb9\xbf\xfe\xfe\xfa\xea\x63\x48\x93\x8d\xd2\x63\x41\xe7\x8f\x5e\xc2\xd9\x18\x6e\x18\x5c\x44\xcd\x29\x0b\xc5\xb6\x5c\x96\xb5\x85\xa2\x9b\xfc\x7a\x54\x8c\xe6\x53\x0b\x93\xe8\xa5\xdc\x11\xcd\xd4\x96\x27\xdd\xe8\xc6\x4c\x89\x30\xaa\xe3\x19\x72\x8b\xf5\x06\x61\x8e\x65\xcb\x8e\x01\x07\x61\x3e\x0b\x73\xc6\xe7\x78\x16\x1d\x9e\x71\x5b\x92\x6a\x6a\x6c\x2f\x5e\x2c\xba\x39\x24\x3e\xf1\x64\xfd\xbd\x92\xc1\x44\xd1\x16\x69\xdf\x61\x42\x34\xaa\x96\xdd\x14\x73\xe6\xbc\xe1\x61\xf3\x51\x83\xf1\x39\x71\x03\xa3\x4c\x9c\xbc\x81\xee\xac\x00\x84\x58\x57\x77\x65\x42\xf9\x1b\xdb\x7d\x64\xab\x21\x1b\x6c\x7b\xb1\x60\x58\x73\xbe\x5e\x54\xea\x2b\xf3\xc5\x90\x59\x7d\x8c\x2b\x3e\xd2\x0d\x7f\x90\xb8\x8c\x36\x45\x67\xff\x8b\x71\xa2\x8c\xf2\xe5\x0c\x71\xed\xce\x69\x9d\x35\xd9\xb7\x3b\x3b\x26\x56\x9c\x48\xa4\x48\x58\x61\xf4\xb9\xdc\x5a\x8e\xc4\x1e\xcf\x1f\xa5\x7a\xb0\xf2\x81\x3d\xb1\x73\x34\x82\xe8\x73\x30\x95\x9c\x7f\x07\xff\x13\xe5\x2f\xbc\xff\x70\xf9\xe1\x2d\xb9\x48\x53\xd7\x0a\xb1\xd4\x6c\x55\x66\xbe\xd7\x34\xa1\x05\xff\xc4\x94\xe6\x52\xcc\xc8\x03\x17\x81\x8e\x80\xcd\xa7\xe4\xe9\xff\x0a\x1d\x40\xff\x8c\xc2\xb9\x2c\xd0\x64\x31\x1a\xef\x77\x60\xff\xde\xb5\x38\x4c\x45\xab\x96\x7f\xf0\xc8\x66\xb5\x96\xa6\xbc\xcb\xdb\x5d\x35\xd1\x8b\x5c\x4a\x99\x31\x3a\x14\xeb\x14\xeb\x8d\x8d\xf1\xc4\x46\xbb\xae\x60\xaf\xc7\x9e\xff\xb3\x9a\x01\x60\x18\xa9\xa3\xeb\x42\xa6\x6f\x89\x2e\x8b\x42\x2a\xa3\x49\xce\x0c\xb5\xb2\xef\xc2\x12\xe4\x30\xed\xb4\x5e\x07\x8b\xdf\xac\xfe\x0d\x1c\x06\xba\xf1\x03\x70\x49\x0c\x30\x19\x06\xad\x0b\x96\x2c\x84\x4c\x99\x3d\x84\x33\xfc\xa7\xbb\xdb\x2f\x92\x44\x96\xc2\xb8\x3f\x18\x6a\x4a\xbd\xd8\x48\x6d\xae\x6f\x23\xc0\xe2\xeb\x85\x4c\xaf\x6f\x67\xad\x7f\xe9\xe0\x15\x44\x46\xb2\xc1\xfa\x1c\x8e\x26\x7f\xf7\x5d\xb3\xa2\x47\x4e\xe1\x3f\xa1\xad\xfd\x2d\x0d\x14\x9b\x68\x3e\x5c\x93\x47\xc5\x8d\x61\x02\x24\x15\x08\x61\x95\xab\x99\x3d\x09\xf5\xc5\xbb\x7d\x13\x95\xef\x34\xea\xe0\xaf\xfc\x34\x47\x2f\xdd\x7e\xe4\xd7\x8d\x54\x5a\x5d\x09\x31\xd2\xa0\x7f\x6a\x07\xda\xc5\xed\x35\xd9\x22\x3e\x4f\xbc\xcc\xf8\x93\xbf\x8a\xdc\xb5\xe8\xf3\xef\x83\x31\xbf\x7f\x22\x1f\xa8\x4a\xc2\x38\x8c\x57\xc2\xf4\x5b\x70\xc8\x0f\xe2\xab\x0a\x0a\x25\x19\xcf\xb9\x0b\xd4\x72\xe5\x65\x34\x79\x89\x3f\x2e\x92\xa2\x9c\xb9\x17\x16\x39\xcb\xa5\xda\x0d\x9f\x52\xf7\x3a\x2b\x36\x2c\x67\x8a\x66\x73\x6d\xa4\xa2\x6b\x36\xab\xc0\x23\xd8\xea\x5f\x08\x78\xf8\x54\x36\x26\x78\x08\x1d\x75\x99\xa4\x54\xf6\x9e\xcf\x76\x9e\x2b\xb2\xf4\xa4\x9c\xa1\xc2\xf2\xcd\x51\x32\x49\xa5\xc4\xa2\x4c\x53\xd1\x21\x88\xb1\x5b\x99\x95\x79\x5c\x46\x55\x7d\x3f\x63\xbd\x21\xb1\xb5\x42\xaf\x3e\xb9\x14\x90\xf2\x2d\xd7\x71\xb1\x8a\x1d\x42\x00\x77\xe1\xa3\xb2\x34\x45\x69\x5c\x5a\xcd\x50\x67\xe2\xe6\xc3\x3e\x17\x52\x83\xea\x53\x05\x30\xb7\xf8\xdf\x9b\xe1\x64\xc1\x91\x0b\xf6\x23\x8d\xdf\x5a\x5f\xb6\xe6\x6d\x7d\x32\x2b\xf6\x77\xe2\x7d\x89\xe7\x5e\x7e\x2a\xa7\x62\x5e\xe8\x65\x3b\x8d\x02\xa3\x9b\xae\x48\x0c\x62\x89\xd2\x04\xba\x1d\xc6\xed\xe7\x4b\xe9\x3c\x55\xdc\x03\x2c\xa5\xbe\xee\x56\x4a\xe6\x0b\x02\xf6\xa1\x28\x42\x5f\x32\xb0\x26\x67\x3c\xf5\xb0\x1e\x58\x50\xe9\xf4\xcf\xa4\x47\xfd\x9a\xf4\x28\xe7\xbd\x47\x25\x2a\xba\x92\xc3\x3f\x9d\x12\x15\xf1\xda\xd0\xac\xe6\x70\x18\x82\xc6\xfb\x00\xfc\x41\xe3\x7d\xbf\x25\xab\xd3\x80\xef\x25\x31\x23\x49\x21\x8b\x32\xa3\xa6\xc7\x04\x1a\x76\x23\xd5\x36\x7e\xcf\xa0\x6a\x23\x6d\xed\x92\xc3\xbb\x29\x1f\x30\x5d\xb7\x8c\xd6\xe4\x22\xcb\x08\x17\xc8\xa0\x00\xac\xb7\x86\x2a\x86\x42\x16\xa1\x68\xde\xdf\xf6\xdb\xf1\x1f\x5d\x4e\x60\xc3\xec\xcb\xb5\x55\xe2\x94\x81\x10\x31\xc8\x19\xc4\xfb\xc1\x19\x1b\xb9\xa8\x32\x07\x7b\x60\x56\x62\x41\x15\xbf\x7a\x90\x46\x8c\xd1\x6f\xda\xf8\x85\xc3\xcc\x0d\x7d\xe8\x03\x59\x28\x96\xb0\x94\x41\x5c\xca\x27\x8c\x88\xf5\x38\x5c\xee\xec\x1a\xaf\xc4\xb6\xb2\xdb\x96\xe8\x63\xc2\xcb\xc0\x42\xee\xa3\x28\xfa\xc0\x5a\x90\x9f\xc3\xdb\x62\x89\xee\xce\x97\x89\xac\x9c\x2e\x70\x3f\x55\x9a\x82\x4f\xf6\xe8\x3d\x5d\x75\x54\xd4\x13\xdc\x2c\x95\xa9\x73\x40\x4c\x38\xb8\x53\x6b\x43\x51\xfb\x2e\x3d\x81\xf9\x35\xe6\xf2\xfb\xb6\x2f\xbe\xb1\x97\x5e\xd4\x85\x16\x7d\x99\xc5\x5e\x64\x23\x8c\x81\xe3\x2e\xa6\xd8\x4b\x29\xea\x12\x29\x14\x5b\xf1\xcf\xd1\xb4\x79\x21\x6a\x85\x8b\xa7\x4c\x18\xab\xdc\x40\x09\xdd\x42\xb1\x82\x89\xb4\x4a\x4b\x1e\xba\xe4\x1c\xab\xae\xad\xf7\xb5\x13\xf1\xb4\x8e\x42\x94\x23\xc7\x1e\xc0\xbb\x2e\x49\x76\x3a\x7d\xff\x3c\xa7\xcf\x6d\xf0\x57\x3b\x7a\x4f\x94\xad\x78\x57\x14\x74\xc7\xd2\xcf\x2e\x1b\x81\x45\x40\x7d\xa3\x69\xa7\x8e\xd5\x3c\x07\x28\x7d\x24\x72\x5f\x17\x77\xe0\xba\x66\x13\x55\x00\x27\x94\x0f\x56\x24\x63\x5b\x96\xb9\x9b\x91\x60\xa8\x66\xde\x2f\x2c\x41\xcc\x36\x58\x3a\xac\xb4\x6f\xc9\x58\xf1\xb4\x25\x3a\xc1\x94\x2c\x3b\xb1\xa4\x9d\x49\x9a\xc2\x1f\x95\xcc\x32\xa6\xfa\xa6\x9a\xf1\x07\x46\x2e\x21\x16\xdc\xe5\xe6\x88\x94\xdc\x19\x6a\x2c\x29\xdf\x31\xd3\x67\x45\x1f\x20\x53\x98\xcb\x6d\x99\x65\xb7\x32\xe3\x49\x8f\x36\xdd\xde\x1e\x88\x66\x27\x45\x99\x65\xa4\x80\x8f\x16\xe4\x83\x80\xf3\x7e\x91\x3d\xd2\x9d\x9e\x91\x1b\xb6\x65\x6a\x46\xae\x57\x37\xd2\xdc\xa2\x30\xd3\xc7\x13\x9b\xce\x68\xfc\x9c\xf0\x15\x79\x9b\x61\x95\x6e\x43\xd7\x20\x68\x7a\xb3\xf2\xcc\x62\xb4\x09\xb6\x07\x2a\x1c\xf3\x47\xae\x3b\xa5\xb5\x27\x13\xd3\x77\x00\xc9\xb2\x24\xfc\xf7\x51\x88\xcf\xf8\x8a\x25\xbb\x24\x8b\x39\x11\x17\x09\xf8\x6e\xea\xe4\xe8\x9a\x06\x7d\xb7\x4c\x97\x68\x03\xc2\x6a\x6f\xa1\x00\x2c\xd1\x81\x35\x4c\x6a\x72\xac\x66\x82\x2a\x80\x8e\x96\x70\x87\x2f\x90\x42\x6a\x73\x67\xb5\x84\xc8\xda\x1b\x67\xb7\xfe\x03\x02\xa5\x0c\xb2\x8c\xa5\x84\xe7\x39\x4b\xad\x56\x90\xed\x08\x5d\x19\xa8\x8e\x50\xcd\x3e\xc0\xd1\x2c\x04\x28\xf7\x9e\x56\xc9\xb6\x1b\x2a\xd2\x8c\x29\xb2\xa2\x3c\x73\x9a\x47\x4b\xa3\x31\x4c\xe5\x5c\x0c\xd4\xcb\x40\x5b\x36\x28\x3f\x56\x79\x4a\x12\xa9\x5c\xff\x4f\x50\xed\xdd\x9f\xea\xb3\x01\xfc\x7b\x90\x6b\x90\x3a\xe1\xa7\x9e\xd2\x32\x93\xc9\x83\x26\xa5\x30\x3c\xc3\x05\x48\xf9\x00\x45\xdd\x33\xa0\xd5\x06\x29\x07\xc0\x8e\x24\xf2\xea\x3f\xe7\x15\x65\xcc\xed\xb8\xfa\xfc\xbb\xfa\x4f\xf0\x43\xff\x15\x19\x27\x5b\xb0\xcf\x2c\x19\x91\x55\x66\xb9\x8c\x45\x3e\x24\x2d\x4a\x51\x89\x18\x2b\x69\x99\xb5\xdd\x02\x3c\x05\x03\x37\xe2\xb2\x91\xe8\xb5\x20\x57\x9f\x59\xd2\x48\x16\x84\x92\x41\x70\xdc\x20\x20\x9d\x3e\x0c\x44\xa0\xc4\x5b\x2b\x83\x21\xba\xbd\x6b\x7e\x87\x5f\xf9\xc4\x10\x07\x84\x64\x5c\xc0\x29\x76\x61\xbb\x11\x76\x21\x2e\x34\x4f\x59\x9b\xbe\xf0\x04\x38\xf9\x8a\xa4\x5c\x41\x36\xdc\x8e\xac\xe2\xf2\x91\x1b\xf3\x81\x84\x31\x29\x0d\x79\x79\x76\x7e\xf6\xea\xc0\xa8\x71\x66\x6f\xd9\x8c\x21\xaf\x8a\xb1\x8d\xde\x37\x60\xdb\x0b\x80\xe7\x45\xb6\x83\xd5\x9e\xa5\x33\xc2\x8d\x8f\xf0\x51\xa5\x70\x2b\x8b\x00\xea\x62\x9a\x67\x44\x4b\x62\x14\xad\x32\x3b\xe0\x57\x48\x69\x51\xa5\xe3\xb4\x2f\xcf\xfe\xe3\x2c\xc6\xf2\xc8\x4c\xf2\x8a\x3c\x4a\x71\x66\x00\x8d\x0b\x72\x2f\xad\x74\x59\x0f\xb5\x93\x25\x11\x0c\x33\xb9\xd8\xe7\x22\xe3\x09\x37\x11\x1e\x3e\x02\xcc\x8f\x40\xaa\x97\x74\xcd\x3b\x30\x1e\xfb\xea\x33\x37\xce\x7d\x6e\xe9\xff\x35\x50\x06\xb2\xb9\x18\x14\x68\x92\xf1\x2d\x3b\xdf\x30\x9a\x99\x0d\x56\x06\x11\x52\xcc\x7f\x61\x4a\x42\xd4\xb6\x70\x7f\x39\x61\xfd\x94\x67\x29\xe5\x18\x69\x6e\xb4\xac\xef\x2f\x87\x09\x58\xed\xa7\x75\xe0\xfe\x7a\x7f\x7f\xfb\x17\x66\xf6\x58\x82\x85\xe3\x1d\x98\xa0\x3a\x32\xb5\x92\x6a\x80\x94\xe3\x79\xc3\x46\xea\x81\x39\x1e\xce\x53\x6a\x83\x79\x62\x78\x99\x0b\xab\xf1\x19\xd9\xf2\xb2\x45\x1e\xe2\x42\xa6\xe4\xfa\x76\x41\xfe\x2e\x4b\x3b\xe7\x25\x5d\x66\xbb\x2a\x35\x48\x33\x43\x5e\xd8\xc1\x5e\xd8\x53\x6d\xf1\xf0\x57\x46\xd3\x7e\x39\xb5\xf9\xd8\x23\xc5\xe8\x29\xeb\x22\x92\xe6\x0c\xc6\xb2\xd2\x52\x1b\x99\x93\x0d\x7e\xbc\x17\x63\xed\xf6\x36\x86\x37\x59\x0a\xf1\x99\x62\x8a\x15\x70\xf4\x3c\xd4\xe7\x2a\x3b\x64\xc7\xc4\x55\xbb\xdf\x97\x50\xa1\x2c\x69\x2e\x29\xca\xa1\x80\xd5\xeb\x30\x5a\x52\xe0\x52\xec\x96\x47\xf9\x6e\xc6\x16\x06\x8a\xf5\x59\x91\x2e\x6b\x06\xae\xc9\x29\x67\x01\x83\xff\xfe\x73\x5c\xed\x99\xd3\x4c\x33\x26\xa9\xfb\xc8\x79\x8e\xab\x3e\x12\x89\xaf\x79\xf4\x8c\x9f\xa9\xf6\x48\x11\x15\xab\x74\x18\xa9\x64\x15\xf4\x24\x81\x78\x68\x3c\xbe\x40\xc8\x9a\xa9\x6d\x7f\x8e\xc1\xfe\xfc\xa2\x50\x5f\xc8\x90\xee\xe2\x1f\x2a\x76\x1f\x06\x7d\xea\x90\xa5\x1e\x55\x73\x74\xff\xfd\x63\xca\xa6\xa0\x09\x4e\x11\x51\xe6\x4b\xa6\xea\x98\x43\x65\x6a\xe4\x45\xec\xbb\x3c\xf0\x4e\xdd\x20\x40\x6f\x84\x6a\xd7\x67\x8d\xa1\x24\x49\xfe\xf8\xdf\xfe\xdb\xef\xff\xdb\x02\xa7\x58\xf9\xb2\x04\xb9\xbe\xb8\xb9\xf8\xf9\xee\xd3\x3b\x08\x9e\x1f\xde\xc5\xcf\xf3\x5a\x9f\x99\x73\x61\xe6\x52\xcd\x11\x53\x6f\x89\x51\x83\x54\x0d\xd1\x7d\x11\xe7\xbe\x6d\x95\x83\x8f\xec\x1a\xac\x90\xb7\x92\xca\xdf\xbc\x4e\xff\x43\x15\x2d\xee\x1a\x69\x5a\x3e\x2c\xf9\x7e\x85\xea\xc1\x96\x1c\x4e\x21\x65\x99\xa4\xb8\x93\xc9\xc3\x28\x39\xeb\xec\xfe\xdd\x2d\x7e\xd4\x10\xb5\xa8\xf0\xca\x17\x17\x5b\x99\x6d\x87\xc9\x9e\x92\xfb\x77\xb7\xb0\x90\x05\xfc\x17\xe8\xa5\xa0\x1a\xec\x2c\x64\x1f\x48\xe6\x4c\xc0\x56\x8d\x18\x52\xc2\x11\xaa\x62\x34\xe3\xda\xf0\x04\xa0\xd6\x26\x12\x0b\x3f\x6c\x19\x7e\x56\xa9\xef\xec\x83\x37\x26\x0f\x0b\x80\x71\x87\xb1\x21\x00\x0e\x07\x50\xfc\x2a\x38\xa7\xe3\x98\xaa\xaa\xc2\x30\x71\xce\xc6\xf3\x65\x79\x4b\xc4\x4b\x85\x62\x77\x46\x16\xd1\x16\x46\x7c\xbd\xc7\xbe\xb8\x64\x2b\xa9\x58\xbc\x81\xb1\x36\x18\x56\xc5\x9c\x05\xc4\x3e\x7b\x5d\x51\x36\x4d\x7f\xc1\x18\x0b\xfb\xe8\x32\xd9\x78\x1d\x5d\x30\xad\xcf\xc1\x94\x58\x16\x28\xa3\x83\xd9\xb2\x54\x6c\x66\xd7\xcc\x72\x58\xd1\x2c\x26\x4e\xd0\x2e\x86\x09\x7c\x1d\x5a\xa1\xde\x37\x6c\xa1\xce\x92\xe2\x91\xb1\x67\x82\x0c\x41\x55\x54\x6f\x18\xe4\x95\xb1\xcf\xbc\x2e\xc7\x4a\xb5\x14\x98\xdb\xe5\x90\x03\xfc\x5c\x93\x82\x6a\x2c\x69\x13\xba\x49\xea\x89\x21\xb8\x5b\x99\x9e\x9d\xe9\x16\xa8\xb5\xa2\x09\xb3\x1a\x38\x97\x29\x81\x84\x84\x54\x3e\x86\x5c\x5b\x4b\xb6\xe6\x42\xfb\xbd\xb5\x43\x78\x22\xb0\xdc\x1c\x4b\x36\xf9\xfc\xf7\x05\xf9\x58\x25\xdb\x0d\x5b\x6a\x65\x69\x12\x59\x33\x09\x37\xf3\x7d\xc3\x32\x84\xad\xd4\x65\xb9\x43\xcb\xf7\xe4\xe4\x63\x7e\xcc\x30\x0a\x9c\x85\x39\x00\xb5\x41\x80\x63\x2d\xcc\x21\x14\xa8\xc6\x57\xbd\xfb\x03\xf5\x23\x69\xb2\x69\xfb\x5d\x26\x63\xf5\x64\xac\x0e\x3d\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xce\x67\x32\x56\x4f\xc6\xea\xc9\x58\x3d\xfc\xed\x64\xac\x9e\x8c\xd5\x93\xb1\xba\xe3\xf9\x16\x4d\x2e\x93\xb1\x3a\xfc\xf9\x64\xac\x9e\x8c\xd5\x01\xa8\x93\xb1\xba\xf3\xfd\x5f\x03\xe7\x9c\x8c\xd5\xa1\x8f\xbf\x31\x63\xf5\xc0\x0b\xde\xea\x7b\x6b\x65\xdc\x98\x48\xec\x5b\xb0\xb1\xf1\xc4\x99\x87\xe5\xaa\x15\xd5\x8b\xc0\x16\x75\xf5\xbd\x9e\x89\xd7\xf9\x80\x3e\xa6\xd5\x19\x81\x6b\xa3\x73\x67\x4c\x30\xd8\xf3\x7a\x60\xc6\x47\x57\xfb\x10\x78\x7d\x5e\x48\xfc\x7f\xb5\x25\xaf\x61\xc2\x43\xb9\xbf\xfb\xd0\x0f\x33\xb1\xb0\xed\xee\x28\xbb\x5d\xdb\x32\x17\x20\x9e\x27\xd8\xec\xe2\xb8\x73\x94\xad\xee\x08\x3b\x5d\x9c\xad\x2a\xd6\x46\xb7\x6f\x81\x1b\x00\x1b\x6d\x9f\x6b\x5a\xdf\x06\x60\xc6\xd9\xe6\xfa\x2c\x6f\x43\x22\x5a\x8f\x5d\x6e\xd0\xea\x36\x00\xb7\xdb\x26\x17\xb4\xb8\x0d\xcd\xb4\xd3\x1e\x17\xb4\xb6\x0d\x23\x36\xd2\x16\xf7\xe5\x5b\x98\x44\x70\x6e\xe7\x56\xbb\xdf\x28\xa6\x37\x32\x0b\x9c\xa4\xd6\x29\x7a\xcf\x05\xcf\xcb\xdc\x12\xa6\x86\xbe\xae\xdb\xca\x43\xa7\x2b\x8a\x47\x1e\x1a\xb4\x6e\x41\x73\x14\x20\x3d\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\x36\x74\x0b\x1c\xa7\x4c\x12\xc6\xa0\x86\xf9\x65\x94\xc1\xec\xf7\x8b\x6a\x76\x55\x41\xc4\x37\xfd\x3b\x13\xd7\x34\x39\x46\xaa\x19\x34\x61\x3e\x87\xf9\x32\x8e\x4d\x0e\x0b\xb0\xa3\x4d\x96\x11\xc5\x70\x9e\xc5\x5c\x19\x65\xaa\x8c\x3c\x45\xd1\x26\xca\xf1\xe6\x49\xd8\xdf\x21\xe5\xe5\x18\xd3\x64\x14\x17\x19\x6d\x92\x8c\xb1\x41\x1f\x65\x8e\x1c\x63\x8a\x3c\xaa\xce\xcb\xb1\x26\xc8\x51\x7a\x47\xb4\xe9\xf1\x34\x66\xc7\x67\xa9\xa9\x14\x81\x97\x38\x33\xe3\xc8\x6e\x67\x43\xe6\xc5\x61\xd3\xe2\x29\xcd\x8a\x91\xa8\x1d\x56\x8a\x23\x14\xe2\x31\xca\xf0\x08\x45\x78\xb4\xf9\xd0\x21\x69\x60\x5b\x63\x15\xe0\x3d\xf5\x76\x00\xea\x71\xca\xef\x13\x14\xdf\x18\x73\xe1\xb3\x98\x0a\xc7\x99\x09\x4f\xd6\xfc\x2b\xa8\xbe\x47\x1c\x55\x2e\xb8\xe1\x34\xbb\x64\x19\xdd\xdd\xb1\x44\x8a\x34\xb6\x59\xfc\xd9\x4d\x45\x73\x1a\x3f\x74\x92\x5b\x3b\xca\x66\x43\x5d\xb5\x9c\xa0\xdf\xdb\x05\x28\x79\xcd\xdd\x5d\x2e\xae\x3b\xbe\x9d\xe1\x31\xd9\xcb\x27\xd0\xaf\xc9\x49\x45\x44\x0c\x0c\x1a\x87\xe6\xbf\xca\x47\x22\x57\x86\x09\xf2\x92\x0b\x8f\xe9\x57\x0d\xe1\xb0\x96\xb5\x43\x24\xe7\xc8\xd3\x7e\xf7\xe6\xb5\x07\xf3\xb5\x44\x65\x10\xea\xb5\x3e\x85\xd6\xe1\x40\x3d\x45\xed\x70\x20\x56\x65\xd6\x56\x3d\x50\x1d\x89\xd5\x3b\xde\xd4\x25\x51\xde\xc0\x5c\x2a\x5a\xb6\xda\xa4\x0b\x66\x3c\x44\x78\x10\xe2\x17\xd8\x8a\x08\x97\xc0\x51\xee\x00\x34\xf8\x0f\x5c\xb1\xa3\x5c\x01\x4d\x63\x7f\x00\xee\x18\x37\xc0\xb3\x68\x4f\x27\x34\xfd\x8f\x31\xfb\xff\xd3\x49\x36\x11\xe6\xfd\x5f\x91\x64\xf3\x25\x64\x01\xc3\x73\x26\x4b\x73\x22\x31\x00\x5b\x2d\x36\x38\x32\x0f\xd7\x2b\x92\xe5\x5e\x83\x8e\x37\x0e\x60\xe7\x2d\x75\xba\x88\xda\x6f\x4c\x4a\x18\xd8\xa7\x7e\x25\xb9\xb7\x09\x50\x2d\x8b\xd5\x35\xca\xa9\x26\x94\x5c\xde\xdc\xfd\xfc\xc3\xc5\x9f\xaf\x7e\x58\x90\x2b\x9a\xf4\x95\x0a\x6f\x54\x09\x11\xd8\x10\x11\x69\x7f\x43\xb7\x8c\x50\x52\x0a\xfe\x8f\xd2\xb5\xed\x7c\x59\x41\x7c\xe5\xbd\x26\x3d\x40\x87\xea\xab\x0c\xf0\x0c\x68\x1c\x30\xa2\x52\x25\x36\x1a\x40\x33\xb2\xb4\x62\xbe\x92\xf9\xbe\xdb\xef\xca\xfe\xa9\x9f\x45\x51\xe4\x3d\x1b\xa6\x18\x59\xf3\xad\x33\xd8\xb9\x12\x34\x8d\x5e\x99\x96\x24\x2d\x25\xd8\xdb\x90\x2e\xc1\x4c\xdd\xcb\xa1\x04\x33\x96\xfa\x2a\x8d\x43\x0a\xdd\xcc\xbf\xb0\x1a\x89\x9e\x91\x65\x09\xa6\xfa\x42\xf1\x9c\x2a\x9e\xed\x9a\x43\xd0\xac\x8f\xdf\xdc\x48\x7f\x43\xef\xf0\x3a\xae\xa7\x7f\xf9\xe1\xea\x8e\xdc\x7c\xb8\x87\x9e\x48\xf6\x66\x05\x2b\x3a\xfc\x1d\x10\xb3\x64\xfd\x68\x70\xb5\xad\x17\xe4\x42\xec\xf0\x13\x3c\xe7\x5c\x43\xd7\x5c\xe6\x3b\x3e\x5b\xe4\xf8\x52\x50\x2f\x5e\x2f\xe0\xff\xfa\xca\x5e\xd3\x34\x55\x96\x9b\x57\x4e\x88\xbd\xfc\x01\xcb\x65\x81\xdf\xf3\x65\xd6\xd8\x3b\x87\xbd\x2f\xd6\x19\xac\x72\x26\xde\xda\x65\x37\x1b\x84\x55\x1b\x09\x08\xc1\x7a\xa5\xd0\x84\xb4\x97\x0f\x0c\xf6\x35\x8b\xac\x57\x59\x4f\x28\xba\x5e\x5e\xcd\xaf\xfd\x65\xea\x0e\x85\x6c\x94\xb4\x26\xd7\xb7\x7e\x5b\xc2\x17\x1a\x94\x11\xab\xee\x42\x57\x0c\x1a\x00\xa3\x49\x62\x46\x5e\x93\x3f\x91\xcf\xe4\x4f\x70\xb5\xfe\x31\x04\x2c\x8e\x83\xc6\x89\xb5\x28\xb5\x5d\xdf\x46\x63\xe5\x27\x7b\x04\xec\x37\x76\xe5\x46\x92\x25\x17\x29\x76\x68\xfa\x6c\x98\xb2\x07\xdb\x61\xeb\xc9\x15\x0e\xed\x20\x27\xdd\x30\xb0\x4e\x90\xeb\x55\xa3\x56\x58\x58\x52\x1c\xb9\x65\x16\xb4\x95\x64\x6f\x90\xc8\xc3\xe6\xe9\x56\xc5\xb2\x7a\x24\xe8\xd6\xde\x3e\x41\xf6\x0a\xd7\xa6\xd1\x5b\x38\x2c\x1b\x4a\xd0\x10\xd0\x1d\xb8\xe1\x41\xaa\x3c\x2d\x21\x8d\x6a\xbe\xd7\xda\x85\x3d\x4c\xef\x09\x8a\x03\x42\x78\xea\x6f\xd6\x46\x3a\x54\x21\x53\xbc\xaa\x61\x52\x69\x83\xdd\xf8\x5b\x39\x08\xf4\xf0\xc6\x76\x21\x2a\x95\xea\x0c\xf4\x65\x4f\x82\xeb\xc6\x09\x15\x2c\xd5\x40\xc6\x82\x3d\x2d\x55\x0f\xbc\xe0\xc6\x44\x9d\x8f\x42\x49\x23\x13\x19\xac\x19\xd9\x36\x09\xbb\x0f\x60\x19\xa8\x56\x7a\x4d\xfc\xc7\xcb\xdb\x99\xd5\x08\xa1\x78\xde\xdd\xbb\x21\xab\x5c\xab\x3d\xdc\xfd\xbb\xdb\x60\x9b\x9a\x88\xc5\x0c\x97\xf3\x6e\xb1\xf0\x3e\xb1\xfc\x69\xb5\x27\x15\xa3\x29\x3f\x59\x6c\x8d\x6f\x75\x58\x41\x1d\x13\x64\x93\xcb\x2d\x4b\xf1\x02\xaf\x5b\x26\xa6\xd0\x90\x57\x07\x22\x6f\x86\x65\xc8\xaf\x60\x19\x9c\x22\x6f\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\x09\xbc\x33\x45\xde\x4c\x91\x37\x53\xe4\x4d\x27\x5a\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\x69\xbc\x34\x45\xde\xb8\x49\xfd\x97\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\x39\x18\x65\x8a\xbc\xf9\x36\x7c\x6a\x53\xe4\x8d\x7f\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\x99\x22\x6f\xf6\x9e\x29\xf2\x66\x8a\xbc\x99\x22\x6f\xc2\xfb\x54\x75\xf3\x8e\x71\xa1\xbc\x93\x79\x51\x1a\x46\x3e\x56\xed\xea\xab\x9e\xe9\xcb\x1d\xfa\x05\x1b\x87\xe3\xb9\xdc\x1c\xd8\xb6\xab\x54\x10\x2a\x72\x8e\xb5\x10\xe7\x09\x4e\x6d\x5e\xad\x67\x5e\xcd\xe4\xfc\x58\x57\x07\xf6\xce\xef\xa7\x87\x3a\x3e\xe6\x36\x8a\xf1\x47\x31\xae\x36\xc6\x7f\x80\x29\x34\x0c\x2d\xd8\x2c\xea\x33\x90\x2f\xcd\x65\x89\x25\x20\xdd\xea\x03\x63\x57\x78\x41\x33\xd1\xd7\x43\x3b\x89\xef\x19\xcc\xf4\x57\xc6\xfe\x47\x37\x89\x7d\xfc\x3b\xf6\x71\x1c\xfe\xfd\x91\x81\x08\x84\x6a\x04\xae\x89\xcc\xb9\xb1\x72\x8a\x15\xf6\x1a\xd1\x42\x21\xaf\x06\x37\x2d\x1b\xaa\xa3\x16\xf0\x39\x52\x83\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xef\xa6\x16\x42\x17\x54\xbe\xad\xa4\x25\xd8\xf5\xb9\x6f\xbe\x0b\x8c\xf3\x9b\xa6\xa0\x81\x17\xac\xbc\xaf\xb8\xd9\xbd\x93\xc2\xb0\xcf\x3d\x12\x4c\x9b\x18\xee\xdc\x27\xae\xab\xa0\xae\x44\x29\xe7\xc4\x54\xa5\x80\xa8\x86\x88\xab\x24\x06\x59\xd8\x6d\xec\xdc\x4f\x14\xb0\xc2\x3e\x9b\xf3\x1e\x90\x71\x5b\x61\xa8\x7e\xa8\xf7\x81\xcd\xed\xe5\x54\xa3\xfb\x60\xac\x63\x19\x27\xb0\x98\x5b\xc5\xb7\x3c\x63\x6b\x76\xa5\x13\x9a\xc1\x9e\xc7\x8a\x00\x17\x3d\xdf\xfb\xae\x8a\xba\xea\xa2\xd9\xd7\x31\xdb\xcd\x13\x84\xba\x84\x0a\xb2\xa6\x5c\x90\xdc\xe2\xa8\xf0\x60\xa1\xfb\x9e\x80\x0e\x6f\x05\x55\x56\x21\x70\x1f\x84\x24\x2e\x08\x0c\x5b\x4a\x99\x39\x8f\x6c\xb6\xab\xe7\xe4\x5c\xfd\x42\xfe\x2c\xd8\xe3\xcf\x76\x1c\x4d\x56\x19\x5d\x87\x7a\x51\x13\x57\x11\x96\x99\x83\x92\x2d\xd5\x74\x48\x1f\x3a\x42\x8c\x41\x83\xf8\x47\x28\x76\x60\xec\x6c\xf7\xfd\x96\xbc\x79\x05\x54\x4b\x35\xa9\xa0\x87\x8c\x2a\xbf\x7b\x05\xd6\x97\x77\x17\xb7\x3f\xdf\xfd\xfd\xee\xe7\x8b\xcb\xf7\xd7\x37\x43\x47\x34\xdc\xa7\x34\xa1\x05\x5d\xf2\x8c\x87\x79\xf7\x81\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4f\x95\x2c\x70\x9d\xaa\x14\x10\xaf\x59\xc7\x60\x45\x18\x32\xbc\x0f\xaa\x0a\xef\xc4\xd6\xdc\xed\xa1\xd6\x8a\x0a\xe3\x85\x9d\xa1\xfa\xdc\x88\x66\x55\x0a\x2b\xa8\x3e\xd5\xe3\x46\xd3\x31\x41\x09\x17\x69\xca\xd2\xd6\xd4\x4f\xec\x03\x7a\xe7\x41\xef\xea\x88\x51\x72\xfb\xe1\xee\xfa\x7f\xc7\x8f\x4a\x1c\x8d\x44\xb9\x07\x4e\xe4\xc1\x26\xc4\x92\xc9\x08\x4c\x7e\x74\xd1\x3d\x13\x2e\x7b\xde\x19\xa8\xe4\xef\xb9\x4a\xe4\xe1\xfe\x58\x8a\x76\x64\x7e\x0d\x81\xe4\x32\x65\x0b\x72\x8b\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\x6b\x3f\x16\x86\xd3\x2c\xdb\x11\x2b\x89\x6d\x69\xc6\xd0\x85\xac\x64\xaf\xb6\x42\xea\x92\x5a\x18\x97\xda\xe4\x1a\x2b\x9a\xe9\xc0\x01\x8f\xe1\x83\x96\xd5\xbf\xb7\xc2\x64\x24\x9e\xaa\xf7\x49\xca\x84\x34\x4e\x2e\xb5\x23\x41\x40\xad\x92\x09\x41\xd9\x14\xdd\x10\x81\x55\xd5\xe1\x44\x15\xb3\x04\x16\xeb\xd9\x20\xd7\x7e\xad\xb7\xd5\x98\xa0\x89\x07\x60\x96\x9a\xe9\xbd\xdb\xc6\xb1\xc1\x5a\x5a\xb5\xe3\x2a\x46\x53\x88\x0d\x2b\xa8\xd9\x80\x5d\x33\x00\x34\xa7\xfa\x81\xa5\xf8\xea\x02\xef\x61\x27\x49\x6b\xd7\x01\xc0\x4d\xef\xde\x62\x61\xc5\xa8\x29\x15\x83\xfb\x37\x2c\xe4\x2e\x19\x61\x82\x2e\xb3\x50\xe4\x59\x54\x50\x24\x4d\x3f\x88\x6c\xf7\x51\x4a\xf3\x7d\x15\x52\x15\xb9\x9d\x3f\x55\x3d\xc1\x9b\x1a\x34\x5c\xb6\x60\xa4\x4c\xe7\x80\x26\x08\xe4\x8a\xab\x64\x7e\x59\x6f\xdf\x09\xc8\x53\x95\xe2\x42\xff\x45\xc9\x32\xb6\x29\x87\xa5\xa0\xbf\x5c\x5f\xc2\xa9\x2a\xf1\xdc\x30\x61\xd4\x0e\x82\x22\x0f\x32\x78\x86\x65\xb8\x05\xf9\xd1\xd2\xd4\x1e\x15\x59\x89\xab\x14\x9a\x99\x05\x79\x4f\x77\x84\x66\x5a\x3a\x61\x2a\x24\x19\x09\x72\x0b\x3e\x93\xa6\xfc\xbf\x20\x10\xe3\x8c\x71\x17\x4b\x69\x36\x64\xef\x85\x01\xe2\x3c\x84\x88\xe1\x7b\x68\x60\xaa\x13\x94\xb8\xd8\x07\x1c\x22\x4e\xfa\xc0\x34\x29\x14\x4b\x58\xca\x44\x12\xd8\xc3\x86\xad\xe8\x8f\x7f\x78\x92\xf9\x1e\x76\xfa\x46\x0a\x4b\xc6\x91\x7b\x7d\x2d\x52\x9e\x50\xe4\x41\xae\x9b\x75\x4d\xc2\x60\xd5\x74\x32\x26\x85\x18\xb8\x01\x2e\x5b\x6a\xa6\xb0\xbb\xb3\x2a\x19\x22\xf1\x6f\xe5\x92\x65\xcc\x60\xc4\x2d\xc4\xf5\x53\x83\xad\x04\xb0\xa1\x3c\x35\x9e\x30\xc2\x27\x9d\x09\x5d\x42\xbb\x10\xab\x1a\x1b\x92\x4a\x56\xc7\x2b\x52\x4d\x7e\xbc\xbe\x24\xaf\xc9\x4b\x3b\xbf\x57\xe0\x63\x59\x51\x1e\x12\xdb\x8d\x44\x2f\xcc\xbe\x5c\xbd\xf2\xc0\x61\x19\x40\x9f\x44\x2a\x3c\x86\x33\x22\x42\x3e\x1f\xe8\x16\xe3\x56\x68\xd5\x1d\x1f\x63\xec\x3c\x73\x60\xb4\x69\x13\x7a\x80\x9c\x43\xe3\x84\x09\xbd\x8f\x9c\x03\x10\x87\x09\x7d\x04\x39\x47\xb3\xa4\x1f\x35\x53\x23\x38\xd2\x8f\x27\xe5\x48\x4d\x11\xc0\x52\x6d\x7b\xf5\x48\x9a\x39\x33\x34\xa5\x86\x12\x1e\xda\x8e\x52\x34\x3a\x82\xfc\x1a\x36\xf8\x74\xfc\x4a\xb3\x1f\xb8\x28\x3f\xa3\x8b\x6c\x8c\x0a\x79\x77\x05\x1f\x92\xc4\x4f\x1e\x10\x4e\x8b\x22\xe3\x18\x20\xdc\xce\xa3\x0c\x60\x06\x0f\x79\x33\x3d\xa6\x4b\xf0\x81\xa3\x4c\xb3\x4c\x5a\x56\x69\x6f\x75\x2a\x52\x99\x07\xc0\xee\x4f\xd0\x0a\x4c\x8c\x26\x9b\xa6\x85\xbd\x83\x58\x46\x5d\x52\xff\xc5\xaf\xbd\x38\xd5\x39\x63\x5b\x16\x4c\xbb\xd9\xcf\xae\xb5\xef\x5b\xc1\xc9\xef\x00\x00\x20\x19\x5d\xb2\x0c\x2f\x0f\xa4\x92\x48\x67\x6b\x14\x0d\x45\xab\x66\x4a\x66\x63\x82\x91\x3e\xca\x0c\xfc\x5b\xb4\x5a\x8c\x05\xf0\x8d\xac\x05\x5e\x8b\x5f\x0b\xc8\xf5\xad\xb5\x80\xbe\xf3\x6d\xac\xa5\x0c\xde\x44\x07\x6b\xb1\x17\x57\x7b\x2d\x70\x83\x7c\x0b\x6b\x89\x50\xeb\x1f\xb9\x48\xe5\xa3\x1e\xcf\x74\x7f\xc2\x0f\x3d\x67\x48\x2c\xeb\x31\x5c\xac\x75\x93\xf1\xd2\xa0\xb1\xb4\xa9\xa7\x76\x71\x5e\x6f\x9c\xaf\xf2\xa9\x0f\x79\x54\x00\xba\x17\xb8\x4a\xed\xfc\x33\x47\x5c\xa4\x21\x8a\x8f\xe2\x8d\x27\xe7\x80\xeb\x5c\xd3\x77\xca\xc2\x32\x9c\x66\x77\xc5\xa8\xb6\x67\x7f\x79\x7f\x77\xd1\xfe\xd8\x12\xee\x23\xa4\xdc\xdb\xf5\xd8\xbf\x13\x9a\xe6\x5c\xeb\xb0\x49\x1a\xf0\xcb\x96\xd0\x8e\xee\xa5\xf7\x51\xac\xb9\xd9\x94\xcb\x45\x22\xf3\x86\xbb\x62\xae\xf9\x5a\x9f\x3b\x2a\x9b\xdb\xd9\xbf\x1a\x80\xcb\x45\xc6\x45\xc3\xe8\x00\x09\xec\x4e\xa8\x83\x09\x26\xd5\x0a\x00\xf5\x98\x69\x3a\x00\x14\xad\xbc\x1d\x08\xc0\xec\x52\xce\xb2\xd4\x19\x22\x30\x1c\xdb\x9e\xe7\xac\xd8\xd0\x39\x5c\x18\x03\xc0\x5d\xce\x18\xe8\xf5\x1b\x29\xa4\xf3\xa1\x63\xcc\xb1\x53\xa5\xd0\x2e\x01\x93\x70\x27\xc7\xce\x65\x00\x70\xd3\xf2\x71\x12\xd6\x76\x48\x3d\x37\x83\x81\xf5\x03\x14\x04\x08\x74\x19\x73\x8d\x68\x9c\x81\x95\x75\x6e\x24\x0a\xdf\xbf\x86\x7d\xa8\x34\x9e\x91\xe8\x07\xcd\xc7\x7d\x66\xb9\x8d\x67\xc2\x9d\x9a\xd0\xc0\xa2\x0e\x6a\xaf\x74\x6a\x43\xf6\x95\xb6\x46\x34\x78\x7c\x0f\xf5\xa5\x21\xad\x68\x00\x64\x97\xb0\xfb\x24\x59\xb7\x1b\xe8\x09\xe4\x5d\xd2\x25\xf3\xee\xd1\xf3\x92\x19\x47\xce\x40\xb0\x39\xdd\x91\xe5\xd0\x71\x49\xb9\x06\xb3\x26\x38\xa5\x9b\xc4\xfb\xb1\x49\x48\xa7\xa6\xd3\x27\x3b\xe6\x31\xb0\x35\x3a\xab\xfb\xae\xf1\x3e\xe1\x87\xa6\xa8\x5b\x99\x62\xc8\x78\x15\x94\xdb\xdb\xff\xd0\x85\xae\xf3\x5f\xfc\xdd\x5f\x4b\x16\x42\x62\xcc\x44\x33\x8e\xdc\x37\x98\xc5\xa6\xa9\x3d\x30\x9d\x45\xd7\x35\x5f\x6d\xcd\x02\xad\x5c\x1b\xae\x9b\xc9\xe1\xb3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x8c\xfc\x7b\xa9\x0d\xa1\x95\xfb\xb9\xd5\x73\xa2\x8a\x39\x06\x72\x4a\x7a\xad\x29\x3e\x17\xcb\x48\x3b\x99\x2d\x4f\x19\x49\xf9\x6a\xc5\xbc\x5b\x7c\xc9\x48\x41\x15\xcd\x99\x01\x37\x0a\xa2\x16\xba\xf0\x8a\x7e\x62\x90\x2b\x42\x7d\xaf\xdb\x2a\x02\x6e\x86\x3e\x5a\x6e\x48\xce\xd7\x1b\x94\x75\x08\x25\x99\x14\x6b\x88\xe8\xb3\x53\xc8\x24\xed\x3b\x89\xc0\x1c\xa4\x22\x8f\x54\xe5\x84\x92\x84\x26\x1b\xb0\x12\x52\x41\xd2\x52\x41\x82\xa7\x61\x34\xdd\xcd\xb5\xb1\x7a\xb6\x95\x8e\xc0\x94\x86\x18\xe8\xf5\x42\x1f\x74\xc2\x00\x7c\x71\x8c\x44\xb6\x77\x49\x75\x4c\x9c\xaf\xc0\x0b\x07\x4d\xf2\xeb\x81\xde\x3a\x60\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xbf\x7f\x73\x4a\xe9\x3f\x78\xa6\x94\xfe\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xe1\x99\x52\xfa\xc7\xcf\x6d\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\xc6\x33\xa5\xf4\x1f\x8c\x32\xa5\xf4\x7f\x1b\xc9\x7a\x53\x4a\xbf\x7f\xa6\x94\xfe\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xf7\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\x87\x5c\x68\x29\xef\x49\xb5\x8c\xc9\x3a\x70\x06\xfc\x46\xac\xe2\xb2\x5c\xad\xac\x86\x2a\x7b\x2f\x6b\x3b\xe2\x81\x25\xba\xca\x7d\xab\x1c\x5d\xce\x9a\xac\x99\x99\x41\x5a\x03\x86\xe9\x8c\x03\xea\x02\x29\x21\xad\x51\x31\x0d\x69\x00\x82\x5c\x7d\xf8\x7e\xd1\x48\x7a\xe8\x35\x65\xf6\xa6\x42\x0c\xc5\x1c\xc3\x6c\x3e\x88\x24\xc6\x29\x59\x23\xb6\x2b\x12\xd4\xe1\x37\xc9\xa4\xc6\x98\x02\x00\xdd\xe7\x9a\xda\x50\x21\x98\x97\x3a\xb8\x01\x59\x79\xc9\x98\x20\xb2\x60\x02\xfd\x50\xbe\x2d\x03\xa1\xc6\xd0\x64\xb3\xb0\xe3\x8b\x20\x54\x9f\x1d\x5a\x8d\x6e\x59\x2f\xa3\x39\x22\x57\xb1\x9c\x72\x1c\x80\xd0\x44\x49\xad\x49\x5e\x66\x86\x17\xd5\x10\x7d\x3b\xc6\x20\x06\x08\x23\xb3\x2a\x84\x81\x63\x81\xa1\x29\x1e\x62\xfa\xdd\xc6\x6a\xbf\x04\x29\x06\x03\xaf\x41\x36\x9a\x41\x42\x7b\x5e\x98\x1d\xba\x5c\xd1\xf1\xc4\x95\x36\x24\xc9\x38\x5c\xff\x30\x3b\xcc\x09\x85\x51\x66\x01\xa7\xbe\x81\x5c\x51\x58\xab\x76\x8b\x15\x29\xdc\x1a\x85\xd1\xe8\x68\xac\x87\x71\x03\xa4\x5c\xbb\x3b\x5a\xf7\x79\x26\xa8\xef\x1d\x82\x9b\xed\xd7\x0a\xdb\x9d\xc2\x10\x7e\x4c\xf7\x53\x63\x90\x01\x2c\x40\xca\x93\x53\x94\xea\x43\x05\x29\xc6\x3e\xcf\x67\xd6\xea\x33\x52\x54\xc9\x72\x66\x43\xfb\x2b\x2d\xf8\x83\xe8\x66\x0b\x44\x20\xd8\xd6\xd2\x2c\x4b\x98\x15\xa1\xe9\xc1\x09\xc3\xe1\x8e\x3a\x4a\x86\xa9\x9c\x0b\x70\xcb\xbe\x67\x5a\xd3\x35\xbb\xed\x35\xf0\xf4\x89\x4d\x60\xe3\xa9\x51\x0d\x84\x90\x81\x0c\x55\xff\x52\xbb\xc4\xce\xfa\x18\x42\x63\x2a\x24\xc7\xb9\x54\x31\x80\x8f\x8a\x1b\xab\x53\x71\x8d\xb9\x74\x60\xd7\xdc\x0f\xb8\xec\x07\xdd\x74\xc2\xbd\xf7\xa0\x6b\x90\x96\xbf\x8b\x14\x1d\x57\x4b\x46\x96\x8a\xb3\x15\x59\x71\x41\x33\xe7\x81\xea\xa3\x2f\xc8\x11\xa1\x28\x50\x6b\x6d\x45\x53\x29\xbc\x63\xc5\xaf\x61\x41\x7e\x72\x8b\x30\xaa\x14\x09\x1d\xcc\x59\x16\x32\x65\x84\xaf\xc8\x1a\xbc\x5d\x0a\x1d\xea\x7f\x78\xfd\x3f\xfe\x48\x96\x3b\x7b\x23\x82\xa1\xd2\x48\x43\xb3\x0a\x4d\x19\x13\x6b\xbb\x07\xc0\x20\xfa\xce\x42\x96\x35\xd3\x2f\x3d\x66\xa1\xae\x0a\x2e\xfd\xcd\xef\x1e\x96\xed\x2b\xfd\x3c\x65\xdb\xf3\xc6\xbe\xcc\x33\xd9\x1b\x97\x72\xd8\x0c\xa7\xfb\xf2\x1d\x10\x2f\x3b\x08\x12\x8a\x2f\x44\x90\xa4\x4f\x7e\x22\x1b\xf9\x88\x39\x98\x1d\x14\x55\xbb\xc4\x0b\x59\x94\x59\x7f\xd7\x1e\x42\xbe\xb7\x54\x0c\x78\x2a\xdd\xed\xd0\x0a\x67\xec\x3c\x39\xa0\xe8\x3b\xc0\xfd\xbc\xae\x79\xc3\xa3\x8b\xd3\x4f\x4f\xba\x78\x28\xa7\xe4\x56\xb9\x4f\xa5\x62\x0b\xf2\x3d\xcd\xb2\x25\x4d\x1e\xee\xe5\x0f\x72\xad\x3f\x88\x2b\xa5\x7a\xc5\x80\xd6\xbc\x33\x6a\xf9\xf2\xa6\x14\x0f\xed\x56\x0b\x99\x5c\x5b\x39\xae\x28\x8d\x8f\x58\x69\xac\xaa\x07\xb0\x9f\x29\x9c\xf1\xea\x12\xa0\xae\x97\x4d\x0d\x9b\x7d\x06\xba\x82\x80\x27\x2a\x08\xb3\x73\xed\xc3\xb4\xa5\xe8\xe6\x5c\x74\x93\x2c\x7f\xf7\xfa\x0f\xff\x82\xa4\x6f\xb5\x8b\x7f\x79\x0d\xce\x7f\x3d\x43\xe6\x62\x39\x63\x3f\x87\xd6\x39\xcd\x32\xab\x48\x34\x89\xda\x6e\xeb\x22\xb6\x77\xd3\x10\xb5\x9a\x18\xc2\x8c\x16\xee\xee\xef\xff\x1e\x90\xec\xb8\xd1\x2c\x5b\xcd\x30\xf6\xae\xca\xb7\x3d\x83\x8b\xe2\xcc\xf1\x2e\x7b\xab\x1f\x5e\x0d\xc7\x89\x59\x5b\x99\x95\x39\xbb\x64\xd0\x74\x25\x62\x99\xad\xf7\x7d\xc4\x46\xe6\xfa\xa3\x2d\x33\x99\x3c\x90\xd4\xfd\x11\x26\xdb\xb3\x4c\xf0\x5a\xb9\x90\x9e\x86\x2e\x58\x45\x01\x41\x00\x9e\x8f\xe4\x79\x6a\xc7\xad\xe6\x9c\x5b\xfe\xb6\x9c\x16\x05\x34\x1a\x5b\x41\x82\xd0\x23\x2e\x20\xa0\x63\x01\x04\xd7\x49\x87\x9e\xa6\xfb\x16\x02\xed\xbf\x90\x3b\xd6\x53\x7f\xe2\x37\xa0\x80\xff\xc6\x78\x91\x11\xa9\x75\xa4\x0e\xdb\xab\xd6\x86\x37\x86\xc5\x0c\x9c\xcc\x27\xf7\xe1\x19\xd5\xf7\x08\xcc\x0a\x8d\x4e\x4f\xcd\x78\x65\x4a\x0a\xa6\x34\x34\x87\x33\x9f\x60\x47\xdf\x65\x94\x87\x32\xba\x08\xa9\x1b\x1e\x3d\x6d\x19\xc3\x1d\x78\xea\x3d\xe9\x7d\x25\xe0\xed\x7b\x62\x6f\x1e\x24\x70\x48\xc6\x8f\x39\xc3\xb7\x32\x75\x9f\xc0\x21\xc5\xc2\x05\x1d\xa2\x96\x8e\xc8\x7d\x3f\x79\x7b\xbc\x4f\xf5\x5a\xda\x67\xd5\xfe\x52\x1d\x56\x7c\xcb\x1d\xc5\xde\xbd\x3d\xd1\x11\x85\xa1\x47\x9d\x50\x38\x9b\x8d\x8e\x5b\xf5\x7d\xd0\x12\xa1\x71\x13\x82\x14\x5c\x8b\x32\x4e\x26\x5e\x10\xb4\x69\x5b\xac\x3b\xb0\xe4\xec\xed\xd9\x93\xcf\x29\x2e\x52\xc9\x82\xae\x07\x4a\x47\xed\xad\x75\xff\x43\x92\x32\x14\x30\x98\x06\x21\x0d\xfe\x0e\x6e\xa3\xe0\x42\x0b\x07\xc1\x77\x76\xf2\x3e\x3e\x67\xa6\xf5\xe8\x73\x22\x08\x06\x07\x3f\x06\xbd\xd8\x84\x50\x25\x4b\x91\x3a\xfd\xbc\x32\x84\xbc\xdf\x9b\xf0\x8d\x14\x20\xe4\x60\x0e\x52\x20\x6c\x15\x9f\x56\x8c\xb8\xe5\x30\x6f\x16\x6f\x5e\x7f\x59\x36\x79\xbf\xd7\x10\xcf\x62\xe4\xa6\x62\x93\x78\x36\x9e\x3c\x23\x5f\x60\x23\x7a\x56\xef\x9d\xd2\x56\xd7\xcf\xe0\xbe\xaa\x00\xfc\x64\x95\x31\x16\x55\x0a\x8f\x90\x97\x20\xd2\x58\x59\xb0\x91\x95\xf0\x6a\x54\x19\x98\xb8\xb4\x76\xab\xdf\x2d\x9f\x74\xb6\xf1\x10\x23\xd1\x76\xe9\xc2\x61\x6a\x72\x5f\x77\x1c\xf3\x56\x17\xb9\x17\xe4\x25\xbe\x79\xa6\x21\x16\xf5\xd5\x93\xb7\xd7\x2d\xfb\xea\x73\x11\xcc\xa3\x6c\x2d\xfd\xea\x73\x41\x41\x87\x2e\x86\x70\x30\x20\x74\xb4\x6f\x99\x7e\x1c\xfc\x99\x6d\xe8\x96\x41\x9c\x2c\xcf\xa8\xea\xcd\x24\x70\x70\x25\xb9\xc3\x55\x41\xb3\x5b\x26\xb6\x5c\x49\x01\x7e\xaa\x2d\x55\x1c\x72\x8a\xa0\x15\x21\x13\x56\x3e\xfd\xed\xcb\x4f\x17\x1f\xc1\x3f\x10\xce\x76\xc3\xdc\x03\xb7\xf2\x52\x43\x0c\xc2\xde\x0a\x1a\x43\xd5\x1b\x37\x34\xd7\x8e\x4d\xf5\xf3\xb7\xbb\x02\xbc\xce\xaf\xc7\xce\x21\x2f\x4d\x49\xfb\xb3\x29\xf0\x61\x9f\x93\xac\xd4\x7c\xfb\xd4\xf3\x3f\x2c\xf1\x54\xb7\xe2\x57\x10\x78\x5c\x48\xf7\x25\xef\xa1\xdd\xee\x86\xbb\x67\xfa\x30\x16\x1c\xcc\x7a\x42\x9a\xe1\xae\xa7\x9d\xc6\xe5\x33\x5d\xd5\xc6\x69\xa6\xb2\x3a\xc5\xd5\xa5\x5c\xf4\x6a\x41\x55\x5d\xc8\xf4\xd0\xec\x0e\xf9\x59\xa7\x51\x61\xfb\xf7\xb2\x67\x8f\x02\xbb\xd3\xb7\x2f\xbe\xbf\xed\x8f\xea\x20\xf5\xff\x20\x00\xaf\xea\x85\xfb\xe3\xc7\x1f\x60\xd5\x17\x19\x53\x06\xcb\x93\x2a\x88\x26\xa5\x70\x40\xab\xae\xcd\x5b\xca\x33\x7b\x7a\x0f\x26\x5a\x8a\xb4\xa9\x36\x0a\x96\x30\xad\xa9\xda\xd9\xe3\xb5\x66\x82\x29\xab\x72\x27\x52\xd9\xcd\xb6\xa3\xe9\x8e\x77\x0f\x80\xf2\xd5\xde\x84\xbc\x13\x45\x55\x6d\x27\x21\x1d\x00\x2e\xdb\xcb\x9b\x3b\x6c\x81\xda\x89\xa7\x8e\x0d\x81\x7d\x0d\xa2\xe8\x1a\x32\xf3\x78\x23\x1f\x0a\x9c\x10\x75\xb2\x1a\x91\x5b\xa6\xc8\x92\x6a\x06\xaf\xce\x88\xa1\xeb\x4e\xbb\xbb\xde\x58\x09\x38\x5f\x3a\x63\x8f\x5e\x90\xbb\xba\x95\x37\xf0\x6d\xab\x51\x49\xb0\x8f\x6a\x83\x56\xe8\x06\x06\xb1\x7e\xcf\x21\x75\x60\xf1\xaf\x9c\x99\x0d\x2b\x35\xf9\x00\x29\x3f\x52\x91\x07\x21\x1f\x35\x79\xb4\x1a\xa5\x87\x2b\x0f\x51\xd9\xdd\x15\xbc\x3e\x09\xe3\x10\x79\x5b\x66\xd9\x1d\x4b\x14\x3b\x54\x7c\xda\x05\x1a\x85\x4b\x54\xa7\x59\x65\xad\x68\x5c\x05\x10\x30\x0c\x50\xfc\x41\xd4\x56\x9c\xb2\x1b\xab\x0b\x9a\x74\xe0\xa0\x0e\x4d\x2b\xca\x2c\xb3\xf8\x2c\x6a\x94\x80\x5f\xa3\xb5\x6e\x3b\x57\x67\xf3\x57\x6c\xcd\xed\x72\x3a\x1c\xaf\x9a\x61\xb8\x79\xb7\x77\xb4\xd4\x4c\xcd\xd7\x25\x4f\xd9\x39\xc2\xfb\xae\x6e\xcc\x3e\x87\x5f\xec\x54\xdc\x3a\xe6\x52\xcc\xe9\xfc\x50\xf1\xed\x51\xc4\xda\x05\x39\x64\x42\xb3\x0f\x70\xfa\x3f\x7a\x1c\x79\xce\x64\xef\x3a\x59\xae\x37\xad\x06\xf5\x46\x92\xac\xb3\x06\xd8\x4e\x96\xc4\x19\xbe\x30\x12\xdb\x41\x4b\x1d\x73\xf1\x36\x8b\x43\x8c\x1f\xb2\xb9\xb0\xa6\xd6\x2f\x3f\xef\x79\xc6\x1b\x81\x0b\x6e\x3a\x66\x74\x10\x9b\x3d\x7f\x5b\xce\x1e\xcf\xdd\x75\x32\xb7\xa2\xd0\x1c\x97\xa4\xcf\x61\x0d\xe7\xdf\xc1\xff\xf4\xd9\x42\x21\x8c\xe6\x22\x4d\x9d\x22\x53\x6a\xb6\x2a\x33\x54\x2d\xf4\x82\xd0\x82\x7f\xc2\x13\x34\x23\x0f\x5c\xa4\x33\x52\xf2\xf4\x7f\x1d\x61\x6a\x3f\x82\x91\x73\xc1\x4d\x75\x63\x86\x0f\xd5\xd9\x75\xeb\x5d\x1f\x3c\x4f\xd3\xd4\x9e\x87\x36\xa0\x46\xdc\x4c\x07\xf1\xad\x20\xa0\x10\xb3\x06\xa5\x66\xbe\x6f\xb4\x4f\x91\x64\x8b\xf5\x82\xac\x98\x55\x75\xfc\x31\xb5\x27\x8f\x0b\xbb\xae\x2e\x2b\x76\x65\xcc\x68\x71\x9f\x56\x39\x6c\x3c\x8c\xd5\x55\xe4\x6a\x61\x2f\xc8\x85\xd8\xa1\x1d\xfb\x70\xef\x5c\xc2\x23\x24\x70\x43\x4e\x9a\x63\x71\x54\xb4\x17\x8b\x17\x57\xc6\x28\x96\xd7\xf0\x3e\x44\x22\x0f\x2b\x48\xb9\xe4\xd3\xa7\x86\x51\xda\xe1\xeb\xba\xd2\xfa\xb0\x66\xf5\x8f\xba\x63\x4b\xa0\xee\xb9\xd8\x01\x27\x4b\xa8\xf6\x5a\x35\xf8\x69\x11\xcf\x88\x74\xf8\xf4\x10\x1d\x4c\x18\xae\x58\xb6\x23\xb2\x34\xf5\x29\x4e\x24\xd6\xc4\x7c\xf4\x96\xc5\x9c\xf2\xb6\x43\xca\x45\x93\x75\xde\x58\xcb\x1d\x49\x25\xe4\x18\xc9\x19\x70\x0f\x74\x0f\x7b\x3b\x25\xdc\x1f\x1b\xba\xe5\xb2\x54\x98\x94\xad\x18\x7d\x20\xd4\xc0\x3a\x3a\x2b\xd2\xd9\xa3\x29\x4b\xb0\x97\xf0\x84\x1d\xf8\xab\x62\xf8\xe1\x45\xe5\xef\x2f\x8a\x8c\x27\x75\x65\x6c\xdc\x6d\x98\x9b\x9d\xab\xcf\xa3\xf1\x85\xc9\x3b\x2d\x53\xd0\x64\x7d\x2c\x77\xa3\x6a\x1d\xd5\x2f\xe2\x42\xad\xcb\x1c\x9c\x57\x8e\xfe\xeb\x42\x03\xae\xca\xa8\x4c\x1e\xfc\x7d\xd4\xef\x4a\x7d\xf7\xfe\xd2\x1b\x44\xd0\x67\x54\x87\x92\xb8\x6c\xe5\x74\x41\x3e\x1d\xa5\x52\x0d\x2a\x53\xfb\xda\xd4\xb5\x95\xb2\xbc\xfa\xd6\x27\x47\x57\x42\xb2\x62\x5a\x66\x5b\x5f\x9b\xa6\x9a\x99\xbf\xd5\xb9\x28\x4a\xe3\x98\xa5\x17\x2f\xfb\x3c\x14\x22\xd9\x50\xb1\x46\x93\x10\x6b\xae\x8c\xe8\x9d\x30\xf4\xb3\x67\x52\x4c\x27\xb4\xa8\x9c\x60\x24\x95\x65\xff\x44\x7f\xfb\xdb\x19\xe1\xec\x2d\xf9\x6d\x03\xdc\x82\x5c\x39\x08\x0d\x44\x36\x42\x02\x96\x35\xc2\xfa\x54\x13\xc5\xd6\x54\xa5\x19\x44\xdf\xad\xaa\x52\xed\x58\x28\xc1\x6d\x12\xfb\xcc\xb5\x01\xe7\x9a\x90\xa6\xa1\x56\xf4\xad\x7e\x5c\xab\x10\x2c\x73\x8f\xfc\x78\x9e\x52\x43\xe7\x8d\xa3\x72\x8e\x4d\x0c\xe6\x2e\x2b\x76\x4e\x1d\x91\x36\x0a\xe1\x7f\xe7\x4a\x88\xcf\x69\xf5\x16\xb7\xf2\x0b\x64\x91\x76\xdf\x7b\x41\x8b\xf2\xa0\x82\x1b\x56\x2f\x83\x29\xcc\xed\x13\x77\x55\xd7\x34\x04\x68\x0b\x72\x23\x4d\x5d\xaa\xa0\xf2\x15\xb9\x7c\xd8\xfb\xde\x88\x80\xbd\x93\x49\xae\x6e\xee\x3f\xfe\xfd\xf6\xc3\xf5\xcd\xfd\xe0\x51\xec\x81\x38\x70\x40\x63\x8e\x62\x0f\xe4\xfe\x03\x3a\x7c\x14\xfb\xfc\x9e\xfd\x07\x74\xf8\x28\xf6\xb3\x85\xde\x03\x1a\x7d\x14\x7b\x60\xf7\x1c\xd0\xf8\xa3\xd8\x03\xf7\xe0\x80\xfe\xca\x8f\x22\x13\xdb\x88\x63\xf8\x83\x53\xe9\xba\x4c\x7e\xfb\xe9\xa0\x83\x2e\xa1\x93\xbb\xb4\xae\xc4\xf6\x13\x55\x75\xb1\x79\x88\x25\xea\xb4\x4e\xba\x17\x7a\x4d\x77\xc0\x4a\xde\x9d\xc2\xa7\x35\xca\xdf\xd0\x54\x9a\xba\xe6\x5d\xa7\x59\x84\xda\x83\x10\xf2\xee\xe7\xeb\xcb\xab\x9b\xfb\xeb\xef\xaf\xaf\x3e\x3e\xd9\x80\x3d\x98\x00\xda\x66\xd4\x63\xb8\x61\x70\x11\x35\xa7\x2c\x14\xb3\x92\xa8\x26\xbe\x4b\x4f\x37\xf9\xf1\xe1\x80\xf8\xb6\x83\xcb\xca\xb2\xda\x6a\x98\x49\x37\xba\x31\xde\x33\x8c\xea\x78\x86\xdc\x62\xbd\x61\x5f\xe4\x48\xb6\xec\x18\x70\xd8\x5e\xfd\x1c\xcc\x19\x9f\xe3\x59\xf4\x80\x85\xbd\x25\x49\xb5\xdd\x34\xc1\x84\x90\x78\xb2\xfe\x5e\xc9\x40\x29\xfb\xfd\x6c\x49\x50\x5d\xab\x5c\xab\x2e\x8a\x39\xd3\xae\x83\x54\xf8\x78\xd6\x8c\xcf\x89\x1b\x55\x70\xbf\xfd\x1d\x82\xc0\x42\x10\x62\x13\xcb\x51\x0f\x7f\x4f\x8b\xbf\xb1\xdd\x47\x36\x90\xd7\xb2\xbf\x58\x96\xb1\xc4\x72\x50\xf2\xc0\x76\x68\x82\x7d\xe7\xc1\x0d\xa5\x83\x8e\x49\x7c\x7f\x60\x41\xc7\x67\xe7\xdc\xec\x29\xb0\xb3\x82\xfb\xc6\x4e\x73\x68\x42\x64\x6c\xd2\xfb\x51\xe9\xf8\xdf\x88\xcd\xab\xfd\x8c\xb5\x80\x45\x01\xed\xb7\x92\xb5\x9f\x51\x38\xf7\x76\xe3\xd1\x78\x77\xb6\xf6\x16\x87\xa9\x68\xd5\xf2\x0f\x3e\x98\x6c\x86\x8f\xa5\x29\x9f\xda\xe4\xae\x9a\xe8\x45\x0e\x79\xbf\xf1\x89\x2f\x59\xf0\xc0\xc2\xfe\xc7\x11\xb5\x08\x60\xaf\xc7\x9e\xff\xb3\x9a\x01\x60\x20\x46\x95\x84\x96\xbe\xf5\x96\x25\x5d\x95\x35\x5c\x58\x82\x1c\xa6\x9d\xd6\xeb\x60\x7e\x9e\xd5\xbf\x41\x8d\x60\xdd\xf8\x01\xb8\x24\x3a\x54\x86\x41\xeb\x82\x25\x0b\x21\x53\x66\x0f\xe1\x0c\xff\xe9\xee\xf6\x8b\x24\x91\xa5\x30\xee\x0f\x10\x22\xbc\xd8\x48\x6d\xae\x6f\x23\xc0\xe2\xeb\x85\x4c\xaf\x6f\x67\xad\x7f\xe9\x81\x9c\xc4\x71\x6c\xb0\x3e\x87\xa3\xc9\xff\x53\xed\x03\x42\xc3\xe0\x86\xe5\x14\xfe\xf3\x7b\xbb\x71\x01\xcf\x71\xfb\xe1\xba\x0e\xe3\x17\x10\xbb\x6c\xef\xed\x76\xe1\x9b\x17\xdb\x37\x2f\x4e\xce\x6c\x57\x7e\x9a\xa3\x97\x0e\x2e\x7b\x5f\xa8\x0d\xa8\xb4\xba\x12\x62\xa4\x41\xff\xd4\xfe\xbf\x8b\xdb\x6b\xef\x53\x3b\xf1\x32\xe3\x4f\xfe\x2a\x72\xd7\xa2\xcf\xbf\x6f\x40\xf9\xfd\x13\xf9\x80\x87\x73\x10\xf9\xfa\x16\xaa\xe6\x0d\xe2\xab\xee\x14\x8a\xfd\x67\x5d\xce\x90\xeb\x13\xfa\x12\x7f\x5c\x24\x45\x39\x73\x2f\x2c\x72\x96\x4b\xb5\x1b\x3e\xa5\xee\x75\x56\x6c\x58\xce\x14\xcd\xe6\xda\x48\x05\x1e\x5b\x0f\x1e\xc1\x56\xff\x42\xc0\xc3\xa7\xb2\x31\xc1\x43\xe8\xa8\xcb\x24\xa5\xb2\xf7\x7c\xb6\xab\xb3\xb7\x4f\xca\x19\x2a\x2c\x0f\x57\xc7\xc5\x67\xbf\xb3\xb1\xd7\x78\x40\xa6\xa9\xfb\x1a\x5b\x31\xd6\x05\xa7\xc6\x5d\xfa\x95\x5f\x17\x1a\x36\x88\xad\x15\x7a\x03\x39\xa1\xf5\x33\x8a\x19\xa4\x7c\xcb\xb5\x1c\x28\x39\xdf\xb1\xd0\xbb\x56\x2d\x31\x97\xfb\x80\x9e\xd3\xb8\x22\xcc\xf8\xb0\xcf\x05\xe4\xae\x55\xb4\xba\xc7\xff\xde\xbc\x38\xf5\x82\xfd\x48\xe3\xb7\xf6\xa3\x67\x29\xf5\xc9\xac\xd8\xdf\x89\xf7\x25\x9e\x7b\xf9\xa9\x9c\x8a\x79\xa1\x7f\xec\x34\x0a\x8c\xf3\xb5\xd5\xc1\xea\x03\x31\x83\xc4\x69\x02\xdd\xa1\x09\xed\xe7\x4b\xe9\x3c\xfe\x96\xc7\xa5\xd4\xd7\xdd\x4a\xc9\xdc\x85\x2c\x47\x11\xfa\x92\x81\x35\x39\xe3\xa9\x87\xf5\xc0\x06\x8a\x38\xe2\x33\xe9\x51\xbf\x26\x3d\x0a\x63\x7e\x9c\x12\x15\xa1\x94\xe0\xf3\x4f\xa7\x44\x45\xf6\x75\x0f\x07\x72\x3e\x5f\x98\x26\x13\xdb\x7e\x4b\x56\xa7\x01\xdf\x4b\x62\x8d\x0c\xcb\x6e\x13\x68\xd8\x8d\xd4\x4a\x29\x03\x06\x55\x1b\x69\x6b\x97\x1c\xde\x4d\xf9\x80\xe9\xba\x65\xb4\x26\x17\x50\x55\x17\x19\x14\x80\xf5\xd6\x50\xc5\x5c\x89\x1c\x4c\x15\x66\xdb\x7e\x3b\x7e\x67\x73\x68\x4c\xb9\xe7\x62\xed\xd2\x15\xf0\x7e\x70\xc6\x46\x2e\xaa\x8a\x00\x3d\x30\x2b\xb1\xa0\x2e\x8f\x4f\xb5\x96\x09\x54\xe9\xaa\x2b\xd2\x43\x92\xa8\x5b\x38\xcc\xdc\xd0\x87\x3e\x90\xcd\xea\xf8\x9f\x2c\xc4\x1a\x87\xcb\x1d\x64\xa8\x8b\x6d\x65\xb7\x2d\xd1\xc7\x84\x97\x41\xa0\x94\x3a\x94\x1f\x6f\x42\x7e\x0e\x6f\x8b\x25\x3a\x67\x15\x6d\x38\x5d\xe0\x7e\xaa\x34\x05\xea\x1a\x4e\xf7\x9e\xae\xca\x54\xd3\x47\x6b\x31\x57\x6b\x65\xea\x1c\x10\x13\x0e\xee\xd4\xda\x50\xd4\xbe\x4b\x4f\x60\x7e\x8d\xb9\xfc\xbe\xed\x8b\xef\x84\xe1\x73\xf5\x13\x7d\x99\xc5\x5e\x64\x23\x8c\x81\xe3\x2e\xa6\xd8\x4b\x29\xea\x12\x29\x14\x5b\xf1\xcf\xd1\xb4\xd9\x0c\xa4\xe5\xd0\x18\x66\xc5\xa1\x56\xad\x05\x54\x30\x81\xf1\x7a\x34\xd9\x0c\x5e\x72\x8e\x55\xd7\xd6\xfb\xda\x89\x78\x5a\x47\x21\xca\x91\x63\x0f\xe0\x5d\x97\x24\x3b\x9d\xbe\x7f\x9e\xd3\xe7\x36\xf8\xab\x1d\xbd\x27\xca\x56\x9d\x79\x04\x1d\x4b\x3f\xbb\x6c\x04\x16\x61\xaa\xc2\x58\xda\x69\x04\x96\x62\xe0\x79\xcf\x8a\xda\x2d\x74\x2a\x36\x81\x2d\xe6\xe4\x23\xd9\xf0\xb5\x45\x3e\xb6\xd5\xc1\x9b\x91\x60\x6c\x6e\xde\x2f\x2c\x19\x59\x65\xd8\x48\x05\x99\x0f\x8a\xa7\x07\x89\x32\x20\x22\xf9\xa0\x58\xf8\xa3\x92\x59\xd6\x5f\xba\x3c\xe3\x0f\x8c\x5c\xb2\x22\x93\xbb\xdc\x45\x64\xa4\xe4\xce\x50\x63\x49\xf9\x8e\x99\x3e\x2b\xfa\x00\x99\x56\x39\x09\xd1\xf5\x4c\xce\x30\xdb\xa3\x28\xb3\x8c\x14\xf0\xd1\x02\x7a\x7e\x40\xe6\xc4\x23\xdd\xe9\x19\xb9\x61\x5b\xa6\x66\xe4\x7a\x75\x23\xcd\x2d\x0a\x33\x7d\x3c\xb1\xe9\x8c\xc6\xcf\x09\x5f\x91\xb7\x56\x8c\xd6\x06\xd2\x44\xb8\x6e\xb6\xd9\x91\xaa\x05\xb6\x07\x6a\x95\xb2\xf9\x84\xb0\xa4\x7e\x62\xfa\x0e\x20\x55\x39\x0c\x3d\xa6\xbb\x01\xc4\x57\xd5\xe1\x22\x50\x7e\xe1\xfa\x61\x98\x3a\x42\xd9\xd3\x20\xc1\x64\x77\x9f\x8a\x08\xc2\x6a\x6f\x7e\xb9\x62\xba\x90\x42\xb3\x76\x86\x72\x5d\xe7\x12\x54\x00\x1d\x2d\xe1\x0e\x5f\x20\x85\xd4\x06\xfa\xdf\xc4\x96\x01\xbc\xf5\x1f\x40\x41\x2c\x9a\x65\x2c\x25\x3c\xcf\x59\x6a\xb5\x82\x6c\xe7\x8a\x9c\xd1\xa8\x5a\x11\x16\x02\xb6\xe6\x70\x95\xb0\x18\xd9\x50\x91\x66\x4c\x35\x1b\x29\xb5\x34\x1a\x5f\x67\x26\xc8\x55\xd1\x96\xed\x8a\x6c\x11\x9a\x24\x52\xa5\xae\xcc\xb3\x55\xed\x7d\xec\x7c\x75\x36\x80\x7f\x0f\x72\x0d\xd2\xd5\x3b\x0d\xaa\x7b\xe8\x46\xfd\x2f\x68\x8d\x58\x35\x8b\x3a\x61\xfd\xc2\x06\x91\xd7\xd5\x0a\x2b\xca\x98\x43\x75\xd5\xf3\x46\x21\x43\xf8\xe1\xa9\x35\x51\xc3\x5d\x85\xc8\xb1\x9d\x85\x06\x6e\xc4\x56\xdf\xa1\xa7\x74\x17\x8a\x5f\x28\x89\xed\x32\x74\xb0\xe6\xb8\x4e\x43\x11\x76\xa1\x46\xde\x52\x4c\xb7\xa1\x18\x4b\x53\xbb\x1f\x51\x7c\xc7\xa1\x08\xd8\x8d\x9e\x44\x91\x5d\x87\x22\x80\xf6\xf4\x25\xea\xed\x3c\x14\x01\x72\xa8\x37\x51\x4f\xf7\xa1\x08\xc8\xa1\xfe\x44\x3d\x1d\x88\x62\x50\x10\xe8\x51\x34\xa2\x0b\x11\x89\xed\x21\x42\xc6\xda\x5c\xe3\xda\x3d\x44\x9b\x1b\x07\xdb\xe9\x90\x67\x6a\xa9\x43\x46\xf1\x86\xe1\xe2\xd0\x87\xf3\x8c\x68\xaf\x13\x79\x88\x9f\xa5\xc5\x0e\x89\x6d\xb3\x43\xc6\x91\x48\x74\xbb\x1d\x72\x54\xcb\x9d\x88\x55\x41\x9b\x90\xa3\xda\xee\x90\x31\xc7\x66\x74\xfb\x9d\x28\x87\x02\xd6\x63\x1b\xdf\x82\x87\x8c\xf4\xcc\x91\x11\x3e\x2b\x72\xaa\x76\x3c\x64\x2c\xb7\x21\x63\xda\xf2\x0c\x4f\x33\xb6\x35\xcf\x11\xf3\x8c\x75\xd5\x90\xd8\x36\x3d\x24\xba\x55\x0f\x19\xe3\x65\x26\x23\x78\x78\x4c\xdb\x1e\x72\xe2\xd6\x3d\x64\x1c\xea\x87\x0b\xdd\x93\xb8\x62\xf7\x64\x64\xc1\x7b\x32\xae\xe8\x3d\x39\xa6\xa5\x4f\xc4\xbe\xcb\x03\xef\x54\xb0\xf8\x7d\x0c\x25\xb5\xca\xe3\x1f\x59\x00\x9f\x3c\xad\xbd\x0f\x89\x6c\xf1\x43\x9e\xab\xcd\x0f\x19\xdd\xea\x87\x8c\xa1\xdb\x38\x66\x31\x50\xea\x9f\x8c\x70\xea\x0e\xb7\xff\x20\xc7\xb6\x00\x19\xc0\x0a\x34\x08\x19\xdf\x06\x64\x10\x6a\xd5\x24\x64\x54\x2b\x10\xf2\xdc\x52\xdf\x09\xdb\x82\x90\x91\xad\x41\xc8\xaf\x85\x73\x46\xb4\x0c\xf9\x15\x73\xce\x2f\xcb\x5b\x22\x5e\x2a\x14\xbb\x33\xb2\x88\xb6\x30\xe2\xeb\x3d\xf6\x45\xd7\x41\x2c\xda\xc0\x58\x1b\x0c\x49\x5a\xc2\x49\xa4\x02\x62\x9f\xbd\xae\x28\x9b\xa6\xbf\x60\x8c\x05\x69\x54\x6e\xf7\x5d\x9f\xce\x5d\xc7\xa7\x46\xff\xf7\x52\xb1\x99\x5d\x33\xcb\x61\x45\xb3\x98\x38\x41\x57\x20\x1c\x5e\x67\x26\xc1\x10\x13\x6f\x0b\x75\x96\x14\x8f\x8c\xf8\x5a\xbc\x89\xa2\x7a\x83\xe5\xaf\xd9\x67\x6e\x5c\x09\x78\xc5\xa8\x96\x02\x73\xbb\x1a\x85\xce\xb9\x26\x05\xd5\x58\x1d\x25\x74\x93\xd4\x13\x43\x70\xae\x39\x7c\x13\xd4\x5a\xd1\x84\xb9\x2e\x68\x04\x12\x12\x52\xf9\x18\x72\x6d\x41\x17\x7a\xed\xf7\x16\x8b\x41\x21\x11\x58\x6e\xce\xc0\xc2\xe4\xf3\xdf\x17\xe4\x63\x95\x6c\x37\x6c\xa9\x95\xa5\x49\x64\xcd\x24\xdc\xcc\xf7\x0d\xcb\x10\xb6\x02\x5b\x3f\x54\x0d\xaf\x22\xa7\x66\xa9\xc2\x01\x14\x38\x0b\x73\x00\x6a\x83\x00\xc7\x5a\x98\x43\x28\x50\x8d\xaf\x7a\xf7\x07\x1a\x52\xd0\x64\xd3\xf6\xbb\x4c\xc6\xea\xc9\x58\x1d\x7a\x26\x63\xf5\x64\xac\x9e\x8c\xd5\x9d\xcf\x64\xac\x9e\x8c\xd5\x93\xb1\x7a\xf8\xdb\xc9\x58\x3d\x19\xab\x27\x63\x75\xc7\xf3\x2d\x9a\x5c\x26\x63\x75\xf8\xf3\xc9\x58\x3d\x19\xab\x03\x50\x27\x63\x75\xe7\xfb\xbf\x06\xce\x39\x19\xab\x43\x1f\x7f\x63\xc6\xea\x81\x17\xbc\xd5\xf7\xd6\xca\xb8\x31\x91\xd8\xb7\x60\x63\xe3\x89\x33\x0f\xb7\x9b\x28\x3a\x60\x8b\xba\xfa\x5e\xcf\xc4\xeb\x7c\x40\x1f\xd3\xea\x8c\xc0\xb5\xd1\xb9\x33\x26\x18\xec\x79\x3d\x30\x8f\xae\x0b\x7d\x4c\xe3\xec\x61\x26\x16\xb6\xdd\x1d\x65\xb7\x6b\x5b\xe6\x02\xc4\xf3\x04\x9b\x5d\x1c\x77\x8e\xb2\xd5\x1d\x61\xa7\x8b\xb3\x55\xc5\xda\xe8\xf6\x2d\x70\x03\x60\xa3\xed\x73\x4d\xeb\xdb\x00\xcc\x38\xdb\x5c\x9f\xe5\x6d\x48\x44\xeb\xb1\xcb\x0d\x5a\xdd\x06\xe0\x76\xdb\xe4\x82\x16\xb7\xa1\x99\x76\xda\xe3\x82\xd6\xb6\x61\xc4\x46\xda\xe2\xa2\x0c\x0a\xd1\xd7\x61\x8c\xee\x16\xc1\xb9\x9d\x5b\xed\x7e\xa3\x98\xde\xc8\x2c\x70\x92\xda\xdd\xc3\xb8\xe0\x79\x99\x5b\xc2\xd4\x50\x5b\x7f\x5b\x79\xe8\x74\x45\xf1\xc8\x43\x83\xd6\xad\x25\xd0\xb6\x25\x3d\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\x36\x74\x0b\x1c\xa7\x4c\x12\xc6\xd2\xbd\x1e\x5b\x01\x90\xbf\x5f\x54\xb3\xab\x0a\x22\xbe\xe9\xdf\x19\xac\xee\x02\x12\xcb\xef\x7f\x37\x80\xc9\xb0\x54\x33\x68\xc2\x7c\x0e\xf3\x65\x1c\x9b\x1c\x16\x60\x47\x9b\x2c\x23\x8a\xe1\x3c\x8b\xb9\x32\xca\x54\x19\x79\x8a\xa2\x4d\x94\xe3\xcd\x93\xb0\xbf\x43\xca\xcb\x31\xa6\xc9\x28\x2e\x32\xda\x24\x19\x63\x83\x3e\xca\x1c\x39\xc6\x14\x79\x54\x9d\x97\x63\x4d\x90\xa3\xf4\x8e\x68\xd3\xe3\x69\xcc\x8e\xcf\x52\x53\x29\x02\x2f\x71\x66\xc6\x68\x13\x63\x9c\x79\x71\xd8\xb4\x78\x4a\xb3\x62\x24\x6a\x87\x95\xe2\x08\x85\x78\x8c\x32\x3c\x42\x11\x1e\x6d\x3e\x74\x48\x1a\xd8\xd6\x58\x05\x78\x4f\xbd\x1d\x80\x7a\x9c\xf2\xfb\x04\xc5\x37\xc6\x5c\xf8\x2c\xa6\xc2\x71\x66\xc2\xc8\xa6\xae\x43\x87\x7b\x40\x7d\x8f\x38\xaa\xd0\xcb\x89\x66\x97\x2c\xa3\xbb\x3b\x96\x48\x91\x06\xdb\x9f\xb7\x4a\x1d\x54\x34\xa7\xf1\x43\x27\xb9\xb5\xa3\x6c\x36\xd4\x55\xcb\x09\xfa\xbd\x5d\x80\x92\xd7\xdc\xdd\xe5\x02\xb5\x11\x71\x86\xc7\x64\x2f\x9f\x40\xbf\x26\x27\x15\x11\x31\x30\x68\x1c\x9a\xff\x2a\x1f\x89\x5c\x19\x26\xc8\x4b\x2e\x3c\xa6\x5f\x35\x84\xc3\x5a\xd6\x0e\x91\x9c\x23\x4f\xfb\xdd\x9b\xd7\x1e\xcc\xd7\x12\x95\x41\xa8\xd7\xfa\x14\x5a\x87\x03\xf5\x14\xb5\xc3\x81\x58\x95\x59\x5b\xf5\x40\x75\x24\x56\xef\x78\x53\x97\x44\x79\x03\x73\xa9\x68\xd9\x6a\x93\x2e\x98\xf1\x10\xe1\x41\x88\x5f\x60\x2b\x22\x5c\x02\x47\xb9\x03\xd0\xe0\x3f\x70\xc5\x8e\x72\x05\x34\x8d\xfd\x01\xb8\x63\xdc\x00\xcf\xa2\x3d\x9d\xd0\xf4\x3f\xc6\xec\xff\x4f\x27\xd9\x44\x98\xf7\x7f\x45\x92\xcd\x97\x90\x05\x0c\xcf\x99\x2c\xcd\x89\xc4\x80\xba\xbd\xba\xe3\xc8\x3c\x5c\xaf\x48\x96\x7b\x0d\x3a\xde\x38\x80\x9d\xb7\xd4\xe9\x22\x6a\xbf\x31\x29\x61\x60\x9f\x22\x5b\xa7\x36\xcb\x50\xd5\xb2\x58\x5d\xa3\x9c\x6a\x6c\x87\xfc\xf3\x0f\x17\x7f\xbe\xfa\x61\x41\xae\x68\x6f\x1b\xf8\x46\x95\x10\x81\x0d\x11\x91\xf6\x37\x74\xcb\x08\x25\xa5\xe0\xff\x28\xb1\x56\x11\x79\x59\x41\x7c\xe5\xbd\x26\x3d\x40\x9f\xd4\x22\x1b\xb9\x58\x4c\x8f\x45\x5f\xa9\x12\x1b\x0d\xa0\x19\x59\x6a\xd7\xfb\x7e\xcf\xed\x77\x65\xff\xd4\xcf\xa2\x28\xf2\x9e\x0d\x53\x8c\xac\xf9\xd6\x19\xec\x5c\x09\x1a\x9a\x56\x41\xaa\xcd\x56\xbb\x74\x09\x66\xea\x5e\x0e\x25\x98\xb1\xd4\x57\x69\x1c\x52\xe8\x66\xfe\x85\xd5\x48\xf4\x0c\xda\xe3\x73\x2b\x12\xf3\x9c\x2a\x9e\xed\x9a\x43\xd0\xac\x8f\xdf\xdc\x54\x6d\xd2\x77\x78\x1d\xd7\xd3\xbf\xfc\x70\x75\x47\x6e\x3e\xdc\x43\x4f\x24\x7b\xb3\x82\x15\x1d\xfe\x0e\x88\xe9\xee\xfa\x8c\x8f\xab\x6d\x8d\xad\x57\xe1\x13\x3c\xe7\x5c\x43\xab\x66\x26\xec\x60\x4e\x2b\xf7\xa5\xa0\x5e\xbc\x5e\xc0\xff\xf5\x95\xbd\xa6\x69\xaa\x2c\x37\xaf\x9c\x10\x7b\xf9\x03\x96\xcb\x02\xbf\xe7\xcb\xac\xb1\x77\x0e\x7b\x5f\xac\x33\x58\xe5\x4c\xbc\xb5\xcb\x6e\x36\x08\xab\x36\x12\x10\x82\xf5\x4a\xa1\x09\x69\x2f\x1f\x18\xec\x6b\x16\x59\xaf\xb2\x9e\x50\x74\xbd\xbc\x9a\x5f\xfb\xcb\xd4\x1d\x0a\xd9\x28\x69\x4d\xae\x6f\xfd\xb6\x84\x2f\x34\x28\x23\x56\xdd\x85\xae\x18\x34\x00\x46\x93\xc4\x8c\xbc\x26\x7f\x22\x9f\xc9\x9f\xe0\x6a\xfd\x63\x08\x58\x1c\x07\x8d\x13\x6b\x51\x6a\xbb\xbe\x8d\xc6\xca\x4f\xf6\x08\xd8\x6f\xec\xca\x8d\x24\x4b\x2e\x52\xec\xd0\xe4\x9b\x0e\x3b\x6c\x3d\xb9\xc2\xa1\x1d\xe4\xa4\x1b\x06\xd6\x09\x72\xdd\x68\x41\x1f\x76\xac\x99\x91\x5b\x66\x41\x5b\x49\xf6\x06\x89\x3c\x6c\x9e\x6e\x55\x2c\xab\x47\xca\xa9\x49\x36\xed\x13\x64\xaf\x70\x6d\x6a\x22\x0e\x0b\xc3\xa9\x04\x0d\x01\xdd\x81\x1b\x1e\xa4\xca\xd3\x12\xd2\xa8\xe6\x7b\xad\x5d\xd8\xc3\xf4\x9e\xa0\x38\x20\x84\xa7\xfe\x66\x6d\xa4\x43\x15\x32\xc5\xab\x1a\x26\x95\x36\xd8\x8d\xbf\x95\x83\x40\x0f\x6f\x6c\x17\xa2\x52\xa9\xce\x40\x5f\xf6\x24\xb8\x6e\x9c\x50\xc1\x52\x0d\x64\x2c\xd8\xd3\x52\xf5\xc0\x0b\x6e\x4c\xd4\xf9\x28\x94\x34\x32\x91\xc1\x9a\x91\x6d\x93\xb0\xfb\x00\x1b\xfc\x23\x65\x39\x9c\xff\x78\x79\x3b\xb3\x1a\x21\x14\xcf\xbb\x7b\x37\x64\x95\x6b\xb5\x87\xbb\x7f\x77\x1b\x6c\x53\x13\xb1\x98\xe1\x72\xde\x2d\x16\xde\x27\x96\x3f\xad\xf6\xa4\x62\x34\xe5\x27\x8b\xad\xf1\xad\x0e\x2b\xa8\x63\x82\x6c\x72\xb9\x65\x29\x5e\xe0\x75\xcb\xc4\x14\x1a\xf2\xea\x40\xe4\xcd\xb0\x0c\xf9\x15\x2c\x83\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x81\x77\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\xe9\x44\xcb\x14\x79\x33\x45\xde\x4c\x91\x37\x8d\x97\xa6\xc8\x1b\x37\xa9\xff\x32\xfe\xa9\x29\xf2\xa6\xfd\x4c\x91\x37\x07\xa3\x4c\x91\x37\xdf\x86\x4f\x6d\x8a\xbc\xf1\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\x53\xe4\xcd\xde\x33\x45\xde\x4c\x91\x37\x53\xe4\x4d\x78\x9f\xaa\x6e\xde\x31\x2e\x94\x77\x32\x2f\x4a\xc3\xc8\xc7\xaa\x5d\x7d\xd5\x33\x7d\xb9\x43\xbf\x60\xe3\x70\x3c\x97\x9b\x03\xdb\x76\x95\x0a\x42\x45\xce\xb1\x16\xe2\x3c\xc1\xa9\xcd\xab\xf5\xcc\xab\x99\x9c\x1f\xeb\xea\xc0\xde\xf9\xfd\xf4\x50\xc7\xc7\xdc\x46\x31\xfe\x28\xc6\xd5\xc6\xf8\x0f\x30\x85\x86\xa1\x05\x9b\x45\x7d\x06\xf2\xa5\xb9\x2c\xb1\x04\xa4\x5b\x7d\x60\xec\x0a\x2f\x68\x26\xfa\x7a\x68\x27\xf1\x3d\x83\x99\xfe\xca\xd8\xff\xe8\x26\xb1\x8f\x7f\xc7\x3e\x8e\xc3\xbf\x3f\x32\x10\x81\x50\x8d\xc0\x35\x91\x39\x37\x56\x4e\xb1\xc2\x5e\x23\x5a\x28\xe4\xd5\xe0\xa6\x65\x43\x75\xd4\x02\x3e\x47\x6a\xb0\x0a\x6a\xe5\xe6\x68\xf6\x5c\xf3\xdd\xd4\x42\xe8\x82\xca\xb7\x95\xb4\x04\xbb\x3e\xf7\xcd\x77\x81\x71\x7e\xd3\x14\x34\xf0\x82\x95\xf7\x15\x37\xbb\x77\x52\x18\xf6\xb9\x47\x82\x69\x13\xc3\x9d\xfb\xc4\x75\x15\xd4\x95\x28\xe5\x9c\x98\xaa\x14\x10\xd5\x10\x71\x95\xc4\x20\x0b\xbb\x8d\x9d\xfb\x89\x02\x56\xd8\x67\x73\xde\x03\x32\x6e\x2b\x0c\xd5\x0f\xf5\x3e\xb0\xb9\xbd\x9c\x6a\x74\x1f\x8c\x75\x2c\xe3\x04\x16\x73\xab\xf8\x96\x67\x6c\xcd\xae\x74\x42\x33\xd8\xf3\x58\x11\xe0\xa2\xe7\x7b\xdf\x55\x51\x57\x5d\x34\xfb\x3a\x66\xbb\x79\x82\x50\x97\x50\x41\xd6\x94\x0b\x92\x5b\x1c\x15\x1e\x2c\x74\xdf\x13\xd0\xe1\xad\xa0\xca\x2a\x04\xee\x83\x90\xc4\x05\x81\x61\x4b\x29\x33\xe7\x91\xcd\x76\xf5\x9c\x9c\xab\x5f\xc8\x9f\x05\x7b\xfc\xd9\x8e\xa3\xc9\x2a\xa3\xeb\x50\x2f\x6a\xe2\x2a\xc2\x32\x73\x50\xb2\xa5\x9a\x0e\xe9\x43\x47\x88\x31\x68\x10\xff\x08\xc5\x0e\x8c\x9d\xed\xbe\xdf\x92\x37\xaf\x80\x6a\xa9\x26\x15\xf4\x90\x51\xe5\x77\xaf\xc0\xfa\xf2\xee\xe2\xf6\xe7\xbb\xbf\xdf\xfd\x7c\x71\xf9\xfe\xfa\x66\xe8\x88\x86\xfb\x94\x26\xb4\xa0\x4b\x9e\xf1\x30\xef\x3e\xb0\x82\x37\x3f\x03\x46\x95\xa6\xe7\xa9\x92\x05\xae\x53\x95\x02\xe2\x35\xeb\x18\xac\x08\x43\x86\xf7\x41\x55\xe1\x9d\xd8\x9a\xbb\x3d\xd4\x5a\x51\x61\xbc\xb0\x33\x54\x9f\x1b\xd1\xac\x4a\x61\x05\xd5\xa7\x7a\xdc\x68\x3a\x26\x28\xe1\x22\x4d\x59\xda\x9a\xfa\x89\x7d\x40\xef\x3c\xe8\x5d\x1d\x31\x4a\x6e\x3f\xdc\x5d\xff\xef\xf8\x51\x89\xa3\x91\x28\xf7\xc0\x89\x3c\xd8\x84\x58\x32\x19\x81\xc9\x8f\x2e\xba\x67\xc2\x65\xcf\x3b\x03\x95\xfc\x3d\x57\x89\x3c\xdc\x1f\x4b\xd1\x8e\xcc\xaf\x21\x90\x5c\xa6\x6c\x41\x6e\x91\x29\x42\xb7\xdd\x20\xef\xaf\xbe\xab\xd9\x00\x98\x7f\xed\xc7\xc2\x70\x9a\x65\x3b\x62\x25\xb1\x2d\xcd\x18\xba\x90\x95\xec\xd5\x56\x48\x5d\x52\x0b\xe3\x52\x9b\x5c\x63\x45\x33\x1d\x38\xe0\x31\x7c\xd0\xb2\xfa\xf7\x56\x98\x8c\xc4\x53\xf5\x3e\x49\x99\x90\xc6\xc9\xa5\x76\x24\x08\xa8\x55\x32\x21\x28\x9b\xa2\x1b\x22\xb0\xaa\x3a\x9c\xa8\x62\x96\xc0\x62\x3d\x1b\xe4\xda\xaf\xf5\xb6\x1a\x13\x34\xf1\x00\xcc\x52\x33\xbd\x77\xdb\x38\x36\x58\x4b\xab\x76\x5c\xc5\x68\x0a\xb1\x61\x05\x35\x1b\xb0\x6b\x06\x80\xe6\x54\x3f\xb0\x14\x5f\x5d\xe0\x3d\xec\x24\x69\xed\x3a\x00\xb8\xe9\xdd\x5b\x2c\xac\x18\x35\xa5\x62\x70\xff\x86\x85\xdc\x25\x23\x4c\xd0\x65\x16\x8a\x3c\x8b\x0a\x8a\xa4\xe9\x07\x91\xed\x3e\x4a\x69\xbe\xaf\x42\xaa\x22\xb7\xf3\xa7\xaa\x27\x78\x53\x83\x86\xcb\x16\x8c\x94\xe9\x1c\xd0\x04\x81\x5c\x71\x95\xcc\x2f\xeb\xed\x3b\x01\x79\xaa\x52\x5c\xe8\xbf\x28\x59\xc6\x36\xe5\xb0\x14\xf4\x97\xeb\x4b\x38\x55\x25\x9e\x1b\x26\x8c\xda\x41\x50\xe4\x41\x06\xcf\xb0\x0c\xb7\x20\x3f\x5a\x9a\xda\xa3\x22\x2b\x71\x95\x42\x33\xb3\x20\xef\xe9\x8e\xd0\x4c\x4b\x27\x4c\x85\x24\x23\x41\x6e\xc1\x67\xd2\x94\xff\x17\x04\x62\x9c\x31\xee\x62\x29\xcd\x86\xec\xbd\x30\x40\x9c\x87\x10\x31\x7c\x0f\x0d\x4c\x75\x82\x12\x17\xfb\x80\x43\xc4\x49\x1f\x98\x26\x85\x62\x09\x4b\x99\x48\x02\x7b\xd8\xb0\x15\xfd\xf1\x0f\x4f\x32\xdf\xc3\x4e\xdf\x48\x61\xc9\x38\x72\xaf\xaf\x45\xca\x13\x8a\x3c\xc8\x75\xb3\xae\x49\x18\xac\x9a\x4e\xc6\xa4\x10\x03\x37\xc0\x65\x4b\xcd\x14\x76\x77\x56\x25\x43\x24\xfe\xad\x5c\xb2\x8c\x19\x8c\xb8\x85\xb8\x7e\x6a\xb0\x95\x00\x36\x94\xa7\xc6\x13\x46\xf8\xa4\x33\xa1\x4b\x68\x17\x62\x55\x63\x43\x52\xc9\xea\x78\x45\xaa\xc9\x8f\xd7\x97\xe4\x35\x79\x69\xe7\xf7\x0a\x7c\x2c\x2b\xca\x43\x62\xbb\x91\xe8\x85\xd9\x97\xab\x57\x1e\x38\x2c\x03\xe8\x93\x48\x85\xc7\x70\x46\x44\xc8\xe7\x03\xdd\x62\xdc\x0a\xad\xba\xe3\x63\x8c\x9d\x67\x0e\x8c\x36\x6d\x42\x0f\x90\x73\x68\x9c\x30\xa1\xf7\x91\x73\x00\xe2\x30\xa1\x8f\x20\xe7\x68\x96\xf4\xa3\x66\x6a\x04\x47\xfa\xf1\xa4\x1c\xa9\x29\x02\x58\xaa\x6d\xaf\x1e\x49\x33\x67\x86\xa6\xd4\x50\xc2\x43\xdb\x51\x8a\x46\x47\x90\x5f\xc3\x06\x9f\x8e\x5f\x69\xf6\x03\x17\xe5\x67\x74\x91\x8d\x51\x21\xef\xae\xe0\x43\x92\xf8\xc9\x03\xc2\x69\x51\x64\x1c\x03\x84\xdb\x79\x94\x01\xcc\xe0\x21\x6f\xa6\xc7\x74\x09\x3e\x70\x94\x69\x96\x49\xcb\x2a\xed\xad\x4e\x45\x2a\xf3\x00\xd8\xfd\x09\x5a\x81\x89\xd1\x64\xd3\xb4\xb0\x77\x10\xcb\xa8\x4b\xea\xbf\xf8\xb5\x17\xa7\x3a\x67\x6c\xcb\x82\x69\x37\xfb\xd9\xb5\xf6\x7d\x2b\x38\xf9\x1d\x00\x00\x24\xa3\x4b\x96\xe1\xe5\x81\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xc9\x6c\x4c\x30\xd2\x47\x99\x81\x7f\x8b\x56\x8b\xb1\x00\xbe\x91\xb5\xc0\x6b\xf1\x6b\x01\xb9\xbe\xb5\x16\xd0\x77\xbe\x8d\xb5\x94\xc1\x9b\xe8\x60\x2d\xf6\xe2\x6a\xaf\x05\x6e\x90\x6f\x61\x2d\x11\x6a\xfd\x23\x17\xa9\x7c\xd4\xe3\x99\xee\x4f\xf8\xa1\xe7\x0c\x89\x65\x3d\x86\x8b\xb5\x6e\x32\x5e\x1a\x34\x96\x36\xf5\xd4\x2e\xce\xeb\x8d\xf3\x55\x3e\xf5\x21\x8f\x0a\x40\xf7\x02\x57\xa9\x9d\x7f\xe6\x88\x8b\x34\x44\xf1\x51\xbc\xf1\xe4\x1c\x70\x9d\x6b\xfa\x4e\x59\x58\x86\xd3\xec\xae\x18\xd5\xf6\xec\x2f\xef\xef\x2e\xda\x1f\x5b\xc2\x7d\x84\x94\x7b\xbb\x1e\xfb\x77\x42\xd3\x9c\x6b\x1d\x36\x49\x03\x7e\xd9\x12\xda\xd1\xbd\xf4\x3e\x8a\x35\x37\x9b\x72\xb9\x48\x64\xde\x70\x57\xcc\x35\x5f\xeb\x73\x47\x65\x73\x3b\xfb\x57\x03\x70\xb9\xc8\xb8\x68\x18\x1d\x20\x81\xdd\x09\x75\x30\xc1\xa4\x5a\x01\xa0\x1e\x33\x4d\x07\x80\xa2\x95\xb7\x03\x01\x98\x5d\xca\x59\x96\x3a\x43\x04\x86\x63\xdb\xf3\x9c\x15\x1b\x3a\x87\x0b\x63\x00\xb8\xcb\x19\x03\xbd\x7e\x23\x85\x74\x3e\x74\x8c\x39\x76\xaa\x14\xda\x25\x60\x12\xee\xe4\xd8\xb9\x0c\x00\x6e\x5a\x3e\x4e\xc2\xda\x0e\xa9\xe7\x66\x30\xb0\x7e\x80\x82\x00\x81\x2e\x63\xae\x11\x8d\x33\xb0\xb2\xce\x8d\x44\xe1\xfb\xd7\xb0\x0f\x95\xc6\x33\x12\xfd\xa0\xf9\xb8\xcf\x2c\xb7\xf1\x4c\xb8\x53\x13\x1a\x58\xd4\x41\xed\x95\x4e\x6d\xc8\xbe\xd2\xd6\x88\x06\x8f\xef\xa1\xbe\x34\xa4\x15\x0d\x80\xec\x12\x76\x9f\x24\xeb\x76\x03\x3d\x81\xbc\x4b\xba\x64\xde\x3d\x7a\x5e\x32\xe3\xc8\x19\x08\x36\xa7\x3b\xb2\x1c\x3a\x2e\x29\xd7\x60\xd6\x04\xa7\x74\x93\x78\x3f\x36\x09\xe9\xd4\x74\xfa\x64\xc7\x3c\x06\xb6\x46\x67\x75\xdf\x35\xde\x27\xfc\xd0\x14\x75\x2b\x53\x0c\x19\xaf\x82\x72\x7b\xfb\x1f\xba\xd0\x75\xfe\x8b\xbf\xfb\x6b\xc9\x42\x48\x8c\x99\x68\xc6\x91\xfb\x06\xb3\xd8\x34\xb5\x07\xa6\xb3\xe8\xba\xe6\xab\xad\x59\xa0\x95\x6b\xc3\x75\x33\x39\x7c\x56\x4d\x3a\xe0\x34\x6e\xb6\x76\x98\x91\x7f\x2f\xb5\x21\xb4\x72\x3f\xb7\x7a\x4e\x54\x31\xc7\x40\x4e\x49\xaf\x35\xc5\xe7\x62\x19\x69\x27\xb3\xe5\x29\x23\x29\x5f\xad\x98\x77\x8b\x2f\x19\x29\xa8\xa2\x39\x33\xe0\x46\x41\xd4\x42\x17\x5e\xd1\x4f\x0c\x72\x45\xa8\xef\x75\x5b\x45\xc0\xcd\xd0\x47\xcb\x0d\xc9\xf9\x7a\x83\xb2\x0e\xa1\x24\x93\x62\x0d\x11\x7d\x76\x0a\x99\xa4\x7d\x27\x11\x98\x83\x54\xe4\x91\xaa\x9c\x50\x92\xd0\x64\x03\x56\x42\x2a\x48\x5a\x2a\x48\xf0\x34\x8c\xa6\xbb\xb9\x36\x56\xcf\xb6\xd2\x11\x98\xd2\x10\x03\xbd\x5e\xe8\x83\x4e\x18\x80\x2f\x8e\x91\xc8\xf6\x2e\xa9\x8e\x89\xf3\x15\x78\xe1\xa0\x49\x7e\x3d\xd0\x5b\x07\x6c\x4a\xe9\xdf\x7b\xa6\x94\xfe\x29\xa5\x7f\x4a\xe9\xf7\x6f\x4e\x29\xfd\x07\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\x3f\x3c\x53\x4a\xff\xf8\xb9\x4d\x29\xfd\x53\x4a\xff\x94\xd2\xdf\x78\xa6\x94\xfe\x83\x51\xa6\x94\xfe\x6f\x23\x59\x6f\x4a\xe9\xf7\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\x90\x0b\x2d\xe5\x3d\xa9\x96\x31\x59\x07\xce\x80\xdf\x88\x55\x5c\x96\xab\x95\xd5\x50\x65\xef\x65\x6d\x47\x3c\xb0\x44\x57\xb9\x6f\x95\xa3\xcb\x59\x93\x35\x33\x33\x48\x6b\xc0\x30\x9d\x71\x40\x5d\x20\x25\xa4\x35\x2a\xa6\x21\x0d\x40\x90\xab\x0f\xdf\x2f\x1a\x49\x0f\xbd\xa6\xcc\xde\x54\x88\xa1\x98\x63\x98\xcd\x07\x91\xc4\x38\x25\x6b\xc4\x76\x45\x82\x3a\xfc\x26\x99\xd4\x18\x53\x00\xa0\xfb\x5c\x53\x1b\x2a\x04\xf3\x52\x07\x37\x20\x2b\x2f\x19\x13\x44\x16\x4c\xa0\x1f\xca\xb7\x65\x20\xd4\x18\x9a\x6c\x16\x76\x7c\x11\x84\xea\xb3\x43\xab\xd1\x2d\xeb\x65\x34\x47\xe4\x2a\x96\x53\x8e\x03\x10\x9a\x28\xa9\x35\xc9\xcb\xcc\xf0\xa2\x1a\xa2\x6f\xc7\x18\xc4\x00\x61\x64\x56\x85\x30\x70\x2c\x30\x34\xc5\x43\x4c\xbf\xdb\x58\xed\x97\x20\xc5\x60\xe0\x35\xc8\x46\x33\x48\x68\xcf\x0b\xb3\x43\x97\x2b\x3a\x9e\xb8\xd2\x86\x24\x19\x87\xeb\x1f\x66\x87\x39\xa1\x30\xca\x2c\xe0\xd4\x37\x90\x2b\x0a\x6b\xd5\x6e\xb1\x22\x85\x5b\xa3\x30\x1a\x1d\x8d\xf5\x30\x6e\x80\x94\x6b\x77\x47\xeb\x3e\xcf\x04\xf5\xbd\x43\x70\xb3\xfd\x5a\x61\xbb\x53\x18\xc2\x8f\xe9\x7e\x6a\x0c\x32\x80\x05\x48\x79\x72\x8a\x52\x7d\xa8\x20\xc5\xd8\xe7\xf9\xcc\x5a\x7d\x46\x8a\x2a\x59\xce\x6c\x68\x7f\xa5\x05\x7f\x10\xdd\x6c\x81\x08\x04\xdb\x5a\x9a\x65\x09\xb3\x22\x34\x3d\x38\x61\x38\xdc\x51\x47\xc9\x30\x95\x73\x01\x6e\xd9\xf7\x4c\x6b\xba\x66\xb7\xbd\x06\x9e\x3e\xb1\x09\x6c\x3c\x35\xaa\x81\x10\x32\x90\xa1\xea\x5f\x6a\x97\xd8\x59\x1f\x43\x68\x4c\x85\xe4\x38\x97\x2a\x06\xf0\x51\x71\x63\x75\x2a\xae\x31\x97\x0e\xec\x9a\xfb\x01\x97\xfd\xa0\x9b\x4e\xb8\xf7\x1e\x74\x0d\xd2\xf2\x77\x91\xa2\xe3\x6a\xc9\xc8\x52\x71\xb6\x22\x2b\x2e\x68\xe6\x3c\x50\x7d\xf4\x05\x39\x22\x14\x05\x6a\xad\xad\x68\x2a\x85\x77\xac\xf8\x35\x2c\xc8\x4f\x6e\x11\x46\x95\x22\xa1\x83\x39\xcb\x42\xa6\x8c\xf0\x15\x59\x83\xb7\x4b\xa1\x43\xfd\x0f\xaf\xff\xc7\x1f\xc9\x72\x67\x6f\x44\x30\x54\x1a\x69\x68\x56\xa1\x29\x63\x62\x6d\xf7\x00\x18\x44\xdf\x59\xc8\xb2\x66\xfa\xa5\xc7\x2c\xd4\x55\xc1\xa5\xbf\xf9\xdd\xc3\xb2\x7d\xa5\x9f\xa7\x6c\x7b\xde\xd8\x97\x79\x26\x7b\xe3\x52\x0e\x9b\xe1\x74\x5f\xbe\x03\xe2\x65\x07\x41\x42\xf1\x85\x08\x92\xf4\xc9\x4f\x64\x23\x1f\x31\x07\xb3\x83\xa2\x6a\x97\x78\x21\x8b\x32\xeb\xef\xda\x43\xc8\xf7\x96\x8a\x01\x4f\xa5\xbb\x1d\x5a\xe1\x8c\x9d\x27\x07\x14\x7d\x07\xb8\x9f\xd7\x35\x6f\x78\x74\x71\xfa\xe9\x49\x17\x0f\xe5\x94\xdc\x2a\xf7\xa9\x54\x6c\x41\xbe\xa7\x59\xb6\xa4\xc9\xc3\xbd\xfc\x41\xae\xf5\x07\x71\xa5\x54\xaf\x18\xd0\x9a\x77\x46\x2d\x5f\xde\x94\xe2\xa1\xdd\x6a\x21\x93\x6b\x2b\xc7\x15\xa5\xf1\x11\x2b\x8d\x55\xf5\x00\xf6\x33\x85\x33\x5e\x5d\x02\xd4\xf5\xb2\xa9\x61\xb3\xcf\x40\x57\x10\xf0\x44\x05\x61\x76\xae\x7d\x98\xb6\x14\xdd\x9c\x8b\x6e\x92\xe5\xef\x5e\xff\xe1\x5f\x90\xf4\xad\x76\xf1\x2f\xaf\xc1\xf9\xaf\x67\xc8\x5c\x2c\x67\xec\xe7\xd0\x3a\xa7\x59\x66\x15\x89\x26\x51\xdb\x6d\x5d\xc4\xf6\x6e\x1a\xa2\x56\x13\x43\x98\xd1\xc2\xdd\xfd\xfd\xdf\x03\x92\x1d\x37\x9a\x65\xab\x19\xc6\xde\x55\xf9\xb6\x67\x70\x51\x9c\x39\xde\x65\x6f\xf5\xc3\xab\xe1\x38\x31\x6b\x2b\xb3\x32\x67\x97\x0c\x9a\xae\x44\x2c\xb3\xf5\xbe\x8f\xd8\xc8\x5c\x7f\xb4\x65\x26\x93\x07\x92\xba\x3f\xc2\x64\x7b\x96\x09\x5e\x2b\x17\xd2\xd3\xd0\x05\xab\x28\x20\x08\xc0\xf3\x91\x3c\x4f\xed\xb8\xd5\x9c\x73\xcb\xdf\x96\xd3\xa2\x80\x46\x63\x2b\x48\x10\x7a\xc4\x05\x04\x74\x2c\x80\xe0\x3a\xe9\xd0\xd3\x74\xdf\x42\xa0\xfd\x17\x72\xc7\x7a\xea\x4f\xfc\x06\x14\xf0\xdf\x18\x2f\x32\x22\xb5\x8e\xd4\x61\x7b\xd5\xda\xf0\xc6\xb0\x98\x81\x93\xf9\xe4\x3e\x3c\xa3\xfa\x1e\x81\x59\xa1\xd1\xe9\xa9\x19\xaf\x4c\x49\xc1\x94\x86\xe6\x70\xe6\x13\xec\xe8\xbb\x8c\xf2\x50\x46\x17\x21\x75\xc3\xa3\xa7\x2d\x63\xb8\x03\x4f\xbd\x27\xbd\xaf\x04\xbc\x7d\x4f\xec\xcd\x83\x04\x0e\xc9\xf8\x31\x67\xf8\x56\xa6\xee\x13\x38\xa4\x58\xb8\xa0\x43\xd4\xd2\x11\xb9\xef\x27\x6f\x8f\xf7\xa9\x5e\x4b\xfb\xac\xda\x5f\xaa\xc3\x8a\x6f\xb9\xa3\xd8\xbb\xb7\x27\x3a\xa2\x30\xf4\xa8\x13\x0a\x67\xb3\xd1\x71\xab\xbe\x0f\x5a\x22\x34\x6e\x42\x90\x82\x6b\x51\xc6\xc9\xc4\x0b\x82\x36\x6d\x8b\x75\x07\x96\x9c\xbd\x3d\x7b\xf2\x39\xc5\x45\x2a\x59\xd0\xf5\x40\xe9\xa8\xbd\xb5\xee\x7f\x48\x52\x86\x02\x06\xd3\x20\xa4\xc1\xdf\xc1\x6d\x14\x5c\x68\xe1\x20\xf8\xce\x4e\xde\xc7\xe7\xcc\xb4\x1e\x7d\x4e\x04\xc1\xe0\xe0\xc7\xa0\x17\x9b\x10\xaa\x64\x29\x52\xa7\x9f\x57\x86\x90\xf7\x7b\x13\xbe\x91\x02\x84\x1c\xcc\x41\x0a\x84\xad\xe2\xd3\x8a\x11\xb7\x1c\xe6\xcd\xe2\xcd\xeb\x2f\xcb\x26\xef\xf7\x1a\xe2\x59\x8c\xdc\x54\x6c\x12\xcf\xc6\x93\x67\xe4\x0b\x6c\x44\xcf\xea\xbd\x53\xda\xea\xfa\x19\xdc\x57\x15\x80\x9f\xac\x32\xc6\xa2\x4a\xe1\x11\xf2\x12\x44\x1a\x2b\x0b\x36\xb2\x12\x5e\x8d\x2a\x03\x13\x97\xd6\x6e\xf5\xbb\xe5\x93\xce\x36\x1e\x62\x24\xda\x2e\x5d\x38\x4c\x4d\xee\xeb\x8e\x63\xde\xea\x22\xf7\x82\xbc\xc4\x37\xcf\x34\xc4\xa2\xbe\x7a\xf2\xf6\xba\x65\x5f\x7d\x2e\x82\x79\x94\xad\xa5\x5f\x7d\x2e\x28\xe8\xd0\xc5\x10\x0e\x06\x84\x8e\xf6\x2d\xd3\x8f\x83\x3f\xb3\x0d\xdd\x32\x88\x93\xe5\x19\x55\xbd\x99\x04\x0e\xae\x24\x77\xb8\x2a\x68\x76\xcb\xc4\x96\x2b\x29\xc0\x4f\xb5\xa5\x8a\x43\x4e\x11\xb4\x22\x64\xc2\xca\xa7\xbf\x7d\xf9\xe9\xe2\x23\xf8\x07\xc2\xd9\x6e\x98\x7b\xe0\x56\x5e\x6a\x88\x41\xd8\x5b\x41\x63\xa8\x7a\xe3\x86\xe6\xda\xb1\xa9\x7e\xfe\x76\x57\x80\xd7\xf9\xf5\xd8\x39\xe4\xa5\x29\x69\x7f\x36\x05\x3e\xec\x73\x92\x95\x9a\x6f\x9f\x7a\xfe\x87\x25\x9e\xea\x56\xfc\x0a\x02\x8f\x0b\xe9\xbe\xe4\x3d\xb4\xdb\xdd\x70\xf7\x4c\x1f\xc6\x82\x83\x59\x4f\x48\x33\xdc\xf5\xb4\xd3\xb8\x7c\xa6\xab\xda\x38\xcd\x54\x56\xa7\xb8\xba\x94\x8b\x5e\x2d\xa8\xaa\x0b\x99\x1e\x9a\xdd\x21\x3f\xeb\x34\x2a\x6c\xff\x5e\xf6\xec\x51\x60\x77\xfa\xf6\x05\xbb\x36\xff\x20\x13\x7a\x90\xfa\x7f\xd0\x4a\xdb\xbd\x47\x72\x48\xc2\xb2\xcb\xbe\xc8\x98\x32\x58\x9f\x54\xb9\x98\x31\x07\x91\x48\x41\x32\x29\x8b\x25\x4d\x1e\x0e\x77\x46\xcb\xc3\xea\x32\xd0\x72\x97\xae\x29\x17\xba\xce\x48\xba\xbe\x5d\x90\x1b\x09\x55\x6c\x50\xc3\x84\xfb\xa9\x4b\x0d\x3f\x98\xce\x8f\xd7\x33\x80\x6b\xff\xb0\x96\x5a\xf3\x02\xe2\xfb\x4b\xc1\x13\xcc\x74\xe9\xc4\x50\xd7\xad\x93\xc9\xf5\xf7\xe8\x91\x0a\x62\x48\xae\x9d\xe3\x0a\x42\x16\x5a\x73\x41\xfd\xbf\x41\x36\x50\xff\xb4\x73\x02\x1d\xb4\x90\xc9\xf5\x0f\x5d\xb5\x19\x0e\x86\xc7\xc4\xb7\x13\x8f\x2e\x64\xca\xee\x58\x06\xc7\x6e\x7f\x06\x71\xa5\x85\x03\x44\xde\x5a\xc2\x25\x14\xcd\x75\x47\xf0\x46\xa6\xbe\x60\x99\x4c\x31\x7a\x49\x27\x1b\x96\x96\x19\x78\x42\xba\xa7\xdf\x41\xfa\x05\xb5\x07\x3b\x88\x3a\x97\xee\xe8\xfc\x2e\x60\x8c\xa5\x2e\xf7\xc2\xc5\x44\x96\x22\x65\x2a\xa3\xd0\x4a\x1d\xb1\x9a\xba\xb1\x0e\x6f\x0b\x3b\x53\x4b\x77\x6b\x28\x98\x83\xb8\xaf\xea\x12\xcd\x2c\xa3\x67\x05\x92\x48\xca\x32\x66\x7c\x1a\xcf\x41\xac\x72\x3f\x3d\x16\x32\x7d\xef\xf2\x3f\x83\xeb\xba\xad\xdf\xab\x77\x5f\x93\x1f\xe8\x92\x65\x68\xbd\xbc\xb0\x4c\x8a\xe2\x52\x11\xed\x5d\xe2\x7e\x43\xc4\x77\xba\x26\x6d\x92\x57\x21\xd3\x83\xc9\x87\xd4\x33\x5a\x0f\xda\x75\x0b\xc4\x97\xab\x1e\xb8\x0e\xf7\x4a\xe5\x36\x96\x8a\xf9\x6a\xa5\x4b\xb2\x81\x23\xf1\xc0\x76\xce\x25\x9e\xd3\x82\x68\x23\xfb\xda\x1e\xa3\xcd\xb4\x2a\x53\x8d\x7c\x0c\xf3\x4c\x81\x8a\x96\xbb\xba\x67\xb8\x91\x32\x73\x3e\x36\xa9\x58\xaf\x8b\x4d\x31\xa3\x38\xdb\x32\x42\xd5\x92\x1b\x45\xd5\xae\xca\xef\x05\x87\xc2\xae\xa2\xa9\x7f\x94\x4c\xed\x40\x1e\x82\x40\x28\x10\xbc\x3a\x41\x5a\x9a\x53\x0c\x38\x72\x8a\x89\x84\xb9\x4c\xf9\x0a\x08\xd8\x11\xee\x41\x08\x60\xb7\x6f\xbf\xd4\x4c\xcd\xd7\x25\x4f\xd9\x79\x63\xe3\xba\xdc\x07\x41\xd9\x00\x2a\x76\x7c\xc9\xfd\x7e\x4f\x0b\x88\xa3\x80\xb7\xed\xf6\x22\xc5\xc3\x1e\xeb\x56\x97\x6b\x97\xd0\xd9\x39\xa4\x54\x6b\x2a\xf8\x2f\x88\xef\x84\x1a\xb6\x96\xca\xfe\xf3\xa5\x4e\x64\xe1\x76\x01\x78\xe3\xab\x06\x5a\xe9\x0e\xf5\xbb\x4e\x88\xda\xb1\x52\xf0\x53\x28\x56\x64\xee\x3a\xf2\xe5\x91\x33\x48\x1c\x05\xb8\xae\xa3\xf6\x50\x78\x46\xd4\xde\x21\xfe\x47\x6e\x5b\x3f\x53\x95\xca\x74\x65\xd7\xef\xb1\x1f\xe5\x22\xb6\x00\xc3\x75\x97\xf1\x14\x17\xb8\x96\x5b\xa6\xa0\x00\xb1\x5b\x6a\x8f\x12\xdf\xcc\x94\x79\x64\xcb\xd8\x7b\xab\x50\x5c\x42\x62\x79\x46\xb5\x1e\x9e\xac\x7b\x9b\x24\xf6\x75\x42\xb5\xe6\x6b\x51\x33\x3c\x7b\x07\xc5\x0e\xec\x36\xf5\x80\x88\xdb\xa1\xd2\x96\x8a\x9c\x15\x98\x7d\x2e\x58\x62\xb9\xab\xb6\x3f\x3a\x3b\x70\x8b\xc5\x5a\xdd\xc0\x74\x19\xc3\xee\x9d\xec\x89\x84\x83\xb2\x2c\xdb\x32\x81\x1a\x07\x48\x6a\x18\xbc\xd0\x80\x5c\x95\x7d\x46\xa0\x07\x30\xd9\x3f\x4a\xe0\x5d\x87\x73\xdb\x1f\x3f\x14\xa7\xd3\x1f\x9d\xd3\xdb\x49\xa3\x4b\x18\x68\xb7\x03\x80\x0e\x00\x98\x63\x0a\x05\xfc\x2d\x4d\xb9\x98\x8e\xdb\x91\xb7\x50\x7f\xcf\x8a\x67\x62\x48\xe3\x3a\x54\xd4\x0b\xef\x1c\xf9\xab\xf6\xa6\x08\x32\xfa\x50\x3f\x8a\x67\xc2\xec\xd8\xee\x13\x03\xb8\x1d\xdd\x77\xa2\xd9\x5d\xa2\x7b\x35\x47\x74\x9c\x08\xf6\x95\xe8\x1c\xe5\x2b\xf6\x9a\x38\xe6\x0e\x51\xcc\x30\xd1\x65\xb1\x6e\x9b\x4c\xa1\x8c\xad\x9b\xde\x9e\xbe\xb9\xa1\x10\x84\x05\xa6\x74\x10\x72\x57\xb2\x76\x27\x1f\xcc\x92\x6b\x72\xf6\xe6\x77\xaf\x37\x67\x33\x2c\x0d\xd2\x36\xc3\x2a\xb6\x2e\x33\xaa\xec\xae\x28\x8c\xce\x22\xff\xf6\x7f\xbf\x9e\xff\x8f\xff\xf7\xff\xf7\x32\xd7\xff\xa1\xff\x23\xff\x8f\xcd\xab\x7f\x3b\x80\xf9\x32\xe7\x59\xc6\x7d\xac\xa6\xff\xdf\x9c\x8b\xd2\x80\x15\xbd\x54\xfa\xc0\xe2\xd7\x7f\x6f\xc8\xd2\xb0\x5b\xc5\x56\xfc\x73\x18\x25\x76\xba\xf6\x5d\x2b\xe2\xad\xf8\xe7\x36\x56\x14\x5b\x5b\x05\x5c\x69\x4c\xe4\xda\x50\x91\x82\x48\xb1\xea\xf2\xf0\x7b\xbf\x6d\xa9\xd9\xaa\xcc\x66\x50\x4d\x06\x0c\x65\x57\x4e\x84\xfd\xf1\xe3\x0f\x18\xed\x65\x79\xe9\xe7\x1d\x46\x56\x3d\x2a\x0e\x1e\x9d\xce\xbc\x4c\x98\x99\x76\xae\x59\x3c\x3c\xb3\xca\xfc\x4f\x13\x7b\x31\xb5\xa0\x73\x4d\xb4\xb1\xd7\x16\x5a\x9c\x97\xe5\xe1\xce\xc1\x05\x86\xc6\x05\xf8\x9f\xc6\x5d\x00\x8a\x19\xa1\x8d\x22\x1c\x4d\xcc\x2c\xc8\xf7\xd2\x6e\x29\xb5\x87\xe8\x00\xac\x3d\xc6\xa5\x46\x67\x14\xf9\x37\x7b\x46\x12\x93\xe1\x3a\xff\x2d\x7a\xd3\x34\x4b\x14\x3b\xe4\x76\xed\xbb\x1e\xdf\x41\x07\xb9\xf7\xb9\x57\x3f\xa2\x86\xa9\xad\x9c\x64\x85\x25\x5d\xd0\x84\x11\xaa\x3b\x83\x90\x5a\x3b\x8d\x67\xca\x9b\xac\xf0\x34\xd4\x46\xd8\xda\x31\xd8\xfc\xe8\x00\x22\x5c\x9b\x58\xe8\xd3\x4d\x08\x4c\x96\x4d\x18\xe7\xcc\x24\xe7\x4d\x71\xe4\xdc\x2d\xfa\xfc\x4f\xf8\x1f\x73\x3b\xef\x7f\xdd\x47\x59\x8f\xeb\x30\xc0\xd9\xfb\x6c\x54\x03\x3d\x68\xf6\x71\xdd\xaa\x55\xb4\x91\x59\xaa\x09\x04\x22\x83\x71\xc4\xc3\x22\xd4\x18\xc5\x97\x40\xab\x5d\x7a\x59\x22\xf3\xbc\x19\x6f\x59\x55\xe0\x73\xc1\x0e\x69\x4f\x37\x8c\x8e\x72\x4a\x23\x84\x92\x55\x7f\xf1\xf0\xd6\x2a\x5f\x5c\xe0\x9d\x41\x33\xc8\xf1\x70\x37\x44\x46\xd6\xf6\xeb\x56\x5d\x44\x57\x28\xb0\x11\x5d\xd6\x79\x77\x40\x5c\x44\x21\xd3\x05\xb9\x93\x79\xe5\x17\xb0\x1b\xe2\xfa\x60\xb5\x0a\x4c\x1b\x09\xf1\xb6\x6b\x94\x2d\xe5\xa3\x05\xbb\xe1\x45\xb7\x06\xe5\x6e\x3c\x0f\x12\xec\x21\xf6\x93\x2a\x8e\xa4\x90\xe9\x5b\xf2\xff\x08\xf2\x06\xe9\x50\x3e\x82\x74\xfa\x97\xeb\xcb\xfe\xd2\x3e\x4b\x1c\xf9\xfb\x3b\x40\x17\xf9\x1d\x7e\xa9\x99\x59\xf3\x94\x2c\xb1\x1c\x87\x55\xc6\x5f\x0a\xf6\x88\xce\x70\x92\xb8\xfa\x14\x3d\x6e\xe7\x86\x37\xc4\x1b\x84\xab\x49\xba\x61\x5e\x91\xdf\xe3\x38\x05\x53\xae\x8a\x9f\x1d\xab\xdf\x45\xfa\xe1\xe3\x99\x8b\xb1\x52\x8f\x73\xf5\x38\x9f\xcf\xe7\x76\x9d\xbe\xd8\x75\x47\xd1\x6e\xab\xe3\xa3\xa2\xde\x1b\x83\x58\x61\x1b\x98\x6a\x3d\x15\x64\xb9\x62\xe7\x56\xb1\x78\xd1\xf1\xf5\x50\x39\xe1\x70\x44\x7d\xb8\xb8\xfd\x13\xca\xda\x87\xfb\x09\x8d\x2b\x68\xdf\x51\x52\xac\xbf\x06\xf4\x91\xd5\x9f\x03\xa9\xdd\xa3\xca\x55\x3a\x95\x98\x9a\x70\xb8\xc3\x09\x76\x2d\x50\xa8\xfe\x59\x4a\xd4\x9f\xbe\x38\xfd\x91\x65\xe9\xab\xe2\xf3\xbd\x87\x7e\x44\x41\xfa\xfd\xb2\xf3\x3d\xf6\xc1\x98\x52\xf4\x7d\xf5\xa5\xfb\x98\xf3\x71\x24\x3a\x50\x57\xf0\xc8\x8a\xaa\x61\xf7\x7c\xb0\xde\xfc\x13\x2a\xcd\x87\x99\xc4\xc8\x1a\xf3\x07\x35\x13\x7b\x94\xec\xa8\x3d\xeb\xdb\x9f\x6e\x98\xf1\x7b\x16\x5b\x1d\xf1\xab\xb0\x95\xe1\x7a\xf2\xe3\x2b\xc9\xb7\xe5\x94\xee\x8d\x7e\x4a\x11\x79\x3f\x83\x4e\xc0\x23\xcb\xc7\xff\xb3\x5d\x32\x43\xf1\x74\xc1\xe2\xf0\xc7\x95\x85\x1f\xaa\x7c\x34\x18\x03\x38\x18\x0e\x11\x2a\x02\x7f\x5c\xf9\xf7\xe7\x9f\x73\xa8\xd8\xfb\x71\x65\xde\x9f\x7f\xce\xa1\xa2\xee\xc7\x95\x73\x7f\xee\x39\x07\x4d\x98\x4d\x95\x0a\xe4\xdd\x61\xfe\x76\x51\xe9\xf5\xa0\x82\xe9\xfd\x06\x19\x98\x7d\xe7\x1b\x6d\x62\x95\xc0\xce\x99\xb7\x59\xcf\x0c\x14\x33\x67\x35\x3d\x28\x62\x7f\x66\xcf\x39\xcf\xa9\xda\x59\x61\xbb\x9f\x03\xb5\x18\xa6\x90\x7e\x8a\x5e\x52\xa1\xa9\x4b\xaf\xb2\xda\x43\x10\xb1\x81\x68\xe0\xe1\x4e\x25\x43\xe9\xba\xa1\xc8\x21\xbd\xd3\x89\xe9\x76\x1f\xb6\xb5\x7f\x7c\x0f\xb4\xfe\x86\xad\xa5\xb2\xab\xa4\x1e\x52\xe5\x92\xea\x95\x0b\x41\x19\x86\xd0\x03\xd0\xe0\x4a\x51\x17\x53\xf0\x30\x5e\xee\x27\x42\xf8\xfb\xa7\x3b\x2e\x0d\x83\x8a\xbc\x54\x9a\xd1\x52\x24\x07\x51\x18\x03\x58\xee\x58\x2c\x41\x93\xb0\x3d\x53\x0f\x4c\x09\x96\xd5\x05\x68\xdd\x0d\xdb\x27\x56\x0e\x87\x50\x87\x83\x5b\x3b\x8a\x27\xad\xd0\x50\x68\xc1\xee\x5c\x35\xb7\xde\xcf\x23\x82\xd9\x06\x6a\x85\xb5\xe3\xcf\x41\x78\x3a\xed\x0c\xc2\xc1\x74\x81\x40\xb9\x50\xf5\xaf\x81\x10\xba\xd0\x31\x18\xee\x27\x71\x74\x27\x89\xa3\x04\x2f\xdf\x43\xe2\x30\xb3\xe6\x4c\x47\x89\xae\xcf\xd6\x46\xe2\x84\x0d\x24\x86\x8e\x49\x7c\xd3\x88\xe7\x68\x17\x71\xfa\x46\x11\xc7\xb5\x88\x20\xcb\x40\xed\xd4\x67\x68\x0e\xf1\x0c\xed\x08\x62\x0a\xbc\x0f\xb2\x8c\x71\x4d\x20\x8e\x6b\xff\x40\x82\xcb\x18\xdd\xf8\xa1\x89\xcb\x5e\xa8\xe3\x70\x7c\x1a\x5c\x46\x35\x72\x38\xbe\x85\x03\x91\xfd\x9d\xe1\x8e\x6a\xde\x50\x99\x1a\x7a\xc1\x8e\x68\xdb\x10\xe1\x49\xa8\x9f\xe3\x38\x67\x50\xc2\x3e\x86\x7b\x86\x93\x70\xc2\x4d\x1a\x22\xdb\x30\x3c\xe7\xe9\x3d\xc6\x8b\xed\x42\x97\x2e\x92\x44\x96\x62\x38\x26\xea\xee\xe0\xf5\xae\xf3\xdd\x7e\xab\x2b\x36\xad\xc4\x00\x01\x4f\xd4\xb7\x4a\xe6\xcc\x6c\x58\xa9\x3b\xe3\x60\xfa\xbd\x97\x9b\x70\x04\xe9\xdd\x5f\x2f\xec\x9c\x5a\x6e\xc7\xbd\x50\x77\x27\x64\xa6\xac\xc8\xe4\xae\x99\xff\x72\xe8\xf9\x93\x8d\x6b\x59\xae\xc8\xbf\x59\x2e\xc2\xa5\xf8\xb7\x05\xb9\xc3\x3c\x11\x90\x45\x88\xa1\x6b\xf0\x03\x23\x2a\xfe\x7a\xd1\x88\x94\x38\x80\x89\xc3\x6a\x8c\x94\xc8\x4b\x03\xcc\xe8\x20\x18\xff\x13\x0e\x04\xd4\x76\x4f\xd7\x58\x0a\x71\x2d\x3a\x63\x3c\xf9\x0a\xc6\x44\x07\x52\x3c\x22\x8d\x54\x74\x3d\xb0\xf7\xf8\x8e\xdf\x70\x90\xdb\x51\xb1\x93\x2b\xc8\xb8\x73\x40\x5a\x52\x51\xd7\xbd\x7a\x10\xea\xce\x85\x36\x54\x24\x6c\x54\x00\x14\xd4\x06\xe8\xc9\xc4\x68\xc7\xd7\x5c\xb9\x37\x31\x41\xed\xce\xc5\xbd\xca\xc6\x14\xf7\x88\xb0\xf3\xf8\xdd\x19\x6a\xd8\xaa\xcc\xee\x98\xd1\xfb\x6d\x43\x7c\x31\xe4\x22\xa3\x09\x6b\x3b\xb2\x20\x59\xf8\x9e\xe5\x45\x46\x4d\x4f\x72\xcc\xc8\x88\x17\x87\xe6\x73\x97\x4a\x7b\xfe\x1d\x60\x22\xe5\xaa\x2b\xb2\x65\x48\xfa\xcb\x59\xca\xcb\xde\xf6\xd5\x6d\x3c\xfe\x04\x3e\x15\xd7\x7b\xdc\x6f\x36\x02\xa8\x92\xa8\x68\xf2\x80\xb9\x0e\x75\xa6\x4b\x2f\xcb\xdb\x6b\x3f\xfe\xe2\x85\xcf\x5e\x61\x54\x78\x4b\x38\xf2\x16\x99\xb2\xb3\x46\xca\x0b\x8e\xd9\x0f\xf8\x7d\x5d\x8f\x0d\x2b\x48\xb8\x28\xda\x97\x0e\xc0\x2b\x22\x15\x79\xcf\x72\xc8\xc3\x79\x1a\xf6\x83\xc8\x27\x31\x52\x82\xe6\xbf\x30\x88\xae\x8a\xdb\x84\x7b\x28\xce\x52\xc7\x84\x65\x90\xd2\xe2\x77\xc3\x6b\x7c\xce\x6a\x1a\xb8\xcd\xfc\xa1\xf0\xfe\x56\xf4\x40\xf3\x5f\x5c\xd5\x16\x94\xb1\xb4\x44\x35\x2b\x01\xbe\x64\x61\xe6\x80\xb5\x80\x80\x00\x3b\x03\xc0\x7c\x6c\x60\xe9\x8b\x8f\xe0\xb7\x9e\x62\xaa\x09\x3c\xf6\x46\x81\x93\xda\x55\x9e\xb7\xca\xbe\x2d\x99\x79\x64\x0c\xef\x8e\x3b\x8f\xbf\xc6\x65\x6f\xb5\x90\xa0\xe8\x0d\x21\x2b\x65\x6e\x11\xe8\x66\xe5\x22\x32\xed\xd9\x6d\x17\xb3\xa9\x43\x0b\xee\x03\xe2\x46\x83\x8e\x05\xcf\xda\x84\xec\x5d\x91\x15\x62\x4b\xe1\xe2\xe0\x90\xfa\x02\xaa\x4c\x74\x6c\xfb\x89\xc8\x31\xa8\xdc\x77\x30\xb4\x08\xc3\xe2\xed\xa7\x77\x95\x20\xdf\xcb\x71\xdb\xdc\xf5\x08\x3e\x46\x0b\xee\x6e\xc9\xb8\x63\x74\x71\x7b\xed\x6f\x55\x6f\x80\x82\xcb\x1d\x7f\x63\x29\x16\x8f\xa6\x28\xd1\x04\x8e\x91\x62\x90\xa7\xe0\xe2\x1b\x91\xf5\x3b\xfc\x2d\x40\x0e\xb2\x24\xe4\x2b\xc1\x49\xb1\x65\xca\x10\xc5\x12\xb9\x16\xfc\x97\x40\x15\x64\x1c\xbd\x92\xd3\x2d\xaa\x35\xd4\x4a\xc0\xc4\x0c\x38\x05\xb3\x4a\xfa\x54\xcc\x8e\x47\x4a\x11\x01\x19\x13\x08\x3a\xd9\xde\x9a\x9b\xc5\xc3\xbf\x00\x79\xb9\x4c\x33\xb3\x3b\x87\xe8\x6c\xbe\x2c\x8d\x54\xfa\x3c\xb5\x42\xef\xb9\xe6\xeb\x39\x55\xc9\x86\x1b\x06\xd9\x27\xe7\xb4\xe0\x73\x58\x9c\xc0\x4c\xa0\x3c\xfd\xae\x8a\xbc\x3c\x9a\x2f\x3e\xf0\xfe\x66\x3e\xed\xbd\xfc\x1b\x47\x05\x90\x7a\x3e\x8f\x4c\xa2\xda\x1a\x9f\x39\xfb\xf1\xea\xee\xbe\x8a\x9d\x0d\xa8\x4e\x56\x97\x84\x1d\xac\x41\xe8\x7a\x33\x2d\xc2\xb9\x58\xf9\x92\x3b\x55\xd1\x00\x26\xd2\x70\x67\xbd\x46\x79\x39\x5d\x2e\x81\xdb\x54\x71\x80\x46\x76\xa5\x5c\x92\x6b\x41\xde\xd1\x9c\x65\xef\x68\x28\xe3\xfc\x99\xb7\x12\xa2\xa8\xe6\x76\x3b\x8e\xdf\xcc\xbc\x27\xdf\xab\x7b\x43\xef\x0c\x15\x29\x55\x3e\x47\xcd\x5e\xfd\x75\x42\xd1\x33\xaf\xd6\x0f\x14\x5e\x6a\x20\x83\x58\xc7\x5a\xd0\xce\xc0\x68\xd6\xe4\x3e\x29\xd3\x70\x79\x27\x1b\xaa\x68\x62\x98\x82\x02\xc7\x78\x29\xf5\x1f\x68\x8c\xfa\x72\xa4\xe4\x2b\x45\x16\x32\x25\xb4\x34\x1b\xa9\x8e\x96\x70\xea\xb2\x37\x73\x7f\xbb\xd4\x3f\xe1\x2f\x89\xbd\x0b\x7a\xa9\x22\xa6\xc6\x09\x16\xef\x7d\x2f\xd3\x70\xdd\xe5\x3d\xe6\x5d\x7f\xe4\x6f\xea\x36\x02\x5d\x49\xe0\xdc\xbe\x11\x80\xda\x0a\x9b\x73\x4c\x7a\x43\xb7\xe3\x83\xd0\x03\x28\xc3\xa9\xcc\x61\x2a\xf3\x37\xa1\xba\xcd\x11\xed\x5c\xc6\x34\xdc\x1e\xe8\xb6\x61\x69\x1c\x55\xa1\x71\xe5\x3f\xd0\x0a\x52\x55\x08\xb3\x08\x74\x7a\x95\xa0\x85\xde\x48\x73\x59\x01\x0e\x2e\xa5\xdd\x6d\x6f\x0d\xc1\x54\x20\x20\xf8\xc6\x7b\x90\xb1\x56\x2a\xc5\x84\xc9\x76\x7b\x63\x04\x21\x3b\xfd\x14\x4c\xab\xb5\xd3\x0b\xcc\x56\xc8\xfa\x5d\x49\x4d\x86\x2d\x10\xe1\xbe\x0f\x57\xab\x4a\xa8\xf0\x90\xf6\x26\xd2\x04\x0b\x79\x14\xa0\xfb\x62\xac\x66\x78\xf9\x44\xb0\x47\x4f\x7a\x76\xa9\x00\xc8\x6b\xce\x8a\x61\x06\x67\x65\x73\x70\xef\x0d\x34\x59\xf1\x71\xd8\x8d\x62\xbc\xad\x45\xd6\x31\x67\xdd\xab\x09\x42\x6f\xad\xb4\x19\x6a\xea\x2e\x2d\x1f\xa0\xea\xc5\x6b\x57\x59\x30\x08\xb3\x5e\xaf\xdb\x25\xac\x77\x09\x19\x60\x70\xfb\x01\xa0\xd2\x92\xc8\x8c\x3c\x32\xab\x5f\x8b\xa1\xfe\x44\x7e\x69\xb9\x3d\xc2\x8d\x49\xfb\x68\x60\x37\xbd\x25\xdb\xd0\x2d\x97\x2a\xa6\x25\x71\x13\x85\xf6\xfa\xc7\xe0\xe1\x50\xa5\x8b\xd8\x5e\x47\xb4\xe0\xbd\x11\xa9\xcd\xa7\x2d\x53\xdf\x5e\x63\xdc\xb0\xa3\x74\x8c\x9a\xf6\xf9\x89\x83\x02\x8e\x7f\x96\xcc\x0a\x46\x55\x61\x12\x74\x60\x35\x61\xb7\xcb\x53\x0c\x62\x89\xb4\x42\x7b\x40\x28\xdb\x2b\xae\x9e\xd8\x2d\xb9\xb8\xbd\xc6\x19\x43\x76\xc3\x20\x44\x2a\x76\xae\xea\x92\xd9\x70\x95\xce\x0b\x0a\x9e\x51\xbb\x97\xb3\xd6\x6c\xab\xb4\xa7\x01\x90\xd1\x25\xe8\x43\x02\xa8\x7f\x5a\xfb\xe2\xe5\x50\xa8\x75\xe9\xcc\x24\x55\x9e\xf5\x3e\xb6\x4f\x35\xcb\x98\x4e\x59\x87\x9e\xee\x3d\xa3\xed\x33\xcf\x32\xa6\x33\xd5\x1c\xf0\x1d\x7c\x61\xa0\x6d\x55\x54\x33\xaa\xde\xe4\xcd\xe6\xb3\x9f\x9e\x57\xa7\x70\x7a\x75\xa0\x65\x93\x08\xa7\xe3\x55\xd3\x7b\x76\x51\x63\x50\xe7\x22\x23\x38\x53\x7f\x7e\x69\xf3\x89\xcf\x88\x6c\xa1\x22\xbe\xa9\xd9\x31\x39\xa8\x83\xe3\x1f\xe4\x51\x7e\xdd\x7c\xd4\x43\xd4\x44\x74\x54\x0b\xe5\xa9\x36\x9f\x2f\xbc\x43\x51\xb9\xac\x83\xc3\x77\xe5\xba\x0e\xe6\xb5\x0e\x42\x0d\xe5\xbd\x76\xe6\xb8\x0e\x42\x3c\x79\x0e\x6c\xf3\xf9\x8a\xf9\xb0\xcd\x27\x92\x22\xa3\x5e\xd3\x3d\x75\x78\x9a\xcf\x7e\x5c\x22\xc4\x56\x42\xe1\x10\x22\xb7\x4c\x35\x2b\x88\xfa\xc6\x4d\x81\xba\xc6\xf8\x2c\xb9\x48\xb9\x08\xb6\xbd\x8f\xe5\x8b\x90\x72\x7b\x55\x65\xd9\x8e\xeb\xbf\xb9\xff\x71\x3b\xa5\x12\x97\xea\x71\x34\x48\x1f\xee\x3c\xe4\x68\x9e\xba\xdf\xb0\xd6\x2f\xe0\x24\xbc\xb8\xb9\x1c\x16\x88\xa2\xda\x88\xf6\xec\x8b\x9f\x6c\x73\x68\x67\x8a\x8b\x5d\x06\x69\x45\x77\x6b\x67\xa0\x9c\x41\x3c\xe0\x0e\x6d\x9c\x54\xb8\x06\xef\x2e\x14\x3c\x02\xa6\x62\x99\xcb\x03\x62\x50\x1b\xa7\xae\x9d\x32\x84\x8e\x71\x8d\x4a\x89\x85\x1e\xf3\xda\x1e\x02\xed\x9c\x7c\x15\x6b\xc0\xa4\xfd\xa1\xf2\x14\x8c\x40\x1e\x01\x2d\xc2\x07\x1d\x0f\x2f\x8e\x8c\xe3\xee\xf6\xf1\xb8\x3f\x62\x99\xd5\xb6\x35\x44\x27\xd8\xd8\x33\x8d\x5b\x64\x4f\x41\x5f\xea\x65\xc7\xc4\x25\x50\x16\x9c\x16\x6f\xc8\xfe\x44\x33\x9e\x56\x03\x21\xdd\x5f\x8b\xa1\x7e\xe2\xfe\xb9\x91\xe6\x5a\xcc\xc8\xd5\x67\xee\x4b\x73\x5c\x4a\xa6\x6f\xa4\x81\x5f\x9e\x05\x9d\x38\xf1\x23\x90\xe9\x6a\xff\x60\xf5\x27\xb0\xee\x34\x2a\x04\xc5\x12\x37\x3e\xce\x36\x50\x6d\x0f\xd7\x56\xdb\x96\xca\xe3\xa3\x0a\x74\xd0\x83\x4d\x5b\x9b\x8f\xd7\xf7\x84\x14\x73\xf0\x44\x2d\xba\x46\x42\x64\x47\x82\x94\xaa\xb5\x23\x87\x53\xab\x06\xc5\x01\x23\xc1\x82\x2d\x0b\xbf\x07\xdd\x11\x3c\xf7\x29\x49\x4b\x85\x0d\xeb\xb4\x51\xd4\xb0\x35\x4f\x48\xce\x54\x20\x22\xaa\xfd\x14\x96\xbf\xc7\x4d\x21\x92\xeb\xe2\x33\x92\xc2\x62\xfb\xed\xe2\x13\xdb\x37\x18\x74\x34\x36\x0c\x6f\x5e\x6d\x76\xa4\x98\x19\x21\xed\xc6\xaf\x08\xae\xd8\x1f\x7a\xab\x75\x35\x9f\x2f\x2b\x1a\x37\x26\x86\x37\x64\x8e\x15\xbe\xfe\x8f\xbd\xe6\x80\xa0\xff\x93\x14\x94\x0f\x35\xfd\xb6\xcf\x85\x2f\x1a\xd4\xfc\xd6\xd9\x58\x9a\xc3\xd8\x11\xb8\x26\x76\x7f\xb7\x34\x63\x11\x82\x37\x0a\xac\xcc\x75\x59\x94\xab\x03\x89\x65\x46\x1e\x37\x52\xe3\x9d\x0a\xa6\xe0\x41\x90\x5c\x93\x17\x0f\x6c\xf7\x62\x76\xc0\x07\x5e\x5c\x8b\x17\x75\x6d\x8d\x51\xec\xa6\x92\x16\xc0\xca\xfb\x02\xbe\x7d\xf1\x14\x21\xe8\xa4\x52\x2e\xaa\xe8\xbd\x85\xbb\x9a\xcf\x5e\xff\xbc\x66\x10\x5d\x03\x4a\x1d\xd7\xe1\x53\x36\x32\xca\x03\x01\x30\xe4\xf8\xa8\xa2\x0e\xbb\x02\x94\x14\x0b\xfb\x2e\xa2\x0e\x85\x6f\x17\x90\xc6\x63\xa4\xfe\xa4\x72\x94\x3d\x36\xa3\x90\x9c\x41\xa5\x61\xfe\x0b\xeb\x01\x4d\xec\xd5\x29\x17\xdf\x57\xed\x06\xa0\x63\x53\x8e\x89\x05\x8f\xae\x7a\x7b\xd8\xd9\x20\x92\xac\x4c\x31\xfa\x0b\xc0\x82\x22\x38\xae\xa3\xc8\x68\x14\x8e\x22\xaa\x4f\xd5\x27\x5e\xe0\x74\xda\x50\x6d\xe6\x1b\xca\x56\xb3\xcf\xed\x5e\x13\x0c\x08\xf5\x42\xcf\x3a\x74\x3d\x1b\xa0\xc7\x88\xd5\x0d\x7b\x56\xa1\x9d\x51\xb4\x0b\xd9\x94\x07\x16\x3b\xe7\x4f\x82\x63\xa1\x72\x54\x91\x11\x6a\xef\xd4\xf7\x3a\x80\x78\x8a\x73\x24\xf4\xd1\xd7\x9c\xff\x35\x79\x59\x5d\x15\xa4\x63\x9c\xac\x35\xd1\x30\x08\x0c\xda\xd0\xee\x50\x94\x7f\x32\x67\x6b\x42\x0b\x9a\xf0\xbe\x7e\x4e\xf8\x8c\x97\x46\x22\x27\xd8\xce\x14\x6e\x1f\x08\xb7\x95\xb5\x91\xcd\x5d\x3e\x58\x30\x78\x37\x24\xe2\x6c\x23\x5b\x3e\x0c\x5c\x98\x89\x14\xb8\xf6\x78\xea\x7c\xe7\x4e\xf2\x3b\xff\xa9\x9d\x79\xdf\x31\x0d\xae\x01\x12\xc3\xfc\x6a\x3b\x40\x40\xc0\x3f\xb2\x4b\xcd\x7f\x61\x20\xac\xf4\xe7\x33\x11\x47\xef\xf5\xbc\xbc\x8f\xd3\x95\x68\x3e\xfb\x08\x60\xee\xb0\xbb\x63\xb0\x7f\x4a\x04\x8d\xb6\x6b\x80\x76\xf5\x29\xaa\x27\x82\x67\x38\xd3\x24\x65\xf0\xbf\x43\xd2\xf1\x52\x96\x06\x78\x2e\xdc\x91\xc5\x36\xd4\x69\x7b\x8c\xd1\x24\xa3\xda\xdc\x2a\xb9\x64\xf7\x7c\xd8\x75\xb5\x9f\x9c\x4f\xb5\xc1\x86\x9b\x8f\xae\x97\x70\xd5\x1a\x0e\x57\x39\x2c\x3c\xfb\x4c\xdf\x94\x1a\x36\xef\xad\xd7\xd2\x7c\x46\x48\xfc\x76\x6d\xf7\x8a\x0a\x0d\x93\x79\xd2\x02\x5b\xcb\x22\xa6\x02\x1a\x61\x39\x26\x18\x95\x26\x05\xf3\x2d\x00\x41\xae\x07\xbb\xf4\x57\x46\x90\xeb\xf0\x37\x12\x2b\x7f\x2d\x73\x2a\xe6\x8a\xd1\x14\x02\x91\x7d\x9b\x40\x8e\xe5\x7e\xa0\xb1\x42\x14\x4d\x93\x8a\xae\xa1\x6b\x61\x8d\xd4\x61\xac\x8c\x58\xa3\x62\x54\x87\x1b\x19\x75\x2c\xf1\x47\xc1\xff\x81\xb5\x86\xb8\x6e\xb4\x24\xa1\xf6\xbf\x95\x99\x91\x9c\x26\x1b\x2e\x62\x0c\x11\xc0\xcd\x34\x84\xd0\x59\x64\x39\xfb\x10\xd8\x16\xd7\x7c\xeb\x6c\xa2\x38\xc7\x41\xc3\x39\x3e\x15\x19\x9e\xe9\x03\xc4\x59\xfe\xc9\x8d\x8b\xe0\xd0\xe4\x45\x8b\xbd\x75\x15\xf1\xda\x7f\xb0\x00\xb9\x8b\x94\x66\x71\xbc\x38\xca\x00\x0c\xdc\xfa\xa4\x1b\x1b\x16\x40\x8f\x02\x19\x2a\x97\x51\x3f\x23\xd8\xbc\x2b\xab\x11\x73\x10\xb0\x14\x54\x9d\xd0\x14\x06\xbc\xb0\x90\x4f\xb7\xf4\x38\xab\xd3\x9c\x0c\x88\xe7\xf8\x92\x19\x9a\xda\x28\xf5\x3e\x2c\xcb\x15\x1b\xaa\xe3\xb5\xaf\x5b\xfb\x76\x9f\x1a\x02\xa0\x7a\x31\xff\xbc\xea\xd4\x31\xc9\x82\x86\xae\xc3\x95\x5d\xe9\xfa\x8b\xa4\xdb\xf9\xc8\x7d\xab\x62\x63\x1a\x1c\xe1\x2b\x18\x7d\x64\xda\x9b\x91\x19\x53\xdd\xad\x1c\x0e\x3a\x6c\xb4\x4b\x07\x14\x32\x3d\xd3\xcd\xef\x23\xcb\x87\x1e\xa4\xfb\x16\x32\x45\x9e\x7f\x5f\xc1\x02\xbb\x01\x76\x38\xc7\x08\x40\xfc\x0b\x04\xaf\x75\xd1\xa5\xc5\xaf\xf1\x8d\x1c\x0c\xf6\x45\xdf\x30\x62\x14\x74\x72\xff\x53\x65\x23\x9c\xb1\xd5\x8a\x25\xe6\x5f\x1b\xcd\xa4\xe0\xfd\x6e\x1a\xaa\x2c\x75\x7f\xf2\xff\x75\x50\x22\x75\x48\xea\xc3\xf1\x22\x4a\x81\x5c\xc1\x8b\xfe\x3e\xf7\xf3\x87\x65\x21\x0c\xe8\x17\x09\xc6\x75\xcc\x1b\xea\xa1\x79\xbc\x46\xb0\x2a\x32\xcd\xb2\x16\x08\xed\xfb\xe5\xd7\x1b\xe9\xa2\x3e\x9c\xe9\xb1\x07\x26\x55\x8c\xdc\xc8\x3b\xd7\xbb\x65\x46\x6e\xc1\x6c\x52\xff\x02\x06\xcc\x1b\x79\xf5\x99\x25\x65\x5f\x86\xdf\xc0\x71\xed\x75\x21\xb6\xc3\xcb\x6a\x97\x21\xae\xab\xe5\x32\xac\x49\xd1\xbb\x03\xfb\xf8\x82\x74\x38\xec\xc1\xd6\x03\xdb\xe9\xca\x6d\xe3\xdc\x94\xe0\x5a\x99\x0d\xd9\xf5\xbd\x23\x06\xfd\x3b\xff\xd3\xb7\x24\xce\x97\x75\x9f\x6c\x97\xd8\x57\x8f\xe9\xad\xbe\xbd\xa1\x5f\xf6\x25\x98\xd2\x31\x88\x0d\x7b\x2e\x5b\xd8\xfd\x10\xe9\xa9\x6c\xf1\xa5\x3e\x16\xdd\xe5\x93\x6c\xb8\x18\xaf\xfe\x51\xd2\xac\x9d\x8d\xef\x7e\x0a\xba\xc6\x5a\xa6\x7c\xe8\x26\xc1\xb3\x34\xa1\x0a\xb3\xfd\x5c\x4e\x90\x6f\x4d\x85\x29\x00\x09\xc4\xcb\x22\xfb\x08\x20\x18\x76\xde\x15\xbd\x2e\xa8\x32\x3c\x81\x62\xe2\xae\x61\x48\x8f\x53\x6d\x28\x95\xac\x22\xc8\x3b\xac\x2b\x1e\xb1\x09\xf7\xfb\xdf\xec\xdf\x9c\x05\x53\x5c\xa6\x60\xa5\x70\x3a\x52\x2f\x95\x57\xc7\xe1\xa5\x4b\xc6\x73\xd4\x29\x57\x9e\xa7\x54\x87\xb6\x15\xb2\xd3\x9f\xed\x55\x15\x00\x70\x97\xce\xab\x06\x67\xae\x4e\xe5\x82\xfc\x79\xe7\xa3\x8a\x20\xc2\x08\x03\x69\x7b\x40\x42\x19\xdd\x76\xd6\x2b\x42\x6c\x1c\xf3\x95\x54\x6c\xcb\x14\x79\x99\x4a\x08\xc9\x65\x5b\x9e\xf4\x37\x62\xfc\xbf\x98\x92\x40\x64\x82\xad\xa9\xe1\xdb\xca\xb1\xe2\xed\x10\xc6\xc7\x69\x6b\xf2\x9a\xbc\x04\x60\x84\xe7\x39\x4b\x39\x35\x2c\xdb\xf5\x15\x56\x71\xa6\xf3\x50\x57\xde\xa7\xd7\xd0\x0a\x14\x4c\xea\x28\x96\xd4\x62\x86\x28\x27\xec\x71\xc2\xea\x3a\xec\x0d\x8c\xe8\x75\x4f\xb7\x4a\x5a\x56\xea\x98\x67\x84\x03\xcd\x44\xff\xdd\xd2\x1a\xad\x8a\xf2\xe3\x19\x39\xe2\x14\x1d\xd1\x10\x6f\xdb\x9d\x05\xd9\x46\x9f\x93\x9f\xd0\x17\x02\x5d\x54\x1a\x6b\xec\x6b\x4e\xd6\x31\xc7\x50\x03\xe8\xbe\xee\xca\x2e\xd8\x52\x93\x56\xa4\x1a\xf0\x9e\xca\x02\xda\x7a\xff\x00\x2b\x6e\xe6\xae\xa1\x7f\x23\x73\xb4\x51\x93\x60\xd1\x1e\xb2\x8e\x4b\xef\xac\xc9\x8d\x75\x3c\x99\x70\x85\xe4\x30\xde\xbc\x05\xc0\x79\x57\x69\xa7\x68\x3b\xeb\x8e\x4a\xb2\x5c\x7f\xcd\x04\x9c\x67\x4c\x6d\xb0\x5a\x69\x99\x61\xfd\x7c\xb4\x62\x43\x0e\x98\x6f\xbd\x74\x84\x08\x79\x44\xdb\xea\xce\x5c\xb2\x40\xdd\xbc\xb0\x8c\x37\xd0\xa4\xfa\xf8\xf6\xd4\xa1\xf6\x60\xe4\xd8\xc6\xd4\x03\x77\x56\x5c\x33\xea\x23\xdb\x50\x37\xfa\xd0\xf5\x5d\x30\x23\x1a\x50\x1f\x34\x99\x0e\xdd\x30\xc3\xad\xa7\xc7\xb4\x97\x1e\x40\x62\x7f\x46\xc2\x89\x9a\x49\x0f\x8c\x1f\x6e\x20\xfd\x94\xd6\xd1\xae\x3d\x74\x0f\xa6\x8f\x6d\x1a\x3d\xd4\x2e\x3a\xd8\x28\xfa\x59\x5a\x44\x9f\xb6\x39\xf4\xc0\x76\x0d\x36\x84\x3e\xb2\x15\xf4\x93\xd7\x7a\xd0\x04\x3a\xd0\xe8\xb9\x0f\x78\xb8\xfd\x73\x44\x8b\xe7\x1e\xc0\x9d\x8d\x9f\x23\x9b\x3b\xf7\x80\xec\x6a\xf9\x3c\xd4\xd6\xf9\xe8\xf6\xbf\xfd\x4d\x9c\x4f\xd7\x1a\xd8\x39\x85\x23\xe4\x92\x28\x91\xc4\xc7\x9d\xa3\xf4\x71\x28\x94\xc4\x48\x23\xfb\x82\x48\x53\xf0\xe8\x32\x80\x21\xb7\xaf\x22\xde\x41\xaf\xfb\x62\x42\x45\x5b\x13\xc6\x2a\x89\xde\x0e\xef\x6a\xa2\x34\xbb\x87\x76\x10\x08\xba\xe3\x5d\x4a\x7a\xb3\x38\xaf\x17\xa7\x0a\xd9\x61\xa0\x0f\xcb\x1b\xf4\x51\x5f\x65\x54\x1b\x9e\xfc\x39\x93\xc9\x83\x5d\x71\xcc\x6d\x73\x76\xf1\xd3\xdd\xc1\x77\xad\x15\x0a\x72\xf1\xd3\x1d\xb9\xe4\xfa\x61\x28\x85\xd2\x77\x40\x6b\xda\xe8\x28\x79\xc0\x06\x11\x67\x67\x1a\xaf\x6f\xe7\xb0\xf1\x37\xb7\xb0\x07\x5d\xea\xde\xbb\xdf\x99\x15\xa0\xd0\xcc\x13\x4b\x12\xd1\x47\xcd\x70\xa9\x4b\xbb\x54\x48\x25\xee\x8e\x85\x18\x76\xda\xae\xf4\x7d\xd0\x43\xd1\x46\x72\x23\x90\xca\x47\x68\x35\x78\x33\xe0\x6d\x27\x4b\xf2\x48\x83\xa1\x88\x46\x22\x7f\x58\x90\x7b\x5e\xbc\x25\x57\x8d\xbe\x19\x58\x8b\xba\x3d\x08\xd7\x75\x9a\x77\x00\xaa\x53\x60\x61\x6f\x50\xdd\x83\xd6\x9d\xa8\xcf\x92\x2b\x6c\xb2\xa5\xdf\x92\x17\xec\xb3\xf9\xc3\x8b\x19\x79\xf1\x79\xa5\xed\xff\x08\xb3\xd2\x2f\x42\xb6\xf8\xeb\xbc\x4a\x02\x82\xba\x20\x2e\x6f\x7b\xc9\x1c\xa8\xc3\x62\x89\xe1\x7e\xa8\xf8\x9c\x6a\xe3\x03\x43\xdc\x7f\xb8\xfc\xf0\x16\x84\xd4\x54\xa2\x3f\x1d\x12\xaf\x09\x53\x4a\xaa\x4a\xe5\x69\xa0\x1b\x2e\xd7\x44\xe6\x85\x92\x39\xd7\x03\x61\x31\x60\x5d\x86\x23\xd0\x1f\x87\x13\xe1\xc6\x00\x73\x54\xbf\x2c\x4e\x0e\x0b\x64\xd9\x53\xe4\x3f\x22\x6d\xe9\xa0\x45\x81\xe1\x44\x72\x47\x81\xd7\x2b\x9f\x5e\x36\xf3\x55\xef\x7c\x9d\x27\x4f\xa6\x96\xb2\x1c\x7c\xcb\x24\x43\xa4\x52\x53\xd9\xf7\xd2\xf3\x75\x72\x9e\xb2\xed\xb9\x4e\xe9\x9b\x19\x4c\x0d\x09\xc5\xb5\x96\xf2\xeb\x08\xc0\xa4\x9a\xbc\x78\xf3\xa2\xaa\x41\x98\xed\x66\xcd\x15\xd7\x98\x58\x49\x55\x0d\x15\x76\x10\xbe\x78\xfd\x82\xbc\x94\x0a\x66\x93\x50\x41\x32\x46\xb7\xcc\xd7\x12\xc0\xca\xd4\x60\x07\x79\xb5\xe8\xdf\xd9\x50\x6b\xd5\xfa\x19\xb2\x07\x91\x41\x71\x9e\x74\x56\x55\xb1\xf8\x7b\x61\xe5\xf8\x17\x20\x7b\x4b\x95\xf8\x5e\xc7\xc8\x42\x3e\x3a\x98\x01\x24\x54\x4b\xe5\xa2\x6d\x09\xb0\x42\x16\x80\xee\x25\x8e\x00\x54\xae\xc9\x0b\x50\x05\x5e\x7c\x41\x2e\x4f\x22\x94\x0c\x52\x09\x4c\xd7\x97\xb1\x98\xc6\x90\x05\x72\x7d\xe9\xf9\x7c\xc3\x61\x9f\x36\xef\xd1\xbe\x66\x01\xf8\xd8\x6b\xf7\xe5\x45\x4e\x7f\x91\x82\x5c\xfd\xf9\xce\x4d\xe3\xd5\x57\x41\xd0\x13\x8a\xa9\x7b\xec\x05\x04\xe5\x5e\x67\x2c\xfd\xa5\x54\xcc\x8a\x1e\x11\x92\xcc\x85\x7f\x77\x5f\x7a\xb1\xbf\x93\x4b\x6a\x28\x0a\x31\x2e\x1b\xba\x0f\xf3\xd5\x5d\x68\xcf\xc5\x12\x8a\x35\xb8\x62\xad\xfd\x92\x19\x89\x12\x19\x12\xe0\xfa\xeb\x70\x9c\x77\x9b\x92\xfe\x6a\x27\xf2\x0e\xbf\x83\x80\xd2\xb7\xe4\x46\x0a\x36\x83\x83\x4a\xec\x49\x75\xff\xf9\x93\x55\xc8\x03\x6c\x27\xe2\x42\xb1\x94\x19\x0e\xa0\x3e\xf0\xd1\x36\xc3\xf2\xa1\xa2\x08\x50\xb7\xbb\x5a\x96\x99\x5c\xfa\x90\xff\xa7\xce\xeb\xc7\x8f\xd7\x23\xa6\xf5\xe3\xc7\xeb\xe7\x9d\xd2\x28\xe1\x6f\x5f\xf6\xab\xa5\xb8\xaa\x1c\x67\x43\x96\x08\x49\x0e\xf6\xeb\xba\x70\xcf\x90\xdc\xb6\xf0\x12\x5b\xe8\x46\x6b\xc9\x72\xa3\x25\xb6\xa7\xe0\x30\x5c\x45\x64\xaf\x50\xad\x6f\x56\xee\x5c\x36\x77\x1b\x6a\x19\x0e\xc9\xcb\xcc\x80\x2f\x1f\x36\xd6\xee\x74\xe8\xfa\x2e\x98\xaa\xea\x81\x52\x57\x82\x99\x5c\x32\x74\xad\xa7\x6f\x7d\xee\x50\x05\xab\xf9\x41\x48\xce\xf0\xa0\xde\x83\xf9\x3b\x7d\x8b\x5c\x8b\xa0\x35\x3c\x6d\x50\xe1\x4b\xb4\xa4\x09\xff\xa7\x10\xd0\x2d\xe5\x19\x5d\xf2\x8c\x9b\x9d\xbd\x9d\x5f\x2d\x5a\x19\xf9\x1a\x10\xf0\xa4\xe3\x3e\x52\x7c\x38\xb0\xd9\x91\x97\x16\xc2\x39\x58\x02\x5f\x2d\x2a\xc9\x21\x5c\x62\xd4\x55\x36\x42\xc1\xa3\x29\x70\xf8\xf6\x15\xfb\x52\xc5\x10\x89\x85\x2e\xee\xa1\x8b\xc9\x33\xbc\xc0\x9f\x7f\xfc\x78\x7d\xf4\xb5\x65\xcf\x7d\xec\xb5\x65\xdf\xed\xbc\xb6\xe0\x0f\xae\x6c\x38\x09\xd5\x88\x70\xbe\x9f\xe7\xb9\xb9\xfe\xf9\x69\xc5\x37\x7c\x1e\x71\x01\x36\xeb\x04\xe1\xc7\x7b\x09\xfb\xb8\x83\x77\x83\x0c\xc4\x97\x83\x87\xdb\xd4\xee\xdd\xdf\x02\xc9\xa4\x11\x27\x1b\x98\xc3\x88\x85\x00\x37\x25\xc1\x22\xfc\x4f\x16\x02\x6b\xec\xf6\xbd\xe0\x27\x7d\xcc\x79\x4b\x58\xb1\x59\xc5\xc4\x51\xbc\x63\xc5\xe6\xfb\xbb\xb6\x01\xcf\xfe\x46\xbe\xbf\xab\xe4\xc2\x86\xa3\xa9\xbf\xa4\x02\x4c\x57\xa3\xb1\xef\x4c\x93\x8c\xaf\x58\x6f\x44\xf8\xf0\xf9\xca\xa5\xe0\x46\xaa\x40\x04\xed\x61\x31\x19\xc0\x36\x79\xef\xbe\xc4\x94\xba\x44\x66\x19\x4b\xbc\x8d\x16\x16\xe6\x41\x07\xe8\xaf\x43\x9d\x70\xad\xd5\xb5\xaf\x1e\xea\x4b\xaa\x23\xa2\xcf\x3f\x5e\x5d\x5c\xbe\xbf\x5a\xe4\xe9\x77\x1b\xf9\x38\x37\x72\x5e\x6a\x36\xe7\xa6\xff\x3e\x1a\xcc\xd8\x88\x0a\x8f\x1d\x8e\x42\x2d\x7a\xfd\x41\x87\x48\xc4\x6e\x4b\x34\x83\xee\x75\xa9\xeb\xcc\x5e\x75\x48\x57\x52\x9a\x19\x51\xd4\x55\x58\xeb\x65\x1b\xc4\xa9\x0c\xab\x32\xcb\x10\xe3\x46\x31\x36\x6b\xda\x43\x02\x95\x64\x4e\x7f\x4f\x37\x96\x15\xcb\x86\x43\xc6\x36\xa6\xd8\x68\x36\x1c\xae\xdd\x4d\x9e\x99\xd4\xe2\x79\x7d\xff\x05\x1d\xc2\xea\x5d\xf5\xad\x8f\xb3\x01\x8f\x9b\x91\x10\x13\x38\x10\xde\xbd\x92\x0a\xfa\xd8\xb4\xe9\x83\x99\x04\x96\x0b\x75\xcb\x17\xee\x2e\xf9\x02\xa7\x32\xe6\x2e\x81\xc9\x7c\x64\xab\x63\x11\xf5\x91\xad\x30\x0b\xb9\x9d\x52\x0b\x35\x78\x99\x30\x90\xa6\x12\x34\xe3\x39\x74\x74\x62\xce\x95\xd2\xf8\x02\xa8\x8a\xcb\xe2\x1a\xae\x39\xd8\x9f\xd6\xee\x30\x64\x46\x9b\x77\xe4\xd6\x8a\x87\xec\xf1\xfc\x51\xaa\x07\x2e\xd6\xf3\x47\x6e\x36\x73\xe7\xe5\x3a\x87\x16\x89\xe7\xdf\xc1\xff\x04\x67\xe6\xcd\xde\x17\x69\xea\xdc\x6b\xa5\x66\xab\x32\xc3\x00\x08\xbd\x68\x54\x92\x9f\x81\xf2\x36\x23\x25\x4f\xff\x57\xb8\x4a\xd6\x08\xb6\x1e\xcc\x41\x08\x35\x22\x0d\xf2\x75\xe5\x0f\xa9\xa2\xa9\xd4\xd8\xd7\xc9\xe2\x62\x16\x67\x93\xa4\x69\xce\xc5\x37\x71\x14\x87\x04\xac\xe0\x3d\x3f\x24\x3e\x71\x91\xf6\xe1\xb7\x8d\xdb\x77\xf0\x66\x5b\x7e\xc2\xaf\xeb\x52\xbc\xce\xf7\x47\xbd\xfe\xd1\xab\xe7\x4a\xe1\x7d\x83\x6d\xcf\x60\xd4\x81\xce\x77\xfa\x1f\xd9\x1c\xc7\x9e\x17\x69\x8d\xf1\xaf\xe3\xd0\xfb\x52\x46\x9d\x3d\x67\xdc\x57\x30\xed\x44\xc9\x8b\x23\x77\x87\x4c\xa2\xd0\x49\xb1\x18\x23\xfd\x1c\x75\xa7\x43\x23\x07\xed\xcb\x8d\xc1\xc5\xec\x3a\x42\x38\xad\x37\x2c\xfe\x54\x1d\x6c\x5d\x9f\x5e\x8c\xe4\x13\x2e\x8f\xe5\x43\xc1\xc4\x9d\xa1\xc9\x43\xc0\x8e\x3d\xdd\xc3\x5f\xf5\x1e\x1e\xeb\x09\xf3\x61\x31\x69\xb5\xdf\x1c\x7a\x58\x3a\x37\x6e\x1d\x35\x83\x44\xfe\x0d\x72\x9d\xe7\xf4\x6e\x61\x54\xd5\x7b\xda\x53\xe5\xbc\x6d\xb9\xf0\xef\xee\x5d\xbe\xd5\xcf\x60\x7b\x72\xd1\x7a\x85\x2c\xca\xac\x3f\xb3\x05\xf2\x8f\x70\xe2\x47\x5e\x96\x4e\x78\x1a\xe3\xca\xaa\x99\x48\x2e\x53\x46\x96\xdc\x54\xad\xcc\xa4\xa8\x8a\xe4\xc3\x9d\x19\xa0\x82\x65\x95\x43\xd2\xbc\x69\xdb\xcd\xaf\x5e\x83\xec\xf1\xfa\xbf\xff\xf7\xff\x1e\xc8\xa2\x6c\x60\x43\x92\xd7\x7f\xfc\xc3\x1f\x16\xe4\xd2\x75\x66\xe3\x4c\x37\x03\x28\x0b\x1f\xfc\x27\xa4\x21\x14\x32\x64\xc2\x6d\x71\x1d\x82\xdd\x9d\xe0\xc2\x88\xb1\x49\x38\x96\x7c\xb7\x9b\x96\xf1\xc4\x60\x47\x4c\x3c\xe4\xae\xe5\x72\x10\x28\xf5\xe3\x57\xf1\x27\x80\xcb\x19\xc9\xf8\x03\x23\x2b\x0d\x25\xdf\xeb\xc2\x61\x18\xfe\x16\x80\x98\x50\x01\x79\x0d\x30\x81\x7a\x57\x34\x33\x5f\x24\x80\x61\xc0\x28\xb4\x9f\x68\xda\xea\x52\x0d\xed\xf4\x1f\xd8\x6e\x8e\x5b\x5f\x50\x5e\xc5\xce\x5d\x52\xd3\xdf\x14\xc6\x27\x2b\xb5\x99\x7d\xc2\xd2\xc6\x01\xf3\x01\x88\x85\x92\xff\x8e\x9b\xcd\x45\x30\x24\xa6\xd9\x89\x42\x3b\xc1\xcf\x95\x83\x13\x8d\xf2\x52\xbe\xdc\xaa\x6b\xbe\x1c\x8e\x35\xa9\x53\xe9\x3a\x92\x6c\x33\x0e\x0d\x6d\x1e\xd8\x4e\x1f\xce\x36\x28\x6e\x38\xed\xbb\x8e\xb6\xb4\xd4\xad\x91\x66\x4a\x71\x00\x17\x5b\x58\x84\x6e\x74\x64\x45\x30\x49\xea\xb3\x22\x1b\xb1\x9c\x10\x70\xec\x5a\x26\xb8\x77\xdd\x3e\x05\x80\x56\x5b\xd1\x8a\xd8\xd1\xcc\x94\x6e\x73\x20\x10\xcb\xce\x97\x69\xed\x52\xc9\x72\xaa\x1e\x82\x6b\x97\x8e\xff\x2c\x20\x1a\x5c\x57\x69\x6f\x98\xc3\xb8\x65\x55\xd3\xb0\x66\xbe\x44\x78\x9e\x67\x8b\xc5\x19\xb2\x07\xa9\x88\x36\x54\xb9\x13\x6d\x7f\xef\xbf\xca\x06\x6d\xa1\xed\x48\x7c\x5a\x34\x1a\x78\x41\x66\xab\x84\x64\xc4\x3a\xca\x9b\x46\x94\x1b\x8a\xad\x42\x13\x51\xb4\xf7\xc0\xdd\xee\x26\xe5\x08\xf0\x64\x6d\x26\xf2\x81\x7a\x78\x07\x73\x19\xb8\x62\xb0\x2b\x19\xcf\xd8\x70\x09\xdc\x3c\xe2\x66\xb9\x5e\xed\xf5\x01\x19\x84\xda\xa0\xe5\xc6\xfd\xb9\xd7\x2b\xbf\x75\x59\x0c\x82\x0c\x5f\x26\x9d\x57\xc6\xf0\xe2\x07\xaf\x94\xc3\x8b\x63\x10\x68\xc4\xc5\x82\x4f\xdc\xf5\x82\x4f\xcc\x25\x83\x4f\xd8\x2f\x80\xcf\x01\x5d\x57\x9c\x01\x8f\xf8\xaa\xbe\x75\x21\x53\xbb\x88\x6a\xfc\x82\x87\x03\x1b\x81\xbb\x86\x40\x54\x10\xba\xd4\x32\x2b\x0d\x82\xae\xff\xe8\xd8\x4e\x14\x25\xc1\xa4\x7c\x41\x52\xe0\x38\x15\x98\x06\x2b\x02\x66\x1f\x57\x1e\x37\xcc\xb5\xdc\xc0\x27\xed\x6b\x12\xac\x99\x3b\x87\x15\x0e\xba\x8c\x06\x4a\x97\x0c\xbb\x8c\xc2\xba\xe2\xb7\xaa\x27\x9e\x58\x47\x8c\xd8\x57\x7f\x7f\xc6\x3a\x95\x5d\xb4\xe9\xe3\x86\x39\x17\x1a\x6b\x88\x58\x52\x11\xcb\x10\x40\xd0\xb0\xcc\x36\x24\xf1\xfb\x0a\xa7\xfd\x97\xfb\xb0\xd1\x63\x48\x11\xd3\x3c\x46\x05\xbb\xbb\x26\x2f\xdf\x55\xa9\x1a\xbe\xed\xf7\xb5\x30\x4c\xad\x68\xc2\x5e\x35\x55\xb3\x70\xdc\x90\xcf\x94\xd8\x50\x91\x66\x3e\x0f\x84\xb0\xcf\xae\x8d\xa9\x1d\x29\x55\x1c\x92\xdb\x2f\x9a\xfd\xe0\x7a\x32\xc9\x22\x14\x36\x80\x16\x1b\xbf\x81\x43\x77\x34\xb0\x6f\x4c\x0c\x96\x80\xf3\x0f\xcb\xb1\x95\xae\xb9\xb0\x04\x00\xf7\x07\xb0\xa6\x9d\x2c\x95\x33\xb0\xfb\x16\x5d\x89\x54\x56\x05\x1b\x6a\x68\x44\x35\x51\x6c\x6d\x65\x55\x85\x05\x66\x1b\xf9\xda\x4f\x8a\x49\x3b\x51\x5c\x5f\x23\xf6\xce\x99\x61\x43\x76\x5a\x6f\xa0\xfd\xff\xd8\xbb\xba\xdf\xc6\x6d\x6c\xff\xbe\x7f\x05\xd1\x7d\xc8\x0c\x10\x27\xed\xde\xa2\x28\x06\x8b\x02\x99\x24\xd3\x1b\xec\x34\xf5\x8e\xd3\xce\xc3\xc5\xc5\x82\x96\x18\x9b\x1b\x59\x54\x45\xc9\x19\xdf\xbf\xfe\x82\x3c\xfc\x92\x2c\xf1\xc3\x76\x92\xc9\xd6\x7a\x99\x89\x2d\x1d\x93\x14\x79\x78\x78\x3e\x7e\xbf\x7b\x65\x24\xb3\x35\xcd\xb5\xa1\x0f\x2c\xdd\x6b\x5d\xd5\x5f\x61\xce\x0d\xf9\x9d\x77\x80\x38\xcb\xa8\x3c\x50\x3b\x6f\x0c\x8c\x71\x69\x6e\x98\x5a\xdc\x4e\xee\x7e\x9c\xc3\x1a\xa8\xaf\x3d\x80\xf2\x11\x03\x5d\xb2\x9c\x4c\xdb\x79\x41\xf9\x72\x96\xe8\x8d\xbc\x1d\x78\x14\xb2\x1f\xb6\x62\x8c\xe0\xa1\xf4\x9d\x09\xfa\xbe\x4b\xc4\x89\xc4\x6f\x5b\x13\x17\x0a\x57\x5a\xb7\x98\x1b\xd6\xe1\xcb\xd9\x70\x56\x98\x6a\xad\x5a\x1f\x4c\x56\x84\x14\x44\x61\x56\x88\x17\xe1\xb4\xfd\x77\xcb\x70\x28\x3e\xfd\xad\xac\xdc\xcf\xbd\x87\xf6\xa2\xe0\xfd\xda\x64\xad\x9c\xc1\x52\x53\x85\x67\x6a\xf6\x50\x31\xb1\xc2\x63\x41\x7b\x44\x42\x76\x00\x7b\xc3\xc4\x81\x41\xb0\x59\xe2\x12\x31\x2f\xf0\x1e\x3c\x2e\xe1\x84\xb4\x28\xa7\xde\x53\x56\x7e\xcb\x09\x3d\x3e\x95\x8e\xee\xde\x17\x75\xf7\x26\x06\x5c\x66\xea\x2c\x04\x8b\x51\x57\x8e\x77\x6b\x47\xb5\xaa\x0f\x1f\x59\x03\x31\x9b\xbd\x42\x20\xf0\xeb\x17\x0d\x10\x21\x7b\x11\xa2\x13\xd1\x87\xa3\x86\x7e\xa0\xa8\xd4\xb6\x45\x9a\x0e\x84\x2b\x3d\x32\x51\x07\xcc\xcc\x59\x0b\x41\x27\xa1\x59\x59\x8e\xc6\x52\xf2\xec\x26\x2c\xf7\x5f\xf8\x70\xb4\x9c\x5a\x36\x96\x65\xad\x21\xe9\x92\xef\xcf\x86\x2b\x43\xe4\x2a\xc1\x39\x16\xcc\xd1\x95\xed\xdb\xc5\xa6\xcb\xd9\x63\xf9\x88\xeb\xfc\x62\x3a\x52\x3a\xd0\x35\x79\xec\xdd\xae\x15\xa7\x85\x48\x72\x4e\x00\x48\x55\xa9\xb4\x3e\xc3\xae\xe7\x85\x3f\xfa\xdb\xbb\x43\x74\xf4\xb7\xbf\x02\x7f\xbb\xb8\xb7\xcb\xc2\xd6\x59\x0b\x1a\x55\xc2\xe7\x50\x4a\x73\x74\x3a\x2b\x10\x34\x62\x3f\x27\xde\x31\xc8\xfc\x9b\x1f\x53\xb3\xdb\xbe\x35\xc7\xc0\x53\xcb\x37\xc8\xd1\x12\xeb\x30\x95\x72\xbc\xd6\xeb\x40\x5f\x9d\x04\xde\x99\x64\x34\x83\xa8\x81\x13\x98\xa8\x58\x04\xed\x90\xdc\x5e\x71\x59\x32\xd0\xcd\xfc\x14\x28\xd3\xf8\x29\x9c\xd9\x24\xd8\x99\x30\x40\x2a\x9c\x11\xb9\xa2\x8c\xe2\x0e\xba\xe1\x52\xa8\xde\xac\x85\x12\x43\xdb\x34\x08\xb8\xa5\x7a\xcd\xb3\x25\x59\x61\xf9\xdf\x0f\x62\x34\x06\x81\x30\x86\x2e\xca\x91\x30\x0b\x1a\x02\x85\xcd\xa4\x5e\x71\xc4\xee\x4f\x3b\x35\x33\xdf\xac\xbf\xf3\x96\xab\xeb\x2b\x89\x53\xea\x5e\x37\x33\xb9\xeb\xd3\x8e\x53\x51\xbc\xfa\x86\x29\x7e\xbb\x70\x84\xc4\x5e\x36\xd6\x22\x97\x25\x8c\xe7\x81\xbb\x19\x4b\x84\x35\xb1\xc3\x11\xe5\x47\x8c\xe0\xb7\x3a\x06\x01\x8e\x41\x00\xff\xbd\x4f\x18\x04\x70\xd4\xb4\x5c\xad\x94\x23\x35\x00\x6e\x60\x20\xe0\xac\x82\xab\x17\x3d\x98\x13\x6d\x81\x9d\x59\x90\x36\x31\xd7\x74\x5c\x20\x02\x7e\xde\x89\x51\xa2\x93\x93\xb3\xb3\x93\x13\x1d\x4d\x50\x13\xb7\x6d\xee\x27\x3f\x22\x52\x66\x2c\x87\x49\x15\x6e\xe6\x3d\xad\x79\x23\x37\x6e\x7b\x3e\x76\xfb\xba\xd2\x6d\xb5\x21\x86\x70\x5c\x41\xb6\x2d\x8e\x4d\x37\x0a\x1f\x1d\x6a\xe7\x3f\xec\xb4\xf1\xda\xed\xd6\xd4\xe0\xab\x8e\x1a\x0c\x9e\x77\x72\x5f\x0d\x76\xcb\x52\xc3\x00\x23\xb8\x5c\x1e\x9a\x7c\x1a\xbd\x81\x0f\xcf\xb2\xaa\x3d\x55\x37\x9c\xad\xc8\x8a\xd5\x9b\xb0\x8a\xd0\x42\xc4\xc3\x1d\xa9\x4a\x02\xc0\x63\x29\xac\xf4\x62\xf3\x44\xbb\xba\x19\x8f\x10\xa9\x96\xbe\x7a\x99\xc2\xc6\x4f\x2e\xbd\x33\x96\xa8\xed\xde\x00\x7c\xf0\x38\x2e\x52\xed\xdb\x92\x4f\x92\x72\x8d\xd6\xb8\xf6\x32\xb9\xeb\x2b\x69\x23\xcf\xe9\x9a\xf2\x38\x2a\xd7\x11\x9f\x87\x03\xbd\x09\xfa\x4b\xcd\xac\xa8\x4e\x2a\x0c\x24\x3b\xab\x7a\xb6\xcb\x77\x51\x8c\x11\x29\x1d\xd6\xbf\x94\xfe\x6a\xad\x56\x34\x6b\xc8\x98\x2e\x07\x7e\x2f\xf1\x96\x47\x00\x9a\xaa\xfb\xdb\x41\xc3\x23\x2e\x80\xf9\x1c\x01\xca\x80\x10\xe9\xe2\xbd\xa2\x51\xc9\xfb\xd7\xea\xde\x6e\x06\x61\x43\x56\x15\xab\x71\xbd\x41\xb9\x3a\x8f\x6f\xb4\x17\x03\xd7\xe3\xe0\xef\xb2\xf0\xd1\xa9\x7c\xdc\x1b\x95\x44\xf6\x24\xa7\xf5\xae\xf9\xfb\x2b\x92\xd3\x76\x15\xeb\x1d\xf9\xec\x92\x25\x6a\x50\x00\x10\x61\x20\x0f\x71\xf6\xe0\x43\xbd\x96\x42\xf5\x90\x01\xc5\xa6\x53\x9a\xf4\xcd\x37\x3d\xf8\x6a\x69\x81\xca\x78\x1a\xcb\xc9\x89\xdf\xe3\xa6\xc4\x40\x7b\x1c\xc7\x4b\xa9\x5c\xfa\x2a\x1b\xe8\x8d\xba\xf1\x2d\x62\x35\xfa\x45\xee\x0d\x89\x19\xb4\x87\x7b\x41\x28\xb2\x9e\x8c\xfe\x1f\xf9\x28\xb6\xc3\x68\xd4\x2a\xd6\xe0\x02\x61\x55\x9c\x7b\x8f\x0a\x96\xe1\xc2\xbc\xb1\xce\xae\x12\x78\x57\x66\xfa\xeb\x68\xa4\x78\x63\xa2\x3d\xb0\x3f\x4b\x67\x47\xc1\x21\xba\x45\x33\x89\x4e\x29\xa4\xc2\x9e\xeb\x91\xab\xdf\xd2\x9d\x04\xf6\xfa\x42\x57\xed\x0a\xb5\x92\x86\x49\x22\xfb\x8b\xa7\xf5\xcc\x32\x4d\x78\xf4\x20\xf8\x22\x08\x7a\xcb\x62\x54\x5a\x4a\x71\xdd\x03\x88\xf8\x66\xa6\xc7\xd1\x39\x00\x06\xaa\xe9\xb5\xf9\xce\x5b\x69\xdc\xa9\x96\x29\xe3\x85\xdd\xcb\x28\x8d\xd9\xf4\xb9\x81\x32\xf4\xcd\xa8\xde\x9c\x2f\x69\xd1\x9d\xf4\x1a\x99\xce\x0c\x70\x5b\xaa\x58\x7e\xc2\x3c\x1d\x9e\xa6\x2d\x27\xf5\x64\xd1\xd2\xfc\xa0\x13\x34\xa0\x6d\xef\xb3\x08\x3d\xfb\xe1\xb2\xab\x60\x3f\xd0\x79\x4d\xd0\xe5\x12\x97\x25\x29\x9c\x2d\xb3\x07\x96\x38\xe6\x50\x76\x21\x14\x03\x08\x8a\x07\x40\x7a\x78\x1d\x55\x50\x2f\x09\x6d\xf3\x4a\xe0\x01\x8b\x36\x1a\x18\xd0\x7a\x4c\x3e\x5c\xa2\x06\xd7\x0b\xd2\x88\xc7\x51\xd9\xae\xe6\xc4\xb3\x9a\x5e\x0e\xca\xee\xe5\x0b\xbb\xf6\xab\xc0\x82\x41\xfe\xfc\xf9\x36\x1a\xf1\x61\xe8\x1d\x3d\xb2\xba\xc8\x1f\x69\x0e\x29\x3a\x1c\xbd\x11\x02\xdf\xbe\x3c\x08\xc3\xe3\x23\x1d\x23\x35\x09\x74\x4c\x39\xc6\x64\xc7\x90\xec\x99\x2a\x17\xa2\x62\x47\x7a\x23\x05\x8f\xf1\x70\x88\xeb\x9a\x02\x0a\xbc\xb8\x4f\xd8\x44\x2e\xc7\x8e\x38\x8c\x99\x61\x97\xaa\x53\xcc\x71\xe5\xe4\xf3\xc8\x94\x38\xf1\xf3\x56\xb9\x68\x58\xb3\x44\x9c\xae\xda\xa2\xc1\x25\x61\x2d\x2f\x36\x9e\xa9\xf0\x3c\x03\x1e\xda\xb3\x0a\xf2\x05\xa6\x6e\xcc\xde\x65\x6e\xee\xee\x61\x12\x58\x99\x66\xfa\x05\x75\x36\xb1\xb1\x68\x13\x87\x5c\x26\x2e\xa9\x39\xcf\x4d\x5d\x30\xa0\x79\xcb\x6c\x37\x92\xa1\x39\x16\xfb\x56\x55\xb4\x0b\x3a\xe2\xb5\x7e\xb6\xdc\x36\x9b\xb7\x23\x2c\xf5\x08\x83\x32\x94\xc2\xf0\x27\x06\x92\xbb\x1b\xcc\x2a\x43\x39\xa9\x48\x99\x4b\xa8\x70\x3b\xd3\x7c\x6b\x4f\x76\x7e\xaf\x11\x56\x5e\xf0\x97\x4c\xf0\x70\x74\xdc\xf5\x97\xa6\xc6\x42\x2d\xad\x84\x02\xd2\x1e\x7a\x7a\x8f\x70\xe9\x53\x24\x87\x4f\xd5\x79\xf5\x5b\xe8\x93\x01\x93\x3c\x55\xd2\x20\xe8\xb8\xe0\x64\xd7\xa9\x7d\xa3\x29\x7c\xfa\xf7\xdd\x3a\x2b\x2f\x0a\x77\x7c\x2a\x9f\x9b\xb0\xe7\xdd\x11\xc5\x5d\x7c\x20\xcd\x08\xfa\x68\x7a\x72\x2c\xe3\xfe\x2a\xf3\xfa\x9e\x2e\xe7\xea\xbe\x60\xd9\x43\x14\x92\xc8\x07\xb8\xb3\x77\x52\x56\x1f\xf6\xa1\x44\xc4\x19\x78\xa4\xbb\xc3\x27\x63\xb5\x86\x9c\xed\x46\xa6\x14\x28\xf1\x62\xf2\xd7\x6c\x6c\x86\x73\x05\xb6\xa8\xb8\xed\xdb\x72\x14\xd3\x20\xc2\x32\xc1\x0d\xe6\x49\xa0\x82\x7d\x44\x5d\x4e\x1a\xc8\x07\x94\x00\x65\x2b\xd2\x60\x09\x27\x3a\xf9\x29\x14\x76\x54\x7d\xd6\x32\x84\x39\xa3\xfb\x6f\x29\x5d\x32\x56\x72\x9a\x13\x25\x3d\x17\xef\x22\xf3\xd0\x30\xc5\xc1\xf5\xc2\x2f\xfe\xf6\x5b\x34\x4a\x80\xb8\xb5\xd7\x67\xf5\x02\xa5\xc7\x48\x62\x69\xdb\x73\x80\xaf\xcf\xf7\xce\x24\x52\x92\x9e\xcc\x17\xb4\xc8\x88\x65\x27\x8e\x84\xa8\x3e\xf9\xf9\xf2\xba\xfb\x50\x77\x01\xfc\x7c\x79\xfd\x1f\x41\xb4\xb1\xc8\x88\x85\x3c\xcf\x29\x7f\x38\xb2\x6c\xfc\x09\x58\x36\xb6\xde\xfa\x6b\xf7\xa1\x1d\x29\x36\xbe\x62\x8a\x8d\x67\xd2\x51\xe8\xa0\x8e\xce\x2a\x4f\xb0\x05\x34\x8f\x84\xeb\xa4\x98\x5e\xb9\xe4\x11\x62\xc3\x38\x93\xf0\xa5\x7e\x7d\xd6\x01\xdd\xd1\x80\xf8\xf2\xd9\xe7\x1b\xc4\x27\xc0\xf7\xea\xe0\x48\x87\xce\x9f\x9e\x11\xda\x42\xed\xda\x26\x28\x7c\xf6\x81\xda\x07\xd8\x1c\x66\xd9\x4e\x46\x0d\x6d\x3e\x91\x6a\x64\x67\xe8\x99\x32\x70\x6b\xcf\x4f\x48\x1b\xf1\x01\xe3\x54\xe6\x11\x00\xdd\xb6\xe1\xcd\x1e\x7d\xed\xe0\x25\x3c\x43\x57\xd7\xd3\x4f\xd7\x97\x17\x77\xd7\x57\xef\x90\x96\x4f\x5d\xc3\xf4\x0c\xdd\x31\xeb\x56\x1c\x3d\x15\x58\x3e\x35\x99\x0f\x69\xdb\x75\xaa\xd4\x26\x2e\x6d\x2c\x56\x82\xa2\xe0\x12\xdd\x94\xb4\x31\x59\x4b\x3e\xc3\x2b\x2b\x58\xa9\xf2\x7d\x84\x4c\xe5\xd1\x5c\xd0\xe6\x14\xcc\x2c\x85\xba\xbe\x24\xdd\xdf\x18\x15\x49\xd0\x14\x72\x29\x2c\xd7\xec\xae\xf6\x92\xc9\x47\x88\x65\xcb\x80\x48\x82\xcd\xfc\x90\xbb\xc8\x36\x6f\xac\xc6\x37\xf1\x2c\x22\x8b\x7c\x22\x7d\x0e\x27\x67\x27\xda\x34\x2a\x0c\x6e\x8d\x4e\x7c\x35\x3f\x37\x48\x3a\x6c\x2f\x15\x06\xef\xce\xaa\x33\x84\x7e\xd5\xc4\xa3\xa7\xc2\xba\xe9\x81\xe3\x78\x0a\x6d\x74\x4b\x6d\xa4\x7b\x40\xbe\xde\xb7\x79\x3b\x77\x1b\xea\x4f\xf5\x91\x52\xd6\xa4\x0c\x6c\xc3\x51\x4a\x50\x37\x24\xf2\x1d\x7e\xb2\x2d\xff\xed\xd3\xc7\xfd\x7e\x1a\xd6\x55\xe4\x0f\x5f\xb2\xd5\x8a\x36\x68\x89\xf9\xd2\x94\xf5\xd9\x6c\x04\xb3\xaa\x77\x6f\x51\x48\xcf\xd9\xa1\xda\x49\xd7\x41\xc1\x78\x14\x6e\xfc\xc9\xcf\xfa\xe6\xde\x81\xcd\x7c\xbc\x85\x1e\xef\xd3\x20\x1d\xf4\xf8\x50\x12\xd5\x18\xd4\xac\x69\xff\xfe\xd8\xa7\xa4\xcc\x01\xd9\x31\x9a\x90\x45\x3f\x70\xeb\xe0\x5b\x69\x29\x60\xb0\xc8\x8e\xe6\xa4\xc1\xb4\xf0\x19\x7c\x76\x04\x1b\x56\xb1\x82\x2d\xd2\xf0\x9c\x07\x06\xe1\xaf\x90\x59\x3d\xc1\x13\x31\xba\xfb\xd9\xff\xf1\x68\xf2\x3a\x41\x5c\x0c\x84\xed\x93\xb1\x84\x65\x5e\x76\xca\xc1\xeb\x45\x3a\x7c\x50\x03\xac\x3f\x0a\x7e\x13\xd5\x12\x0c\xc3\x4e\x62\xeb\x87\x2b\x52\xaf\x28\x17\xaa\x64\xd0\x32\xf3\x88\x7d\xc6\x79\xb4\x8f\xb9\x66\x56\xdf\x98\x39\x37\x96\x66\x1a\x50\x70\x42\x0b\x45\x12\x64\x4b\xa2\x31\x39\x85\x3b\xea\xad\xaa\xc9\x84\x7c\xa1\x5c\xfa\x2a\x64\xed\x02\xab\xed\xee\x3d\x16\x71\x73\x18\x34\xb4\x0b\x4a\x3b\xac\xe0\x59\xc9\x9f\xdc\xc9\x58\xf2\xb0\xec\xc3\xa5\xdd\x81\xc0\xf0\x5b\x14\x1b\x00\x14\x95\xd5\xc8\xe0\x20\xc0\x0b\xd9\x68\x56\x2b\x77\x7b\x55\xd3\x35\x2d\xc8\x38\xcd\x52\xb3\xa4\xe5\xc2\x21\x0f\x96\x54\xc7\x44\x95\x61\x91\xad\x3e\x88\xf5\xcb\x1b\x27\x43\x6e\x44\xac\x5c\x05\xb7\xbf\xde\xa1\x92\x08\x61\x4b\xca\xf7\x3e\x3c\x88\x66\x78\x72\x8d\x27\x93\x89\xf4\xa7\xbc\xf9\xb7\xb0\x4b\xf3\xe2\x2d\xfa\x4c\xd4\xaf\x0b\xf3\x5c\xac\xf8\xac\x41\x8f\x4b\x26\x4f\xd4\x2d\x57\xfd\x0a\xbd\x47\x4d\xd0\x5f\xe6\xfa\xd9\x73\xf1\xbc\x30\x0b\x61\xb3\xeb\x48\x91\x55\xff\x1c\xd9\xc8\xe1\xce\x36\x6c\xb2\xd6\xd5\xae\x63\x63\xac\x39\x33\xd0\x40\x59\x04\x72\xb5\x65\xa5\x2b\xdf\xac\x0a\x5a\x3e\x9c\x22\xda\x68\x65\x26\xe6\x84\x4a\x61\x2c\x1f\xf4\x6c\xad\x09\x2e\x40\xa7\xa7\x29\x9f\x5d\xde\xf9\x5e\xfa\xbc\x49\x70\x9e\xde\x6d\x2a\xc8\x7a\x30\xaa\x40\x25\x82\xf4\x58\xd4\x93\x10\xad\x9f\xb9\xc7\xc1\x83\xf1\x8e\x9a\x94\xf2\x38\x84\xa8\x93\x9b\xd9\xe5\xec\xa6\x47\xe4\x05\x9f\x75\xdc\xfa\x5a\x1f\x8e\xf4\x74\x37\xb7\xbe\x1f\x16\x68\xcc\xad\x3f\xb6\x21\xca\x2e\xef\x6f\x59\x66\x4b\x5c\x5d\xb4\xcd\xf2\x8a\xf2\x8c\xad\x49\xf4\xa1\x46\xc3\x86\x29\xd7\x3a\xa2\x7a\x10\x41\x0a\xba\xfc\xef\x8b\x69\x2c\x87\x48\x4c\x3a\x81\x6e\xe7\x8c\xf0\x84\x13\xd0\x70\x2b\x95\x8c\x83\xb7\xf1\x18\x0c\x79\x45\xc1\x10\xb9\x7e\x5e\x7b\x00\x84\x96\xb4\xa1\xb8\x61\x81\x1a\xc0\xae\x57\xa0\xe5\x0d\x5b\xa9\xa5\x70\xa3\x05\xc8\xc0\xb6\xdc\x8c\x3b\x32\xfd\x3b\xb2\x83\x23\x4c\xe5\xe9\x2a\xe3\xd4\xa0\xed\xf5\xd2\x30\x4f\x51\x49\x1e\xe1\x57\xbd\xbb\x93\x7e\xfa\xef\x2a\x89\x56\xcc\x55\x5c\xfc\xf4\xee\xef\x4e\x18\xe5\x27\x53\x8e\xad\x8a\x74\x3d\x12\x2d\x74\x9d\xe4\x31\xd8\xcf\xe1\x81\x10\xfd\x23\x56\xf7\x28\xd7\x1d\x8c\xf3\x3f\x5b\x5c\xc0\x48\xdd\xee\xeb\x7f\xea\x8e\x72\x64\x63\xf4\xdb\xd6\xa3\x7b\x6b\x3c\x00\x2d\x27\x72\x17\x84\x3b\x9a\x1a\x97\x5c\x0c\x79\x2c\xf0\xd3\x89\x0a\x7a\x9d\xa0\x37\x4d\x56\x05\x51\x9f\x0e\x94\x12\x0f\x8d\x55\x23\xfc\xd1\xa4\xc2\x8f\xff\xfa\x01\x23\x44\x72\x3e\xc6\x3a\x62\x3a\x0d\x9d\xca\x47\xd1\x47\xca\x1b\xc8\xc0\x04\x59\x92\x28\x4b\x26\x46\xfb\x22\x79\x25\xba\x99\x4a\x58\xce\xea\x5f\x38\xcf\xeb\x77\xb0\x9f\x69\x30\x92\x5a\x9e\xde\x98\x21\xc3\x8b\x60\x4f\x7a\xd3\x6c\x2a\x9a\xc9\xa3\xda\xdd\xe5\x54\xca\xe0\xe8\xc7\x1f\x00\x3d\xe1\xbf\xfe\xf6\xc3\xb7\x9e\x97\xf9\x5c\x99\xea\x89\xfe\x8e\x67\x8c\x37\xed\x65\x28\xa4\xe6\x46\x4a\x43\x65\x66\x79\xd6\xd4\x5a\x85\x59\x25\x5e\x97\xd1\xd9\xb1\xe6\xcc\x31\xbf\xef\x45\x71\xfb\xe0\xd5\x81\x3e\xd8\x5d\x93\x80\x12\x99\xf6\x94\x08\xf2\x52\x61\xee\xa2\x44\x1c\x55\xe1\x33\x98\x52\x95\xc8\xde\xa7\x45\xfa\xc7\x70\x4f\x27\x62\x27\x19\xf9\xc6\x1d\xf9\x5d\x4e\x9a\xe3\x4b\xa2\xbb\x14\x40\x7f\x88\x33\xa1\x13\xb1\x93\x15\x00\x57\xb7\xb3\x7f\x7d\xbc\x78\x7f\xfd\x51\x71\x3a\xc8\x14\x02\x80\x57\xf3\x44\x20\x77\xc9\xfa\x8a\x5f\x49\xc3\xb3\x3e\xf0\x82\xca\xb8\xc8\xcc\x6d\x8f\xcf\xb7\x44\xb7\xa3\x64\xbe\x89\x35\xed\xfb\xfa\x70\xca\xfb\x91\x9e\x3f\x81\x13\x4c\x7b\x58\xc9\x97\x6e\x55\x87\x18\x0c\x4e\x6a\x89\xfc\xf8\x64\xae\x9b\xd1\x8e\xa2\x17\x88\x3b\x88\x1e\xc3\x28\xc0\xd1\xcf\xd3\xe3\xdd\x22\x0e\x2f\x3a\x8e\xa1\x9d\xbf\x8e\x2f\x85\x3a\x99\xc9\xbb\x75\xd4\x4a\xac\x12\x48\x35\xaa\x85\x1a\x17\x0a\x9c\x70\x1e\x06\x31\xe9\xcf\xb0\x17\x9b\x47\x3b\x7b\xff\x26\xaa\xfd\xbb\x28\x6c\x9b\xd5\x03\x2a\xf9\xb2\xc0\x74\x04\x85\xa2\xb7\x6a\x87\x1e\x84\xff\xce\xc0\x49\xd8\x09\xc5\x98\x3a\x95\x31\x25\xce\x10\x46\x83\x32\x4d\x3e\x03\x56\xc7\x5b\x89\x07\x18\xe1\xfa\x48\x79\x83\x76\x18\x26\xfa\x65\xda\x8f\xe0\x93\x4c\x34\x66\x67\x85\x28\x9f\x4e\x49\x9e\xbb\xd4\x0f\xf4\x6b\xfd\x46\x86\xc9\x6f\xaf\x6f\x0f\xa0\x26\x0c\xaf\x98\xae\x69\xec\x40\xdd\x1f\x5c\x47\xec\x39\xc2\xe8\x49\x34\xf1\xe7\xc4\x9a\xaf\xf0\xa9\x7f\xff\xf3\x4f\x48\x0d\x98\x99\xb4\xd3\x72\x5f\xb2\x86\x95\xc9\x89\xff\xd3\x81\xc7\xba\xeb\x1b\xee\xb8\x84\xd2\x94\x62\xdc\x3d\x60\x44\x40\x1e\xe7\x10\xdd\xee\x28\xb1\xee\x8e\x4b\xef\x3f\xb5\x48\xf5\x60\x90\x10\x31\xa9\x24\x79\x74\x39\xcc\xcd\x95\x32\xe6\x74\xc9\x0b\x57\x93\x03\xd9\xd9\xe1\xcc\x03\x4f\x7f\xbd\x39\xf8\xfb\x6f\xa7\xf9\x6e\xac\x97\xe2\x85\x3e\xb2\x3a\xbe\x28\x7d\xda\x79\xa0\x97\xa1\xa0\xbe\xeb\xd7\x8c\x8d\x99\xf8\x5f\xcb\x2a\x99\xc9\x70\xab\xd3\x95\xa1\x68\x8a\x5e\x3b\x9e\x57\x3c\xb4\xa8\xa2\x96\x8e\x47\xe6\xc0\xa2\x82\xa5\x13\x5e\x32\xbe\x1d\xef\x70\x8b\x29\x71\x93\x8a\x2d\x70\x0e\x01\x28\xa5\x16\x38\xef\x65\xc9\x27\x32\xed\xfe\xae\x6e\x57\x07\x7e\xf1\x7e\xac\xfa\xc0\x66\x09\x85\x52\xb1\x5e\x94\x0e\xd7\x30\x58\x46\xe8\x04\xc0\x27\xbf\x67\xb5\x84\xad\xa2\x50\xbe\x6c\x21\x39\x55\x89\xf2\xa9\x22\x9f\x58\xe1\x6a\x14\x6c\x52\xa8\x04\x17\xda\x7c\xc7\xe5\x9f\x8e\xd0\xff\x4b\x08\x96\xdf\x05\xdf\x8f\x52\x01\x1e\x58\xfe\x41\xa8\x7d\x8f\xd0\x31\x10\xfe\x00\xd4\xbe\x47\x62\x2a\x44\xb1\x03\x41\xec\x91\x1a\x0d\x4e\x6c\xc1\x87\x9f\x21\x88\xa3\xa6\x61\xe4\x44\xd0\x00\xfb\x3a\x59\x14\x96\x81\x97\x9d\x20\x0d\x5a\x7f\x6a\x24\xc2\x48\x2b\x6c\x01\xcb\x6f\x8b\x0b\x56\x2e\xc2\x68\xbe\xcc\x4d\x76\x20\xb9\xc9\x25\xd8\x54\x5e\x67\x79\x2c\xea\x6c\x80\x0e\x7b\xa4\x73\x2e\xe4\x82\x65\xe8\xb0\xbc\xd8\xb2\x5e\xda\x5b\x6e\x67\x5a\x19\x44\x23\x4f\x43\xd0\x0d\xbe\xa4\xc1\xfe\x44\x30\x1d\x47\x88\x44\x2e\x1b\x72\x98\xf3\x38\x4a\xe2\x30\x2f\xb2\x9b\x55\xd2\x63\x3f\x8e\x92\xea\x67\x48\x06\xe9\x03\x3c\xc8\x51\xb2\x9b\x10\x57\xf2\x00\x23\x72\x94\xe0\x18\xd6\x64\xc3\x8d\x1c\x25\x31\x89\x3f\x39\xba\xf3\x49\x4c\xca\x71\xd3\xca\x61\x5b\x0e\x72\x2a\x47\x49\x1c\xe1\x5d\x1e\x63\x57\x8e\x92\x19\xc3\x65\x8a\x52\x96\x68\x32\x2b\x73\x94\x4c\x14\xc5\xdd\x6c\xaf\x14\xed\x03\x57\x04\x9f\xb3\xbd\xf6\x64\x76\xb6\x57\x12\x10\x35\x5c\x31\x44\x0f\x23\x2d\xf5\x53\x3e\x44\xcb\x44\x0e\x39\x84\x9f\xfc\x21\x41\xe4\x08\x4d\xc4\x08\x0d\x44\x82\x60\x0f\x61\x84\x4b\x08\x91\x24\xf1\x30\xd4\x11\xf6\x8a\x26\x91\x48\x90\x99\x46\x9e\xd4\xbf\x52\x88\x25\xec\x15\x4f\x31\x61\xaf\x18\xb2\x09\x7b\xc5\x73\x4f\xa7\x4c\x67\xc3\x52\x1d\x60\xa1\x4e\x90\x39\xc8\x57\x6d\x69\xbb\x3a\x7c\xd4\x09\x62\xbd\xcc\xd5\x89\xd2\x92\x95\x4f\x2c\xc8\x3c\x5c\x21\xde\x6a\xf7\xce\x40\xd1\x81\xbd\xa2\xf9\x70\xdc\xdb\x7d\x99\x4d\xf6\x0a\x27\xd9\xc0\xf5\x35\xa7\xda\xc0\x95\x9a\x70\x13\x25\x34\x9c\x94\x03\x57\xd2\xac\x0a\x73\x65\xdb\x2b\x99\x35\x3b\xaa\x5b\x86\x59\x3b\x86\x3f\xbb\xdf\x4b\xbf\x67\xaa\x7b\x6f\xc4\x9c\x0d\x32\x31\x3a\xb7\x86\x4f\x76\x8e\x34\x79\xb6\x0b\xf6\xca\x1a\x30\x2f\x7f\xb6\xdb\x66\xd5\xdb\xa2\xbd\x8b\x7a\xbd\x91\x3b\xc1\xae\xe6\x6d\x88\x8b\x2f\x52\x17\xf7\xd0\x10\xfd\xac\x7c\xb1\xfb\x6a\x04\x77\x9f\x73\x77\xb2\xc1\x1c\xcb\xe7\x67\xaf\x78\x66\xbf\x24\x53\x14\x38\x00\x03\x1c\x7f\x09\x12\xf7\x61\x03\xb4\x57\xfa\x80\xa2\x64\x86\x40\x7b\xc5\x71\x05\x26\x89\x44\x96\x59\x30\xc8\x1a\x98\x28\x38\x81\x63\xd0\x79\x28\xfd\xa8\x84\x52\x79\x07\xed\x15\xcb\x40\x98\xd8\x73\x9d\x20\xb1\x2b\x17\xa1\xbd\x76\x1a\x8e\x34\x03\x0e\x25\x31\x15\xf6\x9b\x16\x6d\xa3\xa1\xe3\xa1\xf6\x78\xa8\x8d\xbc\xfe\x04\x87\xda\x10\x97\x62\xe2\x19\xb4\x03\x8a\x36\xc6\xaa\x98\x20\x73\x9b\x7f\x71\x94\x5f\x31\xe5\x58\x3b\xca\xc4\xd8\x65\x5a\x4c\x34\x0c\x82\x9c\x8c\x91\x9c\x8b\x8e\xd4\x74\xb5\x9b\xca\xc3\x68\xaf\x74\x46\xc6\x94\xa5\x24\xec\xa5\x78\x6e\xc6\x04\xc9\x5d\x16\xc7\x30\x4b\x63\x8a\x7d\xb4\x23\x9f\xa3\xbd\x76\xb3\xcb\x92\x39\x1e\xed\x15\xc7\xf6\x98\x68\x47\xb8\xdc\x90\xbb\xf3\x3e\xda\x6b\x47\xe3\x2a\x81\x0b\xd2\x79\x28\x92\x15\x32\x71\x48\xd4\x5a\xf0\xf3\x43\x26\xca\x8c\x63\x93\xb4\xd7\x8e\xc3\x98\xc2\x30\x69\xaf\xc3\x72\x4d\xee\xd9\x89\x5d\x2c\xcb\x48\x26\xca\x7e\xcb\x12\x0c\xcb\x54\x87\xe5\xcb\xbb\x21\xa3\x05\x43\xe2\xce\x01\xdc\x44\x8a\xef\x40\x45\xff\xbf\x1e\x0f\xd0\x33\x46\xf7\x55\x45\x67\x00\x63\xd1\x5e\x29\xa1\xfd\x78\xef\xc3\x31\xb4\xff\x34\xa1\xfd\x99\xe2\xea\x38\xc6\xf5\x07\x7b\x73\x8c\xeb\xdb\xeb\x18\xd7\x3f\xba\x40\x8e\x2e\x90\xed\xeb\x18\xd7\xef\x74\xeb\x18\xd7\x3f\xc6\xf5\x8f\x71\x7d\xdf\x75\xd0\xb8\xbe\x32\xcf\x21\xa8\x1f\x3d\xf9\xbe\x92\x98\xbe\x62\xc9\xba\xc8\x32\xd6\x96\xcd\x1d\x7b\x20\xc1\xd0\x5e\xd4\xa1\x6d\x4b\x6a\xb0\x83\x4f\x77\xc2\xc3\x6d\x4e\xc5\x49\x2a\xf9\x6d\x5f\xa8\x07\xf5\x21\x47\xec\x30\x65\x4e\x72\x23\x31\xd6\xe5\x2b\x1e\x6e\xc4\x28\x9c\xa1\x0b\x54\x93\x8c\x56\x94\x00\x0d\x3e\x86\xcf\x61\x3a\x68\x7a\x8f\x48\x43\x9f\x93\xe2\x5e\x11\x23\x94\x0e\xb1\x96\x73\x36\x51\xaa\x5f\x37\x37\x4a\xae\x52\x2a\xb2\x59\x60\x0e\x30\x8d\xd2\xaf\x19\xc7\x6a\xf2\x6f\x65\x71\xc4\xf5\x1e\x7a\x7e\xe7\xb4\xc4\x75\x7a\xc1\xd0\xc6\xf0\x82\x6d\x35\x12\x57\x54\x21\x16\x1c\x5a\x43\x90\x2f\x15\xad\xe5\xb4\x9e\x91\x8c\x95\x3e\x1e\x64\x7b\x75\x26\xcf\x75\x5f\x82\x9e\x45\xca\xbf\x1c\x79\x8c\xcd\xdb\xda\xf0\x1e\xaf\x71\x41\x73\xda\x6c\x4c\xe8\x5c\x51\xdc\x61\x58\x67\x6a\xa0\xa3\xc4\x5e\x70\xfb\x96\x11\xae\xaa\x9a\xe1\x6c\x49\xb8\xd3\x6f\xb0\x81\x55\x65\x65\x94\x4c\x5d\xf7\x02\xe4\x91\xd2\x00\x96\x72\x85\x9d\x54\x6c\x50\xcd\x1a\x9d\x36\xa2\x1a\x1e\x77\xfc\xec\x74\x0e\x8e\x3d\xd0\x28\xf8\x09\x30\x49\x9a\x7a\x23\xf3\x4f\xe2\x5c\xa8\x4e\x53\x60\x04\xe8\xbd\xfb\x07\x47\xac\xc8\x35\xb8\xd1\x8f\xdf\xc6\x1d\xfd\x48\x9d\xa9\x35\x2d\x8f\x37\x74\x25\x3d\x9c\x85\xb0\x11\xc5\xd6\xd0\xfd\x81\xb8\x49\x6e\x1b\xf1\xb7\xef\xd1\x92\xb5\x35\x3f\x73\x6b\x20\xbf\x93\x9f\xc1\xf9\x3c\x36\x4a\x26\x0c\xcb\x06\x15\x04\xf3\x06\x7d\xf7\x2d\x5a\xd1\xb2\x15\xa6\x41\xc4\xb3\x8e\x69\xfe\xc3\xf7\xd1\xcb\x2d\xd6\x28\x8f\x35\xc7\xb7\x13\x1f\xd4\xaa\xaa\x00\xf4\x5c\x59\xe5\x4a\xab\x84\xaa\x6e\x9d\xdf\x97\x84\x07\xbd\x38\xa4\xda\x8a\xdc\x37\x57\x36\xec\xc0\xba\x26\xd6\xba\x8d\xb2\x56\x23\xf7\xfd\xa8\xdb\x42\x46\x6c\xa8\x84\x54\x05\x38\x06\xbf\x0d\x34\xe0\x8f\x96\xcd\x37\x4d\x4c\x4d\xf9\x3f\xe1\xce\x6e\x31\xb9\xfe\x70\x18\x3c\x6a\xa4\xc3\x1d\x2e\x0f\x8b\x1d\x35\x78\x77\xd8\xfa\x58\x88\xd3\x74\x64\xdd\xa0\x3c\x79\xeb\xd3\xa0\x76\xd3\x66\x19\x01\xce\xe1\x2b\xcb\x16\x57\x32\x90\x1b\x78\x65\x87\xac\xb9\xf6\x22\x34\xe9\x71\xd6\xf5\x83\x3e\xe5\x7b\x78\x5e\x88\x18\x7b\xb8\x26\x0b\xca\x9b\x04\x0a\x1e\xb8\xbd\x3b\x9d\x38\x2d\x17\x40\x99\xb0\x6a\x8b\x86\x56\x85\xe9\xb9\xa7\xbf\x46\x94\xda\xeb\x5c\x97\x31\x76\x7c\x93\x18\x40\x0b\x00\x62\x2f\x10\x36\x78\x63\x7e\x9f\x94\x0d\x20\xf5\xd7\x62\x33\xad\x70\x8d\xcd\xc0\x4a\x52\x72\xfe\x56\xf9\xa5\x71\xe6\x4d\x7f\x53\xd8\x37\x62\xe7\xaa\x71\x61\x86\xcb\x0d\xe0\xee\x33\xd9\x1a\x52\xe2\xd2\x13\x05\xea\xba\x55\xe4\xcd\x88\x3d\xea\x4c\x52\xc5\xc4\xd4\x9b\x65\xc1\x92\xe7\xf7\x38\x7b\x20\x65\x2e\xe9\xf4\x60\x48\xf2\x4d\x89\x57\x0a\xc3\xd4\x90\x8e\x91\xbc\x27\x79\xb4\xb2\x5c\x5c\xe0\x65\x84\x92\x69\x0d\xc4\x10\x60\x02\x8f\x18\x9f\x96\x47\x83\x7c\xfd\xc6\x85\x2d\xe0\xd7\x11\x1c\x62\xaa\x35\x5d\x67\x44\x99\x4d\x9e\x2e\x89\x1f\xdf\xa7\xf1\x6b\x0f\xee\xc7\x56\xf3\x15\xe6\x07\x75\x66\xbe\x74\x5e\x9a\x30\x97\x44\xfc\xc3\x85\x50\x0b\xbe\xf3\x8f\x2e\xac\xef\x4d\x8a\xf9\x66\x5f\xc2\xae\x30\x47\x15\x2c\x8d\x91\xaf\x3d\x78\x0c\x81\xbd\xae\x9e\xc7\xe0\x24\x9c\x7c\x7a\x7f\xd5\xd5\x4a\x9f\x70\xce\x38\x7a\x5f\xb0\xec\x01\x5d\x11\x79\x0e\x70\xf7\xbb\x91\x91\xe8\x43\x28\xee\xc9\x5d\x55\xcf\xf3\xfd\xb9\x05\x8e\x78\xf8\xaf\x08\x0f\xbf\x9e\xfb\x06\xe0\x75\xa0\xe1\xaf\xf0\x22\x9e\x4e\x45\x9c\xd8\xe5\x52\x93\x8f\x69\x98\xd6\x1d\x97\xc8\x5f\x97\xec\x71\xd2\xb0\x49\xcb\xc9\x84\x7a\x12\x5f\x22\x7a\xf1\x40\x36\xe2\xdb\xd8\x7e\xfc\x03\x6e\xef\x1c\x97\x1a\x26\x03\x0f\xf2\x73\xb1\xe3\x7f\x7a\x7f\x25\xb6\x99\x18\x74\x37\xca\xd1\x39\x69\xb2\xf3\x8c\x54\xcb\x73\xd5\x94\xaf\x62\x58\x56\xac\xa4\x0d\xab\xa3\x19\xf0\x2e\x50\xc6\x8a\x42\xa1\x6a\xb0\x7b\x74\x49\xaa\xa5\x11\xf2\xf4\x3d\x7a\x2e\x84\xf4\x8a\xb1\x58\x04\x69\x67\xca\x8b\xa7\xd4\x8c\x77\x5e\x7c\x3d\x4f\x55\x30\xcf\x3d\x09\x5e\x19\x01\xf1\x13\x0c\xcf\x61\x81\xe5\x4f\x66\xfa\x01\x79\x0c\x75\x62\x4f\x5d\x1c\x79\x25\xd8\x33\x42\xae\x9a\x41\x37\xf7\x60\x8e\xe7\x24\x47\x6c\x4d\xea\x9a\xe6\x84\x23\xa3\x4d\xdc\x93\x2f\x2d\x0e\x44\x10\xb8\xd3\x98\x1e\x61\xf0\x5f\x14\x06\x3f\xe1\x98\xe4\x28\x2f\xf1\xd4\xb6\xf2\xc2\xf9\x8a\x96\x89\xb0\xae\xcf\xab\xbe\x82\x70\xf6\xc2\x0e\x19\xf9\x4e\x6f\x5c\xbb\x1c\x44\x78\x86\x0b\x72\xf3\x6b\xc4\x61\x64\x06\x77\x76\xcf\x23\xfa\x43\x07\xd9\x74\x27\x2c\xc7\x7f\x98\xc9\x8e\x4a\x96\x8f\xf9\xa6\xff\xbc\x68\xa7\xce\x5c\x06\x30\xc7\x7d\x36\xca\x05\x6e\xc8\x23\x8e\x66\x19\xd7\x5d\xe9\x62\x8a\x9b\x57\x7f\x31\xbd\x41\x3f\x83\xc4\xfd\x40\x56\x6b\xd6\x80\x45\x76\xc5\x56\x98\x46\x33\x29\x39\xe0\xd0\x6e\xb3\xa6\x46\x1c\x02\x79\x62\x17\x0a\x9c\x33\x00\x77\xac\x15\xe7\x2c\x75\x02\x3a\x22\x5d\x1e\xd8\xa8\xb0\x36\x85\xe3\x04\xd2\xa9\xbe\x96\xc4\x46\xbd\xc5\x80\x23\xcb\x06\xaa\x11\x27\x25\xa7\x32\x0a\xe4\x24\x27\x28\xfe\x50\x20\x9f\x85\x4c\x5d\x30\x3c\x7c\x2b\xef\x23\x5b\xd0\x52\xaf\x5b\xa6\x42\x9a\xf7\xd8\x67\x8b\x1c\x2d\x85\x17\xb5\x14\x38\x2f\xae\x4b\x3c\x2f\x7c\xe1\xb4\xae\xe2\x2f\xf0\x42\x4c\x3a\x22\x9f\x3a\xcf\x29\x17\xff\xa2\xd9\xec\xa3\x74\xa4\xb7\xa5\xb6\x6c\x03\xa9\xcd\x4a\xed\x99\x6a\x1e\x58\xb6\xfb\xad\x27\xd0\x3b\x09\x48\xa4\x37\x65\x2e\x9a\x4b\x78\x27\x3f\x49\xc9\x01\x90\x55\x93\x62\x2e\x33\x39\xfc\xf1\x9a\xbb\x25\xcd\x1e\xa6\x8e\xbf\x9c\xd5\xe2\xb3\xd2\xf9\xa8\xb3\x1d\xf5\xbf\xdb\x47\x61\xaa\x46\x4f\xe3\x8f\xad\x77\x8e\xc6\x9f\xa9\x2e\x8b\xc7\x11\xe6\x9c\x65\xd4\x06\x48\x02\x80\xa9\x76\xb3\xc8\xe5\x66\xb1\x5f\x37\xe4\x4e\xbf\xe3\xfe\xa5\x5f\x9c\x26\xc6\xe6\xce\xae\xe4\x3f\x84\xaa\x71\xd8\xab\xe9\x30\x51\x12\x98\x1a\xee\x3a\xdc\x0c\xda\xf6\x03\x8f\xbe\xf1\xdb\x2b\x0f\x60\x58\xa9\x6b\x6b\x4c\xd1\xe1\x6c\xbf\x44\xc3\xd1\xa0\x02\xcd\x4f\xe8\xfb\x57\x56\xd2\xc8\xb7\x66\xdf\x1b\xfb\x7e\xdc\x66\x0c\x59\xe4\x9e\x22\xaa\xa1\xf3\x79\x2f\x6c\x09\x9f\x29\x67\xbf\x4c\xdc\xaa\x58\xd5\x16\x78\x34\x6e\xb9\x45\x7c\xb1\x07\x05\x0c\xfc\xfa\xae\x21\x81\x74\x14\x66\x7f\x91\x41\x17\x90\xd9\xef\xc1\xd7\x50\xcd\x71\x80\xcc\x61\x88\x91\x86\xa1\x6f\x7f\xf8\xfe\xfb\x31\xf0\xe6\x51\x88\x66\xaf\x85\xea\x03\x6f\xf6\x41\x34\x7b\x85\x7a\xc1\x9b\xc7\x4a\x04\x7c\xc1\xba\x71\xf0\xe6\x71\x73\xe0\x70\xe8\xcd\x01\xdf\x6a\x6a\x3d\x9f\x5b\xab\xe7\xf3\x70\x85\xab\xf8\x86\xeb\xdb\x3c\x32\x3d\xb5\x7b\xfe\xba\x3c\x9f\xcc\x81\x8a\xbd\xc8\x6a\xbc\xc0\xd9\xc9\x26\x3a\x1c\xaa\x06\x2f\xa9\xf2\xce\xad\xaa\x0b\xb4\xd4\x5f\x6f\x37\x52\x4b\xe7\x91\x39\x5c\x65\x17\xae\xa0\xf3\x88\xec\xd4\xd6\x05\x2a\x2d\xd2\xd0\xc4\xc3\x35\x72\x51\xd5\x6f\xb1\x99\xd8\x11\x95\x6e\x7b\xd6\xb7\x45\x27\xdd\xc5\xd4\xb2\xa5\x6c\x2e\xb6\x2e\x2d\x20\x14\xf9\xeb\xd6\xc6\xaa\xd1\x82\x52\x87\xab\xd5\x7c\x35\x68\x41\x91\xfe\x6d\x64\xb7\xca\xb3\xe8\x7a\x33\x67\xcb\x08\x0a\x8d\xae\x32\x4b\xa9\x2d\x8b\x4f\x5e\x8d\x49\x5c\x8d\xaf\x1e\x73\x6a\xc2\x82\x1d\xf7\xd7\x8c\x0d\x57\x82\x45\xcd\xa4\xed\x4a\x31\x7f\xfd\x57\x50\x68\x4c\x7d\x58\xe4\xe2\x8d\xc9\x96\x0d\x55\x80\x05\x33\x69\x0f\x92\x1e\x1b\x53\x65\x94\x5e\x5b\x64\x76\x17\xaf\x96\xf7\x97\x14\xc5\x3b\xf3\x52\x78\xfa\x5c\x1f\x95\x3a\x7a\x68\x03\x17\x12\x8c\x2c\x68\xa1\xd7\x82\x68\x47\x82\xa4\x87\x3a\x7c\xa0\x98\xc9\x16\x3a\x98\xc1\xef\xb1\x18\x62\x5b\xe5\x8b\xf8\x75\xd6\x0b\x97\x98\x8f\x8f\x51\x92\x57\xce\x09\x77\x74\xee\x6f\x77\xd2\x3a\xf7\x79\x07\x42\x49\x3b\x25\xc0\x76\xba\x67\x35\x62\x73\x05\x1e\x1b\xb0\xd5\xed\x82\xb9\x98\xde\x88\xf3\xbc\xac\x18\xc3\x05\x3f\x43\x03\xf5\xfb\xca\x0c\x0a\x9d\x7f\xec\x09\x07\x37\x0d\x59\x55\x8d\x6f\x2a\x1c\x7d\xfb\x2f\xea\xdb\x4f\x76\x48\xfe\x6e\x1e\x30\xd4\xc8\xed\x0a\x97\x13\xb1\xda\xa4\x97\xdf\x71\xb6\x7a\x7a\xd0\xd7\xd4\x67\x48\x67\x33\xcb\x01\x95\xae\x1b\x59\xc8\xd0\xe1\x68\x47\x3e\x1f\x81\x65\xef\x3d\x8c\x87\x56\xca\x4a\x1e\x15\xd8\x8c\x7b\xeb\x33\x63\xfd\x9c\x5a\xaf\x0a\x92\x5d\x35\x23\xa4\x97\xa2\xb3\xd7\x77\x4e\xec\xcd\x92\x84\xb2\xf7\xa7\xb2\xfa\xc6\x3e\xdf\x3d\xc3\xc0\x21\x06\x17\x05\x7b\x84\xf6\xda\x7d\x30\x30\xdc\xb2\x67\x50\x22\x28\x6b\x51\xa8\x38\xe8\x2b\x6f\xb2\xdb\x05\xa9\x93\x1a\x71\x4a\xf2\x1a\xfe\xf2\x68\x50\xab\xd0\xe2\x8c\x34\xee\x64\x13\xc7\xe8\x12\x12\xd2\xc5\xff\x75\x66\x53\xa0\xe3\x3a\x70\x34\x27\x4b\xbc\xa6\xac\xad\x41\x6e\xc3\xd0\x37\xea\x2b\xb9\x69\x6d\x58\x6b\x9c\x85\x6d\x20\x61\xd6\x8c\x22\x1f\x78\x53\xb7\xf6\x4b\x79\x98\xcb\x99\xf6\xa3\x4c\xc8\x17\xea\x2d\x27\xdc\x1a\x33\xfd\x92\x34\x6a\xe7\x93\x19\x5e\x6b\x5e\x89\x5d\x31\x9a\x72\xf4\x77\xf7\xfe\xae\x01\xb6\x9e\xc9\xaf\x5e\x1b\xe1\xe8\xd1\x04\x1b\xba\x4c\xb8\xb0\xa0\xd9\x26\x9a\x6c\xd3\x86\x09\xc5\x63\xe8\x3d\xe6\x24\x47\xbf\xe0\x12\x2f\xe0\xec\xfb\x66\x36\x7d\xff\xcb\x5b\xf1\x0a\x03\xee\x8d\x9b\xab\xa1\x28\xa3\x96\x0f\xe2\x6f\xf7\xab\x4f\xe9\xf5\x31\x61\x1b\x3c\x58\x2f\xf7\xac\xb0\xd1\x1b\x96\x1f\xed\x7c\xbb\xc0\xb7\x4f\xa2\xdc\x5b\xb8\xeb\x55\xfe\x84\xe4\xc8\xb6\xc9\xe9\xea\x6a\x5c\xf6\x64\x18\x76\xcf\x23\x6d\xd8\xdb\x30\xf8\x00\x6f\x70\xd3\x76\xb4\x4d\xd7\xe0\xfc\x45\xac\xf1\x9a\x40\xb5\xfa\x5c\xe2\x27\xe4\xea\x21\xbd\xf1\x5f\x14\xa4\x6e\x56\x72\x8a\xd4\x28\x2b\x5a\xde\x90\x1a\x0e\x26\xb2\x64\xb3\x3b\x09\x6e\x99\x38\xe9\x67\x45\x9b\x4b\x9f\x3c\x29\x35\xc2\x81\x2c\x2b\xa8\xd9\xaa\x0b\xd5\x70\x0a\xc6\x92\xf9\x62\x5a\xb3\x15\x69\x96\xa4\xed\xee\xe0\xbf\x4a\x25\xc4\x6a\x69\xed\x03\xd6\xc5\xa0\x55\xbc\xa0\xcd\xb2\x9d\x9f\x65\x6c\xe5\x18\xc8\xe7\x2a\x77\xa3\xd9\x9c\xcf\x0b\x36\x3f\x5f\x61\xd1\x03\x61\x2e\x37\x35\x9d\xb7\x0d\xab\xf9\x79\x4e\xd6\xa4\x38\xe7\x74\x31\xc1\x75\xb6\xa4\x0d\xc9\x9a\xb6\x26\xe7\xb8\xa2\x93\x8c\x95\x6b\x31\xdd\x58\xc9\xcf\x56\xf9\x5f\x85\x8a\x9a\xe0\x32\x9f\xc0\x20\xb9\xd6\xee\x98\x76\xc7\x6b\x4c\x0b\x61\x63\x7e\x22\x42\x09\xe2\x2d\xe5\xdf\x75\x09\xb2\x06\x17\xa8\x6c\x57\x73\x52\xcb\xe8\xb9\x7e\x1a\x55\x2c\xe7\x70\x3c\x84\x9a\x4c\x53\xbb\xbf\xa2\xa5\x78\x1d\x1b\x85\x2d\xb1\x0d\x52\xdc\xe0\x7a\x41\x5c\xae\xd7\xc1\x77\xda\x7b\xcc\xe7\x22\x1d\x77\x89\x56\x58\x18\x67\xde\x1e\x7e\xb2\x3b\xaf\x76\x6f\x09\x13\x09\x03\x3d\xaa\x2e\xd1\x6e\xcb\x9c\xd4\x05\x96\x48\x0e\xd0\xd2\xed\xed\x58\x9d\x69\xa4\x0d\x34\x27\xe2\xce\x8a\xd4\xa2\xdd\xc2\x3c\x94\xe7\xdf\x5c\xec\xcc\xc4\xc8\x36\x21\x2c\x73\xdb\x60\xc7\x86\x8e\xbf\xf5\x2e\x2f\xaf\x64\xe5\xa4\x21\xf5\x8a\x96\x72\x33\x90\x6f\xd0\xfb\x32\xb6\xba\xa8\x5e\x0e\x7a\xd3\x2c\x09\xad\x15\x4f\x08\x5a\xe1\x26\x53\x5e\x57\x89\x9a\xcb\xea\xb7\x87\x79\x7d\x6d\xb9\xdf\x6c\x75\x9e\xdf\xa3\xb7\x07\xea\x4b\x95\x8b\x51\xdf\xa9\x1f\x87\x7b\x71\x72\xc7\x5a\xe2\x35\x38\x66\x72\xc2\xc5\x2e\xa0\x79\x34\xe4\x71\xe8\x10\xbd\x1d\xda\x5e\x26\xdb\x9a\xa7\xf3\x2d\x2c\xd5\xce\x47\xf5\xd0\x7d\x03\x73\xa2\xfb\x7d\x77\x9c\xfd\x5b\x52\xbf\xa1\x13\x39\x04\x7f\x19\xbc\x5f\x0d\xd2\x3b\xb4\xfe\xce\xfe\x25\xdf\xe3\x44\x41\x92\xcb\x2f\x00\xb8\x8a\xe4\xef\x50\x53\xb7\xb0\x91\x2a\xf3\x48\x7d\x62\x37\x41\x9c\x65\xa4\x6a\x48\x2e\xcf\x3b\xd0\x84\x07\x5a\xe6\xef\xd0\x37\x00\x9e\x5d\x15\x6d\x8d\x0b\xf5\xa7\x50\xa6\x54\xea\x8d\x77\xe8\x7f\xfe\xf7\x2f\x20\x95\xe4\xbf\xeb\x76\x88\x0f\xff\x3f\x00\x00\xff\xff\xf5\x63\xc4\xb9\xbe\x0f\x04\x00") - -func examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYamlBytes() ([]byte, error) { - return bindataRead( - _examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml", - ) -} - -func examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml() (*asset, error) { - bytes, err := examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml", size: 266174, mode: os.FileMode(420), modTime: time.Unix(1, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\xe3\xb8\x11\x7f\xf7\xa7\x18\xe4\x0a\xb8\x2d\x62\xa7\x7b\xbd\x16\xad\x5b\x14\xd8\xee\x6e\x71\xc1\xed\xe6\x82\x24\xbb\x2f\x45\x71\x47\x8b\x63\x8b\x67\x8a\xd4\x91\x94\x13\xb7\xe8\x77\x2f\x66\x48\xc9\x92\x2d\xc9\xbe\x6c\xf7\x2d\x7a\x49\x24\x8d\x86\x33\xbf\xf9\x2f\xd1\x93\xd9\x6c\x36\x11\xa5\xfa\x84\xce\x2b\x6b\x16\x20\x4a\x85\x4f\x01\x0d\x9d\xf9\xf9\xe6\x4f\x7e\xae\xec\xd5\xf6\xd5\x12\x83\x78\x35\xd9\x28\x23\x17\xf0\xa6\xf2\xc1\x16\x77\xe8\x6d\xe5\x32\x7c\x8b\x2b\x65\x54\x50\xd6\x4c\x0a\x0c\x42\x8a\x20\x16\x13\x00\x61\x8c\x0d\x82\x2e\x7b\x3a\x05\xc8\xac\x09\xce\x6a\x8d\x6e\xb6\x46\x33\xdf\x54\x4b\x5c\x56\x4a\x4b\x74\xbc\x42\xbd\xfe\xf6\x77\xf3\xaf\xe7\xdf\x4c\x00\x32\x87\xfc\xf8\x83\x2a\xd0\x07\x51\x94\x0b\x30\x95\xd6\x13\x00\x23\x0a\x5c\x40\x69\x65\x61\x8d\x0a\xd6\xf9\x79\xfa\x47\x99\xf5\x3c\xb3\x0e\xad\x9f\x67\xb6\x98\xf8\x12\x33\x5a\x7b\xed\x6c\x55\x2e\xa0\x9f\x28\xb2\x4b\x32\x46\xfd\x6e\xad\xfc\x10\x69\xf9\xa2\x56\x3e\x7c\x77\x70\xe3\xbd\xf2\x81\x6f\x96\xba\x72\x42\x77\xa4\xe1\xeb\x5e\x99\x75\xa5\x85\x6b\xdf\x99\x00\x94\x0e\x3d\xba\x2d\x7e\x34\x1b\x63\x1f\xcd\x3f\x14\x6a\xe9\x17\xb0\x12\xda\xe3\x04\xc0\x67\xb6\xc4\x05\xdc\x90\x44\xa5\xc8\x50\x4e\x00\xb6\x42\x2b\xc9\x48\x44\x19\x6d\x89\xe6\xf5\xed\xf5\xa7\xdf\xdf\x67\x39\x16\x22\x5e\x04\x90\xe8\x33\xa7\x4a\xa6\x6b\x09\x0a\x92\xcc\x83\xbe\xa5\x3d\xac\xac\x03\x01\x1e\x03\xd8\x15\x89\xe7\xe7\x89\x47\xe9\x6c\x89\x2e\xa8\x1a\x0e\x3a\x5a\xbe\xd1\x5c\x3b\x58\x6d\x4a\xe2\x44\x9a\x66\xb9\x90\x23\x24\x9b\xa2\x04\xcf\xa2\xd2\x72\x21\x57\x1e\x1c\x32\x0e\x26\xfa\x47\x8b\x2d\x10\x89\x30\x60\x97\x3f\x61\x16\xe6\x70\x4f\x58\x39\x0f\x3e\xb7\x95\x96\xe4\x42\x5b\x74\x01\x1c\x66\x76\x6d\xd4\xbf\x1b\xce\x1e\x82\xe5\x25\xb5\x08\x98\x2c\x53\x1f\xca\x04\x74\x46\x68\x02\xb2\xc2\x4b\x10\x46\x42\x21\x76\xe0\x90\xd6\x80\xca\xb4\xb8\x31\x89\x9f\xc3\x07\xeb\x10\x94\x59\xd9\x05\xe4\x21\x94\x7e\x71\x75\xb5\x56\xa1\x8e\x86\xcc\x16\x45\x65\x54\xd8\x5d\xb1\x4f\xab\x65\x45\x66\xbf\x92\xb8\x45\x7d\xe5\xd5\x7a\x26\x5c\x96\xab\x80\x59\xa8\x1c\x5e\x89\x52\xcd\x58\x70\xc3\xc1\x30\x2f\xe4\x57\x2e\x85\x8e\x9f\xb6\x24\x0d\x3b\x32\xbd\x0f\x64\xa2\xe6\x32\x3b\xe4\x20\xee\xe4\x95\xa0\x3c\x19\x93\x1f\x8b\xf2\xef\xe1\xa5\x4b\x84\xca\xdd\xbb\xfb\x07\xa8\x17\x65\x13\x74\x31\x67\xb4\xf7\x8f\xf9\x3d\xf0\x04\x94\x32\x2b\x74\xd1\x70\x2b\x67\x0b\xe6\x88\x46\x96\x56\x99\xc0\x27\x99\x56\x68\xba\xa0\xfb\x6a\x59\xa8\x40\x96\xfe\xb9\x42\x1f\xc8\x3e\x73\x78\xc3\x39\x01\x96\x08\x55\x29\x45\x40\x39\x87\x6b\x03\x6f\x44\x81\xfa\x8d\xf0\xf8\xc5\x61\x27\x84\xfd\x8c\x20\x3d\x0d\x7c\x3b\x95\x75\x09\x23\x5a\xcd\xe5\x3a\xc9\xf4\x5a\xe8\xbe\xc4\x4c\xad\x54\xc6\x7e\x4e\xbe\x2d\xd1\x2b\x87\x92\x02\x14\x3c\x6a\xcc\xf8\x06\x05\x64\x10\x6e\x8d\x01\xa4\xf2\x99\xdd\xa2\xdb\x75\xe0\x5c\xee\xe0\xd6\xd9\x02\x43\x8e\x55\x13\xad\x43\x11\x4b\xc7\x4f\x76\xf9\x5e\x2c\x51\x77\xaf\x1e\x48\xf7\xc0\x01\xb3\x44\x4d\xd1\x53\x79\xa4\x3f\x0e\x83\x53\xb8\x45\x36\xec\x4f\x76\xc9\xd9\x91\xed\x3e\x3f\x60\xd5\x0b\x1b\x1d\xa6\xce\x5e\xf7\xac\xa0\x75\xa3\x42\xd4\x44\xb4\x78\x44\x04\x1e\x73\x95\xe5\x7b\x36\x31\x99\xbc\x4b\x1e\xe7\x93\x01\xfc\x01\x53\x00\xe1\xb0\x81\x0f\x65\xaf\xcc\x43\x70\xf1\xe3\x66\x77\x7c\xf1\x40\xd8\xbf\x5b\xab\x51\x98\x74\x71\x49\xf1\xf5\x98\x93\x55\x1c\x08\xad\xdb\x22\x93\x30\x51\x1d\x4e\xe2\xc7\x87\x32\xb1\x22\x0a\x1f\x48\x75\xc1\x65\x86\x82\x34\x38\x95\xd5\x91\x7b\xa4\xc0\x1e\xf8\x65\x14\xe5\xe8\x7e\x21\x42\x96\xdf\xec\x4b\xda\x88\x36\x54\xc4\xc8\x29\x1b\xb1\xe3\x7f\x7d\x6b\xaa\x80\x45\x2f\xc3\x11\x3f\x68\xdf\x16\xce\x89\x5d\xaf\x03\x1d\x84\x13\x1d\xa5\x95\x1f\xc8\x0d\x33\xdf\x18\x7d\xd4\x85\x5e\x47\xec\xec\xaa\x49\x4b\x9e\xcc\x61\x1f\x51\x82\xf0\x50\x0a\x17\x9a\xd2\xb3\xaf\x8c\x87\x6a\x0e\xa8\x78\x54\x57\xbb\x92\x35\x05\x4f\x80\xcf\x9c\x28\x51\x2c\x75\x2b\x3d\x52\x39\xeb\x01\xe5\xbb\x6a\x89\xce\x60\x40\x9f\x32\x81\xdb\x92\xc5\xf7\x31\x4e\xf9\x87\x96\x39\xb6\xc5\x98\x0b\x03\xe4\xd6\x58\xc7\x91\x3f\x60\xad\x8e\x3a\xdf\xee\xa9\x21\xcb\xad\xf5\x29\xd6\xe2\xe2\x53\x1f\xb3\x83\x07\x4b\xbe\xaa\xb5\xe2\x9e\xb0\x97\x2d\xc0\xa3\x0a\x79\x9d\xc4\xe2\x63\x7d\x7e\x74\xca\x7b\x93\x06\x4d\xcf\x77\xb6\x16\xfb\x27\xea\x46\xd3\x37\xa1\xd9\x82\xd5\x21\xe5\xeb\x9e\xe4\x91\x84\xcb\x11\xc2\x9e\x53\xaa\x87\x14\xab\xd1\xb8\x12\xa8\x26\x3c\x4f\x31\xee\x43\xb6\xe2\x28\x25\xf7\x68\x74\x9d\x48\x41\xd4\xc9\x30\xb9\x43\xdd\x08\x2d\xb1\x16\xe8\x39\x21\x19\x99\xdd\x21\x9b\x49\x99\xf5\x39\x20\x7f\x68\x3f\xf3\xc6\x9a\x95\x5a\x73\xd3\x25\xca\x52\xef\x38\x77\x8b\xa2\xd4\xe8\x61\x89\xab\x58\xc5\xd7\xe8\xe9\xd1\x7e\xb0\x46\xf2\xc9\x61\x93\xd3\x59\x33\xc6\xb5\x07\xb9\x33\xa2\x50\x19\x38\x7c\x74\x8a\xb3\x25\x07\x38\x0e\x70\x84\x54\xe7\x3c\x86\x4b\x58\x22\xd1\x93\xe0\x0a\xe5\xa8\xe8\x70\xdd\xc4\xf7\x20\xe3\x1f\xff\x1a\xe1\xfc\xc1\x45\x39\x7f\xc8\x22\x38\x7f\xfb\x71\xe6\x53\x79\xb7\xab\xb6\x0b\xc6\xfb\x95\x13\xc3\xe8\xd0\xd1\xd3\x0b\x95\xfb\x16\x40\xd9\x2b\x69\x33\xdf\xba\x74\x15\x5b\xdf\xab\x0e\xfb\x83\xb3\xaf\xfa\x45\x9d\x0e\x08\x31\x9e\x6a\xe2\x21\xb2\x70\x30\x1a\x8c\x5a\xf3\x75\x44\x24\x58\x28\xd1\xad\xac\x2b\x60\x29\x3c\x4a\xca\x30\x0e\xd7\xf8\x14\xcb\x17\x8d\x68\x23\x1c\x01\xde\xe2\x4a\x54\x3a\x50\xef\x3b\x75\x58\x6a\x91\xe1\x90\x12\x70\x3a\x1e\xe2\x51\x58\x59\xe9\x6a\x44\xd5\xc3\x88\x88\xf4\x3c\x79\x88\x0d\x26\x07\x84\x5c\xf8\xbc\xfe\x3f\x35\xdc\x0c\xf6\xa8\x3e\x69\xee\x18\xa1\x21\xac\x44\x58\x50\x16\xf9\xe3\x37\x27\x55\xa5\x5c\xb3\x46\x37\x48\xc7\x58\x9f\xad\xe9\x1d\xf2\x28\x0b\xf8\x44\x09\x91\xc7\x3c\xb1\x16\xca\xf8\x3a\x3b\xf1\x44\xf0\x14\x9c\x18\xec\x76\x3a\x8a\x92\xd9\xd8\xce\x34\x01\xb4\x4d\xf9\xeb\xf9\x6f\x7f\xf3\xd9\x76\x4c\xfe\x50\xa0\x09\xbf\x40\xc3\xe6\x99\x24\x62\x57\x41\x91\xbc\x33\xf1\x1e\x55\x51\xf9\xda\xb7\x51\x82\x8a\x8e\xe0\x8e\x11\x8c\x00\xf8\x39\xa1\x8b\x4f\xa3\x1c\x33\x51\xd2\x48\x13\xdf\x63\xc4\xd6\x52\x6c\x85\xd2\xd4\x6a\x74\x01\xfc\xd5\xab\xcf\x86\xcf\x63\x29\x9c\xe8\xe9\xda\x07\xc1\xbb\xaf\x9f\x00\x06\x87\xaa\x53\x78\x44\xe4\xfe\x36\x13\x01\x0d\x8d\x7a\x29\x16\x46\xf5\x8c\x39\xba\x9e\xc1\x65\x4b\xaf\xbf\x4c\xc7\x62\xe3\x3c\xbd\x78\xfd\xb1\xd6\xa8\x47\xb5\x87\x83\x20\xf6\xf5\x88\x12\x85\x8c\xf3\x30\x3e\x29\x1f\xc6\x96\x6e\x74\xf3\x73\xe2\xa8\x1c\xb7\x28\xdc\x58\xf8\x2e\x48\x95\xaf\x47\xf6\x3a\x71\x9f\x88\xa7\xc6\x5a\xe9\xb5\x06\x07\x55\xe3\xbc\x5d\x46\x3d\x5e\x38\xca\x9b\xa7\x52\x76\x5e\xb6\xeb\x25\x6c\x10\xcb\xf8\xfe\x44\x3a\x5b\xa6\xd4\x3f\x9a\xb5\x46\xcb\x7c\x3c\xce\x32\xde\xd8\x18\xd1\xa2\xe1\xee\xb3\x77\xee\x6d\x1f\xdd\x19\xa8\x9e\x7f\xf7\x99\xcc\xa1\xaf\x74\xd8\xbf\x4e\x51\x1e\xa8\xc9\x08\x38\x0e\x97\x32\x9c\x26\x18\xab\x84\x0d\x37\x10\x9c\xec\x8c\x24\x23\xed\x18\xd3\x2e\xcd\x28\x7e\x10\xb3\xc3\x78\x06\xf8\xbc\xc8\x18\x9c\xc2\xba\x04\x43\xc8\x93\xfb\x0d\x99\x58\x48\xc9\xef\x85\x85\xbe\x3d\xd9\x49\x9c\xf0\x94\xb3\x15\x19\xf6\x90\x8e\xd9\xbf\x2f\xa3\x60\xf0\xed\xc3\xc3\x2d\x7c\xbc\x7b\x1f\x15\xc1\x80\xae\xbf\xd5\x3b\x01\x53\x29\x42\x7e\xce\xa8\x42\xab\x11\x2d\xb7\x9d\xdc\xc1\xb3\x4b\x0c\x4e\x7b\x67\xe8\x5e\x5a\x37\x50\xe8\x3a\x4b\xdf\x88\xa2\xe9\x51\x4a\x2b\xf9\xb1\x38\x12\x37\xc3\xaa\xc3\x15\xba\xf8\xaa\xee\x43\x15\x2a\xa1\xf5\x50\xac\xe1\x53\xa6\x2b\xaf\xb6\xd8\x1e\xfb\x6e\xad\x0b\xcf\xd3\xc0\xd9\xa7\xdd\x47\x77\xce\x64\x74\xcb\xa4\x77\xef\x01\xd7\xdc\x16\xc7\xae\xf8\x69\xc7\x2f\xd5\xdd\xe2\xeb\x57\x7f\xfe\x03\xbc\x55\x8e\x46\xbc\x84\xef\xe0\xa8\x67\xe3\xba\x10\x72\x67\xab\x75\xde\xc5\xe2\x59\x7a\xb8\x5f\x34\x51\x4d\xff\x6f\xc3\xd4\x17\x1a\x16\xba\x53\x42\x7f\x63\xf1\x32\xc7\xbd\xcc\x71\x2f\x73\x5c\x73\xbc\xcc\x71\x2f\x73\xdc\xf0\xf1\x32\xc7\xbd\xcc\x71\x43\x5a\xbd\xcc\x71\x2d\x9a\x97\x39\xae\x17\xb5\x2f\x39\xc7\xf1\x3e\x0a\x3c\x77\x84\x89\xd4\xf5\x67\x63\x02\x83\x9b\xed\xc1\x7a\x7f\x42\xfe\xd8\xa9\x3f\xa8\x02\x6d\x75\xce\x2c\x93\x28\x41\xac\x02\xba\x96\xc5\xd3\x44\x15\xfb\xf8\xe7\x7d\x1b\xd9\x8f\x32\x03\x33\xad\xd9\x7d\xbf\xea\xbf\x35\x3b\xa3\x68\xcf\x4e\x9b\xb2\xdb\x35\xbf\xc5\xd2\x21\x25\x16\xb9\x80\x8f\x1e\x61\x3a\xa5\xc1\x6d\x3a\x05\x4a\x0c\x28\xe4\xbc\xbf\x50\x3c\xcd\x36\xcd\x27\xc6\x99\x32\x61\x66\xdd\x2c\xae\xb9\x80\xe0\xaa\xe3\xfc\x3d\xe2\x3e\x43\x8e\x53\x5a\xf9\xb0\x8f\xd4\xf1\x4f\xb4\xb7\x5d\x5a\x08\x4e\x18\xcf\xd3\xe6\xfe\x13\x23\x59\xb0\xfb\x61\xf4\x48\x4a\x6b\xd2\x3e\x9f\x68\xa6\x33\x3f\xe1\x8e\x40\x3e\xa4\x5b\x1c\x25\xde\xab\x42\x1d\xf9\x41\xb7\x66\xee\xe9\x9a\x2f\xc1\x25\xba\x59\xf2\x44\xcd\x37\xac\x01\x53\x15\x4b\x74\xd4\x4f\x0e\x7d\xb7\xab\x87\x97\x90\x8b\x00\x8f\x4a\x6b\x58\x52\x6a\xc9\xb0\x0c\x28\x0f\x15\x1d\xeb\x22\x87\x9d\xd0\x3f\x73\x3f\xc6\xad\x95\xf5\xa6\x8b\x5f\xb2\xa1\x82\xab\xd8\xbb\xa6\x46\x9d\xde\x8f\x70\xf8\x40\xdc\xda\x54\x7f\xdb\xaf\x27\xbf\x24\x9e\xc3\x9f\x2b\xe5\xb8\xd5\x1b\x48\xbd\x0f\x5c\x03\xf6\x54\x9c\x6e\x5f\xdf\xbc\x3d\x86\x13\xc6\x4b\xdc\xe1\x66\x83\x41\x41\xd2\x5e\xac\x06\x41\x32\x25\xb5\x08\x54\xc5\x07\xd2\x76\x6c\x40\x2e\x41\xc0\x06\x77\xb1\x28\x0b\x03\x04\xaa\x68\x58\xd0\x98\x17\xd2\xa7\xf9\x0d\xee\x98\x68\x6c\xd2\x38\x3d\xef\x6d\xb0\x77\xaf\x4b\x8f\xba\xb4\x9e\xf2\x69\x6f\x1d\xe9\x4d\x17\x58\x2a\x4e\xb8\xb5\xaa\x71\x0a\x1f\x9e\xae\x01\x82\x1d\x2e\x70\x67\x94\xb7\x1a\x91\x33\xc5\x6e\x00\xdc\x6f\x6a\x8b\x10\x4f\x7d\x84\x93\xfc\x2b\x57\x25\xbf\x75\x19\x91\x3a\x6d\x92\xac\x7b\xd9\x4f\x42\x2b\xd9\x30\x8f\x1e\x75\x6d\x2e\xe1\xc6\x06\xfa\xf3\x8e\x3a\x48\x4f\xf6\x19\x61\xf9\xd6\xa2\xbf\xb1\x81\x69\x3f\x0b\x92\x28\xd4\x99\x80\xa4\x46\x97\x1c\xd4\xc4\x7c\xc7\xc9\xa8\xb5\x6d\xd0\xcf\xe1\x3a\x4e\x39\xb5\x7e\x63\x0d\xa1\x87\x6b\x03\xd6\xd5\x9a\xf3\x76\xcf\xb8\x44\x64\x5e\x54\x9e\x77\xfa\x19\x6b\x66\x58\x94\x61\x57\x73\x1f\x61\xda\x18\x4d\xf9\x1a\x4a\xeb\x3a\x78\x0d\x2c\x34\xc2\x73\x89\x90\x96\x7f\xc8\x55\xfd\x4c\xdc\x82\x1a\x87\x1c\x59\x31\x04\xbc\x85\x52\x04\x5c\xab\x0c\x0a\x74\xeb\x31\x39\x4b\xca\x53\xc3\xa6\x3b\xd9\x2c\x9f\xd5\x2a\x9f\x6a\x94\x53\xda\x91\x43\xbd\xc8\x06\xfb\x9f\x9b\x8d\x9b\xf7\x44\x1b\x39\x26\x15\xa7\xef\xe1\xc1\xec\xfc\xaf\x01\x27\xf0\x39\xae\x19\xa9\xa9\xe0\xec\x5b\x88\x92\x3c\xfb\x3f\x94\x4e\xd9\x51\xfe\x0b\xa5\x50\xce\xcf\xe1\x35\x6f\xca\xd6\xfd\x96\x6d\xd3\xab\xd8\x8b\xb4\x59\x13\x57\x6a\x2b\x7f\xae\xd4\x56\x68\x4a\xf5\x94\x38\x0c\xa0\xe6\xc4\xdf\xcb\xd2\xae\x8e\x2a\xda\x25\x3c\xe6\xd6\xc7\x2c\xbe\x52\xa8\x79\xf7\xee\xc5\x06\x77\x17\x97\x9d\xc8\x03\xd5\x9f\x4a\x2f\xae\xcd\x45\x2c\x12\x47\x71\x50\xd7\x19\xb0\x46\xef\xe0\x82\xef\x5d\xcc\x8f\x8a\x60\x7f\x53\x3b\x56\x18\x4f\x76\x86\x47\xb7\xfa\x5c\x73\xd6\xb7\xab\xaf\x73\xbf\xae\x25\x93\x51\xfe\x87\xbc\x67\xbc\x01\x77\xd2\x4b\xbf\xff\x4d\xc1\xab\xfd\x19\xfb\xdc\x2c\xfd\x86\x80\x6f\x00\xef\xbf\xa3\x06\xbb\xe9\x8c\x7d\xb0\x4e\xac\x31\x5d\xf1\x41\x84\xf8\x42\xb1\xee\xc7\x6e\x0e\x7f\x32\x70\x71\xc1\x27\xf5\xaf\x01\xf8\x34\xb3\x26\x7a\xbc\x5f\xc0\x3f\xff\x35\x89\x5c\x51\x7e\xaa\xe5\xa0\x8b\xff\x0b\x00\x00\xff\xff\x85\x97\x1c\x68\x7f\x31\x00\x00") - -func examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYamlBytes() ([]byte, error) { - return bindataRead( - _examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml", - ) -} - -func examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml() (*asset, error) { - bytes, err := examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml", size: 12671, mode: os.FileMode(420), modTime: time.Unix(1, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7f\x73\xdc\x38\x92\x20\xfa\x7f\x7f\x0a\x84\x7b\x22\x64\xdf\x53\x95\xda\x3d\x73\x13\x7b\xbe\x89\xdb\xd0\x58\xee\x1e\xdd\xd8\xb2\xce\x52\xbb\x6f\xe2\xc5\x8b\x6e\x14\x89\xaa\xc2\x8a\x04\x38\x00\x58\x52\xcd\xce\x7e\xf7\x17\xc8\x04\xf8\xa3\x48\x82\xa0\x54\x6e\x7b\xba\xc9\x8d\xd8\x69\xab\xc8\x04\x90\x48\x64\x26\xf2\xe7\x57\x8b\xc5\xe2\x2b\x5a\xf0\x8f\x4c\x69\x2e\xc5\x2b\x42\x0b\xce\x1e\x0c\x13\xf6\x5f\x7a\x79\xf7\x6f\x7a\xc9\xe5\xd9\xee\xe5\x8a\x19\xfa\xf2\xab\x3b\x2e\xd2\x57\xe4\x75\xa9\x8d\xcc\x3f\x30\x2d\x4b\x95\xb0\x0b\xb6\xe6\x82\x1b\x2e\xc5\x57\x39\x33\x34\xa5\x86\xbe\xfa\x8a\x10\x2a\x84\x34\xd4\xfe\x59\xdb\x7f\x12\x92\x48\x61\x94\xcc\x32\xa6\x16\x1b\x26\x96\x77\xe5\x8a\xad\x4a\x9e\xa5\x4c\xc1\x08\x7e\xfc\xdd\x37\xcb\x6f\x97\x7f\xf8\x8a\x90\x44\x31\xf8\xfc\x96\xe7\x4c\x1b\x9a\x17\xaf\x88\x28\xb3\xec\x2b\x42\x04\xcd\xd9\x2b\x52\x28\x99\x33\xb3\x65\xa5\x66\x7a\x99\x4b\xc1\x8d\x54\x5c\x6c\x96\x89\x54\x4c\xea\x65\x22\xf3\xaf\x74\xc1\x12\x98\x4b\x9a\xc2\x04\x69\x76\xad\xb8\x30\x4c\xbd\x96\x59\x99\xe3\xc4\x16\xe4\x7f\xdf\xbc\xbf\xba\xa6\x66\xfb\x8a\x2c\xed\x07\x4b\x37\x15\x98\x74\xca\x74\xa2\x78\x61\x60\x6a\xb7\x5b\x46\xdc\x8f\x44\xae\xc9\x75\x35\x01\x78\x15\x67\xf5\xb1\xf1\xb1\xd9\x17\xec\x15\xd1\xc6\x4e\xab\x77\x24\xc5\x8a\x8c\x27\x54\xf7\x0f\x95\x32\xcd\x15\x4b\x89\x7f\x8b\x88\x32\x5f\x31\xd5\x1e\x9a\x35\x07\xff\xd0\x84\x87\xa3\xdb\xe5\x6e\x98\x3a\x1c\xde\xef\xd4\xb2\x83\xe5\x06\xb8\xf3\x0d\x6b\x40\x4a\xa9\xb1\xff\xdc\x28\x59\x16\xaf\x48\x3f\xc2\xf1\x4b\xb7\xe1\x48\x2c\x07\x58\xca\xb8\x36\x7f\x3d\xf8\xe1\x2d\xd7\x06\x7e\x2c\xb2\x52\xd1\xac\xbd\xb5\xf0\x83\xe6\x62\x53\x66\x54\x35\x7f\xfa\x8a\x90\x42\x31\xcd\xd4\x8e\xfd\x20\xee\x84\xbc\x17\xdf\x71\x96\xa5\xfa\x15\x59\xd3\x4c\xdb\xa9\xea\x44\xda\x89\x5f\xd9\x29\x15\x34\x61\xa9\xfd\x5b\xb9\x52\x8e\x70\xf5\x2b\xf2\x9f\xff\xf5\x15\x21\x3b\x9a\xf1\x14\x90\x80\xf3\x96\x05\x13\xe7\xd7\x97\x1f\x7f\x7f\x93\x6c\x59\x4e\xf1\x8f\x07\xfb\x53\x4f\x9e\xa4\x96\xfe\x99\x26\xb4\xfd\xc7\x22\x93\xfb\x9c\x09\xb3\x74\x9f\x17\x4a\x16\x4c\x19\xee\xb1\x63\x9f\xc6\xb9\xab\xfe\x76\x30\xd0\x89\x9d\x89\xa3\x39\x3f\x92\xa9\xe9\x90\xa5\x44\xc3\x2c\x2d\x55\x98\x2d\xd7\x96\x5a\x2c\x56\x04\x9e\xbd\x06\x58\x62\x5f\xa1\x82\xc8\xd5\x7f\xb0\xc4\x2c\xc9\x8d\xc5\x9c\xd2\x44\x6f\x65\x99\xa5\xf6\x78\xee\x98\x32\x44\xb1\x44\x6e\x04\xff\x47\x05\x59\x13\x23\x61\xc8\x8c\x1a\xe6\x36\xca\x3f\x70\x98\x04\xcd\x2c\x0e\x4b\x76\x4a\xa8\x48\x49\x4e\xf7\x44\x31\x3b\x06\x29\x45\x03\x1a\xbc\xa2\x97\xe4\x9d\x54\x8c\x70\xb1\x96\xaf\xc8\xd6\x98\x42\xbf\x3a\x3b\xdb\x70\xe3\x39\x4d\x22\xf3\xbc\x14\xdc\xec\xcf\x80\x5f\xf0\x55\x69\xa4\xd2\x67\x29\xdb\xb1\xec\x4c\xf3\xcd\x82\xaa\x64\xcb\x0d\x4b\x4c\xa9\xd8\x19\x2d\xf8\x02\x26\x2e\x80\xd1\x2c\xf3\xf4\xeb\x6a\x77\x4f\x1a\x33\x3d\x38\x89\xf8\x00\x7d\x0e\xe2\xdd\x12\x29\xe1\x76\x5b\xf1\x33\x9c\x7f\x8d\x5e\xfb\x27\x8b\x95\x0f\x6f\x6e\x6e\x89\x1f\x14\xb6\xa0\x8d\x73\xc0\x76\xfd\x99\xae\x11\x6f\x11\xc5\xc5\x9a\x29\xdc\xb8\xb5\x92\x39\x40\x64\x22\x2d\x24\x17\x06\xfe\x91\x64\x9c\x89\x36\xd2\x75\xb9\xca\xb9\xb1\x3b\xfd\xf7\x92\x69\x63\xf7\x67\x49\x5e\x03\xbf\x25\x2b\x46\xca\xc2\x9e\xd4\x74\x49\x2e\x05\x79\x4d\x73\x96\xbd\xa6\x9a\x7d\x72\xb4\x5b\x0c\xeb\x85\x45\xe9\x38\xe2\x9b\x62\xa2\xfd\x22\x62\xab\xfa\xb3\xe7\xdf\xfd\x3b\x74\x53\xb0\x84\xaf\x79\x02\x84\x8e\xf4\x5f\x33\xcd\x15\xdb\xd2\x1d\x97\xca\xff\xbd\x71\x36\x93\xac\xd4\x86\xa9\x65\x0b\xa9\xfd\xe8\xd9\x96\x2b\xcb\xd7\xce\xac\xb0\x52\x82\x19\xa6\x1b\x98\x5a\x65\x72\x75\x96\x53\x0b\xeb\xb1\x58\xb3\x0b\x5c\x50\x91\x2e\xb4\xa1\xa6\x6c\x61\xae\x8f\x5f\x00\xcf\xa8\x64\xd9\x79\xc6\x94\x79\x47\x05\xdd\x58\x81\x26\xd6\x7c\x73\xf0\x6a\x87\x95\x84\x3e\x25\x34\xcb\xe4\xbd\x06\x9c\xf3\xf5\xde\x92\x37\x25\x77\x6c\x7f\x00\x11\xb9\x08\xb9\x61\x89\x62\x06\x64\x3a\xe5\x02\x5e\xae\x80\x37\x71\xdd\x1c\xc8\xbe\xbd\xe6\x9b\x52\xa1\x56\xb0\xec\x40\x0e\xbc\xec\xa6\xc5\x59\x4a\xa8\x62\x84\x16\x05\x13\x29\x4b\x3d\x6b\x6a\xbf\xdc\x01\xbc\x61\x82\x29\x7b\x28\xc8\x6a\x7f\x48\x0d\xef\x0b\xfb\x93\x54\x4b\xf2\xbf\xe5\x6a\x70\xd4\x0e\xc8\xbc\xd4\x86\x6c\xe9\x8e\x01\xbc\xb5\x54\x39\xa1\xcd\x59\x72\x01\x3f\xc8\xf5\x9a\x27\xbc\x8d\x93\x54\x26\x65\xee\x19\xf4\xe1\x8e\x91\x8a\xfc\x6a\x49\x67\x0f\x68\x2a\x13\xdd\xf8\xd3\x19\x32\xe3\xb3\xd6\x7c\x0f\xfe\xf5\x35\xb5\xf8\xcc\x11\x9f\x3f\xe1\x6f\x3d\x48\xef\xdd\x24\xdd\x42\xf3\x29\xac\xa5\xd4\x4c\x11\x90\x30\xba\x90\x42\xf3\x55\xc6\x2c\xfe\x73\x7a\xc7\x3a\x50\x75\x69\x8f\x93\xb1\xaf\x83\x78\x5d\x92\x2b\x69\x2c\xae\xa8\x21\xa5\x46\xde\x69\x79\x1e\xa3\xf6\x68\x00\x2b\x64\x0f\x85\xd4\x88\xce\x42\x6a\xcd\x57\x3c\xe3\xa6\x4b\x7e\x46\x92\x95\x62\xf4\x8e\x94\xc5\x46\xd1\x94\xe9\xb6\x3e\xb4\x24\x97\x30\x2a\x4d\x77\x5c\x23\x81\x28\xb6\xe3\xec\xfe\x50\x11\x69\x3e\x8a\x65\x8c\x6a\x46\x84\x34\x0c\xc4\x1d\x13\xb0\x00\x98\xae\x90\x84\x8b\x44\xe6\x05\x35\xb0\xe4\x3e\x6c\x75\x20\x5a\xec\x6d\x24\xac\xd3\xcf\xb7\x41\x01\x74\x6d\x80\xeb\x33\xbf\x88\xe5\xc9\x01\x84\xa1\xd3\x6f\x9f\x3b\xb6\xef\xfe\xb1\x47\x7f\xbc\x63\x7b\xcf\xfd\x34\x1e\x57\x23\x89\x66\x99\x95\x47\x56\xd8\x2c\x09\x79\x67\xa9\x78\xc5\x08\xc5\x5d\xea\x81\x4a\xfc\xb7\x77\x6c\xdf\x25\x9e\x01\x06\xef\x1f\x50\x23\xc7\xa6\x7a\x62\xf5\x33\x3f\x51\xc5\xd6\x4c\x59\xad\xa9\x8f\x21\xd7\x5c\xb8\x3a\x11\x89\x14\x09\x2b\x8c\x3e\x93\x3b\xa6\xec\x36\x9f\xdd\x4b\x75\xc7\xc5\x66\x71\xcf\xcd\x76\x81\xf2\x44\x9f\x81\x56\x7a\xf6\x35\xfc\x4f\xef\x22\x6f\xdf\x5f\xbc\x7f\x45\xce\xd3\x94\x48\xb3\x65\xca\xd2\xfa\xba\xcc\xc8\x1a\x34\xca\x65\x43\x51\x3b\x05\xb5\xe1\x94\x94\x3c\xfd\xf7\xc3\x4d\x1b\xc5\x87\x2c\x90\x43\x8e\xe2\x04\x45\xdb\x9e\xdc\x6f\x19\x4c\xc7\xa2\xc6\xb1\x5c\xa9\x88\x15\xfe\x76\x73\x73\xb7\x7b\xa8\x17\xf6\xed\x1e\xce\x66\x25\x65\xc6\xa8\x38\xf8\xdd\xaa\x0f\x56\x54\x1e\x4e\x66\xd1\xc3\xf5\x7b\xa5\x33\xe9\x4a\xa3\x0f\x2c\xa3\x2b\x96\x3d\x46\x1a\xb5\x3f\xfd\x34\xd2\x08\x18\xa2\x3d\xed\x76\xa4\x38\x71\x34\xf0\xf6\x2f\x21\x8f\x42\xe3\x77\x19\x6e\x35\x9f\xc7\x4b\xa6\x0e\xd0\xb6\xa4\x3a\xb6\x64\xfa\xc9\x2d\xcd\x89\xa6\xbe\x1d\xe8\xdf\xb2\x78\xe1\xd4\x15\xdb\xf4\x8e\x3d\x4d\x38\x75\x40\x36\x84\xd5\xa3\x85\x53\x07\x68\x83\x20\x26\x09\xa7\x16\xba\x3a\x50\x9b\xe8\x9b\xa5\xd3\x2c\x9d\xda\xcf\xaf\x59\x3a\xdd\x24\x8a\x16\x6c\xa2\x5c\x6a\x7d\x34\x24\x91\x9a\x12\xa8\xef\xc0\x85\x25\x92\x86\x21\x0e\x45\x11\xb9\xe9\xfb\x73\x80\xe7\x8f\xcb\xa0\x90\xcc\xe9\x00\x8e\xbb\x13\x8d\x49\x9a\x0e\xd8\xe8\x3b\xd1\x11\x25\x0d\x22\x38\x74\xfb\x69\x6d\xc1\xc4\x7b\x0f\x88\x92\xee\x3a\x7f\x95\xf7\x9e\x1e\x3c\x81\x0c\x19\x9e\xe9\x2c\x53\xfa\xa7\x3a\xcb\x94\x2e\x4e\xfe\x75\x64\xca\x1a\xdc\x5d\x1d\x82\x6c\xad\xe6\x72\x5d\xb3\xc1\x53\x77\xb4\xd3\x13\x0d\x16\xf5\xb4\xcc\x2c\x1f\x48\xa4\xd0\x46\x51\x2e\x4c\x47\xf1\x0d\x1d\x05\x21\x53\x76\x3e\x30\x85\xce\x34\x2e\xe0\x1f\x2b\xa6\xe1\xb3\x6a\xea\xcd\x69\xa8\x32\x63\xda\xf2\x6e\x3f\xcb\x3e\x92\x0f\x4d\x08\x7f\xb7\x44\xac\x58\x7a\x51\x5a\x2a\xb8\xa9\xc0\x5f\x6e\x84\xac\xfe\xfc\xe6\x81\x25\x65\xbf\xcd\xab\x67\xee\xf6\x3c\xbb\x79\x32\x45\xee\x79\x96\xb9\x61\xe0\x4c\xbb\x1f\xec\x84\x81\x71\xd9\xf5\xf5\xd3\xb9\x7d\x80\x9f\x69\x6a\xb8\x5e\xa3\xec\xab\x30\xc1\x1e\x0a\xc5\xb4\x3e\x10\x6c\x20\x21\x2d\x9b\xb6\x87\xe1\x74\x10\xec\xaa\x34\x96\xd7\x5b\x26\x9e\x6c\xa5\x65\xe2\x14\x11\x0d\xe3\xed\xb8\x04\x01\x45\xa4\x60\x96\x86\x73\x7b\xbc\xf1\xd0\x0f\x42\x6c\x4c\x67\x09\x18\xa8\xc1\x71\x4d\x72\xa9\x4d\x8d\x6b\xfb\x17\x10\xa7\x82\x11\x7b\xf4\x03\xab\x67\x64\xa3\x18\x08\x4b\xa2\xcb\xdc\x4e\xe2\x9e\xf1\xcd\xd6\xe8\x53\xc2\x97\x6c\x09\xdb\xcf\x68\xb2\x6d\x0c\x97\x33\x66\x86\x11\x4a\xb3\xac\x62\xb4\x0d\x5a\xc2\xf3\x65\xe5\xb8\x26\xcf\x2b\x9f\x88\xf3\x53\x9c\x56\xe7\xef\x90\x4a\x86\x87\xe9\xd9\xa6\x53\xc2\x4c\xb2\x7c\x71\x4a\xac\x68\x2a\x8d\xc5\xb9\x5d\xd3\x6a\x4f\xb8\xb1\x5a\x0b\xca\x58\x25\xcb\x4d\x18\x23\x2c\x73\x13\xf5\x8e\x33\xd8\x6c\xf0\x60\x59\x55\x4d\x6c\xc8\x33\x44\xd2\x33\xaf\x50\xe9\x32\x1f\x84\xc8\x11\x19\x80\xbf\x9c\x9a\x64\xeb\xdc\x74\x89\x54\xa8\x36\x00\x44\xf8\xe5\x4d\xbd\x96\xff\x19\x24\x06\x0b\xec\xb9\x7e\x01\x9b\x0b\xc0\xb6\x7c\xb3\xf5\x7b\x48\x15\xaa\x0c\x6d\x9a\xe8\x3b\xbc\x30\x3d\xc3\xf2\x81\xb3\x4b\x0e\x0f\xde\xb9\x20\x2c\x2f\xcc\xbe\x41\x69\x8d\x3d\x36\x4c\xe5\xd5\x0a\x69\xd6\xbd\x63\xd6\x8f\x13\x45\x38\x7f\x9e\x17\x19\x4f\xb8\x71\x94\x47\xbe\x21\xcf\x81\xf4\xb8\x39\xd1\x70\x6c\x16\xb2\x78\xb1\x24\xe7\xde\xc7\x3f\xf4\x8c\x4f\x4a\xc8\x6a\x64\x37\x84\x9d\xa8\xee\xda\x02\xea\xa7\x1a\x7f\xf0\x9d\x31\x0e\xd8\x9c\x1c\x13\x49\xaf\x0e\x50\x3f\x6d\x7c\x23\xd5\xa0\x9a\x62\xf9\x30\x53\xf9\x29\xa1\x5a\xcb\x84\x83\xbe\xee\xf7\x3f\x08\x92\x1c\x90\x1a\xa2\x79\x78\x41\xf1\x8b\x22\x60\x36\x69\x13\xee\xd8\xfb\x9d\x25\x66\x5c\x1b\x7b\xd2\xda\x4b\x6d\x32\x8c\x51\x88\xc4\x9e\x71\xfb\xfd\x89\x26\x60\xde\xe8\x31\x18\x1d\x3e\x23\x74\x3f\x38\xdd\xc1\x69\x3a\x8f\xb0\xfb\x25\x02\xb0\x13\x3e\xee\x22\xa8\x9d\x17\xfc\x14\xef\x8e\xe8\x30\xa7\x82\x48\x77\xe1\x82\x97\xa3\xa0\x2a\x86\xc2\xc5\x38\xb5\xd7\x02\x72\x1e\xf6\x88\xef\xe3\x77\x1e\x9f\x01\x05\xbc\xef\xe9\x08\x71\xb4\xdc\xd9\x39\x02\x26\x50\x39\x9f\x80\x3f\x02\x81\x12\x45\xc6\xe1\x8a\x12\xb3\x3a\x32\xa6\x95\xf6\x3d\x7e\x0b\x1e\xb5\xce\x0f\x95\x7b\x1f\x37\xf6\x44\xe3\x06\xd9\xb3\xb2\xe5\x45\xf4\x3a\x8d\x04\xea\x82\xa3\xe2\xe3\x25\x3e\xda\x7b\x4a\x35\x3d\xbc\x78\x5d\x8a\x61\xad\xe4\xf0\xb9\x92\xe6\x52\x9c\x92\x37\x0f\x5c\x5b\x81\x7f\x21\x99\xbe\x92\x06\xfe\xb9\x24\xdf\x1b\xa4\xc1\xb7\x23\xac\xa2\x31\xc5\xa9\x88\xc5\x75\x3c\x0a\xad\xe7\x82\x50\xa5\x28\x5c\xea\x9a\x51\x18\xf6\xb6\x1b\x56\xa4\x0e\x9f\xea\x80\x71\x4d\x2e\x85\x55\xc7\x1c\x5a\x20\x96\x06\x60\xe2\x50\xd1\x10\xfd\x55\x44\x48\xb1\x00\x79\xe9\xe7\xd4\x1a\x0b\xb1\x1e\x3f\x4d\xd5\xda\x9f\xee\xf4\xfc\xb0\xd1\x10\x87\xa7\xf6\x3d\xdc\xac\xde\xb6\x06\x89\x3f\x90\xf5\x64\xc0\x00\x44\x21\x44\x2b\xab\xd4\xaa\x53\x72\xbf\xe5\xc9\x16\xf4\xf6\x68\xa0\x2b\x86\x01\x45\x85\x62\x56\xee\x51\x6d\x59\xa3\x0b\x60\xb3\xea\x30\xf7\x48\xe0\xf1\x13\x55\xac\xc8\x68\xc2\x52\x92\x82\xd2\x89\xe1\x3c\xd4\xb0\x0d\x4f\x48\xce\xd4\x86\x91\xc2\xca\xb6\x58\xea\x8f\x16\x28\xf8\x4c\x3e\x2c\xfe\x93\x58\x5a\x1c\xba\xd2\xf6\x3d\x7d\xd7\xdc\xfe\xf7\x3c\x99\x44\xbc\x3c\x78\x4f\x1e\x7e\x39\x66\x6d\xa0\x70\xb8\x78\xbe\xcf\xac\x6b\x38\x8b\xc8\xac\x6b\xcc\xba\xc6\xc0\x33\xeb\x1a\xfe\x99\x75\x8d\x59\xd7\x98\x75\x8d\x59\xd7\xf8\x17\xd2\x35\x22\x81\xa2\x3d\x65\x82\x59\xe7\x47\xb4\x73\x1d\xda\x71\x40\xb1\xf1\xb1\xe3\x2d\x93\xcd\xc8\x8a\xac\x9a\x70\xe3\x64\xd9\x2d\x98\x88\x9c\x3b\x55\x51\xb1\x61\xe4\xe5\xe2\xe5\x37\xdf\x84\x29\x6b\x2d\x55\x4e\x0d\xa4\x84\xfc\xfe\xdb\x08\x9c\xd4\xa9\x23\xfd\xcf\x38\x3d\x2c\x1a\x16\xb1\xc0\x4b\x88\xdb\x61\x6b\xed\xf8\x0e\x8d\x6d\xf6\x90\xe5\xf9\x09\xfe\x09\xc7\xe5\x2a\x13\x75\xcb\xf8\xdd\x71\x25\x0c\x2e\xce\x59\x9d\x15\x38\x61\x49\xce\x0c\xa1\xa6\x65\xda\xe4\x39\xab\x3c\x48\xe8\x06\xc1\x38\xff\x41\x88\xde\x37\x92\x12\x29\x9c\xe5\xda\xd2\xce\x32\x72\xc6\xc3\xde\x8e\xa6\x53\x84\x24\xe0\x38\x36\xd2\x32\x52\x3f\x6b\x99\xdb\x59\x72\x61\x3c\x03\xb4\x53\x66\x1e\xab\x83\x80\x9f\xb3\xe5\x66\x49\xd2\x12\xc0\x51\xe1\x12\x18\x5e\xe0\xaa\xf5\x5e\x1b\x96\x83\x8f\x45\x2a\xf8\x1f\xbb\x7c\xa3\xf6\x7d\xd1\x5d\xfe\x61\x3b\x26\x4c\x49\xb3\x6c\x4f\xd8\x8e\x27\xa6\xc2\x1f\xe4\x58\x70\x83\xfe\xb0\xa1\xd3\x12\xa3\xb0\x1e\x9e\xc6\x20\x9f\x3e\x50\xdf\x90\x14\x97\x83\x37\x15\x63\xe1\x81\xfb\x27\x7c\x48\xed\x6b\x40\x39\xef\x3f\x0c\x5b\xfe\x49\x9c\x20\x39\xbc\x93\x94\x59\x66\xf1\x8d\x8e\x80\xee\xf4\xbc\xb1\x7d\x94\x67\x79\x53\x3c\x7a\xb3\x5a\x14\x87\xfe\x23\xf4\x64\x9c\x5f\x5d\x58\x8c\x8c\x2d\x99\x90\x5b\x59\xc8\x4c\x6e\xf6\x4d\xdc\xc3\xe9\x07\x07\x83\x83\x4c\x89\x2e\x57\x4e\xb3\x1d\x57\xdc\xae\x0e\xb6\x72\xb6\x99\xcf\xf7\xd8\xbe\x67\xbe\xc7\x76\x9e\xf9\x1e\x1b\x39\xc5\xf9\x1e\x0b\xcf\x7c\x8f\x9d\xef\xb1\xa3\xcf\x7c\x8f\xed\x79\x79\xb6\x99\xcf\xba\x46\xe0\x99\x75\x8d\xce\x33\xeb\x1a\xb3\xae\x31\xeb\x1a\xb3\xae\x11\x7c\x66\x5d\xa3\xe7\xe5\xa3\xd9\xcc\xc7\xc1\x8d\xa1\x67\xd1\x35\xb4\x05\x2d\xc0\x83\x53\x0a\xfe\x5c\xc8\xf4\x11\x21\xf5\x85\x4c\x03\x11\xf5\x68\xd4\x4c\xe4\x22\x93\x09\x16\x4e\xea\x99\x94\x3d\x31\x16\x8c\xb3\xe4\x6b\x9a\xa3\xad\xf6\x94\xfc\x43\x0a\x86\x91\xce\x90\x52\x25\x73\xe6\xd2\x34\x0a\x99\x3e\xd7\x2f\x7a\x23\x55\xe7\x28\xfd\xde\x67\x8e\xd2\x9f\xa3\xf4\xdd\xd3\x8c\xd2\xdf\x52\x8d\x74\x89\x82\x70\x38\x68\xbf\xc1\x1d\x2c\x03\xfa\x9f\xc1\xf9\x7e\xa6\x98\x7d\x4b\x84\x8e\x58\x20\x1f\xb5\xde\x78\x5c\x57\xea\xdc\x91\x2c\xbd\x6e\xaf\x26\xc0\xbd\xf1\x0e\x87\xf9\x90\x69\xca\x52\x52\x30\xb5\x40\xd2\x93\x64\xcd\x45\xda\xb3\x16\xbf\xfe\x41\xb0\x91\x71\xf4\xed\x49\x4e\x70\x5d\x34\xbd\x2b\x2d\x06\x7d\x18\x55\x3f\x22\x0b\xab\xfd\xfb\x94\x51\xf5\x70\xf3\xf2\xc2\x6d\xfa\x95\x1d\xee\x6d\x7f\x2f\x99\xda\x13\xb9\x63\xaa\xbe\x99\x54\x25\xd0\x62\x2e\x21\x20\x7b\xb8\x26\x09\xd5\xc8\xa8\xc7\x55\xad\x69\xb7\xd3\xe9\x7e\x90\xce\x62\x0f\x41\xe0\x2d\xdf\xdb\x2c\xfa\x6b\x1d\xf4\x3f\xbd\xa6\x8d\x1e\xe7\x14\xed\x49\xeb\xed\x7f\xd0\x75\x15\xf5\xf2\x24\xe5\xb4\x77\xb7\x07\x4c\x1e\xf1\xd7\x82\x86\x1b\x6f\xc4\xec\x11\x0f\xf3\xc0\x3c\xf2\x44\xd3\x07\x79\x84\xf9\x83\x4c\x33\x81\x90\x43\xf4\xda\x59\x3a\x39\xdd\xb5\x86\x4c\x00\xda\xa0\xaf\xe9\x16\x11\xf2\xb8\xfb\xc8\x74\xcb\x08\x39\x5c\x7e\xb5\x7d\xaa\x63\x26\x99\xb4\xf8\xa6\x49\x65\xd8\x54\x32\x09\x64\xc7\xac\xd2\x36\x97\x00\x6d\xb5\x2c\x26\x9f\x1a\xd9\xd3\xac\x25\xe4\x10\xd5\xce\x56\xc0\xe1\xea\x7c\x60\x3b\x99\x84\x98\xb6\x9d\x65\xd0\x7e\x32\x09\xe6\x90\x31\xa3\x6d\x43\x99\x0c\xb2\x6b\x6f\xe9\xd8\x51\x8e\x33\x4d\x37\xc5\xda\x10\x31\x09\x2c\xd6\x4e\x3d\xa6\x31\x82\x4c\x37\x48\x90\xc7\xd2\xe5\x54\xc3\x04\x99\x68\x9c\x20\x13\x0c\x14\x64\xaa\x91\x82\x4c\x35\x54\x90\xc9\xeb\x05\x15\xe2\x2d\x84\x40\xc4\x2d\xb7\x59\x33\x7a\xaa\x34\x9a\xbc\x83\x5d\x6d\x07\xa7\x8a\x8a\x4e\x4e\x0b\xcb\x25\xfe\xd3\x8a\x66\x20\xfc\xff\x8a\x95\xa3\x94\x2b\x6d\x55\x61\x67\xfc\x6b\x40\xf0\x36\x87\xc6\x60\x91\x40\xed\x6c\xb8\x26\x96\x76\x76\x34\xb3\x0a\x08\x86\x6d\xb9\xab\x9a\x9d\xe9\xa1\xbe\x16\x7b\xbe\xef\xb7\xf6\x7a\x6e\x85\x2f\x5e\xf3\xb8\x26\xcf\xee\xd8\xfe\xd9\x69\x87\x8f\x3c\xbb\x14\xcf\x62\xa1\x52\x77\x55\x69\xf1\x8c\x4a\xf3\x91\x22\xdb\x93\x67\xf0\xdb\xb3\xd8\x83\xdd\xa7\x2e\x4e\x51\x04\x1f\x61\x94\x8b\x7a\x59\xf8\x4a\xd7\x53\x1d\x80\xf5\x87\x95\x7d\xc5\x5f\x8c\xeb\x9f\x62\xac\x8d\x5e\x83\xba\xe9\xea\x41\xe4\x79\x95\x36\xbe\xb1\x98\x37\x2f\x86\xaf\xd2\x8d\x25\xb5\x22\xd1\x40\xe5\xcf\x19\x15\x9a\x3c\xf3\xd6\xb3\x13\x5d\xcf\xf1\xd9\xf1\x3c\x8e\x93\xce\x70\x3c\x2f\x32\x2e\x80\xed\xaf\x31\xea\xea\xc1\x1d\xdf\x59\x0b\x5d\xc1\xee\x15\xab\xcd\x8b\x29\x79\xee\x6f\xba\xc3\x77\xef\xfa\x91\x0a\xa2\x28\x5b\x9f\x0b\xc3\x17\x15\x8c\xfa\xfe\x6b\x6f\x84\xb1\xec\xd5\x87\x35\xb7\x29\xc0\x1b\x37\x2b\xbb\x5d\x4d\x51\x31\x27\xf8\x7e\xcb\x54\x6b\xa5\xdc\x97\x5c\x07\x0f\x84\x2a\x05\x94\xd7\x92\xc2\x99\xf5\xa2\x40\x5a\x36\x83\xf5\xbc\x9d\x99\x04\xd5\x7e\x58\x35\xe8\xfe\xf5\x2e\x45\x86\x3a\x12\x6f\xc0\x84\x22\xeb\x2e\x66\x52\x0a\x77\x88\xec\x5f\xaa\xc2\x44\x16\x2f\x2c\x8d\xc5\x2c\xaf\xd6\xb8\x24\x6f\xe0\x10\x34\x27\xc7\x35\xec\x24\xd4\x26\x8b\xe1\x3e\xd1\x54\x1d\xa7\x1b\x2c\x9a\x93\x39\x86\xcb\x60\x72\x98\xfd\xfd\x91\xc3\xec\x0f\x4c\x4f\xff\x22\x51\xf6\x91\x46\xbd\x39\xd4\x7e\x0e\xb5\x6f\x84\xda\xc3\x47\xc8\xf9\xc6\x63\xee\x87\x69\x06\x62\xf1\x63\x63\xee\xc9\x8f\x5b\x06\x27\x2a\x60\x60\xb3\x5b\x94\x97\x99\xe1\x45\xed\xb0\xd6\x38\xb5\x0c\xaf\x8f\x18\xa8\xa4\x0f\xac\xb3\xa1\x8c\x00\x9a\x6c\x0f\x8f\x09\x8c\x03\x0e\x6d\x0d\x1c\xd9\xb9\x59\x68\x96\xb9\xd8\x7a\x7b\xaf\x1c\xde\x23\xe6\x7c\x55\xfc\x38\x26\xfc\x8b\xaa\x8d\x88\x33\x9a\x80\x73\xe2\xb9\x15\x96\x99\x25\x07\x2b\xb2\x3c\x57\x0b\xf9\x5c\x3b\xf2\x17\xad\x32\x3b\xe6\x1d\x24\x1b\xbe\x63\xa2\x16\xc2\xcf\xf5\x8b\x17\x63\x61\x4d\x26\x52\xf5\xe8\x2a\x16\x01\xa0\x7d\x2a\xc7\x69\xa4\xb8\x0f\x80\xad\x14\x81\x08\x31\xff\xa7\x86\xf4\xfa\x5f\x01\x98\xb5\x73\x68\x50\xc0\x03\x7a\x2a\x11\x5f\x6d\x60\x00\x28\x1f\x5f\x4d\x9c\x1d\x74\x82\x1b\xe1\x11\x2e\x04\xc2\x87\xd9\x09\x3e\x53\xdc\x07\xbf\x58\xfa\x44\x84\xcb\x60\x4a\x98\xdb\xb8\xbb\x20\xf6\xfe\xf7\xd8\x90\xc7\xa0\x03\x60\x8e\x79\x0c\x3e\xf1\xc6\xfe\x5f\x5f\xe8\x63\xc0\xb8\xff\x85\xc6\x40\x3e\xda\xa8\xff\x4b\x86\x3e\x86\x0c\xf9\x13\xbd\x5d\x64\xcc\x88\xff\xc4\x00\xc0\xb1\x20\xc8\x68\x98\x03\xc6\xfb\x7e\x83\x7c\x34\xd4\x3e\xc3\x7d\xaf\x31\x3e\x1a\xe2\x1c\x41\x38\xfa\xde\xe7\x8e\x20\x9c\x68\x90\x7f\xac\x31\x7e\xd2\xee\x4c\x35\xc2\x3b\xf3\x7a\xc4\x34\x22\x0d\xf0\x5d\xd3\x7a\xcc\x12\x47\x8d\xef\x87\x66\xf5\x38\xa3\x53\xc8\xf0\xde\x6b\x52\x8f\x00\xdb\x6f\x74\x7f\x92\x3a\x15\x4d\x9d\x91\x2f\xc6\x9a\xd0\xa7\x9b\xcf\x23\x62\x09\x26\x98\xce\xbd\x61\x7c\x04\xe2\x31\xcc\xe6\x51\x1c\x31\xfa\xa4\xc5\x71\x88\x68\x33\xf9\xa7\x30\x91\x4f\x34\x8f\xc7\x5c\xcb\x49\xef\xd5\x3c\x64\x1a\xc7\x9b\xf0\x08\xc8\x78\xb3\x78\xf3\x36\x3c\xb6\xfc\x58\x93\x78\xf3\x3e\x3c\xe6\x99\x8a\x32\x87\x77\x8d\xdd\xf1\xde\x94\x49\xa6\xf0\x28\x6a\x8d\xb1\xbc\xc6\x98\xbf\x9f\x6c\x54\x1d\x0d\x5e\x17\x86\x3f\x36\x80\xbd\x49\xd7\x03\x51\xec\xbd\x73\xa6\x3b\xc9\x53\x52\x94\xc6\x54\x4d\x2d\xa6\x45\xb2\xf7\x42\xfd\x4d\x45\xb7\xb7\x50\x1f\x0c\x71\x0f\x9b\xb4\x4f\x1f\x11\xe2\x3e\x08\xd1\x1d\xcb\x47\x84\xb8\x0f\x83\x74\xa1\xef\x8f\x0a\x71\x1f\x84\x0a\xa1\xef\x8f\x0b\x71\x1f\x3d\xf1\x87\x24\x34\xbc\x57\x3e\xce\x7d\x10\xe4\x78\xfc\x7b\x20\xce\x7d\xd8\x42\x1e\x8c\x7f\x0f\xc4\xb9\x0f\xa3\x33\x3a\xfe\xbd\x13\xe7\x1e\x20\xf9\x39\xfe\xfd\xe0\x99\xe3\xdf\x1b\xcf\x1c\xff\x1e\xb9\xd8\x39\xfe\x7d\x8e\x7f\x1f\x7b\xe6\xf8\xf7\x39\xfe\x7d\x8e\x7f\x9f\xe3\xdf\xe7\xf8\xf7\x39\xfe\xbd\xe7\x99\xe3\xdf\xe7\xf8\xf7\x39\xfe\xbd\xf1\xcc\xf1\xef\x23\x4b\x99\xe3\xdf\xe7\xf8\xf7\x39\xfe\x7d\x8e\x7f\x9f\xe3\xdf\x7b\x5e\xf9\x2c\xf1\xef\x2d\x23\xf4\x60\x10\x7c\xc0\x1c\x5b\xd7\x4f\x99\x18\x04\x3f\x08\x73\xc5\xc6\x83\xe0\x07\xa7\x3d\x08\x75\xa0\xc6\x4f\x54\x24\xfc\xb0\xe9\xb5\x19\x21\x3f\x29\x12\x3e\x60\x34\xef\xa9\x4a\xff\xc4\xea\xf3\xa4\x11\x21\xff\xd8\x48\xf8\x61\x12\x90\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xcf\x91\xf0\x73\x24\x3c\x3e\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xcf\x91\xf0\x73\x24\x7c\xe7\x99\x23\xe1\x7b\xa7\x3b\x47\xc2\xcf\x91\xf0\x73\x24\x7c\xfd\xcc\x91\xf0\xed\x67\x8e\x84\x9f\x23\xe1\x03\xcf\x1c\x09\xff\x69\x22\xe1\x07\x7f\xa2\x99\x95\x92\x62\x73\x38\xf9\x1e\x9b\x13\x49\x99\xa1\x3c\xb3\x1a\xd7\x86\x2a\x88\x78\xf4\x5f\x1f\x62\x31\x74\x47\x83\x6f\x72\x2a\xe8\x86\xa9\x5e\x76\xd1\xbe\xd0\x36\xde\x7e\x23\x52\xb0\x65\x6a\x72\xad\x64\xce\xcc\x96\x95\xda\x1f\xe1\x35\x57\x0c\x41\xf7\xeb\xa9\x8e\x21\xf6\x6d\x77\x80\x6f\x45\x4c\x25\x6d\xd8\xe3\x2c\x89\x72\x29\x80\xd4\x9d\x28\x1f\xd8\xc8\xfa\x7b\xdc\x13\x2f\xf2\x2a\xa4\xba\x71\xc8\xe5\xb5\xc6\x88\xda\xf0\xf2\x82\x0b\x8c\xb9\x33\xd3\x82\x7f\x64\x4a\x07\x8c\xee\x07\xd8\x70\x6f\xfb\xf3\xd9\x44\x0e\x39\xbf\xbe\xc4\x33\x5f\xef\x53\xe0\x98\x95\x1a\x85\x97\x66\x22\x75\x6b\x5c\x92\x4b\x43\x12\x2a\x2c\x67\x7e\xb6\x7b\xf9\xcc\xb2\xda\x67\xbb\x6f\x03\x2e\xf8\x88\x93\xba\x62\x54\x31\x75\x2b\xef\x98\xf8\x8e\x67\x2c\x72\x9d\x7f\x6e\x7f\x65\x27\xaa\x18\x75\xe6\xea\x35\xcf\x98\xab\x07\x63\xa4\x5d\x48\xc8\x79\xb5\x65\x82\xd0\xd2\x6c\x99\x30\x3c\x71\x41\xee\xb2\x85\xb8\x27\x2d\xcf\xca\x84\xc8\x35\x5d\xd1\x1c\x4c\x9d\x1d\x2a\xe4\x02\x7e\x03\xd1\xf2\xe4\xc9\x00\x94\x09\x33\x82\xf7\xfb\xa6\xf5\xa4\x99\x14\xd4\x6c\xaf\x15\x5b\xf3\x87\xc8\xa9\xe0\xcb\x90\x6c\x61\x09\xfb\x2f\xb7\xb7\xd7\x00\xc4\x91\x26\x28\x9d\x45\xa9\xb7\x2c\x0d\xda\x72\x62\xa6\x26\x55\xc0\x99\x49\xc5\xfe\xfd\x3a\x28\x53\xa2\x3c\x84\x8b\x38\x21\xd6\x46\x81\x54\xa6\xff\x54\xdb\x5b\xc7\x43\x21\x35\xf8\xb3\x86\x17\xff\xb0\xb8\x2b\x57\x4c\x09\x66\x98\x5e\x70\x61\x16\x52\x2d\x70\x02\xaf\x88\x51\x83\x9a\x85\x4e\xb6\x2c\x9a\x88\x6f\xe0\x65\x77\xee\xf0\x74\xad\xb9\xaa\x18\x68\xe0\xc2\x15\x81\x10\x93\xe9\xd7\x52\xac\x79\x47\x2e\x0e\x4c\xe6\xf6\xed\x0d\xc1\x0f\xfc\x84\x2c\xfd\xb4\x38\x79\x22\x85\x40\xf9\x30\x3c\xb3\x38\xdb\x66\x42\x27\xe8\xba\x37\xa6\x6c\x8b\x17\xbb\xaf\xaf\xcf\x49\xc2\x94\x69\xce\x75\xfc\xd6\x61\xa8\xda\xb0\x10\x5e\xe3\x57\x40\xf0\x92\xb7\xe6\x9b\x77\xb4\x98\x68\xb1\x7f\xed\xbf\x6b\x2e\x2a\xa5\x86\x36\x56\x13\x73\x1f\xde\xb2\xb8\x15\x4d\x5b\x15\x99\x62\x71\xee\x64\xe9\xa0\x02\xed\x34\x89\x29\xd1\x62\xd1\x86\xa5\xb0\x94\x18\x9c\xdc\x89\x17\x19\x10\xed\x80\x5d\xeb\xcd\x92\xbc\x93\xe0\x1a\x5d\xcb\x58\x43\xd8\xd6\x98\x42\xbf\x3a\x3b\xab\xd9\xc3\x92\xcb\xb3\x54\x26\xfa\x2c\x91\x22\x61\x85\xd1\x67\x72\xc7\xd4\x8e\xb3\xfb\xb3\x7b\xa9\xee\xb8\xd8\x2c\xec\xdd\x62\xe1\x5a\x65\x9f\x81\x64\x39\xfb\x1a\xfe\x27\x72\xd0\xdb\xf7\x17\xef\x5f\x91\xf3\x34\x75\x5d\x82\x4a\xcd\xd6\x65\xe6\xdb\x30\x36\x54\x9f\x53\x72\xc7\x45\xa0\x59\x4e\xfb\x29\x79\xfa\xef\x27\x9f\x62\x8f\x64\x81\x36\xac\x47\xec\xd3\x0d\x5c\x11\xf7\x96\x1d\xc2\x52\xe1\xb0\x57\x07\x26\xda\x5d\xc1\x8d\x06\x5a\xf4\x76\x61\x77\x63\x9c\xb0\xd8\x95\x94\x19\xa3\x63\x2e\xc1\x29\x66\xcb\x38\xa3\xe5\x04\x2b\xa4\x66\x89\x62\x23\xd1\x44\xa4\x83\x60\xf8\x28\xc0\x7a\x22\x93\x42\xbe\x48\xd6\x53\xdd\xb5\x61\x8d\x15\x23\x02\x5d\x77\x49\xc8\xbb\x78\x73\xfd\x8a\x11\x4a\x76\xe0\xed\x71\xd0\xee\xd8\x7e\x66\x68\x33\x43\x8b\x78\x46\x19\x9a\x3b\x83\x52\x59\x3e\x15\xb9\xb6\x5f\x39\x37\x8b\x7c\x31\xa1\xe1\x9b\x2f\xe9\xdc\x04\xec\xc5\xc7\x05\x04\x79\xa5\xd1\x59\x23\x1b\x36\x18\xc7\x0d\x03\xb7\x10\x37\xcb\x16\x97\x8c\xe3\x81\x91\xa4\x66\x67\x36\x49\x2b\x56\x3d\x6a\x71\x92\x71\x26\x0c\xae\xd2\x5e\xed\x23\x54\xc9\xe8\x75\xcc\x8a\xf1\xac\x18\x07\x9e\x59\x8e\xcc\x8a\x71\xeb\x99\x15\xe3\x91\x67\x56\x8c\xc3\xcf\xcc\xd0\x7e\x73\x0c\x6d\x56\x8c\x1f\xfb\xa2\x55\xf9\x9e\xa0\x1a\x77\x14\xc7\x8e\x8e\x3c\xae\xf3\xa1\x06\xfd\x49\x94\x63\x2e\x34\x4b\x4a\xc5\x6e\xee\x78\xf1\x91\x29\xbe\x9e\x12\x2c\x71\xc1\x35\x5d\x65\x7e\x42\xb0\x46\xbe\xe6\x09\x35\x0c\xf9\x18\x0d\x9b\xb4\xc9\x04\x5a\xb9\x63\xfb\xa7\x6f\x02\xc6\x2f\x7d\x71\x7b\x70\xc7\xf6\x37\x11\x72\x75\x44\xa6\xf6\xad\xf3\xb3\x5c\x52\xa2\xe4\xe9\x27\x94\xa5\x8f\x94\xa3\x13\xf8\x73\x9c\xfc\x9c\x26\x3b\x7f\x79\xa9\xf8\x09\x24\x62\x9c\x34\x9c\x80\xe9\x78\x29\x38\x4d\x02\x46\x46\xb9\x4e\x95\x7e\xf1\x92\x2f\x36\x4d\x76\x6c\x9e\x91\x42\x4c\x33\xb5\x63\xea\x6a\x94\x6e\x5b\x58\xfc\x41\x83\x23\x9b\xec\x40\x2e\x60\x55\x3a\xa9\x8d\xa5\xaf\x4f\xc0\x07\x47\x57\x12\x46\xd9\x02\x4e\x65\xe0\x27\x88\x21\x18\xf8\xbd\x90\xaa\x7f\xcc\x91\x49\x0d\x07\x5d\x0d\x4d\x76\xd1\x0e\x72\xfa\x2a\x72\x38\x5a\x70\xdc\xc2\x7e\xd7\x73\x3b\x18\xe9\xfa\xf2\xa6\xf1\x2e\x86\xb3\xf9\xb0\xd2\x3d\x96\xa7\xb1\xfb\x88\x59\x3a\xa5\xd9\x12\x2b\x04\xfb\x32\xcd\x8c\x24\x34\x49\x98\xd6\xf5\xf8\x10\xfd\x9f\xb1\xb5\xc1\xb8\xd0\xd3\xa6\xad\x8f\x6b\x42\xb5\x2e\x73\xa4\x1a\x55\x0a\xab\x5d\xf0\x9e\xcc\x7a\xc7\x06\x93\xac\xd4\x86\x29\x98\x07\x24\xcc\xa6\x5c\x27\x90\x44\x76\x7e\x7d\xe9\x48\x56\xdb\x19\xca\x9c\x1a\x9e\x40\x62\xa8\x7d\xb7\x2f\x98\xc6\x45\x52\x9e\x68\x6f\x8b\xf4\x8a\x88\xfd\x00\xc3\x7b\x88\x91\x77\x10\x09\x90\x31\x42\x0d\x39\xdb\x51\x75\xa6\x4a\x71\x86\x42\x42\x1f\x30\x5e\x3b\x3c\x4f\x18\x4d\x12\x59\x0a\x73\x36\x25\x8c\x6d\x45\x35\x4f\xce\x4b\xb3\x1d\x0d\x61\xfb\xb3\x7f\x13\x37\x09\xc2\xb0\x5d\x84\x0b\x20\xbf\x0e\x09\x62\x98\x5d\x07\xa0\x7b\x29\xb5\x19\x3e\xd4\xdb\xc8\x6a\xb4\x0e\x2c\xd5\xfa\x5e\xaa\x41\x8e\xd4\x2d\xf0\x8a\x0c\xd5\x47\xa0\x22\xbe\x48\x2e\x05\x37\x52\xd5\x47\x2e\x9c\xfc\x55\xc5\x73\xc3\x06\xba\x29\x60\x84\x44\x6b\x41\x43\x0c\x26\x46\x2d\x19\x51\x48\x3e\x89\x2a\x32\x59\x09\x89\xe2\x91\x63\x8a\xc7\x97\xab\x72\x4c\x55\x36\x46\x55\x89\x28\x7c\xc5\xa8\x0f\xd3\x15\x87\xf1\xe4\xa4\x28\x95\x21\x46\x59\x18\x53\x13\x42\x0a\xc2\xa8\x40\x2d\x35\x53\x21\x8a\xfa\x05\x4e\xbc\x9f\xc2\x7c\xe2\x07\x9e\xf9\xc4\x4f\xc3\xd7\x7c\xe2\xc7\xb4\xd5\x81\x9f\x1b\x21\xd0\xe3\x6a\x4b\x4b\x9f\xb2\x27\x17\xb4\x44\x50\x2d\x2b\x45\x71\x70\x02\x03\x3b\x18\x11\x83\xdd\x9a\x44\x2b\xe4\x7a\xf5\x29\x66\x64\x95\xe4\xd1\x69\xfc\x45\x62\x3d\x80\x86\x86\x7c\xee\xd9\x00\xa6\xf2\x26\x52\x68\xae\x21\xa8\x1b\xa2\xff\xfd\x1d\xaa\x77\x13\xa5\x22\x97\xd7\x64\x2d\x31\x05\x85\xac\xf6\x98\x47\x8f\x44\x0d\xf7\x14\x22\xca\x7c\xd5\xeb\x4f\x0f\x2e\x26\x18\xb6\x1a\x13\xb0\x1a\x87\xd0\x31\xee\x3c\x1c\xa0\xfa\xd8\xd0\xd4\xb1\x2b\x68\x8c\xbc\x88\xf2\xab\x4f\xf6\xa8\xc7\x5e\x90\x63\x4d\x6b\x11\x86\xb5\xa7\x79\xc7\xa3\x0d\x33\x31\x06\xb0\x2f\x57\x32\x91\x4f\x21\x9d\x26\xe1\x2f\xd6\xac\x35\xc9\x4f\x1d\x6d\xd7\x9a\x66\xd5\x8a\xb5\x69\xc5\x58\xb4\xc6\xec\x59\x51\xd6\xac\x71\x1f\xf4\x74\xef\xf3\x97\x70\x4c\x8f\x61\xfd\x7e\x94\xed\x7b\x3e\xf6\xff\x6a\xc7\xfe\x11\x0a\x2a\x89\x55\x52\xc9\x97\x77\xe6\x47\x5f\x09\x07\x2f\x7e\x92\xb0\xc5\x69\xfc\x63\x94\x44\x42\x41\x8a\x8f\x0c\x4f\x0c\x46\xd5\xcc\x4a\xd3\xc0\x1c\x67\xa5\x69\xf8\xf9\x95\x70\xcf\x59\x69\xea\x7b\x66\xa5\x69\x56\x9a\xfa\x9f\x5f\xc9\xb1\x9f\x95\xa6\xf6\x33\x16\xd8\xf6\x29\x42\xda\x26\x07\x52\x8d\x92\x49\x7c\x00\xdb\xf1\x42\xd7\xc6\x77\x7a\x24\x5c\xed\xf1\x81\x6a\x11\x9a\xe9\xb1\x30\x3b\x1a\x96\xf6\xb8\x80\xb4\x63\xd9\xec\x66\x1f\xcf\xe7\x97\x0e\xb3\x8f\x67\x60\x05\x9f\xd1\xab\x3b\x1e\xea\x75\xec\x20\xaf\x91\x4d\x0b\xcc\x78\x38\x4a\xca\xce\xe1\xab\x48\x38\x54\xad\xb8\x51\x54\xed\xbf\xbb\x39\x07\x2f\xc5\x2d\x36\x88\xbd\x79\xd7\x61\x1f\xed\x40\xa9\xe1\xef\xdc\xe5\xb6\x54\x50\x85\x0f\xa9\xc6\xff\xa9\x3f\xc0\x66\x45\xb1\xf2\x09\x54\x7b\x6a\x3b\xc6\x13\x2a\xaa\x38\x2a\x3f\x24\xd6\x07\xb2\xef\x5b\x04\xdb\x7f\x74\x20\xba\xea\x41\xee\xa8\xf7\x89\x00\x02\xb5\xf8\x3b\xd1\x4d\x9d\x8d\x0a\xb1\xd3\x94\x89\x5e\x3e\x1a\xa2\xe3\xc1\x9d\xb0\x48\xb8\xcc\xe9\xa6\x43\x7a\x87\x51\x4f\x8c\x70\xfb\x5a\xcb\xc1\xd4\x5c\x62\xca\x8a\x4c\xee\x73\xcb\xda\x7a\xc7\xee\x21\xb6\xca\x1c\x11\xde\xf4\xea\xf2\x77\x50\xcf\xbb\xf9\xf7\x66\x2f\xee\xc1\xc8\x41\xaa\x0f\xf7\x05\x11\x72\xea\x2a\xd4\xe9\x2d\xcd\x32\x68\xb8\x20\x4b\x01\xe5\xf5\x7c\x97\x87\x80\x9e\x74\x2d\x53\x57\x1c\xbc\x31\x1f\x68\x66\xd0\x04\x72\xc6\x4c\x72\x56\x54\x50\xce\x70\xe9\x39\x2d\xf4\xd9\x9f\xaa\xff\x5e\xd8\xa9\xff\xaf\x43\xf4\x0d\x54\x34\x0b\x1c\xe1\xa1\x18\xc7\x8a\x0a\xc3\xf8\x3e\x79\x5d\xbd\xe7\x23\x11\xb9\xb0\x78\x02\x57\x62\x55\x94\xb5\x01\x0e\x5b\x6d\xa7\x18\xab\xd8\x99\x69\x55\x49\x74\xc3\x84\xfd\x2f\x96\x36\x3e\x75\x05\x80\x5d\x79\xb0\xd2\xb1\x36\x17\x5b\x87\x6d\x9f\x7b\x98\x72\x3b\xee\xc4\x9e\x96\x87\x3d\xd6\xa8\x6e\x6c\x2e\x14\xe7\x87\xfe\xe5\xc9\x16\x5a\xba\xd8\x9d\x5c\xb1\x2d\xdd\xf1\x9e\x20\x7b\xa8\x68\x18\x9c\xeb\x92\x34\x10\x93\xba\xde\xf2\x29\x81\xde\x05\xb8\xfa\xee\x3c\xc3\x10\x5d\xf7\xea\xbd\xa5\x3c\xd7\x30\xba\x22\x61\x08\x83\x04\xb0\x6e\x95\x5d\xd2\xb3\xdf\xa4\x52\x30\xb2\xe3\x74\xb0\x81\x21\x90\x66\x52\x2a\x05\x17\x80\x6a\xe4\x7e\x4d\x81\x2a\xf6\x8a\xfc\x5c\xd3\xe9\xcf\xa7\xcd\x7f\x2d\x90\x52\x17\x8a\x65\x92\xa6\x4c\xd9\x5f\xa1\x79\xfe\xa2\x26\xe1\xfa\xb7\x1e\x64\xa4\xe4\x67\xb3\xa5\x42\xea\x85\xe6\x29\x4b\xa8\xfa\x79\x49\xde\xef\x98\x52\x3c\x75\x6e\x77\x8f\x5e\xae\x89\xdd\x5f\xc5\xb2\x3d\x91\xa5\xb1\xaf\xf7\x1a\x47\x75\x22\x0b\xd0\xad\xee\x7d\x2d\xf7\x9c\xf2\x0a\x0a\x84\xa8\xea\xb2\x00\x27\x3c\x84\x95\xee\x49\x2a\xed\x50\x5a\x9e\x92\xbd\x2c\x81\xc9\x17\x5d\xa9\xec\x2a\xc3\x73\xed\xe9\xa5\xc4\xd6\x27\x2b\xc5\xe8\x1d\xa1\x06\x8a\x59\x1a\x9e\x63\xb7\x77\x59\x1a\x22\xa4\xe1\x09\x5b\x1e\x6a\x4a\x03\x87\xf7\xa0\xcc\xbf\x2b\x14\x0c\xb5\x5f\x1d\x49\xd7\x3b\x05\x73\xb1\x73\xbd\xa7\x18\x63\xaa\x4a\x01\xc3\xf6\xf6\x68\x80\x9e\x14\x5d\xb1\x1f\x56\xcf\xa9\xda\xc4\xd4\x4c\x3c\x39\x57\x9b\x12\x8b\xf5\x3a\xbe\xc8\x84\x51\x7b\x08\x7e\x45\x3a\x4b\x65\x72\x67\xc9\xda\x4a\x8a\x93\xc1\x96\xb2\xaf\xdf\x5d\xd8\x0d\x86\xc3\xce\x5d\x13\x78\x57\xc8\xb3\x50\x72\xc7\x53\x96\x2e\xc9\x47\xaa\x38\xdc\xf7\x9c\xc6\x9c\x30\x4d\x7e\xf7\xfc\xe3\xf9\x87\x9f\xae\xce\xdf\xbd\x19\xaa\xe6\x6a\x8f\x04\x7b\x28\xa8\x48\x59\x4a\x4a\x5d\xb7\x85\x72\xd8\x3c\x39\xb1\x84\xb5\xe3\x4a\x0a\x10\x55\xe4\x72\x0d\xf7\x03\x1c\x6b\x00\x68\x42\x85\x9d\xdb\x8a\x41\x87\x8c\x6c\xc7\xd2\xd3\xa6\x2e\x9f\x54\x97\x3e\x2e\x8a\xd2\xf8\x20\x12\x20\xbe\xd5\x10\xcc\x52\x20\x53\x4a\x11\x71\x8d\x95\x11\xbd\x17\x86\x3e\x78\x96\xc8\x74\x42\x0b\xdf\xeb\x8a\x92\x54\x96\xc3\x13\xfd\xdd\xef\x4e\x09\x67\xaf\xc8\xef\x1a\xe0\x96\xe4\x8d\x83\xd0\x40\x24\x36\x3b\x62\x10\x9f\x5c\x23\x6c\x28\x5f\x04\x4b\x84\x66\x56\x1b\x82\x93\x56\xab\xe4\x1e\x71\x84\x55\x55\xe2\x85\x34\x4b\xf2\xda\x63\x6c\x68\xf5\xd0\x79\x28\x8d\xbd\x04\x19\xaa\xef\xf4\x19\x0a\xa1\x45\x4a\x0d\x5d\x34\x8e\xca\x19\x6a\xf8\x8b\x44\xe6\x39\x15\xe9\x82\x3a\x22\x5d\x54\x9b\x7e\xf6\xb5\xab\x2f\xbb\xa0\xd5\x5b\x5c\x2c\xe8\x42\x6f\x59\x96\xf5\x5f\x6e\x82\xf5\x8f\x47\xef\x3c\xe1\xd2\xae\x6e\x0e\x31\x27\xee\x4d\x75\xc0\x10\xda\x92\x5c\x49\xe3\x7a\x3b\x39\xa2\xe0\xa0\xc0\xda\x95\x00\x29\x0d\xdd\x20\xda\x27\x93\xbc\xb9\xba\xfd\xf0\xb7\xeb\xf7\x97\x57\xb7\xa3\x47\x71\x00\xe2\xc8\x01\x8d\x39\x8a\x03\x90\x87\x0f\xe8\xf8\x51\x1c\x00\x19\x38\xa0\xe3\x47\x71\x98\x2d\x0c\x1e\xd0\xe8\xa3\x38\x00\x7b\xe0\x80\xc6\x1f\xc5\x01\xb8\x9d\x03\xfa\x1b\x3f\x8a\x4c\xec\x22\x8e\xe1\x5b\x77\xe3\x68\x10\x66\x85\x6f\x57\xed\xb6\x72\x49\xd7\xea\xe2\x90\xf4\xeb\xa0\x7e\xfa\xaa\x5b\xb3\x7b\x23\x76\x1f\x69\xbb\xd5\x8b\xe8\x9d\x2a\x71\x2f\x0c\xda\x42\x80\x95\xbc\x1e\x5b\x40\x8c\xa9\x6f\x92\x81\xac\x69\x1f\xeb\x9b\xf7\x12\xcc\x7c\x60\xca\x0b\x5a\x7b\x5e\xff\x74\x79\xf1\xe6\xea\xf6\xf2\xbb\xcb\x37\x1f\x9e\x6c\xe2\x83\xa2\xe9\xf1\x36\xbe\x29\xdc\x30\xb8\x88\x9a\x53\x16\x8a\x59\xcd\xb3\x2e\xf1\xde\x4f\x7e\x48\x77\x41\x98\xb5\x32\x89\x6d\x9e\xf6\x95\xc1\xa3\x17\x24\x32\xdd\x20\xc4\x78\x86\xdc\x62\xbd\x41\x98\x53\xd9\xb2\x63\xc0\x41\x98\x9f\x84\x39\xe3\xf3\x78\x16\x1d\x9e\x71\x5b\x93\xba\x60\x6b\x5a\x66\xa8\x71\x3f\x7b\xd6\xb9\x5f\x34\x9f\x78\xb2\xfe\x4e\xc9\x3c\xde\x14\x0b\x3d\xe1\x2a\xcb\x62\x1f\xc5\x9c\xb8\x76\x62\x61\x0f\x6c\x83\xf1\x39\x75\x03\xdb\xf4\x39\x7d\x03\xfb\x01\x05\x20\xc4\x3a\xa6\x2b\xb3\xd2\x5f\xd9\xfe\x03\x0b\x54\x5d\xee\x5b\x2c\x78\x17\x5c\xb3\x2c\x0c\xfe\xae\xcc\x3a\x63\xfe\xe5\x29\x35\x6c\x22\x2b\xd8\x3c\xbd\x74\xd6\xa4\x1a\x26\xb1\x55\x66\xbe\x5c\xf7\x86\x7f\x3e\x49\xed\x98\xd8\xca\x31\x93\x70\x3e\xa5\x6a\xcc\xe4\x38\x99\xa8\x65\x3d\xae\x68\xcc\x94\x92\x31\xb1\x05\x63\x62\xca\xc5\x44\x17\x8b\x81\xbd\x9e\x7a\xfe\x4f\x6a\x06\x80\x7d\x78\x1d\x5d\x17\x32\x7d\xe5\x2d\x49\x9a\xe4\xcc\x50\xab\xfb\x2e\x2d\x41\x8e\xd3\x4e\xeb\x75\x30\x4d\x9f\xd6\x7f\x83\x8e\x2b\xba\xf1\x07\xe0\x92\x68\xf1\x1b\x07\xad\x0b\x96\x2c\x85\x4c\x99\x3d\x84\xa7\xf8\x4f\x27\xdb\xcf\x31\x0f\xda\xfd\x60\xa8\x29\xf5\x72\x2b\xb5\xb9\xbc\x8e\x00\x8b\xaf\x17\x32\xbd\xbc\x3e\x6d\xfd\x4b\x07\x45\x10\x99\xc8\x06\x63\x1a\x55\xd4\x4f\xa8\x65\x05\x54\x9b\xa7\xf0\x9f\xdf\xd9\x8d\xbb\xa6\x66\x1b\x45\xfd\x5c\x93\x7b\xc5\x8d\x61\x02\x34\x15\xe8\x01\x2c\xd7\xa7\xf6\x24\xd4\x82\x77\xf7\x32\xd0\xad\xa2\x7e\x26\x1d\xfc\xb5\x9f\xe6\xe4\xa5\x43\xf8\x81\x5b\x37\x52\x69\xed\x17\x8f\xd0\x06\xfd\x53\x77\x20\x3a\xbf\xbe\x24\x3b\xc4\xe7\x91\x97\x19\x7f\xf2\xd7\x91\xbb\x16\x7d\xfe\x7d\x37\xdb\xef\x9e\xc8\x07\x3c\x9c\xaa\x06\x82\x57\xa6\x5f\x41\x47\xb3\x51\x7c\x55\x5d\x75\x49\xc6\x73\xee\x3a\x5d\x5a\xbc\x30\xab\xe7\x3d\xc7\x3f\x2e\x93\xa2\x3c\x75\x2f\x2c\x73\x96\x4b\xb5\x1f\x3f\xa5\xee\x75\x56\x6c\x59\xce\x14\xcd\x16\xda\x48\x45\x37\xec\xb4\x02\x8f\x60\xab\x7f\x21\xe0\xf1\x53\xd9\x98\x60\x17\x3a\xde\x65\x9c\x47\x21\xdb\x7b\xae\xc8\xd2\xa3\x72\x86\x0a\xcb\xe3\x15\x50\xf0\x19\x70\x61\xa1\x4e\x53\xd1\x21\xa8\xb1\x3b\x99\x95\x39\x8b\xe0\xae\xa4\x21\x9f\xe1\x4b\x26\x76\x56\xe9\xd5\x47\xd7\x02\x52\xbe\xe3\x3a\xae\xd9\x6b\x8f\x12\xc0\x5d\xff\x5d\x59\x9a\xa2\x34\x76\xa6\x39\xf6\xe8\x8a\x65\x05\xbe\x0d\x48\xa3\x03\x74\x8b\xff\xbd\x0c\x37\x8b\x7b\xc4\x82\xfd\x48\xd3\xb7\xf6\x83\x67\x29\xf5\xc9\xac\xd8\xdf\x91\xf7\x25\x9e\x7b\xf9\xa9\x1c\x8b\x79\x61\xac\xd2\x71\x2e\x30\xed\x1a\x00\x50\x72\x25\xea\x26\x30\x5c\x7e\xa7\x7e\x7e\xa9\x3b\xcf\xb1\x6a\x76\x3e\xba\x62\xe7\x7c\x8f\xfa\x2d\xdd\xa3\x1e\x53\x79\x6c\x7a\xed\xb1\x2f\xfe\x12\x15\xf1\xda\x78\x60\xdc\x60\xe2\x7c\x04\xfc\x51\xe3\xfd\xb0\x25\xab\xd7\x80\xef\x35\x31\x23\x49\x21\x8b\x32\xa3\x66\xc0\x04\x1a\x76\x23\x35\x42\x42\x1c\x83\xaa\x8d\xb4\xb5\x4b\x0e\x65\x53\x3e\x62\xba\x6e\x19\xad\xc9\x79\x96\x11\x2e\x90\x41\x01\x58\x6f\x0d\x55\x0c\x95\x2c\x42\xd1\xbc\xbf\x1b\xb6\xe3\x43\xf7\xac\xd6\x34\xed\x25\x47\x1b\x8a\xdd\x1d\xc9\x8f\xd0\xbb\x0e\xd8\xaa\x33\x36\x72\x41\xf2\x32\x33\xbc\x18\xb4\x4d\x56\x6a\x41\xd5\x00\x98\x50\xad\x65\xc2\xa9\x77\x43\x12\x6c\x1f\xaa\x8d\x5f\x38\xcc\xdc\xd0\xbb\x21\x90\x85\x62\x09\x4b\x99\x48\x18\xb4\x92\x2f\x59\x8d\x43\xac\xa1\xf0\x46\xec\x2a\xbb\x6d\x89\x3e\x26\x14\x06\x16\xf2\x10\x45\xd1\x3b\xd6\x82\xfc\x29\xbc\x2d\x96\xe8\x9c\x55\xb4\xe1\x74\x01\xf9\x54\xdd\x14\x7c\xb7\xfc\xc1\xd3\x55\x47\x8b\x3d\xc1\xcd\x52\x99\x3a\x47\xd4\x84\x8e\x4c\xad\x0d\x45\x6d\x59\x7a\x04\xf3\xeb\x9c\x3d\xd3\xfb\x7c\xce\xa4\xb9\x4f\x93\x09\x17\x25\x44\x8a\x91\x6e\x8d\x87\xb1\x50\x8d\xd2\x29\x3c\x65\xc2\xd8\xcb\x0d\xc4\xf0\x15\x8a\x15\x4c\x80\xa9\x83\xd1\x64\x3b\x2a\xe4\x1c\xab\xae\xad\xf7\xb5\x13\xf1\xb8\x8e\x42\xd4\x23\xa7\x1e\xc0\x9b\x3e\x4d\x76\x3e\x7d\xbf\x9e\xd3\xe7\x36\xf8\xb3\x1d\xbd\x27\xea\x56\xbc\x2f\x26\xbc\x67\xe9\x27\x17\x8d\xc0\x22\xa0\xbe\xc9\xb4\x53\x87\x7d\x9e\x01\x94\x21\x12\x81\x40\x61\xb4\x77\x72\x5d\xb3\x89\x2a\x5c\x78\xcb\x37\x16\xf9\x19\xdb\xb1\xcc\x49\x46\x82\x55\x5b\xf3\x61\x65\xc9\x48\x6f\xe9\xb0\xda\xbe\xc4\x60\xd4\x96\xea\x04\x53\xb2\xec\xc4\x92\x76\x26\x29\xc6\xef\x2a\x99\x65\xdd\x6a\xb0\xfe\xc9\xf8\x1d\x23\x17\x55\x44\x3c\xda\xfc\x6e\x0c\x35\x96\x94\x6f\x98\x19\xb2\xa2\x8f\x90\x29\xcc\xe5\xba\xcc\xb2\x6b\x99\xf1\x64\xe0\x36\xdd\xde\x1e\x88\xed\x27\x45\x99\x65\xa4\x80\x8f\x96\xe4\xbd\x80\xf3\x7e\x9e\xdd\xd3\xbd\x3e\x25\x57\x6c\xc7\xd4\x29\xb9\x5c\x5f\x49\x73\x8d\xca\xcc\x10\x4f\x6c\x3a\xa3\xf1\x73\xc2\xd7\xe4\x95\x55\xa3\xb5\x21\x86\x6e\x40\xd1\xf4\x66\xe5\x53\x28\x8d\xd5\x00\x3b\x00\x15\x8e\xf9\x3d\xd7\xbd\xda\xda\x93\x89\xe9\x6b\x80\x64\x59\x12\xfe\xfb\x51\x88\xcf\xf8\x9a\x25\xfb\x64\x28\x3d\xb0\x2d\xc2\xa0\x2d\xac\xf6\x31\xc4\xac\x41\x83\x3e\x41\xc4\xb5\x39\x07\x65\xb5\x37\x8a\x97\xa0\x85\xac\x90\x42\x83\x75\xab\x26\xc7\x6a\x26\x78\x05\xd0\xd1\x1a\xee\xb8\x00\x29\xa4\x36\x37\xf6\x96\x30\xcc\xfb\xda\xb4\x75\xed\x3f\x20\x10\xc1\x9f\x65\x2c\x25\x3c\xcf\x59\x6a\x6f\x05\xd9\x9e\xd0\x35\xd4\x0a\x8e\xea\x28\x66\x21\x28\x86\x5b\x7e\x89\xc2\x68\x4b\x45\x9a\x31\x45\xd6\x94\x67\xee\xe6\xd1\xba\xd1\x18\xa6\x72\x2e\xec\x27\x01\xb8\x68\xcb\x86\xcb\x8f\xbd\x3c\x25\x89\xc4\x66\xf7\x46\xc2\xd5\xde\xfd\x54\x9f\x0d\xe0\xdf\xa3\x5c\x83\x34\x4a\x22\x57\x53\x5a\x65\x32\xb9\xd3\xa4\x14\x86\x67\x2e\x2b\x4b\xde\x91\x44\xe6\x45\x06\xb4\x1a\xd7\x76\x65\x22\x91\x57\xff\xb9\xa8\x28\x63\x61\xc7\xd5\x67\x5f\xd7\x3f\xc1\x1f\x86\x45\x64\x9c\x6e\xc1\x1e\x58\x32\xa1\x14\xb9\xe5\x32\x16\xf9\x52\x64\x7b\x22\x45\xa5\x62\x60\xa1\x3c\x88\xc1\x87\x53\x30\x22\x11\x57\xac\x66\x28\x4b\xf2\xe6\x81\x25\xd5\xbf\xf1\xca\x45\xb1\x4b\xbf\x91\x70\x9c\x8e\xd7\xb6\x2d\x10\xa2\x3b\xb8\xe6\xd7\xf8\x15\x10\x27\x90\x06\xfe\x33\xe3\x02\x4e\xb1\x0b\xdb\x8d\xb0\x0b\x61\x15\xee\x36\x7d\xe1\x09\x70\xfa\x15\x49\xb9\x62\x89\x91\x6a\x3f\xa1\x11\x9c\x9f\x8f\x9d\x9f\x92\xd2\x90\xe7\x27\x67\x27\x2f\x3a\x46\x8d\x13\xdd\x68\x85\x1f\x63\x1b\xbd\x6d\xc0\xb6\x02\x80\xe7\x45\xb6\x87\xd5\x9e\xa4\xa7\x84\x1b\x1f\xe1\x13\xa8\x2f\xde\x7d\x5c\x4c\xf3\x29\xd1\x92\x18\x45\xab\xac\x23\xf8\xab\x05\x03\x55\x75\x80\xd3\x3e\x3f\xf9\xe7\x49\x8c\xe5\x91\x99\xe4\x05\xb9\x97\xe2\xc4\x00\x1a\x97\xe4\x16\x73\xd9\xaa\xa1\xf6\xb2\x24\x82\x61\x0a\x12\x7b\x28\x32\x9e\x70\x13\xe1\xe1\x23\xc0\xfc\x88\x2c\x0d\xe6\x45\x50\xe3\xe3\xb1\xdf\x3c\x70\xe3\xdc\xe7\x96\xfe\xbf\x01\xca\x40\x36\x17\x83\x02\x4d\x32\xbe\x63\x67\x5b\x46\x33\xb3\xc5\x4a\xea\x42\x8a\xc5\x3f\x98\x92\x10\xb5\x2d\xdc\x2f\xe3\x9b\x14\xb4\x6f\x34\x9f\x49\x36\xd7\xb0\x0a\x79\xf8\xde\xa8\xb9\xd1\xb2\xbe\xef\x27\xf5\x54\xf9\xcb\xed\xed\xf5\xf7\xcc\x1c\xb0\x04\x0b\xc7\x3b\x30\xe1\xea\xc8\xd4\x5a\xaa\x11\x52\x8e\xe7\x0d\x43\x45\x46\x43\xf3\x94\xda\x60\x56\x17\x0a\x73\x61\x6f\x7c\x46\xb6\xbc\x6c\x91\x87\xb8\x90\x29\xb9\xbc\x5e\x92\xbf\xc9\xd2\xce\x79\x45\x57\xd9\xbe\x4a\x0d\xd2\xcc\x90\x67\x76\xb0\x67\xf6\x54\x5b\x3c\xfc\x85\xd1\x74\x58\x4f\x6d\x3e\xf6\x48\x31\x3a\x18\xee\xdf\x98\x45\x3c\x89\x34\x66\x30\x95\x95\x96\xda\xc8\x9c\x6c\xf1\xe3\x83\x18\x6b\xb7\xb7\x31\xbc\xc9\x52\x88\xcf\x62\x54\xac\x80\xa3\xe7\xa1\x1e\xf1\xd8\x74\xa8\x12\x57\x5d\xa5\x09\x6a\xab\x06\x35\x97\x14\xe5\x50\x30\xb2\x8e\x96\x14\xb8\x14\xbb\xe5\x51\xbe\x9b\x69\x1d\xf5\xa6\x74\x98\xeb\xb1\x66\xe0\x9a\xdc\xe5\x2c\x60\xf0\x3f\x7c\x26\x76\x58\x8b\x88\xca\x8e\x9f\x26\x80\xfa\x34\xf3\x8c\x6f\x90\x36\xe2\x20\x69\xbf\x18\x3b\xe3\x09\xdd\x21\xe3\x79\x38\x21\x45\x54\xac\x52\x6f\xa1\x14\x97\x4b\xef\x72\xe7\x81\x90\x87\x0b\x12\xf7\xcd\x2f\x0a\xf5\x85\x1c\x6b\x1b\x4c\xe0\x46\xb0\x7f\x3f\xea\x53\xb7\xe8\xc6\x91\xb9\x30\x6c\x13\x71\x5e\x17\x13\x03\x3e\xba\x09\x10\xca\xd5\x89\xae\x63\x0e\xb1\x72\x32\x22\x2f\x62\xdf\x65\xc7\x3b\x75\x85\x00\xbd\x11\xca\xb3\x4f\xc8\x86\x7e\x19\x43\x49\x92\xfc\xf1\xbf\xff\xf7\xdf\xff\xf7\x25\x4e\xb1\xf2\x65\x09\x72\x79\x7e\x75\xfe\xd3\xcd\xc7\xd7\x10\x3c\x3f\xbe\x8b\x0f\x8b\xfa\x3e\xb3\xe0\xc2\x2c\xa4\x5a\x20\xa6\x5e\x11\xa3\x46\xa9\x1a\xa2\xfb\xa6\x36\xf0\xba\x81\x8f\x9a\x05\x0b\x9c\xe4\x75\xf7\x3f\x5f\x38\x23\x46\x8c\x34\x2d\x1f\x96\x7c\x8f\x48\xb7\xb1\x7d\xa5\x06\x3b\x1e\xb5\x47\x1c\x77\xea\x26\xc5\x8d\x4c\xee\x26\xe9\x59\x27\xb7\xaf\xaf\xf1\xa3\x86\xaa\x05\x35\x32\xe0\xf2\xc5\xc5\x4e\x66\xbb\x71\xb2\xa7\xe4\xf6\xf5\x35\x2c\x64\x09\xff\x05\xf7\x52\xb8\x1a\xec\x2d\x64\x1f\x48\xe6\x4c\xc0\xf6\x1a\x31\x76\x09\x47\xa8\x8a\xd1\x8c\x6b\xc3\x13\x80\x5a\x9b\x48\x2c\xfc\xb0\x65\xf8\x93\x6a\x7d\x27\xef\xbd\x31\x79\x5c\x01\x8c\x3b\x8c\x0d\x05\xf0\xa8\x4d\xdb\xfe\x75\x39\xa7\xe3\x98\x18\xe7\x37\x73\xce\x83\xe7\x97\xe5\x2d\x11\x2f\x15\x8a\xdd\x18\x19\xa8\x3f\x7b\x60\x61\xc4\xd7\x07\xec\x8b\x2b\xb6\x96\x8a\xc5\x1b\x18\x6b\x83\x21\x49\x4b\x38\x89\x54\x40\xec\xb3\xbf\x2b\xca\xa6\xe9\x2f\x18\x63\x61\x1f\x5d\x26\x5b\x7f\x47\x17\x4c\xeb\x33\x30\x25\x96\x05\xea\xe8\x60\xb6\x2c\x15\x3b\xb5\x6b\x66\x39\xac\xe8\x34\x26\x4e\xd0\x2e\x86\x09\x7c\x9d\x99\x04\x43\x4c\xbc\x2d\xd4\x59\x52\x3c\x32\x0e\x4c\x90\x21\xa8\x8a\xea\x2d\x83\xbc\x32\xf6\xc0\x8d\x2b\x59\xa3\x18\xd5\x12\xdb\x6f\x78\xe4\x00\x3f\xd7\xd0\xd8\x0b\x0c\x21\x21\x49\x52\x4f\x0c\xc1\x5d\xcb\xf4\xe4\x44\xb7\x40\x6d\x14\x4d\x98\xbd\x81\x73\x99\x12\x48\x48\x48\xe5\x7d\xc8\xb5\xb5\x62\x1b\x2e\xb4\xdf\x5b\x2c\xbe\x83\x44\x60\xb9\x39\x03\x0b\x93\xcf\x7f\x5f\x92\x0f\x55\xb2\xdd\xb8\xa5\x56\x96\x26\x91\x35\x93\x70\x33\x3f\x34\x2c\x43\xd8\x0a\x6c\x7d\x49\xb3\xa0\xf1\xa7\x22\x27\x1f\xf3\x63\xc6\x51\xe0\x2c\xcc\x01\xa8\x0d\x02\x9c\x6a\x61\x0e\xa1\x40\x35\xbe\x1a\xdc\x1f\x6e\xef\xc8\x34\xd9\xb6\xfd\x2e\xb3\xb1\x7a\x36\x56\x87\x9e\xd9\x58\x3d\x1b\xab\x67\x63\x75\xef\x33\x1b\xab\x67\x63\xf5\x6c\xac\x1e\xff\x76\x36\x56\xcf\xc6\xea\xd9\x58\xdd\xf3\x7c\x89\x26\x97\xd9\x58\x1d\xfe\x7c\x36\x56\xcf\xc6\xea\x00\xd4\xd9\x58\xdd\xfb\xfe\x6f\x81\x73\xce\xc6\xea\xd0\xc7\x5f\x98\xb1\x7a\xe4\x05\x6f\xf5\xbd\xb6\x3a\x6e\x4c\x24\xf6\x35\xd8\xd8\x78\xe2\xcc\xc3\x72\xdd\x8a\xea\x45\x60\x8d\x12\xd3\x03\x13\xaf\xf3\x01\x7d\x4c\xab\x33\x02\xd7\x46\xe7\xde\x98\x60\xb0\xe7\x0d\xc0\x8c\x8f\xae\xf6\x21\xf0\xfa\xac\x90\xf8\xff\x6a\x4b\x5e\xc3\x84\x87\x7a\x7f\xff\xa1\x1f\x67\x62\x61\xdb\xdd\xa3\xec\x76\x6d\xcb\x5c\x80\x78\x9e\x60\xb3\x8b\xe3\xce\x51\xb6\xba\x47\xd8\xe9\xe2\x6c\x55\xb1\x36\xba\x43\x0b\xdc\x08\xd8\x68\xfb\x5c\xd3\xfa\x36\x02\x33\xce\x36\x37\x64\x79\x1b\x53\xd1\x06\xec\x72\xa3\x56\xb7\x11\xb8\xfd\x36\xb9\xa0\xc5\x6d\x6c\xa6\xbd\xf6\xb8\xa0\xb5\x6d\x1c\xb1\x91\xb6\xb8\x28\x83\x42\xb4\x38\x8c\xb9\xbb\x45\x70\x6e\xe7\x56\xbb\xdd\x2a\xa6\xb7\x32\x0b\x9c\xa4\xd6\x29\x7a\xc7\x05\xcf\xcb\x1c\x5a\xbb\xdb\x03\xc3\x77\x95\x87\x4e\x57\x14\x8f\x3c\x34\x68\xdd\x5a\x31\xec\x0e\x9f\x32\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\xb6\x74\x07\x1c\xa7\x4c\x12\xc6\xa0\x86\xf9\x45\x94\xc1\xec\xf7\xcb\x6a\x76\x55\x41\xc4\x97\xc3\x3b\x83\xd5\x5d\x40\x63\xf9\xfd\xb7\x23\x98\x0c\x6b\x35\xa3\x26\xcc\x4f\x61\xbe\x8c\x63\x93\xe3\x0a\xec\x64\x93\x65\x44\x31\x9c\x4f\x62\xae\x8c\x32\x55\x46\x9e\xa2\x68\x13\xe5\x74\xf3\x24\xec\xef\xd8\xe5\xe5\x31\xa6\xc9\x28\x2e\x32\xd9\x24\x19\x63\x83\x7e\x94\x39\x72\x8a\x29\xf2\x51\x75\x5e\x1e\x6b\x82\x9c\x74\xef\x88\x36\x3d\x1e\xc7\xec\xf8\x49\x6a\x2a\x45\xe0\x25\xce\xcc\x18\x6d\x62\x8c\x33\x2f\x8e\x9b\x16\x8f\x69\x56\x8c\x44\xed\xf8\xa5\x38\xe2\x42\x3c\xe5\x32\x3c\xe1\x22\x3c\xd9\x7c\xe8\x90\x34\xb2\xad\xb1\x17\xe0\x83\xeb\xed\x08\xd4\xc7\x5d\x7e\x9f\x70\xf1\x8d\x31\x17\x7e\x12\x53\xe1\x34\x33\x61\xd4\x6e\x8f\x1f\xee\x91\xeb\x7b\xc4\x51\xe5\x82\x1b\x4e\xb3\x0b\x96\xd1\xfd\x0d\x4b\xa4\x48\x03\x9c\xfa\xa0\xd4\x41\x45\x73\x1a\x3f\x74\x9a\x5b\x3b\xca\x66\x4b\x5d\xb5\x9c\xa0\xdf\xdb\x05\x28\xf9\x9b\xbb\x13\x2e\x50\x1b\x11\x67\xf8\x98\xec\xe5\x23\xdc\xaf\xc9\x51\x55\x44\x0c\x0c\x9a\x86\xe6\xbf\xc8\x7b\x22\xd7\x86\x09\xf2\x9c\x0b\x8f\xe9\x17\x0d\xe5\xb0\xd6\xb5\x43\x24\xe7\xc8\xd3\x7e\xf7\xf2\x1b\x0f\xe6\x73\xa9\xca\xa0\xd4\x43\xbb\xc1\x27\xdf\x3a\x1c\xa8\xa7\x5c\x3b\x1c\x88\x75\x99\xb5\xaf\x1e\x78\x1d\x89\xbd\x77\xbc\xac\x4b\xa2\xbc\x84\xb9\x54\xb4\x6c\x6f\x93\x2e\x98\xb1\x8b\xf0\x20\xc4\x5f\x60\x2b\x22\x5c\x02\x8f\x72\x07\xa0\xc1\x7f\x44\xc4\x4e\x72\x05\x34\x8d\xfd\x01\xb8\x53\xdc\x00\x9f\xe4\xf6\x74\x44\xd3\xff\x14\xb3\xff\xaf\x4e\xb3\x89\x30\xef\xff\x86\x34\x9b\x5f\x42\x17\x30\x3c\x67\xb2\x34\x47\x52\x03\xb0\x0b\x68\x83\x23\xf3\x70\xbd\x22\x59\x1e\x34\xe8\x78\xe9\x00\xf6\x4a\xa9\xe3\x45\xd4\x7e\x61\x5a\xc2\xc8\x3e\x0d\x5f\x92\x07\x9b\x00\xd5\xba\x58\x5d\xa3\x9c\x6a\x42\xc9\xc5\xd5\xcd\x4f\x6f\xcf\xff\xfc\xe6\xed\x92\xbc\xa1\xc9\x50\xa9\xf0\x46\x95\x10\x81\x0d\x11\x91\xf6\xb7\x74\xc7\x08\x25\xa5\xe0\x7f\x2f\x5d\x93\xcd\xe7\x15\xc4\x17\xde\x6b\x32\x00\x74\xac\xbe\xca\x08\xcf\x80\xc6\x01\x13\x2a\x55\x62\xa3\x01\x34\x23\x4b\xab\xe6\x2b\x99\x1f\xba\xfd\xde\xd8\x9f\x86\x59\x14\x45\xde\x03\xfd\x49\x37\x7c\xe7\x0c\x76\xae\x04\x4d\xa3\x8f\xab\x25\x49\x4b\x09\x56\x1a\xd2\x15\x98\xa9\x07\x39\x94\x60\xc6\x52\x5f\x75\xe3\x90\x42\x37\xf3\x2f\xec\x8d\x44\x9f\x92\x55\x09\xa6\xfa\x42\xf1\x9c\x2a\x9e\xed\x9b\x43\xd0\x6c\x88\xdf\x5c\x49\x2f\xa1\xf7\x28\x8e\xeb\xe9\x5f\xbc\x7f\x73\x43\xae\xde\xdf\x42\x4f\x24\x2b\x59\xc1\x8a\x0e\xbf\x03\x62\x56\x6c\x18\x0d\xae\xb6\xf5\x92\x9c\x8b\x3d\x7e\x82\xe7\x9c\x6b\xe8\x24\xcc\xa0\xf3\xbd\xbb\x95\xfb\x52\x50\xcf\xbe\x59\xc2\xff\x0d\x95\xbd\xa6\x69\xaa\x2c\x37\xaf\x9c\x10\x07\xf9\x03\x96\xcb\x02\xbf\xe7\xab\xac\xb1\x77\x0e\x7b\xbf\x58\x67\xb0\xca\x99\x78\x6d\x97\xdd\x6c\x10\x56\x6d\x24\x20\x04\xeb\x95\x42\x13\xd2\x41\x3e\x30\xda\xd7\x2c\xb2\x5e\x65\x3d\xa1\xe8\x7a\x79\x35\xbf\xf6\xc2\xd4\x1d\x0a\xd9\x28\x69\x4d\x2e\xaf\xfd\xb6\x84\x05\x1a\x94\x11\xab\x64\xa1\x2b\x06\x0d\x80\xd1\x24\x71\x4a\xbe\x21\x7f\x22\x0f\xe4\x4f\x20\x5a\xff\x18\x02\x16\xc7\x41\xe3\xd4\x5a\xd4\xda\x2e\xaf\xa3\xb1\xf2\xa3\x3d\x02\xf6\x1b\xbb\x72\x23\xc9\x8a\x8b\x14\x3b\x34\x3d\x18\xa6\xec\xc1\x76\xd8\x7a\x72\x85\x43\x3b\xc8\x51\x37\x0c\xac\x13\xe4\x72\xdd\xa8\x15\x16\xd6\x14\x27\x6e\x99\x05\x6d\x35\xd9\x2b\x24\xf2\xb0\x79\xba\x55\xb1\xac\x1e\x29\xa7\x26\xd9\xb6\x4f\x90\x15\xe1\xba\xd1\x44\x39\xac\x0c\xa7\x12\x6e\x08\xe8\x0e\xdc\xf2\x20\x55\x1e\x97\x90\x26\x35\xdf\x6b\xed\xc2\x01\xa6\x0f\x14\xc5\x11\x25\x3c\xf5\x92\xb5\x91\x0e\x55\xc8\x14\x45\x35\x4c\x2a\x6d\xb0\x1b\x2f\x95\x83\x40\xbb\x12\xdb\x85\xa8\x54\x57\x67\xa0\x2f\x7b\x12\x5c\x37\x4e\xa8\x60\xa9\x46\x32\x16\xec\x69\xa9\x7a\xe0\x05\x37\x26\xea\x7c\x14\x4a\x1a\x99\xc8\x60\xcd\xc8\xb6\x49\xd8\x7d\x00\xcb\xc0\x6b\xa5\xbf\x89\xff\x70\x71\x7d\x6a\x6f\x84\x50\x3c\xef\xe6\xf5\x98\x55\xae\xd5\x1e\xee\xf6\xf5\x75\xb0\x4d\x4d\xc4\x62\xc6\xcb\x79\xb7\x58\xf8\x90\x5a\xfe\xb4\xda\x93\x8a\xd1\x94\x1f\x2d\xb6\xc6\xb7\x3a\xac\xa0\x4e\x09\xb2\xc9\xe5\x8e\xa5\x28\xc0\xeb\x96\x89\x29\x34\xe4\xd5\x81\xc8\x9b\x71\x1d\xf2\x33\x58\x06\xe7\xc8\x9b\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x02\xef\xcc\x91\x37\x73\xe4\xcd\x1c\x79\xd3\x8b\x96\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x1a\x2f\xcd\x91\x37\x6e\x52\xff\x32\xfe\xa9\x39\xf2\xa6\xfd\xcc\x91\x37\x9d\x51\xe6\xc8\x9b\x2f\xc3\xa7\x36\x47\xde\xf8\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\xe6\xe0\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\x26\xbc\x4f\x55\x37\xef\x18\x17\xca\x6b\x99\x17\xa5\x61\xe4\x43\xd5\xae\xbe\xea\x99\xbe\xda\xa3\x5f\xb0\x71\x38\x3e\x95\x9b\x03\xdb\x76\x95\x0a\x42\x45\xce\xb0\x16\xe2\x22\xc1\xa9\x2d\xaa\xf5\x2c\xaa\x99\x9c\x3d\xd6\xd5\x81\xbd\xf3\x87\xe9\xa1\x8e\x8f\xb9\x8e\x62\xfc\x51\x8c\xab\x8d\xf1\xb7\x30\x85\x86\xa1\x05\x9b\x45\x3d\x00\xf9\xd2\x5c\x96\x58\x02\xd2\xad\x3e\x30\x76\x85\x17\x34\x13\x7d\x3e\xb4\x93\xf8\x9e\xc1\x4c\x7f\x66\xec\x7f\x70\x93\x38\xc4\xbf\x63\x1f\x8f\xc3\xbf\x3f\x32\x10\x81\x50\x8d\xc0\x35\x91\x39\x37\x56\x4f\xb1\xca\x5e\x23\x5a\x28\xe4\xd5\xe0\xa6\x65\x43\x75\xd4\x02\x3e\x47\x6a\xb0\x0a\x6a\xe5\xe6\x68\xf6\x5c\xf3\xdd\xd4\x42\xe8\x82\xca\xb7\x95\xb6\x04\xbb\xbe\xf0\xcd\x77\x81\x71\x7e\xd1\x14\x34\xf2\x82\xd5\xf7\x15\x37\xfb\xd7\x52\x18\xf6\x30\xa0\xc1\xb4\x89\xe1\xc6\x7d\xe2\xba\x0a\xea\x4a\x95\x72\x4e\x4c\x55\x0a\x88\x6a\x88\x10\x25\x31\xc8\xc2\x6e\x63\x67\x7e\xa2\x80\x15\xf6\x60\xce\x06\x40\xc6\x6d\x85\xa1\xfa\xae\xde\x07\xb6\xb0\xc2\xa9\x46\x77\x67\xac\xc7\x32\x4e\x60\x31\xd7\x8a\xef\x78\xc6\x36\xec\x8d\x4e\x68\x06\x7b\x1e\xab\x02\x9c\x0f\x7c\xef\xbb\x2a\xea\xaa\x8b\xe6\x50\xc7\x6c\x37\x4f\x50\xea\x12\x2a\xc8\x86\x72\x41\x72\x8b\xa3\xc2\x83\x85\xee\x7b\x02\x3a\xbc\x15\x54\xd9\x0b\x81\xfb\x20\xa4\x71\x41\x60\xd8\x4a\xca\xcc\x79\x64\xb3\x7d\x3d\x27\xe7\xea\x17\xf2\x27\xc1\xee\x7f\xb2\xe3\x68\xb2\xce\xe8\x26\xd4\x8b\x9a\xb8\x8a\xb0\xcc\x74\x4a\xb6\x54\xd3\x21\x43\xe8\x08\x31\x06\x0d\xea\x1f\xa1\xd8\x81\xb1\xb7\xdd\xf7\x2b\xf2\xf2\x05\x50\x2d\xd5\xa4\x82\x1e\x32\xaa\x7c\xfb\x02\xac\x2f\xaf\xcf\xaf\x7f\xba\xf9\xdb\xcd\x4f\xe7\x17\xef\x2e\xaf\xc6\x8e\x68\xb8\x4f\x69\x42\x0b\xba\xe2\x19\x0f\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4b\x95\x2c\x70\x9d\xaa\x14\x10\xaf\x59\xc7\x60\x45\x18\x32\xbc\x0f\xaa\x0a\xef\xc4\xd6\xdc\xed\xa1\x36\x8a\x0a\xe3\x95\x9d\xb1\xfa\xdc\x88\x66\x55\x0a\xab\xa8\x3e\xd5\xe3\x46\xd3\x29\x41\x09\xe7\x69\xca\xd2\xd6\xd4\x8f\xec\x03\x7a\xed\x41\xef\xeb\x88\x51\x72\xfd\xfe\xe6\xf2\xff\xc6\x8f\x4a\x1c\x8d\x44\xb9\x07\x8e\xe4\xc1\x26\xc4\x92\xc9\x04\x4c\x7e\x70\xd1\x3d\x33\x2e\x07\xde\x19\xa9\xe4\xef\xb9\x4a\xe4\xe1\xfe\x50\x8a\x76\x64\x7e\x0d\x81\xe4\x32\x65\x4b\x72\x8d\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\x6b\x3f\x16\x86\xd3\x2c\xdb\x13\xab\x89\xed\x68\xc6\xd0\x85\xac\xe4\xe0\x6d\x85\xd4\x25\xb5\x30\x2e\xb5\xc9\x35\xd6\x34\xd3\x81\x03\x1e\xc3\x07\x2d\xab\x7f\x67\x95\xc9\x48\x3c\x55\xef\x93\x94\x09\x69\x9c\x5e\x6a\x47\x82\x80\x5a\x25\x13\x82\xba\x29\xba\x21\x02\xab\xaa\xc3\x89\x2a\x66\x09\x2c\xd6\xb3\x41\xae\xfd\x5a\xaf\xab\x31\xe1\x26\x1e\x80\x59\x6a\xa6\x0f\xa4\x8d\x63\x83\xb5\xb6\x6a\xc7\x55\x8c\xa6\x10\x1b\x56\x50\xb3\x05\xbb\x66\x00\x68\x4e\xf5\x1d\x4b\xf1\xd5\x25\xca\x61\xa7\x49\x6b\xd7\x01\xc0\x4d\xef\xd6\x62\x61\xcd\xa8\x29\x15\x03\xf9\x1b\x56\x72\x57\x8c\x30\x41\x57\x59\x28\xf2\x2c\x2a\x28\x92\xa6\xef\x45\xb6\xff\x20\xa5\xf9\xae\x0a\xa9\x8a\xdc\xce\x1f\xab\x9e\xe0\xcd\x1b\x34\x08\x5b\x30\x52\xa6\x0b\x40\x13\x04\x72\xc5\x55\x32\xbf\xa8\xb7\xef\x08\xe4\xa9\x4a\x71\xae\xbf\x57\xb2\x8c\x6d\xca\x61\x29\xe8\xfb\xcb\x0b\x38\x55\x25\x9e\x1b\x26\x8c\xda\x43\x50\x64\x27\x83\x67\x5c\x87\x5b\x92\x1f\x2c\x4d\x1d\x50\x91\xd5\xb8\x4a\xa1\x99\x59\x92\x77\x74\x4f\x68\xa6\xa5\x53\xa6\x42\x9a\x91\x20\xd7\xe0\x33\x69\xea\xff\x4b\x02\x31\xce\x18\x77\xb1\x92\x66\x4b\x0e\x5e\x18\x21\xce\x2e\x44\x0c\xdf\x43\x03\x53\x9d\xa0\xc4\xc5\x21\xe0\x10\x71\xd2\x3b\xa6\x49\xa1\x58\xc2\x52\x26\x92\xc0\x1e\x36\x6c\x45\x7f\xfc\xc3\x93\xcc\xf7\xb0\xd3\x57\x52\x58\x32\x8e\xdc\xeb\x4b\x91\xf2\x84\x22\x0f\x72\xdd\xac\x6b\x12\x06\xab\xa6\xd3\x31\x29\xc4\xc0\x8d\x70\xd9\x52\x33\x85\xdd\x9d\x55\xc9\x10\x89\x7f\x2d\x57\x2c\x63\x06\x23\x6e\x21\xae\x9f\x1a\x6c\x25\x80\x0d\xe5\xa9\xf1\x84\x11\x3e\xe9\x4c\xe8\x12\xda\x85\xd8\xab\xb1\x21\xa9\x64\x75\xbc\x22\xd5\xe4\x87\xcb\x0b\xf2\x0d\x79\x6e\xe7\xf7\x02\x7c\x2c\x6b\xca\x43\x6a\xbb\x91\xe8\x85\x39\xd4\xab\xd7\x1e\x38\x2c\x03\xe8\x93\x48\x85\xc7\xf0\x94\x88\x90\xcf\x07\xba\xc5\xb8\x15\xda\xeb\x8e\x8f\x31\x76\x9e\x39\x30\xda\xb4\x09\x3d\x40\xce\xa1\x71\xc2\x84\x3e\x44\xce\x01\x88\xe3\x84\x3e\x81\x9c\xa3\x59\xd2\x0f\x9a\xa9\x09\x1c\xe9\x87\xa3\x72\xa4\xa6\x0a\x60\xa9\xb6\xbd\x7a\x24\xcd\x9c\x19\x9a\x52\x43\x09\x0f\x6d\x47\x29\x1a\x1d\x41\x7e\x0b\x1b\x7c\x3c\x7e\xa5\xd9\x5b\x2e\xca\x07\x74\x91\x4d\xb9\x42\xde\xbc\x81\x0f\x49\xe2\x27\x0f\x08\xa7\x45\x91\x71\x0c\x10\x6e\xe7\x51\x06\x30\x83\x87\xbc\x99\x1e\xd3\xa7\xf8\xc0\x51\xa6\x59\x26\x2d\xab\xb4\x52\x9d\x8a\x54\xe6\x01\xb0\x87\x13\xb4\x0a\x13\xa3\xc9\xb6\x69\x61\xef\x21\x96\x49\x42\xea\x5f\x5c\xec\xc5\x5d\x9d\x33\xb6\x63\xc1\xb4\x9b\xc3\xec\x5a\xfb\xbe\x55\x9c\xfc\x0e\x00\x00\x92\xd1\x15\xcb\x50\x78\x20\x95\x44\x3a\x5b\xa3\x68\x28\xfa\x6a\xa6\x64\x36\x25\x18\xe9\x83\xcc\xc0\xbf\x45\xab\xc5\x58\x00\x5f\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5e\xdf\x5a\x0b\xdc\x77\xbe\x8c\xb5\x94\x41\x49\xd4\x59\x8b\x15\x5c\xed\xb5\x80\x04\xf9\x12\xd6\x12\x71\xad\xbf\xe7\x22\x95\xf7\x7a\x3a\xd3\xfd\x11\x3f\xf4\x9c\x21\xb1\xac\xc7\x70\xb1\xd1\x4d\xc6\x4b\x83\xc6\xd2\xe6\x3d\xb5\x8f\xf3\x7a\xe3\x7c\x95\x4f\xdd\xe5\x51\x01\xe8\x5e\xe1\x2a\xb5\xf3\xcf\x3c\x42\x90\x86\x28\x3e\x8a\x37\x1e\x9d\x03\x6e\x72\x4d\x5f\x2b\x0b\xcb\x70\x9a\xdd\x14\x93\xda\x9e\x7d\xff\xee\xe6\xbc\xfd\xb1\x25\xdc\x7b\x48\xb9\xb7\xeb\xb1\xbf\x13\x9a\xe6\x5c\xeb\xb0\x49\x1a\xf0\xcb\x56\xd0\x8e\xee\xb9\xf7\x51\x6c\xb8\xd9\x96\xab\x65\x22\xf3\x86\xbb\x62\xa1\xf9\x46\x9f\x39\x2a\x5b\xd8\xd9\xbf\x18\x81\xcb\x45\xc6\x45\xc3\xe8\x00\x09\xec\x4e\xa9\x83\x09\x26\xd5\x0a\x00\xf5\x98\x69\x3a\x02\x14\xad\xbc\x3d\x08\xc0\xec\x52\xce\xb2\xd4\x19\x22\x30\x1c\xdb\x9e\xe7\xac\xd8\xd2\x05\x08\x8c\x11\xe0\x2e\x67\x0c\xee\xf5\x5b\x29\xa4\xf3\xa1\x63\xcc\xb1\xbb\x4a\xa1\x5d\x02\x26\xe1\x4e\x8e\x9d\xcb\x08\xe0\xa6\xe5\xe3\x28\xac\xad\x4b\x3d\x57\xa3\x81\xf5\x23\x14\x04\x08\x74\x19\x73\x8d\x68\x9c\x91\x95\xf5\x6e\x24\x2a\xdf\xbf\x85\x7d\xa8\x6e\x3c\x13\xd1\x0f\x37\x1f\xf7\x99\xe5\x36\x9e\x09\xf7\xde\x84\x46\x16\xd5\xa9\xbd\xd2\x7b\x1b\xb2\xaf\xb4\x6f\x44\xa3\xc7\xb7\x7b\x5f\x1a\xbb\x15\x8d\x80\xec\x53\x76\x9f\xa4\xeb\xf6\x03\x3d\x82\xbe\x4b\xfa\x74\xde\x03\x7a\x5e\x31\xe3\xc8\x19\x08\x36\xa7\x7b\xb2\x1a\x3b\x2e\x29\xd7\x60\xd6\x04\xa7\x74\x93\x78\x3f\x34\x09\xe9\xd8\x74\xfa\x64\xc7\x3c\x06\xb6\x46\x67\x75\xdf\x34\xde\x27\xbc\x6b\x8a\xba\x96\x29\x86\x8c\x57\x41\xb9\x83\xfd\x0f\x5d\xe8\x3a\xff\x87\x97\xfd\xb5\x66\x21\x24\xc6\x4c\x34\xe3\xc8\x7d\x83\x59\x6c\x9a\x3a\x00\xd3\x59\x74\x5d\xf3\xd5\xd6\x2c\xd0\xca\xb5\xe5\xba\x99\x1c\x7e\x5a\x4d\x3a\xe0\x34\x6e\xb6\x76\x38\x25\xff\x51\x6a\x43\x68\xe5\x7e\x6e\xf5\x9c\xa8\x62\x8e\x81\x9c\x92\x41\x6b\x8a\xcf\xc5\x32\xd2\x4e\x66\xc7\x53\x46\x52\xbe\x5e\x33\xef\x16\x5f\x31\x52\x50\x45\x73\x66\xc0\x8d\x82\xa8\x85\x2e\xbc\x62\x98\x18\xe4\x9a\x50\xdf\xeb\xb6\x8a\x80\x3b\x45\x1f\x2d\x37\x24\xe7\x9b\x2d\xea\x3a\x84\x92\x4c\x8a\x0d\x44\xf4\xd9\x29\x64\x92\x0e\x9d\x44\x60\x0e\x52\x91\x7b\xaa\x72\x42\x49\x42\x93\x2d\x58\x09\xa9\x20\x69\xa9\x20\xc1\xd3\x30\x9a\xee\x17\xda\xd8\x7b\xb6\xd5\x8e\xc0\x94\x86\x18\x18\xf4\x42\x77\x3a\x61\x00\xbe\x38\x46\x22\x5b\x59\x52\x1d\x13\xe7\x2b\xf0\xca\x41\x93\xfc\x06\xa0\xb7\x0e\xd8\x9c\xd2\x7f\xf0\xcc\x29\xfd\x73\x4a\xff\x9c\xd2\xef\xdf\x9c\x53\xfa\x3b\xcf\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x73\x4a\x3f\x3c\x73\x4a\xff\xf4\xb9\xcd\x29\xfd\x73\x4a\xff\x9c\xd2\xdf\x78\xe6\x94\xfe\xce\x28\x73\x4a\xff\x97\x91\xac\x37\xa7\xf4\xfb\x67\x4e\xe9\x9f\x53\xfa\xe7\x94\xfe\x39\xa5\xff\xe0\x99\x53\xfa\xe7\x94\xfe\x39\xa5\x7f\xcc\x85\x96\xf2\x81\x54\xcb\x98\xac\x03\x67\xc0\x6f\xc4\x2a\xae\xca\xf5\xda\xde\x50\xe5\xa0\xb0\xb6\x23\x76\x2c\xd1\x55\xee\x5b\xe5\xe8\x72\xd6\x64\xcd\xcc\x29\xa4\x35\x60\x98\xce\x34\xa0\x2e\x90\x12\xd2\x1a\x15\xd3\x90\x06\x20\xc8\x9b\xf7\xdf\x2d\x1b\x49\x0f\x83\xa6\xcc\xc1\x54\x88\xb1\x98\x63\x98\xcd\x7b\x91\xc4\x38\x25\x6b\xc4\xf6\x45\x82\x3a\xfc\x26\x99\xd4\x18\x53\x00\xa0\x87\x5c\x53\x5b\x2a\x04\xf3\x5a\x07\x37\xa0\x2b\xaf\x18\x13\x44\x16\x4c\xa0\x1f\xca\xb7\x65\x20\xd4\x18\x9a\x6c\x97\x76\x7c\x11\x84\xea\xb3\x43\xab\xd1\x2d\xeb\x65\x34\x47\xe4\x2a\x96\x53\x8e\x03\x10\x9a\x28\xa9\x35\xc9\xcb\xcc\xf0\xa2\x1a\x62\x68\xc7\x18\xc4\x00\x61\x64\x56\x85\x30\x70\x2c\x30\x34\xc5\x43\x4c\xbf\xdb\x58\xed\x97\x20\xc5\x68\xe0\x35\xe8\x46\xa7\x90\xd0\x9e\x17\x66\x8f\x2e\x57\x74\x3c\x71\xa5\x0d\x49\x32\x0e\xe2\x1f\x66\x87\x39\xa1\x30\xca\x69\xc0\xa9\x6f\x20\x57\x14\xd6\xaa\xdd\x62\x45\x0a\x52\xa3\x30\x1a\x1d\x8d\xf5\x30\x6e\x80\x94\x6b\x27\xa3\xf5\x90\x67\x82\xfa\xde\x21\xb8\xd9\x7e\xad\xb0\xdd\x29\x0c\xe1\xc7\x74\x7f\x6a\x0c\x32\x82\x05\x48\x79\x72\x17\xa5\xfa\x50\x41\x8a\xb1\xcf\xf3\x39\x6d\xf5\x19\x29\xaa\x64\x39\xb3\xa5\xc3\x95\x16\xfc\x41\x74\xb3\x05\x22\x10\x6c\x67\x69\x96\x25\xcc\xaa\xd0\xb4\x73\xc2\x70\xb8\x47\x1d\x25\xc3\x54\xce\x05\xb8\x65\xdf\x31\xad\xe9\x86\x5d\x0f\x1a\x78\x86\xd4\x26\xb0\xf1\xd4\xa8\x06\x42\xc8\x40\x87\xaa\xff\x52\xbb\xc4\x4e\x86\x18\x42\x63\x2a\x24\xc7\xb9\x54\x31\x80\xf7\x8a\x1b\x7b\xa7\xe2\x1a\x73\xe9\xc0\xae\x79\x18\x70\x39\x0c\xba\xe9\x84\x7b\xe7\x41\xd7\x20\x2d\x7f\x17\x29\x3a\xae\x56\x8c\xac\x14\x67\x6b\xb2\xe6\x82\x66\xce\x03\x35\x44\x5f\x90\x23\x42\x51\xa1\xd6\xda\xaa\xa6\x52\x78\xc7\x8a\x5f\xc3\x92\xfc\xe8\x16\x61\x54\x29\x12\x3a\x9a\xb3\x2c\x64\xca\x08\x5f\x93\x0d\x78\xbb\x14\x3a\xd4\xff\xf0\xcd\xff\xf8\x23\x59\xed\xad\x44\x04\x43\xa5\x91\x86\x66\x15\x9a\x32\x26\x36\x76\x0f\x80\x41\x0c\x9d\x85\x2c\x6b\xa6\x5f\x7a\xcc\x42\x5d\x15\x5c\xfa\xcb\x6f\xef\x56\x6d\x91\x7e\x96\xb2\xdd\x59\x63\x5f\x16\x99\x1c\x8c\x4b\xe9\x36\xc3\xe9\x17\xbe\x23\xea\x65\x0f\x41\x42\xf1\x85\x08\x92\xf4\xc9\x4f\x64\x2b\xef\x31\x07\xb3\x87\xa2\x6a\x97\x78\x21\x8b\x32\x1b\xee\xda\x43\xc8\x77\x96\x8a\x01\x4f\xa5\x93\x0e\xad\x70\xc6\xde\x93\x03\x17\x7d\x07\x78\x98\xd7\x35\x25\x3c\xba\x38\xfd\xf4\xa4\x8b\x87\x72\x97\xdc\x2a\xf7\xa9\x54\x6c\x49\xbe\xa3\x59\xb6\xa2\xc9\xdd\xad\x7c\x2b\x37\xfa\xbd\x78\xa3\xd4\xa0\x1a\xd0\x9a\x77\x46\x2d\x5f\xde\x96\xe2\xae\xdd\x6a\x21\x93\x1b\xab\xc7\x15\xa5\xf1\x11\x2b\x8d\x55\x0d\x00\xf6\x33\x85\x33\x5e\x09\x01\xea\x7a\xd9\xd4\xb0\xd9\x03\xd0\x15\x04\x3c\x51\x41\x98\x9d\xeb\x10\xa6\x2d\x45\x37\xe7\xa2\x9b\x64\xf9\xed\x37\x7f\xf8\x37\x24\x7d\x7b\xbb\xf8\xb7\x6f\xc0\xf9\xaf\x4f\x91\xb9\x58\xce\x38\xcc\xa1\x75\x4e\xb3\xcc\x5e\x24\x9a\x44\x6d\xb7\x75\x19\xdb\xbb\x69\x8c\x5a\x4d\x0c\x61\x46\x2b\x77\xb7\xb7\x7f\x0b\x68\x76\xdc\x68\x96\xad\x4f\x31\xf6\xae\xca\xb7\x3d\x01\x41\x71\xe2\x78\x97\x95\xea\x5d\xd1\xf0\x38\x35\x6b\x27\xb3\x32\x67\x17\x0c\x9a\xae\x44\x2c\xb3\xf5\xbe\x8f\xd8\xc8\x5c\x7f\xb4\x55\x26\x93\x3b\x92\xba\x1f\x61\xb2\x03\xcb\x04\xaf\x95\x0b\xe9\x69\xdc\x05\xab\x28\x20\x08\xc0\xf3\x91\x3c\x4f\xed\xb8\xd5\x9c\x73\xcb\xdf\x96\xd3\xa2\x80\x46\x63\x6b\x48\x10\xba\xc7\x05\x04\xee\x58\x00\xc1\x75\xd2\xa1\xc7\xe9\xbe\x85\x40\x87\x05\x72\xcf\x7a\xea\x4f\xfc\x06\x14\xf0\xdf\x18\x2f\x32\x21\xb5\x8e\xd4\x61\x7b\xd5\xda\x50\x62\x58\xcc\xc0\xc9\x7c\x72\x1f\x9e\x49\x7d\x8f\xc0\xac\xd0\xe8\xf4\xd4\x8c\x57\xa6\xa4\x60\x4a\x43\x73\x38\xf3\x11\x76\xf4\x75\x46\x79\x28\xa3\x8b\x90\xba\xe1\xd1\xd3\x96\x31\xde\x81\xa7\xde\x93\xc1\x57\x02\xde\xbe\x27\xf6\xe6\x41\x02\x87\x64\xfc\x98\x33\x7c\x2d\x53\xf7\x09\x1c\x52\x2c\x5c\xd0\xa3\x6a\xe9\x88\xdc\xf7\xa3\xb7\xc7\xfb\x58\xaf\xa5\x7d\x56\xed\x5f\xaa\xc3\x8a\x6f\xb9\xa3\x38\xb8\xb7\x47\x3a\xa2\x30\xf4\xa4\x13\x0a\x67\xb3\xd1\x71\xab\x96\x07\x2d\x15\x1a\x37\x21\x48\xc1\xb5\x2a\xe3\x74\xe2\x25\x41\x9b\xb6\xc5\xba\x03\x4b\x4e\x5e\x9d\x3c\xf9\x9c\xe2\x22\x95\x2c\xe8\x66\xa4\x74\xd4\xc1\x5a\x0f\x3f\x24\x29\x43\x05\x83\x69\x50\xd2\xe0\x77\x70\x1b\x05\x17\x5a\x38\x08\xbe\xb3\x93\xf7\xf1\x39\x33\xad\x47\x9f\x53\x41\x30\x38\xf8\x3e\xe8\xc5\x26\x84\x2a\x59\x8a\xd4\xdd\xcf\x2b\x43\xc8\xbb\x83\x09\x5f\x49\x01\x4a\x0e\xe6\x20\x05\xc2\x56\xf1\x69\xc5\x88\x5b\x0e\xf3\x72\xf9\xf2\x9b\x5f\x96\x4d\xde\x1e\x34\xc4\xb3\x18\xb9\xaa\xd8\x24\x9e\x8d\x27\xcf\xc8\x17\xd8\x88\x9e\xd5\x3b\x77\x69\xab\xeb\x67\x70\x5f\x55\x00\xfe\x64\x2f\x63\x2c\xaa\x14\x1e\x21\xcf\x41\xa5\xb1\xba\x60\x23\x2b\xe1\xc5\xa4\x32\x30\x71\x69\xed\xf6\x7e\xb7\x7a\xd2\xd9\xc6\x43\x8c\x44\xdb\x77\x17\x0e\x53\x93\xfb\xba\xe7\x98\xb7\xba\xc8\x3d\x23\xcf\xf1\xcd\x13\x0d\xb1\xa8\x2f\x9e\xbc\xbd\x6e\xd9\x6f\x1e\x8a\x60\x1e\x65\x6b\xe9\x6f\x1e\x0a\x0a\x77\xe8\x62\x0c\x07\x23\x4a\x47\x5b\xca\x0c\xe3\xe0\xcf\x6c\x4b\x77\x0c\xe2\x64\x79\x46\xd5\x60\x26\x81\x83\x2b\xc9\x0d\xae\x0a\x9a\xdd\x32\xb1\xe3\x4a\x0a\xf0\x53\xed\xa8\xe2\x90\x53\x04\xad\x08\x99\xb0\xfa\xe9\xef\x9e\x7f\x3c\xff\x00\xfe\x81\x70\xb6\x1b\xe6\x1e\xb8\x95\x97\x1a\x62\x10\x0e\x56\xd0\x18\xaa\xde\xb8\xb1\xb9\xf6\x6c\xaa\x9f\xbf\xdd\x15\xe0\x75\x7e\x3d\x76\x0e\x79\x69\x4a\x3a\x9c\x4d\x81\x0f\x7b\x48\xb2\x52\xf3\xdd\x53\xcf\xff\xb8\xc6\x53\x49\xc5\xcf\xa0\xf0\xb8\x90\xee\x0b\x3e\x40\xbb\xfd\x0d\x77\x4f\x74\x37\x16\x1c\xcc\x7a\x42\x9a\xf1\xae\xa7\xbd\xc6\xe5\x13\x5d\xd5\xc6\x69\xa6\xb2\xba\x8b\xab\x4b\xb9\x18\xbc\x05\x55\x75\x21\xd3\xae\xd9\x1d\xf2\xb3\x8e\x73\x85\x1d\xde\xcb\x81\x3d\x0a\xec\xce\xd0\xbe\xb8\xe4\xa7\xd7\x32\x2f\xd0\xed\x7c\x38\x58\x6b\x4b\x2e\xf0\x6d\x2b\xf4\x73\x7b\x6d\x2e\x31\x67\x07\xbf\x3c\x5c\xe1\x30\x1b\xc7\xdc\x90\xf3\x34\xe7\xe2\xfc\xfa\x32\x38\xe2\xc9\x1b\xcc\x29\x74\x4e\x4a\xcc\xbb\xf1\x63\xdf\xb3\x15\x64\xd4\x0a\x72\x7e\x7d\x19\x0e\x2e\xa8\xb3\xcf\xe4\x9a\xfc\x0c\x22\xe8\xe7\x25\xf9\xf1\xfc\xc3\xd5\xe5\xd5\xf7\xaf\x08\x8c\xe2\x39\x44\x05\x52\xbb\x99\x5a\xa1\x6d\xa8\xe9\xdb\xa3\xaa\x81\xe5\xa9\x9d\x5b\xca\x32\x66\x18\xd8\xc4\x4f\x89\xde\x96\x26\x95\xf7\x82\x5c\x57\x33\x3e\xc5\xac\x34\xa9\xd8\xb2\x1a\xb2\x67\xaa\x5c\x37\x98\x6a\x6a\xd5\x1c\xb0\xd4\x24\x96\x9b\x78\x4d\xaa\xf4\x99\xf1\xe9\x8e\xbb\x8c\x24\x9a\xa6\x8d\x62\xbf\x1d\xb8\xb4\x34\x5b\x26\x0c\x4f\x5c\x77\xf2\xd2\x6c\xa5\xe2\xff\xc0\x7f\xed\x38\xb5\x37\x35\x25\x1f\xf6\x8d\x12\x40\xa0\x0d\xa0\x49\x5f\x57\x1f\xf4\x04\x1f\xb5\x23\x68\xb4\x4f\x4d\xc1\x92\xa2\xa9\x24\x5a\x2e\xc9\x77\x52\x61\x61\xd1\x66\x8b\x74\xcd\x58\xe5\x58\xac\x37\xb6\x72\x2c\xd6\x7f\x3a\xcb\xa8\x61\xda\x9c\xfd\xbd\x64\x6a\xcf\xc5\xe6\x8c\x16\xfc\xec\x6b\xa3\xd3\xd5\x02\xb6\x6b\x41\x0b\xde\xf1\x28\x86\x28\x70\x2d\x55\xc2\x52\xab\x7d\xe9\x82\x26\xec\x2d\x5d\x75\x8b\x5f\xb4\x85\x68\xef\x27\x1e\x92\x06\xcc\x43\xac\x86\xf0\x2f\x60\x99\x82\x0e\xb2\xe4\x9a\x48\xc5\x37\x5c\xd4\xa5\x4a\x68\xc6\x14\xe6\xc9\xe7\xcc\x28\x9e\x54\x65\x89\x61\x97\x13\x4c\xad\x40\xe3\x72\x3f\x4c\x24\xed\xa6\xcb\x6f\xc5\xaa\x5b\x38\x4e\xc6\xd9\x17\x90\x3b\x54\x03\x40\xb3\xf7\x6a\x84\x5e\xfc\xf5\x70\x27\x66\xc7\x83\x1d\xbc\x14\x86\xa9\x1d\x0d\xa3\xce\xbf\x64\x55\xef\x7b\xc6\x44\x2b\xea\xa8\x86\xd5\x09\xd7\x1e\x1e\xdf\x75\xe5\x86\x2d\xe8\xdc\x00\xe3\x0a\x5e\x07\x58\x6f\x27\xf4\x18\x90\xee\x2b\xa8\x62\xc5\xe7\xbd\xf3\x5b\x31\xc5\xd1\xf8\x09\x7b\xe8\x2a\xc8\x26\x32\xcf\x4b\x01\x27\xad\xe7\x80\xc3\x61\xae\x1a\x8b\xe3\x3d\x5d\x93\xe7\x6b\x96\xba\x24\xbc\x53\x68\x96\x6b\x18\xd1\x46\x2a\xba\x61\xa7\xe4\xdc\x02\xc7\x42\xd0\xaa\xa3\x43\x0e\xb2\x7d\x3f\xc6\x0f\x2a\xbc\x3f\xb7\xcd\x46\xe7\x3f\x7c\x78\xeb\xeb\x04\x7a\x3e\xcb\x85\x36\x14\x74\xaf\xaa\x21\xff\x8e\xf2\xcc\xb2\xc6\xce\xe2\x4a\x91\x36\x2d\x82\x82\x59\xbe\x4d\x15\x70\x95\x0d\x13\x76\x85\x56\x5c\x2a\x2b\xc7\xed\x58\xba\xe7\xdd\x0e\x50\xbe\x6e\x4d\xc7\x7b\xc7\x55\xd5\x4f\x18\xf2\xbc\xe0\x16\x75\x71\x75\x83\xbd\xad\x63\x69\x89\x6f\x84\x54\xac\x3a\xd5\x37\x2c\x03\x0d\xa3\x43\x31\x6d\x8a\x1e\xf8\xc8\xce\xb4\xe1\xc3\x45\x7c\xe1\x08\xa4\xf3\x76\x67\x99\x55\x95\x8f\xea\x26\x5d\xc8\x34\x97\x82\x1b\x89\x6a\xa5\x6b\x9b\xec\xff\x84\x7a\x88\x93\x2a\x66\xcb\xba\x88\x83\xf1\x81\x8b\x83\x47\x76\xc7\x54\xa3\xe5\x72\x7d\x11\xe0\x8a\x24\xa5\x82\x24\xd6\x8a\x61\x2c\xc9\xb0\x46\x3c\x74\x8b\x1b\x66\xb8\xa0\x16\x85\x51\x0a\x89\xed\xbc\x91\x4e\x0c\x3e\xfc\x3a\xd7\x9b\xc0\xf4\x57\x54\x33\x78\xf5\x94\x18\xba\xe9\x75\x5b\xeb\x2d\xb5\x27\x70\xe5\x7c\x25\x7a\x49\x6e\x00\xe4\xde\x0b\xf8\x1d\x53\x1a\x22\xec\x34\xd1\x06\x9d\xb8\x0d\x2a\x45\xd9\xd7\xab\x41\x34\x88\xf0\x3d\x64\xcc\x4a\x45\xee\x84\xbc\xb7\xc7\x9e\x9a\x0a\xae\x3c\x24\x57\xe0\xb2\x1d\x88\xb5\x1a\x19\x4f\xac\x76\xe5\xd7\x65\x96\xdd\xb0\x44\xb1\xae\xd5\xb0\x5d\xdd\x58\xb8\x2a\x2f\x34\xab\x4c\xfd\x8d\x7b\x14\x64\xdb\x00\x14\xaf\xc5\x6a\x9a\x37\x24\x46\xdf\xae\xfb\xb8\xee\xa2\xcc\x40\x5d\x6a\x28\x63\x10\x14\xd0\x60\x53\x38\x57\x47\xcb\x8a\x6d\xb8\x5d\x4e\x4f\xd4\x92\x57\x01\xfa\x43\x8b\xac\x00\x5c\x6c\x4a\x9e\xb2\x33\x84\xf7\xb5\xae\xf6\x72\x01\x7f\xb1\x53\x71\xeb\x58\x48\xb1\xa0\x8b\xae\xd5\x78\xc0\x8a\xd9\xae\x66\x25\x13\x9a\xbd\x07\x1e\xfa\xc1\xe3\xc8\xab\xf5\x56\x0f\x94\xe5\x66\xdb\x52\x5d\x8c\x24\x59\x6f\x01\xcd\xbd\x2c\x89\xf3\x1a\x61\x1a\x93\x83\x96\x7a\xd9\xeb\x0c\xfe\x5d\x8c\x77\xef\x08\x61\x33\xe7\xb0\xf1\xe9\x20\xac\xac\x11\xf5\xe7\xa6\x63\x26\x47\x80\xdb\xd3\xb7\xe3\xec\xfe\xcc\xdd\xc5\x16\x96\x7d\x2c\x70\x49\xfa\x0c\xd6\x70\xf6\x35\xfc\xcf\xc0\xad\x09\x63\x50\xcf\xd3\xd4\x59\x01\x4b\xcd\xd6\x65\x86\x76\x39\xbd\x24\xb4\xe0\x1f\xf1\xfc\x9c\x92\x3b\x2e\xd2\x53\x52\xf2\xf4\xdf\x1f\xe1\xa7\x7e\xc4\x2d\x88\x0b\x6e\xaa\xeb\x66\xf8\x50\x9d\x5c\xb6\xde\xf5\x99\x67\x4e\xfb\x6b\x03\x6a\x04\x9d\xf6\x10\xdf\x1a\xa2\xf1\x31\xe5\x5e\x6a\x06\xba\x72\xa3\xbe\x00\x5b\x6e\x96\x64\xcd\x4c\xb2\xad\x8e\xa9\x3d\x79\x5c\xd8\x75\xf5\xb9\x80\x2b\x4f\xc0\x75\xf3\x76\xd6\xe8\x24\x81\x47\xb1\x56\x3c\xb0\x8d\xc4\x92\x9c\x8b\x3d\xba\x80\xbb\x3b\xe7\x6a\x05\x40\xed\x13\x48\xe7\x76\xec\x8d\x8a\xf6\x52\x51\xd0\x64\x8c\xa2\x76\xe4\xc3\x6f\x88\xec\x16\x5f\x74\x75\x1b\x9e\x9a\x81\x60\x87\xaf\x5b\x32\xe8\x6e\xbb\x87\x1f\x74\xcf\x86\x40\xcb\x10\xb1\x07\x3e\x96\x50\xed\x0d\xd2\x10\xe2\x84\x58\x46\x94\xc3\xa7\x5d\x74\xd8\xeb\x93\x62\xd9\x9e\xc8\xd2\xd4\x67\x38\x91\x58\x4e\xfa\xde\x3b\xe5\x72\xca\xdb\xb1\x1c\x2e\x10\xbb\x57\x5a\xad\xf6\x24\x95\x90\x9e\x2b\x4f\x81\x77\x60\x64\x95\x77\xf1\x81\xf4\xd8\xd2\x1d\x97\xa5\xc2\x7a\x26\x8a\xd1\x3b\x42\x4d\xa5\x83\xf6\xea\x97\xb2\x04\x57\x03\x4f\x58\x27\xd4\x23\x86\x1b\x9e\x57\xa1\x72\x45\x91\xf9\x1b\x63\x6d\xe4\x80\xb9\xd9\xb9\xfa\x14\x54\xdf\xd3\xa3\xd7\xa9\x43\xed\x01\x98\xca\xdb\xa8\xda\x44\xb5\x5a\x3a\x57\x9b\x32\x87\xfb\xa9\xa3\xfe\xba\x46\x8f\x2b\xd0\x2d\x93\x3b\x2f\x8d\x86\xa3\x90\x5e\xbf\xbb\xf0\xbe\x04\x0c\xb7\xa8\xa3\x30\x5d\xa1\x8f\x74\x49\x3e\x3e\xca\x1a\x39\x6a\x87\x3c\x34\x44\x5e\x5a\x3d\xd6\x5b\x3e\x87\x4c\x50\x95\x7d\x49\x31\x2d\xb3\x9d\x2f\xeb\x56\xcd\xcc\xcb\x74\x2e\x8a\xd2\x38\x56\xe9\xd5\xf7\x01\x98\xa5\x48\xb6\x54\x6c\xfc\x4d\xb3\xb1\x32\xa2\xf7\xc2\xd0\x07\xcf\xa2\x98\x4e\x68\x51\xc5\x8f\x90\x54\x96\xc3\x13\xfd\xdd\xef\x4e\x09\x67\xaf\xc8\xef\x1a\xe0\x96\xe4\x8d\x83\xd0\x40\x64\x23\x9a\x6e\x55\x23\x6c\xc8\xaa\xa7\xd8\x86\xaa\x34\x83\xc0\xf5\x75\xd5\xe5\x04\xad\x3c\x6e\x93\xd8\x03\xd7\x06\xae\x66\x42\x9a\x86\x45\x6e\x68\xf5\xd3\xba\x6c\x61\x87\x18\xe4\xc6\x8b\x94\x1a\xba\x68\x1c\x95\x33\xec\xff\xb3\x70\x05\x25\x16\xd4\x11\x69\xa3\x87\xcc\xd7\xae\xfb\xc6\x82\x56\x6f\x71\xab\xbd\x40\x01\x86\x7e\xa9\x17\x74\xc6\x8e\xda\x86\xc3\x96\xd9\x60\xf5\x8f\x43\x8b\x5c\x55\x0e\x18\xa0\x2d\xc9\x95\x34\x75\x95\x9f\x2a\xcc\xc2\x95\x92\xb8\x1d\x0c\xa6\x3b\x38\x99\xe4\xcd\xd5\xed\x87\xbf\x5d\xbf\xbf\xbc\xba\x1d\x3d\x8a\x03\x10\x47\x0e\x68\xcc\x51\x1c\x80\x3c\x7c\x40\xc7\x8f\xe2\x00\xc8\xc0\x01\x1d\x3f\x8a\xc3\x6c\x61\xf0\x80\x46\x1f\xc5\x01\xd8\x03\x07\x34\xfe\x28\x0e\xc0\xed\x1c\xd0\xdf\xf8\x51\x64\x62\x17\x71\x0c\xdf\xba\x0b\x5d\x9f\xb7\xec\xb0\x92\xc2\x68\x34\xc5\xd1\xa3\x41\xde\x88\xdd\x47\xaa\xea\x3e\x2d\x10\x86\xdb\xeb\xd8\x73\x2f\x0c\x7a\xbd\x80\x95\xbc\x3e\x46\x38\xc8\x24\x57\x7d\xf3\xca\xd4\x37\xef\x3a\x43\x31\xd4\x59\x8b\x90\xd7\x3f\x5d\x5e\xbc\xb9\xba\xbd\xfc\xee\xf2\xcd\x87\x27\xfb\x7e\x47\x6b\x27\xb4\x19\xf5\x14\x6e\x18\x5c\x44\xcd\x29\x0b\xc5\xac\x26\xaa\x89\x6f\x70\xd7\x4f\x7e\x7c\x3c\x97\xac\x1d\x1b\x62\x75\x59\x67\xdc\xea\x07\x89\x4c\x37\x08\x31\x9e\x21\xb7\x58\x6f\x10\xe6\x54\xb6\xec\x18\x70\xd8\xd5\xfb\x29\x98\x33\x3e\x8f\x67\xd1\xe1\x19\xb7\x35\xa9\x76\x84\x43\x30\x97\x32\x9e\xac\xbf\x53\x32\xd0\x05\xe6\xb0\xd0\x00\x5c\x5d\xab\x34\xe5\x3e\x8a\x39\xd1\xae\xf9\x62\xf8\x78\xd6\x8c\xcf\xa9\x1b\x55\x5e\x9c\xfd\x3b\xc4\x4f\x87\x20\xc4\xd6\x64\xc1\x7b\xf8\x3b\x5a\xfc\x95\xed\x3f\xb0\x91\x94\xd0\xc3\xc5\x82\xb9\x58\x13\x4a\xee\xd8\x1e\x8d\xdc\xaf\x3d\xb8\xb1\x4a\x0a\x53\x6a\xc6\xdc\xb1\x60\xcc\x50\xef\xdc\xec\x29\xb0\xb3\x02\x79\x63\xa7\x39\x36\x21\x32\xb5\x5e\xcc\xa3\x2a\xd9\x7c\x21\x16\xaf\xf6\x33\xd5\xfe\x15\x05\x74\xd8\x46\xd6\x7e\x26\xe1\xdc\x5b\x8d\x27\xe3\xdd\xd9\xd9\x5b\x1c\xa6\xa2\x55\xcb\x3f\xf8\x68\x9e\x36\x3e\x96\xa6\x7c\x56\xb0\x13\x35\xd1\x8b\x1c\x0b\x1c\xc3\x27\xbe\xda\xcf\x5d\x8f\x5f\xa5\x6f\xdc\x88\x32\x3e\xb0\xd7\x53\xcf\xff\x49\xcd\x00\x30\x86\xb1\xca\xdf\x4e\x5f\x79\xcb\x92\xae\x2a\x02\x2f\x2d\x41\x8e\xd3\x4e\xeb\x75\x30\x3e\x9f\xd6\x7f\x43\x77\x67\xe3\x0f\xc0\x25\xd1\x99\x32\x0e\x5a\x17\x2c\x59\x0a\x99\x82\x7b\xec\x14\xff\xe9\x64\xfb\x79\x92\xc8\x52\x18\xf7\x03\x64\xd7\x2c\xb7\x52\x9b\xcb\xeb\x08\xb0\xf8\x7a\x21\xd3\xcb\xeb\xd3\xd6\xbf\xf4\x48\x3a\xff\x34\x36\x58\x9f\xc3\xc9\xe4\xff\xb1\xf6\xff\xa0\x61\x70\xcb\x72\x0a\xff\xf9\x9d\xdd\xb8\x40\xd0\x55\xfb\xe1\xba\xce\x80\x13\x90\xf6\x63\xe5\x76\xbb\x66\xdc\xb3\xdd\xcb\x67\x47\x67\xb6\x6b\x3f\xcd\xc9\x4b\x87\x68\x37\x5f\xe3\x14\xa8\xb4\x12\x09\x31\xda\xa0\x7f\x6a\xdf\xdf\xf9\xf5\xa5\xf7\xa7\x1d\x79\x99\xf1\x27\x7f\x1d\xb9\x6b\xd1\xe7\xdf\xf7\x6e\xfe\xee\x89\x7c\xc0\xc3\xe9\x24\x8d\xbc\x02\x67\xef\x28\xbe\xea\x26\xdb\xd8\xba\xdd\xa5\xdb\xba\x16\xdb\xcf\xf1\x8f\xcb\xa4\x28\x4f\xdd\x0b\xcb\x9c\xe5\x52\xed\xc7\x4f\xa9\x7b\x9d\x15\x5b\x96\x33\x45\xb3\x45\x15\xc2\xe0\xc1\x23\xd8\xea\x5f\x08\x78\xfc\x54\x36\x26\xd8\x85\x8e\x77\x19\xe7\xc2\xce\xf6\x75\xe1\x93\xa3\x72\x86\x0a\xcb\xe3\x85\xe5\xf1\x69\x6f\x5f\xed\x2c\x01\x9d\xa6\xa2\x43\x50\x63\x5d\x5e\x47\x9c\xd0\xaf\xbc\xba\x10\x40\x24\x76\x56\xe9\x0d\x94\x53\xa8\x9f\x49\xcc\x20\xe5\x3b\xae\xe5\x48\xb7\x96\x9e\x85\xde\xb4\xca\x70\xba\xb4\x41\xf4\x9b\xc6\xf5\x2f\xc0\x87\x3d\x14\x90\xf6\x5d\xd1\xea\x01\xff\x7b\xf9\xec\xd8\x0b\xf6\x23\x4d\xdf\xda\x0f\x9e\xa5\xd4\x27\xb3\x62\x7f\x47\xde\x97\x78\xee\xe5\xa7\x72\x2c\xe6\x85\xfe\xb1\xe3\x5c\x60\x9c\xaf\xad\xce\xf3\x1a\x09\xb7\x27\xee\x26\xd0\x1f\x98\xd0\x7e\x7e\xa9\x3b\x8f\x97\xf2\xb8\x94\x5a\xdc\xad\x95\xcc\x5d\xb6\x4f\x14\xa1\xaf\x18\x58\x93\x33\x9e\x7a\x58\x77\x6c\xa4\xfe\x31\x3e\xf3\x3d\xea\xb7\x74\x8f\xc2\x88\x1f\x77\x89\x8a\xb8\x94\xe0\xf3\xab\xbb\x44\x45\xbc\x36\x9e\x03\xf1\xe9\x32\x1c\x98\xd8\x0d\x5b\xb2\x7a\x0d\xf8\x5e\x13\x6b\x14\x27\xe8\x37\x81\x86\xdd\x48\xad\x6c\x6c\x60\x50\xb5\x91\xb6\x76\xc9\xa1\x6c\xca\x47\x4c\xd7\x2d\xa3\x35\x39\x87\x82\xf4\xc8\xa0\x00\xac\xb7\x86\x2a\xe6\xaa\xcb\x61\x95\x0d\xb6\x1b\xb6\xe3\x43\x54\xec\x41\xa2\x84\xab\x65\xc9\xc5\xc6\x65\xfa\xa1\x7c\x70\xc6\x46\x2e\xaa\x62\x3a\x03\x30\x2b\xb5\xa0\x8e\xed\xa7\x5a\xcb\x04\x0a\x5c\xd6\xcd\x5c\xa0\xbe\x82\x5b\x38\xcc\xdc\xd0\xbb\x21\x90\xcd\xc6\x32\x1f\x2d\xc4\x1a\x87\xab\x3d\x14\x77\x11\xbb\xca\x6e\x5b\xa2\x8f\x09\x85\x41\xa0\x0b\x09\x74\xee\x68\x42\xfe\x14\xde\x16\x4b\x74\xce\x2a\xda\x70\xba\x80\x7c\xaa\x6e\x0a\x14\x7c\x42\x3d\x21\x39\xfe\xa9\x4c\x35\x43\xb4\x16\x23\x5a\x2b\x53\xe7\x88\x9a\xd0\x91\xa9\xb5\xa1\xa8\x2d\x4b\x8f\x60\x7e\x8d\x11\x7e\x5f\xb6\xe0\x3b\x62\xf0\x5c\xfd\x44\x0b\xb3\x58\x41\x36\xc1\x18\x38\x4d\x30\xc5\x0a\xa5\x28\x21\x52\x28\xb6\xe6\x0f\xd1\xb4\xd9\x0c\xa3\xe5\xd0\x53\x6d\xcd\xa1\xcc\xbb\x05\x54\x30\x81\xd1\x7a\x34\xd9\x8e\x0a\x39\xc7\xaa\x6b\xeb\x7d\xed\x44\x3c\xae\xa3\x10\xf5\xc8\xa9\x07\xf0\xa6\x4f\x93\x9d\x4f\xdf\xaf\xe7\xf4\xb9\x0d\xfe\x6c\x47\xef\x89\xba\x55\x6f\x0e\x41\xcf\xd2\x4f\x2e\x1a\x81\x45\x98\x0c\x32\x95\x76\x1a\x81\xa5\x18\x76\x3e\xb0\xa2\x76\xf7\xb9\x8a\x4d\x60\x77\x56\x79\x4f\xb6\x7c\x63\x91\x8f\x1d\xe9\x50\x32\x12\x8c\x8f\xcf\x87\x95\x25\x48\x24\xc4\xe4\x54\xa9\x20\xeb\x41\xf1\xb4\x93\x63\x0a\x2a\x92\x0f\x8a\x85\x1f\x95\xcc\xb2\xe1\xae\x1f\x19\xbf\x63\xe4\x82\x15\x99\xdc\xe7\x2e\x22\x23\x25\x37\x86\x1a\x4b\xca\x37\xcc\x0c\x59\xd1\x47\xc8\xb4\xca\x48\x88\x2e\x05\x76\x82\x99\x1e\x45\x99\x65\xa4\x80\x8f\x96\xd0\x2e\x4b\xae\xc9\x39\xe4\xae\x9d\x92\x2b\xb6\x63\xea\x94\x5c\xae\xaf\xa4\xb9\x46\x65\x66\x88\x27\x36\x9d\xd1\xf8\x39\xe1\x6b\xf2\x0a\xd3\x05\x21\x45\x84\xeb\x66\x87\x3a\xa9\x5a\x60\x07\xa0\x56\xd5\x0e\x9e\x10\x96\x34\x4c\x4c\x5f\x03\xa4\x2a\x83\x61\xc0\x74\x37\x82\xf8\xaa\xb0\x6a\x04\xca\xcf\x5d\x3a\xa6\xa9\x23\x94\x3d\x0d\xba\xfc\x33\x9f\x70\x0a\xca\xea\x60\x69\x16\xc5\x74\x21\x85\x66\xed\xe2\x1e\x75\x89\x68\xb8\x02\xe8\x68\x0d\x77\x5c\x80\x14\x52\x1b\x68\x1d\x17\x5b\x41\xf7\xda\x7f\x00\xb5\x24\x69\x96\xb1\x94\xf0\x3c\x67\xa9\xbd\x15\x64\x7b\x57\x1f\x94\x46\x95\x59\xb2\x10\x7c\xea\xe5\x25\x0a\xa3\x2d\x15\x69\xc6\x54\xb3\x07\x61\xeb\x46\xe3\x4b\xb4\x05\xb9\x2a\xda\xb2\x5d\x7d\x4a\x42\x93\x44\xaa\xd4\x75\x48\xb0\x57\x7b\x1f\x3b\x5f\x9d\x0d\xe0\xdf\xa3\x5c\x83\xf4\xb5\x1d\x85\xc2\x58\xba\x51\x3a\x13\xba\x0a\x57\x7d\x16\x8f\x58\xfa\xb7\x41\xe4\x75\xa1\xdf\x8a\x32\x16\x50\x98\xfc\xac\x51\x03\x18\xfe\xf0\xd4\x72\xe2\xe1\x86\x7c\xe4\xb1\x4d\xf9\x46\x24\x62\xab\x65\xdf\x53\x1a\xf3\xc5\x2f\x94\xc4\x36\xe8\xeb\xac\x39\xae\x49\x5f\x84\x5d\xa8\x91\xb5\x14\xd3\xa8\x2f\xc6\xd2\xd4\x6e\xe5\x17\xdf\xac\x2f\x02\x76\xa3\x9d\x5f\x64\xc3\xbe\x08\xa0\x03\x2d\xfd\x06\x9b\xf6\x45\x80\x1c\x6b\xeb\x37\xd0\xb8\x2f\x02\x72\xa8\xb5\xdf\x40\xf3\xbe\x18\x14\x04\xda\xfb\x4d\x68\xe0\x47\x62\xdb\x6f\x91\xa9\x36\xd7\xb8\x4e\x49\xd1\xe6\xc6\xd1\x4e\x74\xe4\x13\x75\xa3\x23\x93\x78\xc3\x78\x5f\x85\xee\x3c\x23\x3a\xd3\x45\x1e\xe2\x4f\xd2\x9d\x8e\xc4\x76\xa8\x23\xd3\x48\x24\xba\x53\x1d\x79\x54\xb7\xba\x88\x55\x41\x87\xad\x47\x75\xac\x23\x53\x8e\xcd\xe4\xce\x75\x51\x0e\x05\x2c\x65\x3a\xbd\x7b\x1d\x99\xe8\x99\x23\x13\x7c\x56\xe4\x58\x9d\xec\xc8\x54\x6e\x43\xa6\x74\xb4\x1b\x9f\x66\x6c\x57\xbb\x47\xcc\x33\xd6\x55\x43\x62\x3b\xdc\x91\xe8\x2e\x77\x64\x8a\x97\x99\x4c\xe0\xe1\x31\x1d\xef\xc8\x91\xbb\xde\x91\x69\xa8\x1f\xef\x11\x43\xe2\xfa\xc4\x90\x89\xbd\x62\xc8\xb4\x7e\x31\xe4\x31\xdd\xf0\x22\xf6\x5d\x76\xbc\x53\xc1\xbe\x31\x31\x94\xd4\xea\x2c\xf3\xc8\xde\x31\xe4\x69\x9d\xf1\x48\x64\x77\x3c\xf2\xa9\x3a\xe4\x91\xc9\x5d\xf2\xc8\x14\xba\x8d\x63\x16\x23\x5d\x72\xc8\x04\xa7\xee\x78\xe7\x2c\xf2\xd8\xee\x59\x23\x58\x81\xde\x5a\xd3\x3b\x68\x8d\x42\xad\xfa\x6b\x4d\xea\xa2\x45\x3e\xb5\xd6\x77\xc4\x8e\x5a\x64\x62\x57\x2d\xf2\x5b\xe1\x9c\x11\xdd\xb6\x7e\xc3\x9c\xf3\x97\xe5\x2d\x11\x2f\x15\x8a\xdd\x18\x59\x44\x5b\x18\xf1\xf5\x01\xfb\xa2\x6b\xbe\x19\x6d\x60\xac\x0d\x86\x24\x2d\x19\x96\x16\x83\xd8\x67\x7f\x57\x94\x4d\xd3\x5f\x30\xc6\x82\x34\x9a\x9e\xf8\x86\x89\x67\xae\x59\xa2\xeb\x1b\xe6\xba\x55\x9c\xda\x35\xb3\xbc\xf0\xb5\xc6\x46\xe3\x04\x5d\x6f\x0d\x78\x9d\x99\x04\x43\x4c\xbc\x2d\xd4\x59\x52\x3c\x32\xe2\xcb\xd8\x27\x8a\xea\x2d\x16\x4f\x63\x0f\xdc\xb8\xee\x29\x8a\x51\x2d\xb1\x36\x5e\xb3\x47\x08\xd7\xa4\xa0\x1a\x6b\xa3\x84\x24\x49\x3d\x31\x04\x77\x2d\xd3\x93\x13\xdd\x02\xb5\x51\x34\x61\xae\x81\x28\x81\x84\x84\x54\xde\x87\x5c\x5b\x2b\xb6\xe1\x42\xfb\xbd\xc5\x12\x2b\x48\x04\x96\x9b\x33\xb0\x30\xf9\xfc\xf7\x25\xf9\x50\x25\xdb\x8d\x5b\x6a\x65\x69\x12\x59\x33\x09\x37\xf3\x43\xc3\x32\x84\xad\xc0\xd6\x8f\x15\x92\xad\xc8\xa9\x59\xe5\x77\x04\x05\xce\xc2\x1c\x80\xda\x20\xc0\xa9\x16\xe6\x10\x0a\x54\xe3\xab\xc1\xfd\x81\x5e\x4e\x34\xd9\xb6\xfd\x2e\xb3\xb1\x7a\x36\x56\x87\x9e\xd9\x58\x3d\x1b\xab\x67\x63\x75\xef\x33\x1b\xab\x67\x63\xf5\x6c\xac\x1e\xff\x76\x36\x56\xcf\xc6\xea\xd9\x58\xdd\xf3\x7c\x89\x26\x97\xd9\x58\x1d\xfe\x7c\x36\x56\xcf\xc6\xea\x00\xd4\xd9\x58\xdd\xfb\xfe\x6f\x81\x73\xce\xc6\xea\xd0\xc7\x5f\x98\xb1\x7a\xe4\x05\x6f\xf5\xbd\xb6\x3a\x6e\x4c\x24\xf6\x35\xd8\xd8\x78\xe2\xcc\xc3\xed\xfe\xc3\x0e\xd8\xb2\xae\xbe\x37\x30\xf1\x3a\x1f\xd0\xc7\xb4\x3a\x23\x70\x6d\x74\xee\x8d\x09\x06\x7b\xde\x00\xcc\x47\xd7\x85\x2e\x64\x5a\x5b\xf2\x1a\x26\x3c\xd4\xfb\xfb\x0f\xfd\x38\x13\x0b\xdb\xee\x1e\x65\xb7\x6b\x5b\xe6\x02\xc4\xf3\x04\x9b\x5d\x1c\x77\x8e\xb2\xd5\x3d\xc2\x4e\x17\x67\xab\x8a\xb5\xd1\x1d\x5a\xe0\x46\xc0\x46\xdb\xe7\x9a\xd6\xb7\x11\x98\x71\xb6\xb9\x21\xcb\xdb\x98\x8a\x36\x60\x97\x1b\xb5\xba\x8d\xc0\xed\xb7\xc9\x05\x2d\x6e\x63\x33\xed\xb5\xc7\x05\xad\x6d\xe3\x88\x8d\xb4\xc5\x45\x19\x14\xa2\xc5\x61\xcc\xdd\x2d\x82\x73\x3b\xb7\xda\xed\x56\x31\xbd\x95\x59\xe0\x24\xb5\x1b\x6f\x72\xc1\xf3\x32\x6f\x75\x43\x72\xa0\x74\x45\xf1\xc8\x43\x83\xd6\xad\x15\xd0\xb6\x25\x3d\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\xb6\x74\x07\x1c\xa7\x4c\x12\xc6\xd2\x83\xf6\x94\x01\x90\xbf\x5f\x56\xb3\xab\x0a\x22\xbe\x1c\xde\x19\xac\xee\x02\x1a\xcb\xef\xbf\x1d\xc1\x64\x58\xab\x19\x35\x61\x7e\x0a\xf3\x65\x1c\x9b\x1c\x57\x60\x27\x9b\x2c\x23\x8a\xe1\x7c\x12\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xa7\x9b\x27\x61\x7f\xc7\x2e\x2f\x8f\x31\x4d\x46\x71\x91\xc9\x26\xc9\x18\x1b\xf4\xa3\xcc\x91\x53\x4c\x91\x8f\xaa\xf3\xf2\x58\x13\xe4\xa4\x7b\x47\xb4\xe9\xf1\x38\x66\xc7\x4f\x52\x53\x29\x02\x2f\x71\x66\xc6\x68\x13\x63\x9c\x79\x71\xdc\xb4\x78\x4c\xb3\x62\x24\x6a\xc7\x2f\xc5\x11\x17\xe2\x29\x97\xe1\x09\x17\xe1\xc9\xe6\x43\x87\xa4\x91\x6d\x8d\xbd\x00\x1f\x5c\x6f\x47\xa0\x3e\xee\xf2\xfb\x84\x8b\x6f\x8c\xb9\xf0\x93\x98\x0a\xa7\x99\x09\x23\xfb\xa1\x8f\x1d\xee\x91\xeb\x7b\xc4\x51\x85\x4e\x4e\x34\xbb\x60\x19\xdd\xdf\xb0\x44\x8a\x34\xc0\xa9\x0f\x4a\x1d\x54\x34\xa7\xf1\x43\xa7\xb9\xb5\xa3\x6c\xb6\xd4\x55\xcb\x09\xfa\xbd\x5d\x80\x92\xbf\xb9\x3b\xe1\x02\xb5\x11\x71\x86\x8f\xc9\x5e\x3e\xc2\xfd\x9a\x1c\x55\x45\xc4\xc0\xa0\x69\x68\xfe\x8b\xbc\x27\x72\x6d\x98\x20\xcf\xb9\xf0\x98\x7e\x71\xd0\xb7\x16\xf1\x15\x22\x39\x47\x9e\xf6\xbb\x97\xdf\x78\x30\x9f\x4b\x55\x06\xa5\x5e\xeb\x63\xdc\x3a\x1c\xa8\xa7\x5c\x3b\x1c\x88\x75\x99\xb5\xaf\x1e\x78\x1d\x89\xbd\x77\xbc\xac\x4b\xa2\xbc\x84\xb9\x54\xb4\x0c\xed\x2f\x31\x98\xb1\x8b\xf0\x20\xc4\x5f\x60\x2b\x22\x5c\x02\x8f\x72\x07\xa0\xc1\x7f\x44\xc4\x4e\x72\x05\x34\x8d\xfd\x01\xb8\x53\xdc\x00\x9f\xe4\xf6\x74\x44\xd3\xff\x14\xb3\xff\xaf\x4e\xb3\x89\x30\xef\xff\x86\x34\x9b\x5f\x42\x17\x30\x3c\x67\xb2\x34\x47\x52\x03\xee\xb7\x3c\xd9\x36\x39\x32\x0f\xd7\x2b\x92\xe5\x41\x83\x8e\x97\x0e\x60\xaf\x94\x3a\x5e\x44\xed\x17\xa6\x25\x8c\xec\x53\x64\xe3\xd4\x66\x19\xaa\x5a\x17\xab\x6b\x94\x53\x8d\x0d\xa7\x7f\x7a\x7b\xfe\xe7\x37\x6f\x97\xe4\x0d\x4d\x86\x4a\x85\x37\xaa\x84\x08\x6c\x88\x88\xb4\xbf\xa5\x3b\x46\x28\x29\x05\xff\x7b\x89\xb5\x8a\xc8\xf3\x0a\xe2\x0b\xef\x35\x19\x00\x3a\x56\x5f\x65\x84\x67\x40\xe3\x80\x09\x95\x2a\xb1\xd1\x00\x9a\x91\xa5\x55\xf3\x7d\x97\xea\x06\x6f\x78\x63\x7f\x1a\x66\x51\x14\x79\xcf\x96\x29\x46\x36\x7c\xe7\x0c\x76\xae\x04\x4d\xdd\xb7\xbd\xd5\x68\x97\xae\xc0\x4c\x3d\xc8\xa1\x04\x33\x96\xfa\xaa\x1b\x87\x14\xba\x99\x7f\x61\x6f\x24\xfa\x94\xac\x4a\x30\xd5\x17\x8a\xe7\x54\xf1\x6c\xdf\x1c\x82\x66\x43\xfc\xe6\x4a\x7a\x09\xbd\x47\x71\x5c\x4f\xff\xe2\xfd\x9b\x1b\x72\xf5\xfe\x16\x7a\x22\x59\xc9\x0a\x56\x74\xf8\x1d\x10\xd3\xdf\xf3\x19\x1f\x57\xdb\x1a\x5b\xaf\xc2\x27\x78\xce\xb9\x86\x46\xcd\x4c\xd8\xc1\xdc\xad\xdc\x97\x82\x7a\xf6\xcd\x12\xfe\x6f\xa8\xec\x35\x4d\x53\x65\xb9\x79\xe5\x84\x38\xc8\x1f\xb0\x5c\x16\xf8\x3d\x5f\x65\x8d\xbd\x73\xd8\xfb\xc5\x3a\x83\x55\xce\xc4\x6b\xbb\xec\x66\x83\xb0\x6a\x23\x01\x21\x58\xaf\x14\x9a\x90\x0e\xf2\x81\xd1\xbe\x66\x91\xf5\x2a\xeb\x09\x45\xd7\xcb\xab\xf9\xb5\x17\xa6\xee\x50\xc8\x46\x49\x6b\x72\x79\xed\xb7\x25\x2c\xd0\xa0\x8c\x58\x25\x0b\x5d\x31\x68\x00\x8c\x26\x89\x53\xf2\x0d\xf9\x13\x79\x20\x7f\x02\xd1\xfa\xc7\x10\xb0\x38\x0e\x1a\xa7\xd6\xa2\xd6\x76\x79\x1d\x8d\x95\x1f\xed\x11\xb0\xdf\xd8\x95\x1b\x49\x56\x1c\x1b\xd3\xd7\x4d\x87\x1d\xb6\x9e\x5c\xe1\xd0\x0e\x72\xd4\x0d\x03\xeb\x04\xb9\x6c\xb4\x9f\x0f\x3b\xd6\xcc\xc4\x2d\xb3\xa0\xad\x26\x7b\x85\x44\x1e\x36\x4f\xb7\x2a\x96\xd5\x23\xe5\xd4\x24\xdb\xf6\x09\xb2\x22\x5c\x9b\x9a\x88\xc3\xca\x70\x2a\xe1\x86\x80\xee\xc0\x2d\x0f\x52\xe5\x71\x09\x69\x52\xf3\xbd\xd6\x2e\x1c\x60\xfa\x40\x51\x1c\x51\xc2\x53\x2f\x59\x1b\xe9\x50\x85\x4c\x51\x54\xc3\xa4\xd2\x06\xbb\xf1\x52\x39\x08\xb4\x2b\xb1\x5d\x88\x4a\x75\x75\x06\xfa\xb2\x27\xc1\x75\xe3\x84\x0a\x96\x6a\x24\x63\xc1\x9e\x96\xaa\x07\x5e\x70\x63\xa2\xce\x47\xa1\xa4\x91\x89\x0c\xd6\x8c\x6c\x9b\x84\xdd\x07\xd8\xde\x1f\x29\xcb\xe1\xfc\x87\x8b\xeb\x53\x7b\x23\x84\xe2\x79\x37\xaf\xc7\xac\x72\xad\xf6\x70\xb7\xaf\xaf\x83\x6d\x6a\x22\x16\x33\x5e\xce\xbb\xc5\xc2\x87\xd4\xf2\xa7\xd5\x9e\x54\x8c\xa6\xfc\x68\xb1\x35\xbe\xd5\x61\x05\x75\x4a\x90\x4d\x2e\x77\x2c\x45\x01\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0e\x44\xde\x8c\xeb\x90\x9f\xc1\x32\x38\x47\xde\xcc\x91\x37\x73\xe4\xcd\x1c\x79\x13\x78\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\x5e\xb4\xcc\x91\x37\x73\xe4\xcd\x1c\x79\xd3\x78\x69\x8e\xbc\x71\x93\xfa\x97\xf1\x4f\xcd\x91\x37\xed\x67\x8e\xbc\xe9\x8c\x32\x47\xde\x7c\x19\x3e\xb5\x39\xf2\xc6\x3f\x73\xe4\xcd\x1c\x79\x33\x47\xde\xcc\x91\x37\x07\xcf\x1c\x79\x33\x47\xde\xcc\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\x5e\xcb\xbc\x28\x0d\x23\x1f\xaa\x76\xf5\x55\xcf\xf4\xd5\x1e\xfd\x82\x8d\xc3\xf1\xa9\xdc\x1c\xd8\xb6\xab\x54\x10\x2a\x72\x86\xb5\x10\x17\x09\x4e\x6d\x51\xad\x67\x51\xcd\xe4\xec\xb1\xae\x0e\xec\x9d\x3f\x4c\x0f\x75\x7c\xcc\x75\x14\xe3\x8f\x62\x5c\x6d\x8c\xbf\x85\x29\x34\x0c\x2d\xd8\x2c\xea\x01\xc8\x97\xe6\xb2\xc4\x12\x90\x6e\xf5\x81\xb1\x2b\xbc\xa0\x99\xe8\xf3\xa1\x9d\xc4\xf7\x0c\x66\xfa\x33\x63\xff\x83\x9b\xc4\x21\xfe\x1d\xfb\x78\x1c\xfe\xfd\x91\x81\x08\x84\x6a\x04\xae\x89\xcc\xb9\xb1\x7a\x8a\x55\xf6\x1a\xd1\x42\x21\xaf\x06\x37\x2d\x1b\xaa\xa3\x16\xf0\x39\x52\x83\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xef\xa6\x16\x42\x17\x54\xbe\xad\xb4\x25\xd8\xf5\x85\x6f\xbe\x0b\x8c\xf3\x8b\xa6\xa0\x91\x17\xac\xbe\xaf\xb8\xd9\xbf\x96\xc2\xb0\x87\x01\x0d\xa6\x4d\x0c\x37\xee\x13\xd7\x55\x50\x57\xaa\x94\x73\x62\xaa\x52\x40\x54\x43\x84\x28\x89\x41\x16\x76\x1b\x3b\xf3\x13\x05\xac\xb0\x07\x73\x36\x00\x32\x6e\x2b\x0c\xd5\x77\xf5\x3e\xb0\x85\x15\x4e\x35\xba\x3b\x63\x3d\x96\x71\x02\x8b\xb9\x56\x7c\xc7\x33\xb6\x61\x6f\x74\x42\x33\xd8\xf3\x58\x15\xe0\x7c\xe0\x7b\xdf\x55\x51\x57\x5d\x34\x87\x3a\x66\xbb\x79\x82\x52\x97\x50\x41\x36\x94\x0b\x92\x5b\x1c\x15\x1e\x2c\x74\xdf\x13\xd0\xe1\xad\xa0\xca\x5e\x08\xdc\x07\x21\x8d\x0b\x02\xc3\x56\x52\x66\xce\x23\x9b\xed\xeb\x39\x39\x57\xbf\x90\x3f\x09\x76\xff\x93\x1d\x47\x93\x75\x46\x37\xa1\x5e\xd4\xc4\x55\x84\x65\xa6\x53\xb2\xa5\x9a\x0e\x19\x42\x47\x88\x31\x68\x50\xff\x08\xc5\x0e\x8c\xbd\xed\xbe\x5f\x91\x97\x2f\x80\x6a\xa9\x26\x15\xf4\x90\x51\xe5\xdb\x17\x60\x7d\x79\x7d\x7e\xfd\xd3\xcd\xdf\x6e\x7e\x3a\xbf\x78\x77\x79\x35\x76\x44\xc3\x7d\x4a\x13\x5a\xd0\x15\xcf\x78\x98\x77\x77\xac\xe0\xcd\xcf\x80\x51\xa5\xe9\x59\xaa\x64\x81\xeb\x54\xa5\x80\x78\xcd\x3a\x06\x2b\xc2\x90\xe1\x7d\x50\x55\x78\x27\xb6\xe6\x6e\x0f\xb5\x51\x54\x18\xaf\xec\x8c\xd5\xe7\x46\x34\xab\x52\x58\x45\xf5\xa9\x1e\x37\x9a\x4e\x09\x4a\x38\x4f\x53\x96\xb6\xa6\x7e\x64\x1f\xd0\x6b\x0f\x7a\x5f\x47\x8c\x92\xeb\xf7\x37\x97\xff\x37\x7e\x54\xe2\x68\x24\xca\x3d\x70\x24\x0f\x36\x21\x96\x4c\x26\x60\xf2\x83\x8b\xee\x99\x71\x39\xf0\xce\x48\x25\x7f\xcf\x55\x22\x0f\xf7\x87\x52\xb4\x23\xf3\x6b\x08\x24\x97\x29\x5b\x92\x6b\x64\x8a\xd0\x6d\x37\xc8\xfb\xab\xef\x6a\x36\x00\xe6\x5f\xfb\xb1\x30\x9c\x66\xd9\x9e\x58\x4d\x6c\x47\x33\x86\x2e\x64\x25\x07\x6f\x2b\xa4\x2e\xa9\x85\x71\xa9\x4d\xae\xb1\xa6\x99\x0e\x1c\xf0\x18\x3e\x68\x59\xfd\x3b\xab\x4c\x46\xe2\xa9\x7a\x9f\xa4\x4c\x48\xe3\xf4\x52\x3b\x12\x04\xd4\x2a\x99\x10\xd4\x4d\xd1\x0d\x11\x58\x55\x1d\x4e\x54\x31\x4b\x60\xb1\x9e\x0d\x72\xed\xd7\x7a\x5d\x8d\x09\x37\xf1\x00\xcc\x52\x33\x7d\x20\x6d\x1c\x1b\xac\xb5\x55\x3b\xae\x62\x34\x85\xd8\xb0\x82\x9a\x2d\xd8\x35\x03\x40\x73\xaa\xef\x58\x8a\xaf\x2e\x51\x0e\x3b\x4d\x5a\xbb\x0e\x00\x6e\x7a\xb7\x16\x0b\x6b\x46\x4d\xa9\x18\xc8\xdf\xb0\x92\xbb\x62\x84\x09\xba\xca\x42\x91\x67\x51\x41\x91\x34\x7d\x2f\xb2\xfd\x07\x29\xcd\x77\x55\x48\x55\xe4\x76\xfe\x58\xf5\x04\x6f\xde\xa0\x41\xd8\x82\x91\x32\x5d\x00\x9a\x20\x90\x2b\xae\x92\xf9\x45\xbd\x7d\x47\x20\x4f\x55\x8a\x73\xfd\xbd\x92\x65\x6c\x53\x0e\x4b\x41\xdf\x5f\x5e\xc0\xa9\x2a\xf1\xdc\x30\x61\xd4\x1e\x82\x22\x3b\x19\x3c\xe3\x3a\xdc\x92\xfc\x60\x69\xea\x80\x8a\xac\xc6\x55\x0a\xcd\xcc\x92\xbc\xa3\x7b\x42\x33\x2d\x9d\x32\x15\xd2\x8c\x04\xb9\x06\x9f\x49\x53\xff\x5f\x12\x88\x71\xc6\xb8\x8b\x95\x34\x5b\x72\xf0\xc2\x08\x71\x76\x21\x62\xf8\x1e\x1a\x98\xea\x04\x25\x2e\x0e\x01\x87\x88\x93\xde\x31\x4d\x0a\xc5\x12\x96\x32\x91\x04\xf6\xb0\x61\x2b\xfa\xe3\x1f\x9e\x64\xbe\x87\x9d\xbe\x92\xc2\x92\x71\xe4\x5e\x5f\x8a\x94\x27\x14\x79\x90\xeb\x66\x5d\x93\x30\x58\x35\x9d\x8e\x49\x21\x06\x6e\x84\xcb\x96\x9a\x29\xec\xee\xac\x4a\x86\x48\xfc\x6b\xb9\x62\x19\x33\x18\x71\x0b\x71\xfd\xd4\x60\x2b\x01\x6c\x28\x4f\x8d\x27\x8c\xf0\x49\x67\x42\x97\xd0\x2e\xc4\x5e\x8d\x0d\x49\x25\xab\xe3\x15\xa9\x26\x3f\x5c\x5e\x90\x6f\xc8\x73\x3b\xbf\x17\xe0\x63\x59\x53\x1e\x52\xdb\x8d\x44\x2f\xcc\xa1\x5e\xbd\xf6\xc0\x61\x19\x40\x9f\x44\x2a\x3c\x86\xa7\x44\x84\x7c\x3e\xd0\x2d\xc6\xad\xd0\x5e\x77\x7c\x8c\xb1\xf3\xcc\x81\xd1\xa6\x4d\xe8\x01\x72\x0e\x8d\x13\x26\xf4\x21\x72\x0e\x40\x1c\x27\xf4\x09\xe4\x1c\xcd\x92\x7e\xd0\x4c\x4d\xe0\x48\x3f\x1c\x95\x23\x35\x55\x00\x4b\xb5\xed\xd5\x23\x69\xe6\xcc\xd0\x94\x1a\x4a\x78\x68\x3b\x4a\xd1\xe8\x08\xf2\x5b\xd8\xe0\xe3\xf1\x2b\xcd\xde\x72\x51\x3e\xa0\x8b\x6c\xca\x15\xf2\xe6\x0d\x7c\x48\x12\x3f\x79\x40\x38\x2d\x8a\x8c\x63\x80\x70\x3b\x8f\x32\x80\x19\x3c\xe4\xcd\xf4\x98\x3e\xc5\x07\x8e\x32\xcd\x32\x69\x59\xa5\x95\xea\x54\xa4\x32\x0f\x80\x3d\x9c\xa0\x55\x98\x18\x4d\xb6\x4d\x0b\x7b\x0f\xb1\x4c\x12\x52\xff\xe2\x62\x2f\xee\xea\x9c\xb1\x1d\x0b\xa6\xdd\x1c\x66\xd7\xda\xf7\xad\xe2\xe4\x77\x00\x00\x90\x8c\xae\x58\x86\xc2\x03\xa9\x24\xd2\xd9\x1a\x45\x43\xd1\x57\x33\x25\xb3\x29\xc1\x48\x1f\x64\x06\xfe\x2d\x5a\x2d\xc6\x02\xf8\x42\xd6\x02\xaf\xc5\xaf\x05\xf4\xfa\xd6\x5a\xe0\xbe\xf3\x65\xac\xa5\x0c\x4a\xa2\xce\x5a\xac\xe0\x6a\xaf\x05\x24\xc8\x97\xb0\x96\x88\x6b\xfd\x3d\x17\xa9\xbc\xd7\xd3\x99\xee\x8f\xf8\xa1\xe7\x0c\x89\x65\x3d\x86\x8b\x8d\x6e\x32\x5e\x1a\x34\x96\x36\xef\xa9\x7d\x9c\xd7\x1b\xe7\xab\x7c\xea\x2e\x8f\x0a\x40\xf7\x0a\x57\xa9\x9d\x7f\xe6\x11\x82\x34\x44\xf1\x51\xbc\xf1\xe8\x1c\x70\x93\x6b\xfa\x5a\x59\x58\x86\xd3\xec\xa6\x98\xd4\xf6\xec\xfb\x77\x37\xe7\xed\x8f\x2d\xe1\xde\x43\xca\xbd\x5d\x8f\xfd\x9d\xd0\x34\xe7\x5a\x87\x4d\xd2\x80\x5f\xb6\x82\x76\x74\xcf\xbd\x8f\x62\xc3\xcd\xb6\x5c\x2d\x13\x99\x37\xdc\x15\x0b\xcd\x37\xfa\xcc\x51\xd9\xc2\xce\xfe\xc5\x08\x5c\x2e\x32\x2e\x1a\x46\x07\x48\x60\x77\x4a\x1d\x4c\x30\xa9\x56\x00\xa8\xc7\x4c\xd3\x11\xa0\x68\xe5\xed\x41\x00\x66\x97\x72\x96\xa5\xce\x10\x81\xe1\xd8\xf6\x3c\x67\xc5\x96\x2e\x40\x60\x8c\x00\x77\x39\x63\x70\xaf\xdf\x4a\x21\x9d\x0f\x1d\x63\x8e\xdd\x55\x0a\xed\x12\x30\x09\x77\x72\xec\x5c\x46\x00\x37\x2d\x1f\x47\x61\x6d\x5d\xea\xb9\x1a\x0d\xac\x1f\xa1\x20\x40\xa0\xcb\x98\x6b\x44\xe3\x8c\xac\xac\x77\x23\x51\xf9\xfe\x2d\xec\x43\x75\xe3\x99\x88\x7e\xb8\xf9\xb8\xcf\x2c\xb7\xf1\x4c\xb8\xf7\x26\x34\xb2\xa8\x4e\xed\x95\xde\xdb\x90\x7d\xa5\x7d\x23\x1a\x3d\xbe\xdd\xfb\xd2\xd8\xad\x68\x04\x64\x9f\xb2\xfb\x24\x5d\xb7\x1f\xe8\x11\xf4\x5d\xd2\xa7\xf3\x1e\xd0\xf3\x8a\x19\x47\xce\x40\xb0\x39\xdd\x93\xd5\xd8\x71\x49\xb9\x06\xb3\x26\x38\xa5\x9b\xc4\xfb\xa1\x49\x48\xc7\xa6\xd3\x27\x3b\xe6\x31\xb0\x35\x3a\xab\xfb\xa6\xf1\x3e\xe1\x5d\x53\xd4\xb5\x4c\x31\x64\xbc\x0a\xca\x1d\xec\x7f\xe8\x42\xd7\xf9\x3f\xbc\xec\xaf\x35\x0b\x21\x31\x66\xa2\x19\x47\xee\x1b\xcc\x62\xd3\xd4\x01\x98\xce\xa2\xeb\x9a\xaf\xb6\x66\x81\x56\xae\x2d\xd7\xcd\xe4\xf0\xd3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x29\xf9\x8f\x52\x1b\x42\x2b\xf7\x73\xab\xe7\x44\x15\x73\x0c\xe4\x94\x0c\x5a\x53\x7c\x2e\x96\x91\x76\x32\x3b\x9e\x32\x92\xf2\xf5\x9a\x79\xb7\xf8\x8a\x91\x82\x2a\x9a\x33\x03\x6e\x14\x44\x2d\x74\xe1\x15\xc3\xc4\x20\xd7\x84\xfa\x5e\xb7\x55\x04\xdc\x29\xfa\x68\xb9\x21\x39\xdf\x6c\x51\xd7\x21\x94\x64\x52\x6c\x20\xa2\xcf\x4e\x21\x93\x74\xe8\x24\x02\x73\x90\x8a\xdc\x53\x95\x13\x4a\x12\x9a\x6c\xc1\x4a\x48\x05\x49\x4b\x05\x09\x9e\x86\xd1\x74\xbf\xd0\xc6\xde\xb3\xad\x76\x04\xa6\x34\xc4\xc0\xa0\x17\xba\xd3\x09\x03\xf0\xc5\x31\x12\xd9\xca\x92\xea\x98\x38\x5f\x81\x57\x0e\x9a\xe4\x37\x00\xbd\x75\xc0\xe6\x94\xfe\x83\x67\x4e\xe9\x9f\x53\xfa\xe7\x94\x7e\xff\xe6\x9c\xd2\xdf\x79\xe6\x94\xfe\x39\xa5\x7f\x4e\xe9\x9f\x53\xfa\xe1\x99\x53\xfa\xa7\xcf\x6d\x4e\xe9\x9f\x53\xfa\xe7\x94\xfe\xc6\x33\xa7\xf4\x77\x46\x99\x53\xfa\xbf\x8c\x64\xbd\x39\xa5\xdf\x3f\x73\x4a\xff\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x07\xcf\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x63\x2e\xb4\x94\x0f\xa4\x5a\xc6\x64\x1d\x38\x03\x7e\x23\x56\x71\x55\xae\xd7\xf6\x86\x2a\x07\x85\xb5\x1d\xb1\x63\x89\xae\x72\xdf\x2a\x47\x97\xb3\x26\x6b\x66\x4e\x21\xad\x01\xc3\x74\xa6\x01\x75\x81\x94\x90\xd6\xa8\x98\x86\x34\x00\x41\xde\xbc\xff\x6e\xd9\x48\x7a\x18\x34\x65\x0e\xa6\x42\x8c\xc5\x1c\xc3\x6c\xde\x8b\x24\xc6\x29\x59\x23\xb6\x2f\x12\xd4\xe1\x37\xc9\xa4\xc6\x98\x02\x00\x3d\xe4\x9a\xda\x52\x21\x98\xd7\x3a\xb8\x01\x5d\x79\xc5\x98\x20\xb2\x60\x02\xfd\x50\xbe\x2d\x03\xa1\xc6\xd0\x64\xbb\xb4\xe3\x8b\x20\x54\x9f\x1d\x5a\x8d\x6e\x59\x2f\xa3\x39\x22\x57\xb1\x9c\x72\x1c\x80\xd0\x44\x49\xad\x49\x5e\x66\x86\x17\xd5\x10\x43\x3b\xc6\x20\x06\x08\x23\xb3\x2a\x84\x81\x63\x81\xa1\x29\x1e\x62\xfa\xdd\xc6\x6a\xbf\x04\x29\x46\x03\xaf\x41\x37\x3a\x85\x84\xf6\xbc\x30\x7b\x74\xb9\xa2\xe3\x89\x2b\x6d\x48\x92\x71\x10\xff\x30\x3b\xcc\x09\x85\x51\x4e\x03\x4e\x7d\x03\xb9\xa2\xb0\x56\xed\x16\x2b\x52\x90\x1a\x85\xd1\xe8\x68\xac\x87\x71\x03\xa4\x5c\x3b\x19\xad\x87\x3c\x13\xd4\xf7\x0e\xc1\xcd\xf6\x6b\x85\xed\x4e\x61\x08\x3f\xa6\xfb\x53\x63\x90\x11\x2c\x40\xca\x93\xbb\x28\xd5\x87\x0a\x52\x8c\x7d\x9e\xcf\x69\xab\xcf\x48\x51\x25\xcb\x99\x2d\x1d\xae\xb4\xe0\x0f\xa2\x9b\x2d\x10\x81\x60\x3b\x4b\xb3\x2c\x61\x56\x85\xa6\x9d\x13\x86\xc3\x3d\xea\x28\x19\xa6\x72\x2e\xc0\x2d\xfb\x8e\x69\x4d\x37\xec\x7a\xd0\xc0\x33\xa4\x36\x81\x8d\xa7\x46\x35\x10\x42\x06\x3a\x54\xfd\x97\xda\x25\x76\x32\xc4\x10\x1a\x53\x21\x39\xce\xa5\x8a\x01\xbc\x57\xdc\xd8\x3b\x15\xd7\x98\x4b\x07\x76\xcd\xc3\x80\xcb\x61\xd0\x4d\x27\xdc\x3b\x0f\xba\x06\x69\xf9\xbb\x48\xd1\x71\xb5\x62\x64\xa5\x38\x5b\x93\x35\x17\x34\x73\x1e\xa8\x21\xfa\x82\x1c\x11\x8a\x0a\xb5\xd6\x56\x35\x95\xc2\x3b\x56\xfc\x1a\x96\xe4\x47\xb7\x08\xa3\x4a\x91\xd0\xd1\x9c\x65\x21\x53\x46\xf8\x9a\x6c\xc0\xdb\xa5\xd0\xa1\xfe\x87\x6f\xfe\xc7\x1f\xc9\x6a\x6f\x25\x22\x18\x2a\x8d\x34\x34\xab\xd0\x94\x31\xb1\xb1\x7b\x00\x0c\x62\xe8\x2c\x64\x59\x33\xfd\xd2\x63\x16\xea\xaa\xe0\xd2\x5f\x7e\x7b\xb7\x6a\x8b\xf4\xb3\x94\xed\xce\x1a\xfb\xb2\xc8\xe4\x60\x5c\x4a\xb7\x19\x4e\xbf\xf0\x1d\x51\x2f\x7b\x08\x12\x8a\x2f\x44\x90\xa4\x4f\x7e\x22\x5b\x79\x8f\x39\x98\x3d\x14\x55\xbb\xc4\x0b\x59\x94\xd9\x70\xd7\x1e\x42\xbe\xb3\x54\x0c\x78\x2a\x9d\x74\x68\x85\x33\xf6\x9e\x1c\xb8\xe8\x3b\xc0\xc3\xbc\xae\x29\xe1\xd1\xc5\xe9\xa7\x27\x5d\x3c\x94\xbb\xe4\x56\xb9\x4f\xa5\x62\x4b\xf2\x1d\xcd\xb2\x15\x4d\xee\x6e\xe5\x5b\xb9\xd1\xef\xc5\x1b\xa5\x06\xd5\x80\xd6\xbc\x33\x6a\xf9\xf2\xb6\x14\x77\xed\x56\x0b\x99\xdc\x58\x3d\xae\x28\x8d\x8f\x58\x69\xac\x6a\x00\xb0\x9f\x29\x9c\xf1\x4a\x08\x50\xd7\xcb\xa6\x86\xcd\x1e\x80\xae\x20\xe0\x89\x0a\xc2\xec\x5c\x87\x30\x6d\x29\xba\x39\x17\xdd\x24\xcb\x6f\xbf\xf9\xc3\xbf\x21\xe9\xdb\xdb\xc5\xbf\x7d\x03\xce\x7f\x7d\x8a\xcc\xc5\x72\xc6\x61\x0e\xad\x73\x9a\x65\xf6\x22\xd1\x24\x6a\xbb\xad\xcb\xd8\xde\x4d\x63\xd4\x6a\x62\x08\x33\x5a\xb9\xbb\xbd\xfd\x5b\x40\xb3\xe3\x46\xb3\x6c\x7d\x8a\xb1\x77\x55\xbe\xed\x09\x08\x8a\x13\xc7\xbb\xac\x54\xef\x8a\x86\xc7\xa9\x59\x3b\x99\x95\x39\xbb\x60\xd0\x74\x25\x62\x99\xad\xf7\x7d\xc4\x46\xe6\xfa\xa3\xad\x32\x99\xdc\x91\xd4\xfd\x08\x93\x1d\x58\x26\x78\xad\x5c\x48\x4f\xe3\x2e\x58\x45\x01\x41\x00\x9e\x8f\xe4\x79\x6a\xc7\xad\xe6\x9c\x5b\xfe\xb6\x9c\x16\x05\x34\x1a\x5b\x43\x82\xd0\x3d\x2e\x20\x70\xc7\x02\x08\xae\x93\x0e\x3d\x4e\xf7\x2d\x04\x3a\x2c\x90\x7b\xd6\x53\x7f\xe2\x37\xa0\x80\xff\xc6\x78\x91\x09\xa9\x75\xa4\x0e\xdb\xab\xd6\x86\x12\xc3\x62\x06\x4e\xe6\x93\xfb\xf0\x4c\xea\x7b\x04\x66\x85\x46\xa7\xa7\x66\xbc\x32\x25\x05\x53\x1a\x9a\xc3\x99\x8f\xb0\xa3\xaf\x33\xca\x43\x19\x5d\x84\xd4\x0d\x8f\x9e\xb6\x8c\xf1\x0e\x3c\xf5\x9e\x0c\xbe\x12\xf0\xf6\x3d\xb1\x37\x0f\x12\x38\x24\xe3\xc7\x9c\xe1\x6b\x99\xba\x4f\xe0\x90\x62\xe1\x82\x1e\x55\x4b\x47\xe4\xbe\x1f\xbd\x3d\xde\xc7\x7a\x2d\xed\xb3\x6a\xff\x52\x1d\x56\x7c\xcb\x1d\xc5\xc1\xbd\x3d\xd2\x11\x85\xa1\x27\x9d\x50\x38\x9b\x8d\x8e\x5b\xb5\x3c\x68\xa9\xd0\xb8\x09\x41\x0a\xae\x55\x19\xa7\x13\x2f\x09\xda\xb4\x2d\xd6\x1d\x58\x72\xf2\xea\xe4\xc9\xe7\x14\x17\xa9\x64\x41\x37\x23\xa5\xa3\x0e\xd6\x7a\xf8\x21\x49\x19\x2a\x18\x4c\x83\x92\x06\xbf\x83\xdb\x28\xb8\xd0\xc2\x41\xf0\x9d\x9d\xbc\x8f\xcf\x99\x69\x3d\xfa\x9c\x0a\x82\xc1\xc1\xf7\x41\x2f\x36\x21\x54\xc9\x52\xa4\xee\x7e\x5e\x19\x42\xde\x1d\x4c\xf8\x4a\x0a\x50\x72\x30\x07\x29\x10\xb6\x8a\x4f\x2b\x46\xdc\x72\x98\x97\xcb\x97\xdf\xfc\xb2\x6c\xf2\xf6\xa0\x21\x9e\xc5\xc8\x55\xc5\x26\xf1\x6c\x3c\x79\x46\xbe\xc0\x46\xf4\xac\xde\xb9\x4b\x5b\x5d\x3f\x83\xfb\xaa\x02\xf0\x27\x7b\x19\x63\x51\xa5\xf0\x08\x79\x0e\x2a\x8d\xd5\x05\x1b\x59\x09\x2f\x26\x95\x81\x89\x4b\x6b\xb7\xf7\xbb\xd5\x93\xce\x36\x1e\x62\x24\xda\xbe\xbb\x70\x98\x9a\xdc\xd7\x3d\xc7\xbc\xd5\x45\xee\x19\x79\x8e\x6f\x9e\x68\x88\x45\x7d\xf1\xe4\xed\x75\xcb\x7e\xf3\x50\x04\xf3\x28\x5b\x4b\x7f\xf3\x50\x50\xb8\x43\x17\x63\x38\x18\x51\x3a\xda\x52\x66\x18\x07\x7f\x66\x5b\xba\x63\x10\x27\xcb\x33\xaa\x06\x33\x09\x1c\x5c\x49\x6e\x70\x55\xd0\xec\x96\x89\x1d\x57\x52\x80\x9f\x6a\x47\x15\x87\x9c\x22\x68\x45\xc8\x84\xd5\x4f\x7f\xf7\xfc\xe3\xf9\x07\xf0\x0f\x84\xb3\xdd\x30\xf7\xc0\xad\xbc\xd4\x10\x83\x70\xb0\x82\xc6\x50\xf5\xc6\x8d\xcd\xb5\x67\x53\xfd\xfc\xed\xae\x00\xaf\xf3\xeb\xb1\x73\xc8\x4b\x53\xd2\xe1\x6c\x0a\x7c\xd8\x43\x92\x95\x9a\xef\x9e\x7a\xfe\xc7\x35\x9e\x4a\x2a\x7e\x06\x85\xc7\x85\x74\x5f\xf0\x01\xda\xed\x6f\xb8\x7b\xa2\xbb\xb1\xe0\x60\xd6\x13\xd2\x8c\x77\x3d\xed\x35\x2e\x9f\xe8\xaa\x36\x4e\x33\x95\xd5\x5d\x5c\x5d\xca\xc5\xe0\x2d\xa8\xaa\x0b\x99\x76\xcd\xee\x90\x9f\x75\x9c\x2b\xec\xf0\x5e\x0e\xec\x51\x60\x77\x86\xf6\x05\xbb\x36\xbf\x95\x09\xed\xa4\xfe\x77\x5a\x69\xbb\xf7\x48\x0e\x49\x58\xae\x96\x54\x6e\xaf\xcf\xa5\x76\x11\x63\x0e\x1e\x91\x82\x64\x52\x16\x2b\x9a\xdc\x75\xf7\x45\xcb\x6e\x6d\x19\x68\xb8\x4b\x37\x94\x0b\x5d\xe7\x23\x5d\x76\x22\x7f\x86\x45\x43\x26\x37\xdf\xa1\xdb\x28\xb8\x0c\xb9\x71\xde\x25\x88\x2b\x68\xcc\x1f\xaf\xe8\x8d\x9d\x85\x12\xa5\xbd\xc3\xf7\x6c\x57\x26\x37\x6f\xfb\xca\x27\x74\x06\xc7\xdc\xb4\xa3\x8e\x2d\x64\xca\x6e\x58\x06\xe7\xe2\x70\xfc\xb8\xda\xbf\x01\x2a\x6c\x2d\xe0\x02\xaa\xda\xba\x33\x72\x25\x53\x4f\x05\x32\xc5\xf0\x22\x9d\x6c\x59\x5a\x66\xe0\xaa\xe8\x9f\x7e\x0f\x6d\xca\x1d\x53\x8a\xa7\xec\x2f\x52\x48\xf5\x96\xae\x58\xd6\x99\x61\x3b\xb3\xa6\xfb\xbe\x55\x58\x1a\x9e\x93\x0a\x24\xd4\x70\xc6\x0c\xcb\x1a\xb9\x9d\xd5\x43\x36\xeb\x4f\x50\x52\x40\xbb\x6e\xc7\x0d\xc8\xda\x87\x24\xdf\x60\xcb\xd2\x77\x52\x70\x23\xc1\x99\x7e\x2d\x53\xf7\xaf\x2e\x46\x65\x55\x97\x89\xeb\xc6\x7c\x9a\x63\x0d\xea\x42\xc3\x44\xde\xc2\xd5\x2d\xcf\x99\x36\x34\x2f\x26\xe0\xab\xfe\xc6\x87\x4c\x1b\x49\x36\x99\x5c\x61\x99\x3f\xb1\x96\x2a\x61\x38\xcb\x3e\x8e\x64\xea\xcf\xb9\x00\xe4\xea\x44\xd1\xc2\xd3\x6e\x27\xde\x7a\x78\x25\x05\xb5\xfc\x36\x38\x71\xd0\xfe\x69\xf3\x9c\xa4\xac\xc8\xe4\x1e\x14\x03\xae\x1d\x08\xc8\x39\xa4\x2e\x55\x86\x3d\x24\xac\xe8\x0a\x26\x7b\xdc\x52\x96\xb1\xfe\x5a\x51\x3e\xf0\xb5\x14\x29\x53\x19\xb4\xcb\x47\x32\x9d\xb2\x1c\x99\xbe\x73\x29\xb9\xc1\x35\x5d\xd7\xef\xd5\x24\xa9\x89\x23\x36\xab\x39\x9c\x5b\xb9\x41\x71\x39\x78\xd0\xfa\x6e\x60\x8d\x5b\x97\x0f\x6c\xa9\xd1\x54\xc8\xb4\x33\xf5\xd0\x7d\x99\xd6\x43\xf6\x89\xe5\xf8\xfa\xe1\x23\xfa\xc9\x41\xed\xe2\xc6\x42\x31\x81\xb0\x74\x59\x4f\xc0\x02\xef\xd8\xde\xc5\x28\xe4\xb4\x20\xda\xc8\xa1\x3e\xd4\x68\xc4\xae\xea\x86\xa3\x68\xc1\xc4\x5f\x38\xba\xab\x7d\xdd\xc4\xdd\x48\x99\x39\xa7\xa7\x54\x6c\xd0\xe7\xa9\x98\x51\x9c\xed\x18\xa1\x6a\xc5\x8d\xa2\x6a\x5f\x25\x5c\x83\x87\x67\x0f\xdc\xce\x8a\xad\xbf\x97\x4c\xed\x41\x41\x85\xc8\x34\xd0\x84\x7b\x41\x5a\x82\x53\x0c\x84\x64\x8a\x99\x9d\xb9\x4c\xf9\xba\x45\x6d\x87\x31\x99\xfd\xc1\x16\x96\x9d\x2d\x36\x25\x4f\xd9\x59\x63\xe3\xfa\xfc\x39\x41\x65\x2d\xeb\xe5\xb4\x9f\x70\xbf\xdf\xd1\x02\x02\x5b\xe0\x6d\xbb\xbd\x48\xef\xb0\xc7\xba\xd5\x76\xdc\x65\xd8\xf6\x0e\x29\xd5\x86\x0a\xfe\x0f\xc4\x77\x42\x0d\xdb\x48\x65\xff\xf9\x5c\x27\xb2\x70\xbb\x00\xb2\xf0\x45\x03\xad\x74\x8f\x17\xee\x5e\x88\xda\x89\x4e\x70\x1c\x29\x56\x64\x3c\x69\xd5\xd0\xce\x20\x93\x17\xe0\xba\x16\xe7\x63\xf1\x32\x51\x7b\x87\xf8\x9f\xb8\x6d\x83\x3f\x15\x95\x28\xba\xa2\x39\xd3\x05\x4d\x06\x55\x82\x4e\xcc\x3b\xbc\xed\x95\x10\xc4\x86\x2b\xae\x5f\x0b\x38\x74\xe8\xef\x18\x2a\xde\x9d\x49\x0b\x9e\x9d\x62\xaa\x6b\xb2\x65\xc9\x1d\x91\xf7\x02\x34\x54\x00\x3d\x85\x15\xc1\x36\xd9\x5b\x94\x8b\x90\xe8\x43\x70\xdb\x8a\x75\xf0\x01\x7a\x21\xbc\x63\x03\xeb\x04\xf9\x1d\xf6\x0a\xb5\x15\x20\x03\xa9\x41\xb7\x2e\xef\xc8\xbf\x05\x07\xfd\xfc\xea\xa2\x5f\x7f\x0f\x58\x47\xdb\x65\xa6\x03\x13\xc1\x09\x57\xbf\xe0\x39\xc0\xdb\xc4\xd0\x4d\x14\x8f\xcc\x29\xa1\xf6\x14\x9d\x62\x34\x86\x70\x29\xdc\x1e\x84\x62\x19\xf5\xe5\x6e\x2d\x2b\xad\x8f\x5a\xff\xc2\xc7\xed\xa9\x77\x2c\x60\x52\x6a\x2d\xd7\x8e\xe7\x3d\x4c\xb0\x6e\xfb\x87\xca\x63\x51\x2d\x75\xbc\x72\x53\xc8\x8d\x11\x71\x17\xf6\x18\x89\x9c\x76\x85\xc0\xaa\xba\xb4\x46\x14\xdb\x6b\x3e\xc3\x4a\xf2\x7a\xcb\x0b\x88\x99\x0c\xcc\xda\x15\x44\x77\xd8\x26\x1f\x69\xc6\xd3\x0a\x38\x52\xd4\xa5\x38\x25\x57\xd2\xd8\xff\x79\xf3\xc0\xb5\x19\xab\xe9\x7b\x21\x99\xbe\x92\x06\xde\x7d\x12\x4a\x70\x52\x91\x08\x71\xac\xd9\x65\xf7\xdb\xab\x63\x83\x81\xfb\xe5\x5d\xae\x5d\x39\x29\x5c\x5f\x60\x11\x5c\x93\x4b\x61\xf5\x66\xb7\xf2\xaa\x20\x88\x76\xc0\x7d\x18\xa8\x90\x62\x01\x9e\x6b\x0f\x3d\x00\xb4\xda\x34\xae\x3d\x2a\xa5\x6a\xe1\x6b\x60\xa0\x00\xcc\x15\x23\x6e\x78\x30\xd8\xe2\x37\x10\x53\x54\x64\x34\x61\xa9\xaf\xa0\x40\x2d\x2e\xac\x08\xe2\x09\xc9\x99\xda\x84\xe6\x59\x58\x3e\x35\xbc\x75\xa3\xa9\x88\x13\x6a\x8a\x0c\x67\x89\x85\x8d\x43\x0b\x4b\xeb\x03\xbf\x04\xb7\x77\xc4\x28\x14\x9a\x15\xb0\xef\xfe\x4b\x1f\xf9\x64\xaa\x48\x63\x50\xe4\xbe\x39\xaa\x26\xff\x69\xd9\x29\x10\xca\x7f\x91\x82\x72\xa5\x97\xe4\xdc\x85\x0c\xf6\x8e\xd9\x7c\xdf\xd9\x81\x9a\xa0\x2d\x54\xae\x0f\x6a\xa7\x53\x41\x18\xc6\xe0\xf7\xab\x37\xeb\x8e\x44\x3b\x25\xf7\x5b\xa9\x91\x8b\x57\x3e\x8c\x67\x77\x6c\xff\xec\xb4\x75\xf2\x86\xa2\x39\x9f\x5d\x8a\x67\xa7\x95\x03\xa6\x75\x0e\xbc\x9c\x41\xd1\xfd\x0c\x7e\x7b\xb6\xec\x08\xc1\x5e\xb0\x41\xc1\xf8\x34\x15\x26\x4a\x73\x39\xf9\x6f\x6f\x1e\x0a\xa6\x38\xf4\xdc\xc9\xfe\x5b\x43\x57\xe9\x55\x65\x0c\x55\x1b\x66\x1a\x6a\xcc\xa1\xe6\x35\x6b\x25\xb3\x56\x32\x6b\x25\xb3\x56\x32\x6b\x25\x0d\xdc\xcc\x5a\xc9\xac\x95\xfc\xd6\xb5\x12\x65\xfa\xea\x48\x1e\x58\x75\x95\xcb\x4d\x04\xd3\x55\x95\x3d\x0b\x7e\x11\x91\x92\x8d\x55\x39\xa0\xd5\x96\xb3\x21\x0d\x84\xab\x34\x6b\xc2\xdc\xb3\x55\xef\x1c\x7b\x88\xa9\x50\x5c\x42\x09\xc5\x8c\x6a\x3d\x3e\x59\xf7\x36\x49\xec\xeb\x84\x6a\xcd\x37\xa2\xb6\x23\x5f\xcb\xf4\x70\x62\x81\x81\xbd\xcd\xf9\x8d\xb3\xb0\x02\x91\x8d\x4e\xc1\xc7\xbc\x34\x4c\xfb\x95\x89\x16\x65\xb3\x2f\xb2\x87\x5d\x7b\x1a\x2f\x76\x70\xc6\x85\x36\x54\x24\x18\x6f\xd8\x2d\xaf\x89\x26\x64\xb9\x26\x3f\xd7\x93\xfd\x79\x49\xde\xb4\x86\xeb\x00\x05\x1f\xc1\x4f\x42\x9a\x9f\x20\x2d\x11\xba\x84\x81\xd1\xb6\xca\x9a\x73\xee\x26\x0c\xb0\x76\xc2\xe7\xf9\xcf\xcf\x9e\xfd\xdc\x89\xf0\x18\xc4\x1e\xd8\x8e\x83\x78\xfa\x3f\xf6\x0d\xa8\x24\x8c\xfd\x24\x51\x7b\x81\xef\xda\xd5\xd6\xd6\x19\xdd\xb8\xe6\x75\x90\xf6\xd2\xc7\x6e\x6a\x1c\x4e\x31\xc8\x65\x52\xde\xad\x68\x72\x77\xc1\xb2\xae\x6b\xa3\x33\x61\x6c\x88\x94\x19\x5a\x55\x45\x4c\x98\xef\xa3\xea\x3a\x19\x81\x65\xdd\x62\x2b\xb7\xff\x99\xf4\x1f\x63\x27\xca\x58\xc5\x6f\x08\xb3\x98\x47\x65\x67\xf8\x68\x0f\x30\xda\x9c\x3e\xbc\x96\x22\x29\x95\x9d\x4f\xaf\xba\xd8\x9b\x2d\x0b\xc1\xf8\xf8\x15\x1a\xfa\xf9\x81\x9d\x1a\xfa\xa1\x18\x22\x07\x2a\x4f\x8f\x65\x31\x86\xf3\x17\x73\xfa\x70\x43\xf3\x22\xeb\x17\x2d\xed\x00\x2e\xd7\xe6\xb6\x2e\x5c\xa2\xf1\xcb\x3a\xe3\xcd\xd1\x0c\x15\x50\x33\x12\x82\x46\x7b\x11\x9f\xb3\x1c\x82\x2b\xae\xa4\x71\x9e\x14\xbf\x70\x38\x12\x6b\xca\x33\x97\x8d\xb0\x27\xf7\x10\xf6\x03\xf0\xa0\x61\xa4\x1b\xb4\x5f\x10\x6e\xa9\x70\xa9\x8d\xc2\x48\x37\x0c\x96\xc6\x03\x65\x26\xd3\xd2\x75\x11\xc6\xd8\xe1\xc3\x95\xf4\x33\xfb\xc6\xb2\x14\x33\xa5\xea\x38\x9d\x9f\xbe\x0d\x2e\x8f\x37\x7a\x0f\x20\x99\xcd\x4f\x2c\xa7\x7b\xac\xdb\xe9\x4a\x72\xac\x18\x28\x68\x2b\xc8\xc9\x9f\x48\xc6\x83\x12\x4a\xb1\x5c\x1a\xf6\x81\xd1\xb0\x37\xb5\x5d\xa7\x15\xeb\x6b\xd9\x0f\x7f\x52\x8c\xa6\xf0\x53\xab\x98\x27\x6b\x5c\xae\x3b\x13\x75\xf1\xfd\x50\xf8\xd0\xae\x31\xd9\x42\xd6\x37\x17\x84\x8a\x3d\x29\x8b\x44\xe6\x76\xa1\x8a\x65\x8c\x6a\xfc\x3b\x59\x29\x46\x21\x84\xe7\x9e\x76\x8a\xfb\x0d\xe8\x99\x9d\x06\x83\xb8\xcc\x0e\x43\x6c\x2e\xa4\xd5\x3a\xb7\x9f\x1a\x1a\x62\xab\xbb\x07\xe1\x1b\xe7\x8a\x6a\x9e\x9c\x97\x51\x49\x78\x7f\xf6\xef\x56\xfa\xc0\x0f\x1f\xde\x3e\xf6\x9a\x5b\x50\xad\xef\xa5\x8a\xad\xee\x71\x0b\x37\xda\x44\xd5\xc5\xd4\x9c\xe2\x41\x72\xe7\xcf\xa9\xbc\x33\xa1\x8c\x47\x52\x67\xfc\xfb\x7c\x05\x9c\x06\xb6\x5e\x2e\xcd\x96\x09\xe3\xdc\x65\x4f\xad\xab\x17\xbc\xc8\xf7\x2e\xd0\xaa\x9e\x2e\x69\xc2\xad\x15\xea\xc7\xd9\x7b\x3c\x44\x34\xba\x88\xeb\x20\x50\xb8\x56\x51\x6c\x25\xe5\xa1\xdc\xb1\x91\xea\x93\x91\x45\x18\xc6\x6b\xb0\x1d\x24\xff\x37\x6a\x33\xb8\x70\x47\x33\xb9\x4e\x8f\xd5\x34\x77\x9c\xdd\x9f\xb9\x88\xb9\xc5\x3d\x37\xdb\x85\x73\x85\x9e\xc1\xae\x9f\x7d\x0d\xff\x33\x82\x17\xac\x18\x72\x9e\xa6\x2e\x66\xbb\xd4\x6c\x5d\x66\xa8\xeb\xeb\x25\xa1\x05\xff\xc8\x94\x15\xcd\xa7\xe4\x8e\x8b\xf4\x94\x94\x3c\xfd\xf7\xa3\x94\xd5\x90\x3e\x79\x35\x1e\x77\x37\xc0\xd9\xf6\x55\xb7\x63\xa8\x38\x8c\xbb\x69\xaf\x20\x46\x03\xb1\x8c\x5c\xb0\x09\x52\x83\x6b\xdd\x1d\xb1\x92\xb1\x08\xe5\x98\x3a\x13\x43\x97\x5b\x12\x57\x66\xa2\xd4\x56\x8d\x0d\xd1\xd9\x2f\xc2\x17\xfc\x34\x66\xbe\x30\xf3\x85\x99\x2f\x7c\x76\xbe\x30\xf2\xc2\x8a\x51\xc5\xd4\xad\xbc\x63\x31\xd5\x4f\xf0\x6d\x62\xec\xeb\xee\x0e\x67\xd5\x2d\xc8\x0d\x79\x54\x5e\x6e\x63\xf8\xef\xf8\x50\x97\xae\xd6\x14\xbe\x73\x25\x0b\x40\xc3\x3b\xfa\x7c\x0a\x25\x1f\xf6\x3f\xa8\x01\xba\x6a\xc7\x52\x3a\x12\xb4\x97\xe9\x87\xfd\x0f\x1f\xde\x3e\x66\x3c\x3b\xd1\x0f\x2c\x61\x43\x4d\x8c\x7b\xd3\x93\xb1\xf8\x44\x23\xd5\x82\xa6\xc8\x6d\xfd\xfd\x0c\x94\xcc\xe1\xd6\x9e\x50\x97\xa9\xd1\xee\x21\x83\x48\x6e\x6d\xa4\x6a\x24\xde\x6f\xe9\x8e\x55\x4d\x18\xb0\xb2\xc7\x7a\x28\x31\x7c\x8c\xd4\x71\x57\x6e\x87\xaf\x4f\x87\x9c\x1b\xdf\x74\x3b\x0a\x95\x7f\x2b\x23\x4e\x63\x87\x09\x13\x29\x34\x60\x79\xd4\x56\xfb\x93\xf7\x8e\x9a\x64\x3b\x58\xaa\x38\xde\xbe\x1b\xc1\xbb\xda\x2e\x37\x51\x71\xb1\xca\x1b\xc8\xfe\x5e\x52\x68\x6a\x9e\xbb\x49\xb9\xb0\x4f\xbb\x19\x43\x83\xca\x2a\x9e\x10\x32\x40\x5b\xae\x3a\xe9\x2e\x9f\x8f\x41\xdc\xb0\xb5\x3c\xd3\xaf\xe1\x66\x15\xb3\x93\x6f\x6f\x08\xbe\xdc\xac\x04\x3a\x7a\x4a\xc7\xd5\x81\xa4\xd7\x00\xd5\x33\x83\x1b\x53\x26\x95\xbf\xd2\xe7\xfd\xbc\x3e\x27\x09\x53\xa6\x39\x27\x28\xaa\x00\x8e\xe1\x40\xa5\xe8\xd8\xee\x09\x76\xc1\xef\xe8\x94\x9e\xf9\xaf\xfd\x37\xcd\xa9\xc2\xa9\x6b\xcf\x71\x44\x36\x8d\xae\x20\x7e\x15\x24\x46\xe1\xea\xac\xc3\x2b\x5d\x95\x9a\x35\x56\xdf\x75\x52\x59\xe6\xb8\x52\xd6\x5f\xb2\xca\x44\x1e\xa1\x36\x45\x80\x1c\x57\xac\xc8\x34\x4c\xc7\x29\x58\x24\x46\xc9\xaa\x49\x1b\xf5\xac\x88\xe5\x78\x4d\x2c\x56\xd7\x22\xd1\xfa\x16\x89\x2e\xee\x1d\xd6\xbb\x48\x7c\xc5\x6e\xbc\x32\x4c\xd1\x54\x51\x2b\x0d\x33\x82\x2f\xe7\xa8\x3f\xfd\x7e\x45\x1e\x77\xc7\x22\x33\xf3\xf8\xd5\x33\x8f\xce\x0d\x2d\x62\x3d\xbf\x12\xce\x11\xf1\x52\x42\x87\x6f\x4d\x64\xa8\xc4\x7f\x53\x01\x72\x96\x9f\x86\xf3\x35\xa6\xe6\xcc\x54\x4e\x14\x41\x3a\x76\x36\xd1\x1a\x9d\xea\x51\xe9\x5c\xb1\x41\x58\x15\x94\xbc\x1a\x57\x98\x66\x75\xef\xe0\x99\xd5\xbd\x99\x63\x8f\x01\x9d\xd5\xbd\x59\xdd\x9b\xd5\xbd\x99\x79\x34\x9e\x59\xdd\xfb\xa5\xd4\x3d\xa6\xcc\x23\x15\xbe\x8e\x7a\xd4\xd1\xfc\xc2\x1a\x8e\xab\x68\x72\x4c\x95\x8f\x43\xb7\x11\xc5\x6e\xee\x78\xf1\x91\x29\xbe\x8e\x8d\xde\xbf\xc0\x26\xcd\x3e\x8f\xc3\xae\x89\xaf\xb1\xa2\x2c\x70\x94\x11\x5f\x63\xcc\xfe\xdf\xb1\xfd\xd3\x10\x8d\xb1\xb0\x5f\x04\x9e\xef\xd8\xfe\x66\x44\x26\x8d\xc8\xa3\xbe\x75\xfd\x62\xea\xf5\xec\xf4\xfd\xb2\xa4\xd2\xec\xf4\x1d\x5d\xc9\x67\x77\xfa\x12\x57\x82\xa9\x2f\xfa\xba\x7e\x5a\x98\xfa\xc1\x45\x59\xef\x80\x13\x57\xa5\x1b\xab\x48\x8e\xe3\x70\xa3\x91\x99\x97\x51\x9e\xd7\x5b\x8c\x9f\xf3\x47\xc2\x3b\xb3\xf0\x94\x8b\xb4\x8a\x78\x1d\x4a\xce\x7a\x74\xa1\xad\x52\x75\xe3\x1f\x1f\x51\x67\x0b\xdd\x5f\x3f\x2a\x6e\xc2\xa1\xf1\x83\x61\x9a\x58\x85\xf1\x5f\x25\x4e\x13\x16\x3a\x14\xa8\x89\x4b\x99\x23\x35\xe7\x48\xcd\x59\x38\xcf\xc2\xf9\x37\x22\x9c\xe7\x48\xcd\x99\x2f\xcc\x7c\x61\x10\x77\xbf\x51\xbe\x70\xd4\x48\xcd\xa8\x30\x49\x50\xbe\xbe\xa4\xb8\xcd\xc7\x4f\xe8\x97\x0e\xdc\xfc\x7b\xc9\x4a\x16\x1d\x06\xf7\x7f\xea\xb7\xab\x5a\x9b\xa5\x70\x9d\x10\x1a\xc1\x79\xa8\x0d\x03\xec\x41\x95\x52\xd1\x9c\x19\xa6\x1e\x5d\x25\x63\x45\x4d\xb2\xbd\x61\x22\xbd\x60\x34\xcd\xb8\x88\x95\x42\x7f\x3e\xfc\xce\x57\xd0\xc8\xdb\xe9\x6e\x78\xfb\x0a\x1c\x38\xc8\x1e\xbc\xa7\x1c\xa4\x19\xb6\x49\x7c\x9a\xeb\x98\x16\x34\xe1\x43\x0d\x7e\x3a\xeb\x78\xed\x5e\xf7\xd3\xef\x66\x4a\x1a\xe9\xbb\x37\x16\x41\x37\xb8\xde\x52\x95\xfa\x7c\xbe\x7b\x86\xe9\xb6\x24\x55\x12\x3b\xd2\x98\xed\x70\xcb\x8d\xb8\x26\xc2\x39\x7d\xf8\x33\x4d\xee\xe4\x3a\xd0\x37\xf6\x30\xf3\xd0\x7d\x70\xb8\x39\x8a\x19\xb5\x27\x29\xcb\xba\x37\xb9\xc3\x39\x05\x91\x9d\xd3\x87\x0f\x90\xb7\x1b\x5b\xa2\xe3\x5d\xf5\xc1\xe1\x94\x1a\xbd\xf5\x39\xb6\x31\x09\xe0\x1a\xe7\x4f\x91\x7a\x89\x14\x44\x31\x28\xde\x03\x86\x60\xe8\x59\x35\x6a\x96\x18\xc5\xb5\xcb\xb1\xbd\x66\xca\x92\x79\xfc\xfa\xda\xdf\x0d\x2f\x33\x94\xbf\x8a\x4f\xc1\x14\x98\x30\x9e\xbe\x14\x4b\x9a\x13\xb6\x08\xdf\x0f\x4c\x1d\x7e\x3f\x25\x7c\x19\x2c\x4a\x4f\xb1\x0f\x4d\x33\x5d\x3a\x19\xa5\xb7\x91\xc5\x70\x31\xf1\x0c\x54\x1f\xf8\xe5\xb8\x5e\xfc\xad\x33\x40\xbe\x67\x46\x93\x54\x96\xab\x2c\xa8\x1d\x58\xe1\xc4\x76\x4c\xed\xf1\xeb\xa7\x9d\x1d\x2e\xa6\xed\x8b\x7f\xbf\xda\x17\xd7\xaf\xf7\xf3\xef\xcb\x88\xae\xf2\x09\x02\xfe\x51\x34\x3e\x29\xe2\xff\x68\x81\xeb\x01\x35\x65\x8e\x5c\x9f\x43\x99\xfa\x9e\x39\x1a\x61\xe0\xf9\x92\xa3\x11\xe6\x50\xa6\x39\x94\x69\x0c\xf0\x1c\xca\x34\x33\x8f\x39\x94\x69\xf2\x4b\x73\xe4\xfa\x1c\xb9\xfe\x45\xc8\x80\x59\xdd\x1b\x7e\x7e\x63\x1c\x7b\x56\xf7\x66\x75\x6f\x0c\xf0\xac\xee\xcd\xcc\x63\x56\xf7\x26\xbf\x34\x47\xae\xcf\x91\xeb\xbd\x8b\x99\x23\xd7\xe7\x20\x98\x39\x08\xa6\x07\x77\xbf\xd1\x20\x98\x39\x72\xfd\xd1\x91\xeb\x04\xfd\x52\x1f\x18\xd4\x31\xc7\xcb\x4c\x4c\xef\x17\x3b\x29\x5f\x80\xaa\xe5\x6c\x53\x08\xa9\x1d\x9d\x3d\x80\xc3\x60\x7b\x88\x36\x53\x68\x4d\xd0\x87\xc3\xa4\x7b\x41\x73\x9e\x10\xc5\xec\xd8\x75\x64\xcc\xe0\x86\xf9\x7e\x35\xe6\xd4\x97\x52\x86\x66\x2d\x40\x09\x1e\x8d\x2e\x34\x83\x8b\x0d\xd3\x20\x59\xc9\xa5\xf1\x41\xe8\x83\x80\x7f\xfe\x13\x56\x23\xff\xc9\x2d\xff\x27\xd7\xcf\xf6\x7f\xfd\xbc\xd0\x0c\x7a\xcb\x1e\x94\xab\x6f\xa1\x67\x98\xc2\x7a\xb8\x5e\x23\xa4\xdd\x73\xbd\xfa\x4f\x67\xd0\x1e\xc7\x9c\xb5\xc0\x1f\xfc\xeb\xeb\xfe\xa9\x0e\xf1\xac\x18\xb1\x85\xed\x73\x43\x8c\xaa\x5d\xc5\x0c\x31\x62\xa4\xef\xa1\x4b\x56\x54\x63\x1f\x5d\xc5\x36\xec\x01\x2b\x99\x71\xb1\x09\xcb\x1f\x57\xaa\x9f\x70\x4d\x4e\x5c\x13\x93\x10\xe3\x8d\x62\xbb\xb9\x4c\xcb\xac\x0c\x4a\xe8\xb6\xbb\x1d\xdf\x07\x75\x88\xde\x55\x72\x6b\x4b\xf5\xb6\x12\xca\xd8\x56\xb6\xbf\x51\x40\xf3\x09\x35\x32\xc2\xa7\x51\x8a\xfc\x8f\x7f\x18\x5d\x6a\x38\x46\x82\x20\xae\xa3\x57\xfa\x81\x6d\xca\x8c\xaa\x66\x4d\x7d\xdf\x6e\x1d\xeb\xcd\x01\x73\x7a\x30\x8a\x26\x66\x44\x6c\x54\x4d\x10\xb0\x62\x5d\xba\x6c\x6d\xe5\xf3\xe5\x7f\x7b\xf1\xe4\x7d\x74\xf4\x90\x0f\x16\x49\xec\x5d\x61\xf5\x8d\x9b\x62\x7b\x81\xd4\x51\xa7\x83\x1d\x5c\x22\xd7\x8d\xfe\xd0\xdc\x2b\x33\x1d\x0c\x22\x02\xf4\xd2\x62\x97\x3d\x04\x21\x26\xb4\x30\xa5\x62\x64\xa3\x64\x59\x60\xbf\x25\xba\xa3\x3c\xb3\x77\x83\x36\x02\x7f\xf7\xf2\xc9\xe8\xd3\xac\xa0\x23\x4d\xa6\x3a\x6a\xb4\xfb\x82\xb8\x6e\x42\x2b\x66\xee\x19\x83\x2e\xb8\xf6\xae\x22\xa0\xd7\x34\x9e\x85\xe0\x3a\x91\x47\xfb\x3e\x4c\x69\x63\x5d\xff\xf3\x24\x74\x36\xe2\xd6\x05\xe3\x0f\x77\xe6\xe9\x5d\xda\xed\xc1\x21\xd6\x5e\xbb\x76\x5d\x67\xac\x92\x4d\xd8\x03\xd7\xbd\x6d\x33\x3a\x6b\xd3\xd0\x8a\x86\x43\x4b\x79\xe3\x5a\xa5\xb5\x90\x54\xea\xea\x16\x32\xdc\x74\xbe\xb5\xaa\x0a\xf7\x54\xa4\xfe\x50\x55\xc4\xdb\x06\xd4\x43\x85\x41\xd8\x5e\x19\x72\x44\x7f\x4a\xee\x18\x2b\xb0\xf1\x4e\xaa\x64\xe1\x3b\xa7\x87\x76\x66\xb4\x0b\x54\xb4\x4a\x3c\xd6\x09\x8a\x54\xf7\x30\xd8\xe2\xe8\x1d\x86\xb7\xa1\x69\x4e\xc5\xc9\x14\xd3\x65\x66\xaa\x96\x60\x76\x93\xac\x92\x61\x58\x18\x5d\x90\x02\xe7\x70\xe5\x70\x03\x0a\x04\x30\x3b\x91\xda\x4d\xda\xbb\xa8\xa0\xe6\x3b\x23\x86\x4e\xe0\x0e\x61\x0e\xf0\xb4\x93\x11\x19\x67\xde\x8f\xf9\x5f\x24\xfb\x11\xda\x6a\x7f\xe2\x2e\x41\x6e\x94\xce\x84\xe3\x3b\x03\xfd\xe4\x40\x7c\x21\x1d\x82\xdc\x6c\x3a\x87\x6f\xa0\x5d\x8d\x6f\x85\xa4\x11\x27\x45\x26\x91\x56\x69\x13\x85\xf8\x77\x2b\x24\x0f\xa7\x11\x6a\x94\x32\xac\x91\xf8\xbe\xfb\xe1\x49\x5e\x80\x02\x5e\xbf\x5c\x47\xfc\x61\x0f\x23\xe8\xfc\x62\xe7\xea\xfa\xd5\x5c\xcb\x74\x5a\x9b\x22\x80\xd0\xc7\x30\x3e\x51\x37\xfb\xb7\x38\x65\xfc\xe3\x8a\xb5\x63\x68\x9b\xa1\x97\x79\x51\x9a\xc6\xc2\x7b\x47\x76\x1d\x92\x26\x5b\x49\xda\x17\x83\x9c\x0a\xba\x61\x0b\x37\xe4\xa2\x1a\x72\x51\x19\xea\xce\x26\xb6\x9b\x27\xd5\x36\xfd\x82\x98\xfd\xe0\x29\xe3\x00\xb7\x2e\x0e\x76\x2a\x6e\x3d\x77\x83\xae\x8d\x15\x6c\xae\x89\xcc\xad\x38\x70\x09\xb2\xb5\x31\x13\x92\xa5\x7d\x23\xb6\xfe\xd5\x48\xe2\x76\x1f\x14\x43\x0a\xd2\x81\x3d\xd8\xa3\xca\x4d\xb6\x6f\xe6\x6f\x83\xcd\xe9\x9e\x6b\xe6\x9a\xec\x71\x7b\x47\x85\x64\x6d\xbb\xd8\x45\xc8\x46\x03\x7c\xe4\x8b\xa3\x88\x40\x17\x22\xab\x0b\xf5\xdc\x22\x3b\x31\xbf\x24\x75\xd3\x6b\x72\x25\xbd\xa5\x19\x04\x6b\x53\x2e\xea\xc2\xe3\x9e\x67\x77\xe6\x68\xd5\xc9\x6f\xff\xb0\x3d\x41\x45\x06\x5c\x2a\xa0\x36\x0d\xe9\xe9\x3f\xff\xbf\xdf\x2c\xfe\xc7\xff\xf7\xff\x3c\xcf\xf5\x3f\xf5\x3f\xf3\x7f\x6e\xff\x99\xfe\xf3\xfe\x9f\xfb\x17\x3f\x77\x00\x3f\xcf\x79\x96\x71\xcd\x12\x29\x52\xcb\xc2\xf1\x7f\x73\x2e\x4a\xc3\x34\xd9\xca\x52\x69\x92\xd2\xbd\x26\xf7\x8c\xdd\x69\xb2\x67\x54\xe9\x29\xfc\xdc\x21\xe9\x86\xff\x23\x2c\xfb\xde\x75\x38\x49\xca\xf5\x1d\xc1\x7c\x4f\x10\x7b\xab\x3d\x59\x65\x32\xb9\xeb\xb0\xc9\xe1\xd1\x65\x69\xd8\xb5\x62\x6b\xde\xb9\x35\x76\xf4\x65\x78\x97\x14\xf0\x72\x73\x9f\x14\xdb\x70\x6d\x98\xd2\xe4\x2f\xb7\xb7\xd7\xff\x3f\x7b\xdf\xff\xdc\xb8\x8d\xe5\xf9\xfb\xfe\x15\xa8\xce\x55\xd9\xbd\x65\xc9\x9d\xd9\xd4\xec\x54\xdf\x5c\xae\x1c\xdb\x9d\x71\x4d\x7f\xf1\x5a\xee\xa4\xea\x6e\xaf\x76\x21\x12\x92\x30\xa6\x08\x86\x00\xe5\x56\xfe\xfa\x2b\xbc\x07\x90\xa0\x44\x02\xa0\x24\xdb\xdd\x13\xf1\x97\x74\x64\xf2\x11\x00\x81\xf7\xfd\x7d\x1e\x59\xd0\x3c\xcd\xf4\xff\x75\xc2\xc4\x5b\x98\x02\xf4\xb9\x9e\xe9\xe3\x82\xba\xb1\x95\xad\x9f\xef\xde\x63\x9f\x60\x2c\xe5\xc2\x6e\xa6\xd6\x17\xa4\x5f\xb0\xcd\x8f\x04\x7c\x08\x31\x03\x35\x0d\x0e\x73\xd3\x45\x92\x26\xaa\xa2\x59\x8b\xba\x96\xc3\x4a\x8b\x6a\x55\x56\xec\x8c\x4c\xab\xed\xbd\x64\x6b\x6b\xa1\x0c\xa3\x5c\xb9\xb2\xa9\xca\x53\xa6\x99\x83\x6d\x66\xa7\x5a\xeb\x32\x26\xef\x84\xde\x65\xdd\xb5\x4f\x9a\xad\x54\x92\x91\x47\xae\x16\xe4\xbf\xf5\x99\x4d\x54\x86\xf3\xfc\xef\xf8\x4f\x56\x65\xec\xa3\xad\xf3\x8d\x6a\x8b\x5d\xdf\xdd\xd9\x05\xbb\xf9\x92\x77\x55\xc6\xa4\xd3\x0e\x7b\x6b\xfc\x37\x33\x52\xe5\x2e\x2b\xcb\x33\xf4\xb3\x4a\xad\x96\x35\xc5\xc7\x54\x6e\xe6\x64\x21\x77\xe8\x6a\xfc\xc9\x73\xb3\x1d\xb6\x8a\x5d\x8e\xdd\xb7\x8f\xdd\xb7\x8f\xdd\xb7\x8f\xdd\xb7\xb7\x9a\x01\x1f\xbb\x6f\xf7\x3f\x1f\xe5\x75\x09\xf9\x5c\x8e\xdd\xb7\x1b\x99\x71\xec\xbe\xfd\x95\x75\xdf\xd6\xfa\x4f\x94\xda\x73\xd1\x6a\x80\x63\xfc\xbb\xe8\x0d\xdc\xd4\x79\x94\x20\xa8\x54\xcf\x3a\xb6\x6e\x26\x68\x0a\xc7\x38\x63\xd0\x45\x19\x46\x20\x4d\x1e\xc6\xe7\x5c\xf1\x8c\x9c\xb2\x2f\x49\x56\xe9\xbb\x5e\xbb\x5a\xcf\xa7\xbe\xd3\xb0\x7a\x33\xfe\xd3\x0f\xe3\x37\x5d\xf7\xa2\x17\x69\xc9\xe7\x9a\x63\x00\x26\x57\xc6\xe6\x34\x59\xc3\x5b\x9b\xd4\xd4\xed\xc5\x56\x62\x63\x5a\x24\xa9\xa4\x12\x4b\xc7\xc1\x52\xeb\x7d\xd3\x35\xb9\x73\x96\x71\x4c\x3e\xd0\x87\xed\xbd\x2b\x2b\x6d\x67\x2a\x92\x0a\x26\x49\x2e\xac\x3d\xa5\xc7\x84\x36\xa5\xde\xba\xa6\x7f\xd4\x5a\x54\x24\x15\x70\xd7\x23\xc5\x2d\x3c\xdd\xa6\x68\xa6\x75\x54\xf5\x8e\xaa\xde\x51\xd5\x3b\xaa\x7a\x47\x55\xef\xa8\xea\x1d\x55\xbd\xa3\xaa\xe7\x53\xf5\xfc\x31\xa4\xf3\xd1\x08\x6e\x1a\xff\xeb\x39\x49\xc4\x72\x49\xf3\x74\x04\x98\x44\xb4\x9c\x57\x9d\x42\xdd\x27\xd5\x40\xc3\x0b\xea\x17\xf5\x3b\xe1\xf6\xfe\x37\x77\xd0\x09\x89\xd4\x99\x28\x7f\x2e\x69\xc2\x6e\x59\xc9\x45\x6f\x72\xe5\x26\x38\x08\x78\x85\x6b\x0f\xba\x4d\xd2\x80\xd1\xc1\x47\x2e\x99\x54\xa2\x64\x29\x39\x99\x89\xb2\x3f\x8f\x44\x2a\xaa\x58\x03\x24\xbb\xa4\x1c\x03\x02\x29\xee\x05\x88\x89\x68\x9a\x12\xfd\x97\x11\x89\x0c\xf0\x3e\xc4\x83\x9a\x97\x8c\x2a\x48\x5f\xa5\x39\x99\xeb\x39\x92\x02\x26\xd9\xc7\x00\x83\xdc\x6d\x26\xca\x4f\x95\xa2\x73\x76\x2f\x32\x56\xd2\x3c\xe9\xcd\x13\xdd\xf4\xa2\xe3\x88\x94\x20\x0a\x9e\x04\xe7\x6d\xe3\xa9\x04\x9a\x26\x9e\xaf\xd7\xcd\xc7\x5d\x71\x82\xb0\x70\xe0\x7f\x86\x0d\xb1\xeb\x84\x40\xc1\x48\xaf\x58\x46\x7b\xb5\xaa\xce\x2f\xdf\xc4\x03\xec\xbc\x00\x54\xcb\x24\x3d\x22\x55\xdf\x24\xa8\xdd\x2b\x4a\x90\x0b\xfd\x0f\x0c\x11\xf5\x82\x71\x85\xd0\x55\x76\x38\xe8\x32\x29\x69\xc1\x6e\x72\xc5\xca\xd5\x76\x76\x74\x1b\x0c\xd9\xdc\xe4\x26\x23\x49\x96\x54\x8a\xaf\x98\xa1\x13\x1f\xfe\xc0\xb4\x78\x3f\x8b\xc1\x64\xeb\x0d\x2b\xa2\xfe\x31\xef\xf7\x7f\x6f\xad\xcd\x96\x3f\xfc\xcc\x98\xa3\x18\xe9\x9a\x32\x34\x42\x59\x4a\x78\x6e\x12\x12\x9c\x47\xba\xc2\xdf\x68\x9d\xd8\xc1\x68\xfe\xdb\xa2\x70\xce\x54\xe2\x66\x92\x9a\xe9\x9e\xff\x15\xff\x31\xd2\x23\xfe\x31\x12\xd0\xd9\xf3\xd5\xfb\xa4\x39\x14\xc7\x70\xb5\xbe\x14\xb9\x62\x5f\xb6\x18\xeb\xe6\x2a\xbb\xf7\x92\x85\xc8\x52\x49\x0a\x91\x8e\x32\xb6\x02\x3b\x09\xff\x4e\xa8\x52\x25\x9f\x42\xc4\xa7\x4b\x41\xd6\xac\x58\xe4\x4e\x1d\x8a\x64\x4a\x1b\xed\xd2\x30\xb6\x74\x23\xe3\xc3\x26\xa3\xdd\x8a\x74\x63\x08\x43\x04\xc7\x4c\xfe\x5c\x8a\xaa\xb3\x7c\xba\x35\xcb\x57\x17\x18\x09\xa6\x19\x91\x55\x61\xe3\xbe\x19\xa6\xff\xa0\x3d\x64\x4c\x20\x50\x0c\xb2\xac\x99\x48\xb7\xc8\x85\xdc\xa4\x42\xa4\x63\x32\x11\x4b\x46\x56\x22\xab\x34\x0b\x58\x17\x7a\x79\xb2\x4c\x3c\xc2\x24\xff\x5e\x4d\x59\x86\xa9\x27\x06\xee\x1b\xb4\x84\x47\x4d\x76\xc1\x8b\x3e\xb5\x03\xc6\x63\x49\x42\xe0\x48\x3f\x02\xde\x03\x80\x93\x16\xe9\x5b\xf2\x9f\x39\xf9\x1e\xd5\x03\xf1\x08\x95\x36\x3f\xdf\x5c\x81\x0b\xa3\x93\xe8\x14\xdf\xfc\x6e\x02\xcb\x45\xfe\x34\x36\x98\xb6\x6a\xce\x53\x32\xe5\xca\xe6\xc8\x9c\xe6\xec\x11\x8a\x74\x24\x49\x40\x70\xe8\x0d\xdd\xad\xe4\x2d\xea\x59\x83\xe3\xc4\x1d\xa4\x79\xcd\x6b\xf2\x6f\xf8\x9e\x82\x95\x4b\x8e\xc1\xdf\x29\xc7\xf3\xd2\x49\xf3\xd3\xdd\x49\x8a\x32\xae\x7c\x1c\x95\x8f\xa3\xd1\x68\xa4\xe7\x89\xd1\x2f\x66\xac\x07\xbb\xa6\xf0\x56\x70\x8e\x88\xd4\x94\x1d\x74\xaf\xa7\x5d\x6d\x10\xc9\xcd\x50\x30\x70\x99\xaf\xcd\x2c\xc6\xaf\x3a\x9e\x0e\xe5\x08\xfb\x73\x83\xcb\x2a\xbf\x88\xdc\x9f\x7a\x95\xf4\x07\x54\x42\x3f\x65\x6a\x13\x54\xb9\xc6\xea\x04\x93\xfc\xdc\x9c\xad\xa2\x14\x09\x93\x3d\xee\x83\xcf\x92\x49\x4d\x05\x84\x52\x9d\xf3\x69\xd6\x70\x4c\x3e\xd0\x35\xa1\x99\x34\xf1\x48\xc0\x71\xd8\x3c\x80\x84\xdc\xcc\x3a\x49\x9b\xfb\xa7\x42\x2d\xb6\x18\x87\x5e\xdd\xed\xc3\xec\x58\x7c\xdd\x14\x6d\x50\xb3\x63\x1c\x90\x05\x2e\x49\x51\xb2\x84\xa5\x2c\x4f\x6c\x35\x49\xe3\x95\xe9\x96\x95\x07\xf8\x6a\x1f\x45\x7e\x27\x44\x58\x25\xbd\xc9\x53\xa8\x1e\x74\x9a\xb9\x37\x5f\x09\x6c\x68\xfd\x39\xa9\x96\x60\xda\x92\x2e\x85\xe8\xb6\x35\x2a\xc9\x4a\xb4\xb0\x21\x34\xbe\xb5\xcf\x4d\x71\x22\x9e\x62\xbe\xd4\x8a\x12\x55\xf6\x23\x77\x9f\x4f\x41\x58\x0e\x8e\x44\xcc\x8a\x71\xbc\x89\x66\x48\x9f\x6f\xae\xc8\x1b\x72\xaa\xc7\xf4\x1a\xbe\xde\x8c\x72\x48\xdc\x04\x18\xcd\xde\x43\xdf\xcc\x8f\xcf\x2c\xd9\x71\x7d\x46\xb5\xc5\x3f\xa3\x99\x64\x67\x24\x17\x44\x56\xc9\xc2\x29\xac\xec\xa4\x69\xb9\x47\x9d\xe2\x1d\xbd\x45\xf5\xdf\xfa\x98\xf3\x6e\x5b\xb4\xd9\x8e\x7d\x74\x43\x5b\xb4\xdf\x02\xeb\xab\xec\x82\xfd\xf6\x59\xb2\x4e\xd7\xd8\x76\xf1\xd2\x81\x98\x84\x9b\x80\xa9\x37\x5f\xfb\x20\xe2\x0e\x5b\x32\x45\x21\xfd\x87\xb7\xd2\x0f\xe0\xfb\x74\xdb\xa1\x71\xdf\xac\xef\xfb\x74\xd3\x8c\xff\x66\x1d\xef\xec\xde\xc5\x2f\xc1\x56\x24\x7b\xcf\xf3\xea\x0b\x62\x1f\x87\x7d\xe9\xa0\x5e\x5e\xc3\x23\x98\xdb\xfe\xc5\xb8\xf6\xdd\x32\xab\xb6\x9e\xd2\xfd\xa1\x37\x53\x47\xda\x7b\xc4\x8a\x09\x38\x84\x5a\x6f\x81\x52\x68\x4a\x4a\x9a\xa7\x62\x69\x47\xd0\x49\xd8\x8e\x0a\x00\x3a\x69\xb2\x70\x16\x8f\xfc\x01\x84\x4c\xc8\xa3\x00\xda\x73\x94\x39\xf9\x1e\xf4\x6c\x2e\xeb\xef\x8d\x8a\x37\xba\xeb\x37\x55\x53\x9f\x07\xd6\x3b\x5e\x12\x65\x09\x8b\xfe\xc2\xf5\x76\x79\x8f\xc8\x18\x1a\x66\x76\xd0\xfa\xd1\x17\x19\x33\xdc\x10\x33\xe6\xfb\x75\xb1\x31\x66\xfd\xe8\x8b\x8c\xb9\xea\x61\xf7\x5b\x63\xd6\x72\xa1\x3d\x66\x60\xd6\xcf\x3f\x66\xaf\x5f\xd9\x35\xa9\x40\xdf\x0d\xf3\xb7\x8b\xda\xa2\xb7\x15\x18\x0d\x5b\xd3\x87\x79\xc6\x4b\xa9\xac\x08\x03\x71\xd7\x63\x87\xb4\x59\xcf\x19\x18\x66\xc6\x53\x5d\xe3\x2a\xd8\xbf\x9e\xe8\x73\xce\x97\xb4\x5c\x6b\x65\xbb\x9f\x03\xb5\x18\x66\x2e\xec\x10\xad\xa6\x82\x05\x06\xe0\x40\x5e\xfb\x17\xd6\x13\x4a\x08\x97\x1f\x86\x0a\x0f\x7d\xbe\x7c\xb9\x96\x89\xea\xf6\xe3\xb7\xad\x7f\xbc\x0f\xac\x7e\xc7\xcb\x52\x7b\x54\x52\x4b\x09\xf3\x5c\xbb\xa2\xf4\xc4\xe8\x85\x60\x0c\xdf\x8a\xd4\x78\x29\xab\x5c\xef\x0a\x51\x2a\x87\xc6\xa9\x31\x60\xb7\xe4\xcf\xeb\x4e\xaa\x4b\x3e\x5f\xa8\x5a\x2b\xcd\x68\x95\x77\x87\x6d\x62\x43\xbf\x38\xd9\xba\x09\x16\x25\x0f\xac\xcc\x59\xd6\x40\xfa\xd7\x59\x9a\xdd\x7a\x43\x38\x2e\x3b\xa0\xa7\x8c\x2d\xa8\xa1\x96\xac\x41\x42\x0b\xa1\xbc\x84\x43\x8a\x91\x03\xf8\xc5\x96\xdc\x1c\x70\x04\xa1\xa0\x96\x5e\x9f\x9e\x3f\xf5\x4b\xef\x3d\x42\x5a\x8f\x3c\x4f\xc5\xa3\x1c\xa2\x74\xfd\x8a\x8f\x58\x9d\x21\xa9\xfd\x58\x87\x50\xbc\x10\x86\x02\x4f\x08\x78\x90\x5c\xd6\x14\xa3\xba\x5a\x16\x04\x69\xbb\x01\x75\xba\x4f\x59\xea\x77\xe7\x04\xd5\xe9\x28\x73\x27\x74\x4c\xe6\x4b\x49\x2f\x4b\xfd\xbc\xe2\x34\x9b\x14\x2c\x89\x12\x85\x3f\x7f\x98\x5c\xb4\x1f\x83\x3a\xc2\x05\x2b\xd1\x2a\xd6\x7f\x27\x34\x35\xde\x9d\xde\x3d\xfc\xc8\xa6\x0b\x21\x1e\xc8\xa9\xad\xe0\x98\x73\xb5\xa8\xa6\xe3\x44\x2c\x9d\x62\x8e\x91\xe4\x73\x79\x6e\xb6\xcf\x48\x8f\xb8\x9b\x45\x11\xb0\x0a\xb3\xba\xa9\x9e\x29\x43\x95\xd6\x1a\x83\x41\x25\xf5\xa8\x61\x71\xe1\x14\xa4\x64\xea\x29\xbb\x34\x4f\xb6\xa7\x0b\x1c\x03\xa2\x8e\xc6\xa5\x5a\x47\x20\x69\x56\x2c\x28\xfa\x6b\x3d\xc1\x06\xb8\x15\x22\x4a\x0b\x91\x43\x58\x6a\xba\x36\xc9\xf6\xc6\x7d\xc1\x72\x04\x47\x6a\x8e\x81\x1e\x45\x2f\x49\xd3\xd1\x90\xcc\x32\xda\x8b\x2e\x10\x64\x19\xdb\xbb\xc1\x87\x3c\x12\xd8\x11\xb0\x44\xb6\xad\x88\x03\x7d\xe3\x9d\xc6\xe6\xe7\x41\x8b\xd8\xb3\xc6\xee\x5a\xf6\x52\x1d\xb6\xc6\x87\x59\xcb\xda\x95\x10\xbd\x84\xe0\x52\x30\x0f\xe8\xf3\x6e\xb9\x5f\x9f\x8b\xc1\xbb\x65\xb7\x5d\x0f\x5b\x75\x9e\x3d\xae\x86\x5e\xb2\x3e\x17\xc4\xa6\x81\x19\x8e\x24\x34\xd7\x6e\x9c\xd3\xab\x61\xef\xc2\x3d\x61\x8f\xf5\x9f\x2f\xbb\xf7\xa6\x4c\xb9\x5b\x6f\x49\xd7\x00\x2a\x84\x58\x66\xc6\x63\xee\x6c\xa8\x3b\x77\x1b\x3c\xe5\xe9\xdd\x29\xe2\x88\x9d\xf3\x2e\x92\x44\x54\xb9\x0a\xd6\x1d\x4f\xb6\x6e\xef\x3a\xdf\xed\xbb\xba\x1a\xd9\x54\x58\xf6\x67\x37\x75\x20\xbc\xe7\x89\x5b\xc2\x8b\x3e\x60\xdb\xbf\x43\x56\x03\x4d\x5a\x94\x03\xc5\x40\x39\xcf\x4c\x11\x50\xb2\x60\xc9\x03\x11\x8f\x79\xa3\xb3\x1f\x73\x3c\x8f\x39\x9e\xc7\x1c\xcf\x63\x8e\xe7\x31\xc7\xf3\x98\xe3\xb9\xf9\xb7\x63\x8e\x67\xfb\xfa\x03\xe7\x78\xb6\x55\x99\x28\x0d\xa6\xad\xa3\x74\xaa\x31\x06\x58\xb7\x57\x7d\x39\x2a\x23\x47\x65\xe4\xa8\x8c\x1c\x95\x91\xa3\x32\xe2\xac\xcd\x51\x19\x39\x2a\x23\x7f\x70\x65\x64\xb1\xd5\x94\xb3\xad\x79\xfc\xed\x62\x1b\xf4\xd7\xa6\xa1\x41\xb2\x12\xea\x22\x08\xa8\xe6\xa0\xa0\x76\x96\xeb\xb6\x11\xe7\x56\x88\x39\xfe\xdf\x63\x32\xe1\x4b\x9e\x51\x08\x03\x52\xa2\xe8\x1c\x30\x6a\xd0\xc1\xf4\xb7\x0b\x07\x55\x6a\x8b\x26\xbe\x56\x22\xaa\xd4\xb2\x52\xe0\xe2\xdd\x18\xe1\x98\x18\x70\x73\xf8\x1c\xf7\x74\x0e\xab\xc8\xe7\xe0\x26\xde\xa2\xc8\x67\xf0\x4e\x4c\xcb\x8d\x77\x4f\x29\x51\xd2\x79\xc0\xa3\x86\xf7\xd4\xbe\x6e\x69\x70\xce\x17\xe2\xd1\x3e\xdf\xe4\xc5\x0f\x85\x87\x01\xd6\x79\xc5\xc3\xb9\x6c\x27\xd7\xe6\xce\x5f\x20\xfb\x76\x82\x90\xa0\xf8\x11\x2d\xa4\x52\x44\xf3\x83\x89\xa2\x8a\xcd\xaa\x6c\xc2\x14\x8a\x23\x27\xe0\x06\x64\x78\x8e\x18\xaa\xed\x64\xdf\xcb\x8c\xf2\xe5\x3d\x5b\x16\x5a\x4f\xea\x66\xcc\x03\xb1\xbe\xcc\xca\x9d\x23\x7d\x79\xfe\x1d\xac\x44\xca\x3b\xcb\x7e\x42\xfa\xd6\x92\xa5\xbc\x5a\xc6\x81\x79\xff\x0a\xaa\xd5\xba\x60\x28\x9e\xf1\xfb\x21\x01\x22\x17\xa2\xca\x52\x32\xa5\xc9\x03\x51\x90\x84\xcf\x4b\x50\xbf\x3c\xcd\x08\xee\x9d\xdc\x7c\xcd\x6b\x5e\x99\x52\x89\x25\xa3\xb9\xcd\x16\x44\xff\xab\x48\xd9\xc9\x49\x9d\xd8\x6f\xde\xe9\x81\xdf\x36\x02\x5e\x33\xc1\x16\x0c\xa3\x21\xf0\x5a\xcb\xee\x0f\x6c\xa9\x47\xb7\xe7\xea\x7b\x17\x9f\xc4\x08\x54\xc9\x7f\x67\x80\x2b\x17\xf7\x11\xee\x85\xa2\x99\x53\x0f\x94\x89\x84\x66\xf5\xd7\xb0\x92\xd7\x64\x96\x79\x3c\xfe\xf6\x50\xd8\x9c\x74\xcc\xd2\xe7\xbf\x33\xc4\x54\xc4\x38\x94\x14\xa8\x3d\x27\xc0\x65\x34\xcd\x25\xac\x9a\x27\x88\x02\x5f\x06\x88\x59\x54\xc4\x4a\xea\x91\x89\xdc\x3c\x6b\x77\x4c\x3d\x80\x47\xbd\x73\x7a\x29\x9a\x72\x02\x0b\x03\x88\xbc\xd4\xd6\x05\x01\xbf\xb4\xeb\xe7\x04\x44\x16\xac\x27\xed\x9f\x98\xf0\x24\x18\x08\xd5\x12\xe4\x20\x8e\xca\x60\x51\x42\x85\x97\x1b\x71\x77\xca\x2f\xee\x3d\x1a\xa2\xb3\x8f\x73\x9e\xb5\x37\xb2\xb5\x48\xea\x85\xad\x72\x83\x00\x88\xbb\xaf\x5f\x5b\xab\x77\x65\xf7\xa6\xac\x24\x2b\x47\xf3\x8a\xa7\x07\xdb\x8e\x5e\x15\xab\x83\xa1\x45\x24\x5f\xdd\xfe\x72\x59\x0b\x80\x5e\x8e\xdb\xe6\xae\x3b\xf0\xb1\xa6\xa1\x47\xdc\x31\xba\xb8\xbd\xb1\x32\xd2\x26\xe9\x80\xa8\xc6\xdf\x58\x4a\x64\xb2\x60\x4b\x8a\x51\x1f\xcf\x31\xaa\x6d\x38\x6a\xbb\x05\x68\x13\x19\xd6\x6f\x0c\x4e\x0c\xbd\x85\x0c\x73\x4c\x44\xbe\x62\xa5\xb6\x99\x13\x31\xcf\xf9\xef\x9e\xaa\x4a\x7c\x7b\x1d\xcb\xc4\xf6\x00\x90\xa0\x05\xd8\xb4\x70\x0a\xce\xea\x08\x5d\xc9\x00\x79\xad\xca\x23\x28\x5b\x7b\xaa\x83\xed\xcd\xb9\x1a\x3f\xfc\x05\xb6\x57\x22\x96\xcb\x2a\xe7\x6a\xad\x19\x1f\x16\x63\x89\x52\x9e\xa7\x6c\xc5\xb2\x73\xc9\xe7\x23\x5a\x26\x0b\xae\x58\xa2\xaa\x92\x9d\xd3\x82\x8f\x60\x72\x39\x82\x22\x2f\xd3\xef\x6a\x40\x92\x9d\xf9\xe2\x03\xcf\xe3\xaa\x63\x4f\xfe\xce\x31\x48\x4e\x5b\x36\x63\xf3\x69\x2c\x2c\xf7\xdd\xf5\xe4\xbe\x46\x4a\xe9\x37\x6e\xb4\xf4\x32\x58\x76\x8d\x85\xde\x7c\x4c\xbd\xe0\x3c\x9f\x31\xe4\xaf\x88\x22\xee\x36\xf8\xf0\x10\xae\xfb\x13\xc9\x6a\x0a\xdc\xc6\xe9\x7f\x3f\x26\x97\x34\xcf\x05\xc8\xad\xaa\x48\x01\x41\x45\xdb\xb1\x97\x74\xc9\xb2\x4b\x2a\x3d\x50\xd1\x4f\xfc\x29\xa1\xd2\x6c\xa4\x3f\xc7\xee\x1f\xd3\x06\xd7\xe3\x3e\xe8\x44\xd1\x3c\xa5\x65\x6a\x3e\x83\x16\xfd\x96\xc0\x93\x6f\x5c\xfb\x22\xff\x54\x3d\x90\xdb\x32\x36\xcb\xe8\x04\x12\x8b\x5c\xee\x93\x32\x09\xc2\x3b\x59\x50\x68\xc7\x50\x72\xa9\x78\x82\x42\xa9\xff\x40\x63\x65\x9c\xd9\x4a\xc8\x5c\x41\x60\x11\x5a\xa9\x05\x00\xff\xec\xa6\xe1\x14\x9a\x17\x4a\xc5\x72\x35\xb2\xd2\xa5\xf9\x09\x7f\x49\xb4\x2c\xd8\xb3\x05\x49\xc2\xa4\xfc\x20\x52\x7f\x7b\xad\x0d\xe6\xdd\x3c\xd4\xd8\x96\xee\x02\x22\x55\xb2\xd4\x77\x78\xa8\xb6\x4a\x0b\x0d\x93\x5e\xd0\xd5\x70\xf8\x5d\xcf\x92\xe1\x50\x46\x30\x94\x91\xb7\xc3\xc3\xf3\xe2\xed\xeb\x3d\x8e\xa6\xd0\x80\x86\x0a\x75\x96\x92\xd1\x33\x71\xd5\x8d\x5d\x95\xd3\x42\x2e\x84\xba\xaa\x09\x7b\xa7\x02\x49\x4e\x75\x66\xc8\x1c\x0a\xce\x40\x41\xc0\xac\xa5\x14\x84\x5b\x52\x95\x25\xcb\x55\xb6\xde\x78\x87\x97\xb2\x71\x09\x83\xaf\xa1\x49\x0c\x86\xd4\x1e\x64\xfd\xb5\x33\xb1\x28\xc5\x8a\x83\xbc\xf7\xf9\x13\x09\x49\x68\x6e\x29\x6d\x0c\xc4\x25\x0b\x08\xd2\x90\x35\x89\xf5\xac\xfe\xe9\x93\x9c\x3d\xda\xad\x07\x5d\x19\x34\x21\x9b\x73\x59\xa3\x39\x58\x0f\x82\xb9\xcf\x3f\xf1\xba\x4a\x5d\xf1\x65\xe7\x24\x9b\xba\xbc\xee\xd9\x78\xa9\xb7\x66\xea\x96\xe3\x1a\xa1\x65\x8b\x78\xad\x7a\x3d\xa3\x3c\xab\x3c\xca\x2d\x71\x72\x4c\x4b\x66\xbe\x12\x05\xc7\x06\x5b\x41\xef\xb8\x1b\x54\xf0\x67\x95\xde\x22\x67\xe4\x91\x69\xfb\x3a\xef\x4a\xb9\x71\x2f\x3b\xb5\xa5\x3e\xc2\xce\xa0\x6d\xc5\xb4\x19\xde\x94\x2d\xe8\x8a\x8b\x32\xd4\x7b\x8a\x20\x23\xab\x97\x50\x8b\x7f\x2c\xb0\xf6\xf5\x6e\x88\x6d\x71\x4b\x0b\xde\x5b\xb5\xeb\x5e\x6d\x9d\xfa\xf6\x06\x6b\xab\xcd\x4e\xc7\xca\xf2\xa6\xe3\x47\x44\xb7\x16\x02\x96\x15\x00\xdd\x61\xab\xbe\xc4\x24\xf9\xba\xb4\x61\xa3\xb4\xb2\x8a\x83\x34\x1b\x13\x0c\x94\x32\xeb\x69\x37\x5e\xcb\x44\x7f\x92\x8b\xdb\x1b\x1c\x31\xe0\x28\x07\x29\xd2\x7c\x6d\x5a\xf8\xa9\x05\x2f\xd3\x51\x41\x21\x7b\x5c\x7f\xcb\xb3\xd6\x68\x6b\xc0\xf7\x00\xc9\xe8\x96\xb1\x3e\x05\xd4\x5e\xad\xef\x62\xf5\x50\x68\x42\x67\xdc\x24\xf6\x6b\x6c\xad\xf6\xa1\x46\x19\xd3\x40\x78\xbb\x1a\x60\x23\xb1\xed\x89\x47\x19\xd3\xa1\x76\x04\xeb\xed\xbd\xa1\x37\xa5\xdf\x1d\x4c\xa0\x7f\x6d\x6f\xdb\x0a\xf7\xda\x6c\x4c\xd0\x34\xaf\xa8\x03\x76\xae\x4f\xc2\xdf\x88\xa0\x1e\xde\x93\xab\x1a\x41\x9b\x8b\x0c\xe0\x4c\xfd\x9d\x35\xdc\x2b\x3e\x70\xd2\x5a\x8a\xf8\xae\xcd\xbb\x74\xdf\x08\xbe\x7f\xab\x83\xc4\xcb\x76\xe2\xd8\x5e\x9a\x60\xfb\x76\x7f\x87\x0e\xf7\x7a\xe6\x2f\x14\xd5\xc5\x23\xf8\xfa\xae\x2e\x1f\xc1\x8e\x1e\x41\xaa\xbe\x8e\x1f\x9d\xdd\x3d\x82\x14\x0f\xde\xfd\xc3\xbd\x5e\xb0\x13\x88\x7b\x45\xee\xc8\xa8\xdb\x64\x4f\xea\x8f\x7b\x75\x66\xb4\xfc\x56\xb1\x72\x4d\xc4\x8a\x59\x7f\x35\x7c\xb0\x44\xe4\x92\xa7\xd8\x88\xda\x3b\x8b\x29\x07\x78\xac\x43\x68\x6c\x31\x99\x43\xbd\xd3\x19\x92\x45\x14\xdc\x1f\xad\x2c\xa3\x81\x19\x45\xee\x15\x61\x77\x6e\x4d\x24\x3e\xd3\x28\x48\x97\xb4\x73\x91\x62\xb2\x8e\x22\x68\x0e\xcd\x4b\x72\xaf\xd8\xad\x80\x57\xb0\xf3\xb7\xbd\x76\xc8\x5d\x8a\xa2\x4b\x9c\xc2\xec\xf0\xe4\xc8\x30\xee\x4e\xa2\xf2\x9b\xdc\x6b\xa7\x5c\xa7\xc8\x89\x42\xb4\x3c\x2e\xef\x29\x92\xe2\x56\x76\x54\x64\x0e\x54\x6b\x54\xc3\x96\x33\x94\x1b\xe5\x5e\x83\xf3\xa4\x22\xa7\xbd\x91\x4d\x15\xcc\x99\x8a\x24\xdb\x9b\x59\xd5\x91\x3f\x15\x49\x32\x2e\xcb\xaa\xc9\xa5\x8a\x24\x7b\xb8\x8c\x2b\xf7\x0a\x64\x5f\xb9\x57\x24\xd7\xc5\x6b\xe0\x0e\x8b\xf3\x00\xda\x2b\xc6\x3a\xc3\xcb\xdf\xef\xbd\xb9\x2b\x22\x49\xcf\x1d\x66\x84\xb6\x1b\x3f\xa3\x40\xa6\x97\x7b\x3d\xaf\x6a\x1c\x9f\x0d\x16\x1c\x82\xcd\x16\x1b\x9c\x19\x16\x9e\x9c\x9b\x39\x16\x95\x25\x16\x24\xd9\x9b\x45\xe6\xc9\x18\x8b\xb0\xe0\xa2\x32\xca\xe2\x95\xa0\x83\x6a\xb9\x68\xa2\x5f\x66\x54\x4a\x5f\x79\x2c\xd9\xb2\x9e\x3e\xba\x85\x86\x0e\x95\x26\xaf\xc3\xc2\x5a\x64\x94\x7b\x12\x60\xc8\xee\x59\x45\x1d\x7e\x85\x44\x0f\xc1\x1f\xbb\x88\x3a\x14\x48\xef\x83\x48\xe3\x57\xa4\x79\xa4\x0e\x94\x3d\xba\x59\x48\xc6\xa1\xe2\xb8\xff\xfc\x76\x80\xbb\x7a\x0d\x2c\xc5\x3b\x9e\x31\xb9\x96\x8a\x2d\x35\x25\x6d\xae\x71\xdb\xd6\x35\x0f\x05\x1b\xf2\x24\xab\x52\xcc\xfe\x02\xb2\x60\x08\x36\x08\xcb\x14\x2a\x6a\x6d\x9c\x63\xef\x46\xd8\x38\xdf\x41\x9b\xea\x97\xfa\x11\xab\x70\x1a\x6b\xa8\x71\xf3\x85\x10\x7d\xf4\x75\x5b\xef\x0b\x24\x08\xa9\x5e\x18\x59\xe7\x32\xbc\x1f\x0f\xd1\xcc\x58\x2a\xaa\xfa\x7b\xfc\x6f\x85\x90\x55\xb5\xe5\xb1\x33\xf1\x24\x38\x16\xe5\x12\x4d\x64\xa4\xda\x3b\x74\x44\x2d\xa9\x27\x6f\x77\x9c\xd9\x42\x77\x8c\xa6\x23\xcd\x83\xfe\x48\x51\x56\xd3\x6f\x71\x97\x20\x6b\xb3\x69\x18\x24\x06\x2d\x68\x77\x2a\xca\x3f\x59\xb0\x35\xa1\x05\x4d\xb8\xf2\x1a\x8a\xc3\xb5\x91\xc8\x01\xb6\xd1\xd4\xda\x07\xc2\x7c\xca\xc6\xc9\x66\x84\x0f\x74\xc0\xcc\xd6\x21\x15\xc7\xe4\x0e\xee\x2b\x30\x13\x91\xe3\xdc\xe3\x77\xe7\xa5\x39\xc9\x97\xf6\x51\x3d\xf2\xbe\x63\xea\x9d\x03\x80\xe7\xd8\xd9\x76\x90\x00\x50\x04\x64\x97\x92\xff\xce\x40\x59\xf1\x37\x93\xd7\x0b\xd8\x8c\xcb\xc6\x38\x4d\x5f\xf0\x93\x3b\x20\x33\x51\xb4\x54\x2c\x3d\xd9\xb3\x01\x7f\x6b\x4d\x36\x59\x34\x64\xea\x35\x03\xc1\x33\x9c\x49\x92\x32\xf8\x6f\x48\x3b\x9e\x8a\x4a\x35\xb8\xf7\xc5\x2a\x09\xc5\x48\x23\x55\xe8\x8c\x4a\x75\x5b\x8a\x29\xbb\xe7\xe1\xd0\xd5\x56\xc7\x7f\xa9\x10\x02\xff\x11\x22\xdb\x53\xfc\x1e\xcd\x0e\x0a\x2b\xcf\x16\x0d\x2d\xa5\x8a\x8d\x7a\x31\x6d\xdd\x6b\x80\xc6\xaf\xe7\x76\x5f\xd2\x5c\xc2\x60\xf6\x9a\x60\x6b\x5a\x44\xd5\x44\x23\x3c\xc7\x04\xb3\xd2\x44\xce\x8c\xcc\x44\xbd\x1e\xfc\xd2\x2f\xbc\x40\x4b\x26\x65\x47\xd9\xc0\xf6\xd5\x5a\x95\xbf\x55\x4b\x9a\x8f\x4a\x46\x53\x48\x44\x36\x44\x08\x47\x48\x64\x7d\x38\xe3\xf6\x34\xa9\xf7\x75\x06\xeb\x5c\x2f\x6a\x78\x55\x06\xcc\xb1\x64\x54\xf6\xe7\xa1\xf6\x4c\xf1\x73\xce\x7f\x43\x3c\x66\x5e\x27\x8c\x4e\x19\xa1\xfa\xdf\xa5\x3a\x23\x4b\x9a\x2c\x78\x1e\xe3\x88\x00\x6e\x26\x21\x85\x4e\x2f\x96\xf1\x0f\x81\x6f\x71\xce\x57\xc6\x27\x8a\x63\x0c\x3a\xce\xf1\xaa\xb7\xe1\x89\xdc\x5a\x38\xcd\x3f\xb9\x32\x19\x1c\x92\xbc\x6a\xb1\xb7\x2e\xa0\xf3\xcd\x0b\x06\x66\x33\xa5\x59\x1c\x2f\x8e\x72\x00\x03\xb7\x3e\xe8\x87\xf5\x2b\xa0\x3b\x91\xf4\x41\x8a\x36\xd7\x00\x36\x6f\xa0\x47\x63\x0e\x02\xc2\x65\x37\xe5\x49\x7e\xc2\x63\x4d\xf9\x70\x53\x8f\xf3\x3a\x8d\x48\x40\x3d\xc7\x9b\x54\x68\x68\x83\xcc\x7b\xbf\x2e\x57\x2c\xa8\x8c\xb7\xbe\x6e\xf5\xdd\x7d\x66\x08\x90\xea\x5d\xf9\xa7\x35\xa7\x76\x29\x9d\x53\x74\xee\xad\xf7\xba\xa7\xf3\x67\x28\x9d\xb3\x79\xfb\xda\xc0\xc6\x92\x36\xc2\x67\xf0\xee\x81\x25\x6c\x6a\x41\x73\xe1\x6f\x0c\xf3\xea\x1e\xee\x21\xad\xa8\x2a\x66\x0b\x34\x3f\xa2\xfb\xbd\xe4\xa2\x92\x84\x6a\xf3\xbf\x63\x3e\x60\x46\x3a\x0b\x63\x3a\xcf\x43\x71\x89\x79\x07\xcb\x57\xbc\x14\xf9\x12\x72\xdf\xfe\x33\x47\x17\x82\x64\x89\xc2\xc9\x6e\x91\x64\x5f\x0a\x56\x72\x84\xc2\x85\x58\x76\x93\x9a\x46\x24\x9f\xe7\x7c\xc6\x13\x0a\xc9\x93\x8f\x5c\x2d\xb4\xd0\x4b\xf5\x36\x4c\x70\x0e\xb9\x50\xbc\x23\x49\x4c\x0f\x28\x5f\x93\x92\x65\x8c\x4a\xd6\x8c\x83\xcb\xd6\xfb\xea\xd2\x83\xae\xf7\x6d\x11\xb5\xef\xd7\xd6\xdf\x23\x2d\x53\x08\xee\x53\xc5\xa7\x3c\xe3\x6a\xbd\xf9\xce\x4d\xa1\xe1\xd3\x2c\xa7\x54\xb2\x9b\x65\x8f\x42\xb1\x91\xbc\x0a\x8b\xac\x1f\x30\x7b\x91\xcf\xea\xc4\x32\x9a\xdb\x44\x80\xfe\x2a\xd3\x9e\xc3\x36\x2f\x8b\x04\x4b\x03\xee\x33\x89\xad\x5b\xc3\x15\x89\x3f\xdf\xdd\x5e\x9a\x87\xde\x4f\xf0\xa1\xa6\xd7\x96\x49\xea\xbb\xbb\xbd\xb4\xbb\x44\x6b\x73\x9d\xa7\x1c\xcb\x8c\xcc\xd4\xfe\xa3\x62\x25\x67\xa5\x16\xed\xa9\x84\x22\x93\x32\x65\x29\xf6\x94\xc5\xd4\xf9\x8f\x42\xb1\xda\x74\xea\x01\x14\xac\xfb\xfd\x5f\x5e\xbc\xe3\x19\x3b\x23\x97\xac\x54\xf8\x2f\xfd\xcd\xff\xce\xd6\xfa\x7f\xd0\xf7\x8b\xfe\xd5\x3a\xc7\x76\x4c\x3a\x9b\xd6\x92\xe6\x38\x9f\x9c\x8c\x46\x7a\xc1\x46\x38\xb1\x91\xca\xe4\xe8\x5f\x4f\x4e\xc8\xe5\xfb\x1b\x42\xcb\xb9\x1c\xef\x52\xc2\x98\xc4\x55\x15\x4c\x54\x95\xd4\x61\x66\xeb\x83\xb8\xbc\x20\x89\x69\x8b\x55\x49\x56\xe7\x50\x22\xb4\x48\xaf\x27\x3e\xc6\xd6\x49\x6c\x17\xdf\x78\x93\xd6\x3e\xe1\x0e\x12\x12\x58\x87\x8d\x2e\x76\x84\x24\x2e\x78\xbd\x05\xe2\x08\x91\x6a\xdb\x6c\xf9\x60\xd9\x96\x83\xf3\x18\x5b\xce\x72\xe3\xca\x54\x83\x9d\x49\x62\xc5\xca\x15\x67\x8f\xe7\x8f\xa2\x7c\xe0\xf9\x7c\xa4\x79\xd5\x08\x65\x9f\x3c\x07\xa0\xbb\xf3\xef\xe0\x3f\x41\xd5\xe7\xfe\xd3\xd5\xa7\xb7\xe4\x22\x4d\x0d\x5b\xa9\x24\x9b\x55\x99\x39\x29\x63\xa7\x42\xed\x0c\x52\x1d\xcf\x48\xc5\xd3\xff\x1d\x97\x7d\x13\xb1\x7e\x88\xf7\xbb\xdd\x58\xcd\xbb\x86\x13\x53\x90\xfd\xb8\x60\x86\x13\x3a\xed\xa7\x89\x28\x09\x57\x32\x2a\xe6\x67\x63\xb0\x71\xb9\x4d\xfe\x2e\x25\xcd\x15\x99\x37\xea\x1d\x5f\x64\x5e\x52\x52\xb2\xde\x02\x5c\xd2\xdd\x2e\xee\x1b\x38\xa6\xe6\x74\xe0\xf4\x9c\x0e\xe9\xd8\xd7\x1c\xea\xa4\x83\x9f\x16\x8c\x50\xb4\x14\x0c\x9d\x07\x16\x0c\xb3\x1f\x8f\xfd\xb7\x76\xec\xcd\x9e\x6e\xce\x7c\x08\xbd\x06\xaf\x6f\xf5\xcc\x07\x6f\x49\xa8\xd6\x73\xa2\x34\x8b\x5b\xaa\x16\x56\xc3\xb1\x0a\x05\xdf\x02\x7f\xad\x4d\xa1\xde\x81\x0f\xe3\x1f\xc1\x2d\x92\xf4\x34\xba\xdd\x1a\xff\x44\x95\x1d\xaa\x91\x29\x55\x85\xd9\xcc\x78\x56\x8f\xab\x7f\xf8\x47\xa5\xa9\x7b\x8c\x47\xa5\xa9\xff\xfa\x27\xe1\x9e\x47\xa5\xa9\xeb\x3a\x2a\x4d\x47\xa5\xa9\xfb\xfa\x27\x39\xf6\x47\xa5\xa9\x7d\x25\xc6\x57\x34\x58\x6d\xda\x52\x36\xb6\xf4\x27\x9f\xce\x60\x5c\xcc\x87\x52\x9c\x38\x34\x1b\x2f\xd9\xe4\x81\x17\xbf\xb0\x92\xcf\xe2\x7a\xb5\x5f\x61\x93\x04\x8b\x4b\xab\xe7\x02\x2e\x51\xc5\x9c\xbe\xa4\xfe\x41\xf9\xbe\xf4\x03\x7a\xde\x76\x5d\x5a\x4c\xd8\xec\x5a\xd9\x08\xcd\xf4\x50\x2b\xfb\xc0\xd6\x13\xaf\xd4\x08\x48\x8c\xae\xf9\x1c\xd0\x67\x17\x90\x18\x4f\x22\x2d\x06\x4b\x8a\x28\x2e\x17\x92\x10\x5f\xaf\x74\x38\xb8\x64\x88\x5a\xaf\x18\x89\xf0\x14\xd2\x20\x4a\x12\xc4\x48\x81\x90\x04\xf0\x71\xff\x70\xe2\x25\x78\xeb\xa3\x3b\xfd\x7c\x96\x88\x5c\xb1\x02\xde\x09\x4b\xb3\x10\x52\x41\xb1\xf9\x61\x38\x89\x77\xc4\x3c\x2a\x1e\x74\x63\x63\x40\x0e\x6a\x1c\x6d\x35\x67\x85\x6a\xc3\x3a\xc0\x74\x46\x14\xed\xde\x3f\x34\x4f\x89\x5c\x50\x92\x88\xe5\x94\xe7\x58\xd2\x34\xb6\x1b\xc4\x72\xad\x55\x13\xb4\x94\x0a\x50\x33\x58\xc2\xa4\xa4\x3d\x58\x7a\x6e\x4b\xed\x16\xaf\xfe\x64\xf3\xe7\x1f\x72\xf1\x68\x92\xa1\x2d\x6d\x31\x33\xa1\xa0\x6e\xa9\x66\xf3\xd8\xea\x40\x93\x07\x52\xb5\x67\xe5\x33\x08\x52\xbf\x17\x49\xf7\x49\x69\x67\x32\x35\xf7\x92\x25\x74\x23\xd2\x53\x31\xb1\x2a\xc9\x53\x96\xd0\xd2\x10\x24\x22\x27\x99\x10\xc5\x94\x26\x0f\xdd\x85\x5b\x52\x6c\xf7\x16\x9f\xf2\x3c\x25\x74\x4e\x79\x2e\xb1\x6a\xee\x56\xa4\xe4\xe6\x76\x78\x5b\x6c\xdc\x47\x36\xdf\x3e\x2e\x84\xf7\x69\xfb\x19\x37\x82\x67\xf0\xc3\x2c\x2c\x23\xcf\xcd\xc4\x77\x81\xb6\xf3\x48\xa5\x5d\x25\x12\x99\x7a\xe0\x11\xa3\xa5\x51\x90\xb3\xfa\xa4\xd0\xd7\x29\x81\x0e\x2a\x7d\x82\xeb\x13\x92\x3a\x3b\x4a\x9c\xb0\x54\x09\x49\x14\x9f\x34\xe9\x93\x24\x5e\x9e\xec\x85\xdd\xd8\x48\x50\xb6\xa9\xc8\x2e\x32\x5a\x0d\x50\xd2\xaa\xee\xf1\x79\x24\xdb\x8c\x06\xd2\xd4\x34\xd3\x00\x28\x9f\xd4\x34\xdb\xb5\x18\x0a\xe7\x06\xfc\xd3\x49\xd5\xdd\xe1\x9c\xfa\x11\x33\x86\xa5\x77\x47\x28\x2d\xbb\x20\x63\x58\x54\x85\xde\xf7\x7e\x45\x88\x18\x41\xad\x24\x84\x80\xf1\xc4\x2b\x1e\x85\x74\x31\x6c\xcd\x43\x08\x17\x5b\x08\x16\xbd\x34\x43\xc8\x16\x21\xe4\x0a\x5f\x8c\xa2\x17\xd1\xe2\xa5\x11\x2b\x76\xcf\x78\xeb\x44\x85\xdf\xfa\xe4\x06\x19\xbe\x49\x09\xdb\x2d\xb5\x8d\x3c\x11\x32\x3c\x79\x12\x74\x78\x12\x42\x88\x27\xa1\xc3\xd3\x91\x35\xb8\xb5\xb4\x26\x73\x70\x43\x3b\x0c\x2c\x71\xe7\x58\x37\xdb\x80\x0e\xca\x20\xec\x53\x9c\x77\x9a\x76\x49\x13\x9e\xcf\x23\xf5\xc9\x7b\xf7\xee\x56\x2e\x18\xfe\xc1\x51\x21\x6d\x42\x5e\x8f\x31\xd2\xce\xd3\x33\x85\x87\x9b\xf9\x81\x26\xe5\xae\x2a\x12\xb1\xc4\xda\x16\xc8\xbd\xeb\x71\x87\x11\x4a\xa6\x25\xa3\x50\xb9\xf5\x48\x3b\xf5\xc1\xa3\x12\x7b\x54\x62\x23\xd6\xe8\x9b\x56\x62\x57\xfd\x00\xe3\xed\x8a\xdb\x1a\x58\xdc\x55\x0c\xb6\xac\x74\xdb\xfd\x79\x18\x63\xe9\x4f\xce\x16\x19\x43\x19\xea\x4f\x69\x6e\x77\xae\x00\x84\x50\x91\x9e\x48\xf7\xf9\xcd\x21\xf5\x14\xa2\x6d\x1d\xdc\x42\xa4\x58\xbf\x72\x5f\xd3\x82\x1a\x68\xa5\x68\xb2\x30\x68\xa6\xf8\x17\x00\xe2\xec\xfc\x00\x94\xe7\xca\xd4\x84\x50\x95\x2c\xcc\xe2\xa9\x92\x17\x19\x23\x7f\xad\xf1\x0e\xce\xd8\x6c\xc6\x12\xf5\x23\xa9\xa4\x75\xb1\xc0\xfd\xdd\xbb\xb4\x46\x1d\xf8\xab\xfd\xd7\x8f\xdb\xcb\xee\x67\x61\xf8\xbe\xee\x4d\xde\x5a\x88\x6b\xb8\xd1\xd6\x26\xd9\xf1\xc3\xb4\x90\x86\x5e\x06\x18\xeb\x18\x7b\x20\xf4\x6c\x6f\x2c\x89\x81\x1b\xa1\x25\x81\x4b\x42\x8e\xc9\xaf\x0b\x96\xbb\x1f\xd2\xe8\xeb\x06\x46\xa1\x4f\x25\x2e\x19\xf9\x28\x26\xfa\x63\x54\x19\x3b\x23\xb7\xc0\xa6\x9a\x5f\x40\x23\xf8\x28\xae\xbf\xb0\xa4\xea\xeb\x56\x12\x60\x08\xbd\x8c\xbe\x0d\x95\xd9\xc0\x1f\xe1\xbc\x5a\xf0\x47\xcd\x56\x0c\x34\x6f\x53\xc2\xac\x61\xcf\x6a\x3d\xb0\x75\xd3\x3a\xcc\x40\x2e\x01\x4c\xcc\x59\x08\xa3\xc4\xb2\x20\xc4\xaa\xf9\x9f\xa6\xca\xbd\xf1\xf0\x35\x4d\x4a\x9a\x77\x5a\x04\x8b\x5e\x18\x4b\x7d\x13\x0c\x69\x97\x85\xf5\xa3\x30\xb5\x9d\x53\x03\x3a\xcc\xd5\x3a\x52\x9f\x80\xec\xc2\x57\x72\xe0\x92\xae\x7f\xab\x68\xd6\xee\xbe\x6e\x7e\xf2\xc2\xfc\x6c\x35\xac\x7a\xe4\x59\x9a\xd0\x12\x6d\x1c\xd3\xdf\xc0\x7a\xfd\x10\xce\x3c\x01\xec\x5f\x64\x1f\x9e\x05\x86\x2f\x2f\x4d\xdd\x3e\x2d\x15\x4f\x2a\xad\x4e\xeb\xb3\x38\xef\x6d\x47\x13\xf2\x37\xd7\x1b\x72\xc2\x12\x91\xa7\x31\xcd\x18\xef\x37\x9f\xd9\xac\x02\xd2\x5a\x9a\x48\x41\x61\x30\xf5\x9e\xbd\xbb\xbc\x3e\x0e\xa7\xa6\xb1\x88\xd9\x9d\x62\x66\x79\x4a\x7d\x68\x5b\xf0\x83\xfd\x9d\x2b\xea\x0e\x5f\x46\x01\x7e\xed\x70\xe6\xfa\x54\x8e\xc9\x4f\x6b\x6b\x47\x82\x06\x89\xa0\xc0\x3d\x24\x25\x53\x67\x1b\x1d\x7c\x90\xa2\x73\xcc\x67\xa2\x64\x2b\x56\x92\xd3\x54\x80\x3b\x86\xad\x78\xa2\x5e\xf7\x6d\xbd\xff\xc3\x4a\x01\x9b\x2c\x67\x73\xaa\xf8\xaa\x06\x89\xb1\x8e\x1a\x65\x31\xa7\x25\x79\x43\x4e\x81\x98\xb6\x7b\x58\xca\xa9\x62\xd9\xfa\x75\x0f\x5d\x03\x03\x82\x90\x1f\xdd\x2f\xb7\x45\xb0\x3c\x57\x7f\xfe\xc1\xb3\x65\x78\xae\xd8\xbc\x33\x72\x0a\x43\x8d\xd8\x27\x88\x42\xd2\x62\x86\x68\xb3\x6c\x70\xc2\x5a\x1c\xf6\x82\xbc\xf5\x42\x6d\x39\xa0\x59\x4e\x69\xa9\x65\x84\x01\x9b\xff\x1f\x7a\xaf\x51\x52\xb2\x39\x9c\x23\x3c\x23\x3b\x9c\xa2\x60\xc1\xd9\x76\xd9\x5d\x8f\xc2\xd5\xa9\x6c\xb5\xeb\xce\xfc\x96\x62\xef\x38\x2d\xdc\x4c\x95\x6f\xbb\x95\x3a\x40\x55\xf0\xc6\xcd\x72\xb0\xa6\x13\x4c\xed\x80\x6a\xdd\xbf\x1d\x7f\xc0\x88\xbc\xa8\x54\x51\x29\xb7\x13\x0e\x2a\xc0\xa6\xce\xb6\xf5\xca\x26\x68\xa5\x8f\xc2\x16\xc5\x29\xd3\x82\x93\xe5\x29\x2a\x5d\x68\x06\xb4\x08\x98\x2c\x80\xa2\x23\x0b\xe0\xac\x1b\x63\x51\xf3\xfd\x39\xcb\xe1\x44\x23\x50\x3b\x29\x99\xac\x32\xf0\x71\x99\x40\x08\x74\xb4\x30\xb6\xca\x2e\x4a\xa4\x33\x44\x47\x7b\xa6\x04\x7c\x69\x5a\xcf\x03\xae\xfe\x8b\x05\x9f\x57\x0b\x6d\x9b\x76\x6c\xc5\x7a\x2e\x43\xb5\x3c\x78\xd1\x2d\x55\x8b\x88\x83\x0b\x49\x16\x66\x10\xa6\x58\xdf\x78\x2b\xa8\x32\x7c\x70\x0b\xf3\xb9\x8f\x21\x31\x7c\x33\x4b\xad\x6d\xab\x99\xa3\x21\x48\x4e\xde\xf6\xc0\x44\x04\xa4\x16\x4e\xa6\x14\x05\x9d\xc3\x9e\x8c\x98\xd3\xe6\x23\x24\x65\x8a\x95\x4b\xf0\xc3\x2f\xc4\x23\xfe\x1d\x75\x80\xc2\xdc\xd5\x6b\x9f\xd5\x9d\x71\x16\x42\x2a\x03\xd7\x6a\x17\xc8\x60\x7e\xe1\xc6\x7c\xa4\x6b\x42\x4b\x51\xe5\xa9\x51\x6b\x03\x32\xe6\xc3\xc6\x20\x3f\x8a\x1c\x18\x28\x74\x10\x74\xbb\x54\x40\xc8\x53\x51\xbd\xd9\xbf\x1f\x7f\xff\x66\xa7\x45\xec\x37\xff\xb7\x7b\x63\x80\x58\x46\x7d\x50\xcf\xce\xfa\x03\xec\x8e\xdd\xe9\xfd\x25\xa3\xe9\xa7\x3c\x8b\x51\xaa\x3f\xe0\x16\x82\x47\x00\x94\x08\x1c\xbe\xa5\xd6\xa4\xe0\xa7\xc7\x92\x2b\xe6\xa8\x07\xa7\x33\x9a\xf5\xb2\x7d\x51\x92\x2a\xaf\xd9\xcc\xeb\xb6\x86\x07\x0f\xfa\xa6\xd3\x6f\x95\xcb\x6a\xba\xe3\xf9\x32\x07\x09\xb6\x55\x73\xbc\xea\x4d\x75\xd2\xdb\xc6\xba\x05\xba\xee\x1e\x35\x77\x4a\xaf\x5e\x91\x53\xbc\x53\x2b\xc9\x42\xf4\x69\x25\x81\xcf\x65\xa6\x77\xfd\xa5\x88\x51\xd4\xaf\xbf\x14\x14\x98\x74\xf1\xe4\x73\xfd\x89\x2d\xe8\x8a\x49\x22\xd1\xbd\x9c\x41\x3a\xfa\x04\x47\x0b\x1e\x66\xa7\xfc\xb8\x8f\x38\x2d\x39\x38\x94\x6b\xe0\x30\x49\xfe\xc7\xe9\x2f\x17\x77\xff\xf5\xf1\xe2\xc3\xf5\x6b\xe0\x0a\xcc\xce\xa8\xb1\xcb\xc3\xa3\x6e\x55\x3e\x07\x3e\x8a\x1d\xb3\x5e\x61\x8f\xa9\x65\x67\xa6\xc7\xb4\xac\x54\x45\xb3\x6c\x4d\xd8\x97\x24\xab\x24\x5f\xed\x72\x12\xfb\xbd\x49\xa3\x46\x6a\x74\xfc\xad\xb3\x69\xc1\x2e\xba\x10\x42\x5c\x45\x68\x25\x51\x0a\x89\x45\xd1\x46\xdd\x63\x5b\x25\x89\xd1\x45\x36\xd5\x10\x57\xed\xd8\x9e\xb2\x55\x43\x6a\xfc\x6e\xb0\xec\x9e\x4d\xa9\x68\xdb\xc2\xfa\xab\xa4\x35\xaa\x88\xe9\xf0\x68\xdd\x4e\xeb\x6e\xcf\x32\x82\x8b\x99\x06\x5b\xf9\xda\x8d\x4e\xe4\xd6\x8f\x36\x54\xdf\xa0\x8f\xf2\x3a\xa3\x52\xf1\xe4\xa7\x4c\x24\x0f\x7a\xc6\x31\xd2\xe6\xe4\xe2\xd7\xc9\xd6\x73\xad\x19\xe6\xe4\xe2\xd7\x09\xb9\xe2\xf2\x21\xd4\x10\xc6\x46\x04\x5d\x2f\x1d\x25\x0f\xd5\x94\x65\x0c\x5a\xaf\x81\xf8\x36\xf0\x33\x56\x72\x43\x94\x41\xc8\x7e\xdf\xac\xa8\x57\x64\xdf\x06\xab\xf4\x51\x32\x9c\xea\x54\x4f\x15\x1a\x23\x75\x3b\xab\xc3\x29\x9e\x33\x79\xef\xc5\x5b\x69\x2f\xb2\x03\x0b\x69\xf1\x26\x1d\xde\x0c\xeb\xb6\x16\x15\x79\xa4\x5e\x60\x55\x25\x90\x3f\x8c\xc9\x3d\x2f\xde\x92\x6b\x9b\xd6\x65\x7c\x5d\xb3\x8d\x97\x70\xd9\x14\xd4\x7b\xa8\x4e\x9b\xbc\x3a\x63\xf0\x69\x76\x6b\x2c\x5a\x72\xfd\x85\x2e\x8b\x8c\xc9\xb7\xe4\x15\xfb\xa2\x7e\x78\x75\x46\x5e\x7d\x99\x49\xfd\x9f\x5c\xcd\xe4\x2b\x5f\x7a\xe9\xcd\xb2\x0e\x0c\x43\x97\x43\xd3\x85\x6a\xca\x0c\x29\xad\x53\x38\x8a\x81\xfb\x79\x3d\x54\x0f\xf5\xe1\x3d\xaf\xc0\xa8\x87\x56\x52\x53\x81\xe8\x60\xd0\x46\x8a\xb0\xb2\x14\x65\x6d\xf0\x38\xcb\x0d\xc2\x35\x11\x4b\x6d\x03\x71\x19\x00\xf9\x03\xff\x32\x1c\x81\xfe\x5c\xd3\x88\x14\x02\x70\x48\xf5\xeb\xe2\x64\xbb\xdd\xaf\x3e\x45\xf6\x21\xd2\xd6\x0e\x5a\x3b\xd0\xdf\x16\xcb\xec\xc0\x9b\x99\x4d\x25\x40\x97\x80\xd3\xb5\xd6\x6e\x53\xbd\xb3\x0c\x7d\xcd\x24\x7d\x5b\xa5\xd9\x65\xef\x84\xe5\xeb\xe4\x3c\x65\xab\x73\x99\xd2\xef\xcf\x60\x68\xb6\xe5\xb7\x72\xe7\xe1\xa1\x49\x25\x79\xf5\xfd\xab\x3a\x0a\x9e\xad\xcf\xdc\x19\x37\x2b\x31\x13\x65\xfd\x2a\x3f\xdc\xd1\xab\x37\xaf\xc8\xa9\x28\x61\x34\x09\xcd\x49\xc6\xe8\x8a\x59\xe3\x57\xf3\x8b\x35\x7a\x42\x5e\x77\x82\x4f\xe0\xe5\x78\x83\xfe\xed\x4f\x81\xef\xdf\xef\x11\x22\x41\x75\x9e\x74\xf6\x88\xd4\xeb\xf7\x4a\xeb\xf1\xaf\x40\xf7\x16\x65\x82\x7c\x18\x10\x05\x17\x0c\x40\x48\x35\x4d\xcf\x22\xd4\x53\xe5\x79\xdb\x0f\xa0\x95\x2c\x20\xdd\xbb\x39\x3c\x54\xb9\x24\xaf\xc0\x14\x78\xf5\x8c\x5c\x9e\x44\x66\x44\x23\xe5\x9b\xab\xd8\x95\x46\x00\x36\x72\x73\x65\xf9\xbc\x03\x3f\x96\xba\x72\x94\x70\xdf\x06\xd6\x62\xf7\xf4\x62\x49\x7f\x17\x39\xb9\xfe\x69\x62\x86\xf1\xfa\x45\x16\xc8\xc3\x8a\xfc\xf9\xe2\xa3\x7a\xf5\x3c\x8a\x72\x6f\xa2\x0d\xfd\xbd\x2a\x99\x56\x3d\x22\x34\x99\x0b\x7b\xef\xa6\xf6\xa2\x7f\x27\x57\x54\x51\x54\x62\x4c\x36\x55\xdf\xca\xd7\xb2\x50\x9f\x0b\x48\x0c\xc6\x07\x1c\x3d\x64\x47\x95\x21\x01\xae\x3f\xf7\xa3\x56\xb7\x77\xd2\xdf\xf4\x40\x2e\xf1\x39\x80\xc7\x7d\x4b\x3e\x8a\x9c\x9d\xc1\x41\x25\xfa\xa4\x9a\x7f\xfe\xaa\x0d\x72\x0f\xdb\x89\xc9\x49\xe3\xf2\xc1\x0f\x07\xbd\x15\xa5\x75\xd3\x14\xa0\x04\x13\x76\xb7\x11\x2d\xd3\x4c\x4c\x6d\xda\xf2\xbe\xe3\xfa\x7c\x77\x33\x60\x58\x9f\xef\x6e\x9e\x76\x48\x83\x94\xbf\x4d\xdd\xaf\xd1\xe2\x4c\xea\x09\xa1\x8e\x2e\xe1\xd3\x1c\xf4\xd3\x4d\x1b\xd2\x90\xde\x36\xb6\x1a\x9b\x4f\xa2\xb5\x74\xb9\xc1\x1a\xdb\x3e\x6b\xe8\xef\x89\xd8\x3e\x06\xd7\x5f\x0a\x96\xa8\x3a\x24\x4d\x26\x0b\xaa\x19\x0e\x59\x56\x99\x82\x68\x3e\x7c\x58\xfd\xa5\x7d\xe2\xbb\x60\x65\x9d\x46\x4f\x93\x04\x4e\x35\xb9\x62\x18\x5c\x4f\xdf\xda\x4e\x08\x35\x2d\xf7\x01\x9f\x9e\x61\x49\x7d\x80\x7c\xc3\xf4\x2d\x72\x2d\x82\xe9\x87\xa9\xb3\x0b\x4f\xd1\x93\x96\xdb\x3f\xf9\x88\xae\x28\xcf\xa8\x41\x35\x93\x4c\xbd\x1e\xb7\xb2\x30\x25\x2c\xc0\x5e\xc7\x7d\xa0\xfa\xb0\xe5\xb3\x23\xa7\x9a\xc2\x39\x78\x02\x5f\x8f\x6b\xcd\x81\x2c\x98\x57\xb7\x06\xeb\x1e\x15\x0f\x57\xe1\xd0\x73\x54\x26\x39\xcd\xd5\x2a\x42\x5b\xcc\x27\xb8\x43\x82\xc9\x32\x3c\xcf\x9f\x3f\xdf\xdd\xec\x2c\xb6\xfa\x4b\x2c\xb7\xc5\x16\x00\xa1\x75\x89\x2d\xf8\xc3\x84\x95\x2b\x9e\x18\x0f\x5c\x9f\x93\x35\x7f\x42\xc9\xf5\xcf\xbf\x57\x2c\x06\xc1\x00\x01\xa8\x9c\xae\xa7\x36\xb9\xb0\xd5\x7e\x0c\xbf\xe0\x24\xc8\x40\x2e\x0c\x03\x01\x69\x6a\x90\xf1\xf6\x39\xd9\xc0\x1c\x06\x4c\x04\xb8\x29\xe9\x3d\x09\x51\x6f\x0d\x9d\xb5\x66\x75\xfb\x6e\xb0\x83\xde\xe5\xbc\x25\xac\x58\xcc\x62\x32\x29\x2e\x59\xb1\x78\x37\x69\x3b\xf0\xf4\x6f\xe4\xdd\xa4\xd6\x0b\x9d\x40\x53\x7f\x83\x38\x18\xae\x44\x67\xdf\x89\x24\x19\x9f\xb1\x5e\x7c\xeb\xf0\xf9\x5a\x8a\x9c\x2b\x51\x7a\x6a\x0a\xb6\x0b\x06\x60\xb5\xc9\x07\xf3\x24\x36\x08\x49\x44\x96\x19\x94\x4f\x31\xc3\x89\x59\xd2\x9e\xfd\xd7\x61\x4e\x30\x63\x8f\x8f\x1f\xfe\x02\x06\x85\x31\x1d\xce\x71\xa1\xcf\xef\xae\x2f\xae\x3e\x5c\x8f\x97\xe9\x77\x0b\xf1\x38\x52\x62\x54\x49\x36\xe2\xaa\x5f\x1e\x05\xf1\xe7\xa3\x4a\x6b\xc3\x98\xba\x45\x6f\x3c\x68\x7b\x11\x3f\xd9\x6c\x53\xac\x32\xa5\xa6\xe8\xc2\x46\xbe\x84\x50\x67\xa4\xa4\x35\xac\x67\xc0\xa5\x33\xab\xb2\x0c\x57\x5c\x95\x8c\x9d\xb9\xfe\x10\x4f\x5f\xcc\xc3\xcb\x69\x67\x5a\xb1\x6c\xd8\xe7\x6c\x63\x25\x1b\xcc\x86\x61\x43\xf9\x6c\xfd\x27\xdd\x6a\xf1\xbc\xde\x87\x81\xd0\xbf\xaa\x93\xfa\x59\x9b\x69\x53\x18\x88\x84\x07\xb6\x26\x01\xc0\x90\x99\x28\xf5\x6e\x2b\xdb\xfb\x83\xa9\x04\xa6\x7b\x5e\x49\x56\x8e\x8d\x2c\x79\x86\x53\x19\x23\x4b\x60\x30\x77\x6c\xb6\xeb\x42\xdd\xb1\x19\xf6\x54\x6a\x37\x08\x22\xb4\x52\x0b\x96\x2b\x8e\x18\xc2\x9e\x25\x33\xcb\xd1\xb9\x72\xa6\x31\xe0\x33\x2c\x55\x1c\x52\x50\x18\x4d\xe7\xeb\x4c\xf3\xc7\xeb\x09\x90\x74\x06\xb0\x75\x2f\x5c\x8c\x3e\x18\x3b\xf1\xf5\xd2\x1e\xd2\x92\xa6\x02\xf2\x3a\x4a\xf8\x4a\x67\x71\x3e\x49\x9a\x2e\x79\xfe\x55\x1c\xc5\x90\x82\xe5\x95\xf3\x21\xf5\x89\xe7\x69\xdf\xfa\xb6\xd7\xf6\x12\xee\x6c\xeb\x4f\xf8\xb4\xf5\xab\xd7\xb1\x3f\x6a\xed\x8f\x5e\x3b\x57\xe4\x36\x36\xd8\x8e\x0c\x46\x1d\xe8\xe5\x5a\xfe\x96\x8d\xf0\xdd\xa3\x22\x6d\x56\xfc\x65\x02\x7a\xcf\xe5\xd4\xd9\x08\xc6\xbd\x80\x6b\x27\x4a\x5f\x1c\xf8\x75\xc8\x51\x15\x3a\xe8\x2a\xc6\x68\x3f\x3b\xc9\xf4\x42\x70\x13\xea\xa1\x56\x30\x1b\x7c\x8a\x06\x5a\xc9\xe7\x81\xa3\x25\x5d\x32\xc5\x4a\xcc\xb0\x33\x99\x7c\xb9\xa9\x64\xf9\x54\xb0\x7c\xa2\x68\xf2\xe0\xf1\x63\x1f\xe5\xf0\x8b\xca\xe1\xa1\x91\x30\x9b\x16\x93\xd6\xdf\x9b\xa7\x5a\xeb\x33\x61\xdc\x26\x6b\x06\x37\xf9\x57\xc8\x75\x9e\x32\xba\x15\xc0\xa8\xed\x41\xa7\x6d\x0b\xdf\xfa\x67\xf0\x3d\x99\x6c\xbd\x42\x14\x55\xd6\x5f\xdb\x02\x15\x48\x38\xf0\x1d\x85\xa5\x51\x9e\x86\x84\xb2\x1a\x26\xb2\x14\x29\x23\x53\xae\x6c\xd9\xa2\x56\x04\x12\x53\x7e\x01\x32\xd3\xb3\x0b\xa6\x75\x15\x89\x2b\x69\xb1\x1e\x61\xca\xd4\x23\x63\x39\x79\x03\xba\xc7\x9b\x7f\xff\xf7\x7f\x0f\x94\xce\x9b\xd5\x10\xe4\xcd\x9f\x7f\xf8\x61\x4c\xae\x78\x09\xad\xf2\x39\x94\x85\xd4\x09\x94\x85\x4d\xfe\xcb\x85\x22\x14\x6a\x64\x40\x50\x7b\x1d\x02\x58\xe9\xad\x65\x82\x49\x23\x5e\xf2\xf9\x02\x46\xcb\xa1\x7d\xde\x2c\xe3\x89\x82\xb7\x98\x43\x8e\xb5\xaf\xde\x71\x42\x96\x9b\xa9\xfb\x33\xf9\x27\xb0\x96\x67\x24\xe3\x0f\x8c\xcc\xe4\xcf\xa5\xa8\x8a\xa6\x0d\x32\xa6\xbf\x79\x28\x26\x34\x87\xd2\x1f\x18\x40\xf3\x55\x24\x53\xcf\x92\xc0\x10\x70\x0a\x6d\x96\x9a\x3a\xda\xc9\x19\x61\x34\x59\x68\x83\x7b\x84\x9f\xbe\xa0\xbc\xce\x9d\xbb\xa2\xaa\x2b\x91\xbf\x1e\x3f\xe4\x73\xb7\x99\x7d\xc2\x52\xe7\x80\xd9\x04\xc4\xa2\x14\xff\xc0\x8f\xcd\x73\x6f\x4a\x8c\xc3\xca\x20\xef\x10\xbe\x0c\x36\xb7\xce\x9d\x66\xb9\x0f\x6c\x0d\xdf\x46\x8b\x4a\x68\x1d\xeb\xff\xda\xb6\x98\xae\xa3\xcc\x16\xb0\xae\x52\x28\x00\xdc\x1e\xad\x57\xdd\x30\xd6\x77\x93\x6d\xa9\x77\xb7\xc4\x3d\x53\xe5\x5b\x74\x01\x1c\xcb\xa7\xc0\x18\x56\x04\x83\xa4\xb6\x2e\xd2\xc9\xe5\x84\x84\x63\xac\xf5\xb2\xf7\x9a\xef\xe4\x21\x5a\x7f\x8a\x56\xc6\x8e\x64\xaa\x32\x1f\x07\x12\xb1\xf4\x78\x99\x94\xa6\x98\x6c\x49\xcb\x07\xef\xdc\x6d\x71\xf9\x18\xb2\xc1\x65\x5d\xf8\x86\x55\x8c\x2b\x56\xf7\x21\x72\xeb\x25\xfc\xe3\x3c\x19\x8f\x4f\x90\x3d\x88\x92\x48\x45\x4b\x73\xa2\xf5\xef\xfd\xa2\x2c\xe8\x0b\x6d\x67\xe2\xd3\x42\x6f\x29\xd3\x7a\xcf\x60\x7f\xd3\x56\x96\x37\x8d\x68\x9e\xfa\x0c\x80\xe4\x66\x03\x1e\x0c\x9a\x78\x19\xe8\xee\xbd\x35\x96\x80\x88\x51\x58\xcd\x91\x31\x9f\xd5\x64\x5e\x1d\x21\x59\x0c\x0a\x54\x73\x32\x83\x54\x9d\xbd\xec\xc8\xcf\xfa\x00\x3b\x35\x27\x56\x58\x04\x49\xfa\x85\x49\xa7\xc8\x08\x4f\x3e\x28\x52\xb6\x05\x47\x90\x68\x84\x60\xc1\x2b\x4e\xbc\xe0\x15\x23\x64\xf0\xf2\xc7\x05\xf0\xda\xda\xd7\x35\x67\xc0\x23\x3e\x6b\xa4\x2e\xd4\x6a\x17\x01\xee\x80\x17\x1e\x8e\x31\xf9\x60\x38\x8b\xde\x55\x39\xa1\x53\x29\xb2\x4a\x21\xe9\xe6\x8f\x86\xed\x44\xed\x24\x18\x14\x43\xec\x24\xe4\x38\x35\x19\x87\x15\x01\xb3\x8f\xe9\x1e\x49\x02\x5c\xcb\xbc\x38\xee\xf0\x1e\x02\x44\x7a\x04\x33\x0c\x86\x8c\x02\xc8\xf2\xe1\x90\x91\xdf\x56\xfc\x5a\xed\xc4\x03\xdb\x88\x11\xdf\x35\x8c\x6b\xbb\x53\x6b\x03\x19\x42\xb6\x8d\xc0\xb5\x0d\x3b\x3d\x42\x86\x98\xe4\x31\x26\xd8\xe4\x86\x9c\x5e\xd6\xa5\x1a\x26\xb0\x4f\x6e\x72\xc5\xca\x19\x4d\xd8\x6b\xd7\x34\xf3\xe7\x0d\xd9\x4a\x89\x05\xcd\xd3\xcc\xd6\x81\x10\xf6\x45\xb1\x32\xa7\x19\xbc\x29\x2d\x39\x94\xb7\x5f\x64\xc5\x82\x5a\xf0\xa5\x9e\x4a\xb2\x08\x83\x0d\xa8\xc5\xe6\x6f\xe0\xab\x8d\xda\x9a\x3b\x9b\xde\x19\x18\x4c\x01\xc7\xef\xd7\x63\x6b\x5b\x73\xac\x37\x00\xc8\x0f\x60\x4d\x6b\x51\x95\xc6\xc1\x6e\xa1\x7c\x13\x51\x6a\x13\xac\xbb\xd2\xa9\xb9\xa8\x24\x25\x9b\x6b\x5d\x15\xf0\xb6\x4c\xcd\x6c\x56\xe9\x1f\xf6\xca\x49\x3b\x50\x5e\x9f\x93\x7b\x67\xdc\xb0\x3e\x3f\xad\x75\xd0\x6e\xa2\x4a\xea\x49\x41\x80\xcb\x28\x21\x5c\x92\x82\x4a\xe3\x46\xf1\x8b\x1e\x2a\xa5\x48\x38\x18\xd4\xce\x17\x43\x65\x1c\xd4\x8d\xba\x16\xb7\x95\xbb\x1f\xe7\xb0\x16\x80\xa4\xe2\x01\x16\x8f\x58\xe8\x5c\xa4\xec\xb6\x9a\x66\x5c\x2e\x26\x03\xbd\x91\x1f\x3b\x1e\xc5\xec\x87\xad\x18\x23\x7a\x28\x7d\x36\xc1\xa6\xef\x92\x48\x06\xdd\xa8\x57\xc8\xd0\xb5\x2a\x02\x2d\xd3\x05\x2c\x7d\xdd\x99\x69\xd2\x9d\x15\x66\x46\x6b\xce\x87\x80\x8a\x90\x8c\x19\xd4\x0a\xfd\x21\x9c\xb1\x9b\x52\x32\x44\xc9\x49\xd9\xe7\xbc\x70\x7f\xf7\x1a\xed\x59\x26\x37\x6b\x93\x2d\x73\x46\x4d\xcd\x14\x9e\x99\xdd\xc3\xf5\xc6\x0a\xaf\x05\xdf\x00\x8d\x74\x30\xd3\xda\xcb\x24\xc9\x52\x60\xd9\x51\x4e\x84\xb7\x8d\x38\x3e\x0e\x80\x42\x96\x94\x53\xef\x09\x95\xdf\xb0\xa1\xfb\xb7\xd2\xd1\xdd\xfb\xa2\xee\xde\x81\x01\x97\x89\xb1\x85\xf0\x30\xda\xca\xf1\x76\xed\xa8\x65\xf5\x61\x93\x35\x10\xb3\xd9\x2b\x04\x82\x6f\xbf\x50\xaa\xe4\xd3\x4a\xf9\x76\xd7\x30\xe8\xd7\xc8\xa5\xef\x28\x2a\x6d\xc6\x02\xaa\x03\x93\x86\x8f\x8c\x8c\x81\x99\x38\x67\x21\xe8\x24\xac\x4f\x96\xc3\xb1\x0c\xbd\x46\x08\x83\xfc\xc5\x1f\x7b\xcb\xa9\x61\xb0\x22\xa9\x6a\x80\x56\xf8\x7e\x4d\xb8\x12\xf3\xb1\x43\xdf\x22\x80\xbc\xeb\xcd\xd1\x85\xf1\xed\xa2\xd3\xa5\xe2\x31\x7f\xa4\x65\x7a\x71\xdb\x53\x3a\xd0\x56\x79\x9a\xbb\x5d\x2d\xce\x12\x21\xfa\x77\x3a\x15\x06\x3e\xb5\x10\xbd\xd5\xaa\x1d\x5e\xf8\xa3\xbf\xbd\xbd\x44\x47\x7f\xfb\x37\xe0\x6f\xd7\xf7\xa2\x5a\x95\x71\x09\x35\xf4\xad\xb3\x60\x51\x25\x7c\x0e\xa5\x61\x8e\x4e\xe7\x04\x22\x47\xdc\xcc\x89\x77\x14\x32\xbf\xf0\x13\x66\x77\x37\x5f\x6d\xa3\xef\x4f\x21\x52\x14\xaf\x07\x70\x98\x02\x1d\xaf\xf6\xda\x31\x57\x27\x81\x77\x02\x60\xb4\x18\x35\x70\x02\x13\x85\xf0\x3a\x4f\xf0\x02\xf1\x4a\xf3\x5c\x20\x6f\x96\x67\x24\xa3\x53\x96\xc9\x33\xb4\xd9\x00\xee\x4c\x2b\x20\x05\x4d\xd8\x46\x7f\xf5\x90\x1b\x2e\x76\xfa\xfa\x6a\x34\x94\xf0\xbd\xfd\x90\x5b\xa0\x6f\x26\x0b\xb6\xa4\xf0\xcf\x77\x7a\x35\x3a\x81\x30\xba\x2e\x2e\x89\x56\x0b\x14\xc3\xc2\x66\x56\x2e\x25\x11\xb3\xb3\x56\xcd\xcc\xab\xd5\xf7\xde\x72\x75\x7b\x45\x3b\xa8\x89\xfd\xfc\xfd\x28\x34\x9e\xa9\xdf\xb6\x9c\x8a\xfa\xd3\x37\xd0\xc4\xc1\xc8\x43\x73\x35\xb1\x16\x38\x96\xb8\x9e\x07\x9e\x66\x8c\x3b\x8f\x80\xb8\x9e\x45\x7e\xb5\x28\xdf\x1d\x39\x06\x01\x8e\x41\x80\x97\x0c\x02\x38\x6c\x1a\x4e\x2b\x97\xc4\x2c\x80\x1b\x18\x08\x38\xab\xf0\xda\x88\x1e\x4c\x99\xd5\xc0\xc6\x0d\x48\x9b\xde\x6b\x36\x2e\xd0\x8b\x26\xdb\x5c\x4e\x8c\x92\x9c\x9c\x8c\xc7\x27\x27\x36\x9a\x60\x36\x6e\xa5\x66\xa3\xbf\x10\x96\x27\x22\xc5\x4d\x15\x1e\xe6\x8c\x97\x52\x81\xe0\x6e\xec\x63\x77\xae\x4b\x3b\xd6\x26\xc4\x10\x8e\x2b\xc0\xd8\x0e\xd6\x71\xd3\xd6\xce\xbf\xdb\x49\xf0\x36\xe2\xb6\xae\xc1\x37\x13\xad\x31\x78\xde\x82\x5c\x0d\x4e\xab\xe9\xb5\x61\x5a\xbe\xe8\xe3\x61\x1b\x89\x90\x53\xfc\x71\x9c\x14\xd5\x99\xb9\x61\xbc\x64\x4b\x51\xae\xc3\x2c\xc2\x12\xd1\x0f\xb7\xa8\x1a\x0a\x08\x8f\x95\x54\x65\xc9\x72\xe8\xba\xf1\x24\x52\xbd\x5e\x0f\x7f\x25\x59\x73\x6d\x64\x0a\xd7\x7e\x72\xf0\xce\xd4\x32\x04\x41\x79\x31\x5b\x3a\xbc\x14\xc4\x09\x3c\xc0\x93\x2c\x5f\x91\x15\x2d\x65\x68\xa6\x64\xa8\x20\x4f\xf9\x8a\xcb\x3e\x48\x64\xcf\x44\x1b\x9f\x87\x03\xbc\x89\xfc\xcb\xec\xac\xa8\x49\x1a\x0c\xa4\x66\x57\x6d\xe8\x2e\xdf\xbf\x3a\xf4\x84\xed\x9b\x86\x7f\xda\x86\x2b\xd6\x67\xa8\x56\x5d\x0e\xfc\x5d\xe2\x35\x8f\x00\x34\x55\xfb\xdd\x41\xc5\x23\x2e\x80\xf9\x1c\x01\xca\x00\x11\x70\xf1\x5e\xf1\xa8\xe4\xfd\x6b\x73\x6f\x3b\x83\x50\xb1\x65\x21\x4a\x5a\xae\x49\x6a\xec\xf1\xb5\xf5\x62\xd0\xb2\x1f\xfe\x1d\x0a\x1f\x9d\xca\xc7\xbd\x51\x49\x60\x26\x29\x2f\x77\xcd\xdf\x5f\xb2\x94\x57\xcb\x58\xef\xc8\xaf\x00\x9a\x65\xa0\xb8\x2c\x28\x00\x92\xa8\x21\x0f\x69\xf2\xe0\xc3\xbd\x06\xa2\x76\xc9\x40\xbc\xba\xa5\x49\xaf\x5e\x6d\x00\x58\x83\x06\x0a\xf1\x34\x91\xb2\x13\xbf\xc7\xcd\x90\xc1\xf1\x38\x8e\x97\xdc\xb8\xf4\x4d\x36\xd0\xa9\xb9\xf1\x35\x11\x25\xf9\x00\xb2\x61\x60\x06\xed\xe1\x3e\x10\x89\xac\x27\xe3\xbf\x33\x68\x21\x15\x8d\x5a\x25\x14\xcd\x9c\x16\x58\x19\x74\x81\xb4\x5f\xac\x25\x55\x02\xdf\xaa\xde\xfe\x36\x1a\xa9\xbf\x98\x1e\x0f\xca\x67\x70\x76\x64\x12\xa3\x5b\x3c\x01\x74\x4a\x4d\x15\x65\xae\x87\xae\xfd\x4a\xf7\x4e\x9b\xb4\x4a\xea\xd1\x01\xb6\xbf\x7e\xda\xee\xac\x7a\x08\x8f\x1e\x04\x5f\x82\x41\x6f\xb7\x03\x58\xdb\x00\x81\x4e\x27\x76\x1d\xdd\xa6\xa3\xfe\x6a\x7a\xab\xbe\xcb\x0a\x94\x3b\x33\x32\xa3\xbc\x88\x19\x44\x69\x6a\xa1\x2f\x6b\x28\x43\xdf\x8e\xda\xd8\xf3\x39\xcf\xda\x9b\xde\x22\xd3\xd5\x0b\x5c\xe5\x26\x96\x3f\x60\x9f\x76\x6f\xd3\x4a\xb2\x72\x34\xaf\x78\x7a\xd0\x0d\x1a\xe0\xb6\xb3\x24\x82\xcf\xbe\xbb\x6c\x33\xd8\x77\x7c\x5a\x32\x72\xb9\xa0\x79\xce\x32\x47\x64\x6e\x80\x25\xf6\x39\x94\x5d\x08\xc5\x00\x82\xe2\x01\x90\x1e\xbe\x8d\x2a\xa8\x97\x84\xb6\xf9\x46\xe0\x01\xb3\x2a\x1a\x18\xb0\xf1\x98\xbc\xbb\xb4\x2d\xe7\xb3\x2a\x27\x79\xb5\x9c\x32\xcf\x69\x7a\x39\x28\xbb\x97\x2f\xec\xda\xaf\x02\x0b\x17\xf9\xd7\x5f\x3f\x46\x23\x3e\x74\x7d\xa3\x47\x51\x66\xe9\x23\x4f\x31\x45\x47\x92\x53\x4d\xf0\xf5\xcb\x83\x30\x3c\x3e\xf2\xbe\xb6\x26\x81\x89\x19\xc7\x18\x4c\x8c\xc0\xcc\x4c\xb9\x10\xd7\x12\xe9\x14\x08\xf7\x75\xe2\xd0\xd7\x35\x47\x14\x78\x7d\x9f\xd6\x89\xdc\x2e\x3b\xda\x18\xab\x97\x1d\x58\xa7\xde\xe3\xcb\x40\xf7\x37\x83\x13\x3f\xad\x8c\x8b\x46\xa8\x05\x91\x7c\x59\x65\x8a\xe6\x4c\x54\x32\x5b\x7b\xb6\xc2\xf3\x2c\x78\x48\x66\x65\xec\x0b\x6e\xdd\x18\xd9\x55\xdf\xdc\x96\x61\x00\xac\xcc\x13\xfb\x81\x5a\x42\xac\x2f\xda\x24\x31\x97\x49\x72\x91\xb3\xf4\xbc\xae\x0b\x46\x34\x6f\xc8\x76\x63\x09\x34\x45\x4f\x49\x91\x55\x73\xde\xe3\xb5\x7e\xb6\xdc\xb6\x26\x6f\x47\x6b\xea\x11\x0a\x65\x28\x85\xe1\x0f\x0c\x24\x77\xdf\x99\x55\x46\x52\x56\xb0\x3c\x05\xa8\xf0\x66\xa7\xf9\xce\x1e\x4c\x7e\xaf\x15\x36\x5e\xf0\x97\x4c\xf0\x70\x78\xdc\xf5\x17\x55\x42\x7b\xff\xa5\x66\x40\xd6\x43\xcf\x67\x84\xe6\x3e\x46\x72\xf8\x54\x9d\x6f\x5e\x84\x3e\x19\x30\xc9\x53\x25\x0d\x22\x8f\x0b\x6e\x76\x9b\xda\xd7\x9b\xc2\x67\xdf\xef\xd6\x59\x79\x51\xb8\xe3\x53\xf9\xdc\x84\x3d\xaf\x44\xd4\x77\xc9\x8e\x34\x23\x9c\x63\x3d\x93\x63\x19\xf7\x57\x99\xd7\xf7\x74\x39\x57\xb3\x4c\x24\x0f\x51\x48\x22\xef\xf0\xce\x0d\x4b\xd9\xfc\xb8\x09\x25\xa2\x6d\xe0\x9e\xe9\x76\x5b\xc6\xe6\x0c\x39\xe2\x06\x52\x0a\x0c\x79\xbd\xf9\x4b\xd1\xb7\xc3\xa5\x01\x5b\x9c\x32\xe8\x66\x5c\xe5\xbd\x98\x06\x11\x9a\x09\x55\x54\x0e\x02\x15\xdc\x44\xd4\x95\x4c\x61\x3e\x20\x00\x94\x2d\x99\xa2\x00\x27\x3a\xfa\x31\x14\x76\x34\x73\xb6\x34\xb4\x3a\x63\xe7\xdf\xb4\x74\x49\x44\x2e\x79\xca\x0c\xf5\x54\x7f\x8b\xc4\xd3\x86\x29\x0e\xae\x17\xdf\xf8\xf9\x73\x34\x4a\x80\xbe\x75\x63\xce\x75\x67\x6a\x52\x21\x96\x76\x63\x07\xf8\xe6\x3c\x73\x36\x91\xa1\xf4\x64\xbe\xa0\x79\xc2\x6e\x6b\x58\xef\x48\x88\xea\x93\x9f\x2f\xaf\xdb\x0f\xb5\x0f\xc0\xcf\x97\xd7\xff\x14\x8d\x36\xe6\x09\x6b\x20\xcf\x53\x2e\x1f\x8e\x5d\x36\xfe\x00\x5d\x36\xb6\xbe\xfa\xb7\xee\x43\x3b\xb6\xd8\xf8\x8a\x5b\x6c\x3c\x13\x8f\x22\x07\x75\x74\x16\xe9\x00\x5d\xc0\xf6\x91\x70\x9d\x14\xb7\x57\x6e\xf3\x08\x2d\x30\xc6\x00\x5f\xea\xe7\x67\x2d\xd0\x1d\x0b\x88\x0f\xcf\x3e\xdf\x22\x3e\x01\xbe\x57\x0b\x47\x3a\x64\x7f\x7a\x56\x68\x0b\xb5\x6b\xbb\x41\xe1\xb3\x2f\xd4\x3e\xc0\xe6\xb8\xcb\x76\x52\x6a\xb8\xba\x63\x45\x8f\x64\xd8\x50\x65\xf0\xd6\x0d\x3f\x21\x57\xfa\x07\x21\x39\xe4\x11\x60\xc3\xed\xba\x73\x76\xef\x67\x47\x2f\xe1\x98\x5c\x5d\xdf\xde\x5d\x5f\x5e\xdc\x5f\x5f\xbd\x25\x96\x3e\x77\x15\xd3\x31\xb9\x17\x8d\x5b\xb1\xd7\x2a\x68\xfa\xa9\x41\x3e\x64\x33\xae\x33\xc3\x36\x69\xde\xc4\x62\x01\x14\x85\xe6\xe4\x26\xe7\xaa\xce\x5a\xf2\x29\x5e\x49\x26\x72\x93\xef\xa3\x69\x1a\x8f\xe6\x9c\xab\x33\x54\xb3\x0c\xea\xfa\x82\xb5\xdf\xd1\x4b\x92\x91\x5b\xcc\xa5\x68\x7a\xcd\xee\xaa\x2f\xd5\xf9\x08\xb1\xdd\x32\x30\x92\xd0\x64\x7e\x80\x14\xd9\xee\x1b\x6b\xf1\x4d\x3c\x87\xa8\x41\x3e\x01\x9f\xc3\xc9\xf8\xc4\xaa\x46\x59\x8d\x5b\x63\x13\x5f\xeb\xd7\x75\xb6\x1c\x6e\x2e\x13\x06\x6f\xef\xaa\x31\x21\x9f\x6c\xe3\xd1\x33\xad\xdd\x6c\x80\xe3\x78\x0a\x6d\xec\x48\x9b\x48\x77\x07\x7d\x2b\xb7\x65\x35\x75\x07\xea\x4f\xf5\x01\x2a\x2b\x96\x07\xc4\x70\x14\x13\xb4\x03\x89\xfc\x86\x77\xcd\xc8\x3f\xdf\xbd\xdf\xef\xd5\x78\xae\x22\x5f\x7c\x29\x96\x4b\xae\xc8\x82\xca\x45\x5d\xd6\xd7\x64\x23\xd4\xa7\x7a\xf7\x11\x85\xf8\x5c\xb3\x54\x3b\xf1\x3a\x2c\x18\x8f\xc2\x8d\x3f\xf9\xd9\xde\xbc\x61\xb0\xd5\x3f\x6f\xa1\xc7\xfb\x38\x48\x0b\x3d\x3e\x94\x44\xd5\x07\x35\x5b\x8f\x7f\x7f\xec\x53\x96\xa7\x88\xec\x18\xdd\x90\xc5\x3e\xf0\xd1\xc1\xb7\xb2\x54\x50\x61\x81\x89\xa6\x4c\x51\x9e\xf9\x14\xbe\x66\x05\x95\x28\x44\x26\xe6\xc3\xf0\x9c\x3b\x16\xe1\x3b\xcc\xac\x1e\xd1\x91\x5e\xdd\xfd\xf4\xff\x78\x34\x79\x9b\x20\xae\x17\xa2\x99\x53\xad\x09\x43\x5e\xf6\x10\xc3\xeb\x45\x26\x7c\x50\x05\x6c\x73\x15\xfc\x2a\x6a\xd3\x60\x18\x25\x49\x53\x3f\x5c\xb0\x72\xc9\xa5\x66\x25\x9d\x9a\x99\x87\xec\x33\xee\xa3\x7d\xd4\xb5\xfa\xf4\xf5\xa9\x73\x7d\x69\xa6\x01\x06\xa7\xb9\x50\x64\x83\x6c\x68\x34\x06\x5b\xb8\xc5\xde\x8a\x92\x8d\xd8\x17\x2e\xc1\x57\x01\xb5\x0b\xa2\x6c\xa4\x77\x5f\xc4\xcd\xe9\xa0\x61\x5d\x50\xd6\x61\x85\xcf\x42\xff\xe4\x56\xc6\x92\xa7\xcb\x3e\x5e\xd6\x1d\x88\x1d\x7e\xb3\x6c\x8d\x80\xa2\x50\x8d\x8c\x0e\x02\x3a\x87\x41\x8b\xd2\xb8\xdb\x8b\x92\xaf\x78\xc6\xfa\xdb\x2c\xa9\x05\xcf\xe7\x4e\xf3\x60\x68\x75\xcc\x4c\x19\x16\xdb\x9a\x83\x3e\xbf\x52\x39\x19\x72\x3d\x64\xe1\x14\x7c\xfc\x74\x4f\x72\xa6\x89\x2d\xb8\xdc\xdb\x78\xd0\xc3\xf0\xe4\x1a\x8f\x46\x23\xf0\xa7\x9c\xfe\x43\xeb\xa5\x69\xf6\x9a\xfc\xca\xcc\xdb\xb5\x7a\xae\x4f\x7c\xa2\xc8\xe3\x42\x80\x45\x5d\x49\x33\xaf\xd0\x77\xb4\x0d\xfa\xf3\xd4\x3e\x7b\xae\x9f\xd7\x6a\x21\x0a\xbb\x16\x15\xa8\xfa\x97\xa4\x89\x1c\xee\xac\xc3\x0e\xe6\xba\xd6\x75\x5c\x2b\x6b\xce\x0e\xac\xa1\x2c\x02\xb9\xda\x50\xe9\x2a\xd7\xcb\x8c\xe7\x0f\x67\x84\x2b\xcb\xcc\xf4\x9e\x30\x29\x8c\xf9\x83\xdd\xad\x25\xa3\x19\xf2\xf4\x61\xcc\x67\x97\x6f\xbe\x17\x3f\x57\x03\x9c\xa7\xf7\xeb\x02\xb3\x1e\x6a\x56\x60\x12\x41\x36\xba\xa8\x0f\x42\xb4\x7e\xe6\x19\x07\x0d\xe3\x1d\x39\x29\x97\x71\x08\x51\x27\x37\x93\xcb\xc9\xcd\x46\x23\x2f\xfc\xad\xe5\xd6\xb7\xfc\xb0\x67\xa6\xbb\xb9\xf5\xfd\xb0\x40\x7d\x6e\xfd\x3e\x81\x08\x53\xde\x5f\xb3\x4c\x16\xb4\xb8\xa8\xd4\xe2\x8a\xcb\x44\xac\x58\xb4\x51\x63\x61\xc3\x8c\x6b\x9d\x70\xbb\x88\x48\x85\x5c\xfe\xed\xe2\x36\xb6\x87\x48\x4c\x3a\x81\x1d\xe7\x84\xc9\x01\x16\x50\xf7\x28\x0d\x8d\x83\x8f\xf1\x18\x0c\xf9\x86\x82\x21\x70\x7e\xbe\xf5\x00\x08\xcf\xb9\xe2\x54\x89\x40\x0d\x60\xdb\x2b\x50\x49\x25\x96\xe6\x28\xdc\x58\x02\x10\xd8\x06\x61\xdc\xa2\xe9\x97\xc8\x0e\x8e\x30\x07\xeb\x2a\x91\xbc\x46\xdb\xdb\x48\xc3\x3c\x23\x39\x7b\xc4\xb7\x7a\xa5\x93\x7d\xfa\xaf\x26\x89\x56\xef\x55\x9a\xfd\xf8\xf6\xaf\x4e\x18\xe5\xc7\xba\x1c\xdb\x14\xe9\x7a\x28\x36\xd0\x75\xd0\xc7\x60\x3f\x87\x07\x21\xfc\xb7\x58\xde\x63\x5c\x77\xb8\xce\xff\x51\xd1\x0c\x57\xea\xe3\xbe\xfe\xa7\xf6\x2a\x47\x0e\xc6\x7e\x6d\xbb\xba\x1f\x6b\x0f\x40\x25\x19\x48\x41\xbc\x43\x95\x34\x97\x7a\xc9\x63\x81\x9f\x4e\x4c\xd0\xeb\x84\x9c\xaa\xa4\x08\xa2\x3e\x1d\x28\x25\x1e\x07\x6b\x56\xf8\x7d\x9d\x0a\xdf\xff\xf6\x03\x46\x88\x60\x3f\xc6\x3a\x62\x5a\x03\xbd\x85\x47\xc9\x7b\x2e\x15\x66\x60\x22\x2d\x68\x94\x05\x89\xd1\xbe\x48\x5e\x4e\x6e\x6e\x01\x96\xb3\xf8\x2f\x9a\xa6\xe5\x5b\x94\x67\x16\x8c\xa4\x04\xeb\x4d\xd4\xcd\xf0\x22\xba\x27\x9d\xaa\x75\xc1\x13\x30\xd5\xee\x2f\x6f\x81\x86\x24\x7f\xf9\x33\xa2\x27\xfc\xdb\x9f\xfe\xfc\xc6\xf3\x31\x9f\x2b\x53\x7d\xa0\xbf\xe3\x19\xe3\x4d\x7b\x29\x0a\x43\x73\x23\x41\x51\x99\x34\x7d\xd6\xcc\x59\xc5\x5d\xa5\x3f\x57\xcd\xb3\x63\xd5\x99\x63\x7e\xdf\x8b\xe2\xf6\xe1\xa7\x43\x7e\xb0\x3b\x27\x41\x26\x72\xbb\xc1\x44\x88\xb7\x15\xe6\x2e\x4c\xc4\x61\x15\x3e\x85\x69\x28\x13\xd9\xdb\x5a\xe4\xbf\x75\xcf\x74\xa4\x25\x49\xcf\x5f\xdc\x95\xdf\xc5\xd2\xec\x3f\x12\xed\xa3\x80\xfc\x43\xdb\x84\x4e\xc4\x0e\x2a\x00\xae\x3e\x4e\xfe\xeb\xfd\xc5\x4f\xd7\xef\x4d\x4f\x07\x48\x21\x40\x78\x35\x4f\x04\x72\x97\xac\xaf\xf8\x93\xd4\xbd\xeb\x03\x1f\x28\x8f\x8b\xcc\x7c\xdc\xe8\xe7\x9b\x93\x8f\xbd\xcd\x7c\x07\xd6\xb4\xef\xeb\xc3\xc9\x67\x3d\x33\x7f\x02\x27\x98\xf5\xb0\xb2\x2f\xed\xaa\x0e\xbd\x18\x92\x95\x80\xfc\xf8\x64\xae\x9b\xde\x89\x92\x17\x88\x3b\xe8\x19\xe3\x2a\xa0\xe9\xe7\x99\xf1\x6e\x11\x87\x17\x5d\xc7\x90\xe4\x2f\xe3\x4b\xa1\x4e\x26\x70\xb7\x8d\x5a\xe9\x53\x82\xa9\x46\xa5\x66\xe3\x9a\x81\x33\x29\xc3\x20\x26\x9b\x3b\xec\xc5\xf6\xd1\xce\xde\xbf\x91\x19\xff\x2e\x0c\xbb\xc9\xea\x41\x96\x7c\x99\x51\xde\x83\x42\xb1\x71\x6a\xbb\x1e\xc4\x7f\x4e\xd0\x49\xd8\x0a\xc5\xd4\x75\x2a\x7d\x4c\x5c\x10\x4a\x3a\x69\xd6\xf9\x0c\xd4\x98\xb7\x80\x07\x18\xe1\xfa\x18\xf2\x05\x9b\x65\x18\xd9\x8f\xd9\xfc\x84\xbf\x24\x7a\x30\x3b\x33\x44\x78\x7a\x48\xf2\xdc\xa5\x7d\x60\xb3\xd6\xaf\x67\x99\xfc\xfa\xfa\xf6\x02\xda\x86\xe1\x85\xb0\x35\x8d\x2d\xa8\xfb\x83\xf3\x88\x3d\x57\x98\x3c\x09\x27\xfe\x75\x60\xcd\x57\xd8\xea\xdf\xdf\xfe\x09\xb1\x81\x7a\x27\xed\x74\xdc\x17\x42\x89\x7c\x70\xe2\xff\x6d\xc7\x63\xed\xf3\x8d\x77\x5c\x62\x69\x4a\xd6\xef\x1e\xa8\x49\x60\x1e\x67\x57\xbb\xdd\xde\xc6\xba\x3b\x1e\xbd\x7f\xd6\x22\xd5\x83\x41\x42\xc4\xa4\x92\xa4\xd1\xe5\x30\x37\x57\x46\x99\xb3\x25\x2f\xd2\x6c\x0e\xd2\xec\x0e\x67\x1f\x78\xe6\xeb\xcd\xc1\xdf\x5f\x9c\xa6\xbb\x75\xbd\xd4\x1f\xf4\x51\x94\xf1\x45\xe9\xb7\xad\x07\x36\x32\x14\xcc\xdf\x36\x6b\xc6\xfa\x54\xfc\xaf\xe5\x94\x4c\x20\xdc\xea\x4c\xa5\x2b\x9a\x62\xcf\x8e\xe7\x13\x77\x1d\xaa\xa8\xa3\xe3\xa1\xd9\x71\xa8\xf0\xe8\x84\x8f\x8c\x4f\xe2\x1d\xee\x30\x0d\x14\x52\xb1\x05\xce\x21\x00\xa5\xa1\x05\xce\x7b\x69\xf2\x03\x3b\xed\xfe\x62\x6e\x37\x06\xbf\xfe\x3e\x0d\xfb\xa0\xf5\x11\x0a\xa5\x62\xbd\x68\x3b\xdc\xba\x83\x65\x04\x4f\x40\x7c\xf2\x99\x28\x01\xb6\x8a\x63\xf9\x72\x03\xc9\x69\x4a\x94\xcf\x4c\xf3\x89\x25\x2d\x7a\xc1\x26\x35\x4b\x70\xa1\xcd\x77\x3c\xfe\xc3\x11\xfa\x3f\x84\x60\xf9\x5d\xf0\xfd\x28\x16\xe0\x81\xe5\xef\x84\xda\xf7\x10\xed\x03\xe1\x0f\x40\xed\x7b\x28\x0e\x85\x28\x76\x20\x88\x3d\x54\xa3\xc1\x89\x1b\xf0\xe1\x67\x08\xe2\x98\x6d\x18\xb9\x11\x2c\xc0\xbe\x4d\x16\xc5\x63\xe0\xed\x4e\x30\x0c\x5a\xff\xb6\xa6\x88\x2b\x6d\xb0\x05\x9a\xfe\xb6\x34\x13\xf9\x3c\x8c\xe6\x2b\xdc\x64\x07\x96\xd6\xb9\x04\xeb\xc2\xeb\x2c\x8f\x45\x9d\x0d\xb4\xc3\xee\x99\x9c\x0b\xb9\xd0\x74\xe8\x68\xfa\x62\x43\xbd\xb4\xb7\xdc\xae\x1e\x65\x10\x8d\x7c\x18\x82\x6e\xf0\x23\x75\xce\x27\xa2\xd3\x71\x04\x49\xe2\x76\x43\x0e\xf7\x3c\x8e\xa2\xd8\xdd\x17\xd9\xcd\x2a\xd9\xe8\x7e\x1c\x45\xd5\xdf\x21\x19\xa9\x77\xf4\x41\x8e\xa2\xad\x42\xbd\x92\x3b\x3a\x22\x47\x11\x8e\xe9\x9a\x5c\xf7\x46\x8e\xa2\x38\xa8\x7f\x72\xf4\xe4\x07\x75\x52\x8e\xdb\x56\x4e\xb7\xe5\x60\x4f\xe5\x28\x8a\x3d\x7d\x97\xfb\xba\x2b\x47\xd1\x8c\xe9\x65\x4a\x86\x1c\xd1\xc1\x5d\x99\xa3\x68\x92\xa8\xde\xcd\xcd\x35\x84\xfb\xe0\x15\xd1\xcf\xb9\xb9\xf6\xec\xec\xdc\x5c\x83\x80\xa8\xf1\x8a\x69\xf4\xd0\x33\x52\x7f\xcb\x87\x68\x9a\xc4\x69\x0e\xe1\x6f\xfe\x30\x80\x64\x4f\x9b\x88\x9e\x36\x10\x03\x08\x7b\x1a\x46\xb8\x0d\x21\x06\x51\x3c\x4c\xeb\x88\xe6\x8a\x6e\x22\x31\x80\xe6\xb0\xe6\x49\x9b\xd7\x90\xc6\x12\xcd\x15\xdf\x62\xa2\xb9\x62\x9a\x4d\x34\x57\x7c\xef\xe9\x21\xdb\xb9\xee\x52\x1d\xe8\x42\x3d\x80\x66\x67\xbf\xea\xa6\x6d\x57\xab\x1f\xf5\x00\xb2\xde\xce\xd5\x03\xa9\x0d\x66\x3e\xb1\x20\xf3\x78\x85\xfa\x56\xbb\x77\x06\x8a\x0e\x9a\x2b\xba\x1f\x8e\x7b\xbb\x2f\xb3\xa9\xb9\xc2\x49\x36\x78\x7d\xcd\xa9\x36\x78\x0d\x4d\xb8\x89\x22\x1a\x4e\xca\xc1\x6b\xd0\xae\x0a\xf7\xca\x6e\xae\xc1\x5d\xb3\xa3\xa6\x55\x77\xd6\x8e\xe9\x9f\xbd\x39\x4b\xbf\x67\xaa\x7d\x6f\xc4\x9e\x0d\x76\x62\x74\x6e\x0d\x5b\x76\x0e\x35\xb0\xed\x82\xb3\x6a\x14\x98\x97\xb7\xed\xb6\xbb\xea\x6d\xb5\xbd\x8b\xfa\xbc\x91\x92\x60\x57\xf5\x36\xd4\x8b\x2f\x92\x17\x6f\xa0\x21\xfa\xbb\xf2\xc5\xca\xd5\x88\xde\x7d\xce\xdd\x83\x15\xe6\xd8\x7e\x7e\xcd\x15\xdf\xd9\x6f\x90\x2a\x8a\x3d\x00\x03\x3d\xfe\x06\x50\xdc\xa7\x1b\x60\x73\x0d\x5f\x50\x32\xb8\x43\x60\x73\xc5\xf5\x0a\x1c\x44\x92\x34\x9d\x05\x83\x5d\x03\x07\x12\x1e\xd0\x63\xd0\x79\x68\xb8\xa9\x44\x86\xf6\x1d\x6c\xae\xd8\x0e\x84\x03\x67\x6e\x13\x24\x76\xed\x45\xd8\x5c\x3b\x2d\xc7\x30\x05\x8e\x0c\xea\x54\xb8\x39\xb4\x68\x1d\x8d\x1c\x8d\xda\xa3\x51\x1b\x79\xfd\x01\x8c\xda\x50\x2f\xc5\x81\x36\x68\x0b\x14\xad\xaf\xab\xe2\x00\x9a\xdb\xfd\x17\x7b\xfb\x2b\x0e\x31\x6b\x7b\x3b\x31\xb6\x3b\x2d\x0e\x54\x0c\x82\x3d\x19\x23\x7b\x2e\x3a\x54\x87\xb3\xdd\xa1\x7d\x18\x9b\x6b\x78\x47\xc6\x21\x47\x49\xeb\x4b\xf1\xbd\x19\x07\x50\x6e\x77\x71\x0c\x77\x69\x1c\xa2\x1f\xed\xd8\xcf\xb1\xb9\x76\xd3\xcb\x06\xf7\x78\x6c\xae\xb8\x6e\x8f\x03\xf5\x08\xb7\x37\xe4\xee\x7d\x1f\x9b\x6b\x47\xe5\x6a\x40\x2f\x48\xe7\xa1\xc8\xae\x90\x03\x97\xc4\x9c\x05\x7f\x7f\xc8\x81\x34\xe3\xba\x49\x36\xd7\x8e\xcb\x38\xa4\xc3\x64\x73\x1d\xb6\xd7\xe4\x9e\x93\xd8\x45\xb3\x8c\xec\x44\xb9\x39\xb2\x01\x8a\xe5\x50\x87\xe5\xcb\xbb\x21\xa3\x09\x63\xe2\xce\x01\xdc\x44\xa6\xdf\x81\x89\xfe\x7f\x3d\x1e\xa0\x67\x8c\xee\x9b\x8a\xce\x00\xc6\x62\x73\x0d\x09\xed\xc7\x7b\x1f\x8e\xa1\xfd\xa7\x09\xed\x4f\x4c\xaf\x8e\x63\x5c\xbf\x73\x36\xc7\xb8\x7e\x73\x1d\xe3\xfa\x47\x17\xc8\xd1\x05\xb2\x7d\x1d\xe3\xfa\xad\x69\x1d\xe3\xfa\xc7\xb8\xfe\x31\xae\xef\xbb\x0e\x1a\xd7\x37\xea\x39\x06\xf5\xa3\x37\xdf\x57\x12\xd3\x37\x5d\xb2\x2e\x92\x44\x54\xb9\xba\x17\x0f\x2c\x18\xda\x8b\x32\xda\xb6\xa8\x06\x27\xf8\x74\x16\x1e\xad\x52\xae\x2d\xa9\xc1\x5f\xfb\xc2\x3c\x68\x8d\x1c\x2d\x61\xf2\x94\xa5\x35\xc5\x58\x97\xaf\x7e\x58\xe9\x55\x18\x93\x0b\x52\xb2\x84\x17\x9c\x61\x1b\x7c\x8a\xbf\xe3\x76\xb0\xed\x3d\x22\x15\x7d\xc9\xb2\x99\x69\x8c\x90\x3b\x8d\xb5\x1c\xdb\xc4\xb0\x7e\x3b\xdc\x28\xba\x86\xa9\xc0\xb0\x50\x1d\x10\x16\xa5\xdf\x76\x1c\x2b\xd9\x3f\x8c\xc6\x11\x37\x7b\x9c\xf9\xbd\x33\x12\xd7\xe9\x85\x4b\x1b\xd3\x17\x6c\x6b\x90\xb4\xe0\x06\xb1\xe0\xd0\x1c\x82\x7d\x29\x78\x09\xdb\x7a\xc2\x12\x91\xfb\xfa\x20\x37\x57\x6b\xf3\x5c\x6f\x52\xb0\xbb\xc8\xf8\x97\x23\xcd\xd8\xb4\x2a\xeb\xbe\xc7\x2b\x9a\xf1\x94\xab\x75\x1d\x3a\x37\x2d\xee\x28\x9e\x33\xb3\xd0\x51\x64\x2f\x64\xf3\x95\x09\x2d\x8a\x52\xd0\x64\xc1\xa4\x33\x6f\xd4\x81\x4d\x65\x65\x14\x4d\x5b\xf7\x82\xcd\x23\x41\x01\x06\xba\x5a\x4f\xca\xd6\xa4\x14\xca\xa6\x8d\x98\x81\xc7\x99\x9f\xad\xc9\xa1\xd9\x83\x83\xc2\x57\xa0\x4a\xa2\xca\x35\xe4\x9f\xc4\xb9\x50\x9d\xa1\xe0\x0a\xf0\x99\xfb\x3f\x92\x88\x2c\xb5\xe0\x46\x7f\x79\x13\x67\xfa\xb1\x32\x31\x67\x1a\xcc\x1b\xbe\x04\x0f\x67\xa6\x75\x44\x2d\x1a\xda\x2f\x88\xdb\xe4\xcd\x20\xfe\xf4\x03\x59\x88\xaa\x94\x63\xb7\x06\xf2\x7b\xf8\x0d\xed\xf3\xd8\x28\x99\x56\x2c\x15\xc9\x18\x95\x8a\x7c\xff\x86\x2c\x79\x5e\x69\xd5\x20\xe2\x59\x47\x35\xff\xf3\x0f\xd1\xc7\x2d\x56\x29\x8f\x55\xc7\xb7\x13\x1f\xcc\xa9\x2a\x10\xf4\xdc\x68\xe5\x86\xab\x84\xaa\x6e\x9d\xf7\x43\xc3\x83\x8d\x38\xa4\x11\x45\xee\x97\xcb\x95\x38\x30\xaf\x89\xd5\x6e\xa3\xb4\xd5\x48\xb9\x1f\x75\x5b\x48\x89\x0d\x95\x90\x9a\x00\x47\xe7\x5f\x03\x03\xf8\xad\x12\xd3\xb5\x8a\xa9\x29\xff\x0f\xbc\xb3\x5d\x4c\x6e\x7f\xec\x06\x8f\xea\x99\x70\xab\x97\x47\x83\x1d\xd5\x79\x77\x58\xfb\x98\x6b\x6b\x3a\xb2\x6e\x10\x2c\x6f\x6b\x0d\x5a\x37\x6d\x92\x30\xec\x39\x7c\xd5\x74\x8b\xcb\x05\xd2\x0d\x7c\xb2\x43\xd6\x5c\x7b\x11\x9a\xec\x3a\xdb\xfa\x41\x1f\xf3\x3d\x7c\x5f\x88\x18\x7d\xb8\x64\x73\x2e\xd5\x80\x16\x3c\x78\x7b\x7b\x3b\x49\x9e\xcf\xb1\x65\xc2\xb2\xca\x14\x2f\xb2\x7a\xe6\x9e\xf9\xd6\xa4\x8c\xac\x73\x5d\xc6\xd4\xf1\x4d\x52\x04\x2d\x40\x88\xbd\x40\xd8\xe0\xb4\x7e\x3f\xcb\x15\x22\xf5\x97\x5a\x98\x16\xb4\xa4\xf5\xc2\x42\x53\x72\xf9\xda\xf8\xa5\x69\xe2\x4d\x7f\x33\xd8\x37\x5a\x72\x95\x34\xab\x97\xcb\x0d\xe0\xee\xb3\xd9\x14\xcb\x69\xee\x89\x02\xb5\xdd\x2a\x70\x33\x11\x8f\x36\x93\xd4\x74\x62\xda\xd8\x65\xc1\x92\xe7\x9f\x68\xf2\xc0\xf2\x14\xda\xe9\xe1\x92\xa4\xeb\x9c\x2e\x0d\x86\x69\xdd\x74\x8c\xa5\x1b\x94\x7b\x2b\xcb\xf5\x85\x5e\x46\x2c\x99\xb6\x40\x0c\x81\x4e\xe0\x11\xeb\x53\xc9\x68\x90\xaf\xcf\x52\xeb\x02\x7e\x1e\x21\x31\xa6\x5a\xf2\x55\xc2\x8c\xda\xe4\x99\x92\x7e\xf9\x3e\x83\x5f\x79\x70\x3f\xb6\x86\x6f\x30\x3f\xb8\xb3\xf3\xc1\x79\x59\x87\xb9\x00\xf1\x8f\x66\x9a\x2d\xf8\xec\x1f\x5b\x58\xbf\xb1\x29\xa6\xeb\x7d\x1b\x76\x85\x7b\x54\xe1\xd1\xe8\xf9\xb3\x07\x8f\x21\x20\xeb\xca\x69\x0c\x4e\xc2\xc9\xdd\x4f\x57\x6d\xae\x74\x47\x53\x21\xc9\x4f\x99\x48\x1e\xc8\x15\x03\x3b\xc0\x95\x77\x3d\x2b\xb1\x09\xa1\xb8\x67\xef\xaa\x72\x9a\xee\xdf\x5b\xe0\x88\x87\xff\x0d\xe1\xe1\x97\x53\xdf\x02\x7c\x1b\x68\xf8\x4b\x3a\x8f\x6f\xa7\xa2\x2d\x76\x38\x6a\xf0\x98\x85\x69\xdd\xf1\x88\x7c\xb7\x10\x8f\x23\x25\x46\x95\x64\x23\xee\x49\x7c\x89\x98\xc5\x03\x5b\xeb\xbf\xc6\xce\xe3\xef\x78\x7b\xcb\x5c\x52\x02\x02\x0f\xf0\xbb\x96\xf8\x77\x3f\x5d\x69\x31\x13\x83\xee\xc6\x25\x39\x67\x2a\x39\x4f\x58\xb1\x38\x37\x43\xf9\x2a\x96\x65\x29\x72\xae\x44\x19\xdd\x01\xef\x82\x24\x22\xcb\x0c\xaa\x86\x98\x91\x4b\x56\x2c\x6a\x22\x4f\x3f\xa3\xe7\x42\x48\x2f\x84\x88\x45\x90\x76\xb6\xbc\x7e\xca\xec\x78\xe7\xc3\x97\xd3\xa1\x0c\xe6\xb9\x37\xc1\x37\xd6\x80\xf8\x09\x96\xe7\xb0\xc0\xf2\x27\x13\xfb\x00\x98\xa1\x4e\xec\xa9\x8d\x23\x6f\x08\x7b\x56\xc8\x65\x33\xe4\x66\x86\xea\x78\xca\x52\x22\x56\xac\x2c\x79\xca\x24\xa9\xb9\x89\x6b\xf9\xf2\xec\x40\x0d\x02\x77\x5a\xd3\x23\x0c\xfe\x8b\xc2\xe0\x0f\x30\x93\x1c\xe6\xa5\x9f\xda\x66\x5e\x34\x5d\xf2\x7c\x20\xac\xeb\xf3\xb2\xaf\x20\x9c\xbd\xd6\x43\x7a\xfe\x66\x05\xd7\x2e\x86\x88\x4c\x68\xc6\x6e\x3e\x45\x18\x23\x13\xbc\xb3\x6d\x8f\xd8\x1f\x1d\x64\xd3\x9d\xb0\x1c\xff\x5e\x6f\x76\x92\x8b\xb4\xcf\x37\xfd\xc7\x45\x3b\x75\xf6\x32\x82\x39\xee\x23\x28\xe7\x54\xb1\x47\x1a\xdd\x65\xdc\x4e\xa5\x8d\x29\x5e\x7f\xfa\x8b\xdb\x1b\xf2\x33\x52\xdc\x0f\x64\xb5\x14\x0a\x35\xb2\x2b\xb1\xa4\x3c\xba\x93\x92\x03\x0e\xed\x0e\xeb\xb6\x26\x47\x90\x9e\x96\x42\x01\x3b\x03\x71\xc7\x2a\x6d\x67\x19\x0b\xe8\x88\x74\x79\x60\xa5\xa2\xd1\x29\x1c\x27\x90\x4d\xf5\x6d\x9a\xd8\x98\xaf\x18\x70\x64\x35\x81\x6a\x22\x59\x2e\x39\x44\x81\x9c\xe4\x04\xd3\x3f\x14\x9b\xcf\x62\xa6\x2e\x2a\x1e\xbe\x93\xf7\x5e\xcc\x79\x6e\xcf\xad\x30\x21\xcd\x19\xf5\xe9\x22\x47\x4d\xe1\x45\x35\x05\x29\xb3\xeb\x9c\x4e\x33\x5f\x38\xad\xcd\xf8\x33\x3a\xd7\x9b\x8e\xc1\x53\xe7\x29\x97\xfa\xbf\x64\x32\x79\x0f\x8e\xf4\x2a\xb7\x9a\x6d\x20\xb5\xd9\xb0\xbd\xba\x9a\x07\x8f\xed\x7e\xe7\x09\xf9\xce\x00\x24\xd2\x9b\x3c\xd5\xc3\x65\xb2\x95\x9f\x64\xe8\x20\xc8\x6a\x9d\x62\x0e\x99\x1c\xfe\x78\xcd\xfd\x82\x27\x0f\xb7\x8e\xbf\x5c\x94\xfa\xb7\xdc\xf9\xa9\x25\x8e\x36\xff\xb6\x0f\xc3\x34\x83\xbe\x8d\x37\x5b\xef\x1d\x8e\x3f\x31\x53\xd6\x8f\x13\x2a\xa5\x48\x78\x13\x20\x09\x00\xa6\x36\xc2\x22\x05\x61\xb1\xdf\x34\x40\xd2\xef\x28\xbf\xec\x87\xb3\x8d\xb1\xa5\x23\x95\xfc\x46\xa8\x59\x87\xbd\x86\x8e\x1b\x65\x40\xa7\x86\xfb\x56\x6f\x06\xab\xfb\xa1\x47\xbf\xf6\xdb\x1b\x0f\x60\x98\xa9\x5b\x6d\xcc\xb4\xc3\xd9\xfe\x88\x75\x8f\x06\x13\x68\x7e\x42\xdf\xbf\xd1\x92\x7a\xfe\x5a\xcb\xbd\xbe\xbf\xf7\xeb\x8c\x21\x8d\xdc\x53\x44\xd5\x65\x9f\x6f\x84\x2d\xf1\x37\xe3\xec\x87\xc4\xad\x42\x14\x55\x46\x7b\xe3\x96\x5b\x8d\x2f\xf6\x68\x01\x83\x6f\xdf\x35\x24\x30\x1c\x85\xd9\x5f\x64\xd0\x06\x64\xf6\x7b\xf0\x2d\x54\x73\x1c\x20\x73\x18\x62\x44\x09\xf2\xe6\xcf\x3f\xfc\xd0\x07\xde\xdc\x0b\xd1\xec\xd5\x50\x7d\xe0\xcd\x3e\x88\x66\x2f\x51\x2f\x78\x73\x5f\x89\x80\x2f\x58\xd7\x0f\xde\xdc\xaf\x0e\x1c\x0e\xbd\x39\xe0\x5b\x1d\x5a\xcf\xe7\xd6\xea\xf9\x3c\x5c\xe1\x2a\xbe\xee\xfa\x36\x0f\x4d\x4f\xed\x9e\xbf\x2e\xcf\x47\xb3\xa3\x62\x2f\xb2\x1a\x2f\x60\x3b\x35\x89\x0e\x87\xaa\xc1\x1b\x54\x79\xe7\x56\xd5\x05\x46\xea\xaf\xb7\xeb\xa9\xa5\xf3\xd0\xec\xae\xb2\x0b\x57\xd0\x79\x48\xb6\x6a\xeb\x02\x95\x16\xc3\xd0\xc4\xc3\x35\x72\x51\xd5\x6f\xb1\x99\xd8\x11\x95\x6e\x7b\xd6\xb7\x45\x27\xdd\xc5\xd4\xb2\x0d\x11\x2e\x4d\x5d\x5a\x80\x28\xf1\xd7\xad\xf5\x55\xa3\x05\xa9\x76\x57\xab\xf9\x6a\xd0\x82\x24\xfd\x62\x64\xb7\xca\xb3\xe8\x7a\x33\x47\x64\x04\x89\x46\x57\x99\x0d\xa9\x2d\x8b\x4f\x5e\x8d\x49\x5c\x8d\xaf\x1e\x73\x6a\xc2\x82\x13\xf7\xd7\x8c\x75\x57\x82\x45\xed\xa4\xed\x4a\x31\x7f\xfd\x57\x90\x68\x4c\x7d\x58\xe4\xe1\x8d\xc9\x96\x0d\x55\x80\x05\x33\x69\x0f\x92\x1e\x1b\x53\x65\x34\xbc\xb6\xa8\x96\x2e\x5e\x2e\xef\x2f\x29\x8a\x77\xe6\x0d\xe9\xd3\xe7\xfa\xa8\x8c\xe9\x61\x15\x5c\x4c\x30\x6a\x40\x0b\xbd\x1a\x44\xd5\x13\x24\x3d\x94\xf1\x41\x62\x36\x5b\xc8\x30\xc3\xf7\x89\x98\xc6\xb6\xc6\x17\xf1\x69\xb2\x11\x2e\xa9\x7f\x3e\x46\x49\xbe\xf1\x9e\x70\x47\xe7\xfe\xf6\x24\x1b\xe7\xbe\x6c\x41\x28\x59\xa7\x04\xea\x4e\x33\x51\x12\x31\x35\xe0\xb1\x01\x5d\xbd\x39\x30\x17\xb7\x37\xda\x9e\x87\x8a\x31\x9a\xc9\x31\xe9\xa8\xdf\x37\x6a\x50\xc8\xfe\x69\x2c\x1c\xaa\x14\x5b\x16\xca\xb7\x15\x8e\xbe\xfd\x17\xf5\xed\x0f\x76\x48\xfe\x52\x3f\x50\xb7\x46\xae\x96\x34\x1f\xe9\xd3\x06\x5e\x7e\xc7\xd9\xea\x99\xc1\x26\xa7\x1e\x13\x9b\xcd\x0c\x0b\x0a\xae\x1b\x28\x64\x68\xf5\x68\x27\x3e\x1f\x41\xd3\xbd\xf7\x30\x1e\x5a\xa0\x35\x78\x55\x50\x18\x6f\x9c\xcf\x44\x6c\xe6\xd4\x7a\x59\x10\x4c\xb5\x5e\x21\x7b\x14\x1d\x59\xdf\xb2\xd8\xd5\x82\x85\xb2\xf7\x6f\xa1\xfa\xa6\x79\xbe\x6d\xc3\xa0\x11\x43\xb3\x4c\x3c\xe2\x78\x1b\x39\x18\x58\x6e\x98\x19\x96\x08\x42\x2d\x0a\xd7\x86\xbe\xf1\x26\xbb\x53\x00\x9e\xa4\xb4\x95\xe4\x55\xfc\xc1\x34\x28\x4d\x68\x71\xc2\x94\xbb\xd9\xb4\x19\x9d\x63\x42\xba\xfe\xb7\xcd\x6c\x0a\x4c\xdc\x06\x8e\xa6\x6c\x41\x57\x5c\x54\x25\xd2\x55\x82\xbc\x32\x7f\x02\xa1\xb5\x16\x55\xed\x2c\xac\x02\x09\xb3\xf5\x2a\xca\x8e\x2f\xf5\xb1\xf9\x23\x18\x73\xa9\xb0\x7e\x94\x11\xfb\xc2\xbd\xe5\x84\x5b\x6b\x66\x3f\x92\x45\xed\x7c\x32\xc5\x6b\x25\x0b\x2d\x15\xa3\x5b\x8e\xfe\xe2\xde\xdf\x56\xc0\x56\x13\xf8\xd3\xb7\xd6\x70\xf4\xa8\x82\x75\x5d\x75\xb8\x30\xe3\xc9\x3a\xba\xd9\x66\x13\x26\xd4\x8f\x91\x9f\xa8\x64\x29\xf9\x40\x73\x3a\x47\xdb\xf7\x74\x72\xfb\xd3\x87\xd7\xfa\x13\x06\xdc\x1b\x37\x57\x5d\x51\x46\x4b\x1f\xc9\x7f\xdc\xaf\x3e\x65\x63\x8e\x03\xc4\xe0\xc1\x66\xb9\x67\x85\x8d\x15\x58\x7e\xb4\xf3\xed\x02\xdf\xcd\x26\xca\x1b\x07\x77\xb5\x4c\x9f\xb0\x39\x72\x33\xe4\xe1\xec\xaa\x9f\xf6\xa8\x1b\x76\xcf\x43\xad\xcf\xdb\xf0\x48\xb3\x4b\xb1\xd4\x6c\xad\x0b\x95\xbf\x0d\x48\x00\x29\x0e\x58\x6c\x81\xb7\x5b\x39\x0f\x96\xc7\x88\x2e\x18\x4d\x49\x26\xe6\xa6\x0d\xfe\x24\xa7\x45\xd1\x91\xc8\x05\x22\x78\x96\x51\xa8\x25\xc0\xb6\x06\x2b\xca\x33\x20\xce\x73\x0b\x17\x0f\xc9\x61\xb7\xa5\x58\x32\xb5\x60\x95\x24\x3f\xfe\x2f\xf2\xa7\xf1\xf7\xdf\x8f\xdf\x6c\x12\xec\xb3\x3e\x3a\x17\x43\x2a\xaa\xaa\x16\x27\x6d\x2b\xd3\x1f\x34\xff\x2a\x19\x56\xe2\x4f\x01\x1b\x22\x35\x0f\xd9\xc9\x3a\x63\x4a\xb2\x4a\x2a\x56\xa2\xc9\x05\xc5\xa8\xed\xc1\x7d\x14\x8a\xf0\x3c\xc9\xaa\x14\xa2\x0d\x2c\xb7\xd8\x0d\x50\x30\x51\x8a\x65\x1b\x84\xe2\x0c\x57\xa3\xfe\x43\xf3\xa6\x16\xd5\x4f\xc0\x5e\x45\x09\x76\x0c\xa2\x78\x74\xea\xfb\x73\xae\x16\xd5\x74\x9c\x88\xa5\xa3\xfa\x9f\x9b\xac\x14\xb5\x3e\x9f\x66\x62\x7a\xbe\xa4\x7a\x06\xda\x10\x50\x25\x9f\x56\x4a\x94\xf2\x3c\x65\x2b\x96\x9d\x4b\x3e\x1f\xd1\x32\x59\x70\xc5\x12\x55\x95\xec\x9c\x16\x7c\x94\x88\x7c\xa5\x0f\x92\xc8\xe5\x78\x99\x7e\xa7\x99\xef\x88\xe6\xe9\x08\x97\xc8\xd5\xe3\xfb\xe4\x56\xfd\xad\xef\x98\x66\xef\x74\x4b\xac\xb5\x9d\x9d\x42\xd1\x8c\xe4\xd5\x72\xca\x4a\xc8\x0b\xa8\x77\x4a\x21\x52\x89\x86\x2f\x56\x9b\xd6\xa8\x04\x4b\x9e\xeb\xcf\xb1\x36\xa8\x19\xdb\xf0\xcb\x8a\x96\x73\xe6\x76\xb1\x75\xbe\x68\xca\x8a\x4c\xac\x97\x1d\xe1\x24\x9f\xf7\xb7\xdf\xdb\x5b\x50\xad\x77\x7a\xa7\x78\xd7\x28\x15\xd6\x73\xa7\xb5\x3f\x8a\x9d\x5f\x6d\xf5\x79\x95\xa7\xac\xcc\x28\x80\x54\x2c\x81\xf7\x6e\x6b\x1a\xc6\x5c\x03\xf5\x6e\xca\xf4\x9d\x05\x2b\xf5\xb8\xb5\xe6\x0b\xa6\x7d\xaa\x95\x0e\x56\xd3\xae\xa3\x73\xf5\x6d\x91\x67\x4b\xf3\xa6\x1d\xbe\x5e\x2e\xf2\x91\x62\xe5\x92\xe7\x20\xe7\xe0\x13\x7a\xbe\xc6\xd6\x04\x9b\xaf\x43\x4e\xd5\x82\xf1\xd2\xf4\x40\x21\x4b\xaa\x12\xe3\x51\x06\x44\x60\x51\xbe\x3e\xcc\xf7\xab\xf2\xfd\xf6\xab\xf3\xfc\x3e\xd3\x3d\xd0\x64\x8a\x54\xaf\xfb\x4e\x13\x39\xe0\xa7\x03\x79\xbc\xa0\x2b\x74\x3b\xa5\x4c\x6a\x19\x67\xd9\x3e\x18\x7b\x87\x98\x6e\x97\xf0\x1c\x6d\x73\x9f\xd6\x5f\xf1\xb4\xb6\x7e\x2a\xbb\xee\xeb\xd8\x15\xed\xbf\xb7\x17\xda\x2f\x94\x36\x07\x3a\x82\x25\xf8\x97\xce\xfb\xcd\x22\xbd\x25\xab\xef\x9b\xff\x83\x0f\x39\x32\x80\xeb\xf0\x07\x84\xe5\x62\xe9\x5b\xa2\xca\x0a\xd5\x04\xa3\xfc\x99\x5f\x1a\x31\x48\x93\x84\x15\x8a\xa5\x60\xcd\xe1\x10\x1e\x78\x9e\xbe\x25\xaf\x10\x1a\xbc\xc8\xaa\x92\x66\xe6\x7f\x35\x43\xe5\xc0\x3a\xde\x92\xff\xfb\xff\xfe\x05\xa9\xb2\xf4\x17\x3b\x0e\xfd\xe3\xff\x0f\x00\x00\xff\xff\x49\x90\x26\xb5\x15\x49\x05\x00") - -func examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYamlBytes() ([]byte, error) { - return bindataRead( - _examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml", - ) -} - -func examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml() (*asset, error) { - bytes, err := examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml", size: 346389, mode: os.FileMode(420), modTime: time.Unix(1, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x57\x4b\x8f\xe3\x44\x10\xbe\xe7\x57\x94\x96\x43\x2e\xd8\x61\x81\x03\xf2\x0d\x0d\x0f\xad\x80\x65\x34\xb3\xcc\x05\xa1\x55\xdb\x5d\x49\x9a\x69\x57\x9b\xaa\x72\x76\xc3\xaf\x47\xd5\x76\x26\x8f\xb1\x67\x46\x8b\x90\xe8\x53\xdc\x5d\x8f\x2f\x5f\x7d\x55\x6d\x2f\x8a\xa2\x58\xb8\x2e\xdc\x21\x4b\x48\x54\x81\xeb\x02\x7e\x54\x24\x7b\x92\xf2\xfe\x1b\x29\x43\x5a\xed\x5e\xd7\xa8\xee\xf5\xe2\x3e\x90\xaf\xe0\xaa\x17\x4d\xed\x0d\x4a\xea\xb9\xc1\xef\x70\x1d\x28\x68\x48\xb4\x68\x51\x9d\x77\xea\xaa\x05\x80\x23\x4a\xea\x6c\x5b\xec\x11\xa0\x49\xa4\x9c\x62\x44\x2e\x36\x48\xe5\x7d\x5f\x63\xdd\x87\xe8\x91\x73\x86\x43\xfe\xdd\x17\xe5\x97\xe5\xd7\x0b\x80\x86\x31\xbb\xbf\x0b\x2d\x8a\xba\xb6\xab\x80\xfa\x18\x17\x00\xe4\x5a\xac\xa0\xe3\xd4\xa2\x6e\xb1\x17\xee\x23\x4a\xd9\x26\x0a\x9a\x38\xd0\xa6\x6c\x12\x63\x92\xb2\x49\xed\x42\x3a\x6c\x2c\xff\x86\x53\xdf\x55\x30\x6d\x34\x84\x1c\x71\x0e\xff\xf1\xfa\x21\xfa\x4d\x1f\x31\x1f\xc4\x20\xfa\xd3\xc4\xe1\xcf\x41\x34\x1b\x74\xb1\x67\x17\x1f\x21\xcb\x67\x12\x68\xd3\x47\xc7\x97\xa7\x0b\x80\x8e\x51\x90\x77\xf8\x1b\xdd\x53\xfa\x40\x3f\x04\x8c\x5e\x2a\x58\xbb\x28\x76\x2c\x4d\xea\xb0\x82\xb7\x86\xb0\x73\x0d\xfa\x05\xc0\xce\xc5\xe0\x33\x3b\x03\xe6\xd4\x21\x7d\x7b\xfd\xe6\xee\xab\xdb\x66\x8b\xad\x1b\x36\x01\x3c\x4a\xc3\xa1\xcb\x76\x17\xa0\xc1\x5b\xd9\x50\xc0\x45\x64\x0d\xb4\x81\x8c\x15\xd6\x89\xc1\x9d\xd8\x42\x20\x51\x47\x0d\x8e\x21\x3b\x4e\x9d\x39\x1c\xd8\xb2\x75\x22\x9f\x87\xbd\x8b\xe4\x4b\x43\x37\xd8\x3c\x64\xd6\x2d\xc2\x58\x76\xf4\x20\x19\x39\xa4\x35\xe8\x36\x08\x30\x66\x5a\x68\x90\xd0\x49\x58\x30\x13\x47\x90\xea\x3f\xb1\xd1\x12\x6e\x8d\x3a\x16\x90\x6d\xea\xa3\x37\x95\xed\x90\x15\x18\x9b\xb4\xa1\xf0\xf7\x43\x64\x01\x4d\x39\x65\x74\x8a\x63\xc1\x0e\x2b\x90\x22\x93\x8b\xc6\x6b\x8f\x9f\x83\x23\x0f\xad\xdb\x03\xa3\xe5\x80\x9e\x4e\xa2\x65\x13\x29\xe1\x97\xc4\x08\x81\xd6\xa9\x82\xad\x6a\x27\xd5\x6a\xb5\x09\x7a\x68\x98\x26\xb5\x6d\x4f\x41\xf7\xab\x2c\xfb\x50\xf7\x9a\x58\x56\x1e\x77\x18\x57\x12\x36\x85\xe3\x66\x1b\x14\x1b\xed\x19\x57\xae\x0b\x45\x06\x4e\xb9\x5f\xca\xd6\x7f\xc6\x63\x77\xc9\xf2\x04\xa9\xee\x4d\x09\xa2\xa6\xdf\x87\xed\xac\xd7\x59\xde\x4d\xb0\x10\x04\xdc\xe8\x36\xe0\x3f\xd2\x6b\x5b\xc6\xca\xcd\xf7\xb7\xef\xe0\x90\x34\x97\xe0\x9c\xf3\xcc\xf6\xd1\x4d\x8e\xc4\x1b\x51\x81\xd6\xc8\x43\xe1\xd6\x9c\xda\x1c\x11\xc9\x77\x29\x90\xe6\x87\x26\x06\xa4\x73\xd2\xa5\xaf\xdb\xa0\x56\xe9\xbf\x7a\x14\xb5\xfa\x94\x70\x95\xc7\x06\xd4\x08\x7d\xe7\x9d\xa2\x2f\xe1\x0d\xc1\x95\x6b\x31\x5e\x39\xc1\xff\x9c\x76\x63\x58\x0a\xa3\xf4\x79\xe2\x4f\xa7\xdd\xb9\xe1\xc0\xd6\xc3\xf6\x61\x06\x4d\x56\xe8\xb6\xc3\x26\xac\x43\x93\x75\x6e\xda\xf6\x28\x81\xd1\x9f\x37\xe6\xd0\x34\x79\xca\x0e\x3d\x7a\xec\xd0\xf2\x24\xf2\x54\x77\xda\xca\xd3\xef\x62\xef\x02\xc7\x55\x22\x45\x52\x43\x70\xd2\xfd\x39\xf7\x3a\x44\xbc\x70\x0d\x8a\xed\xa3\x78\x97\xda\xb3\x39\xf3\xa3\x65\x1e\x04\x68\xf3\xd3\xc2\x8b\x15\x9c\x34\xb8\x18\xf7\x80\xa6\x47\x2b\x74\xee\x58\xf6\xa7\x04\x1f\x97\x35\xe4\xf9\xa0\x2a\xe1\x6d\x52\xac\xe0\xda\xb1\x45\xba\x41\xe9\x12\x09\xde\x2a\x3b\xc5\xcd\xde\x32\x26\x8a\x7b\xe8\x05\x3d\xd4\xfb\x89\x98\xef\xb6\x8e\x52\x9e\x85\x9c\xe3\x7f\x08\x31\x9a\xf0\xc2\x86\x12\x67\xa7\xa9\x31\x28\x25\xc0\x9d\x4d\xdf\x89\x88\xc3\x68\xc8\xe5\x19\x5a\xc1\x26\x39\x38\x46\x58\x2e\x3f\x38\xa6\xe5\x12\x12\xc3\x72\xe9\xea\xc4\xba\x5c\x96\x30\xa3\xe6\x6d\x5f\xdb\xb5\xb4\xd2\x8c\xb0\x08\x69\xfc\xb5\xaa\x63\xaa\x57\xad\x13\x45\x5e\xf9\xd4\x88\xe9\xbd\x4b\x64\xfd\xb8\x32\x56\x4c\xc1\xdd\x40\x48\xc1\x23\x23\xcb\x47\x40\xe7\x44\x32\x56\xd6\x66\xe1\xce\xc5\xa9\xb3\x99\x46\x38\xae\x7c\x33\x7f\x8a\xe3\x88\xfa\xfd\x01\xf5\x7b\x19\x0b\xf9\x49\xd1\xb2\x42\xa6\x3d\x67\x84\x3b\xac\x33\xf9\x8e\xb7\xa4\xed\xd4\x76\x4f\xd2\x51\x81\x89\x8f\x6a\xcd\xc9\xca\x99\x80\x4f\x53\x3d\xac\x1c\x75\xfe\xf8\xd9\x3f\x3b\x46\xb9\x7c\xdd\x9a\x31\xf3\x3e\x0f\x11\x17\xaf\x5f\x00\xed\xc5\xd9\x67\x06\xdf\xe5\xc2\x8f\x1d\x3f\x89\x8e\xf6\xbf\xae\x9f\x32\x28\xc6\x3c\x26\xd2\x0d\xf2\x0b\x2c\x9f\x05\xfe\xb1\xb0\x37\x51\x26\x54\x94\x22\x90\x16\x89\x8b\xc1\xa9\x02\xe5\xfe\x72\xf0\x1d\xd7\x3a\x3d\xf9\x5f\x5e\x94\x3e\xba\x1a\xe3\xff\xb8\x60\x83\xca\xff\xe5\xdf\xb4\x0b\xde\x6e\xb4\xb9\x30\x45\xd6\xc5\xcc\xe1\xb3\x30\x07\x03\xc7\xec\x1e\x0f\xf9\xf9\xcc\x45\x1e\x55\x13\xdb\xc7\x37\xf6\x17\xa2\x98\xce\x3f\xe1\x70\x09\xa6\xc8\xef\x05\x8b\x49\xfb\xe3\xd7\xd0\xeb\xe3\x53\xae\x7b\x31\x7e\xfd\xe4\x03\x80\xfc\xe1\xe0\x4f\x94\x2a\x9a\xd8\x6d\x70\xdc\x11\x75\xda\x67\x3f\xd7\x34\xd8\x29\xfa\xb7\x97\x1f\x3a\xaf\x5e\x9d\x7d\xbb\xe4\xc7\x26\xd1\xa0\x3a\xa9\xe0\xf7\x3f\x16\x43\x54\xf4\x77\x07\x1c\xb6\xf9\x4f\x00\x00\x00\xff\xff\x01\x20\xcb\x98\x39\x0e\x00\x00") - -func examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYamlBytes() ([]byte, error) { - return bindataRead( - _examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml", - ) -} - -func examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYaml() (*asset, error) { - bytes, err := examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml", size: 3641, mode: os.FileMode(420), modTime: time.Unix(1, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5c\x6f\x6f\xe3\xb8\xd1\x7f\xef\x4f\x31\xc8\x3d\x40\x9e\x16\xb1\xdd\xbd\x5e\x8b\xd6\x2d\x5a\xe4\x76\xf7\x70\xc1\x65\xb3\xc1\x26\xbb\x6f\x8a\xe2\x8e\x96\xc6\x16\xcf\x12\xa9\x92\x94\x13\xb7\xe8\x77\x2f\x38\x14\x65\xc9\x16\x29\x25\xbb\x77\xb7\x38\x58\x6f\x12\x4b\x14\x39\xff\xf8\xe3\xcc\x70\xc4\xc9\x74\x3a\x9d\xb0\x92\x7f\x40\xa5\xb9\x14\x0b\x60\x25\xc7\x47\x83\xc2\xfe\xd2\xb3\xcd\x9f\xf4\x8c\xcb\xf9\xf6\xc5\x12\x0d\x7b\x31\xd9\x70\x91\x2e\xe0\x65\xa5\x8d\x2c\xde\xa1\x96\x95\x4a\xf0\x15\xae\xb8\xe0\x86\x4b\x31\x29\xd0\xb0\x94\x19\xb6\x98\x00\x30\x21\xa4\x61\xf6\xb6\xb6\x3f\x01\x12\x29\x8c\x92\x79\x8e\x6a\xba\x46\x31\xdb\x54\x4b\x5c\x56\x3c\x4f\x51\xd1\x08\x7e\xfc\xed\xef\x66\x5f\xce\xbe\x9a\x00\x24\x0a\xe9\xf5\x7b\x5e\xa0\x36\xac\x28\x17\x20\xaa\x3c\x9f\x00\x08\x56\xe0\x02\x34\xaa\x2d\x4f\xb0\x90\x82\x1b\xa9\xf4\xac\xfe\x87\x8b\xf5\x2c\x91\x0a\xa5\x9e\x25\xb2\x98\xe8\x12\x13\x3b\xfe\x5a\xc9\xaa\x5c\x40\x7f\x23\xd7\x65\x4d\xa7\xe3\xf1\xce\xf5\xfe\xc6\xb5\xa7\x07\x39\xd7\xe6\xbb\x9e\x87\xd7\x5c\x1b\x6a\x50\xe6\x95\x62\xf9\x11\x65\xf4\x4c\x73\xb1\xae\x72\xa6\x0e\x9f\x4e\x00\x4a\x85\xf6\x1e\xbe\x17\x1b\x21\x1f\xc4\x37\x1c\xf3\x54\x2f\x60\xc5\x72\x8d\x13\x00\x9d\xc8\x12\x17\x70\x63\x29\x2c\x59\x82\xe9\x04\x60\xcb\x72\x9e\x92\x74\x1c\xcd\xb2\x44\x71\x79\x7b\xf5\xe1\xf7\x77\x49\x86\x05\x73\x37\x01\x52\xd4\x89\xe2\x25\xb5\x3b\x20\x1a\x52\xab\x36\xd4\x2d\x89\xc0\x4a\x2a\x60\xa0\xd1\x80\x5c\x79\x32\xf5\xac\xee\xab\x54\xb2\x44\x65\xb8\x17\x93\xbd\x5a\x76\xd3\xdc\x3b\x18\xf5\xdc\x92\xe5\xda\x34\x43\x9a\x0c\xa1\xd6\x37\xa6\xa0\x89\x64\x3b\xa4\xc9\xb8\x06\x85\x24\x0f\xe1\x6c\xa7\xd5\x2d\xd8\x26\x4c\x80\x5c\xfe\x88\x89\x99\x11\x3f\xa8\x34\xe8\x4c\x56\x79\x6a\xcd\x6b\x8b\xca\x80\xc2\x44\xae\x05\xff\x77\xd3\xb3\x06\x23\x69\xc8\x9c\x19\xac\x35\xe5\x2f\x2e\x0c\x2a\xc1\x72\x2b\xd0\x0a\x2f\x80\x89\x14\x0a\xb6\x03\x85\x76\x0c\xa8\x44\xab\x37\x6a\xa2\x67\xf0\x46\x2a\x04\x2e\x56\x72\x01\x99\x31\xa5\x5e\xcc\xe7\x6b\x6e\xfc\x4c\x49\x64\x51\x54\x82\x9b\xdd\x9c\xec\x9d\x2f\x2b\x6b\x02\xf3\x14\xb7\x98\xcf\x35\x5f\x4f\x99\x4a\x32\x6e\x30\x31\x95\xc2\x39\x2b\xf9\x94\x08\x17\x34\x51\x66\x45\xfa\x85\xaa\xa7\x95\x3e\x6f\x51\x6a\x76\xd6\x04\xb4\xb1\x6a\x6a\x6e\x93\xa1\x06\xe5\x6e\x2d\x15\xb8\xb6\x0a\xa5\xd7\x1c\xfd\x7b\xf1\xda\x5b\x56\x2a\xef\x5e\xdf\xdd\x83\x1f\x94\x54\xd0\x95\x39\x49\x7b\xff\x9a\xde\x0b\xde\x0a\x8a\x8b\x15\x2a\xa7\xb8\x95\x92\x05\xf5\x88\x22\x2d\x25\x17\x86\x7e\x24\x39\x47\xd1\x15\xba\xae\x96\x05\x37\x56\xd3\xff\xaa\x50\x1b\xab\x9f\x19\xbc\x24\xbc\x80\x25\x42\x55\xa6\xcc\x60\x3a\x83\x2b\x01\x2f\x59\x81\xf9\x4b\xa6\xf1\x27\x17\xbb\x95\xb0\x9e\x5a\x91\x0e\x0b\xbe\x0d\x73\xdd\x86\x4e\x5a\xcd\x6d\x0f\x3e\xbd\x1a\xba\x2b\x31\xe1\x2b\x9e\x90\x9d\x5b\xdb\x4e\x51\x73\x85\xa9\x9f\xa8\xa0\x31\xc7\x84\x1e\xda\x89\x69\x98\x5a\xa3\x81\x94\xeb\x44\x6e\x51\xed\x3a\x22\x5d\xee\xe0\x56\xc9\x02\x4d\x86\x55\x33\x63\x43\xb3\xd6\x5e\x5e\x47\x07\xb7\x0f\x48\xbc\x24\xcc\xb3\xb4\x35\xed\x81\xe5\xb9\x7c\xc0\x14\x98\x86\x92\x29\xd3\xcc\xdb\x2e\xbc\xcc\x0e\xba\xe5\x06\x8b\xa3\xb1\x0e\x46\x7b\xed\xed\xc6\xe3\x04\x03\x9d\x28\x56\x22\x5b\xe6\x2d\xab\x22\x60\x12\xeb\x16\xc3\x47\xdd\x92\x8a\x14\x4f\xf4\x21\x19\x61\x81\xd4\x72\x64\x9a\x27\x97\x95\xc9\xfa\x1e\x1e\xce\xb0\xaf\x7d\x63\x27\x13\x8b\x4d\x7b\xd3\x97\xc0\x2a\x93\x59\x03\x4b\x98\x41\xb0\x2a\xeb\xed\xb2\x1e\xb3\xdd\xda\x6a\xbc\xc7\xda\xcb\xbd\x82\xb9\x9c\xa7\x32\xd1\x73\xcb\x0a\xb3\x33\xd9\x5a\xfd\x8a\xaf\x2b\x45\x6f\xcf\xbf\x68\xd4\x75\xde\x3b\x68\x5c\x08\xd4\x82\x69\xfd\x20\x55\x1a\x7a\x7e\x20\x8b\xfb\xcc\x9a\x6b\xa2\xd0\x00\x17\x34\xef\xeb\xe5\xc3\x2f\x2f\x6e\x81\xb5\xcb\x17\x98\x8c\x99\x60\xaf\xce\x4d\x60\x5c\xb8\x55\xc2\x93\xe1\x96\xa6\x8e\x88\x8e\x55\x3b\x9e\x3b\x7b\x6d\x70\x17\x7b\xdc\xc3\xe0\x06\x77\xce\xda\x1b\x5e\x8d\xac\x27\x29\x81\xdf\x0c\xe0\x4d\xa5\x63\xbc\xd9\x6b\x89\xc0\xdc\xfa\xed\x7b\xd9\xe0\x2e\xcc\x0c\x84\x40\xe8\xf8\x22\xb7\x68\x3c\x4b\xe7\xd6\xa3\xf0\x0c\x29\x5c\xa1\x42\x61\x7a\x71\xd6\xba\x6a\x4a\xa0\xc1\xbd\xe5\x25\x52\x24\x58\x1a\x3d\xb7\x86\xbd\xe5\xf8\x30\x7f\x90\x6a\xc3\xc5\x7a\xfa\xc0\x4d\x36\x75\x38\xa8\xe7\xa4\xf5\xf9\x17\xf4\x67\x40\x2e\xf7\x6f\x5f\xbd\x5d\xc0\x65\x9a\x82\x34\x19\x2a\xa8\x34\xae\xaa\x1c\x56\xe4\x0d\xcd\x5a\xae\xc6\x05\x2d\x7c\x17\x50\xf1\xf4\xef\xfd\xe6\xfd\x44\xb9\x49\x12\x08\xcb\x9f\x20\x3b\x87\xdd\x3b\x78\xc8\x90\x88\xb5\x22\xbc\x73\xda\x94\x0a\xec\xe2\x66\x8d\xa5\x18\x65\x0d\x0e\xed\xd2\x11\x9c\x2c\xa5\xcc\x91\x89\x60\x4b\xbb\xa0\xda\x15\x24\xcc\xc8\xd4\xd2\x15\x7c\xda\xbb\x86\x75\xaf\x4a\x5b\x7f\x29\x66\x67\x3f\x0b\x2e\x78\x32\x4e\xb8\x70\xc2\x85\x13\x2e\xfc\xe2\xb8\x30\xd0\x60\x89\x4c\xa1\xba\x97\x1b\x14\xdf\xf0\x3c\x60\x8b\x1d\x39\xda\x66\x76\x16\x29\x64\x69\xfd\x3a\x18\xfb\x3e\x4d\x78\xf2\x0a\x29\x7e\x21\x9f\xb8\xc7\xcb\x83\x61\x2d\xb7\x88\x72\x1a\x1a\x41\xd6\x5d\x33\xbd\x0b\x59\x39\x2f\x2f\x4e\x61\x40\xa4\x9e\xee\x36\x3e\x0a\xc4\x94\x42\xd5\x25\x36\x58\x69\x27\xe2\x1e\x20\x19\x61\x5f\xa0\xcb\x43\x5c\xb5\x91\x2c\x4b\x12\xd4\x9a\x5b\xef\x79\xb9\xa3\x1e\xf7\x3e\x33\xbc\x25\xdf\xf1\xd8\x53\x77\xd7\x30\x56\x46\x71\xf2\xb9\x18\x09\xcb\x10\x7f\xf6\x7a\x0a\x3e\x8e\x98\xe3\x4f\x58\xc7\x3e\x23\x4c\xfc\xc4\x78\x38\x42\x4e\xc3\x38\xf8\x4c\x0c\x8c\x6b\x7b\x08\xff\x86\xb1\x2f\x8e\x7b\x61\xcc\x1b\x80\xb3\x4c\x0a\xa9\xae\xd9\x12\xf3\xc0\xe4\xe8\x88\xe3\xdb\x7d\x6b\x48\x32\x29\x75\x9d\x00\x73\x11\xea\xb9\x86\xdc\x3d\x93\x02\x12\x99\xe7\x9c\xf2\xae\x01\xa6\xad\xbd\xf8\x44\x80\x7b\x2d\x06\x7d\x61\xd1\x10\x07\x4d\x5e\x75\x34\x17\xfb\x37\x7c\x32\x57\x37\x5a\x6e\x21\x8b\x42\x5d\x5a\x8b\x0e\x81\x5f\x86\x60\xf6\x3d\xd5\x79\x25\x8b\x79\x2e\xda\x4f\x21\x65\x86\x3d\x8f\x31\xca\xe7\x6d\x43\xa6\xda\xe1\xe8\xaa\x6e\x0a\xcc\xc0\x43\xc6\x93\xcc\xe7\x0c\x7c\x42\x71\x89\x9e\xa0\xe7\x2c\x2f\xae\xb3\x77\x48\x6a\xe2\x62\x3d\x46\xc8\x6f\xda\xef\xbc\xa4\x88\x9e\x56\x04\x56\x96\xf9\x8e\x00\x93\x15\x65\x8e\x1a\x96\xb8\x72\xc8\xb3\x46\x1d\xf6\x79\x03\x39\x97\x9e\x81\xcf\x3b\x63\xba\x74\x86\x86\x74\x27\x58\xc1\x13\x50\xf8\xa0\x38\xe5\x0b\x1d\x00\x06\x67\x24\xf5\x01\x1a\xcd\x05\x2c\xd1\xb6\xb7\x84\x73\x4c\xa3\xa4\xc3\x55\x93\xf0\x09\x76\xfc\xc3\x5f\x9d\x38\xbf\x57\x8e\xce\xef\x5d\xba\x43\xff\xed\x87\xa9\xae\x53\x64\x72\xd5\x36\xc1\x4e\x3a\x24\xbc\x48\x8c\xcb\xb2\xec\x6f\xcd\x5d\x0a\xf9\x20\xdb\x72\x90\x7b\xe9\x27\x35\x84\xc0\x63\x82\x12\x96\x98\x83\x14\x7b\x54\x9b\x97\x4e\x22\x46\x42\x89\x6a\x25\x55\x01\x4b\xa6\x31\xb5\x08\xa3\x70\x8d\x8f\x50\x30\x93\x64\x5c\xac\xe3\xd1\xc5\x2b\x5c\xb1\x2a\x37\xc0\x35\x9c\x2b\x2c\x73\x96\x60\xcc\xad\x1e\xe5\x54\x17\x32\xad\xf2\x2a\x1a\x7f\x75\x67\x84\x6b\x4f\x19\x7c\xb6\x69\x56\xe0\x8c\xe9\xac\x71\x27\x5c\xe2\x9a\x84\x1d\xe5\xa7\xce\xdf\x47\xda\x58\x59\x31\xb3\xb0\x28\xf2\xc7\xaf\x06\x59\xb5\x58\xb3\x0e\x66\xf5\xc0\xc9\x7a\x34\xa7\xef\x90\xb6\x87\x00\x1f\x2d\x20\xd2\x76\x09\x5b\xdb\x78\xd7\xa3\x13\x65\xd6\x1f\x8d\x62\x89\x19\x08\x0a\x5c\xa2\x9f\x6b\xa7\x67\x4c\x67\x1d\x55\xfe\xff\xec\xb7\xbf\xf9\x68\x3d\xd6\xf6\x50\xa0\x08\xb8\xcd\xbd\x1c\x36\xef\xd4\x24\x76\x19\x64\xb5\x75\xd6\x7d\x47\x59\xe4\xda\xdb\x36\xa6\xc0\xbd\x5b\x76\x24\x41\x27\x00\x3d\xb3\xd2\xc5\xc7\x68\x8f\x09\x2b\x4d\xa5\xd0\xed\x13\x6a\x60\x0a\x81\x6d\x19\xcf\xd9\x32\xc7\xae\x00\xff\xef\xc5\x47\x8b\x4f\x63\xc9\xc8\xf9\x1e\x2d\xbc\x3b\xff\x06\x90\x70\xec\xea\x64\x1e\x10\xad\xcf\x20\x12\x66\x50\x30\x83\x69\x3d\x17\xa2\x7c\x3a\x8c\xf6\x7b\x59\x69\x8b\xaf\xbf\x9c\xc7\xe6\xc6\x38\xbe\x68\xfc\x98\x6b\xd4\xc3\xda\xfd\xc1\x24\xd6\x3e\x2e\x70\x44\xba\x7d\x25\x7c\xe4\xda\xc4\xc3\x75\xf0\x2e\x91\xed\x91\x2b\x72\x51\xc8\xb1\xd0\x5d\x21\x55\xda\x6f\x7d\x79\xe0\x1e\x98\x4f\x8d\xb6\xea\xed\x41\x9a\x54\x8d\xf1\x76\x3b\xea\xb1\xc2\x68\xdf\xb4\xb3\x43\xc6\x4b\x7a\xbd\x80\x0d\x62\xe9\xf6\x21\x53\x25\xcb\x1a\xfa\xa3\xa8\x15\x5d\xe6\xdd\x35\x32\xe1\xe1\x9a\x31\xa5\x58\x24\x17\x40\xde\x27\xa9\x78\xb4\x86\xa9\xb5\xc5\xf0\x3d\x92\x29\xd4\x55\x6e\xf6\xdb\x92\x5c\x83\x75\x32\x0c\xc6\xc5\xc5\x05\xc1\x04\xc9\xaa\x96\x0d\x39\x10\x04\x76\x22\xb5\x4a\xda\x91\x4c\xbb\x6d\xa2\xf2\x03\x87\x0e\x71\x04\xf8\xb8\x99\x31\x32\x81\x12\x92\xbc\x35\xbf\x90\x8a\x59\x9a\x72\x17\x9e\xdd\x0e\x7a\x12\x03\x96\x32\x9a\x91\xb0\x85\x74\xd4\xfe\xb6\x8e\x1b\xe1\xdb\xfb\xfb\x5b\x78\xff\xee\xda\x31\x82\x06\x55\xbf\xab\x37\x20\xa6\x92\x8d\xda\x97\xa3\xd1\x6c\x5b\x72\x3b\xc9\x83\x27\x93\x08\x6e\x09\x8e\xe0\xbd\x94\x6a\x4c\x7e\xa8\x9d\x25\xf0\x09\x19\xfb\xaa\xdb\x21\x6d\x36\x07\x29\x81\x40\xdb\xde\x01\x31\xbf\xa9\x4c\xc5\xf2\x7c\x07\xf8\x98\xe4\x95\xe6\x5b\x6c\x87\x7e\xb7\x52\x99\xe7\x71\xa1\xe4\xe3\xee\xbd\x1a\x13\x1d\xdd\x52\xd3\x77\xd7\x80\x6b\x72\x8d\x9d\x67\xfc\xb8\xa3\x42\x15\xb5\xf8\xf2\xc5\x9f\xff\x00\xaf\xb8\xb2\x61\x5e\x2d\xe3\x60\xb8\x27\xdd\xb8\x60\x32\x25\xab\x75\xd6\x95\xc5\xb3\xf8\x50\x4f\x8a\xaa\xce\xc7\x07\x54\x3e\x6d\x17\xd4\xcb\x4f\x11\x2f\x74\x03\x85\x7e\xdf\xe2\x14\xca\x9d\x42\xb9\x53\x28\xd7\x5c\xa7\x50\xee\x14\xca\x85\xaf\x53\x28\x77\x0a\xe5\x42\x5c\x9d\x42\xb9\x56\x9b\x53\x28\xd7\x2b\xb5\x9f\x32\x94\xa3\x92\xe4\x31\x3b\xe0\x14\xc5\xb8\xd6\x56\xdc\x95\xc6\xce\xc6\xf2\xb3\xfc\x66\xe7\xa8\xdf\xf3\x02\x65\x35\x26\x9c\xa9\x5b\x02\x5b\x19\x54\x2d\x8d\xd7\x41\x95\x73\xe3\x9f\xb7\x3d\xb2\x8f\x64\x02\x61\xad\xd8\xbd\x5d\x85\xf6\xed\x86\x17\xed\xe9\xb0\x2a\x7b\x02\x37\x05\xa2\x2a\x96\xa8\xbc\x3f\x52\xca\x34\x1c\xbe\x05\xc3\x9d\x59\x30\x7c\x2b\x83\x81\xdb\xe3\x74\xbf\x6f\x3c\xe5\xc2\x4c\xa5\x9a\x3a\xda\x17\x60\x54\xd5\xb7\x0e\x98\x5c\x3b\x1f\x7f\x8c\x22\xaf\xef\xba\x7e\xb4\x37\xa9\x87\x0c\x45\xab\x9c\xa2\x55\xbc\xdd\xdb\xe9\xb0\x87\x9b\xb0\xb1\xbb\xc4\xa6\x4a\x8c\x2f\xea\xf2\x83\xbf\xbc\x84\x04\x95\x69\x1b\x3c\xed\x16\xc6\xca\x3c\xc6\xd1\x05\xae\x82\x6c\xc5\xd7\x6f\x58\xf9\x84\x82\x9e\x97\xfe\x9d\x36\xa9\x29\x33\xec\x80\xc6\x68\x8f\x30\xcc\xc1\x78\x2e\x60\x4c\x8d\xda\x11\x1f\xbe\x06\xa3\xa9\xba\x88\x93\x02\xe3\x57\x1a\x18\x55\x61\x76\x44\xd0\x67\x54\x51\xe1\xaf\xa7\x56\x56\x8c\xe8\x72\xb8\x16\x0d\x9e\x26\xe9\x71\x35\x69\x30\xa6\x26\x63\x6f\xda\xae\x2c\x63\x04\x3b\xad\xc2\x8d\x51\xe5\x69\x30\xba\x44\x0d\x46\x95\xa9\xc1\x60\xa9\x1a\x8c\x2b\x63\x05\xf2\x05\xc3\x55\x5f\xfe\xea\xab\xfe\x8a\x03\xc1\xe7\x33\xd5\x3f\xbe\x24\x15\x9e\x57\x96\x0a\x27\xf0\xf8\xd5\x83\xc7\x51\x41\xd7\x08\x7e\x7e\x25\xc8\x31\xa2\x51\xc2\xc2\x75\xae\x70\x94\x6a\xaf\xb7\x2a\xda\x0e\x50\x5d\x00\xda\x4d\x83\x5a\xd4\x89\x24\xa9\xe0\xc9\x48\x34\xc2\x74\x2c\x35\xa3\x3d\x3a\xd5\xe3\xd2\xb9\xef\xff\x1c\x57\x2b\x9e\x8f\x71\x98\x4e\xee\xde\xc1\x75\x72\xf7\x4e\x88\x3d\xd4\xe9\xc9\xdd\x3b\xb9\x7b\x27\x77\xef\x04\x1e\xad\xeb\xe4\xee\xfd\x5c\xee\x1e\x2a\xf3\x4c\x87\xef\xc8\x3d\x3a\xf2\xfc\xe2\x1e\x8e\xf3\x09\x3f\xa9\xcb\xc7\x85\xc6\xa4\x52\x78\xb7\xe1\xe5\x07\x54\x7c\x35\xf6\x3b\x9f\x57\x5c\xd3\x97\xfa\xf5\x07\x0a\x96\x27\x77\xbe\x01\xb6\xce\x2b\x19\x22\x2d\xae\xff\x0d\xee\x3e\x4e\xd0\x16\x29\x3f\x13\x39\x6f\x70\x17\xfb\xf0\xec\x88\x9b\xe3\xf5\xa8\x8f\xaf\x9f\xcd\xbd\x3e\x7d\x27\xfb\x79\xad\x4a\xa7\xef\x64\x07\x39\xf9\xc5\xbf\x93\x75\x9f\x69\xa2\xba\x19\xff\xe5\xe1\x7b\xed\x8a\xae\xb6\x84\xc4\xae\x64\x46\x6a\xd3\x7c\xfc\xfe\x69\xd0\x28\x4a\x79\xe4\x61\x68\xb3\xf3\x47\xb9\xec\xdd\x57\x3e\xc2\x84\xdc\xef\x27\x5b\x9f\x9a\x3e\xa7\x35\x8a\xe3\x16\x89\xaf\x1f\xe5\x12\x1c\xa3\x16\x1d\x7a\x87\xee\xe1\xa9\xf9\x60\xf6\x8e\xa0\xe5\xb8\x32\xe3\x00\x55\x5d\xa3\x16\x16\xb9\x8d\xce\xa6\x1b\xf7\xb9\xde\xeb\xe6\x00\x9c\x7a\x6e\x1e\x89\x89\x29\x6c\x4e\xe7\xc1\xb4\x97\xe6\x18\xb2\x32\xd1\x8b\xa7\x1d\x62\xbf\x76\x06\x5c\xdf\x5c\xda\x35\xc0\xcf\x20\x96\xe7\x6d\x92\x2d\x31\x8e\x9d\xc0\xcc\xe0\xc2\x7d\xc3\xc7\xb4\x3b\xac\xc6\x9d\xf4\xa3\xd0\x0a\x34\xf1\x87\x43\x1d\x31\x00\x83\x73\x89\x6a\x2a\x6e\xf6\xa7\xa9\x45\xb8\xb9\xae\xcf\x16\xda\x7f\xe1\x4c\xff\xf5\x8d\x19\x29\x8c\x18\xda\x68\x0e\x6e\xc7\x07\xcd\xba\x94\xe9\xfd\xbe\x34\x22\x7e\x42\xd2\x6d\xb7\x2d\x18\xc5\x84\xa6\xea\xde\xfd\x67\x9d\xd6\x7c\xbe\x6b\x96\x00\xfb\xca\x11\x9d\x52\xd4\x6e\x8a\x9b\xca\x23\x4f\x4f\x8a\xb0\x1e\x62\xdb\xd5\x6e\x5e\xf3\x82\x1f\xb9\x1d\xdd\x69\xb1\x6f\xd7\x1c\xc7\x54\xa2\x9a\xd6\x5b\xff\x39\x3d\x90\xa2\xb5\x61\x1e\xfa\x56\xd2\x57\x8b\x9a\x8c\x19\x78\xe0\x79\x4e\x2b\x78\x62\x57\x3f\x4c\x0f\x19\x8d\x95\xed\x85\x77\xfd\xf5\x33\x27\xfa\xd1\x9c\x7e\xca\x7c\x25\x43\x7f\xdd\x94\x06\x0d\x9b\xfb\xe1\x0b\xee\x70\x36\x7f\xc0\x96\x2f\xb8\xad\x89\xac\x97\xa2\x82\x4e\x5c\xeb\xb5\xfb\x7b\xf2\x3a\xf6\xad\x68\xca\x5f\xde\xbc\x3a\x16\x2a\xc4\x27\xd0\xe1\x89\x5f\x41\x42\xea\xd3\xe4\x1a\x39\x5a\x85\xfa\x53\x59\x02\x4b\x8f\xab\xfb\xba\x00\x66\xd7\x4d\x57\x0b\xc5\x04\xc8\xfa\xe8\x01\xd7\x85\x42\x2a\xc5\x25\xf3\xb7\xab\xbe\x6d\x14\x2b\xf0\xfc\x94\x47\x13\xd8\xf1\xb8\xae\x4f\x07\xb4\x7c\x53\xd2\xd4\x52\xe5\xbc\xd4\x9a\x55\x57\xfc\x1c\xf3\xc0\xc2\xb5\xfc\x23\x3f\xb1\xc7\x81\x22\xc2\x0e\xd9\x8d\x00\xf7\xc7\xf2\x39\x11\x9f\x6b\x27\x4e\x6b\x5f\x19\x2f\x09\xd9\xa3\x39\x31\xb2\x3d\x5f\x42\xf8\x81\xbc\x6a\xdf\xb9\xb3\xa8\x2b\x71\x01\x37\xd2\xd8\x3f\xaf\x1f\xb9\xb6\x03\x89\x98\xaf\xf5\x4a\xa2\xbe\x91\x86\xda\x7e\x94\x48\x1c\x51\x23\x05\x52\xd7\x17\x5a\x03\x15\x0e\xf5\x08\x92\x5a\x07\x1f\xea\x19\x5c\x39\x57\xdd\xf3\x17\x61\x82\x6b\xb8\x12\xd6\x13\xad\x39\xa7\x03\x2b\xdd\x10\xae\x73\x9f\xdb\x10\x52\x4c\xb1\x28\xcd\xce\xf7\x1e\x75\x93\x6b\xa5\x71\xed\x45\x29\x55\x47\x5e\x81\x81\x22\x7d\x2e\x11\xea\xe1\xef\x33\xee\xdf\x71\x87\x68\xba\xda\xd2\xb4\x22\x11\xd0\x21\x90\xcc\xe0\x9a\x27\x50\xa0\x5a\xc7\xe8\x2c\x2d\x4e\x85\x55\x37\x58\xa3\x38\x2a\x6a\x18\xaa\x4f\x7c\xee\xd1\x0d\xd3\xb8\x7a\x07\x3c\xf4\x18\x55\x04\xdf\xe1\x7a\xd8\xf1\xdf\x61\x0d\xc8\xe7\x78\xcd\xa8\x5d\x0b\x42\xdf\x82\x95\xd6\xb2\xff\x63\xe1\x94\x0c\xe5\xbf\x50\x32\xae\xf4\x0c\x2e\xe9\x88\xd9\xbc\x5f\xb3\xed\xf6\x75\xe6\xa3\xdd\xb5\xed\x95\x6b\xb0\x32\xdf\xb2\x1c\xeb\xf3\x0b\x05\x60\x4e\xc0\xdf\xdb\xa5\x5c\x1d\xad\x68\x17\xf0\x90\x49\x8d\x75\x32\x02\x73\x3a\x7f\xf4\x6c\x83\xbb\xb3\x8b\xce\xcc\x03\xde\x0f\xa5\x67\x57\xe2\xcc\x2d\x12\x47\xf3\xa0\x39\xfd\x4b\x8a\x7c\x07\x67\xf4\xec\x6c\x76\xb4\x08\xf6\x76\x1b\x5d\x18\x07\x83\x9b\x9e\x47\x66\xac\x77\xf8\x54\xd7\xb0\x3e\x43\xf3\x97\x72\x0f\xfb\x26\xdd\x74\x7f\xf4\x67\xe7\xae\x5f\x1b\x27\x51\x79\x1d\xf6\x38\xa5\x23\x51\x27\xbd\xed\xf7\x27\x40\xbf\xd8\xff\x22\xb6\xa6\xf5\x89\xcf\xf4\xa0\x8e\xa1\xd3\x56\x61\xa4\x36\x52\xb1\x35\xd6\x77\xb4\x61\xc6\x7d\x97\xe2\xbd\xcc\x9b\xc3\xc3\x9d\xcf\xce\xe8\x87\x3f\xaf\x99\x7e\x26\x52\xb8\x19\xac\x17\xf0\x8f\x7f\x4e\x5c\xaf\x98\x7e\xf0\x74\xd8\x9b\xff\x0b\x00\x00\xff\xff\xd1\x3c\x4c\x0a\x2d\x5b\x00\x00") - -func examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYamlBytes() ([]byte, error) { - return bindataRead( - _examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml", - ) -} - -func examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml() (*asset, error) { - bytes, err := examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml", size: 23341, mode: os.FileMode(420), modTime: time.Unix(1, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfb\x73\xdc\xb8\x95\x28\xfc\x7b\xfe\x0a\x94\x27\x55\xb2\xbf\xaf\xbb\x65\x4f\xb2\xa9\xac\x37\xb5\x5b\x8a\x24\x4f\x54\xb1\x65\x5d\x4b\xe3\xb9\xf9\x1e\x35\x83\x26\xd1\xdd\x58\x91\x00\x03\x80\x2d\xf5\xdc\xdc\xff\xfd\x16\x0e\x00\x3e\x9a\x04\x08\xb6\x5a\x63\x27\x43\x6e\xd5\x66\xdc\x22\x0f\x80\x83\x83\x83\xf3\x3e\xbf\x99\xcf\xe7\xbf\xc1\x05\xfd\x4c\x84\xa4\x9c\xbd\x45\xb8\xa0\xe4\x51\x11\xa6\xff\x25\x17\xf7\x7f\x94\x0b\xca\x4f\xb7\x6f\x96\x44\xe1\x37\xbf\xb9\xa7\x2c\x7d\x8b\xce\x4b\xa9\x78\xfe\x89\x48\x5e\x8a\x84\x5c\x90\x15\x65\x54\x51\xce\x7e\x93\x13\x85\x53\xac\xf0\xdb\xdf\x20\x84\x19\xe3\x0a\xeb\x9f\xa5\xfe\x27\x42\x09\x67\x4a\xf0\x2c\x23\x62\xbe\x26\x6c\x71\x5f\x2e\xc9\xb2\xa4\x59\x4a\x04\x8c\xe0\xc6\xdf\xbe\x5e\x7c\xbb\xf8\xfd\x6f\x10\x4a\x04\x81\xcf\xef\x68\x4e\xa4\xc2\x79\xf1\x16\xb1\x32\xcb\x7e\x83\x10\xc3\x39\x79\x8b\xd4\x06\x33\x2e\x45\x99\x11\x21\x17\x39\x67\x54\x71\x41\xd9\x7a\x91\x70\x41\xb8\x5c\x24\x3c\xff\x8d\x2c\x48\xa2\x07\x5f\x0b\x5e\x16\x6f\x51\xff\x4b\x06\x9e\x9d\xa4\x59\xe0\x1d\x80\xfe\xa4\x41\xc3\xaf\x19\x95\xea\xaf\xfb\x7f\x79\x4f\xa5\x82\xbf\x16\x59\x29\x70\xd6\x9e\x10\xfc\x41\x52\xb6\x2e\x33\x2c\x5a\x7f\xfa\x0d\x42\x85\x20\x92\x88\x2d\xf9\x9e\xdd\x33\xfe\xc0\xde\x51\x92\xa5\xf2\x2d\x5a\xe1\x4c\x92\xdf\x20\x24\x13\x5e\x90\xb7\xe8\x5a\xcf\xaa\xc0\x09\x49\x7f\x83\xd0\x16\x67\x34\x05\x74\x98\x79\xf2\x82\xb0\xb3\x9b\xab\xcf\xbf\xbb\x4d\x36\x24\xc7\xe6\x47\x84\x52\x22\x13\x41\x0b\x78\xaf\x39\x57\x94\xea\x4d\x22\x12\xe1\xbd\x5f\x8b\x8c\xef\x72\xc2\xd4\xc2\x02\x28\x04\x2f\x88\x50\xd4\xe1\x43\x3f\x0d\xea\xa8\x7e\xdb\x1b\xea\x44\xcf\xc5\xbc\x53\x0d\xa5\x36\x04\xd9\x5d\x25\x29\x92\x30\x4f\xc4\x57\x48\x6d\xa8\x44\x82\x00\x12\x98\xa1\x90\x06\x58\xa4\x5f\xc1\x0c\xf1\xe5\x7f\x93\x44\x2d\xd0\xad\x46\x94\x90\x48\x6e\x78\x99\xa5\x9a\x88\xb6\x44\x28\x24\x48\xc2\xd7\x8c\xfe\x5c\x41\x96\x48\x71\x18\x32\xc3\x8a\xd8\x8d\x71\x0f\x65\x8a\x08\x86\x33\x8d\xc5\x92\xcc\x10\x66\x29\xca\xf1\x0e\x09\xa2\xc7\x40\x25\x6b\x40\x83\x57\xe4\x02\x7d\xe0\x82\x20\xca\x56\xfc\x2d\xda\x28\x55\xc8\xb7\xa7\xa7\x6b\xaa\xdc\x79\x48\x78\x9e\x97\x8c\xaa\xdd\x29\x50\x35\x5d\x96\x8a\x0b\x79\x9a\x92\x2d\xc9\x4e\x25\x5d\xcf\xb1\x48\x36\x54\x91\x44\x95\x82\x9c\xe2\x82\xce\x61\xe2\x0c\x8e\xc3\x22\x4f\xbf\x11\xf6\xf0\xc8\x93\xc6\x4c\xd5\x4e\xef\xbb\x54\x9a\x42\xab\x9f\x81\x22\xbd\x78\xd7\x54\x89\xa8\xde\x57\xf3\x99\x99\x7f\x8d\x5e\xfd\x93\xc6\xca\xa7\xcb\xdb\x3b\xe4\x06\x85\x2d\x68\xe3\x1c\xb0\x5d\x7f\x26\x6b\xc4\x6b\x44\x51\xb6\x22\xc2\x6c\xdc\x4a\xf0\x1c\x20\x12\x96\x16\x9c\x32\x05\xff\x48\x32\x4a\x58\x1b\xe9\xb2\x5c\xe6\x54\xe9\x9d\xfe\x7b\x49\xa4\xd2\xfb\xb3\x40\xe7\xc0\x15\xd0\x92\xa0\xb2\x48\xb1\x22\xe9\x02\x5d\x31\x74\x8e\x73\x92\x9d\x63\x49\x9e\x1d\xed\x1a\xc3\x72\xae\x51\x3a\x8c\xf8\x26\x33\x6b\xbf\x68\xb0\x55\xfd\xec\xb8\x4c\xff\x0e\xdd\x16\x24\xa1\x2b\x9a\x00\xa1\x1b\xfa\x27\xfa\x15\x2a\x48\x8a\x96\x64\x83\xb7\x94\x0b\xf7\x7b\xf3\x70\x26\x59\x29\x15\x11\x8b\x16\x56\xfb\xf1\xb3\x29\x97\x9a\x95\x9d\x6a\x9e\x2a\x18\x51\x44\x36\x50\xb5\xcc\xf8\xf2\x34\xc7\x1a\xd6\xa1\x68\xd3\x2b\x9c\x63\x96\xce\xa5\xc2\xaa\x6c\xa1\xae\x8f\x61\x00\xd3\x58\xc1\xad\xb0\x6b\xff\xba\x87\x9c\xab\x15\x20\x8f\xae\x28\x49\x67\x80\x80\x82\xa7\x27\x12\x8e\x74\x5a\x66\x9a\x78\x13\xce\xa4\x12\x98\x6a\x9a\xdc\x03\xe5\x1b\x5a\x3f\x8c\xa7\xe4\xcc\x33\x85\xce\x34\x2e\xe0\x1f\x4b\x22\xe1\xb3\x6a\xea\xcd\x69\x68\xd6\x2d\xd1\x8a\x0b\x37\xcb\xfd\xc9\x0c\x4d\xc8\xfc\x9d\xac\x88\x10\x24\xbd\x28\x35\xa5\xdd\x56\xe0\xaf\xd6\x8c\x57\x3f\x5f\x3e\x92\xa4\x54\x7b\xdc\xd6\x3b\xf7\xbb\x0d\x71\xf3\x24\x02\x3d\xd0\x2c\xb3\xc3\x68\x7e\xe8\xfe\xa0\x27\x0c\x0c\x52\xaf\x4f\x7a\xc0\x22\x7d\x4b\x29\x24\xb1\xa2\x72\xb5\x83\x75\x56\x98\x20\x8f\x9a\x31\x80\x48\x50\xef\x18\x5a\xee\x2c\x4f\xd0\x17\xd8\xcc\x0b\x76\x59\x2a\x44\x15\x30\x92\x64\xc3\xb9\x24\x08\x1b\x44\xc3\x78\x5b\xca\x81\x65\x23\xce\x08\xe2\x02\xe5\x9a\xc2\xcd\x71\xf0\x42\x6c\x4c\x67\x01\x18\xa8\xc1\x51\x89\x72\x2e\x55\x8d\x6b\xfd\x8b\x5e\x8b\x06\xff\x40\xd5\x26\xb0\x7a\x82\xd6\x5a\xe6\x20\x52\x21\x59\xe6\x7a\x12\x0f\x84\xae\x37\x4a\xce\x10\x5d\x90\x05\x6c\x3f\xc1\xc9\xa6\x31\x5c\x4e\x88\xf2\x23\x14\x67\x99\x3b\xd9\x4d\x5a\x22\x7f\x2f\xa9\x20\xfa\xda\x95\xe8\x65\xc5\x94\x2d\xa3\x9c\xb9\xbf\x77\xa8\xc4\x3f\x4c\xcf\x36\xcd\x10\x51\xc9\xe2\xd5\x0c\x25\x3c\x2f\x4a\xa5\x71\xae\xd7\xb4\xdc\x21\xaa\x88\xc0\xf6\x62\x10\xbc\x5c\x87\x31\x42\x32\x3b\x51\x77\x73\xc3\x66\xc3\x15\x8a\xd3\x54\x43\x79\x61\x90\xf4\xc2\x5d\xc0\xb2\xcc\xbd\x10\xa9\x41\x06\xe0\x2f\xc7\x2a\xd9\x58\x39\x21\xe1\x42\x10\x59\x70\x06\x10\xe1\x2f\x97\xf5\x5a\xfe\x23\x48\x0c\x1a\xd8\x4b\xf9\x0a\x36\x17\x80\x6d\xe8\x7a\xe3\xf6\x10\x0b\x02\xbf\xb5\x69\xa2\xef\xf0\xc2\xf4\x14\xc9\x3d\x67\x17\xed\x1f\xbc\x33\x86\x48\x5e\xa8\x5d\x83\xd2\x1a\x7b\xac\x88\xc8\xab\x15\x62\x90\x5a\x7d\x8f\xb9\x4d\xa4\x99\x3f\xcd\x8b\x8c\x26\x54\x59\xca\x43\xaf\xd1\x4b\x20\x3d\xaa\x4e\x24\x1c\x9b\x39\x2f\x5e\x2d\xd0\x99\x13\x85\x7d\xcf\xf0\xa4\x18\xaf\x46\xb6\x43\xe8\x89\x4a\x1e\x00\x5a\x8d\xef\x7d\x67\x88\x03\x36\x27\x47\x58\x42\x42\x6f\xed\xe3\xdb\x50\x8d\x24\x19\x49\x94\xe6\xc3\x44\xe4\x33\x84\xa5\xe4\x09\xd5\x92\x44\xb5\xff\x41\x90\x68\x8f\xd4\x0c\x9a\xfd\x0b\x8a\x5f\x94\x7e\xf6\x09\x77\xe8\xfd\xce\x12\xb5\xa2\xa1\x4f\x5a\x7b\xa9\x4d\x86\x31\x08\x11\xe9\x33\xae\xbf\x3f\x91\x28\xc3\x4b\x92\x75\xee\xcd\xee\x33\x40\xf7\xde\xe9\x7a\xa7\x69\x45\x52\xfb\x97\x08\xc0\xf6\xf2\xd1\xf2\x09\xa6\x4c\x5a\x31\x7c\x86\x30\xba\x27\x3b\x23\xb1\x6b\xa5\xa0\xd0\xac\x0b\x2e\x61\xac\xa2\xa0\x0a\x62\x2e\x17\xcd\x03\xee\xc9\x0e\x00\x59\x11\x3f\xe2\xfb\xf8\x9d\x37\xcf\x3d\xe9\x15\x36\xfa\x9e\xce\x25\x0e\x7b\x05\x73\x04\x4c\x00\x27\x1d\x83\x3f\x04\x9a\x5a\x91\x51\x02\xa2\x76\xe4\x37\xbd\x92\x6f\xe8\x71\x5b\x70\xd0\x3a\x3f\x55\xfa\x85\xd9\xd8\x13\x69\x36\x48\x9f\x95\x0d\x2d\xa2\xd7\xa9\x38\x50\x17\x1c\x15\xa7\xb0\x7d\xd6\x1a\x72\x35\x3d\x09\x9c\xff\x8a\xf9\xa5\x92\xfd\xe7\x9a\xab\x2b\x36\x43\x97\x8f\x54\xea\x0b\xff\x82\x13\x79\xcd\x15\xfc\x73\x81\xbe\x53\x86\x06\xdf\x0f\xb0\x8a\xc6\x14\xc7\x22\xd6\xac\xe3\x20\xb4\x9e\x31\x84\x85\xc0\x3b\x8d\x8e\xa6\x1a\x28\x17\x5a\xc2\x1e\x66\x89\xf5\x53\x1d\x30\x2a\xb5\x62\xc6\x85\x43\x0b\x28\xf3\x00\xd3\x0c\x15\x0d\x31\x2f\x25\xe8\x7b\x8c\xb3\x39\xdc\x97\x6e\x4e\xad\xb1\x0c\xd6\xe3\xa7\x29\x5a\xfb\xd3\x9d\x9e\x1b\x36\x1a\xa2\x7f\x6a\xdf\x29\x3d\xdc\xfb\xd6\x20\xf1\x07\xb2\x9e\xcc\x06\x6f\x41\x08\xa3\x6c\x9d\x55\x62\xd5\x0c\x3d\x6c\x68\xb2\x01\xb9\x3d\x1a\xe8\x92\x18\x8b\x46\x21\x88\xbe\xf7\xb0\xd4\xac\x51\xff\xb2\x26\x42\x8b\xc3\xd4\x21\x81\xc6\x4f\x54\x90\x22\xc3\x09\x49\x51\x0a\x42\xa7\xb1\x27\x60\x45\xd6\x34\x41\x39\x11\x6b\x82\x0a\x7d\xb7\xc5\x52\x7f\xf4\x85\x62\x9e\xd1\x87\xc5\x7d\x12\x4b\x8b\x4e\xa4\x8e\x99\xd2\x5c\x73\xa6\xa8\xf7\x1c\x99\x44\xbc\xdc\x6b\x38\x08\xbf\x1c\xb3\x36\x10\x38\xac\xfd\xf0\x0b\xcb\x1a\xa0\x17\x4c\xb2\xc6\x24\x6b\x78\x9f\x49\xd6\x70\xcf\x24\x6b\x4c\xb2\xc6\x24\x6b\x4c\xb2\xc6\x3f\x91\xac\x11\x09\xd4\xd8\x53\x46\x98\x75\x7e\x30\x76\xae\x7d\x3b\x0e\x08\x36\xce\x79\xd5\x32\xd9\x0c\xac\x48\x8b\x09\xb7\xf6\x2e\xbb\x03\x13\x11\x65\x00\x44\x60\xb6\x26\xe8\xcd\xfc\xcd\xeb\xd7\x61\xca\x5a\x71\x91\x63\xf5\x56\x53\xf9\xef\xbe\x8d\xc0\x89\x3d\x0d\xde\x37\x87\xe9\x61\xde\xb0\x88\x05\x5e\x32\xb8\xf5\x5b\x6b\x87\x77\x68\x68\xb3\x7d\x96\xe7\x27\xf8\x27\x2c\x97\xab\x4c\xd4\x2d\xe3\x77\xc7\x95\xe0\x5d\x9c\xb5\x3a\x0b\xcd\xdc\x15\xca\x89\x42\x58\xb5\x4c\x9b\x34\x27\x95\x07\xc9\xb8\x41\x8c\xa3\xd1\x0b\xd1\xf9\x46\x52\xc4\x99\xb5\x5c\x6b\xda\x59\x44\xce\xd8\xef\xed\x68\x3a\x45\x50\x42\xb0\x24\x5a\x86\x58\x92\x6a\xd6\x3c\xd7\xb3\xa4\x4c\x39\x06\xa8\xa7\x4c\x1c\x56\xbd\x80\x5f\x92\xc5\x7a\x81\xd2\x12\xc0\x61\x66\x3d\xa8\xaf\xcc\xaa\xe5\x4e\x2a\x92\x83\x8f\x85\x0b\xf8\x1f\xbd\x7c\x25\x76\x48\xf9\x2d\xba\x64\x4b\x98\x2a\x71\x96\xed\x10\xd9\xd2\x44\x55\xf8\x03\x27\x2f\x55\xc6\x1f\xe6\x3b\x2d\x31\x02\xeb\xfe\x69\x0c\xf2\xe9\x3d\xf1\xcd\x90\xe2\xc2\xab\xa9\x28\x0d\x0f\xdc\x3f\xe1\x43\xaa\x5f\x03\xca\xf9\xf8\xc9\x6f\xf9\x47\x71\x17\xc9\xbe\x4e\x52\x66\x99\xc6\xb7\x71\x04\x74\xa7\xe7\x8c\xed\x83\x3c\xcb\x99\xe2\x8d\x37\xab\x45\x71\xc6\x7f\x64\x3c\x19\x67\xd7\x17\x1a\x23\x43\x4b\x46\xe8\x8e\x17\x3c\xe3\xeb\x5d\x13\xf7\x70\xfa\xc1\xc1\x60\x21\x63\x24\xcb\xa5\x95\x6c\x87\x05\xb7\xeb\xbd\xad\x9c\x6c\xe6\x93\x1e\xdb\xf7\x4c\x7a\x6c\xe7\x99\xf4\xd8\xc8\x29\x4e\x7a\x2c\x3c\x93\x1e\x3b\xe9\xb1\x83\xcf\xa4\xc7\xf6\xbc\x3c\xd9\xcc\x27\x59\x23\xf0\x4c\xb2\x46\xe7\x99\x64\x8d\x49\xd6\x98\x64\x8d\x49\xd6\x08\x3e\x93\xac\xd1\xf3\xf2\xd1\x6c\xe6\xc3\xe0\x86\xd0\x33\xef\x1a\xda\x82\x16\x60\xef\x94\x82\x7f\x2e\x78\x7a\x40\x48\x7d\xc1\xd3\x40\x44\xbd\x31\x6a\x26\x7c\x9e\xf1\x04\xab\x7e\x7e\x00\xe6\x54\x0d\xc6\x5a\xf2\x25\xce\x8d\xad\x76\x86\x7e\xe6\x8c\x98\x48\x67\x7d\xcc\xc0\xb2\xca\xd5\x86\x08\xfd\xfa\x4b\xf9\xaa\x37\x52\x75\x8a\xd2\xef\x7d\xa6\x28\xfd\x29\x4a\xdf\x3e\xcd\x28\xfd\x0d\x96\x86\x2e\xcd\x45\xe8\x0f\xda\x6f\x70\x07\xcd\x80\xfe\x23\x38\xdf\x2f\x14\xb3\xaf\x89\xd0\x12\x0b\xa4\x19\xd6\x1b\x6f\xd6\x95\x5a\x77\x24\x49\x6f\xda\xab\x09\x70\x6f\xa3\xc3\xc1\xa4\x71\x9a\x92\x14\x15\x44\xcc\x0d\xe9\x71\xb4\xa2\x2c\xed\x59\x8b\x5b\xbf\x17\x6c\x64\x1c\x7d\x7b\x92\x23\x5c\x17\x4d\xef\x4a\x8b\x41\xef\x47\xd5\x0f\xdc\x85\xd5\xfe\x3d\x67\x54\x3d\x68\x5e\xee\x72\x1b\xaf\xb2\x83\xde\xf6\xf7\x92\x88\x1d\xe2\x5b\x22\x6a\xcd\xa4\xca\xc1\x8c\x51\x42\xe0\xee\xa1\x12\x25\x58\x1a\x46\x3d\x2c\x6a\x8d\xd3\x4e\xc7\xfb\x41\x3a\x8b\xdd\x07\x61\xb4\x7c\x67\xb3\x00\x44\x44\x4a\x6f\xbd\xa6\x8d\x1e\xe7\x14\x16\xb1\x22\xbc\x71\x5d\x45\xbd\x3c\x4a\x38\xed\xdd\x6d\x8f\xc9\x23\x5e\x2d\x68\xb8\xf1\x06\xcc\x1e\xf1\x30\xf7\xcc\x23\x4f\x34\x7d\xa0\x03\xcc\x1f\x68\x9c\x09\x04\xed\xa3\x57\xcf\xd2\xde\xd3\x5d\x6b\xc8\x08\xa0\x0d\xfa\x1a\x6f\x11\x41\x87\xe9\x23\xe3\x2d\x23\x68\x7f\xf9\xd5\xf6\x89\x8e\x99\x64\xd4\xe2\x9b\x26\x15\xbf\xa9\x64\x14\xc8\x8e\x59\xa5\x6d\x2e\x01\xda\x6a\x59\x4c\x9e\x1b\xd9\xe3\xac\x25\x68\x1f\xd5\xd6\x56\x40\x41\x75\xde\xb3\x9d\x8c\x42\x4c\xdb\xce\xe2\xb5\x9f\x8c\x82\xe9\x33\x66\xb4\x6d\x28\xa3\x41\x76\xed\x2d\x1d\x3b\xca\x71\xa6\x69\xa7\x58\x1b\x22\x46\x81\x35\xc5\x1b\x8e\x69\x8c\x40\xe3\x0d\x12\xe8\x50\xba\x1c\x6b\x98\x40\x23\x8d\x13\x68\x84\x81\x02\x8d\x35\x52\xa0\xb1\x86\x0a\x34\x7a\xbd\x20\x42\xbc\x87\x10\x88\xb8\xe5\x6a\xf5\x42\x9f\x59\x9c\xdd\x8c\xbe\x8d\x46\xef\x60\x57\xda\x31\x53\x35\x82\x4e\x8e\x0b\xcd\x25\xfe\x97\xbe\x9a\x81\xf0\xff\x77\xec\x3d\x8a\xa9\x90\x5a\x14\xb6\xc6\xbf\x06\x04\x67\x73\x68\x0c\x16\x09\x54\xcf\x86\x4a\xa4\x69\x67\x8b\x33\x2d\x80\x98\xb0\x2d\xab\xaa\xe9\x99\xee\xcb\x6b\xb1\xe7\xfb\x61\xa3\xd5\x73\x7d\xf9\x1a\x35\x8f\x4a\xf4\xe2\x9e\xec\x5e\xcc\x3a\x7c\xe4\xc5\x15\x7b\x11\x0b\x15\x5b\x55\xa5\xc5\x33\x2a\xc9\x87\xb3\x6c\x87\x5e\xc0\xdf\x5e\xc4\x1e\xec\x3e\x71\x71\x8c\x20\x78\x80\x51\x2e\xea\x65\xe6\x2a\xeb\x8c\x75\x00\xd6\x1f\x56\xf6\x15\xa7\x18\xd7\x7f\x8a\xb1\x36\x3a\x09\xea\xb6\x2b\x07\xa1\x97\x55\xda\xf8\x5a\x63\x5e\xbd\xf2\xab\xd2\x8d\x25\xb5\x22\xd1\x40\xe4\xcf\x09\x66\x12\xbd\x70\xd6\xb3\x13\x59\xcf\xf1\xc5\xf1\x3c\x8e\xa3\xce\x70\x3c\x2f\x52\x36\x80\xed\xaf\x31\xe2\xea\x9e\x8e\x6f\xad\x85\xb6\x62\xd0\x92\xd4\xe6\xc5\x14\xbd\x74\x9a\xae\x5f\xf7\xae\x1f\x2e\x20\x8a\xb2\xf5\x39\x53\x74\x5e\xc1\xa8\xf5\x5f\xad\x11\xc6\xb2\x57\x17\xd6\xdc\xa6\x00\x67\xdc\xac\xec\x76\x35\x45\xc5\x9c\xe0\x87\x0d\x11\xad\x95\x52\x69\x2b\x31\x81\x07\x42\x94\x8c\xe9\x71\x39\xb3\x66\xbd\x28\x90\x9a\xcd\x98\x82\x42\xd6\x4c\x62\xc4\x7e\x58\x35\xc8\xfe\xf5\x2e\x45\x86\x3a\x22\x67\xc0\x84\x2a\x4f\x36\x66\x92\x33\x7b\x88\xf4\x2f\xce\x12\x07\x78\x21\x69\x2c\x66\x69\xb5\xc6\x05\xba\x84\x43\xd0\x9c\x1c\x95\xb0\x93\x38\xcb\xf8\x43\x0c\xf7\x89\xa6\xea\x38\xd9\x60\xde\x9c\xcc\x31\x5c\x06\xa3\xc3\xec\x1f\x8e\x1c\x66\xbf\x67\x7a\xfa\x27\x89\xb2\x8f\x34\xea\x4d\xa1\xf6\x53\xa8\x7d\x23\xd4\x1e\x3e\x32\x9c\x6f\x38\xe6\xde\x4f\x33\x10\x8b\x1f\x1b\x73\x8f\x7e\xd8\x10\x38\x51\x01\x03\x9b\xde\xa2\xbc\xcc\x14\x2d\x6a\x87\xb5\x34\x53\xcb\x8c\xfa\x68\x02\x95\xe4\x9e\x75\x36\x94\x11\x80\x93\xcd\xfe\x31\x81\x71\xc0\xa1\x2d\x81\x23\x5b\x37\x0b\xce\x32\x1b\x5b\xaf\xf5\x4a\xff\x1e\x11\xeb\xab\xa2\xc7\x31\xe1\x5f\x54\x85\x0c\xad\xd1\x04\x9c\x13\x2f\xf5\x65\x99\x69\x72\xd0\x57\x96\xe3\x6a\x21\x9f\x6b\xe7\xfe\x35\x56\x99\x2d\x71\x0e\x92\x35\xdd\x12\x56\x5f\xc2\x2f\xe5\xab\x57\x43\x61\x4d\x2a\x52\xf4\xe8\x0a\x16\x01\xa0\x7d\x22\xc7\x2c\xf2\xba\x0f\x80\xad\x04\x81\x88\x6b\xfe\x4f\x8d\xdb\xeb\x3f\x03\x30\x6b\xe7\x90\xf7\x82\x07\xf4\x54\x57\x7c\xb5\x81\x01\xa0\x74\x78\x35\x71\x76\xd0\x11\x6e\x84\x03\x5c\x08\x88\xfa\xd9\x89\x79\xc6\xb8\x0f\x7e\xb1\xf4\x89\x08\x97\xc1\x98\x30\xb7\x61\x77\x41\xac\xfe\x77\x68\xc8\x63\xd0\x01\x30\xc5\x3c\x06\x9f\x78\x63\xff\xbf\x5e\xe8\x63\xc0\xb8\xff\x95\xc6\x40\x1e\x6c\xd4\xff\x25\x43\x1f\x43\x86\xfc\x91\xde\x2e\x34\x64\xc4\x7f\x62\x00\xe0\x50\x10\x64\x34\x4c\x8f\xf1\xbe\xdf\x20\x1f\x0d\xb5\xcf\x70\xdf\x6b\x8c\x8f\x86\x38\x45\x10\x0e\xbe\xf7\xa5\x23\x08\x47\x1a\xe4\x0f\x35\xc6\x8f\xda\x9d\xb1\x46\x78\x6b\x5e\x8f\x98\x46\xa4\x01\xbe\x6b\x5a\x8f\x59\xe2\xa0\xf1\x7d\xdf\xac\x1e\x67\x74\x0a\x19\xde\x7b\x4d\xea\x11\x60\xfb\x8d\xee\x4f\x12\xa7\xa2\xa9\x33\xf2\xc5\x58\x13\xfa\x78\xf3\x79\x44\x2c\xc1\x08\xd3\xb9\x33\x8c\x0f\x40\x3c\x86\xd9\x3c\x8a\x23\x46\x9f\xb4\x38\x0e\x11\x6d\x26\x7f\x0e\x13\xf9\x48\xf3\x78\x8c\x5a\x8e\x7a\x55\xf3\x90\x69\xdc\x68\xc2\x03\x20\xe3\xcd\xe2\x4d\x6d\x78\x68\xf9\xb1\x26\xf1\xa6\x3e\x3c\xe4\x99\x8a\x32\x87\x77\x8d\xdd\xf1\xde\x94\x51\xa6\xf0\x28\x6a\x8d\xb1\xbc\xc6\x98\xbf\x9f\x6c\x54\x1d\x0c\x5e\x67\x8a\x1e\x1a\xc0\xde\xa4\x6b\x4f\x14\x7b\xef\x9c\xf1\x96\xd3\x14\x15\xa5\xb2\xa1\xbc\xa3\x23\xd9\x7b\xa1\xfe\xaa\xa2\xdb\x5b\xa8\x0f\x86\xb8\x87\x4d\xda\xb3\x03\x42\xdc\xbd\x10\xed\xb1\x3c\x20\xc4\xdd\x0f\xd2\x86\xbe\x1f\x14\xe2\xee\x85\x0a\xa1\xef\x87\x85\xb8\x0f\x9e\xf8\x7d\x12\xf2\xef\x95\x8b\x73\xf7\x82\x1c\x8e\x7f\x0f\xc4\xb9\xfb\x2d\xe4\xc1\xf8\xf7\x40\x9c\xbb\x1f\x9d\xd1\xf1\xef\x9d\x38\xf7\x00\xc9\x4f\xf1\xef\x7b\xcf\x14\xff\xde\x78\xa6\xf8\xf7\xc8\xc5\x4e\xf1\xef\x53\xfc\xfb\xd0\x33\xc5\xbf\x4f\xf1\xef\x53\xfc\xfb\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x3d\xcf\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x8d\x67\x8a\x7f\x1f\x58\xca\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x53\xfc\xfb\x14\xff\xde\xf3\xca\x17\x89\x7f\x6f\x19\xa1\xbd\x41\xf0\x01\x73\x6c\x5d\x3f\x65\x64\x10\xbc\x17\xe6\x92\x0c\x07\xc1\x7b\xa7\xed\x85\xea\xa9\xf1\x13\x15\x09\xef\x37\xbd\x36\x23\xe4\x47\x45\xc2\x07\x8c\xe6\x3d\x55\xe9\x9f\x58\x7d\x1e\x35\x22\xe4\x0f\x8d\x84\xf7\x93\x00\x9f\x22\xe1\xa7\x48\xf8\x29\x12\x7e\x8a\x84\x9f\x22\xe1\xcd\x33\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x3f\x45\xc2\x77\x9e\x29\x12\xbe\x77\xba\x53\x24\xfc\x14\x09\x3f\x45\xc2\xd7\xcf\x14\x09\xdf\x7e\xa6\x48\xf8\x29\x12\x3e\xf0\x4c\x91\xf0\xcf\x13\x09\xef\xfd\x13\xce\x88\x50\x17\x82\x17\xfd\x57\x6c\x5b\xb9\x6c\xbf\xab\xd9\xf4\x8a\xae\x4b\x1b\xb7\x6a\xe8\x00\x28\xd3\x6e\x9f\x39\x5d\x9d\x89\x2e\x09\x4a\x05\x2f\x0a\x02\x01\xf1\x77\x1b\xcc\xb8\xfc\x04\x31\xe4\x30\x19\x13\xb6\xf2\x93\x69\xc8\xf7\x53\xed\xeb\xd5\x9b\x56\x08\xbe\xa5\x29\xe9\xa9\x67\xfe\x93\x02\x38\x3f\x0a\x0d\xe8\x47\x2d\x13\xd2\x04\xff\x64\x4c\xb4\xed\x01\xcd\x20\x68\xb9\xd3\xe7\x00\x97\x59\x47\x6d\xf0\xf0\xb1\x00\x2d\xf8\xb6\x05\x86\xca\x31\xc3\x6b\x22\xe4\x39\x60\x2b\x88\x60\x63\xdb\xab\xf0\x0a\x3a\x17\x44\x7d\x27\x9c\x31\x92\x98\xb8\x68\xde\x02\xbb\x40\xe8\x23\xcb\xba\xd4\x80\xb7\x98\x66\x78\x99\x55\xc1\xe5\x1a\x3b\x68\xfb\x7a\xf1\xe6\xf5\xe2\x35\xdc\xcb\x10\x7b\xac\xbf\xff\x80\x0b\xe9\x8c\x7e\x3f\xb5\xa6\xbc\x30\x33\xf9\xa9\x0b\x5d\x74\x12\x1f\x42\x6a\xb9\x47\x05\xef\x04\x29\x6b\xfe\x51\x9d\xf7\x44\x10\x08\x1e\x30\x27\x1f\xcc\xc3\x7a\xb2\x56\x53\xc1\x9a\x45\x79\xc2\xc5\xec\xb7\xf7\x64\xd7\x77\xba\x83\x67\x5a\x93\xef\xe0\x54\x4f\xae\x71\x5e\x99\x0a\x6d\x0b\x5f\xb5\x40\x1f\x38\xd8\x89\x57\xfc\x2d\xda\x28\x55\xc8\xb7\xa7\xa7\xf7\xe5\x92\x08\x46\x14\x91\x0b\xca\x4f\x53\x9e\xc8\xd3\x84\xb3\x84\x14\x4a\x9e\xf2\x2d\x11\x5b\x4a\x1e\x4e\x1f\xb8\xb8\xa7\x6c\x3d\xd7\x1b\x35\xb7\x1d\x41\x4f\xe1\x1c\x9d\x7e\x03\xff\xd3\xbb\xc8\xbb\x8f\x17\x1f\xdf\xa2\xb3\x34\xb5\xad\x0f\x4a\x49\x56\x65\xe6\x7a\x4b\x21\x5c\xd0\xcf\x44\x68\xc1\x6e\x86\xee\x29\x4b\x67\xa8\xa4\xe9\x7f\x9d\x8c\xc5\x07\x2f\x8c\x38\x3d\x88\x93\x5b\xb8\x9b\x76\xfa\x36\x82\xe9\x68\xd4\xdc\x9a\x7d\xd0\x17\x98\x92\xb0\xb9\x4e\xcf\xb4\x37\x90\x77\x36\x4b\xce\x33\x82\xf7\x0d\x8a\x3e\x46\xdb\xa7\xce\x84\x19\x9e\x23\xf0\xef\x45\x67\x65\xed\x9d\xb6\x27\xf2\xfb\x4f\xef\xa5\xa1\x45\x96\x3a\x06\xa2\xb8\x61\x88\xf5\x41\x7c\xc7\x85\x65\x67\x9d\x85\x75\x0f\xde\xcc\x7c\xfd\xa1\xc5\x1d\x1a\x02\x49\x29\x81\x5d\x49\x45\x70\xba\x00\xcb\x47\x0f\x61\x36\xbc\x3f\x8e\xd3\x51\xe3\x49\x43\x74\xd5\x3b\x00\x6d\xb8\xc3\x16\x70\xf4\xbb\x40\x7b\x59\x41\x29\xb2\x9f\xe0\xdc\xef\xd3\xd0\xf1\xd8\xa5\x15\xfb\x89\x08\x5f\x43\x27\xe7\xd5\x7b\xe6\x16\x97\x88\xb2\xff\xb6\xec\xb1\xd6\x00\x1b\xe0\x4c\x5e\x4f\x4a\x57\xbb\x7e\x1a\xb7\x6a\xcb\x9a\x30\xfd\x5f\x24\x6d\x7c\x6a\xad\x0d\x09\x66\xd5\xa6\x00\x07\xce\xf8\x83\xcb\x31\xe9\xd0\x29\x42\xb8\x54\x1b\xc2\x14\x4d\x0c\x0b\x2f\x04\x7f\xdc\x19\x83\x58\xf3\xba\x03\x57\x00\x64\x4b\x25\x1b\x70\x20\x6b\xb4\x2f\xc9\x06\x6f\x69\x8f\xc0\x0e\xf2\x53\x70\xb2\x0b\xd4\xc0\x4c\x6a\x33\xd9\x52\x04\x9e\x12\xb3\xfc\xee\x44\xc3\x10\x6d\xae\xcc\x0e\xc9\x8d\x4b\x4f\x31\xc9\x6b\xfa\xff\x69\x5a\x06\xb0\x76\x99\x5d\x4a\xd2\xdf\xa4\x9c\x11\xb4\xa5\xd8\x1b\x2e\x09\x9c\x3f\x29\x85\x66\xa2\x8d\x91\xfb\x39\x1f\x16\xe4\xad\xbb\xeb\xe7\x70\xd7\xff\x04\xf3\xf8\x09\x32\xf2\xe6\xe6\xbe\xca\x71\x31\x17\x24\xe3\x38\x25\xe2\xa7\x05\xfa\xb8\x25\x42\x50\xd8\xaa\x7a\x5f\x3b\x90\xb5\x3e\xcd\x14\x15\x24\xdb\x21\x5e\x2a\x49\x53\xbb\xde\x84\x17\xc0\xec\x1f\x9c\xe9\x37\xc7\xb4\xc2\x32\x9c\x3a\x59\x16\x05\x17\x5d\x99\x4d\x4f\x4c\x8b\x19\x5c\x0f\x2d\xf9\x0c\xed\x78\x89\x70\xa2\xd9\xbf\x33\x24\x53\xe9\x36\xbc\x34\x9e\xd2\xa5\x20\xf8\x1e\x61\x05\xb2\xaf\xa2\x79\x57\x08\xd7\xd7\x04\x2f\x95\x96\x87\x68\x42\x62\x8f\xe3\x9e\x97\xc0\xda\x19\x40\x75\xb4\x44\x5a\xa3\x1e\xe6\xa6\xe7\xfa\x80\x4d\xfc\x9e\x28\x19\x0c\xdb\xeb\xe2\x01\x97\x56\xf7\xa2\x0d\x9b\xe9\xb1\x58\x7b\x54\xc5\xf6\x51\x3f\x13\xeb\xd2\xe8\xfa\x96\x2b\x11\xa6\xc4\x0e\x3c\xda\x86\x70\x52\x9e\xdc\x6b\x3a\xcd\xf1\x9a\x9c\x78\x23\xd2\xcf\x3f\x5c\xe8\x0d\x36\x3c\xd5\xe6\x90\xed\x89\x94\x0b\xf4\x19\x0b\x0a\x12\x53\xd5\x95\x5f\xa2\xdf\xbe\xfc\x7c\xf6\xe9\xc7\xeb\xb3\x0f\x97\x3e\x65\x50\xd3\x38\x79\x2c\x30\x4b\x49\x8a\x4a\x59\x47\x95\x58\x6c\x9e\x9c\x68\xc2\xda\x52\xc1\x59\x0e\x62\xc2\xd5\x0a\x84\x17\x33\x96\x07\x68\x82\x99\x29\xae\x07\x0e\xb6\x6c\x4b\xd2\x59\x53\xd8\x48\x88\x53\x09\x29\x2b\x4a\xe5\xcc\xc9\xf6\x0a\xf0\xc0\x2c\x99\xe1\x32\xa6\x93\x78\x73\x65\x48\xee\x98\xc2\x8f\x8e\xc9\x11\x99\xe0\xc2\x85\xca\x60\x94\xf2\xd2\x3f\xd1\xdf\xfe\x76\x86\x28\x79\x8b\x7e\xdb\x00\xb7\x40\x97\x16\x42\x03\x91\x26\x56\x82\x6c\x89\x80\x21\x2c\xc2\x7c\x96\x7f\x41\xd6\x58\xa4\x19\x91\xd2\x9c\xbc\x5a\xa6\x70\x88\x43\xa4\x32\x32\x33\xae\x16\xe8\xdc\x61\xcc\xb7\x7a\x08\x5c\x48\x63\xa5\x34\x85\xe5\xbd\x3c\x35\xd7\xca\x3c\xc5\x0a\xcf\x1b\x47\xe5\xd4\x88\x2f\xf3\x84\xe7\x39\x66\xe9\x1c\x5b\x22\x9d\x57\x9b\x7e\xfa\x8d\x55\x4f\xe7\xb8\x7a\x8b\xb2\x39\x9e\xcb\x0d\xc9\xb2\x3e\x29\x6c\xc0\x7c\x32\xa8\x88\x86\x35\x43\x3b\x87\x98\x13\x77\x59\x1d\x30\x03\x6d\xa1\x45\x0f\x1b\x1a\x62\x89\x42\x2b\x51\x08\x56\x12\x6a\x4a\xbf\x77\x32\xd1\xe5\xf5\xdd\xa7\xbf\xdd\x7c\xbc\xba\xbe\x1b\x3c\x8a\x1e\x88\x03\x07\x34\xe6\x28\x7a\x20\xfb\x0f\xe8\xf0\x51\xf4\x80\x0c\x1c\xd0\xe1\xa3\xe8\x67\x0b\xde\x03\x1a\x7d\x14\x3d\xb0\x3d\x07\x34\xfe\x28\x7a\xe0\x76\x0e\xe8\xaf\xfc\x28\x12\xb6\x8d\x38\x86\xef\x6d\x00\x42\x83\x30\x2b\x7c\x5b\x4d\x44\x39\x12\xab\xe5\x3f\xdf\xed\xd7\x41\xfd\xf8\x55\xb7\x66\x77\xc9\xb6\x9f\x71\xdb\x53\xcc\x7a\xa7\x8a\xec\x0b\x5e\x9b\x17\xb0\x92\xf3\xa1\x05\xc4\xb8\xfc\x7d\x9a\x7b\xef\x02\x9a\x0a\x7c\xdf\xbc\x17\xb5\x9d\x21\x68\x1f\x3c\xff\xf1\xea\xe2\xf2\xfa\xee\xea\xdd\xd5\xe5\xa7\x90\x25\x31\xca\x8e\x08\x36\xd7\xe8\x25\x9c\x8c\xe1\x86\xc1\x45\xd4\x9c\xb2\x10\x44\x4b\xa2\xb5\x85\xb8\x9f\xfc\x0c\xdd\x05\x61\xd6\xc2\xa4\x89\x12\xd9\x21\x49\xc4\x96\x26\xfd\xe8\x36\x26\xbf\x30\xaa\xe3\x19\x72\x8b\xf5\x06\x61\x8e\x65\xcb\x96\x01\x07\x61\x3e\x0b\x73\x36\xcf\xe1\x2c\x3a\x3c\xe3\xb6\x24\x75\x61\xac\xa2\xc0\x65\x5e\xbc\xe8\xe8\x17\xcd\x27\x9e\xac\xdf\x09\x1e\x4c\xd4\x6f\xdb\x92\x4c\x41\x8a\x15\x17\xde\x03\x7a\x62\xa3\x91\xc2\xe6\xfb\x06\xe3\xb3\xe2\x86\x89\xf2\xb3\xf2\x86\x09\x27\x08\x40\x88\x0d\x35\x32\x6a\xe7\x07\x5c\xfc\x95\xec\x3e\x91\xd5\x90\x0f\xac\xbd\x58\x30\x6f\xda\x58\x1b\x50\xf2\xd1\xb9\x03\x37\xe4\xd6\x1c\x13\x0a\x15\x19\x06\xd5\x6b\x93\xad\xac\xb0\x31\x4e\xec\x51\xbe\xf4\x21\xae\xdd\x3b\xad\xaf\xc2\xfe\xba\xff\x8c\xb5\xc7\x46\x01\xf5\xd9\x6c\xf7\x9f\x51\x38\x0f\xd9\x74\xf7\x9f\x41\x1b\x6f\x45\xab\xd6\xcc\x1b\xb5\xac\x38\x53\x70\xff\x22\xfb\x4d\xc3\xfb\x4f\x6c\x34\x4c\x4c\x24\x4c\x74\xe8\x00\xec\xf5\xd8\xf3\x7f\x52\x33\x00\x63\xc8\xb5\x74\x5d\xf0\xf4\xad\xb3\x2c\x49\x94\x13\x85\xb5\xec\xbb\xd0\x04\x39\x4c\x3b\xad\xd7\xc1\x51\x3c\xab\x7f\x33\x9e\xb5\xc6\x0f\xc0\x25\x8d\x09\x6f\x18\xb4\x2c\x48\xb2\x60\x3c\x25\xfa\x10\xce\xcc\x3f\xed\xdd\x7e\x96\x24\xbc\x64\xca\xfe\x41\x61\x55\xca\xc5\x86\x4b\x75\x75\x13\x01\xd6\xbc\x5e\xf0\xf4\xea\x66\xd6\xfa\x97\x0c\x5e\x41\x68\x24\x1b\xac\xcf\xe1\x68\xf2\xb7\xdf\x35\x2b\x2a\xe5\x18\xfe\xf3\x9d\xde\xb8\x1b\x1c\x28\xf6\xd3\x7c\xa8\x44\x0f\x82\x2a\x45\x18\x48\x2a\x90\x42\xc0\x57\x33\xe7\x8e\x34\x17\xef\xf6\x4d\x54\xbe\xe9\xa8\x83\xbf\x72\xd3\x1c\xbd\x74\xfd\x91\x5b\xb7\xa1\xd2\xda\x31\x17\x21\x0d\xba\xa7\x0e\x60\x38\xbb\xb9\x42\x5b\x83\xcf\x23\x2f\x33\xfe\xe4\xaf\x22\x77\x2d\xfa\xfc\xbb\x60\xf8\x77\x4f\xe4\x03\x55\x49\x2e\x8b\xf1\x4a\x98\x7e\x0b\x01\x51\x83\xf8\xaa\x82\xf2\x51\x46\x73\x6a\x03\x65\x6d\x79\x2f\x89\x5e\x9a\x1f\x17\x49\x51\xce\xec\x0b\x8b\x9c\xe4\x5c\xec\x86\x4f\xa9\x7d\x9d\x14\x1b\x92\x13\x81\xb3\xb9\x54\x5c\xe0\x35\x99\x55\xe0\x0d\xd8\xea\x5f\x06\xf0\xf0\xa9\x6c\x4c\xb0\x0b\xdd\xe8\x32\xd6\x45\x90\xed\x1c\x57\x24\xe9\x51\x39\x43\x85\xe5\xeb\x83\x64\x92\xf3\x96\xe7\xe2\x6d\x45\x87\x20\xc6\x6e\x79\x56\xe6\x71\x19\xad\xf5\xfd\x6c\xea\xbd\xb1\xad\x16\x7a\xe5\xd1\xa5\x80\x94\x6e\xa9\x8c\x8b\x15\xef\x11\x02\xa8\x0d\xdf\xe7\xa5\x2a\x4a\x65\xd3\x1a\x87\x3a\xc3\x37\x1f\xf2\x58\x70\x09\xaa\x4f\x95\x40\xd2\xe2\x7f\x6f\x86\x93\xb5\x47\x2e\xd8\x8d\x34\x7e\x6b\x5d\xd9\xb0\xb7\xf5\xc9\xac\xd8\xdf\x91\xf7\x25\x9e\x7b\xb9\xa9\x1c\x8b\x79\x99\xa0\x89\xe3\x28\x30\x36\x00\xc3\xea\xe1\x10\x44\x18\xa5\x09\x80\xa4\xf2\x95\xe8\x3c\x11\x71\x28\x51\x84\x5e\xc7\xaa\x0c\xc4\xa5\xec\x3f\x93\x1e\xf5\x6b\xd2\xa3\x3a\xb1\x32\x51\xeb\xfa\x97\x53\xa2\x22\x5e\x1b\x9a\xd5\x1c\x0e\x43\xd0\x78\x1f\x80\x3f\x68\xbc\xf7\x5b\xb2\x7a\x0d\xf8\x4e\x12\x53\x1c\x15\xbc\x28\x33\xac\x3c\x26\xd0\xb0\x1b\xa9\x11\xe3\x61\x19\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\xcb\x32\x44\x99\x61\x50\x00\xd6\x59\x43\x05\x31\x42\x16\xc2\xc6\xbc\xbf\xf5\xdb\xf1\x1f\x6c\x4e\x76\x33\x70\x44\x6a\x25\x4e\x28\x08\xd1\x85\x9c\x6d\x73\x3f\x58\x63\x23\x65\x55\xe6\xb6\x07\x66\x25\x16\x54\xf9\x03\x9d\x32\x0e\x26\xea\x54\x2a\xb7\x70\x98\xb9\xc2\xf7\x3e\x90\x85\x20\x09\x49\x09\x4b\x08\x64\xa2\x95\xa4\xc6\xe1\x72\xa7\xd7\x78\xc9\xb6\x95\xdd\xb6\x34\x3e\x26\x73\x19\x68\xc8\x3e\x8a\xc2\xf7\xa4\x05\xf9\x39\xbc\x2d\x9a\xe8\x6e\x5d\x99\xde\xca\xe9\x02\xf7\x53\xa5\x29\xb8\x64\x3b\xef\xe9\xaa\x4c\x35\x3e\x5a\x8b\xb9\x5a\x2b\x53\xe7\x80\x98\xd0\xb9\x53\x6b\x43\x51\xfb\x2e\x3d\x82\xf9\x35\xe6\xf2\xfb\xba\x2f\xbe\xa3\x05\x73\x36\x9f\xe8\xcb\x2c\xf6\x22\x1b\x61\x0c\x1c\x77\x31\xc5\x5e\x4a\x51\x97\x48\x21\xc8\x8a\x3e\x46\xd3\xe6\x19\xab\x15\x2e\x9a\x12\xa6\xb4\x72\x03\x41\x79\x85\x20\x05\x61\x69\x55\x16\x62\xe8\x92\xb3\xac\xba\xb6\xde\x37\x82\x95\x8f\xea\x28\x34\x72\xe4\xd8\x03\x78\xdb\x27\xc9\x4e\xa7\xef\x5f\xe7\xf4\xd9\x0d\xfe\x62\x47\xef\x89\xb2\x15\x04\x0a\xc5\x44\x28\x5d\x34\x02\x8b\x80\xfa\x46\xd3\x4e\x1d\x06\x7a\x0a\x50\x7c\x24\x72\x57\x87\x57\x53\x59\xb3\x89\x2a\x00\xd8\x44\x72\xa3\x8c\x6c\x49\x66\x6f\x46\x64\x02\xa6\x73\xbf\xb0\xa4\xb8\xb3\x74\x68\x69\x9f\x9b\xe0\xd4\x96\xe8\x04\x53\xd2\xec\x44\x93\x76\xc6\xb1\x09\xc8\x15\x3c\xcb\xfa\x02\x57\xcd\x93\xd1\x7b\x82\x2e\x48\x91\xf1\x9d\xcd\x8d\x64\x29\xba\x55\x58\x69\x52\xbe\x25\xca\x67\x45\x1f\x20\x53\x98\xcb\x4d\x99\x65\x37\x3c\xa3\x89\x47\x9b\x6e\x6f\xcf\x15\xec\x4b\x51\x66\x19\x2a\xe0\xa3\x05\xfa\xc8\xe0\xbc\x9f\x65\x0f\x78\x27\x67\xe8\x9a\x6c\x89\x98\xa1\xab\xd5\x35\x57\x37\x46\x98\xf1\xf1\xc4\xa6\x33\xda\x7c\x8e\xe8\x0a\xbd\xcd\x4c\x97\x04\x85\xdb\x01\xed\x33\x8d\xd1\x26\x58\x0f\x54\x38\xe6\x0f\x54\xf6\x4a\x6b\x4f\x26\xa6\x6f\x00\x92\x66\x49\xe6\xdf\x07\x21\x3e\xa3\x2b\x92\xec\x92\x2c\xe6\x44\x9c\x25\xe0\xbb\xa9\x8b\x53\xd4\x34\xe8\xba\x15\xdb\xbc\x02\x10\x56\xbd\x85\x5a\x4c\x89\x24\x53\x43\xaa\x26\xc7\x6a\x26\x46\x05\x90\xd1\x12\xee\xf0\x05\x52\x70\xa9\x6e\xb5\x96\x10\x59\xfb\xe8\xe4\xc6\x7d\x80\x20\x26\x3f\xcb\x48\x8a\x68\x9e\x93\x54\x6b\x05\xd9\x0e\xe1\x95\x82\xea\x34\xd5\xec\x03\x1c\x4d\x43\x80\x76\x1b\x69\x55\xec\x60\x83\x59\x9a\x11\x81\x56\x98\x66\x56\xf3\x68\x69\x34\x8a\x88\x9c\xb2\x81\x7a\x45\xc6\x96\x0d\xca\x8f\x56\x9e\x92\x84\x0b\xdb\x7f\x19\x54\x7b\xfb\xa7\xfa\x6c\x00\xff\x1e\xe4\x1a\xa8\x4e\xb8\xac\xa7\xb4\xcc\x78\x72\x2f\x51\xc9\x14\xcd\xcc\x02\x38\xbf\x87\xa6\x1a\x19\xd0\x6a\x83\x94\x03\x60\x47\x12\x79\xf5\x9f\xf3\x8a\x32\xe6\x7a\x5c\x79\xfa\x4d\xfd\x27\xf8\xc1\x7f\x45\xc6\xc9\x16\xe4\x91\x24\x23\xb2\x7a\x35\x97\xd1\xc8\x87\xa4\x71\xce\x2a\x11\x63\xc5\x35\xb3\x86\x18\xfc\xfe\x84\xc4\xf6\xb3\x24\xcd\x0c\x99\xcb\x47\x92\x34\x92\xb5\xa1\x64\x1b\x1c\x37\x08\x48\xc7\xf7\x03\x11\x28\xf1\xd6\xca\x60\x88\xae\x77\xcd\xe7\xe6\x2b\x57\xa8\xc6\x02\x41\x19\x65\x70\x8a\x6d\xd8\x6e\x84\x5d\x88\xb2\x2a\xe3\xa1\xda\x45\x73\x02\xac\x7c\x85\x52\x2a\x20\x1b\x79\x87\x56\x71\xf5\x20\x1a\xf3\x81\x84\x5d\xce\x15\x7a\x79\x72\x7a\xf2\xaa\x63\xd4\x38\xd1\xb7\x6c\x46\x0c\xaf\x8a\xb1\x8d\xde\x35\x60\xeb\x0b\x80\xe6\x45\xb6\x83\xd5\x9e\xa4\x33\x44\x95\x8b\xf0\x11\x25\xb3\x2b\x8b\x00\x6a\x63\x9a\x67\x48\x72\xa4\x04\xae\xf2\x88\xe0\x57\x48\xc5\x12\xa5\xe5\xb4\x2f\x4f\xfe\x71\x12\x63\x79\x24\x2a\x79\x85\x1e\x38\x3b\x51\x80\xc6\x05\xba\xe3\x5a\xba\xac\x87\xda\xf1\x12\x31\x62\x92\x8a\xc8\x63\x91\xd1\x84\xaa\x08\x0f\x1f\x02\xe6\x87\x78\xa9\x4c\x5e\x04\x56\x2e\x1e\xfb\xf2\x91\x2a\xeb\x3e\xd7\xf4\xff\x1a\x28\xc3\xb0\xb9\x18\x14\x48\x94\xd1\x2d\x39\xdd\x10\x9c\xa9\x8d\xa9\xcc\xc4\x38\x9b\xff\x4c\x04\x87\xa8\x6d\x66\xff\x72\xc4\xfa\x55\xcf\x52\x4a\x37\xd2\xdc\xa8\x59\xdf\x77\x64\x4c\x45\xd1\xbf\xdc\xdd\xdd\x7c\x47\xd4\x1e\x4b\xd0\x70\x9c\x03\x13\x54\x47\x22\x56\x5c\x0c\x90\x72\x3c\x6f\xd8\x70\x39\x30\xc7\xee\x3c\xb9\x54\x26\x4d\xcb\x5c\xe6\x4c\x6b\x7c\x8a\xb7\xbc\x6c\x91\x87\xb8\xe0\x29\xba\xba\x59\xa0\xbf\xf1\x52\xcf\x79\x89\x97\xd9\xae\x4a\x0d\x92\x44\xa1\x17\x7a\xb0\x17\xfa\x54\x6b\x3c\xfc\x85\xe0\xd4\x2f\xa7\x36\x1f\x97\xdd\x18\xb9\xeb\x51\x24\xd2\x98\xc1\x58\x56\x5a\x4a\xc5\x73\xb4\x31\x1f\xef\xc5\x58\xdb\xbd\x8d\xe1\x4d\x9a\x42\x5c\x5e\xa2\x20\x05\x1c\x3d\x07\xf5\xb9\xca\xbe\xe9\x31\xcd\xaa\xab\xbc\x3f\xa9\xc5\xa0\xe6\x92\xa2\x1c\x0a\xa6\x7a\xa8\xcd\x3d\x35\x4b\xd1\x5b\x1e\xe5\xbb\x19\x5b\x98\x2d\xd6\x67\x85\xfa\xac\x19\x66\x4d\x56\x39\x0b\x18\xfc\xf7\x9f\xc3\x6a\x7f\x1d\x67\x9a\x31\x45\x35\x0e\x9c\xe7\xb8\xea\x4f\x91\xf8\x9a\x47\xcf\xf8\x99\x6a\x3f\x15\x51\xb1\x4a\xdd\x48\x25\xad\xa0\x27\x09\xc4\x43\x9b\xe3\x0b\x84\x2c\x89\xd8\xfa\x73\x0c\xf6\xe7\x17\x85\xfa\x82\x87\x74\x17\xf7\x60\xb6\xfb\x38\xe8\x53\x87\x2a\x21\x51\x35\x9f\xf7\xdf\x3f\xa4\x6c\x95\x31\xc1\x09\xc4\xca\x7c\x49\x44\x1d\x73\x28\x54\x8d\xbc\x88\x7d\xe7\x1d\xef\xd4\xb5\x01\xe8\x8c\x50\xed\xfa\xd8\x31\x94\xc4\xd1\x1f\xfe\xed\xdf\x7e\xf7\x6f\x0b\x33\xc5\xca\x97\xc5\xd0\xd5\xd9\xf5\xd9\x8f\xb7\x9f\xcf\x21\x78\x7e\x78\x17\x1f\xe7\xb5\x3e\x33\xa7\x4c\xcd\xb9\x98\x1b\x4c\xbd\x45\x4a\x0c\x52\x35\x44\xf7\x45\x9c\xfb\xb6\x55\x0e\x3e\xd2\x6b\xd0\x42\x5e\xb7\x70\x87\x51\xd1\xe2\xae\x91\xa6\xe5\x43\x93\xef\x17\xa8\xde\xde\x9b\xd4\xdc\x1d\x71\xd8\xa9\x9b\x14\xb7\x3c\xb9\x1f\x25\x67\x9d\xdc\x9d\xdf\x98\x8f\x1a\xa2\x16\x66\x4e\xf9\xa2\x6c\xcb\xb3\xed\x30\xd9\x63\x74\x77\x7e\x03\x0b\x59\xc0\x7f\x81\x5e\x0a\xaa\xc1\x4e\x43\x76\x81\x64\xd6\x04\xac\xd5\x88\x21\x25\xdc\x40\x15\x04\x67\x54\x2a\x9a\x00\xd4\xda\x44\xa2\xe1\x87\x2d\xc3\xcf\x2a\xf5\x9d\x7c\x74\xc6\xe4\x61\x01\x30\xee\x30\x36\x04\xc0\xe1\x00\x8a\x5f\x05\xe7\xb4\x1c\xd3\xc4\xf9\x4d\x9c\x73\xef\xf9\x65\x79\x4b\xc4\x4b\x85\x20\xb7\x8a\x17\xd1\x16\x46\xf3\xba\xc7\xbe\xb8\x24\x2b\x2e\x48\xbc\x81\xb1\x36\x18\x56\xc5\xf4\x19\xc4\x3e\x3b\x5d\x91\x37\x4d\x7f\xc1\x18\x0b\xfd\xc8\x32\xd9\x38\x1d\x9d\x11\x29\x4f\xc1\x94\x58\x16\x46\x46\x07\xb3\x65\x29\xc8\x4c\xaf\x99\xe4\xb0\xa2\x59\x4c\x9c\xa0\x5e\x0c\x61\xe6\x75\x68\x45\x7d\xd7\xb0\x85\x5a\x4b\x8a\x43\xc6\x9e\x09\x32\x04\x55\x60\xb9\x21\x90\x57\x46\x1e\x69\x5d\x0e\x1b\x4b\x5b\xd4\xca\x21\x07\xf8\xb9\x44\x05\x96\xa6\xba\x4a\xe8\x26\xa9\x27\x66\xc0\xdd\xf0\xf4\xe4\x44\xb6\x40\xad\x05\x4e\x88\xd6\xc0\x29\x4f\x11\x24\x24\xa4\xfc\x21\xe4\xda\x5a\x92\x35\x65\xd2\xed\xad\x1e\xc2\x11\x81\xe6\xe6\xa6\x64\x9e\xcb\x7f\x5f\xa0\x4f\x55\xb2\xdd\xb0\xa5\x96\x97\x2a\xe1\x35\x93\xb0\x33\xdf\x37\x2c\x43\xd8\x4a\xdd\x16\x21\xb4\x7c\x47\x4e\x2e\xe6\x47\x0d\xa3\xc0\x5a\x98\x03\x50\x1b\x04\x38\xd6\xc2\x1c\x42\x81\x68\x7c\xe5\xdd\x1f\xa8\xdf\x8b\x93\x4d\xdb\xef\x32\x19\xab\x27\x63\x75\xe8\x99\x8c\xd5\x93\xb1\x7a\x32\x56\xf7\x3e\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xe1\x6f\x27\x63\xf5\x64\xac\x9e\x8c\xd5\x3d\xcf\xd7\x68\x72\x99\x8c\xd5\xe1\xcf\x27\x63\xf5\x64\xac\x0e\x40\x9d\x8c\xd5\xbd\xef\xff\x1a\x38\xe7\x64\xac\x0e\x7d\xfc\x95\x19\xab\x07\x5e\x70\x56\xdf\x1b\x2d\xe3\xc6\x44\x62\xdf\x80\x8d\x8d\x26\xd6\x3c\xcc\x57\xad\xa8\x5e\x03\xac\x51\x33\xda\x33\xf1\x3a\x1f\xd0\xc5\xb4\x5a\x23\x70\x6d\x74\xee\x8d\x09\x06\x7b\x9e\x07\x66\x7c\x74\xb5\x0b\x81\x97\xa7\x05\x37\xff\xaf\xb6\xe4\x35\x4c\x78\x46\xee\xef\x3f\xf4\xc3\x4c\x2c\x6c\xbb\x3b\xc8\x6e\xd7\xb6\xcc\x05\x88\xe7\x09\x36\xbb\x38\xee\x1c\x65\xab\x3b\xc0\x4e\x17\x67\xab\x8a\xb5\xd1\xed\x5b\xe0\x06\xc0\x46\xdb\xe7\x9a\xd6\xb7\x01\x98\x71\xb6\x39\x9f\xe5\x6d\x48\x44\xf3\xd8\xe5\x06\xad\x6e\x03\x70\xfb\x6d\x72\x41\x8b\xdb\xd0\x4c\x7b\xed\x71\x41\x6b\xdb\x30\x62\x23\x6d\x71\xbf\x7c\x0b\xa9\x08\xce\x6d\xdd\x6a\x77\x1b\x41\xe4\x86\x67\x81\x93\xd4\x3a\x45\x1f\x28\xa3\x79\x99\x6b\xc2\x94\xd0\x57\x7b\x5b\x79\xe8\x64\x45\xf1\x86\x87\x06\xad\x5b\xd0\x9c\x0a\x48\x0f\xaa\xc9\x60\x9a\xe9\xdd\x80\x44\x87\x0d\xde\x02\xc7\x29\x93\x84\x10\xa8\x61\x7e\x11\x65\x30\xfb\xdd\xa2\x9a\x5d\x55\x10\xf1\x8d\x7f\x67\xe2\x9a\xd6\xc7\x48\x35\x83\x26\xcc\xe7\x30\x5f\xc6\xb1\xc9\x61\x01\x76\xb4\xc9\x32\xa2\x18\xce\xb3\x98\x2b\xa3\x4c\x95\x91\xa7\x28\xda\x44\x39\xde\x3c\x09\xfb\x3b\xa4\xbc\x1c\x62\x9a\x8c\xe2\x22\xa3\x4d\x92\x31\x36\xe8\x83\xcc\x91\x63\x4c\x91\x07\xd5\x79\x39\xd4\x04\x39\x4a\xef\x88\x36\x3d\x1e\xc7\xec\xf8\x2c\x35\x95\x22\xf0\x12\x67\x66\x1c\xd9\x6d\x72\xc8\xbc\x38\x6c\x5a\x3c\xa6\x59\x31\x12\xb5\xc3\x4a\x71\x84\x42\x3c\x46\x19\x1e\xa1\x08\x8f\x36\x1f\x5a\x24\x0d\x6c\x6b\xac\x02\xbc\xa7\xde\x0e\x40\x3d\x4c\xf9\x7d\x82\xe2\x1b\x63\x2e\x7c\x16\x53\xe1\x38\x33\xe1\xd1\x9a\x2f\x06\xd5\xf7\x88\xa3\x4a\x19\x55\x14\x67\x17\x24\xc3\xbb\x5b\x92\x70\x96\x06\x38\xf5\x5e\xa9\x83\x8a\xe6\xa4\xf9\xd0\x4a\x6e\xed\x28\x9b\x0d\xb6\xd5\x72\x82\x7e\x6f\x1b\xa0\xe4\x34\x77\x7b\xb9\x40\x6d\x44\x33\xc3\x43\xb2\x97\x8f\xa0\x5f\xa3\xa3\x8a\x88\x26\x30\x68\x1c\x9a\xff\xc2\x1f\x10\x5f\x29\xc2\xd0\x4b\xca\x1c\xa6\x5f\x35\x84\xc3\x5a\xd6\x0e\x91\x9c\x25\x4f\xfd\xdd\x9b\xd7\x0e\xcc\x97\x12\x95\x41\xa8\x97\xf2\x18\x5a\x87\x05\xf5\x14\xb5\xc3\x82\x58\x95\x59\x5b\xf5\x30\xea\x48\xac\xde\xf1\xa6\x2e\x89\xf2\x06\xe6\x52\xd1\xb2\xd6\x26\x6d\x30\x63\x17\xe1\x41\x88\xbf\xc0\x56\x44\xb8\x04\x0e\x72\x07\x18\x83\xff\xc0\x15\x3b\xca\x15\xd0\x34\xf6\x07\xe0\x8e\x71\x03\x3c\x8b\xf6\x74\x44\xd3\xff\x18\xb3\xff\xbf\x9c\x64\x13\x61\xde\xff\x15\x49\x36\xbf\x84\x2c\xa0\x68\x4e\x78\xa9\x8e\x24\x06\x98\x3e\xc9\x0d\x8e\x4c\xc3\xf5\x8a\x78\xb9\xd7\xa0\xe3\x8d\x05\xd8\x7b\x4b\x1d\x2f\xa2\xf6\x2b\x93\x12\x06\xf6\xc9\xaf\x24\x7b\x9b\x00\xd5\xb2\x58\x5d\xa3\x1c\x4b\x84\xd1\xc5\xf5\xed\x8f\xef\xcf\xfe\x7c\xf9\x7e\x81\x2e\x71\xe2\x2b\x15\xde\xa8\x12\xc2\x4c\x43\x44\x43\xfb\x1b\xbc\x25\x08\xa3\x92\xd1\xbf\x97\xb6\x6b\xe6\xcb\x0a\xe2\x2b\xe7\x35\xf1\x00\x1d\xaa\xaf\x32\xc0\x33\xa0\x71\xc0\x88\x4a\x95\xa6\xd1\x80\x31\x23\x73\x2d\xe6\x0b\x9e\xef\xbb\xfd\x2e\xf5\x9f\xfc\x2c\x0a\x1b\xde\x03\x0d\x47\xd7\x74\x6b\x0d\x76\xb6\x04\x4d\xa3\x33\xab\x26\x49\x4d\x09\xfa\x36\xc4\x4b\x30\x53\x7b\x39\x14\x23\x4a\x53\x5f\xa5\x71\x70\x26\x9b\xf9\x17\x5a\x23\x91\x33\xb4\x2c\xc1\x54\x5f\x08\x9a\x63\x41\xb3\x5d\x73\x08\x9c\xf9\xf8\xcd\x35\x77\x37\xf4\xce\x5c\xc7\xf5\xf4\x2f\x3e\x5e\xde\xa2\xeb\x8f\x77\xd0\x13\x49\xdf\xac\x60\x45\x87\xbf\x03\x62\x96\xc4\x8f\x06\x5b\xdb\x7a\x81\xce\xd8\xce\x7c\x62\xce\x39\x95\x48\x5f\xcd\xc4\x75\xdc\xd7\xc8\x71\xa5\xa0\x5e\xbc\x5e\xc0\xff\xf9\xca\x5e\xe3\x34\x15\x9a\x9b\x57\x4e\x88\xbd\xfc\x01\xcd\x65\x81\xdf\xd3\x65\xd6\xd8\x3b\x8b\xbd\x5f\xac\x33\x58\xe5\x4c\xbc\xd1\xcb\x6e\x36\x08\xab\x36\x12\x10\x62\xea\x95\x42\x13\x52\x2f\x1f\x18\xec\x6b\x16\x59\xaf\xb2\x9e\x50\x74\xbd\xbc\x9a\x5f\xbb\xcb\xd4\x1e\x0a\xde\x28\x69\x8d\xae\x6e\xdc\xb6\x84\x2f\x34\x28\x23\x96\xb7\x1b\x97\x1b\xc0\xc6\x24\x31\x43\xaf\xd1\x9f\xd0\x23\xfa\x13\x5c\xad\x7f\x08\x01\x8b\xe3\xa0\x71\x62\xad\x91\xda\xae\x6e\xa2\xb1\xf2\x83\x3e\x02\xfa\x1b\xbd\x72\xc5\xd1\x92\xb2\xd4\x74\x68\x7a\x54\x44\xe8\x83\x6d\xb1\xf5\xe4\x0a\x87\x7a\x90\xa3\x6e\x18\x58\x27\xd0\xd5\xaa\x51\x2b\x2c\x2c\x29\x8e\xdc\x32\x0d\x5a\x4b\xb2\xd7\x86\xc8\xc3\xe6\xe9\x56\xc5\xb2\x7a\xa4\x1c\xab\x64\xd3\x3e\x41\xfa\x0a\x97\x2a\xd4\xb6\xb8\x85\x11\x0e\x1a\x82\x71\x07\x6e\x68\x90\x2a\x8f\x4b\x48\xa3\x9a\xef\xb5\x76\x61\x0f\xd3\x7b\x82\xe2\x80\x10\x9e\xba\x9b\xb5\x91\x0e\x55\xf0\xd4\x5c\xd5\x30\xa9\xb4\xc1\x6e\xdc\xad\x1c\x04\xda\xbd\xb1\x6d\x88\x4a\xa5\x3a\x03\x7d\xe9\x93\x60\xbb\x71\x42\x05\x4b\x31\x90\xb1\xa0\x4f\x4b\xd5\x03\x2f\xb8\x31\x51\xe7\xa3\x10\x5c\xf1\x84\x07\x6b\x46\xb6\x4d\xc2\xf6\x03\x58\x86\x51\x2b\x9d\x26\xfe\xfd\xc5\xcd\x4c\x6b\x84\x50\x3c\xef\xf6\x7c\xc8\x2a\xd7\x6a\x0f\x77\x77\x7e\x13\x6c\x53\x13\xb1\x98\xe1\x72\xde\x2d\x16\xee\x13\xcb\x9f\x56\x7b\x52\x10\x9c\xd2\xa3\xc5\xd6\xb8\x56\x87\x15\xd4\x31\x41\x36\x39\xdf\x92\xd4\x5c\xe0\x75\xcb\xc4\x14\x1a\xf2\xca\x40\xe4\xcd\xb0\x0c\xf9\x05\x2c\x83\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x81\x77\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\xe9\x45\xcb\x14\x79\x33\x45\xde\x4c\x91\x37\x8d\x97\xa6\xc8\x1b\x3b\xa9\x7f\x1a\xff\xd4\x14\x79\xd3\x7e\xa6\xc8\x9b\xce\x28\x53\xe4\xcd\xd7\xe1\x53\x9b\x22\x6f\xdc\x33\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\xb3\xf7\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\xde\xa7\xaa\x9b\x77\x8c\x0b\xe5\x9c\xe7\x45\xa9\x08\xfa\x54\xb5\xab\xaf\x7a\xa6\x2f\x77\xc6\x2f\xd8\x38\x1c\xcf\xe5\xe6\x30\x6d\xbb\x4a\x01\xa1\x22\xa7\xa6\x16\xe2\x3c\x31\x53\x9b\x57\xeb\x99\x57\x33\x39\x3d\xd4\xd5\x61\x7a\xe7\xfb\xe9\xa1\x8e\x8f\xb9\x89\x62\xfc\x51\x8c\xab\x8d\xf1\xf7\x30\x85\x86\xa1\xc5\x34\x8b\x7a\x04\xf2\xc5\x39\x2f\x4d\x09\x48\xbb\xfa\xc0\xd8\x15\x5e\x8c\x99\xe8\xcb\xa1\x1d\xc5\xf7\x0c\x26\xf2\x0b\x63\xff\x93\x9d\xc4\x3e\xfe\x2d\xfb\x38\x0c\xff\xee\xc8\x40\x04\x42\x35\x02\x95\x88\xe7\x54\x69\x39\x45\x0b\x7b\x8d\x68\xa1\x90\x57\x83\xaa\x96\x0d\xd5\x52\x0b\xf8\x1c\xb1\x32\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xeb\xa6\x16\x42\x17\x54\xbe\xad\xa4\x25\xd8\xf5\xb9\x6b\xbe\x0b\x8c\xf3\xab\xa6\xa0\x81\x17\xb4\xbc\x2f\xa8\xda\x9d\x73\xa6\xc8\xa3\x47\x82\x69\x13\xc3\xad\xfd\xc4\x76\x15\x94\x95\x28\x65\x9d\x98\xa2\x64\x10\xd5\x10\x71\x95\xc4\x20\xcb\x74\x1b\x3b\x75\x13\x05\xac\x90\x47\x75\xea\x01\x19\xb7\x15\x0a\xcb\xfb\x7a\x1f\xc8\x5c\x5f\x4e\x35\xba\x3b\x63\x1d\xca\x38\x81\xc5\xdc\x08\xba\xa5\x19\x59\x93\x4b\x99\xe0\x0c\xf6\x3c\x56\x04\x38\xf3\x7c\xef\xba\x2a\xca\xaa\x8b\xa6\xaf\x63\xb6\x9d\x27\x08\x75\x09\x66\x68\x8d\x29\x43\xb9\xc6\x51\xe1\xc0\x42\xf7\x3d\x06\x1d\xde\x0a\x2c\xb4\x42\x60\x3f\x08\x49\x5c\x10\x18\xb6\xe4\x3c\xb3\x1e\xd9\x6c\x57\xcf\xc9\xba\xfa\x19\xff\x91\x91\x87\x1f\xf5\x38\x12\xad\x32\xbc\x0e\xf5\xa2\x46\xb6\x22\x2c\x51\x9d\x92\x2d\xd5\x74\x90\x0f\x1d\x21\xc6\x20\x41\xfc\x43\xd8\x74\x60\xec\x6d\xf7\xfd\x16\xbd\x79\x05\x54\x8b\x25\xaa\xa0\x87\x8c\x2a\xdf\xbe\x02\xeb\xcb\xf9\xd9\xcd\x8f\xb7\x7f\xbb\xfd\xf1\xec\xe2\xc3\xd5\xf5\xd0\x11\x0d\xf7\x29\x4d\x70\x81\x97\x34\xa3\x61\xde\xdd\xb1\x82\x37\x3f\x03\x46\x95\xa6\xa7\xa9\xe0\x85\x59\xa7\x28\x19\xc4\x6b\xd6\x31\x58\x11\x86\x0c\xe7\x83\xaa\xc2\x3b\x4d\x6b\xee\xf6\x50\x6b\x81\x99\x72\xc2\xce\x50\x7d\x6e\x83\x66\x51\x32\x2d\xa8\x3e\xd5\xe3\x86\xd3\x31\x41\x09\x67\x69\x4a\xd2\xd6\xd4\x8f\xec\x03\x3a\x77\xa0\x77\x75\xc4\x28\xba\xf9\x78\x7b\xf5\x3f\xe3\x47\x45\x96\x46\xa2\xdc\x03\x47\xf2\x60\x23\xa4\xc9\x64\x04\x26\x3f\xd9\xe8\x9e\x09\x97\x9e\x77\x06\x2a\xf9\x3b\xae\x12\x79\xb8\x3f\x95\xac\x1d\x99\x5f\x43\x40\x39\x4f\xc9\x02\xdd\x18\xa6\x08\xdd\x76\x83\xbc\xbf\xfa\xae\x66\x03\x60\xfe\xd5\x1f\x33\x45\x71\x96\xed\x90\x96\xc4\xb6\x38\x23\xc6\x85\x2c\xb8\x57\x5b\x41\x75\x49\x2d\x13\x97\xda\xe4\x1a\x2b\x9c\xc9\xc0\x01\x8f\xe1\x83\x9a\xd5\x7f\xd0\xc2\x64\x24\x9e\xaa\xf7\x51\x4a\x18\x57\x56\x2e\xd5\x23\x41\x40\xad\xe0\x09\x32\xb2\xa9\x71\x43\x04\x56\x55\x87\x13\x55\xcc\x12\x58\xac\x63\x83\x54\xba\xb5\xde\x54\x63\x82\x26\x1e\x80\x59\x4a\x22\xf7\x6e\x1b\xcb\x06\x6b\x69\x55\x8f\x2b\x08\x4e\x21\x36\xac\xc0\x6a\x03\x76\xcd\x00\xd0\x1c\xcb\x7b\x92\x9a\x57\x17\xe6\x1e\xb6\x92\xb4\xb4\x1d\x00\xec\xf4\xee\x34\x16\x56\x04\xab\x52\x10\xb8\x7f\xc3\x42\xee\x92\x20\xc2\xf0\x32\x0b\x45\x9e\x45\x05\x45\xe2\xf4\x23\xcb\x76\x9f\x38\x57\xef\xaa\x90\xaa\xc8\xed\xfc\xa1\xea\x09\xde\xd4\xa0\xe1\xb2\x05\x23\x65\x3a\x07\x34\x41\x20\x57\x5c\x25\xf3\x8b\x7a\xfb\x8e\x40\x9e\xa2\x64\x67\xf2\x3b\xc1\xcb\xd8\xa6\x1c\x9a\x82\xbe\xbb\xba\x80\x53\x55\x9a\x73\x43\x98\x12\x3b\x08\x8a\xec\x64\xf0\x0c\xcb\x70\x0b\xf4\xbd\xa6\xa9\x3d\x2a\xd2\x12\x57\xc9\x24\x51\x0b\xf4\x01\xef\x10\xce\x24\xb7\xc2\x54\x48\x32\x62\xe8\x06\x7c\x26\x4d\xf9\x7f\x81\x20\xc6\xd9\xc4\x5d\x2c\xb9\xda\xa0\xbd\x17\x06\x88\xb3\x0b\xd1\x84\xef\x19\x03\x53\x9d\xa0\x44\xd9\x3e\xe0\x10\x71\xe2\x7b\x22\x51\x21\x48\x42\x52\xc2\x92\xc0\x1e\x36\x6c\x45\x7f\xf8\xfd\x93\xcc\xf7\xb0\xd3\xd7\x9c\x69\x32\x8e\xdc\xeb\x2b\x96\xd2\x04\x1b\x1e\x64\xbb\x59\xd7\x24\x0c\x56\x4d\x2b\x63\x62\x88\x81\x1b\xe0\xb2\xa5\x24\xc2\x74\x77\x16\x25\x31\x48\xfc\x6b\xb9\x24\x19\x51\x26\xe2\x16\xe2\xfa\xb1\x32\xad\x04\x4c\x43\x79\xac\x1c\x61\x84\x4f\x3a\x61\xb2\x84\x76\x21\x5a\x35\x56\x28\xe5\xa4\x8e\x57\xc4\x12\x7d\x7f\x75\x81\x5e\xa3\x97\x7a\x7e\xaf\xc0\xc7\xb2\xc2\x34\x24\xb6\x2b\x6e\xbc\x30\xfb\x72\xf5\xca\x01\x87\x65\x00\x7d\x22\x2e\xcc\x31\x9c\x21\x16\xf2\xf9\x40\xb7\x18\xbb\x42\xad\xee\xb8\x18\x63\xeb\x99\x03\xa3\x4d\x9b\xd0\x03\xe4\x1c\x1a\x27\x4c\xe8\x3e\x72\x0e\x40\x1c\x26\xf4\x11\xe4\x1c\xcd\x92\xbe\x97\x44\x8c\xe0\x48\xdf\x1f\x95\x23\x35\x45\x00\x4d\xb5\xed\xd5\x1b\xd2\xcc\x89\xc2\x29\x56\x18\xd1\xd0\x76\x94\xac\xd1\x11\xe4\xd7\xb0\xc1\xc7\xe3\x57\x92\xbc\xa7\xac\x7c\x34\x2e\xb2\x31\x2a\xe4\xed\x25\x7c\x88\x12\x37\x79\x40\x38\x2e\x8a\x8c\x9a\x00\xe1\x76\x1e\x65\x00\x33\xe6\x90\x37\xd3\x63\xfa\x04\x1f\x38\xca\x38\xcb\xb8\x66\x95\xfa\x56\xc7\x2c\xe5\x79\x00\xec\xfe\x04\xb5\xc0\x44\x70\xb2\x69\x5a\xd8\x7b\x88\x65\xd4\x25\xf5\x4f\x7e\xed\xc5\xa9\xce\x19\xd9\x92\x60\xda\xcd\x7e\x76\xad\x7e\x5f\x0b\x4e\x6e\x07\x00\x00\xca\xf0\x92\x64\xe6\xf2\x30\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xf0\x6c\x4c\x30\xd2\x27\x9e\x81\x7f\x0b\x57\x8b\xd1\x00\xbe\x92\xb5\xc0\x6b\xf1\x6b\x01\xb9\xbe\xb5\x16\xd0\x77\xbe\x8e\xb5\x94\xc1\x9b\xa8\xb3\x16\x7d\x71\xb5\xd7\x02\x37\xc8\xd7\xb0\x96\x08\xb5\xfe\x81\xb2\x94\x3f\xc8\xf1\x4c\xf7\x07\xf3\xa1\xe3\x0c\x89\x66\x3d\x8a\xb2\xb5\x6c\x32\x5e\x1c\x34\x96\x36\xf5\xd4\x3e\xce\xeb\x8c\xf3\x55\x3e\x75\x97\x47\x05\xa0\x3b\x81\xab\x94\xd6\x3f\x73\xc0\x45\x1a\xa2\xf8\x28\xde\x78\x74\x0e\xb8\xce\x25\x3e\x17\x1a\x96\xa2\x38\xbb\x2d\x46\xb5\x3d\xfb\xee\xc3\xed\x59\xfb\x63\x4d\xb8\x0f\x90\x72\xaf\xd7\xa3\xff\x8e\x70\x9a\x53\x29\xc3\x26\x69\xc0\x2f\x59\x42\x3b\xba\x97\xce\x47\xb1\xa6\x6a\x53\x2e\x17\x09\xcf\x1b\xee\x8a\xb9\xa4\x6b\x79\x6a\xa9\x6c\xae\x67\xff\x6a\x00\x2e\x65\x19\x65\x0d\xa3\x03\x24\xb0\x5b\xa1\x0e\x26\x98\x54\x2b\x00\xd4\x9b\x4c\xd3\x01\xa0\xc6\xca\xdb\x83\x00\x93\x5d\x4a\x49\x96\x5a\x43\x84\x09\xc7\xd6\xe7\x39\x2b\x36\x78\x0e\x17\xc6\x00\x70\x9b\x33\x06\x7a\xfd\x86\x33\x6e\x7d\xe8\x26\xe6\xd8\xaa\x52\xc6\x2e\x01\x93\xb0\x27\x47\xcf\x65\x00\x70\xd3\xf2\x71\x14\xd6\xd6\xa5\x9e\xeb\xc1\xc0\xfa\x01\x0a\x02\x04\xda\x8c\xb9\x46\x34\xce\xc0\xca\x7a\x37\xd2\x08\xdf\xbf\x86\x7d\xa8\x34\x9e\x91\xe8\x07\xcd\xc7\x7e\xa6\xb9\x8d\x63\xc2\xbd\x9a\xd0\xc0\xa2\x3a\xb5\x57\x7a\xb5\x21\xfd\x4a\x5b\x23\x1a\x3c\xbe\x5d\x7d\x69\x48\x2b\x1a\x00\xd9\x27\xec\x3e\x49\xd6\xed\x07\x7a\x04\x79\x17\xf5\xc9\xbc\x7b\xf4\xbc\x24\xca\x92\x33\x10\x6c\x8e\x77\x68\x39\x74\x5c\x52\x2a\xc1\xac\x09\x4e\xe9\x26\xf1\x7e\x6a\x12\xd2\xb1\xe9\xf4\xc9\x8e\x79\x13\xd8\x1a\x9d\xd5\x7d\xdb\x78\x1f\xd1\xae\x29\xea\x86\xa7\x26\x64\xbc\x0a\xca\xf5\xf6\x3f\xb4\xa1\xeb\xf4\x67\x77\xf7\xd7\x92\x05\xe3\x26\x66\xa2\x19\x47\xee\x1a\xcc\x9a\xa6\xa9\x1e\x98\xd6\xa2\x6b\x9b\xaf\xb6\x66\x61\xac\x5c\x1b\x2a\x9b\xc9\xe1\xb3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x0c\xfd\x77\x29\x15\xc2\x95\xfb\xb9\xd5\x73\xa2\x8a\x39\x06\x72\x4a\xbc\xd6\x14\x97\x8b\xa5\xb8\x9e\xcc\x96\xa6\x04\xa5\x74\xb5\x22\xce\x2d\xbe\x24\xa8\xc0\x02\xe7\x44\x81\x1b\xc5\xa0\x16\xba\xf0\x32\x3f\x31\xf0\x15\xc2\xae\xd7\x6d\x15\x01\x37\x33\x3e\x5a\xaa\x50\x4e\xd7\x1b\x23\xeb\x20\x8c\x32\xce\xd6\x10\xd1\xa7\xa7\x90\x71\xec\x3b\x89\xc0\x1c\xb8\x40\x0f\x58\xe4\x08\xa3\x04\x27\x1b\xb0\x12\x62\x86\xd2\x52\x40\x82\xa7\x22\x38\xdd\xcd\xa5\xd2\x7a\xb6\x96\x8e\xc0\x94\x66\x30\xe0\xf5\x42\x77\x3a\x61\x00\xbe\xa8\x89\x44\xd6\x77\x49\x75\x4c\xac\xaf\xc0\x09\x07\x4d\xf2\xf3\x40\x6f\x1d\xb0\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\xdf\xbd\x39\xa5\xf4\x77\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xa7\x94\x7e\x78\xa6\x94\xfe\xf1\x73\x9b\x52\xfa\xa7\x94\xfe\x29\xa5\xbf\xf1\x4c\x29\xfd\x9d\x51\xa6\x94\xfe\xaf\x23\x59\x6f\x4a\xe9\x77\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\x90\x0b\x2d\xa5\x9e\x54\xcb\x98\xac\x03\x6b\xc0\x6f\xc4\x2a\x2e\xcb\xd5\x4a\x6b\xa8\xdc\x7b\x59\xeb\x11\x3b\x96\xe8\x2a\xf7\xad\x72\x74\x59\x6b\xb2\x24\x6a\x06\x69\x0d\x26\x4c\x67\x1c\x50\x1b\x48\x09\x69\x8d\x82\x48\x48\x03\x60\xe8\xf2\xe3\xbb\x45\x23\xe9\xc1\x6b\xca\xf4\xa6\x42\x0c\xc5\x1c\xc3\x6c\x3e\xb2\x24\xc6\x29\x59\x23\xb6\x2f\x12\xd4\xe2\x37\xc9\xb8\x34\x31\x05\x00\xda\xe7\x9a\xda\x60\xc6\x88\x93\x3a\xa8\x02\x59\x79\x49\x08\x43\xbc\x20\xcc\xf8\xa1\x5c\x5b\x06\x84\x95\xc2\xc9\x66\xa1\xc7\x67\x41\xa8\x2e\x3b\xb4\x1a\x5d\xb3\x5e\x82\x73\x83\x5c\x41\x72\x4c\xcd\x00\x08\x27\x82\x4b\x89\xf2\x32\x53\xb4\xa8\x86\xf0\xed\x18\x81\x18\x20\x13\x99\x55\x21\x0c\x1c\x0b\xc4\x98\xe2\x21\xa6\xdf\x6e\xac\x74\x4b\xe0\x6c\x30\xf0\x1a\x64\xa3\x19\x24\xb4\xe7\x85\xda\x19\x97\xab\x71\x3c\x51\x21\x15\x4a\x32\x0a\xd7\x3f\xcc\xce\xe4\x84\xc2\x28\xb3\x80\x53\x5f\x41\xae\x28\xac\x55\xda\xc5\xb2\x14\x6e\x8d\x42\x49\xe3\x68\xac\x87\xb1\x03\xa4\x54\xda\x3b\x5a\xfa\x3c\x13\xd8\xf5\x0e\x31\x9b\xed\xd6\x0a\xdb\x9d\xc2\x10\x6e\x4c\xfb\x53\x63\x90\x01\x2c\x40\xca\x93\x55\x94\xea\x43\x05\x29\xc6\x2e\xcf\x67\xd6\xea\x33\x52\x54\xc9\x72\x6a\x83\xfd\x95\x16\xdc\x41\xb4\xb3\x05\x22\x60\x64\xab\x69\x96\x24\x44\x8b\xd0\xb8\x73\xc2\xcc\x70\x07\x1d\x25\x45\x44\x4e\x19\xb8\x65\x3f\x10\x29\xf1\x9a\xdc\x78\x0d\x3c\x3e\xb1\x09\x6c\x3c\x35\xaa\x81\x10\x32\x90\xa1\xea\x5f\x6a\x97\xd8\x89\x8f\x21\x34\xa6\x82\x72\x33\x97\x2a\x06\xf0\x41\x50\xa5\x75\x2a\x2a\x4d\x2e\x1d\xd8\x35\xf7\x03\x2e\xfd\xa0\x9b\x4e\xb8\x0f\x0e\x74\x0d\x52\xf3\x77\x96\x1a\xc7\xd5\x92\xa0\xa5\xa0\x64\x85\x56\x94\xe1\xcc\x7a\xa0\x7c\xf4\x05\x39\x22\xd8\x08\xd4\x52\x6a\xd1\x94\x33\xe7\x58\x71\x6b\x58\xa0\x1f\xec\x22\x94\x28\x59\x82\x07\x73\x96\x19\x4f\x09\xa2\x2b\xb4\x06\x6f\x97\x30\x0e\xf5\xdf\xbf\xfe\xf7\x3f\xa0\xe5\x4e\xdf\x88\x60\xa8\x54\x5c\xe1\xac\x42\x53\x46\xd8\x5a\xef\x01\x30\x08\xdf\x59\xc8\xb2\x66\xfa\xa5\xc3\x2c\xd4\x55\x31\x4b\x7f\xf3\xed\xfd\xb2\x7d\xa5\x9f\xa6\x64\x7b\xda\xd8\x97\x79\xc6\xbd\x71\x29\xdd\x66\x38\xfd\x97\xef\x80\x78\xd9\x43\x90\x50\x7c\x21\x82\x24\x5d\xf2\x13\xda\xf0\x07\x93\x83\xd9\x43\x51\xb5\x4b\xbc\xe0\x45\x99\xf9\xbb\xf6\x20\xf4\x4e\x53\x31\xe0\xa9\xb4\xb7\x43\x2b\x9c\xb1\xf7\xe4\x80\xa2\x6f\x01\xfb\x79\x5d\xf3\x86\x37\x2e\x4e\x37\x3d\x6e\xe3\xa1\xac\x92\x5b\xe5\x3e\x95\x82\x2c\xd0\x3b\x9c\x65\x4b\x9c\xdc\xdf\xf1\xf7\x7c\x2d\x3f\xb2\x4b\x21\xbc\x62\x40\x6b\xde\x19\xd6\x7c\x79\x53\xb2\xfb\x76\xab\x85\x8c\xaf\xb5\x1c\x57\x94\xca\x45\xac\x34\x56\xe5\x01\xec\x66\x0a\x67\xbc\xba\x04\xb0\xed\x65\x53\xc3\x26\x8f\x40\x57\x10\xf0\x84\x19\x22\x7a\xae\x3e\x4c\x6b\x8a\x6e\xce\x45\x36\xc9\xf2\xdb\xd7\xbf\xff\xa3\x21\x7d\xad\x5d\xfc\xf1\x35\x38\xff\xe5\xcc\x30\x17\xcd\x19\xfd\x1c\x5a\xe6\x38\xcb\xb4\x22\xd1\x24\x6a\xbd\xad\x8b\xd8\xde\x4d\x43\xd4\xaa\x62\x08\x33\x5a\xb8\xbb\xbb\xfb\x5b\x40\xb2\xa3\x4a\x92\x6c\x35\x33\xb1\x77\x55\xbe\xed\x09\x5c\x14\x27\x96\x77\xe9\x5b\xbd\x7b\x35\x1c\x26\x66\x6d\x79\x56\xe6\xe4\x82\x40\xd3\x95\x88\x65\xb6\xde\x77\x11\x1b\x99\xed\x8f\xb6\xcc\x78\x72\x8f\x52\xfb\x47\x98\xac\x67\x99\xe0\xb5\xb2\x21\x3d\x0d\x5d\xb0\x8a\x02\x82\x00\x3c\x17\xc9\xf3\xd4\x8e\x5b\xcd\x39\xb7\xfc\x6d\x39\x2e\x0a\x68\x34\xb6\x82\x04\xa1\x07\xb3\x80\x80\x8e\x05\x10\x6c\x27\x1d\x7c\x9c\xee\x5b\x06\xa8\xff\x42\xee\x59\x4f\xfd\x89\xdb\x80\x02\xfe\xdb\xc4\x8b\x8c\x48\xad\x43\x75\xd8\x5e\xb5\x36\x73\x63\x68\xcc\xc0\xc9\x7c\x72\x1f\x9e\x51\x7d\x8f\xc0\xac\xd0\xe8\xf4\xd4\x8c\x57\xc6\xa8\x20\x42\x42\x73\x38\xf5\x19\x76\xf4\x3c\xc3\x34\x94\xd1\x85\x50\xdd\xf0\xe8\x69\xcb\x18\xee\xc0\x53\xef\x89\xf7\x95\x80\xb7\xef\x89\xbd\x79\x0c\x81\x43\x32\x7e\xcc\x19\xbe\xe1\xa9\xfd\x04\x0e\xa9\x29\x5c\xd0\x23\x6a\xc9\x88\xdc\xf7\xa3\xb7\xc7\xfb\x5c\xaf\xa5\x7d\x56\xf5\x2f\xd5\x61\x35\x6f\xd9\xa3\xe8\xdd\xdb\x23\x1d\x51\x18\x7a\xd4\x09\x85\xb3\xd9\xe8\xb8\x55\xdf\x07\x2d\x11\xda\x6c\x42\x90\x82\x6b\x51\xc6\xca\xc4\x0b\x64\x6c\xda\x1a\xeb\x16\x2c\x3a\x79\x7b\xf2\xe4\x73\x6a\x16\x29\x78\x81\xd7\x03\xa5\xa3\xf6\xd6\xba\xff\x21\x4a\x89\x11\x30\x88\x04\x21\x0d\xfe\x0e\x6e\xa3\xe0\x42\x0b\x0b\xc1\x75\x76\x72\x3e\x3e\x6b\xa6\x75\xe8\xb3\x22\x88\x09\x0e\x7e\x08\x7a\xb1\x11\xc2\x82\x97\x2c\xb5\xfa\x79\x65\x08\xf9\xb0\x37\xe1\x6b\xce\x40\xc8\x31\x39\x48\x81\xb0\x55\xf3\xb4\x62\xc4\x35\x87\x79\xb3\x78\xf3\xfa\x97\x65\x93\x77\x7b\x0d\xf1\x34\x46\xae\x2b\x36\x69\xce\xc6\x93\x67\xe4\x0a\x6c\x44\xcf\xea\x83\x55\xda\xea\xfa\x19\xd4\x55\x15\x80\x9f\xb4\x32\x46\xa2\x4a\xe1\x21\xf4\x12\x44\x1a\x2d\x0b\x36\xb2\x12\x5e\x8d\x2a\x03\x13\x97\xd6\xae\xf5\xbb\xe5\x93\xce\xb6\x39\xc4\x86\x68\xfb\x74\xe1\x30\x35\xd9\xaf\x7b\x8e\x79\xab\x8b\xdc\x0b\xf4\xd2\xbc\x79\x22\x21\x16\xf5\xd5\x93\xb7\xd7\x2e\xfb\xf2\xb1\x08\xe6\x51\xb6\x96\x7e\xf9\x58\x60\xd0\xa1\x8b\x21\x1c\x0c\x08\x1d\xed\x5b\xc6\x8f\x83\x3f\x93\x0d\xde\x12\x88\x93\xa5\x19\x16\xde\x4c\x02\x0b\x97\xa3\x5b\xb3\x2a\x68\x76\x4b\xd8\x96\x0a\xce\xc0\x4f\xb5\xc5\x82\x42\x4e\x11\xb4\x22\x24\x4c\xcb\xa7\xbf\x7d\xf9\xf9\xec\x13\xf8\x07\xc2\xd9\x6e\x26\xf7\xc0\xae\xbc\x94\x10\x83\xb0\xb7\x82\xc6\x50\xf5\xc6\x0d\xcd\xb5\x67\x53\xdd\xfc\xf5\xae\x00\xaf\x73\xeb\xd1\x73\xc8\x4b\x55\x62\x7f\x36\x85\x79\xc8\x63\x92\x95\x92\x6e\x9f\x7a\xfe\x87\x25\x9e\xea\x56\xfc\x02\x02\x8f\x0d\xe9\xbe\xa0\x1e\xda\xed\x6f\xb8\x7b\x22\xbb\xb1\xe0\x60\xd6\x63\x5c\x0d\x77\x3d\xed\x35\x2e\x9f\xc8\xaa\x36\x4e\x33\x95\xd5\x2a\xae\x36\xe5\xc2\xab\x05\x55\x75\x21\xd3\xae\xd9\x1d\xf2\xb3\x8e\xa3\xc2\xfa\xf7\xd2\xb3\x47\x81\xdd\xf1\xed\x0b\x61\x2b\x2e\x12\x92\xea\x6b\x48\x16\x38\x21\xef\xf1\xb2\x5b\x05\xa0\xcd\x4d\x7a\x3f\x71\x90\x24\xd4\x9b\x05\xa7\x35\x73\x2f\x98\x7c\xed\xce\x74\xf9\x0a\x71\x41\xd7\x94\xd5\x35\x1b\x70\x46\x84\x49\x18\xce\x89\x12\x34\xa9\xea\xb3\x42\x9a\x5c\x62\x62\xcc\x8d\x95\xad\x1f\xa6\x71\x6b\x35\x7d\x1f\x4b\x52\xa9\x23\x66\x32\x56\xd1\x32\x68\xaa\x06\x80\xae\xd7\xd5\x08\xbd\xd8\xeb\xd9\x26\xa2\xc7\x03\x69\xe4\x8a\x29\x22\xb6\x38\x8c\x3a\xf7\x92\x96\x41\x1e\x08\x61\xad\xf0\x8b\x1a\x56\x27\x6e\xd5\x3f\xbe\x6d\x4f\x7c\x23\xc8\x8a\x3e\x06\xc7\xbe\x6b\x76\x33\xfe\xfe\xd3\x7b\x40\xc2\xdd\x06\x33\x2e\xd1\xa7\x32\x83\x32\x72\x52\x61\x60\xb1\x55\xdf\xed\x2d\xa6\x99\xe6\xbf\x1d\x3c\x97\x2c\x6d\x2a\xfe\x8c\x24\x44\x4a\x2c\x76\x9a\x41\xae\x09\x23\x02\x2b\x7d\x2a\x84\x3e\xae\x7a\x34\xd9\xf3\x6e\x07\x28\x5d\xed\x4d\xc8\xb9\xc1\x44\xd5\x38\x14\x12\x3a\x40\x5c\xba\xb8\xbe\x35\x4d\x6c\x63\x71\xb5\x16\x45\x72\x0b\x71\x8d\x77\x99\x3c\x87\x23\x1c\x44\xd8\xc9\x77\x9f\x6e\xce\xed\x07\xef\x6f\xcd\x07\xf5\xd1\x37\x0a\xfc\xfa\xd3\xcd\xb9\x0d\x96\x0c\xdd\xa2\x76\x55\xff\xa3\x24\x82\x12\x61\x3d\x09\x82\x24\x5c\xe8\xbb\x49\x94\x19\x01\x3f\xca\x02\x5d\x73\x45\xde\xa2\xf3\x52\x08\xc2\x14\x64\x0e\x65\xfd\xe6\xe8\xf3\xb3\x77\x34\x23\x33\x74\x4e\x84\x32\xff\xa5\x0f\xcd\x5f\xc9\x0e\x0c\xa3\x20\xeb\x9a\x90\xaf\x2a\x06\x64\x81\x3e\xe0\xa2\x4a\x3b\x3d\x39\x99\xcf\x35\x42\xe6\x66\xf2\x73\x95\xc9\xf9\xff\x75\xd2\xb5\x0a\x9f\xbf\xbf\x42\x58\xac\x65\xc7\x60\x1c\x52\xc0\x12\xdc\xc7\xde\xdb\xa1\x82\xaa\x4c\x2a\x45\xc8\x5d\xcd\xe7\x67\x28\x21\x42\x35\x03\x08\xc1\xee\x89\xc5\x9a\xa8\xde\x60\xee\x21\x35\xd0\x6c\xd7\x07\xec\xad\xc7\xb6\x7f\xe3\x98\xb7\x9b\x13\x03\x07\x57\xfc\x8c\x62\x66\xa5\x9f\x7b\x12\x2f\xa1\xeb\xa3\x7b\x4f\x76\x26\x3e\x3e\x23\x49\x30\x80\xf2\xf8\x6a\xcb\xc9\x75\x23\x6a\xc4\x0a\x62\x6a\x74\x04\x21\xdf\x12\xb1\xa5\xe4\xe1\xd4\xde\xe5\x73\x2d\x87\xce\x0d\x17\x96\xa7\xc0\x9e\x4f\xbf\x81\xff\x09\x0a\x4a\x26\x92\xe9\x2c\x4d\xad\x2e\x59\x4a\xb2\x2a\x33\x4b\xf1\x0b\x84\x0b\xfa\x99\x08\x49\x39\x9b\xa1\x7b\xca\xd2\x19\x2a\x69\xfa\x5f\xa1\x70\x9f\x28\x7c\x71\xe7\x50\x8b\xc5\xd9\x2d\x88\x25\xbb\xaa\xfe\x32\x90\x77\x45\x5e\x5c\x40\x39\x65\xbd\xa7\x83\x6d\xbb\x97\x50\xc6\x8f\xb2\x60\xcc\x67\x54\x25\xb0\x41\xd1\xf0\x9e\xf8\x84\xd4\x41\xb9\x4f\x92\x44\xf8\x03\xdf\xda\xa8\x81\x57\xbf\xd2\x23\x66\xa9\xdc\x2c\xa7\x3e\x70\xc0\xdc\xad\x09\x67\x68\xb7\x5c\x4f\x7d\x0b\xe3\x9e\x04\x93\xd9\xa6\xe3\xfa\xb5\x1e\x57\x4b\xa7\xff\x6a\x67\x35\xf8\xe7\x04\x6b\xf9\x61\xf0\xf6\x76\xde\xd4\xe6\xa5\x6d\x35\xa1\x1b\xc1\x73\x8d\xc3\xb2\xe9\x4d\xf3\x44\xfb\x46\x9e\xf7\xe0\x96\xeb\xb1\x23\xa4\x0d\xd1\x23\x6e\xd8\x58\x15\x98\x3d\x78\x4c\x27\x81\x63\x12\x38\x3a\xcf\x3f\x31\x07\x9b\x04\x8e\x49\xe0\xe8\x3c\xd3\x71\xfd\x5a\x8f\xeb\xaf\x52\xe0\xb0\xf6\x8b\x51\x22\x47\xe7\xe2\x0e\xc8\x1e\xbd\x73\x7e\xaa\xd0\x41\xc1\x6a\x27\xc8\xed\x3d\x2d\x3e\x13\x41\x57\xbd\xe7\xbe\x35\xff\x0b\x53\x65\xca\x0e\x09\x73\xa7\x2b\x13\x12\x57\x17\xb2\xf6\x4f\xc4\xb7\x7b\xf7\xc6\xe2\x73\x08\xfa\x34\x81\x7d\x11\xec\xdd\x93\xdd\xad\x97\x7b\x0f\x70\xee\xbe\xf9\x1f\x41\x6c\x0b\x70\xee\x43\xb9\x76\xa8\xf0\x58\x3c\xc7\x1e\xe4\x3e\x21\x4e\xfd\x75\x72\xe9\xa3\x72\xe8\x41\xfc\x0c\x71\xe6\x03\xb9\xf2\x30\xe7\x1d\xe2\xba\x21\x8e\xeb\xe3\xb6\x41\x56\x6a\x2c\xb9\xbe\xa2\x87\xfb\x65\x75\x21\x7c\x73\x0b\xbc\xab\x8a\xd9\x80\x90\xad\xa7\x9d\x6e\xef\x0c\xc1\x2f\x36\xe0\xa0\x00\x23\xf9\x9e\x2b\x0d\x7d\xff\xe9\x7d\xb4\x89\x1f\xbe\xb8\x29\xb3\xcc\x6c\x5a\xe7\xb0\xb7\x9b\x3f\xb1\x8a\x38\xaa\x48\xc8\x86\x9b\x19\x0e\x35\x40\x71\x0c\x52\x6a\xf4\x54\x7e\xa4\x0e\x5e\x1a\xf2\x64\x51\x66\x99\xe1\x56\xb0\x24\x98\x96\x4d\x1d\x10\x64\x4d\xf5\xcc\x89\x44\x92\x98\x2a\x35\xfd\x47\xae\x94\x44\xcc\xd7\x25\x4d\xc9\xa9\xf9\xfe\x1b\xe3\xea\xdc\xe9\x53\x07\xbf\xe8\x51\xec\x14\xe7\x9c\xcd\xf1\xbc\x1b\x2f\xe7\x89\xdf\x6a\xd7\xf1\xe6\x09\xce\x3e\xc2\x8e\x7d\x72\xcb\x77\xbb\x20\x11\x61\xbc\x5c\x6f\x80\x43\x88\x1c\xbb\x82\x63\x59\x6f\xeb\x90\x1d\x2f\x91\x8d\x97\x6d\x30\x99\x84\xa4\xce\xd9\x66\x43\x1d\xbb\xc8\xec\x52\x59\x98\x63\xfb\xb9\xde\xd7\xc8\xf3\x8e\xc8\xf1\x82\xfc\xee\x00\xff\x2f\x65\x54\x55\x8e\xf6\xf0\x79\x39\xb9\x6a\xbd\xeb\x6a\xee\x58\x77\x6f\x1b\x50\x23\xdd\xb6\x87\xf8\x56\x50\x87\xc0\x14\x1b\xe4\x92\x40\xe3\xc1\x46\x65\x45\xb2\x58\x2f\xd0\x8a\xa8\x64\x53\x9d\x40\x7d\xa8\x28\xd3\xeb\xea\x0b\x7e\xaf\x62\x20\x0d\x0b\x31\xce\xc3\x56\x13\x4d\x73\xf6\x2a\xf7\xa7\xed\xa0\xb9\x40\x67\x6c\x67\xa2\xdf\xbb\x5b\x67\xcb\x24\x42\xd9\x57\xa8\x64\xa7\xc1\xf0\x15\x34\xfb\x6c\xae\xd5\x38\x4b\x33\x82\x4d\x51\x6e\x97\x79\x84\x78\xb7\xef\x84\x2d\x59\xf9\xd4\xe2\x0b\x7a\xf8\xba\x1b\xa5\xec\x76\xba\xfc\x5e\xf6\xec\x08\x74\x4b\x65\x3b\xe0\x51\x09\x96\x2e\x16\x0f\xb2\xbb\xac\x1c\x02\x38\x87\x4f\xbb\xe8\x20\x4c\x51\x41\xb2\x1d\xe2\xa5\xaa\x0f\x71\xc2\x4d\x27\xad\x07\x17\x8f\x9c\x63\xda\x4e\x63\xb1\xfe\xc7\xde\xfc\xb2\xe5\x0e\xa5\x1c\x2a\x93\xf1\x19\x30\x0f\x93\x54\xe6\xa2\x9b\xc1\x2b\xbf\xc1\x5b\xca\x4b\x61\x4a\xb9\x0a\x82\xef\x11\x56\xb0\x8e\xde\x3e\x36\xfa\x64\xf2\x12\xa2\x2c\x69\x42\x3a\x4e\xcb\x18\x76\x78\x56\x65\x09\x16\x45\xa6\x05\x74\xda\xcc\xbb\x33\x73\xd3\x73\x75\xd5\xb7\x5c\x3b\xd3\xde\x78\x56\xac\x4f\xc0\x58\xe6\x86\xc5\x3a\xaa\xcb\xf4\x99\x58\x97\x39\xa4\xbc\x58\xf2\xaf\xcb\x13\xdb\xde\x64\x3c\xb9\x77\xf7\xa8\x3f\x01\xeb\xfc\xc3\x85\x0b\xa3\x34\x99\x26\x75\x02\xaa\xad\x71\x9a\x2e\xd0\xe7\x83\x02\xb1\x06\x43\xb0\xf6\x63\xb0\xae\x56\x20\x1b\x9b\xb1\x3c\x40\xeb\x2a\xa4\x82\x48\x9e\x6d\x5d\x45\xfb\x6a\x66\xee\xbe\xa6\xac\x28\x95\xe5\x95\x2e\xa4\xc1\x03\xb3\x64\xc9\x06\xb3\xb5\x8b\x2d\x69\xac\x0c\xc9\x1d\x53\xf8\xd1\xf1\x28\x22\x13\x5c\x54\xa9\x33\x28\xe5\xa5\x7f\xa2\xbf\xfd\xed\x0c\x51\xf2\x16\xfd\xb6\x01\x6e\x81\x2e\x2d\x84\x06\x22\x1b\x89\x84\xcb\x1a\x61\xbe\x80\x26\x41\xd6\x58\xa4\x19\xe4\xec\xaf\x5a\xa2\x6a\x15\x2d\x47\x1e\xa9\x54\x90\x92\xc3\xb8\x6a\x04\x23\xf9\x56\x3f\xae\xc1\xb8\x69\x8e\x6b\xd8\xf1\x3c\xc5\x0a\xcf\x1b\x47\xe5\xd4\x48\xc5\x73\x5b\x4b\x73\x8e\x2d\x91\x36\xda\xe7\x7e\x63\x1b\x8f\xce\x71\xf5\x16\xd5\xe2\x0b\xd4\x9e\xec\xbf\xf6\x82\x71\xe8\x83\x3a\x40\x38\x28\x2d\x58\xf8\xb4\x7d\xe2\x2e\xeb\x4e\x48\x00\x0d\x02\x36\xea\x02\xc7\x55\x86\x89\xad\xa2\x79\xe7\xcd\x23\xdc\x3b\x99\xe8\xf2\xfa\xee\xd3\xdf\x6e\x3e\x5e\x5d\xdf\x0d\x1e\x45\x0f\xc4\x81\x03\x1a\x73\x14\x3d\x90\xfd\x07\x74\xf8\x28\x7a\x40\x06\x0e\xe8\xf0\x51\xf4\xb3\x05\xef\x01\x8d\x3e\x8a\x1e\xd8\x9e\x03\x1a\x7f\x14\x3d\x70\x3b\x07\xf4\x57\x7e\x14\x09\xdb\x46\x1c\xc3\xf7\x56\x59\xeb\x0b\x14\xde\x2f\x22\x39\x98\x48\x72\xf4\x44\x98\x4b\xb6\xfd\x8c\x45\xdd\xa2\x16\x32\x90\x7b\x63\x9a\xed\x0b\x5e\x43\x09\xb0\x92\xf3\x63\x64\xc2\x8c\x32\xe7\x37\x75\xa6\xbe\x79\xd7\xc5\x99\x42\x4d\xc5\x11\x3a\xff\xf1\xea\xe2\xf2\xfa\xee\xea\xdd\xd5\xe5\xa7\x27\x3b\x24\x06\xcb\x46\xb6\x19\xf5\x18\x6e\x18\x5c\x44\xcd\x29\x0b\x41\xb4\x24\x2a\x9d\xd9\xc7\x43\x7e\x74\xb8\x8c\x4e\x3b\x2d\x46\xcb\xb2\x52\x2b\x98\x49\x3f\xba\x4d\x95\x88\x30\xaa\xe3\x19\x72\x8b\xf5\x06\x61\x8e\x65\xcb\x96\x01\x07\x61\x3e\x0b\x73\x36\xcf\xe1\x2c\x3a\x3c\xe3\xb6\x24\xd5\x4e\xee\x08\x96\x91\x8a\x27\xeb\x77\x82\x07\x1a\xe0\xee\x9b\x28\x41\x75\xad\xac\x74\x7d\x14\x73\x22\x0d\xdc\x70\xf9\xa4\x06\xe3\xb3\xe2\x46\x55\x12\x48\xff\x0e\xa9\xe3\x21\x08\xb1\xe5\x68\xab\x88\x88\xbf\x92\xdd\x27\x32\x50\x0d\xab\x63\xff\xcf\x48\xa2\x39\xa8\x33\xba\xe3\xda\xa7\x3d\x54\x44\x72\x4c\xb9\xdc\x01\xc7\x6d\xef\xdc\x46\xc5\x48\xb8\x67\x54\xa9\xdc\x83\x8a\xf8\x7e\x25\x26\xaf\xf6\x33\xd6\x00\x16\x05\x74\xc8\x71\xeb\x9e\x51\x38\x8f\x71\xe4\xba\x67\x74\xfc\x45\xd4\xb2\xe2\x3d\x0c\xdd\x45\x0e\xe5\xcc\x99\x27\xbe\xd0\xb1\xdf\xe7\xdb\x1e\x37\xa2\x82\x31\xec\xf5\xd8\xf3\x7f\x52\x33\x00\x93\xbe\x59\x95\xae\x4b\xdf\x3a\xcb\x92\xac\x9a\x21\x2d\x34\x41\x0e\xd3\x4e\xeb\x75\xb0\x3e\xcf\xea\xdf\x20\xab\x44\x36\x7e\x00\x2e\x69\xb2\x32\x86\x41\xcb\x82\x24\x0b\xc6\x53\xa2\x0f\xe1\xcc\xfc\xd3\xde\xed\x67\x49\xc2\x4b\xa6\xec\x1f\xa0\xb0\xc8\x62\xc3\xa5\xba\xba\x89\x00\x6b\x5e\x2f\x78\x7a\x75\x33\x6b\xfd\xab\x1b\x97\xbf\xff\x8c\x61\x83\xf5\x39\x1c\x4d\xfe\xf6\xbb\xca\x31\x9a\x6c\x48\x8e\xe1\x3f\xdf\xe9\x8d\x0b\xe4\x9b\xb5\x1f\x2a\xeb\xe2\x3f\x0c\x2a\x9e\xe8\x7b\xbb\x5d\x2e\xff\xc5\xf6\xcd\x8b\xa3\x33\xdb\x95\x9b\xe6\xe8\xa5\x83\x6b\xdd\xb5\x77\x01\x2a\xad\xfd\xc1\x11\xd2\xa0\x7b\xea\xae\x58\x67\x37\x57\x68\x6b\xf0\x79\xe4\x65\xc6\x9f\xfc\x55\xe4\xae\x45\x9f\x7f\x2d\x8f\x6a\xc9\xe5\xdd\x13\xf9\x80\x83\xd3\xa9\x97\xf1\x16\x92\x65\x06\xf1\xe5\xbe\xb7\x65\x6c\xa4\xad\x34\x06\xad\x06\x24\x7a\x69\x7e\x5c\x24\x45\x39\xb3\x2f\x2c\x72\x92\x73\xb1\x1b\x3e\xa5\xf6\x75\x52\x6c\x48\x4e\x04\xce\xe6\x52\x71\x81\xd7\x90\x46\x6d\xc0\x1b\xb0\xd5\xbf\x0c\xe0\xe1\x53\xd9\x98\x60\x17\xba\xd1\x65\x92\x2a\x63\xa8\xce\xf7\x39\x26\x67\xa8\xb0\x3c\xdc\x53\xcf\x3c\xed\xed\xab\x9d\x25\x20\xd3\x54\x74\x08\x62\xac\x2d\x69\x11\x77\xe9\x57\x1e\x5b\x48\x19\x64\x5b\x2d\xf4\x06\x2a\x49\xd6\xcf\x28\x66\x90\xd2\x2d\x95\x7c\xa0\x51\x6d\xcf\x42\x6f\x5b\x1d\x48\x6c\xc5\x24\xe3\x38\x8d\x6b\xdd\x68\x1e\xf2\x58\x40\xc5\xbb\x8a\x56\xf7\xf8\xdf\x9b\x17\xc7\x5e\xb0\x1b\x69\xfc\xd6\x7e\x72\x2c\xa5\x3e\x99\x15\xfb\x3b\xf2\xbe\xc4\x73\x2f\x37\x95\x63\x31\x2f\xe3\x1f\x3b\x8e\x02\x63\x7d\x6d\x75\x89\x9b\x81\x4a\x03\xc8\x6a\x02\xfd\x41\x07\xed\xe7\x97\xd2\x79\x9e\x1a\xb4\xea\x9e\xd1\xc1\xab\xee\x99\xf4\xa8\x5f\x93\x1e\xd5\x09\xc1\x8a\x5a\xd7\xbf\x9c\x12\x15\xf1\xda\x70\x18\xef\xf3\x15\x77\x20\x6c\xeb\xb7\x64\xf5\x1a\xf0\x9d\x24\xd6\xa8\xcb\xd8\x6f\x02\x0d\xbb\x91\x5a\x85\xe8\x80\x41\xd5\x46\xda\xda\x25\x67\xee\xa6\x7c\xc0\x74\xdd\x32\x5a\xa3\x33\xe8\xc5\x67\x18\x14\x80\x75\xd6\x50\x41\x6c\x61\x7d\x53\x60\x94\x6c\xfd\x76\x7c\x68\xe3\xb9\x57\x23\xc2\xb6\xf1\xa0\x6c\x6d\x8b\x1c\x99\xfb\xc1\x1a\x1b\x29\xab\xea\x08\x7b\x60\x56\x62\x81\xaa\x9a\xea\x62\x29\x79\x02\xbd\x3d\xea\x3e\xb6\x50\x5a\xd2\x2e\x1c\x66\xae\xf0\xbd\x0f\x64\xb3\xa7\xee\x67\x0d\xb1\xc6\xe1\x72\x07\x75\x6d\xd9\xb6\xb2\xdb\x96\xc6\xc7\x64\x2e\x83\x40\x03\x56\x68\x5a\xda\x84\xfc\x1c\xde\x16\x4d\x74\xd6\x2a\xda\x70\xba\xc0\xfd\x54\x69\x0a\x18\x7c\x42\x3d\x21\x39\xee\xa9\x4c\x35\x3e\x5a\x8b\xb9\x5a\x2b\x53\xe7\x80\x98\xd0\xb9\x53\x6b\x43\x51\xfb\x2e\x3d\x82\xf9\x35\xe6\xf2\xfb\xba\x2f\xbe\xa3\x67\x74\xa0\x31\x97\x59\xec\x45\x36\xc2\x18\x38\xee\x62\x8a\xbd\x94\xa2\x2e\x91\xa2\xb7\x4e\x88\x77\x1d\xcd\x10\x59\x0a\xed\xe4\x57\x14\xd2\x39\x35\xa0\x82\x30\x13\xae\x87\x93\xcd\xe0\x25\x67\x59\x75\x6d\xbd\xaf\x9d\x88\xc7\x75\x14\x1a\x39\x72\xec\x01\xbc\xed\x93\x64\xa7\xd3\xf7\xaf\x73\xfa\xec\x06\x7f\xb1\xa3\xf7\x44\xd9\xaa\x37\x7a\xbe\x67\xe9\x27\x17\x8d\xc0\x22\x53\x1e\x67\x2c\xed\x34\x02\x4b\x4d\xdc\xb9\x67\x45\xed\xc6\xfb\x15\x9b\x50\xdc\x04\x06\xa3\x0d\x5d\x6b\xe4\x9b\x66\xfc\xe6\x66\x44\x39\x66\x78\x0d\x1d\x88\x7c\x68\xe2\x55\x5d\x2e\x2e\x90\x26\x63\x41\xd3\x4e\x79\x2d\x10\x91\x5c\x50\x2c\xfc\x51\xf0\x2c\xf3\x37\x3c\xcd\xe8\x3d\x41\x17\xa4\xc8\xf8\x2e\xb7\x11\x19\x29\xba\x55\x58\x69\x52\xbe\x25\xca\x67\x45\x1f\x20\xd3\x2a\xdb\x20\xba\x0a\xfa\xc9\x15\xec\x4b\x51\x66\x19\x2a\xe0\xa3\x05\x74\x0a\xe7\x2b\x74\x06\xd5\xaa\x66\xe8\x9a\x6c\x89\x98\xa1\xab\xd5\x35\x57\x37\x46\x98\xf1\xf1\xc4\xa6\x33\xda\x7c\x8e\xe8\x0a\xbd\xd5\x62\xb4\x54\x48\x99\x6e\x07\x8d\xe6\xfc\x5c\xb4\xc0\x7a\xa0\x56\x85\x1e\x9f\x10\x96\xe4\x27\xa6\x6f\x00\x52\x95\xc2\xe0\x31\xdd\x0d\x20\xbe\xea\x29\x13\x81\xf2\x33\xdb\x45\x5b\xd5\x11\xca\x8e\x06\x91\x29\x91\xeb\x0a\x18\x82\xb0\xea\xad\x4a\x2b\x88\x2c\x38\x93\xa4\x5d\xd7\xb4\xee\x8e\x05\x2a\x80\x8c\x96\x70\x87\x2f\x90\x82\x4b\x05\x5d\xf3\x63\x9b\x07\xdd\xb8\x0f\xa0\x8d\x06\xce\x32\x92\x22\x9a\xe7\x24\xd5\x5a\x41\xb6\xb3\xad\x51\x70\x54\x85\x69\x0d\xc1\x15\x5b\xbb\x32\x97\xd1\x06\xb3\x34\x23\x02\x2a\xde\x5b\xcd\xa3\xa5\xd1\xb8\xea\xf4\x41\xae\x6a\x6c\xd9\xb6\x35\x07\xc2\x49\xc2\x45\x6a\x9b\x43\x6a\xd5\xde\xc5\xce\x57\x67\x03\xf8\xf7\x20\xd7\x40\xa6\x98\x5c\x7b\x4a\x50\x13\x5c\x36\xba\x86\x6c\x38\xbf\x47\x09\xcf\x8b\x0c\x68\xf5\x78\x5d\x8f\x1a\x44\x5e\xf7\x38\xaa\x28\x63\x0e\x3d\xd9\x4e\x1b\xed\x8f\xe0\x87\xa7\x76\x52\x23\x8f\x24\x09\xdf\x8a\x2d\xea\xd0\x5c\x46\x23\x1f\x0a\x8a\x71\x56\x89\x18\x2b\xae\x99\x35\xc4\xe0\xc3\x29\x18\xb8\x11\x97\xa4\x66\x28\x0b\x74\xf9\x48\x92\xbd\xae\xdb\xb6\x77\x9d\xe2\x70\x9c\xc2\xa6\xbc\x78\x6b\x65\x30\x44\xd7\xbb\xe6\x73\xf3\x95\x2b\xb6\x6e\x81\x40\x8b\x02\xd3\x06\x1f\xc2\x76\x23\xec\x42\x8d\xb4\xa5\x6a\x17\xcd\x09\xe8\xd4\xa5\x0c\xb4\x08\x68\x3e\xcd\xf9\x40\xbb\x1a\xce\x15\x7a\x79\x72\x7a\xf2\xaa\x63\xd4\x88\x2a\xe7\xdd\x7c\xee\x1a\xb0\x29\xd4\x60\x2d\xb2\x1d\xac\xf6\x24\x9d\x21\xaa\x5c\x84\x8f\x28\x99\x5d\x59\x04\x50\x1b\xd3\x3c\x43\x92\x23\x25\x70\x4a\xed\x75\x0f\xbf\x42\xe5\x40\x51\x5a\x4e\xfb\xf2\xe4\x1f\x27\x31\x96\x47\xa2\x92\x57\xe8\x81\xb3\x13\x05\x68\x5c\xa0\x3b\x93\x40\x57\x0d\xb5\xe3\x25\x62\xc4\xe6\x04\x3d\x16\x19\x4d\xa8\x8a\xf0\xf0\x21\x60\x7e\x88\x97\xa6\x95\x92\xe6\xfb\x36\x1e\xfb\xf2\x91\x2a\xd7\xd4\x83\xaf\xd0\x6b\xd3\xdf\x89\x0c\xf0\xac\x0a\x05\x12\xfa\x50\x9e\x6e\x08\xce\xd4\xc6\xb4\xd5\x60\x9c\xcd\x7f\x26\x82\x43\xd4\x36\xb3\x7f\x19\xde\xa4\xa8\xce\xe3\x68\xac\xcd\x35\xae\x49\x74\xb4\xb9\x71\xb0\x09\x3f\x7a\xa6\x46\xfc\x68\x14\x6f\x18\x6e\x29\xd9\x9d\x67\x44\x53\xfe\xc8\x43\xfc\x2c\x8d\xf9\x51\x6c\x73\x7e\x34\x8e\x44\xa2\x9b\xf4\xa3\x83\x1a\xf5\x47\xac\x0a\x9a\x8b\x1f\xd4\xac\x1f\x8d\x39\x36\xa3\x9b\xf6\x47\x39\x14\x4c\x17\x97\xf1\x8d\xfb\xd1\x48\xcf\x1c\x1a\xe1\xb3\x42\xc7\x6a\xe2\x8f\xc6\x72\x1b\x34\xa6\x99\xff\xf0\x34\x63\x1b\xfa\x1f\x30\xcf\x58\x57\x0d\x8a\x6d\xee\x8f\xa2\x1b\xfc\xa3\x31\x5e\x66\x34\x82\x87\xc7\x34\xfb\x47\x47\x6e\xf8\x8f\xc6\xa1\x7e\xb8\x3d\x2e\x8a\x6b\x91\x8b\x46\xb6\xc9\x45\xe3\x5a\xe5\xa2\xfe\x04\x08\x81\x58\xd5\x8d\x55\x75\xda\xe5\x46\xec\x3b\xef\x78\xa7\x82\x2d\x73\x63\x28\xa9\xd5\x54\xf7\xc0\xb6\xb9\xe8\x29\xad\x73\xcd\x03\xd1\x7d\x11\xe7\xbe\x6d\x95\x83\x8f\x9a\x55\x12\xec\xcd\x6b\xf5\x3f\x57\x84\x22\xe6\x1a\x69\x5a\x3e\x34\xf9\x1e\x91\x6e\xe3\x98\xc5\x40\x83\x60\x34\xc2\xa9\x3b\xdc\x34\x1c\x1d\xda\x38\x7c\x00\x2b\xd0\x56\x7c\x7c\xf3\xf0\x41\xa8\x55\x6b\xf1\x51\x0d\xc4\xd1\x73\x4b\x7d\x47\x6c\x26\x8e\x46\x36\x14\x47\xbf\x16\xce\x19\xd1\x68\xfc\x57\xcc\x39\x7f\x59\xde\x12\xf1\x52\x21\xc8\xad\xe2\xde\x5a\xa5\x1d\x0b\xa3\x79\xdd\x63\x5f\x5c\x92\x15\x17\x24\xde\xc0\x58\x1b\x0c\x51\x5a\xc2\x49\xc4\x0c\x62\x9f\x9d\xae\xc8\x9b\xa6\xbf\x60\x8c\x05\x6a\xf4\x7b\xd5\x3a\x3a\x23\x52\x9e\x82\x29\xb1\x2c\x6c\xcb\x74\xdb\xa8\x73\xa6\xd7\x4c\x72\x58\xd1\x2c\x26\x4e\xd0\xb6\x15\x85\xd7\x89\x4a\x4c\x88\x89\xb3\x85\x5a\x4b\x8a\x43\x46\x7c\x07\xbf\x44\x60\xb9\x31\x4d\x33\xc9\x23\x55\xb6\x71\xac\x20\x58\x72\xd3\x0d\xa3\xd9\x1e\x95\x4a\x54\x60\x69\x8a\xa3\x84\x6e\x92\x7a\x62\x06\xdc\x0d\x4f\x4f\x4e\x64\x0b\xd4\x5a\xe0\x84\x68\x0d\x9c\xf2\x14\x41\x42\x42\xca\x1f\x42\xae\xad\x25\x59\x53\x26\xdd\xde\x9a\x32\x71\x86\x08\x34\x37\x27\x60\x61\x72\xf9\xef\x0b\xf4\xa9\x4a\xb6\x1b\xb6\xd4\xf2\x52\x25\xbc\x66\x12\x76\xe6\xfb\x86\x65\x08\x5b\x81\xad\x1f\xea\xa1\x53\x91\x53\xb3\xc1\xd1\x00\x0a\xac\x85\x39\x00\xb5\x41\x80\x63\x2d\xcc\x21\x14\x88\xc6\x57\xde\xfd\x81\x36\xd6\x38\xd9\xb4\xfd\x2e\x93\xb1\x7a\x32\x56\x87\x9e\xc9\x58\x3d\x19\xab\x27\x63\x75\xef\x33\x19\xab\x27\x63\xf5\x64\xac\x1e\xfe\x76\x32\x56\x4f\xc6\xea\xc9\x58\xdd\xf3\x7c\x8d\x26\x97\xc9\x58\x1d\xfe\x7c\x32\x56\x4f\xc6\xea\x00\xd4\xc9\x58\xdd\xfb\xfe\xaf\x81\x73\x4e\xc6\xea\xd0\xc7\x5f\x99\xb1\x7a\xe0\x05\x67\xf5\xbd\xd1\x32\x6e\x4c\x24\xf6\x0d\xd8\xd8\x68\x62\xcd\xc3\x7c\xd5\x8a\xea\x35\xc0\x16\x75\xf5\x3d\xcf\xc4\xeb\x7c\x40\x17\xd3\x6a\x8d\xc0\xb5\xd1\xb9\x37\x26\x18\xec\x79\x1e\x98\x07\xd7\x85\x2e\x78\x5a\x5b\xf2\x1a\x26\x3c\x23\xf7\xf7\x1f\xfa\x61\x26\x16\xb6\xdd\x1d\x64\xb7\x6b\x5b\xe6\x02\xc4\xf3\x04\x9b\x5d\x1c\x77\x8e\xb2\xd5\x1d\x60\xa7\x8b\xb3\x55\xc5\xda\xe8\xf6\x2d\x70\x03\x60\xa3\xed\x73\x4d\xeb\xdb\x00\xcc\x38\xdb\x9c\xcf\xf2\x36\x24\xa2\x79\xec\x72\x83\x56\xb7\x01\xb8\xfd\x36\xb9\xa0\xc5\x6d\x68\xa6\xbd\xf6\xb8\xa0\xb5\x6d\x18\xb1\x91\xb6\xb8\x28\x83\x42\xf4\x75\x18\xa3\xbb\x45\x70\x6e\xeb\x56\xbb\xdb\x08\x22\x37\x3c\x0b\x9c\xa4\xd6\x29\xfa\x40\x19\xcd\xcb\xbc\xd5\xff\xdc\x82\x92\x15\xc5\x1b\x1e\x1a\xb4\x6e\x2d\x81\xb6\x35\xe9\x41\x35\x19\x4c\x33\xbd\x1b\x90\xe8\xb0\xc1\x5b\xe0\x38\x65\x92\x10\x02\x35\xcc\x2f\xa2\x0c\x66\xbf\x5b\x54\xb3\xab\x0a\x22\xbe\xf1\xef\x8c\xa9\xee\x02\x12\xcb\xef\xbe\x1d\xc0\x64\x58\xaa\x19\x34\x61\x3e\x87\xf9\x32\x8e\x4d\x0e\x0b\xb0\xa3\x4d\x96\x11\xc5\x70\x9e\xc5\x5c\x19\x65\xaa\x8c\x3c\x45\xd1\x26\xca\xf1\xe6\x49\xd8\xdf\x21\xe5\xe5\x10\xd3\x64\x14\x17\x19\x6d\x92\x8c\xb1\x41\x1f\x64\x8e\x1c\x63\x8a\x3c\xa8\xce\xcb\xa1\x26\xc8\x51\x7a\x47\xb4\xe9\xf1\x38\x66\xc7\x67\xa9\xa9\x14\x81\x97\x38\x33\x63\xb4\x89\x31\xce\xbc\x38\x6c\x5a\x3c\xa6\x59\x31\x12\xb5\xc3\x4a\x71\x84\x42\x3c\x46\x19\x1e\xa1\x08\x8f\x36\x1f\x5a\x24\x0d\x6c\x6b\xac\x02\xbc\xa7\xde\x0e\x40\x3d\x4c\xf9\x7d\x82\xe2\x1b\x63\x2e\x7c\x16\x53\xe1\x38\x33\x61\xd4\x6e\x0f\x1f\xee\x01\xf5\x3d\xe2\xa8\x42\x2b\x27\x9c\x5d\x90\x0c\xef\x6e\x49\xc2\x59\x1a\xe0\xd4\x7b\xa5\x0e\x2a\x9a\x93\xe6\x43\x2b\xb9\xb5\xa3\x6c\x36\xd8\x56\xcb\x09\xfa\xbd\x6d\x80\x92\xd3\xdc\xed\xe5\x02\xb5\x11\xcd\x0c\x0f\xc9\x5e\x3e\x82\x7e\x8d\x8e\x2a\x22\x9a\xc0\xa0\x71\x68\xfe\x0b\x7f\x40\x7c\xa5\x08\x43\x2f\x29\x73\x98\x7e\xd5\x10\x0e\x6b\x59\x3b\x44\x72\x96\x3c\xf5\x77\x6f\x5e\x3b\x30\x5f\x4a\x54\x06\xa1\x5e\xca\x63\x68\x1d\x16\xd4\x53\xd4\x0e\x0b\x62\x55\x66\x6d\xd5\xc3\xa8\x23\xb1\x7a\xc7\x9b\xba\x24\xca\x1b\x98\x4b\x45\xcb\x5a\x9b\xb4\xc1\x8c\x5d\x84\x07\x21\xfe\x02\x5b\x11\xe1\x12\x38\xc8\x1d\x60\x0c\xfe\x03\x57\xec\x28\x57\x40\xd3\xd8\x1f\x80\x3b\xc6\x0d\xf0\x2c\xda\xd3\x11\x4d\xff\x63\xcc\xfe\xff\x72\x92\x4d\x84\x79\xff\x57\x24\xd9\xfc\x12\xb2\x80\xa2\x39\xe1\xa5\x3a\x92\x18\xf0\xb0\xa1\xc9\xa6\xc9\x91\x69\xb8\x5e\x11\x2f\xf7\x1a\x74\xbc\xb1\x00\x7b\x6f\xa9\xe3\x45\xd4\x7e\x65\x52\xc2\xc0\x3e\x45\x76\x4e\x6d\x96\xa1\xaa\x65\xb1\xba\x46\x39\x96\x08\xa3\x8b\xeb\xdb\x1f\xdf\x9f\xfd\xf9\xf2\xfd\x02\x5d\xe2\xc4\x57\x2a\xbc\x51\x25\x84\x99\x86\x88\x86\xf6\x37\x78\x4b\x10\x46\x25\xa3\x7f\x2f\x4d\xad\x22\xf4\xb2\x82\xf8\xca\x79\x4d\x3c\x40\x87\xea\xab\x0c\xf0\x0c\x68\x1c\x30\xa2\x52\xa5\x69\x34\x60\xcc\xc8\x5c\x8b\xf9\x82\xe7\xfb\x6e\xbf\x4b\xfd\x27\x3f\x8b\xc2\x86\xf7\x6c\x88\x20\x68\x4d\xb7\xd6\x60\x67\x4b\xd0\xe0\xb4\x0a\x52\x6d\x76\xda\xc5\x4b\x30\x53\x7b\x39\x14\x23\x4a\x53\x5f\xa5\x71\x70\x26\x9b\xf9\x17\x5a\x23\x91\x33\xb4\x2c\xc1\x54\x5f\x08\x9a\x63\x41\xb3\x5d\x73\x08\x9c\xf9\xf8\xcd\x35\x77\x37\xf4\xce\x5c\xc7\xf5\xf4\x2f\x3e\x5e\xde\xa2\xeb\x8f\x77\xd0\x13\x49\xdf\xac\x60\x45\x87\xbf\x03\x62\x96\xc4\x8f\x06\x5b\xdb\xda\xb4\x5e\x85\x4f\xcc\x39\xa7\x12\x9a\x30\x13\xe8\xf2\x6e\xb5\x72\x57\x0a\xea\xc5\xeb\x05\xfc\x9f\xaf\xec\x35\x4e\x53\xa1\xb9\x79\xe5\x84\xd8\xcb\x1f\xd0\x5c\x16\xf8\x3d\x5d\x66\x8d\xbd\xb3\xd8\xfb\xc5\x3a\x83\x55\xce\xc4\x1b\xbd\xec\x66\x83\xb0\x6a\x23\x01\x21\xa6\x5e\x29\x34\x21\xf5\xf2\x81\xc1\xbe\x66\x91\xf5\x2a\xeb\x09\x45\xd7\xcb\xab\xf9\xb5\xbb\x4c\xed\xa1\xe0\x8d\x92\xd6\xe8\xea\xc6\x6d\x4b\xf8\x42\x83\x32\x62\xd5\x5d\x68\x8b\x41\x03\x60\x63\x92\x98\xa1\xd7\xe8\x4f\xe8\x11\xfd\x09\xae\xd6\x3f\x84\x80\xc5\x71\xd0\x38\xb1\xd6\x48\x6d\x57\x37\xd1\x58\xf9\x41\x1f\x01\xfd\x8d\x5e\xb9\xe2\x68\x49\x59\x6a\x3a\x34\xb9\xa6\xc3\x16\x5b\x4f\xae\x70\xa8\x07\x39\xea\x86\x81\x75\x02\x5d\xad\x1a\xb5\xc2\xc2\x92\xe2\xc8\x2d\xd3\xa0\xb5\x24\x7b\x6d\x88\x3c\x6c\x9e\x6e\x55\x2c\xab\x47\xca\xb1\x4a\x36\xed\x13\xa4\xaf\x70\xa9\x6a\x22\x0e\x0b\xc3\x29\x07\x0d\xc1\xb8\x03\x37\x34\x48\x95\xc7\x25\xa4\x51\xcd\xf7\x5a\xbb\xb0\x87\xe9\x3d\x41\x71\x40\x08\x4f\xdd\xcd\xda\x48\x87\x2a\x78\x6a\xae\x6a\x98\x54\xda\x60\x37\xee\x56\x0e\x02\xed\xde\xd8\x36\x44\xa5\x52\x9d\x81\xbe\xf4\x49\xb0\xdd\x38\xa1\x82\xa5\x18\xc8\x58\xd0\xa7\xa5\xea\x81\x17\xdc\x98\xa8\xf3\x51\x08\xae\x78\xc2\x83\x35\x23\xdb\x26\x61\xfb\x81\x69\xdd\x6f\x28\xcb\xe2\xfc\xfb\x8b\x9b\x99\xd6\x08\xa1\x78\xde\xed\xf9\x90\x55\xae\xd5\x1e\xee\xee\xfc\x26\xd8\xa6\x26\x62\x31\xc3\xe5\xbc\x5b\x2c\xdc\x27\x96\x3f\xad\xf6\xa4\x20\x38\xa5\x47\x8b\xad\x71\xad\x0e\x2b\xa8\x63\x82\x6c\x72\xbe\x25\xa9\xb9\xc0\xeb\x96\x89\x29\x34\xe4\x95\x81\xc8\x9b\x61\x19\xf2\x0b\x58\x06\xa7\xc8\x9b\x29\xf2\x66\x8a\xbc\x99\x22\x6f\x02\xef\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x8b\x96\x29\xf2\x66\x8a\xbc\x99\x22\x6f\x1a\x2f\x4d\x91\x37\x76\x52\xff\x34\xfe\xa9\x29\xf2\xa6\xfd\x4c\x91\x37\x9d\x51\xa6\xc8\x9b\xaf\xc3\xa7\x36\x45\xde\xb8\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x29\xf2\x66\xef\x99\x22\x6f\xa6\xc8\x9b\x29\xf2\x26\xbc\x4f\x55\x37\xef\x18\x17\xca\x39\xcf\x8b\x52\x11\xf4\xa9\x6a\x57\x5f\xf5\x4c\x5f\xee\x8c\x5f\xb0\x71\x38\x9e\xcb\xcd\x61\xda\x76\x95\x02\x42\x45\x4e\x4d\x2d\xc4\x79\x62\xa6\x36\xaf\xd6\x33\xaf\x66\x72\x7a\xa8\xab\xc3\xf4\xce\xf7\xd3\x43\x1d\x1f\x73\x13\xc5\xf8\xa3\x18\x57\x1b\xe3\xef\x61\x0a\x0d\x43\x8b\x69\x16\xf5\x08\xe4\x8b\x73\x5e\x9a\x12\x90\x76\xf5\x81\xb1\x2b\xbc\x18\x33\xd1\x97\x43\x3b\x8a\xef\x19\x4c\xe4\x17\xc6\xfe\x27\x3b\x89\x7d\xfc\x5b\xf6\x71\x18\xfe\xdd\x91\x81\x08\x84\x6a\x04\x2a\x11\xcf\xa9\xd2\x72\x8a\x16\xf6\x1a\xd1\x42\x21\xaf\x06\x55\x2d\x1b\xaa\xa5\x16\xf0\x39\x62\x65\xaa\xa0\x56\x6e\x8e\x66\xcf\x35\xd7\x4d\x2d\x84\x2e\xa8\x7c\x5b\x49\x4b\xb0\xeb\x73\xd7\x7c\x17\x18\xe7\x57\x4d\x41\x03\x2f\x68\x79\x5f\x50\xb5\x3b\xe7\x4c\x91\x47\x8f\x04\xd3\x26\x86\x5b\xfb\x89\xed\x2a\x28\x2b\x51\xca\x3a\x31\x45\xc9\x20\xaa\x21\xe2\x2a\x89\x41\x96\xe9\x36\x76\xea\x26\x0a\x58\x21\x8f\xea\xd4\x03\x32\x6e\x2b\x14\x96\xf7\xf5\x3e\x90\xb9\xbe\x9c\x6a\x74\x77\xc6\x3a\x94\x71\x02\x8b\xb9\x11\x74\x4b\x33\xb2\x26\x97\x32\xc1\x19\xec\x79\xac\x08\x70\xe6\xf9\xde\x75\x55\x94\x55\x17\x4d\x5f\xc7\x6c\x3b\x4f\x10\xea\x12\xcc\xd0\x1a\x53\x86\x72\x8d\xa3\xc2\x81\x85\xee\x7b\x0c\x3a\xbc\x15\x58\x68\x85\xc0\x7e\x10\x92\xb8\x20\x30\x6c\xc9\x79\x66\x3d\xb2\xd9\xae\x9e\x93\x75\xf5\x33\xfe\x23\x23\x0f\x3f\xea\x71\x24\x5a\x65\x78\x1d\xea\x45\x8d\x6c\x45\x58\xa2\x3a\x25\x5b\xaa\xe9\x20\x1f\x3a\x42\x8c\x41\x82\xf8\x87\xb0\xe9\xc0\xd8\xdb\xee\xfb\x2d\x7a\xf3\x0a\xa8\x16\x4b\x54\x41\x0f\x19\x55\xbe\x7d\x05\xd6\x97\xf3\xb3\x9b\x1f\x6f\xff\x76\xfb\xe3\xd9\xc5\x87\xab\xeb\xa1\x23\x1a\xee\x53\x9a\xe0\x02\x2f\x69\x46\xc3\xbc\xbb\x63\x05\x6f\x7e\x06\x8c\x2a\x4d\x4f\x53\xc1\x0b\xb3\x4e\x51\x32\x88\xd7\xac\x63\xb0\x22\x0c\x19\xce\x07\x55\x85\x77\x9a\xd6\xdc\xed\xa1\xd6\x02\x33\xe5\x84\x9d\xa1\xfa\xdc\x06\xcd\xa2\x64\x5a\x50\x7d\xaa\xc7\x0d\xa7\x63\x82\x12\xce\xd2\x94\xa4\xad\xa9\x1f\xd9\x07\x74\xee\x40\xef\xea\x88\x51\x74\xf3\xf1\xf6\xea\x7f\xc6\x8f\x8a\x2c\x8d\x44\xb9\x07\x8e\xe4\xc1\x46\x48\x93\xc9\x08\x4c\x7e\xb2\xd1\x3d\x13\x2e\x3d\xef\x0c\x54\xf2\x77\x5c\x25\xf2\x70\x7f\x2a\x59\x3b\x32\xbf\x86\x80\x72\x9e\x92\x05\xba\x31\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\xab\x3f\x66\x8a\xe2\x2c\xdb\x21\x2d\x89\x6d\x71\x46\x8c\x0b\x59\x70\xaf\xb6\x82\xea\x92\x5a\x26\x2e\xb5\xc9\x35\x56\x38\x93\x81\x03\x1e\xc3\x07\x35\xab\xff\xa0\x85\xc9\x48\x3c\x55\xef\xa3\x94\x30\xae\xac\x5c\xaa\x47\x82\x80\x5a\xc1\x13\x64\x64\x53\xe3\x86\x08\xac\xaa\x0e\x27\xaa\x98\x25\xb0\x58\xc7\x06\xa9\x74\x6b\xbd\xa9\xc6\x04\x4d\x3c\x00\xb3\x94\x44\xee\xdd\x36\x96\x0d\xd6\xd2\xaa\x1e\x57\x10\x9c\x42\x6c\x58\x81\xd5\x06\xec\x9a\x01\xa0\x39\x96\xf7\x24\x35\xaf\x2e\xcc\x3d\x6c\x25\x69\x69\x3b\x00\xd8\xe9\xdd\x69\x2c\xac\x08\x56\xa5\x20\x70\xff\x86\x85\xdc\x25\x41\x84\xe1\x65\x16\x8a\x3c\x8b\x0a\x8a\xc4\xe9\x47\x96\xed\x3e\x71\xae\xde\x55\x21\x55\x91\xdb\xf9\x43\xd5\x13\xbc\xa9\x41\xc3\x65\x0b\x46\xca\x74\x0e\x68\x82\x40\xae\xb8\x4a\xe6\x17\xf5\xf6\x1d\x81\x3c\x45\xc9\xce\xe4\x77\x82\x97\xb1\x4d\x39\x34\x05\x7d\x77\x75\x01\xa7\xaa\x34\xe7\x86\x30\x25\x76\x10\x14\xd9\xc9\xe0\x19\x96\xe1\x16\xe8\x7b\x4d\x53\x7b\x54\xa4\x25\xae\x92\x49\xa2\x16\xe8\x03\xde\x21\x9c\x49\x6e\x85\xa9\x90\x64\xc4\xd0\x0d\xf8\x4c\x9a\xf2\xff\x02\x41\x8c\xb3\x89\xbb\x58\x72\xb5\x41\x7b\x2f\x0c\x10\x67\x17\xa2\x09\xdf\x33\x06\xa6\x3a\x41\x89\xb2\x7d\xc0\x21\xe2\xc4\xf7\x44\xa2\x42\x90\x84\xa4\x84\x25\x81\x3d\x6c\xd8\x8a\xfe\xf0\xfb\x27\x99\xef\x61\xa7\xaf\x39\xd3\x64\x1c\xb9\xd7\x57\x2c\xa5\x09\x36\x3c\xc8\x76\xb3\xae\x49\x18\xac\x9a\x56\xc6\xc4\x10\x03\x37\xc0\x65\x4b\x49\x84\xe9\xee\x2c\x4a\x62\x90\xf8\xd7\x72\x49\x32\xa2\x4c\xc4\x2d\xc4\xf5\x63\x65\x5a\x09\x98\x86\xf2\x58\x39\xc2\x08\x9f\x74\xc2\x64\x09\xed\x42\xb4\x6a\xac\x50\xca\x49\x1d\xaf\x88\x25\xfa\xfe\xea\x02\xbd\x46\x2f\xf5\xfc\x5e\x81\x8f\x65\x85\x69\x48\x6c\x57\xdc\x78\x61\xf6\xe5\xea\x95\x03\x0e\xcb\x00\xfa\x44\x5c\x98\x63\x38\x43\x2c\xe4\xf3\x81\x6e\x31\x76\x85\x5a\xdd\x71\x31\xc6\xd6\x33\x07\x46\x9b\x36\xa1\x07\xc8\x39\x34\x4e\x98\xd0\x7d\xe4\x1c\x80\x38\x4c\xe8\x23\xc8\x39\x9a\x25\x7d\x2f\x89\x18\xc1\x91\xbe\x3f\x2a\x47\x6a\x8a\x00\x9a\x6a\xdb\xab\x37\xa4\x99\x13\x85\x53\xac\x30\xa2\xa1\xed\x28\x59\xa3\x23\xc8\xaf\x61\x83\x8f\xc7\xaf\x24\x79\x4f\x59\xf9\x68\x5c\x64\x63\x54\xc8\xdb\x4b\xf8\x10\x25\x6e\xf2\x80\x70\x5c\x14\x19\x35\x01\xc2\xed\x3c\xca\x00\x66\xcc\x21\x6f\xa6\xc7\xf4\x09\x3e\x70\x94\x71\x96\x71\xcd\x2a\xf5\xad\x8e\x59\xca\xf3\x00\xd8\xfd\x09\x6a\x81\x89\xe0\x64\xd3\xb4\xb0\xf7\x10\xcb\xa8\x4b\xea\x9f\xfc\xda\x8b\x53\x9d\x33\xb2\x25\xc1\xb4\x9b\xfd\xec\x5a\xfd\xbe\x16\x9c\xdc\x0e\x00\x00\x94\xe1\x25\xc9\xcc\xe5\x61\xa8\x24\xd2\xd9\x1a\x45\x43\xd1\xaa\x99\xe0\xd9\x98\x60\xa4\x4f\x3c\x03\xff\x16\xae\x16\xa3\x01\x7c\x25\x6b\x81\xd7\xe2\xd7\x02\x72\x7d\x6b\x2d\xa0\xef\x7c\x1d\x6b\x29\x83\x37\x51\x67\x2d\xfa\xe2\x6a\xaf\x05\x6e\x90\xaf\x61\x2d\x11\x6a\xfd\x03\x65\x29\x7f\x90\xe3\x99\xee\x0f\xe6\x43\xc7\x19\x12\xcd\x7a\x14\x65\x6b\xd9\x64\xbc\x38\x68\x2c\x6d\xea\xa9\x7d\x9c\xd7\x19\xe7\xab\x7c\xea\x2e\x8f\x0a\x40\x77\x02\x57\x29\xad\x7f\xe6\x80\x8b\x34\x44\xf1\x51\xbc\xf1\xe8\x1c\x70\x9d\x4b\x7c\x2e\x34\x2c\x45\x71\x76\x5b\x8c\x6a\x7b\xf6\xdd\x87\xdb\xb3\xf6\xc7\x9a\x70\x1f\x20\xe5\x5e\xaf\x47\xff\x1d\xe1\x34\xa7\x52\x86\x4d\xd2\x80\x5f\xb2\x84\x76\x74\x2f\x9d\x8f\x62\x4d\xd5\xa6\x5c\x2e\x12\x9e\x37\xdc\x15\x73\x49\xd7\xf2\xd4\x52\xd9\x5c\xcf\xfe\xd5\x00\x5c\xca\x32\xca\x1a\x46\x07\x48\x60\xb7\x42\x1d\x4c\x30\xa9\x56\x00\xa8\x37\x99\xa6\x03\x40\x8d\x95\xb7\x07\x01\x26\xbb\x94\x92\x2c\xb5\x86\x08\x13\x8e\xad\xcf\x73\x56\x6c\xf0\x1c\x2e\x8c\x01\xe0\x36\x67\x0c\xf4\xfa\x0d\x67\xdc\xfa\xd0\x4d\xcc\xb1\x55\xa5\x8c\x5d\x02\x26\x61\x4f\x8e\x9e\xcb\x00\xe0\xa6\xe5\xe3\x28\xac\xad\x4b\x3d\xd7\x83\x81\xf5\x03\x14\x04\x08\xb4\x19\x73\x8d\x68\x9c\x81\x95\xf5\x6e\xa4\x11\xbe\x7f\x0d\xfb\x50\x69\x3c\x23\xd1\x0f\x9a\x8f\xfd\x4c\x73\x1b\xc7\x84\x7b\x35\xa1\x81\x45\x75\x6a\xaf\xf4\x6a\x43\xfa\x95\xb6\x46\x34\x78\x7c\xbb\xfa\xd2\x90\x56\x34\x00\xb2\x4f\xd8\x7d\x92\xac\xdb\x0f\xf4\x08\xf2\x2e\xea\x93\x79\xf7\xe8\x79\x49\x94\x25\x67\x20\xd8\x1c\xef\xd0\x72\xe8\xb8\xa4\x54\x82\x59\x13\x9c\xd2\x4d\xe2\xfd\xd4\x24\xa4\x63\xd3\xe9\x93\x1d\xf3\x26\xb0\x35\x3a\xab\xfb\xb6\xf1\x3e\xa2\x5d\x53\xd4\x0d\x4f\x4d\xc8\x78\x15\x94\xeb\xed\x7f\x68\x43\xd7\xe9\xcf\xee\xee\xaf\x25\x0b\xc6\x4d\xcc\x44\x33\x8e\xdc\x35\x98\x35\x4d\x53\x3d\x30\xad\x45\xd7\x36\x5f\x6d\xcd\xc2\x58\xb9\x36\x54\x36\x93\xc3\x67\xd5\xa4\x03\x4e\xe3\x66\x6b\x87\x19\xfa\xef\x52\x2a\x84\x2b\xf7\x73\xab\xe7\x44\x15\x73\x0c\xe4\x94\x78\xad\x29\x2e\x17\x4b\x71\x3d\x99\x2d\x4d\x09\x4a\xe9\x6a\x45\x9c\x5b\x7c\x49\x50\x81\x05\xce\x89\x02\x37\x8a\x41\x2d\x74\xe1\x65\x7e\x62\xe0\x2b\x84\x5d\xaf\xdb\x2a\x02\x6e\x66\x7c\xb4\x54\xa1\x9c\xae\x37\x46\xd6\x41\x18\x65\x9c\xad\x21\xa2\x4f\x4f\x21\xe3\xd8\x77\x12\x81\x39\x70\x81\x1e\xb0\xc8\x11\x46\x09\x4e\x36\x60\x25\xc4\x0c\xa5\xa5\x80\x04\x4f\x45\x70\xba\x9b\x4b\xa5\xf5\x6c\x2d\x1d\x81\x29\xcd\x60\xc0\xeb\x85\xee\x74\xc2\x00\x7c\x51\x13\x89\xac\xef\x92\xea\x98\x58\x5f\x81\x13\x0e\x9a\xe4\xe7\x81\xde\x3a\x60\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xbf\x7b\x73\x4a\xe9\xef\x3c\x53\x4a\xff\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\xf0\x4c\x29\xfd\xe3\xe7\x36\xa5\xf4\x4f\x29\xfd\x53\x4a\x7f\xe3\x99\x52\xfa\x3b\xa3\x4c\x29\xfd\x5f\x47\xb2\xde\x94\xd2\xef\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\xbd\x67\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\x21\x17\x5a\x4a\x3d\xa9\x96\x31\x59\x07\xd6\x80\xdf\x88\x55\x5c\x96\xab\x95\xd6\x50\xb9\xf7\xb2\xd6\x23\x76\x2c\xd1\x55\xee\x5b\xe5\xe8\xb2\xd6\x64\x49\xd4\x0c\xd2\x1a\x4c\x98\xce\x38\xa0\x36\x90\x12\xd2\x1a\x05\x91\x90\x06\xc0\xd0\xe5\xc7\x77\x8b\x46\xd2\x83\xd7\x94\xe9\x4d\x85\x18\x8a\x39\x86\xd9\x7c\x64\x49\x8c\x53\xb2\x46\x6c\x5f\x24\xa8\xc5\x6f\x92\x71\x69\x62\x0a\x00\xb4\xcf\x35\xb5\xc1\x8c\x11\x27\x75\x50\x05\xb2\xf2\x92\x10\x86\x78\x41\x98\xf1\x43\xb9\xb6\x0c\x08\x2b\x85\x93\xcd\x42\x8f\xcf\x82\x50\x5d\x76\x68\x35\xba\x66\xbd\x04\xe7\x06\xb9\x82\xe4\x98\x9a\x01\x10\x4e\x04\x97\x12\xe5\x65\xa6\x68\x51\x0d\xe1\xdb\x31\x02\x31\x40\x26\x32\xab\x42\x18\x38\x16\x88\x31\xc5\x43\x4c\xbf\xdd\x58\xe9\x96\xc0\xd9\x60\xe0\x35\xc8\x46\x33\x48\x68\xcf\x0b\xb5\x33\x2e\x57\xe3\x78\xa2\x42\x2a\x94\x64\x14\xae\x7f\x98\x9d\xc9\x09\x85\x51\x66\x01\xa7\xbe\x82\x5c\x51\x58\xab\xb4\x8b\x65\x29\xdc\x1a\x85\x92\xc6\xd1\x58\x0f\x63\x07\x48\xa9\xb4\x77\xb4\xf4\x79\x26\xb0\xeb\x1d\x62\x36\xdb\xad\x15\xb6\x3b\x85\x21\xdc\x98\xf6\xa7\xc6\x20\x03\x58\x80\x94\x27\xab\x28\xd5\x87\x0a\x52\x8c\x5d\x9e\xcf\xac\xd5\x67\xa4\xa8\x92\xe5\xd4\x06\xfb\x2b\x2d\xb8\x83\x68\x67\x0b\x44\xc0\xc8\x56\xd3\x2c\x49\x88\x16\xa1\x71\xe7\x84\x99\xe1\x0e\x3a\x4a\x8a\x88\x9c\x32\x70\xcb\x7e\x20\x52\xe2\x35\xb9\xf1\x1a\x78\x7c\x62\x13\xd8\x78\x6a\x54\x03\x21\x64\x20\x43\xd5\xbf\xd4\x2e\xb1\x13\x1f\x43\x68\x4c\x05\xe5\x66\x2e\x55\x0c\xe0\x83\xa0\x4a\xeb\x54\x54\x9a\x5c\x3a\xb0\x6b\xee\x07\x5c\xfa\x41\x37\x9d\x70\x1f\x1c\xe8\x1a\xa4\xe6\xef\x2c\x35\x8e\xab\x25\x41\x4b\x41\xc9\x0a\xad\x28\xc3\x99\xf5\x40\xf9\xe8\x0b\x72\x44\xb0\x11\xa8\xa5\xd4\xa2\x29\x67\xce\xb1\xe2\xd6\xb0\x40\x3f\xd8\x45\x28\x51\xb2\x04\x0f\xe6\x2c\x33\x9e\x12\x44\x57\x68\x0d\xde\x2e\x61\x1c\xea\xbf\x7f\xfd\xef\x7f\x40\xcb\x9d\xbe\x11\xc1\x50\xa9\xb8\xc2\x59\x85\xa6\x8c\xb0\xb5\xde\x03\x60\x10\xbe\xb3\x90\x65\xcd\xf4\x4b\x87\x59\xa8\xab\x62\x96\xfe\xe6\xdb\xfb\x65\xfb\x4a\x3f\x4d\xc9\xf6\xb4\xb1\x2f\xf3\x8c\x7b\xe3\x52\xba\xcd\x70\xfa\x2f\xdf\x01\xf1\xb2\x87\x20\xa1\xf8\x42\x04\x49\xba\xe4\x27\xb4\xe1\x0f\x26\x07\xb3\x87\xa2\x6a\x97\x78\xc1\x8b\x32\xf3\x77\xed\x41\xe8\x9d\xa6\x62\xc0\x53\x69\x6f\x87\x56\x38\x63\xef\xc9\x01\x45\xdf\x02\xf6\xf3\xba\xe6\x0d\x6f\x5c\x9c\x6e\x7a\xdc\xc6\x43\x59\x25\xb7\xca\x7d\x2a\x05\x59\xa0\x77\x38\xcb\x96\x38\xb9\xbf\xe3\xef\xf9\x5a\x7e\x64\x97\x42\x78\xc5\x80\xd6\xbc\x33\xac\xf9\xf2\xa6\x64\xf7\xed\x56\x0b\x19\x5f\x6b\x39\xae\x28\x95\x8b\x58\x69\xac\xca\x03\xd8\xcd\x14\xce\x78\x75\x09\x60\xdb\xcb\xa6\x86\x4d\x1e\x81\xae\x20\xe0\x09\x33\x44\xf4\x5c\x7d\x98\xd6\x14\xdd\x9c\x8b\x6c\x92\xe5\xb7\xaf\x7f\xff\x47\x43\xfa\x5a\xbb\xf8\xe3\x6b\x70\xfe\xcb\x99\x61\x2e\x9a\x33\xfa\x39\xb4\xcc\x71\x96\x69\x45\xa2\x49\xd4\x7a\x5b\x17\xb1\xbd\x9b\x86\xa8\x55\xc5\x10\x66\xb4\x70\x77\x77\xf7\xb7\x80\x64\x47\x95\x24\xd9\x6a\x66\x62\xef\xaa\x7c\xdb\x13\xb8\x28\x4e\x2c\xef\xd2\xb7\x7a\xf7\x6a\x38\x4c\xcc\xda\xf2\xac\xcc\xc9\x05\x81\xa6\x2b\x11\xcb\x6c\xbd\xef\x22\x36\x32\xdb\x1f\x6d\x99\xf1\xe4\x1e\xa5\xf6\x8f\x30\x59\xcf\x32\xc1\x6b\x65\x43\x7a\x1a\xba\x60\x15\x05\x04\x01\x78\x2e\x92\xe7\xa9\x1d\xb7\x9a\x73\x6e\xf9\xdb\x72\x5c\x14\xd0\x68\x6c\x05\x09\x42\x0f\x66\x01\x01\x1d\x0b\x20\xd8\x4e\x3a\xf8\x38\xdd\xb7\x0c\x50\xff\x85\xdc\xb3\x9e\xfa\x13\xb7\x01\x05\xfc\xb7\x89\x17\x19\x91\x5a\x87\xea\xb0\xbd\x6a\x6d\xe6\xc6\xd0\x98\x81\x93\xf9\xe4\x3e\x3c\xa3\xfa\x1e\x81\x59\xa1\xd1\xe9\xa9\x19\xaf\x8c\x51\x41\x84\x84\xe6\x70\xea\x33\xec\xe8\x79\x86\x69\x28\xa3\x0b\xa1\xba\xe1\xd1\xd3\x96\x31\xdc\x81\xa7\xde\x13\xef\x2b\x01\x6f\xdf\x13\x7b\xf3\x18\x02\x87\x64\xfc\x98\x33\x7c\xc3\x53\xfb\x09\x1c\x52\x53\xb8\xa0\x47\xd4\x92\x11\xb9\xef\x47\x6f\x8f\xf7\xb9\x5e\x4b\xfb\xac\xea\x5f\xaa\xc3\x6a\xde\xb2\x47\xd1\xbb\xb7\x47\x3a\xa2\x30\xf4\xa8\x13\x0a\x67\xb3\xd1\x71\xab\xbe\x0f\x5a\x22\xb4\xd9\x84\x20\x05\xd7\xa2\x8c\x95\x89\x17\xc8\xd8\xb4\x35\xd6\x2d\x58\x74\xf2\xf6\xe4\xc9\xe7\xd4\x2c\x52\xf0\x02\xaf\x07\x4a\x47\xed\xad\x75\xff\x43\x94\x12\x23\x60\x10\x09\x42\x1a\xfc\x1d\xdc\x46\xc1\x85\x16\x16\x82\xeb\xec\xe4\x7c\x7c\xd6\x4c\xeb\xd0\x67\x45\x10\x13\x1c\xfc\x10\xf4\x62\x23\x84\x05\x2f\x59\x6a\xf5\xf3\xca\x10\xf2\x61\x6f\xc2\xd7\x9c\x81\x90\x63\x72\x90\x02\x61\xab\xe6\x69\xc5\x88\x6b\x0e\xf3\x66\xf1\xe6\xf5\x2f\xcb\x26\xef\xf6\x1a\xe2\x69\x8c\x5c\x57\x6c\xd2\x9c\x8d\x27\xcf\xc8\x15\xd8\x88\x9e\xd5\x07\xab\xb4\xd5\xf5\x33\xa8\xab\x2a\x00\x3f\x69\x65\x8c\x44\x95\xc2\x43\xe8\x25\x88\x34\x5a\x16\x6c\x64\x25\xbc\x1a\x55\x06\x26\x2e\xad\x5d\xeb\x77\xcb\x27\x9d\x6d\x73\x88\x0d\xd1\xf6\xe9\xc2\x61\x6a\xb2\x5f\xf7\x1c\xf3\x56\x17\xb9\x17\xe8\xa5\x79\xf3\x44\x42\x2c\xea\xab\x27\x6f\xaf\x5d\xf6\xe5\x63\x11\xcc\xa3\x6c\x2d\xfd\xf2\xb1\xc0\xa0\x43\x17\x43\x38\x18\x10\x3a\xda\xb7\x8c\x1f\x07\x7f\x26\x1b\xbc\x25\x10\x27\x4b\x33\x2c\xbc\x99\x04\x16\x2e\x47\xb7\x66\x55\xd0\xec\x96\xb0\x2d\x15\x9c\x81\x9f\x6a\x8b\x05\x85\x9c\x22\x68\x45\x48\x98\x96\x4f\x7f\xfb\xf2\xf3\xd9\x27\xf0\x0f\x84\xb3\xdd\x4c\xee\x81\x5d\x79\x29\x21\x06\x61\x6f\x05\x8d\xa1\xea\x8d\x1b\x9a\x6b\xcf\xa6\xba\xf9\xeb\x5d\x01\x5e\xe7\xd6\xa3\xe7\x90\x97\xaa\xc4\xfe\x6c\x0a\xf3\x90\xc7\x24\x2b\x25\xdd\x3e\xf5\xfc\x0f\x4b\x3c\xd5\xad\xf8\x05\x04\x1e\x1b\xd2\x7d\x41\x3d\xb4\xdb\xdf\x70\xf7\x44\x76\x63\xc1\xc1\xac\xc7\xb8\x1a\xee\x7a\xda\x6b\x5c\x3e\x91\x55\x6d\x9c\x66\x2a\xab\x55\x5c\x6d\xca\x85\x57\x0b\xaa\xea\x42\xa6\x5d\xb3\x3b\xe4\x67\x1d\x47\x85\xf5\xef\xa5\x67\x8f\x02\xbb\xe3\xdb\x17\xc8\xa4\xee\xc8\x50\x71\x25\x63\x03\x93\x6f\x17\x0a\x80\x31\x6a\xac\x99\x54\x3a\xd7\x58\xd7\xe4\x72\x17\x98\x9a\x00\xd0\xbb\x0d\x66\x5c\x7e\x2a\xb3\x3e\xd9\xcf\xee\xb9\x4d\xbd\x49\x2b\xe7\x2f\x12\xa4\xc8\x68\x82\x2d\xb0\x9f\x14\x00\xf9\x51\x68\x28\x3f\xda\xbf\xfd\xd4\x9f\x29\xb4\x24\x7a\xb5\xae\x27\xba\xf9\x5e\x9f\xe0\x25\x81\x12\x78\x85\xd9\x63\x9c\x11\xa1\x3a\xe1\xa4\x5e\x7c\x9b\x5e\xd8\xef\x79\x82\x3b\x05\x15\x3a\x0d\xca\xed\x7b\x28\x87\xd4\x36\x8d\x1a\x83\x02\x04\xb3\xb7\xa0\x10\x67\x28\xe3\xbc\x58\xe2\xe4\xbe\x4b\xe8\x92\x77\x8b\xf5\x40\x07\x63\xbc\xc6\x94\xc9\x3a\xc1\xeb\xaa\x13\x4a\xe5\xbf\x6b\x33\xbe\x7e\x67\xfc\x70\xc1\x15\xf0\xb5\x75\xd7\x41\xa0\x46\x63\xf7\xac\xd1\xa3\x71\x56\xa0\xe8\x6b\xef\xf8\x3d\x34\x94\xf1\xf5\xfb\xbe\x82\x14\x9d\xd1\x4d\xb6\xdf\x71\x07\x67\x3c\x25\xb7\x24\x03\x56\xf3\xbc\x67\xe3\x02\x0a\x05\x5b\xb6\x73\xcd\x53\x57\xa4\x8d\xa7\x26\x62\x4b\x26\x1b\x92\x96\x19\x78\x7f\xa2\xc9\xcf\xfc\x74\xab\xb8\xc0\x6b\x72\x0e\x38\x08\xa2\xf1\x63\xf7\xfd\x1a\x75\xd2\x82\x43\xd2\xfc\x5d\x1f\x07\x83\xe9\xfd\xf9\x84\x74\xb2\x7b\xd2\x2b\x90\x76\x82\x7c\xef\xc9\xce\x59\x42\x24\x49\x04\xb1\x01\xee\x7a\x2b\x40\x4c\x71\x6a\x54\xdd\xbb\xba\x97\xaf\xda\x6f\xef\x49\x6f\x22\x49\x90\xeb\xfa\x24\xfa\x3d\x4f\x7d\x23\x90\xc2\xca\x26\x6a\x74\x50\x1d\xdf\x12\xb1\xa5\xe4\xe1\xd4\x5e\x6f\x73\x4d\xa4\x73\x83\x6e\x79\xaa\x27\x22\x4f\xbf\x81\xff\xe9\x5d\xa4\x09\xea\x39\x4b\x53\xab\x56\x95\x92\xac\xca\xcc\x28\x3a\x72\x81\x70\x41\x3f\x13\x21\x29\x67\x33\x74\x4f\x59\x3a\x43\x25\x4d\xff\xab\xcf\xf0\x1f\xc4\x07\x77\xbe\xa4\x21\x9c\xdc\xc2\x4d\xbc\xab\x4a\x0e\x43\xda\x9f\xd9\x07\x2e\xa0\x7c\xb0\xde\x5c\x17\xeb\x61\x2b\x64\x7b\x67\xd3\x2f\xfe\xfb\xae\xc4\xb9\x86\x1d\x7b\x3c\x0a\xac\xef\xfa\xe0\x89\x00\xcd\x13\xb7\x38\x4a\x4a\x8a\x8c\xef\x40\x2a\xa5\xd2\xc2\x80\x84\x57\x6c\xf3\xb4\xc8\xa3\xde\xd5\xce\x82\x34\x67\x4a\x49\x46\xfa\x0b\x95\xb9\xa8\xeb\x92\xa5\x44\x64\x3b\x30\x94\x98\xfd\x8f\xe7\xd4\x05\x4f\x3f\xd8\x7c\xf0\xe0\xa2\x6e\xea\xf7\x9c\xc0\x22\xdd\xe5\xac\xaf\xbc\x33\x2d\xb2\x60\xb3\x98\x35\x51\xb2\xa1\xdb\x77\xf9\x9b\x31\x3a\xa9\xe6\x55\x55\xf0\x74\x14\x4f\xc0\xf5\x78\x7d\xc4\x15\x5f\xb7\x7e\x40\x2e\xde\xab\x99\xdd\x58\xa5\x49\x5c\x2d\x6d\xb6\x1d\xdc\x13\x9a\x46\x4d\x6c\x4c\x8e\x0b\xe0\x79\x9e\x60\x5b\xe3\x3c\xa9\xea\xd5\x9b\x1b\xd8\x24\x9c\x83\x1b\x7f\xb9\xab\x65\x1c\xc5\x79\x66\x9d\xed\x9a\x43\xf8\x7c\xed\x82\x28\x41\xc9\x96\x20\x2c\x96\x54\x09\x2c\x76\x55\xa2\x3f\x78\x16\x77\x70\x25\xe8\xdb\xfd\xef\x25\x11\x3b\x50\x8c\x20\x22\x12\x34\xb0\x5e\x90\x9a\xd6\x04\x81\x70\xfe\xd4\x64\x14\xe7\x3c\xa5\xab\x16\xa1\xed\xb3\xad\x7e\xae\x55\x4a\x22\xe6\xeb\x92\xa6\xe4\xb4\xb1\x71\x7e\x76\xe2\x51\x12\xfa\x05\xce\x67\xdc\xef\x0f\xb8\x80\x80\x2a\x78\x5b\x6f\xaf\x21\x76\xd8\x63\xd9\x6a\x77\x6f\x33\xbb\x7b\x87\xe4\x62\x8d\x19\xfd\xd9\xe0\x3b\xc1\x8a\xac\xb9\xd0\xff\x7c\x29\x13\x5e\xd8\x5d\x80\x5b\xea\x55\x03\xad\x78\x67\x0c\x3d\x9e\x2b\xca\xc8\x17\xe0\xb0\xb4\x32\x6a\xb3\x76\x7b\x06\x19\xe4\x00\xd7\xb6\xd6\x1f\x8a\xd3\x8a\xda\x3b\x83\xff\x91\xdb\xe6\x67\xa5\x5c\xa8\xbe\x32\x1b\x7b\x7c\x47\xd8\xd0\x4d\xc0\x70\x15\x5c\x0c\x32\x0e\x4b\xd1\x5a\xdf\x83\x50\x89\xdc\x2e\xd5\x63\xcd\x6b\xa6\xcc\x3d\x90\x65\xac\x30\x57\x08\xca\xa1\xc2\x44\x86\xa5\x1c\x9e\xac\x7d\x1b\x25\xfa\x75\x84\xa5\xa4\x6b\x56\x57\xba\xd3\x82\x59\xec\xc0\x70\x48\x23\xc4\x2f\x2b\x03\xb6\xba\x3e\xf4\x66\x4f\x00\xaf\x05\xa8\x90\xbb\x87\x99\xa6\x8a\x3e\x25\xc9\x05\x91\xd9\x4b\xd6\xe4\x53\xff\x0f\xfd\xe1\x65\xd5\x70\xdf\xd8\x43\xdd\x85\x44\xd7\x50\xd2\x45\x13\x6d\xd1\xc5\xbc\x5d\xfc\x4f\x30\xf6\xc2\x4c\xf4\x27\x74\xfe\xfe\x0a\x61\xb1\x2e\x8d\xf9\xe4\x23\xcb\x76\x08\x6f\x31\xcd\x80\x2f\xd9\x62\x1a\x30\xe5\xed\xeb\xc5\x9b\x37\x8b\xd7\x3d\x17\x40\x8a\x36\x74\xbd\xe9\xaa\x7a\x93\x28\x39\x89\x92\xff\x0c\xa2\xe4\xdf\x5b\x67\x2a\x78\xca\xf7\x8e\x9f\x99\xb4\x74\xca\xbe\x06\x44\x89\x40\xa4\x3e\x9f\x7e\xa3\xac\xe2\x96\x0b\xe4\x5a\x60\x48\xa4\x39\xb5\xee\x94\xce\xe7\xe6\x8f\x10\xef\x06\x74\x55\xcb\x68\xfb\x24\xec\xf1\xef\x05\x76\xd1\x67\x48\xb2\x37\x58\x18\x07\xd7\x8d\xd4\xba\x86\xe0\x58\x31\x33\xbd\x04\x23\x67\xef\x4f\x34\x14\x12\xec\x0f\x04\xf6\x36\xed\xda\xeb\x5d\xe0\x5a\x0e\xb9\x4d\x31\x47\xd1\x0a\x76\x96\x50\x72\x08\x2e\xd2\x6c\xd9\x44\x91\x76\x90\xa6\xaf\x86\x45\xd7\x44\xc5\x78\xd5\xa3\xe9\xd4\x34\xca\xaa\x98\x6e\xb7\x00\x77\x88\xef\xf9\xbb\x6c\x3d\x93\xe4\x34\xae\xa7\x56\x8d\xec\xde\x91\xbf\x68\x37\xad\xa0\x44\x1a\xea\xa0\xf5\x4c\x98\x1d\xdb\x2f\x6b\x00\xb7\xa3\x3b\x65\x35\xfb\x61\xf5\xaf\xe6\x80\x1e\x59\xc1\x4e\x58\xbd\xa3\x7c\xc1\xee\x58\x87\x08\xbb\x82\x28\xc2\xfa\x7c\xec\x6d\xd1\x03\x0a\xef\x3b\x31\xae\x69\x41\x90\x1b\x0c\x51\xe3\xe0\xfb\x07\x2d\x7c\xc5\xeb\xf8\xb7\xce\x24\xa9\x44\x27\xdf\xfe\x7e\x73\x32\x33\xa5\xcc\xda\x6e\x63\x41\xd6\x65\x86\x85\xde\x13\x61\xa2\xc9\xd1\x4f\xff\xef\xeb\xf9\xbf\xff\xff\xff\xf7\xcb\x5c\xfe\x43\xfe\x23\xff\xc7\xe6\x1f\xe9\x3f\x1e\xfe\xb1\x7b\xf5\x53\x07\xf0\xcb\x9c\x66\x19\x75\x19\x26\xee\x7f\x73\xca\x4a\x05\xbe\xff\x52\x48\x94\x42\x37\x24\x42\xee\x25\xda\x11\x2c\x64\xc7\x71\xe9\xa5\x77\xc1\x4b\x45\x6e\x04\x59\xd1\xc7\x30\x9e\xf4\x2a\xf4\xbb\x5a\x41\x5d\xd1\xc7\x16\xaa\x04\x59\x53\x09\x35\xb4\x20\x1d\x7d\x83\x59\x0a\xfa\xd0\xaa\x2f\x4e\x11\xdc\xea\xb6\x02\x84\xbd\x57\xbe\xbf\xb2\x16\x60\xab\xf9\x72\x86\x30\x92\xe5\x72\x5e\xe0\x11\x66\x60\x7d\x3b\x69\xe9\x4c\x16\x38\xf1\xda\x83\x3b\x39\xe4\xf0\xb6\xac\xc6\xd7\x5f\xd9\x23\xa8\xd7\x26\x4d\x6c\xfc\x96\x58\x1f\x56\xb3\x30\x6b\x57\x60\xd2\x32\x35\x08\xb0\x5a\x46\x64\x0e\x38\xc2\x4d\x47\x81\xc1\x98\x35\xd2\x42\xc4\x74\x15\x15\x31\xe2\x76\x01\xd2\xba\xac\xa8\xa9\x97\xcb\xb5\xe3\x47\xf6\x3e\x30\xf1\x7f\x2e\xa4\xd0\x38\x52\x9c\x8e\xdb\xba\x43\xfb\x3d\x61\x77\x9b\xbd\x9b\x16\x0b\x82\xce\xae\x2f\xfa\x3d\x67\x81\xb8\xa4\x76\x83\xa7\xc0\x44\xcc\x84\xab\xbf\x18\x4b\x80\x35\x8b\xf5\x42\xb6\x0c\x4b\xce\x10\xd6\x32\xa2\x39\x97\x98\xd9\xe2\x69\x0e\x84\x20\x19\x76\x8d\x66\xb4\x94\x5a\x1b\x1b\xfa\x17\x3e\x1c\xc9\xe4\x51\x78\x7a\x96\xab\xc7\x73\xb1\x9d\xb0\x6e\xfd\x43\x15\x2b\x58\x2d\x75\xb8\x66\x72\x28\x80\x30\xc2\x0b\xed\x30\x12\x39\xed\x0a\x81\x55\x5f\x27\x69\x50\x7c\x22\x0d\x3a\x35\x7d\x6d\x68\x01\x37\x4c\x60\xd6\xb6\x15\x99\xc5\x36\xfa\xac\x75\xba\x0a\xb8\xa1\xa8\x2b\x36\x43\xd7\x5c\xe9\xff\xb9\x7c\xa4\xfa\x9a\x0c\x17\xfc\xba\xe0\x44\x5e\x73\x05\xef\x3e\x09\x25\x66\x52\x91\x08\xb1\xc6\x29\x5b\x57\x4f\xcb\xda\x0d\x13\x96\x5b\xde\xd5\xca\x16\x72\x36\xeb\x0b\x2c\x82\x4a\x74\xc5\xb4\xe6\x64\x57\x5e\x95\xe2\x94\x16\xb8\xd3\xa4\x18\x67\x73\x88\x19\x77\xd0\x03\x40\xab\x4d\xa3\xd2\xa1\x92\x8b\x16\xbe\x3c\x03\x05\x60\x2e\x09\xb2\xc3\x1b\x9e\x0e\xdf\x40\x36\x4f\x91\xe1\x84\xa4\xae\x76\x21\xd6\xb8\xc0\x8a\xac\x69\x82\x72\x22\xd6\xa1\x79\x16\x9a\x4f\xf9\xb7\x6e\xb0\x08\xd0\x88\x6a\x9e\xfe\xfa\x2c\xe1\xb0\x8c\x3e\x95\xd3\xfd\x25\xb8\xbd\x03\xe1\x18\xa1\x59\x01\xfb\x7e\xff\x0b\x1b\x63\x1b\x83\x1a\xee\x9b\x1b\xe3\xec\xff\xd2\xec\x14\x08\xe5\x7f\x9b\x48\x80\x05\x3a\xf3\xa9\x59\xfa\x69\xbe\x6f\x23\x30\x9a\xa0\x35\x54\x2d\xaf\xb6\xba\x96\x61\x86\x88\x11\x4c\xfb\x0d\xbc\xab\xce\x8d\x36\x43\x0f\x1b\x2e\x0d\x17\xaf\xa2\x07\x5f\xdc\x93\xdd\x8b\x59\xeb\xe4\xf9\xf2\x28\x5f\x5c\xb1\x17\xb3\x2a\xf4\xb1\x75\x0e\x2a\xf7\x0b\xdc\xf0\x2f\xe0\x6f\x2f\x16\x9d\x4b\xb0\x5f\x93\x0a\x5d\x8c\x07\xc9\xb5\x65\x16\x27\xdd\x74\x6e\xd3\xda\xa0\x66\x1c\xd8\x37\x82\xe7\x44\x6d\x48\x29\x8d\xa8\xe3\xa2\x94\x3b\x13\x05\x85\x24\xd3\x64\xa5\x4f\x33\xe4\xfa\x25\x5c\xa4\x94\x75\x52\x98\x26\x99\x65\x92\x59\x26\x99\x65\x92\x59\x26\x99\xa5\x81\x9b\x49\x66\x99\x64\x96\x5f\xb7\xcc\x32\xd0\x97\xbe\xed\x4d\xda\xeb\x5f\xb0\xe1\x59\x2a\x11\x14\x27\x81\xd8\x41\x07\x0b\x61\xa5\x04\x5d\x82\x15\xac\x8f\xc3\x26\x3c\xcf\x9b\x35\x18\xaa\xae\x3c\xf6\xe8\xa7\x9e\x0e\xd9\x3d\x2d\x16\x46\x08\x39\x2b\x7f\x43\xd1\xd6\x2a\x5f\x9c\x19\xab\x2c\xce\xa0\xee\x93\xb5\xc1\x66\x68\xad\xbf\x6e\xf5\x4a\xb2\xcd\x83\x1a\x19\xe7\xbd\x7b\x06\xb9\x92\x05\x4f\x17\xe8\x96\xe7\x55\xae\x80\xde\x11\x6b\x6d\x83\x45\xba\xa6\x93\x8a\x43\x0d\x8e\xb5\x89\xee\xe5\x0f\x1a\xec\x86\x16\x3e\xba\x85\xf9\x38\x90\x60\x29\xd3\x9f\x54\xb9\xa5\x05\x4f\xdf\xa2\xff\x8f\xa1\x37\x86\xbe\xf8\x03\x84\x07\x7c\x77\x75\xe1\x2f\xf7\xbf\x34\x23\xbf\xbb\x05\x74\xa1\x6f\xcd\x97\x92\xa8\x35\x4d\xd1\xd2\x94\xe8\xd6\x97\xed\x4b\x46\x1e\x4c\x82\x1c\x4a\x6c\xcd\x6a\x4f\x2a\x5a\x23\x43\xc2\x79\x6c\xaa\x49\xda\x61\x5e\xa1\xdf\x99\x71\x0a\x22\x6c\x67\x1f\x3d\x96\x3f\x6d\xea\xe3\xa7\x13\x9b\x77\x2d\x1e\xe6\xe2\x61\x3e\x9f\xcf\xf5\x3a\x5d\x03\xcc\x9e\x46\x9e\x8c\x2b\x1b\xb3\xe3\xbd\xdc\x2a\x6c\xc3\xc1\xad\xa7\x02\xa1\x25\x98\xed\xec\x2a\x16\x2f\x7a\xbe\x1e\x6a\x31\x18\xae\xb2\x13\x6e\x78\xfb\x84\x56\xb7\x55\xc3\x94\xde\x05\x8f\x6b\x72\xdb\xd3\x66\xc4\xdf\x17\xf2\xc0\x8e\x90\x81\x72\xaf\xa3\x5a\x58\xd9\xe8\x98\x5a\xac\xef\x4f\x81\x3c\xc2\xae\x05\x9a\xd7\x3e\x4b\xdb\xda\xe3\x37\xac\x3d\xb0\x55\x6d\xd5\x90\xd6\x7b\xe8\x47\x34\xa9\xdd\x6f\x45\xdb\x0b\x33\xae\x3d\xad\xaf\xe7\xa4\x8f\x39\x1f\x46\xa2\x03\xbd\x86\x0e\xec\xb2\x16\x4e\xd9\x0b\xf6\xa0\x7d\x42\xf7\xd9\x30\x93\x18\xd9\x77\xb6\xd3\x47\xa9\x5f\x90\x89\xdb\x33\xdf\xfe\xf4\xc3\x8c\xdf\xb3\xd8\x8e\x49\x5f\x84\xad\x0c\xf7\x98\x1d\xdf\x5d\xb6\x2d\xa7\xf4\x6f\xf4\x53\x1a\xcb\xba\x19\xf4\x02\x1e\xd9\x52\xf6\x5f\xed\x92\x19\xb2\xf2\x04\x1b\xc6\x1e\xd6\x2a\x76\xa8\x1b\xc2\x60\x5d\x80\x41\xcd\x37\xd4\x18\xf6\xb0\x96\xb0\xcf\x3f\xe7\x50\x03\xd8\xc3\x5a\xbf\x3e\xff\x9c\x43\x8d\x5e\x0f\x6b\xf1\xfa\xdc\x73\x0e\x1a\x26\x9a\x2a\x15\xc8\xbb\xc3\xfc\xed\xac\x32\x2c\x83\x0a\x26\xf7\x9b\x66\x9b\x8a\x7c\xf6\x0a\xb3\x9d\x83\x7a\x67\xde\x66\x3d\x33\x50\xcc\xac\xa9\xa3\xd3\xd8\xf6\x44\x9f\x73\x9a\x63\xb1\xd3\xc2\xb6\x9f\x03\xb5\x18\x26\xe3\x6e\x8a\x4e\x52\x31\x29\x91\x60\x81\xd8\x85\x11\x1b\xb0\x45\x0d\x77\x2f\x1f\x2a\xe1\x19\x32\x06\xc9\x9d\x4c\x54\xbf\x21\xa8\xad\xfd\x9b\xf7\x40\xeb\x6f\x18\xfb\xab\x60\x8a\xd4\x41\xaa\xa2\xd3\xbd\x72\x21\x28\xc3\x90\x9a\x07\x1a\x5c\xc9\xea\x02\xcb\x0e\xc6\xcb\xfd\xe2\x48\xee\xfe\xe9\xcf\x55\x37\x89\xc6\x4e\x2a\xcd\x70\xc9\xfa\xed\x7e\xb1\xbe\x03\xb3\xd8\x2a\x8e\x11\xa3\x7b\x22\x18\xa4\xd7\xda\xa6\x74\x55\x58\x4a\xbf\xdc\x30\x6c\xd8\x0f\x17\xbc\xe8\x69\xa8\x00\x15\x80\x0c\xd8\x9d\xed\xf0\xf2\x64\x9b\x74\xe4\x04\x3e\x83\xf0\x74\xdc\x19\x0c\x59\x45\xbd\xc9\xf3\xa1\x8e\x20\x4f\xb0\x89\x0e\xf7\x98\x3e\xb8\xbb\xf4\x41\x82\x97\xeb\x2b\xdd\xad\xb6\x75\x22\xa3\x44\xd7\x67\x6b\x2d\x1d\x27\x4e\x47\xa9\x3b\x43\xc7\x24\xbe\x91\xf4\x73\xb4\x90\x3e\x7e\xf3\xe8\xc3\xda\x46\xa3\x65\xa0\x9f\xda\x33\x34\x8c\x7e\x86\x16\xc5\x31\x4d\x5f\x07\x59\xc6\xb8\xc6\xd0\x87\xb5\x84\x46\xc1\x65\x8c\x6e\x06\xdd\xc4\xa5\x17\xea\x38\x1c\x1f\x07\x97\x51\xcd\x9d\x0f\x6f\xeb\x8c\x78\xbf\xb8\x84\x3a\x96\xa1\xc8\x86\xce\x95\xa9\xc1\x0b\x76\x44\x2b\xe7\x08\x4f\x42\xfd\x1c\xc6\x39\x83\x12\xf6\x21\xdc\x33\x5c\x98\x2b\xdc\xb8\x39\xb2\x35\xf3\x73\x9e\xde\xc3\x7c\x53\x90\xc5\x78\x96\x24\xbc\x64\xc3\xe9\x91\xb7\x9d\xd7\xfb\xce\x77\xfb\xad\xbe\x34\xd5\xd2\x84\xe0\x3b\xa2\xb6\x89\x45\x26\x3a\xf8\xa6\x27\x35\xdb\xbb\x72\x5b\xe8\x21\x3c\x69\x5b\x0c\xc2\xb1\x13\x69\x33\xb6\x36\xfc\xa1\x2a\x14\x61\xe2\xdd\xdd\x55\x3e\xc2\xe5\x05\xfe\x74\x4f\x91\xa0\x76\x22\xc5\xa5\x7d\xd3\xd4\x4e\xbb\xb5\x99\xd8\xbc\xca\xe6\xb5\xd2\x78\x1d\x97\xd4\x4b\x05\xb7\x0a\x2b\xb2\x2a\xb3\x5b\xa2\xe4\x7e\x47\x6b\xd7\xa7\x0f\x9c\xf9\x6d\x7f\x0a\xd4\xb1\xbc\x23\x79\x91\x61\xe5\xa9\xdb\x34\x32\xb5\xc1\x62\xee\xd4\x56\x79\x3c\xfd\x06\x30\x91\x52\xd1\x97\xc2\x30\x24\x84\xe4\x24\xa5\x65\x1e\xc5\x23\x4f\x7e\x00\xd3\xfe\xae\x20\x26\x66\xc3\xec\x9f\x01\x50\xd5\xf7\xc2\xc9\xbd\x49\x2c\xad\x8b\x30\x79\x4f\xde\x5d\xc3\xfd\x49\x25\x7a\xf1\xc2\x15\x56\x22\x98\x39\x83\xac\x21\x71\x9e\x92\x93\x46\x35\x26\x33\xa6\x1f\xf0\x87\xba\x55\x88\x29\x6e\x6c\x03\x4c\x5e\x5a\x00\xaf\x10\x17\xe8\x03\xc9\xa1\x44\xd4\xd3\xb0\x1f\x44\x3e\x8a\xb9\xac\x24\xfd\x99\x40\x1a\x4d\xdc\x26\xdc\x41\xdd\xf0\x3a\xf9\x27\x83\xba\x40\x6e\x37\x9c\xe2\x61\x8d\x77\x01\xa6\xea\x0e\x85\x73\xfb\x19\x47\x28\xfd\xd9\x16\x14\x37\x57\xbd\xe4\x46\xda\x4f\xe0\xae\xd6\x30\x73\xc0\x5a\xe0\x9e\x82\x9d\x01\x60\x2e\x09\xac\x74\x75\xb1\xcd\xb7\x8e\x62\xaa\x09\x3c\x78\xeb\x12\xa0\xda\x63\x9b\xb7\x3a\x92\x2c\x89\x7a\x20\xc4\xb0\xb0\x5b\x87\xbf\xc6\x9d\xa3\x85\xe1\xa0\x04\x08\x51\x63\x65\x0e\xc1\x11\x66\x56\x36\xeb\x4e\x9f\xdd\x76\x9d\xf5\xda\xc3\x7d\x17\xb8\xf5\x1a\x74\xcc\x68\xd6\x26\x64\xe7\x11\xab\x10\x5b\x32\x9b\xf0\x64\xa8\x2f\x20\x51\x47\x57\x5b\x38\x12\x39\x06\x75\xcc\x1e\x86\x16\x61\xdf\xba\xf9\x7c\x5e\x5d\x00\x5e\x8e\xdb\xe6\xae\x07\xf0\xb1\x3a\xf9\x38\xee\x18\x9d\xdd\x5c\xd9\xf7\x5b\xf9\x9c\x5b\xf3\x1b\x49\x4d\x5f\x43\x6c\x2e\xd6\xc0\x31\xaa\x02\xfb\x4c\x26\x17\xb0\x7e\x8b\xbf\x05\x5c\xc7\x9a\x84\x5c\x93\x12\xce\xb6\x44\x28\x08\x63\x5d\x33\xfa\x73\xa0\x41\x9f\x19\xbd\x12\x17\x21\xf0\x12\xca\xf8\x9a\x52\x21\x70\x0a\x66\x95\x10\x24\x08\xa4\xf5\x94\x2c\x02\xb2\x0b\xb2\xeb\x61\x7b\x6b\xaa\x16\xf7\x7f\x04\xf2\x4a\x78\x9e\x97\x8c\xaa\xdd\x29\x14\x9a\xa0\xcb\x52\x71\x21\x4f\x53\x2d\x7b\x9d\x4a\xba\x9e\x63\x91\x6c\xa8\x22\x50\x0f\xe5\x14\x17\x74\x0e\x8b\x83\xc4\x37\xb9\xc8\xd3\x6f\xaa\x14\xbb\x83\xf9\xe2\x3d\xf5\xf7\x99\x6f\xef\xe5\x5f\xa9\xd1\x43\x70\x2b\x90\xb0\xde\x1a\x57\xd4\xf1\xd3\xe5\xed\x5d\x95\x24\x19\x90\xe0\x69\x55\xcd\xaa\x0e\xdb\xac\x37\x53\x23\x9c\xb2\x95\xab\x06\x5f\xd5\xb3\x75\x49\xd9\x61\xd5\xc0\x74\x3e\x91\xe5\x12\xb8\x8d\xcb\x2a\x45\x8a\xf7\x55\x03\x44\x57\x0c\x9d\xe3\x9c\x64\xe7\x38\x54\x0c\xf5\x99\xb7\x12\x82\x79\xe6\x7a\x3b\x0e\xdf\xcc\xdc\x53\x7a\xa8\x7f\x43\x6f\x15\x66\x29\x16\xa9\xdd\x06\x7d\xf5\xd7\x25\x6e\x9e\x79\xb5\x6e\xa0\xf0\x52\x03\xc5\x2d\x65\xac\x21\xe7\x04\x6c\x37\x4d\xee\x93\x12\x09\x97\x77\xb2\xc1\x02\x27\x8a\x08\xe8\xbd\x67\x2e\x25\xff\x81\x36\xc1\x47\x96\x94\x5c\x13\xa3\x82\xa7\x08\x97\x6a\xc3\xc5\xc1\x12\x4e\x5d\x91\x7d\xee\x6e\x97\xfa\x27\xf3\x4b\xa2\xef\x02\x2f\x55\xc4\x94\xdf\x36\x7d\xe5\x3e\xf0\x34\xdc\x12\x70\x8f\x79\xd7\x1f\xd5\x01\x87\x4d\x04\xda\x6e\x75\xb9\x7e\x23\x00\xb5\x15\xbd\x65\x99\xf4\x06\x6f\xc7\x67\x1b\x07\x50\x66\xa6\x32\x87\xa9\xcc\xdf\x84\x5a\x0a\x46\x74\x1a\x8f\xec\xec\x17\xd3\x08\x5a\xd3\xb8\x51\x85\xc6\x55\xa6\x36\xca\x78\xd5\xbc\x42\x23\xd0\xea\x55\x0c\x17\x72\xc3\xd5\x45\x05\x38\xb8\x14\xb0\x23\x55\xca\xf7\x1a\x62\x7a\x40\x40\x30\x86\x21\xd3\xdc\x29\x29\x85\x20\x4c\x65\xbb\xbd\x31\x82\x90\xad\x5e\x0c\x16\xbe\xda\xf7\x02\xd6\x13\xc3\xfa\xab\x08\x73\xa8\xbf\x00\xf7\x7d\xb8\x91\x42\x82\x99\x83\xb4\x37\x91\x26\x58\x48\x98\x07\xc3\xb4\x09\x19\x0c\x2f\x1f\x31\xf2\xe0\x48\x4f\x2f\x15\x00\x39\xb3\xb6\x20\xa6\xa6\x98\xbb\xff\xdd\x7b\x03\xfd\xbf\x5d\x0e\x70\xa3\x4f\x5c\x6b\x91\x75\xe8\x53\xff\x6a\x82\xd0\x5b\x2b\x6d\x46\x3c\xda\x4b\xcb\xc5\x49\x3a\xf1\xda\x36\xbd\x09\xc2\xac\xd7\x6b\x77\xc9\xb4\x62\x22\x5b\xa8\x6e\x73\x65\x04\xfc\x55\xa9\x49\x64\x86\x1e\x88\xd6\xaf\xd9\x50\xeb\x7c\xb7\xb4\x5c\x1f\xe1\xc6\xa4\x5d\x50\xaa\x9d\xde\x92\x6c\xf0\x96\x72\xd7\xc2\x3b\x08\xb2\x89\x42\x7d\xfd\x9b\x18\xd6\x50\x11\xe6\xd8\x36\xfc\xb8\xa0\xde\xc0\xc8\xe6\xd3\x96\xa9\x6f\xae\x4c\xf8\xaa\xa5\x74\x13\xbc\xeb\x2a\x66\x0d\x0a\x38\xee\x59\x12\x2d\x18\x55\x35\xb3\x8d\x1f\xa5\x09\xbb\x5d\x39\x79\x10\x4b\xa8\x15\x61\x02\x42\xd9\x5e\xdf\xcf\x44\x6f\xc9\xd9\xcd\x95\x99\xf1\x02\xbd\x0b\x26\x77\x58\x0c\xb1\x9d\x2d\x37\xa4\x36\x54\xa4\xf3\x02\x83\x83\x4e\xef\xe5\xac\x35\xdb\xaa\xbe\xc5\x00\xc8\xe8\xee\xa8\x21\x01\xd4\x3d\xad\x7d\x71\x72\x28\xd4\x3c\xb4\x66\x92\xaa\x40\xcc\x3e\xb6\x8f\x35\xcb\xa1\xde\x02\x9d\x59\xf6\xd9\x0e\x9f\x79\x96\xc3\xbd\x54\x21\x55\x84\x06\x13\x96\x82\x25\xc7\x51\x8c\x64\x86\x42\xc5\x7e\x9a\xcf\x7e\x1d\x16\x57\xf9\xa7\x91\xc5\xd5\xb4\x49\x84\xeb\xae\x54\xd3\x7b\x76\x51\x63\x50\xe7\x42\x23\x38\x93\xbf\x90\x50\xf3\x89\xcf\xa6\x69\xa1\x22\x96\xb8\x0f\x2b\x36\x34\x38\x7e\xa7\x60\xce\x97\x2d\x3c\xd4\x45\xcd\x00\x11\xa3\x81\x82\x44\xcd\xe7\x17\xde\xa1\xa8\xa2\x45\x83\xc3\xf7\x15\x35\x1a\x2c\x60\x34\x08\x35\x54\xe0\xa8\xb7\x98\xd1\x20\xc4\xa3\x17\x3b\x6a\x3e\x5f\xb0\xf0\x51\xf3\x89\xa4\xc8\xa8\xd7\xa4\x27\x81\xbc\xf9\xf4\xa6\x39\x9b\x62\x75\x7c\x4b\x44\xb3\xb9\x55\xc2\xa1\x2b\x5a\xa8\x99\xb2\x79\x96\x94\xf5\xa5\x8d\x37\x9f\x58\xbe\x18\x93\x4e\xee\x5d\xce\x98\xd4\xf2\x41\xfa\x68\xa5\x9e\x8f\x4c\x33\x6f\x3e\x11\x7a\x67\x67\x21\xf1\xe9\xe7\x83\x70\x51\x3b\x41\x3d\x26\x15\x3d\x02\xe6\xd8\x64\xf5\xe6\x13\x4b\x0a\xe6\x09\x26\xb1\x37\x9f\x03\x12\xda\xa3\xe0\xa2\x46\xec\xeb\xf0\xe2\xd0\x38\xee\x8e\xa2\x92\xde\x9b\xcf\x41\x09\xf0\x91\x0b\xd5\xfc\x34\x32\x19\x3e\x12\x62\x27\x65\x3e\x32\x31\xbe\x35\xab\x71\xe8\x1c\x4a\x98\x6f\x3e\xa3\x93\xe7\x23\x97\xbd\x97\x62\x3f\x98\x48\x1f\x09\xd6\x9b\x6e\xdf\x93\x54\x1f\x09\x32\x2e\xf5\xbe\x4e\xb0\x8f\x04\x7b\xbc\x34\xfc\xe6\x33\x90\x92\xdf\x7c\x22\xb9\xae\x79\x46\x52\x58\x9c\x05\xd0\x3d\x31\xda\x99\x79\xfc\xe9\xfc\xed\xb7\x22\x2a\x37\x34\xa7\x19\x21\xed\xc6\xaf\x68\x20\xfd\xbf\xf9\xfc\xb2\xa2\x71\x7c\x89\x80\xc1\x29\xb8\x12\x02\xa3\xcb\x05\x0c\x2f\xae\x59\x4e\x20\xaa\x74\xc0\x20\x48\x6f\x69\x81\x40\x19\x81\x08\x0d\x2e\xaa\xcc\x40\xbc\x10\x74\x54\x29\xd7\xf6\xc8\xf1\x95\x92\x6f\x3e\xfe\x2a\xdf\xb7\x0d\x28\x75\x5c\x87\xcb\x1c\xc8\x30\x0d\x04\xc0\xa0\xc3\xa3\x8a\x7a\xec\x0a\x50\xe4\x3e\xec\xbb\x88\x3a\x14\xae\x93\x6d\x1a\x8f\x91\xfa\x93\xca\x51\xf6\xd0\x8c\x42\xb2\x06\x95\x86\xf9\x2f\xac\x07\x34\xb1\x57\x47\xfe\xbf\xab\x3a\xe1\x42\x69\xcc\xdc\xc4\xb7\x3f\xd8\xc6\xa2\x61\x67\x03\x4b\xb2\x32\x35\xd1\x5f\x00\x16\x14\xc1\x71\xcd\xae\x47\xa3\x70\x14\x51\x7d\xae\x3e\x71\x02\xa7\xd5\x86\x6a\x33\xdf\x50\xd2\x94\x7e\x6e\xf6\xfa\x33\x43\xa8\x97\xf1\xac\x53\x39\x4c\x8f\x11\xab\x1b\xf6\xac\x42\xa7\xfd\x68\x17\xb2\x2a\x3b\x16\x3b\xeb\x4f\x82\x63\x21\x72\xa3\x22\x1b\xa8\xde\xa9\xef\x35\xa7\x76\x14\x67\x49\xe8\x93\x6b\x87\xfa\x6b\xf2\xb2\xe2\x44\x95\x38\x3b\xc8\xc9\x5a\x13\x0d\x81\xc0\xa0\x0d\xee\x0f\x45\xf9\x17\x73\xb6\x26\xb8\xc0\x09\x55\x41\x45\x71\xbc\x34\x12\x39\xc1\xbd\x32\xf6\xad\x03\x61\xb7\xb2\x36\xb2\xd9\xcb\xa7\xee\x34\x15\x9c\xc1\x36\xb2\x1b\xf1\xc0\x85\x99\x70\x66\xd6\x1e\x4f\x9d\xe7\xf6\x24\x9f\xbb\x4f\xf5\xcc\x7d\xc7\x34\xb8\x06\xc8\x4f\xaa\xfa\x6a\x75\x41\x40\xdc\xb9\x61\x97\x92\xfe\x4c\x40\x58\xf1\xa7\xd5\x20\x4b\xef\xf5\xbc\x1a\x75\xfc\x35\x9f\x3d\xf9\x04\x60\x6e\x15\x16\x8a\xa4\xc1\xd6\xde\x11\x34\xda\xee\x4a\xd3\xd7\x42\xbf\x9e\x88\x39\xc3\x99\x44\x29\x81\xff\x1d\x92\x8e\x97\xbc\x54\xc0\x73\xe1\x8e\x2c\xb6\xc9\x90\x8f\x34\x52\x84\xce\xb0\x54\x37\x82\x2f\xc9\x1d\x1d\x76\x5d\x75\xba\x84\x4a\x85\x4c\xa6\x3e\x78\xb6\x97\x66\x3f\x6a\x0a\x1a\x16\x9e\x5d\xc2\x69\x8a\x15\x99\x7b\xcb\x86\x34\x9f\x11\x12\xbf\x5e\xdb\x9d\xc0\x4c\xc2\x64\x9e\xb4\xc0\xd6\xb2\x90\xaa\x80\x46\x58\x8e\x91\x89\x4a\xe3\x8c\xd8\x3b\xd3\xc8\xf5\x60\x97\xfe\xc2\x08\xca\x89\x94\x3d\x69\x03\xdd\xa7\x85\x95\xbf\x94\x39\x66\x73\x41\x70\x0a\x81\xc8\x16\x08\xa2\xa6\xea\x0c\xf4\xfc\x8d\xa2\x69\x54\xd1\x75\x06\x78\xae\x90\x3a\x8c\x95\x11\x6b\x14\x04\xcb\x70\x8f\xfd\x9e\x25\x7e\xcf\xe8\xdf\x4d\xc9\x1b\x2a\x1b\xdd\xb2\xb1\xfe\x6f\xa1\x66\x28\xc7\xc9\x86\xb2\x18\x43\x04\x70\x33\x09\x21\x74\x1a\x59\xd6\x3e\x04\xb6\xc5\x35\xdd\x56\x8d\x4b\xf4\x1c\x07\x0d\xe7\xe6\xa9\xc8\xf0\x44\x76\x10\xa7\xf9\x27\x55\x36\x82\x43\xa2\x17\x2d\xf6\xd6\x57\x4b\x6a\xff\x31\x2d\xf1\x6c\xa4\x34\x89\xe3\xc5\x51\x06\x60\xe0\xd6\x47\xdd\xd8\xb0\x00\x7a\x10\xc8\x50\xd5\x86\xfa\x19\xc1\xe6\x6d\x75\x87\x98\x83\x60\x2a\x12\xd9\x68\x59\xbe\x1a\x00\xbc\xd0\x90\x8f\xb7\xf4\x38\xab\xd3\x1c\x0d\x88\xe7\xe6\x25\x35\x34\xb5\x51\xea\x7d\x58\x96\x2b\x36\x58\xc6\x6b\x5f\x37\xfa\x6d\x9f\x1a\x02\xa0\xbc\x98\x7f\x5e\x75\xea\x90\x9c\x35\xc5\x33\x22\xfa\x7b\x71\xb6\xab\x81\xad\xf6\xe2\x86\x50\xc1\xd3\x13\xd9\xfc\x3e\xb2\xc7\x54\x27\x49\xb3\xe0\xa9\x61\x91\x77\x15\x2c\x50\xb3\x95\xc2\xc9\xc6\x06\xcc\x99\xbf\x40\xac\x57\xdf\x36\x6a\x45\x46\xb9\x4e\x9c\x2a\xd9\x58\x8e\xa8\x04\x2d\x32\x82\xfe\x54\x99\xd4\x66\x64\xb5\x22\x89\xfa\x4f\x54\x4a\xa7\xb2\xc0\xfb\xfd\x28\xaf\x0c\x5b\x7f\x72\xff\xf5\x9f\xdd\x0d\x0c\x0b\x49\x66\xbc\x88\x02\x0e\x97\xf0\xa2\xbb\xfe\xdc\xfc\x61\x59\x06\x06\xd4\xd4\x06\x5b\xb4\x49\xb3\xf1\x90\x88\xe1\xba\xa6\x5f\x0c\xce\xb2\x16\x08\xb9\x30\xfd\x6d\x1b\x1b\x69\x83\x24\xac\xa5\xce\x03\x13\x0b\x82\xae\xf9\xad\xed\x48\x3d\x43\x37\x60\x65\xa8\x7f\x01\x7b\xdf\x35\xbf\x7c\x24\x49\xe9\x4b\x88\x1b\xa0\x6e\xaf\xc7\xad\x1d\x8d\x55\x7b\xd8\xcc\xba\x5a\x1e\xb6\x9a\x14\x07\x8a\x46\x2b\x6e\x71\xe8\xc1\xd6\x3d\xd9\xd5\x25\x8b\xad\x57\x0f\x3c\x11\xb3\x21\x33\xb8\xf3\x5b\x18\x77\xc8\x7f\x58\x43\x0a\xcf\x97\x94\x99\x89\x55\x79\x70\xf5\x98\xce\x48\xea\x8d\x94\xd2\x2f\xc1\x94\x0e\x41\x6c\xd8\xd1\xd7\xee\x06\x3e\xa2\xb2\x75\x65\xdd\xf5\x71\xb4\x3e\x17\x5e\xc3\x23\x77\xf9\xf7\x12\x67\xed\x1c\x6a\xfb\x53\xd0\x93\xd4\x29\x94\xfb\x40\xb3\x34\xc1\xc2\x24\xc7\xd9\x14\x1a\xd7\x15\xdf\x44\xcc\x27\x10\x5e\x6a\xd8\x47\x00\xc1\xb0\xf3\xd2\x9a\x86\xb0\x50\x34\x81\x36\x4b\xb6\xe3\xab\xc7\x07\x35\x94\x79\x55\x11\xe4\xad\xe9\xb5\x14\xb1\x09\x77\xfb\xdf\xec\x5f\x34\x05\x11\x94\xa7\xa0\xd4\x5b\x95\xc2\x4b\xe5\xd5\x71\x78\x69\x73\xd7\x2c\x75\xf2\x95\xe3\x29\xd5\xa1\x6d\x45\xb8\xf8\x93\xa3\xaa\xb4\x6d\xdb\x36\xf4\x55\x83\x33\x57\xa7\x72\x81\xfe\xbc\x73\x41\x38\x10\x90\x63\xe2\x4e\x3d\x20\xa1\xf8\x69\x3b\x49\xd4\x40\x6c\x1c\xf3\x15\x17\x64\x4b\x04\x7a\x99\x72\x88\x60\x25\x5b\x9a\xa8\x4e\x67\x2a\xf7\xfc\x3f\x44\x70\x20\x32\x46\xd6\x58\xd1\x6d\xe5\x87\x70\x6a\xbb\x72\x61\xcd\x12\xbd\x46\x2f\x01\x18\xa2\x79\x4e\x52\x8a\x15\xc9\x76\xbe\x72\x18\xd6\xd2\x6c\xac\xca\xfd\x83\x3f\xbd\xf2\x51\xa0\xcc\x4d\x4f\x89\x9b\x16\x33\x34\x42\xdf\x1e\x27\xac\xae\x43\x6f\x1c\x81\xd7\x9b\xdb\x2a\x44\x58\x69\x2f\x8e\x11\x3a\x72\xf1\x40\xfd\x6f\x4d\x6b\xb8\x6a\x57\x66\xce\xc8\x01\xa7\x68\x50\xa6\xe9\x4a\x76\x4a\xe0\x84\xb2\x75\x44\x03\xde\xbb\xe6\x9b\x55\x1f\x5e\x8d\x2d\xf3\x07\x44\x5d\x23\xb7\x86\xf5\xbf\x6b\x28\x22\x8f\xfa\x50\xda\xb2\xcb\xd6\x2d\x00\x84\x5f\x07\x96\x43\xca\x29\xdb\xa1\xb2\x48\x78\x6e\x2c\x4f\x19\xd1\x92\x22\xa4\xa2\x2e\x05\xc1\xf7\x7d\xab\x7f\xc0\x1d\xce\x33\x75\xc8\x9d\x3a\xe4\xfe\x33\x74\xc8\xb5\xf6\xfb\xe0\xf9\xfb\x6c\xe3\xfe\x6c\x0f\xbf\x76\x23\x6c\x7d\x15\x57\xf6\xf3\x2a\x44\x90\xb3\xde\x2b\x8f\x97\xaa\x28\x55\x33\xe5\xd8\xac\xdd\x1a\x34\xdc\x40\x75\x2e\x43\x55\xf0\xae\x28\x08\x4b\x7b\x50\xa4\xb8\xdd\xf0\x2a\x38\x11\x64\x0a\x41\xd0\x9a\x30\xb8\xa0\x4c\x6a\x0b\x12\x44\x96\x19\x38\xd6\xad\x7b\x17\x72\x00\x5d\x33\xf8\x03\x74\xa2\xcf\x2e\xfb\xaf\x21\x85\x99\xba\x4a\xce\x64\x62\xd3\xd7\x9d\xc2\xb3\x43\xcb\x3e\x36\x6c\x3c\x27\x36\x7b\xb0\x59\xce\xcf\xc5\x15\x14\xbc\xc7\x96\x12\xd6\x67\xf0\x83\xbc\xcc\xb0\x54\x34\xf9\x73\xc6\x93\x7b\xbd\xe2\x98\xdb\xea\xe4\xec\x87\xdb\xce\x77\xad\x15\x32\x74\xf6\xc3\x2d\xba\xa0\xf2\x7e\x28\xdb\xc5\x75\x25\x6d\xea\x87\x18\xdd\x9b\x92\xd2\x27\x27\x12\x6d\x38\x74\xcc\x04\xdb\x9a\x0b\x45\x60\x9a\x49\x73\xe9\x35\xb4\x5a\x91\x16\x6a\x02\x3c\xb1\x7a\x04\x7e\x90\xc4\x2c\x75\xa9\x97\x0a\x59\x5f\xfd\x6e\xab\x61\xfb\xfa\x4a\xde\x05\x8d\x49\x6d\x24\x37\x7c\xde\xce\x99\xde\xf0\xd3\x01\xde\x76\xbc\x44\x0f\x38\x18\x35\xe2\x7a\x37\x2d\xd0\x1d\x2d\xde\xa2\xcb\x46\xa5\x6d\x53\xbd\xb2\x3d\x08\x95\x75\x46\x5e\x00\xaa\x15\x9e\x60\x6f\x8c\xa8\x01\x7d\xff\x8d\x2c\x85\x2e\x1f\x71\x5e\x64\x44\xbe\x45\x2f\xc8\xa3\xfa\xfd\x8b\x19\x7a\xf1\xb8\x92\xfa\x7f\x98\x5a\xc9\x17\x21\xb3\xc9\x55\x5e\xc5\x6b\x43\x0a\xb7\x4d\xb1\x5b\x12\x0b\xaa\x5b\x5e\xa9\xda\xde\x00\xd4\x63\x6d\x7c\x60\x08\x73\xb1\x6c\xf8\x03\x4a\xb9\x71\x7d\x40\x8e\x1c\x22\x42\x70\x53\xa3\x62\x0f\xdd\xe0\x00\x48\x78\x5e\x08\x9e\x53\x39\xe0\xc1\x04\xcb\x06\x1c\x01\xbf\xcb\x34\xc2\xe2\x04\xaa\x90\x0a\x94\x60\xe8\xd4\x32\xd1\xa7\xc8\x7d\xe4\x16\xd1\x47\x81\xe1\x9c\x3f\x4b\x81\x57\x2b\x97\x09\x30\x43\xaa\x5d\x5a\xc6\x91\xa9\xa6\x2c\x0b\x5f\x33\xc9\x10\xa9\xd4\x54\xf6\x8e\x3b\xbe\x8e\x4e\x53\xb2\x3d\x95\x29\x7e\x33\x83\xa9\xb9\x7a\x46\xaa\xb9\x8e\x00\x4c\x2c\xd1\x8b\x37\x2f\x16\xe8\x96\xe6\x34\xc3\x22\xdb\xcd\x9a\x2b\xae\x31\xa1\xf5\x53\x37\x54\xd8\x96\xfb\xe2\xf5\x0b\xf4\x92\x0b\x98\x8d\x56\x5e\x33\x82\xb7\xc4\xa5\x7d\x9a\x5a\x96\x20\x83\xbf\x5a\xf8\x77\x36\xd4\x35\xbd\x7e\x86\x74\x11\x64\x1c\x1f\xe9\x47\x96\xc5\x36\xf5\x3a\x71\xf2\xc9\x0b\x25\x4a\xf2\x42\xef\xd2\x8a\x8b\xc4\xf0\x61\x70\x97\x6e\x08\x44\x58\x7c\x0c\x15\x98\x43\xf5\x52\x29\xb3\xf7\xe1\x07\xbd\xd9\xb0\xed\x06\xb4\x97\x38\x02\x50\xa9\x44\x2f\xa0\x82\xff\x8b\x5f\x90\xcb\xa3\xc1\x32\xf9\xe6\x31\x90\xaf\x2e\x62\x31\x6d\xbc\x4b\xe8\xea\xc2\xf1\xf9\x86\x6f\x25\x6d\xde\xa3\xbe\xf2\xc2\xe6\xd1\xd7\xee\xcb\xb3\x1c\xff\xcc\x19\xba\xfc\xf3\xad\x9d\xc6\xab\x2f\x82\xa0\x27\x94\x5f\x75\xd8\x0b\x68\x98\x5e\xbb\x39\xfe\xb9\x14\x44\x8b\x1e\x31\x4d\xfa\xdc\xbb\xfb\xd2\x8b\xfe\x1d\x5d\x60\x85\x8d\x10\x63\x13\xd7\x7c\x98\xaf\xee\x42\x7d\x2e\x96\x90\x57\x6b\xcb\xbb\xf9\x25\x33\x14\x25\x32\x24\xc0\xf5\xd7\xe1\x90\xbc\x36\x25\xfd\x45\x4f\xe4\xdc\x7c\x07\xb1\x3f\x6f\xd1\x35\x67\x64\x06\x07\x15\xe9\x93\x6a\xff\xf3\x07\x41\x15\x09\xb0\x9d\x88\x0b\x45\x53\x66\x38\xd6\xad\xa3\xad\x36\xb5\x40\x48\xfe\x06\xea\xb6\x57\xcb\x32\xe3\x4b\x17\x9d\xf9\xd4\x79\x7d\xff\xe9\x6a\xc4\xb4\xbe\xff\x74\xf5\xbc\x53\x1a\x25\xfc\xed\xcb\x7e\xb5\x14\x57\x6b\xf2\xb5\x2c\x31\xe0\x86\x6a\xd4\x58\x18\x92\xdb\x16\x4e\x62\x0b\xdd\x68\x2d\x59\x6e\xb4\xc4\xf6\x14\x1c\x86\x13\xbe\xf7\x6a\x0a\xfe\x1f\xf6\xae\xad\xb7\x71\x1c\x59\xbf\xef\xaf\x20\x66\x1e\xd2\x0d\xc4\xc9\xcc\x9e\xc1\xec\xa2\xb1\x58\x20\x9d\x74\xcf\x09\xb6\x2f\xd9\xb8\x7b\xe6\xe1\xe0\x60\xc1\x48\x74\xcc\x8d\x2c\x6a\x44\x29\x69\x9f\x5f\x7f\xc0\x2a\x52\xa4\x64\x89\x17\xdb\x49\xba\x77\xac\x97\x99\x76\xac\x32\xaf\x55\xc5\x62\xd5\xf7\x7d\xa9\x90\xb2\x5d\x87\x0b\xe7\x4b\xaa\x14\x0e\x59\xb5\x45\x03\xf7\x48\x30\xb1\x6a\xa6\x7d\xe6\xbb\x62\x75\x07\xdd\x46\x35\x68\x23\xb9\x60\x78\xad\x93\xbf\x32\x69\xde\x9d\x2c\xf7\x05\x9f\x9f\x61\x44\xbd\x87\xf2\xbf\xfc\x15\x6a\x2d\x82\xd5\x80\xb9\xb3\x0a\x5f\x40\xfe\x34\x2f\xcd\x9f\x7c\x42\xef\x29\x2f\xe8\x0d\x2f\x78\xb3\x56\xd6\xf9\xe5\x49\xaf\x78\x52\xc2\x00\xec\xb4\xdd\x13\xdd\x07\xf7\x3e\x00\x0c\x35\x79\xa1\x24\x9c\x3e\x28\xc5\xf3\xf2\xa4\xf3\x1c\xfc\x68\x70\x1a\x84\x02\x1d\x0f\xd7\xe1\x30\x80\xd7\x43\xaf\x22\xb4\xc4\x7c\x86\x3b\x64\x98\x8c\xc2\xf3\xfc\xf9\xf3\xf5\xe5\xd6\x66\x4b\xed\xfb\x58\xb3\xa5\xbe\x3b\x6a\xb6\xe0\x0f\x1a\x68\x74\x82\xb8\x17\x1f\x8c\xbe\x3c\x92\xe5\xfa\xcf\x5f\x2b\x26\x64\x9a\x60\x00\x5d\x48\x07\x13\xab\xed\xd5\x56\xe2\x0c\xce\x83\x0a\xc4\x00\xc8\x82\x35\x55\x73\xf7\x0f\x4f\xdd\x4f\xc4\xce\x06\xe5\x90\xd0\x11\xd0\xa6\xc4\x0b\xdb\xbb\xb3\x13\x68\x47\x77\xea\x0b\xa6\xd1\xdb\xec\xb7\x8c\x55\xcb\x45\xcc\x1d\xde\x39\xab\x96\x6f\xe7\xfd\x00\x9e\xfa\x8c\xbc\x9d\x77\x7e\xa1\xdd\x47\x9e\xea\x57\x68\xae\xc4\x60\xdf\x91\x24\x05\x5f\xb0\xc9\xe4\xbd\xf0\xfe\x5a\x89\x92\x37\xa2\x8e\xe5\xf5\x85\xba\x7f\x18\x6d\xf2\x5e\xbf\x89\xd5\x0f\x99\x28\x0a\x96\x99\x18\x2d\x74\xcc\x88\xf6\xac\xbf\x91\xe3\x04\xd3\xe7\x71\x03\xf4\x66\xd0\x6f\x71\xa0\x4f\xaf\xdf\x9c\x5d\xbc\x7f\x73\xb2\xca\xbf\x5f\x8a\x87\x59\x23\x66\xad\x64\x33\xde\x4c\xdb\xa3\xa7\xa1\xc7\x85\x92\xc0\x65\xec\x20\x7e\x34\x81\x7d\xf2\x59\x62\xc4\x18\x42\x33\x6a\x15\xb0\x9c\xd4\x42\x34\xc7\xa4\xa6\x3a\x94\x3f\xa9\x36\x88\x3e\x32\x2c\xda\xa2\xc0\x11\x6f\x6a\xc6\x8e\xdd\x78\x88\xa7\xe8\x7f\xff\x76\xda\xe9\x56\xac\x1a\xf6\x05\xdb\x58\xcd\x92\xd5\xb0\x1f\x66\x95\x3c\xf2\x52\x8b\xd7\xf5\xd3\x06\xda\x37\xaa\xf3\xee\x5d\x73\xc7\xab\x16\x9d\x1a\xe3\x3b\xb6\x26\x81\x4c\xbc\x85\xa8\x01\xf9\xbe\xbf\x3e\x58\x93\x41\x77\x01\x62\xf6\x44\xdb\x92\x27\xd8\x95\x31\xb6\x04\x1a\x73\xcd\x16\xdb\x0e\xd4\x35\x5b\x60\xc1\x58\xbf\xfa\x09\xe0\x12\x59\xd9\x40\x46\xb1\x37\x8c\xa7\x87\x63\x74\xe4\x74\xd5\xf3\x13\x0c\x55\x5c\xc2\x7d\x18\x1e\xea\xeb\xbb\x45\xb5\xcf\xde\xee\x53\xed\x93\xa0\xd6\xbd\xe9\xa2\x3e\xea\x32\xaf\x5e\xaf\xcd\x26\xad\x69\x2e\x24\x32\x41\xa8\xb1\x38\x8e\x8b\x49\xd2\x7c\xc5\xcb\xaf\x62\x2b\x86\x1c\x2c\xaf\x9d\x0f\xb9\x4f\xbc\xcc\xa7\xc6\xb7\x3f\xb6\xe7\xf0\xcd\xbe\xff\x84\x6f\x5b\xd4\x44\x7d\xf7\x47\xcd\xf9\x63\xf2\x9c\x2b\x4a\x73\x37\xd8\xbf\x19\x8c\xda\xd0\xab\xb5\xfc\xbd\x98\xe1\x6f\xcf\xaa\xdc\x8e\xf8\xf3\x5c\xe8\x3d\x55\x50\x67\x70\x19\xf7\x0c\xa1\x9d\x28\x7f\x31\x71\x76\xc8\xc1\x15\xda\xeb\x28\xc6\x78\x3f\x5b\xd9\x74\xc0\xdc\x96\x06\x19\x06\x73\x5b\x10\xbc\x5b\x9f\x7a\xfd\xee\x4f\xc7\x79\xa7\x99\xfd\x10\x55\xaa\xd4\x39\xd4\x1f\x2b\x56\xce\x1b\x9a\xdd\x79\xe2\xd8\x07\x3b\xfc\xac\x76\x38\xf5\x26\xcc\xa4\xc5\xe4\xdd\x7c\x73\x60\xbd\xd2\xd7\xb8\x36\x6b\x06\x17\xf9\x57\xa8\x75\x1e\xf3\x76\x0b\xb3\xaa\xde\xd3\x09\x40\xda\x7e\xe4\xc2\x7c\x77\x60\x7c\xbb\x8f\x21\xf6\xa4\x93\x41\x2b\x51\xb5\xc5\x74\x56\x35\xe4\xbe\x63\xc3\xb7\x34\x96\xda\x79\x4a\xb9\xca\xb2\x4a\x64\x25\x72\x46\x6e\x78\x47\x03\xae\x1c\x01\x83\x67\x0c\x36\xd3\xb3\x0a\x6e\xba\xfc\xe5\x93\x7e\x22\xa4\xc3\x53\xf2\x03\xf8\x1e\x3f\xfc\xe5\x2f\x7f\xb1\x69\xec\x3e\x0b\x2c\xc8\x0f\x3f\xff\xf4\xd3\x09\xb9\xd0\x24\x3a\x9c\x75\x5c\x89\xdd\xf1\x8e\xd6\x0c\xf2\x9b\x29\x64\x67\xfb\x89\xf4\xf4\x00\x6b\x9b\xa0\xf3\x53\x91\x56\x14\xd1\x79\xd5\xa4\x15\x3c\x6b\x90\x43\x0b\x37\xb9\x26\x69\xf4\x0a\xa5\xe6\xf7\xbb\xfc\x13\x18\xcb\x63\x52\xf0\x3b\x46\x16\x12\xd0\x79\x2d\xc6\x0b\xa6\xbf\x79\x24\x66\xb4\x84\xa4\x73\x68\x80\x9d\x15\xc9\x9a\x27\x49\x60\x08\x04\x85\x86\x45\x4e\x3d\x5e\x4b\x20\xe0\xbd\x63\xeb\x19\x4e\x7d\x45\x79\x97\x3b\x77\x41\x9b\x69\xfc\x7e\x93\x28\xdf\x57\xf6\x19\xcb\x9d\x0d\x66\x12\x10\xab\x5a\xfc\x1b\x27\x9b\x97\xde\x94\x18\x17\x34\x5c\x6a\xc7\x4f\x23\xf7\x94\x0e\x12\x88\x41\xc6\xd3\x74\x8d\xfe\x5c\x13\x5b\xc6\x31\x52\xe0\x55\x70\xe0\x1e\xb8\x63\x6b\xb9\xd9\x5a\xaf\xbb\xa1\x4f\xdf\x36\xdb\x52\xad\x6e\x89\x6b\xa6\x2d\x37\xe4\x22\xda\xb8\xcf\xa2\xa3\x2a\x82\x46\x52\x53\x91\xe3\xe4\x72\x42\xf5\x80\x46\xb7\xd6\xdf\xd5\xf3\xe4\x11\xda\x4d\x45\x2f\x63\x47\xb2\xa6\xd5\x93\x03\x89\x58\xaa\xbd\x4c\x4a\x5d\xc6\xb0\xa2\xf5\x9d\xb7\xef\x26\x8f\xf7\x84\x5c\xa9\x2e\x77\x89\xb8\x58\x3f\x73\xcf\x3a\x7e\x17\xd5\x54\xed\xcd\x04\xda\x79\x74\x72\x72\x84\xea\x41\xd4\x44\x36\xb4\xd6\x3b\x5a\x7d\x3e\x6d\xca\x82\xb1\xd0\xde\xc2\x7f\x4f\x2b\x87\x6b\x05\xaa\xaa\x04\x14\xc2\x34\x4b\x4b\xe8\x1a\x46\x86\x88\x05\x0c\x88\xc0\x57\x1c\xcd\x59\x6f\x84\x59\x80\x7b\x43\x04\x5f\x05\xa0\x8b\x36\xda\x12\x30\x31\x48\x20\xc3\x0b\x16\x46\x2b\x5c\x45\x58\x96\xcb\xc5\x00\xb2\x3d\x28\xd5\x59\xcb\x8e\xfd\x1c\xb0\xeb\xf6\x8c\x45\x50\xa4\xdf\x98\x8c\x9a\x8c\x70\xe7\x83\x26\x65\xd3\x70\x04\x85\x46\x18\x16\x7c\xe2\xcc\x0b\x3e\x31\x46\x06\x1f\xff\xbd\x00\x3e\x1b\xeb\xba\xd3\x0c\xb8\xc5\x17\xd6\xea\x42\x95\x60\x15\x85\xd1\x8f\x9b\x03\xa9\x43\x35\x77\x03\x2d\x09\xbd\x91\xa2\x68\x1b\x14\x6d\xff\xa8\xd5\x4e\xd4\x4a\x82\x46\x19\xec\x38\xd0\x38\x9d\x18\x47\x15\x81\xb2\x8f\x43\x32\xf4\x6b\x2d\xfd\xc3\x7b\x85\xa0\xf7\xc2\x1b\xce\xa0\x87\xc1\x2b\xa3\x40\x95\x79\xf8\xca\x28\x81\x3d\xfd\x2b\x3a\x27\xee\xf9\x8c\x18\x31\xaf\xbe\x3a\x98\x91\xb1\x1a\xab\x86\xb1\x2e\x96\x2d\x88\x41\x43\xec\xf3\xf8\x7d\xb5\x32\x6e\xeb\x7d\x41\x8f\xd0\x41\x4c\xf2\x98\x23\xd8\xfc\x92\xbc\x38\xef\x4a\x35\x0c\xdf\xea\x65\xd9\xb0\x7a\x41\x33\xf6\xd2\x3d\x9a\xf9\xf3\x86\x4c\xa5\xc4\x92\x96\x79\x61\xea\x40\x08\xfb\xa2\x19\xe7\xd4\x2f\xe5\x35\x87\xc2\xca\x33\x97\xba\x67\xa2\xb2\x32\xe2\xc0\x06\xd2\x62\xf3\x37\xf0\xa7\x47\x28\x6f\x9d\x86\x41\x17\xb0\xfd\x7e\x3f\xb6\x3b\x6b\x9e\xa8\x05\x00\xf6\x03\x54\xd3\x5a\xb4\xb5\x0e\xb0\x1b\x36\x95\x4c\xd4\xea\x08\x16\xe2\x9e\xa0\x92\xd4\xec\x56\xf9\xaa\x35\x62\x01\x22\xcc\x60\xab\x3e\xd8\x29\x27\x6d\x4f\x79\x7d\x4e\xee\x9d\x0e\xc3\xfa\xe2\xb4\x26\x40\xbb\xd0\x4e\xb2\xb8\xe7\xb9\x71\xf4\x91\x50\xf5\xde\x54\x94\x56\x54\xca\x8e\xa7\xc8\x3b\x40\x52\x64\x1c\x0e\xd4\xce\x8c\xa1\x33\x0e\xee\x46\xce\x1a\x56\xaf\x78\xc9\x7a\xb9\xfb\x71\x01\x6b\x64\x29\xf5\x60\xff\x46\x0c\x74\x29\x72\x76\xd5\xde\x14\x5c\x2e\xe7\x89\xd1\xc8\x0f\x23\xaf\x62\xf6\xc3\xc6\x1d\x23\x46\x28\x7d\x67\x82\x61\xec\x92\x48\x06\x50\x3b\xf7\xcc\x45\x2d\x04\xef\x96\xca\x8e\x20\xf2\x7c\x3e\x9e\x15\xa6\x5b\xab\xf7\x87\x80\x8a\x90\x82\xe9\x7a\x69\x35\x11\x4e\xdb\x7f\xb5\x64\x54\xea\xd3\xcf\x65\xe5\x7e\xee\x3d\xb4\x17\x85\x1c\xf2\xc4\x1b\xe5\x8c\x9e\x9a\xe1\xea\xc6\xd5\xc3\xd5\xc2\x0a\x8f\x05\x1f\x70\x3e\x38\x25\xa8\xfd\x61\x92\x48\xf6\xd4\x2c\x69\x49\x84\x17\x23\x09\x5f\x07\x28\x0b\x23\xaa\x9b\x23\xc4\x1d\xc0\x05\x3d\xbd\x94\x0e\xe1\xde\x67\x0d\xf7\x26\x5e\xb8\xcc\xf5\x59\x08\x37\xa3\xc6\xea\x1c\xd4\x8e\x1a\x55\x1f\x3e\xb2\x06\xee\x6c\x76\xba\x02\xc1\x5f\x3f\x6b\x90\xb3\xd2\x0b\xe6\x99\x08\x14\x19\x35\xf4\x23\x45\xa5\xb6\x2d\xe0\x3a\x30\xa9\xf5\xc8\x4c\x1f\x30\x33\x67\x2f\x04\x83\x84\xdd\xce\x72\x34\x96\x96\x67\x8d\x30\xd8\x5f\xfc\xf0\xc8\x27\x32\x17\x59\xdb\xf1\xa9\xc0\xfc\xd9\xeb\xca\x10\x0e\x7e\x70\x8d\x05\x73\x74\xa1\x7d\xdb\xf8\x74\xb9\x78\x28\x1f\x68\x9d\x9f\x5d\x4d\x94\x0e\xf4\x5d\x1e\xfb\x6d\xd7\x8b\x33\x42\x80\x47\x0d\xb1\xec\x74\x2a\xad\xcf\xb1\x1b\x44\xe1\x0f\xf1\xf6\xfe\x10\x1d\xe2\xed\xdf\x40\xbc\x5d\x7d\xb7\x4f\x98\xd3\xdb\x0b\x3a\x8e\xe5\x0d\x28\xa5\x05\x3a\x9d\x1d\x88\x1a\x71\x98\x13\xef\x38\x64\x7e\xe3\x27\xf4\xea\xb6\xb3\xe6\x38\x78\x7a\xfb\x06\xe1\xf4\x63\x03\xa6\x20\xc7\xeb\xbd\x8e\xf4\xd5\x49\xe0\x9d\x03\xb6\x07\xde\x1a\x38\x17\x13\x95\x88\x60\x88\x00\xf3\x0a\x3c\xd6\x88\x00\x75\x8c\xec\x36\xf2\x18\xcf\x6c\x00\xb4\xa3\x1c\x90\x8a\x66\x0c\x76\x54\xa7\xb8\x83\x61\xb8\x14\x56\x9e\x30\x1b\xfc\xe4\x40\x18\x56\x78\x03\x79\x82\x34\xf0\xea\x7f\xdf\xaa\xd1\xb8\xf2\x47\x80\xec\xc3\x25\x51\x6e\x41\xc3\xb0\xb0\x99\xd5\x2b\x49\xc4\xe2\xb8\x57\x33\xf3\xdd\xfd\x8f\xde\x72\x75\xf3\x24\xd1\x7f\x2c\x4c\x33\x93\xbb\x7e\xd5\x0b\x2a\xaa\xa9\xb7\x48\x2f\xc1\x9b\x07\xfb\xd8\xbb\x16\xd8\x96\x38\x9e\x7b\xee\x66\x2c\x67\xc9\xcc\x0e\x47\x54\x1c\x31\x82\x8a\xe4\x70\x09\x70\xb8\x04\xf0\x7f\xf7\x11\x2f\x01\x1c\x35\x0d\xbb\x95\x4b\xa2\x07\xc0\xbd\x18\x08\x04\xab\xf0\x19\xdc\x1e\x58\x06\x67\xed\x56\x99\xab\x01\x73\x2f\x10\x81\x14\xec\xdc\x51\x92\xa3\xa3\x93\x93\xa3\x23\x73\x9b\xa0\x17\x6e\xdb\x2c\x66\x7f\x25\xac\xcc\x44\x8e\x8b\x2a\xdc\xcc\x05\xaf\x65\x03\x86\xdb\x9e\x8f\xdd\xbe\xae\x4c\x5b\xed\x15\x43\xf8\x5e\x01\xda\x16\x47\x7c\x18\x05\x65\x8b\xb5\xf3\x6f\xb7\x32\xbc\xd6\xdc\x76\x35\xf8\xba\xa3\x1d\x06\xcf\x2b\xb0\xab\xc1\x6e\x59\x14\x7f\x24\x6f\x85\xed\x61\x78\x42\xc9\x0b\xfc\xf0\x24\xab\xda\x63\xfd\x85\x93\x15\x5b\x89\x7a\x1d\x56\x11\x46\x88\x7a\xb9\x27\x55\x4b\x78\x09\xb6\xdc\xb2\xb5\x3f\x8e\x55\xef\xc6\x23\xc4\x7f\x62\x9e\x41\xa6\x70\x17\x27\x87\xe8\x8c\xe5\xd4\x59\x74\x00\x1f\x32\x8e\x36\xce\xc4\xb6\xe0\x4d\x56\xde\x93\x7b\x5a\x7b\x49\x77\xcd\x93\x64\xc8\x73\x7e\xcf\x65\x1c\xeb\xde\x44\xcc\x03\xa0\xfa\x10\xec\x0a\xf5\x57\x0c\xd9\xb9\x79\x34\x06\x92\x5d\x55\x03\xdf\xe5\xc7\x28\x70\xef\x94\x0e\x9b\x5f\x4a\x9f\x5a\xab\x15\xbb\x3d\xd4\xb9\x2e\x7b\x9e\x97\x78\xcf\x23\x92\x88\x3d\xd2\xf1\x88\xbb\xc0\x7c\x8a\x0b\xca\x80\x10\x08\xf1\x5e\xf0\xa8\xe4\xfd\x37\xfa\xbb\xfd\x0c\xc2\x86\xad\x2a\x51\xd3\x7a\x4d\x72\x7d\x1e\x5f\x9b\x28\x06\xad\xa7\x81\x87\xa1\xf0\xd1\xa9\x7c\xdc\x19\x95\x04\x7a\x92\xf3\x7a\xdb\xfc\xfd\x15\xcb\x79\xbb\x8a\x8d\x8e\xfc\xe6\xf2\x5a\x19\x50\x00\x14\xd1\x21\x6a\xd2\xec\xce\x87\xb8\x0a\x42\xcd\x90\x21\x1b\x9a\x53\x9a\xf4\xdd\x77\x03\xe8\x54\xf0\x40\xe1\x3e\x4d\xe4\xec\xc8\x1f\x71\xd3\x62\xb0\x3d\x4e\xe0\xa5\xd4\x21\x7d\x9d\x0d\xf4\x42\x7f\xf1\x25\x11\x35\x79\x0f\xb6\x21\x31\x83\x76\x7f\x13\x44\x22\xeb\xc9\xf8\xff\x31\x60\x7e\x8e\x46\xad\x12\x0d\x2d\x2c\xdb\x38\x29\x44\x46\x8b\x6e\xc6\x7a\x56\x25\x30\x57\xdd\xf2\x37\xb7\x91\x6a\xc6\x54\x7b\xd0\x3e\x43\xb0\xa3\x90\x78\xbb\xc5\x33\x60\x73\x50\x52\xd1\xe6\x7a\xe4\x9a\x59\xfa\xe4\xb0\xa3\xb7\xc0\x98\x01\xa8\xd2\xea\x6d\xb3\xb2\xba\x26\x3c\xa8\x15\xe6\x0b\xbb\xe1\x52\x31\x44\xde\xfd\x03\x08\x00\x4b\x9a\x71\x74\x0e\x80\x81\x6a\x7a\xe3\xbe\xcb\x16\x9c\x3b\xdd\x32\xed\xbc\x88\x05\xdc\xd2\x74\x46\x5f\x76\x50\x86\xbe\x15\x35\x58\xf3\x25\x2f\xfa\x8b\xde\x20\xd3\x75\x03\xdc\x96\xfa\x2e\x3f\x61\x9d\x8e\x2f\xd3\x56\xb2\x7a\x76\xdb\xf2\x7c\xaf\x0b\x34\xa0\x6d\x17\x59\x84\x9e\x7d\x7b\xde\x57\xb0\x6f\xf9\x4d\xcd\xc8\xf9\x92\x96\x25\x2b\x1c\x93\x39\x00\x4b\x9c\x0a\x28\xbb\x10\x8a\x01\x04\xc5\x3d\x20\x3d\x7c\x1b\x55\x50\xcf\x09\x6d\xf3\x8d\xc0\x03\x16\x6d\x34\x30\xa0\x8d\x98\xbc\x3d\x27\x0d\xad\x6f\x59\xa3\x5e\x27\x65\xbb\xba\x61\x9e\xdd\xf4\x7c\x50\x76\xcf\x5f\xd8\xb5\x5b\x05\x16\x0e\xf2\x6f\xbf\x7d\x88\x46\x7c\x18\x9b\xa3\x07\x51\x17\xf9\x03\xcf\x31\x45\x47\x92\x17\x4a\xe0\xcb\xe7\x07\x61\x78\x78\xe0\x53\x80\xfa\x81\x8e\xe9\xc0\x18\x74\x8c\x40\xcf\x74\xb9\x10\x57\x16\xe9\x05\x08\x9e\xc2\x80\x57\xcf\x1b\x0e\xc1\x28\xf8\x9e\xf2\x89\x5c\x7e\x07\x75\x18\xeb\x86\x1d\x54\xa7\x5a\xe3\x3a\xc8\xe7\x91\x09\x28\xf8\x37\xad\x0e\xd1\x88\x66\x49\x24\x5f\xb5\x45\x43\x4b\x26\x5a\x59\xac\x3d\x4b\xe1\x69\x06\x3c\x64\xb3\x0a\xf6\x05\x97\x6e\x8c\xed\xea\xbe\xdc\xb7\x61\x00\xac\xcc\x33\x33\x41\x3d\x23\x36\x75\xdb\x24\x31\x97\x49\x02\x8b\xda\x69\x57\x17\x8c\xfc\x2e\x90\xed\xc6\x32\x72\x43\x95\xdd\xaa\x8a\xf6\x96\x4f\x44\xad\x9f\x2c\xb7\xcd\xe6\xed\x28\x4f\x3d\xc2\xa1\x0c\xa5\x30\xfc\x81\x81\xe4\x3e\x8d\x66\x95\x91\x9c\x55\xac\xcc\x01\x2a\xdc\xae\x34\xdf\xde\x83\xce\xef\x34\xc2\x3a\x0a\xfe\x9c\x09\x1e\x8e\x8e\x7b\xf3\xa5\xa9\xa9\x52\x4b\x2b\xa5\x80\x4c\x84\x9e\x2f\x08\x2d\x7d\x8a\x64\xff\xa9\x3a\xdf\xbc\x09\x7d\x34\x60\x92\xc7\x4a\x1a\x44\x1d\x17\x5c\xec\x26\xb5\x6f\x32\x85\xcf\xfc\xbe\x5b\x67\xe5\x45\xe1\x8e\x4f\xe5\x73\x13\xf6\xbc\x16\x51\x7d\x4b\x8e\xa4\x19\x61\x1f\xbb\x9e\x1c\xca\xb8\xbf\xca\xbc\xbe\xc7\xcb\xb9\x5a\x14\x22\xbb\x8b\x42\x12\x79\x8b\xdf\x1c\x9c\x94\xf5\x87\x43\x28\x11\x75\x06\x9e\xe8\xee\xf8\xc9\x58\xef\x21\xc7\xdc\x40\x4a\x81\x16\xaf\x16\x7f\x2d\xa6\x56\xb8\xd4\x60\x8b\x9a\x86\xb8\x2d\x27\x31\x0d\x22\x3c\x13\xda\x50\x99\x04\x2a\x38\x44\xd4\x95\xac\xc1\x7c\x40\x00\x28\x5b\xb1\x86\x02\x9c\xe8\xec\xef\xa1\x6b\x47\xdd\x67\x23\x43\xb9\x33\xa6\xff\x96\x31\x28\x13\xa5\xe4\x39\xd3\xd2\x73\x35\x17\x80\x85\xba\x8b\xc1\xd5\xbf\xf8\xf9\x73\x34\x4a\x80\xfa\xea\xa0\xcf\x96\xd4\xa7\x45\x2c\x6d\x7b\x0e\xf0\xf5\x79\xe1\x2c\x22\x2d\xe9\xd1\x62\x41\xb7\x19\xb3\x44\x92\x91\x10\xd5\x47\xbf\x9c\xbf\xe9\xbf\xd4\xdf\x00\xbf\x9c\xbf\xf9\x8f\x20\xda\xb8\xcd\x98\x85\x3c\xcf\xb9\xbc\x3b\xb0\x6c\xfc\x01\x58\x36\x36\x66\xfd\x5b\x8f\xa1\x1d\x28\x36\xbe\x62\x8a\x8d\x27\xd2\x51\x64\xaf\x81\xce\x2a\x4f\xf0\x05\x0c\x8f\x84\x1b\xa4\xb8\xba\x70\xc9\x23\x94\xc1\x38\x01\xf8\x52\xbf\x3e\xeb\x81\xee\x18\x40\x7c\x78\xf7\xe9\x06\xf1\x11\xf0\xbd\x7a\x38\xd2\xa1\xf3\xa7\x67\x84\x36\x50\xbb\x36\x8e\xc4\x4f\x3f\x50\xbb\x00\x9b\xe3\x2a\xdb\xca\xa9\xe1\xcd\x35\xab\x26\x2c\xc3\xc0\x95\xc1\xaf\x0e\xe2\x84\x9a\x9c\x5e\x72\xc8\x23\x40\xaa\xd7\x8e\xb3\x75\x72\xda\x31\x4a\x78\x42\x2e\xde\x5c\x5d\xbf\x39\x3f\xfb\xf4\xe6\xe2\x15\x31\xf2\xb9\xeb\x98\x9e\x90\x4f\xc2\x86\x15\x27\x4f\x05\x96\x4f\x0d\xf2\x21\x6d\xbb\x8e\xb5\xda\xa4\xa5\xbd\x8b\x05\x50\x14\x5a\x92\xcb\x92\x37\x5d\xd6\x92\xcf\xf1\xca\x0a\x51\x76\xc4\xfe\x95\xd0\x11\xcd\x5b\xde\x1c\xa3\x9b\xa5\x51\xd7\x97\xac\xff\x1b\x93\x22\x19\xb9\xc2\x5c\x8a\xae\xd9\x13\x27\xe7\x88\x03\x87\xc9\x47\x88\x65\xcb\xc0\x9b\x04\x9b\xf9\x01\x56\xc4\xa6\x24\x9a\x1c\x43\x83\x6f\xe2\xd9\x44\x16\xf9\x04\x62\x0e\x47\x27\x47\xc6\x35\x2a\x3a\xdc\x1a\x93\xf8\xda\xfd\x9c\xda\xb3\x3e\xa7\x09\xb7\x72\x7f\x55\x9d\x10\xf2\xd1\x50\x9c\x1e\x2b\xef\x66\x00\x8e\xe3\x29\xb4\x31\x2d\xb5\x37\xdd\x23\xf2\x8d\xdd\x96\xed\x8d\xdb\x50\x7f\xaa\x0f\x48\xb9\x67\x65\xc0\x0c\x47\x29\x41\xd3\x90\xc8\x39\xbc\xb6\x2d\xff\x7c\xfd\x6e\xb7\x9f\xc6\x7d\x15\xf9\xc3\xe7\x62\xb5\xe2\x0d\x59\x52\xb9\xec\xca\xfa\x6c\x36\x42\xb7\xab\xb7\x6f\x51\x48\xcf\xd9\xa1\xda\x4a\xd7\x61\xc1\x78\x14\x6e\xfc\xd1\x2f\xe6\xcb\x83\x03\x5b\xf7\xf1\x06\x7a\xbc\x4f\x83\xf4\xd0\xe3\x43\x49\x54\x53\x50\xb3\x5d\xfb\x77\xc7\x3e\x65\x65\x8e\xc8\x8e\xd1\x84\x2c\xe6\x85\x0f\x0e\xbe\x95\x91\x82\x0e\x0b\x74\x34\x67\x0d\xe5\x85\xcf\xe1\xb3\x23\xd8\x88\x4a\x14\xe2\x36\x0d\xcf\x79\x64\x10\xbe\xc7\xcc\xea\x19\x9d\xa9\xd1\xdd\xcd\xff\x8f\x47\x93\x37\x09\xe2\x6a\x20\x6c\x9f\x3a\x4f\x18\xf2\xb2\x53\x0e\x5e\xcf\xd2\xe1\xbd\x3a\x60\xc3\x51\xf0\xbb\xa8\x37\x16\x7a\x1f\x2c\x89\xad\x1f\xae\x58\xbd\xe2\x52\xa9\x92\x51\xcf\xcc\x23\xf6\x09\xd7\xd1\x2e\xee\x5a\xb7\xfb\xa6\xdc\xb9\xa9\x34\xd3\x80\x82\x53\x5a\x68\xba\x34\x69\x93\x68\x0c\x96\x70\x4f\xbd\x55\x35\x9b\xb1\x2f\x5c\x42\xac\x02\x6a\x17\x44\x6d\xad\xf7\xd4\x8d\x9b\xc3\xa0\x61\x42\x50\x26\x60\x85\xef\x16\xeb\x61\xc6\x92\xf5\x7c\x26\x84\x9a\x70\x20\x32\xfc\x16\xc5\x1a\x01\x45\xa1\x1a\x19\x03\x04\xf4\x16\x1a\x2d\x6a\x1d\x6e\xaf\x6a\x7e\xcf\x0b\x36\x4d\xb3\xd4\x2c\x79\x79\xeb\x90\x07\x03\xd5\x31\xd3\x65\x58\x6c\xa3\x0f\x6a\xff\xca\xc6\xc9\x90\x9b\x10\x0b\xbb\xe0\xc3\xc7\x4f\xa4\x64\x4a\xd8\x92\xcb\x9d\x0f\x0f\xaa\x19\x9e\x5c\xe3\xd9\x6c\x06\xf1\x94\x17\xff\x56\x7e\x69\x5e\xbc\x24\xbf\x31\xfd\xeb\xca\x3d\x57\x3b\x3e\x6b\xc8\xc3\x52\xc0\x89\xba\x95\xba\x5f\xa1\x79\x5c\x21\xad\x23\x2d\x73\xf3\xee\xa9\x7a\x5f\xb9\x85\x68\xec\x7a\x52\xa0\xea\x5f\x12\x7b\x73\xb8\xb5\x0f\x9b\xac\x75\x4d\xe8\xb8\x73\xd6\x9c\x15\xd8\x41\x59\x04\x72\xb5\xa1\xd2\x55\xae\x57\x05\x2f\xef\x80\x20\x5e\x2b\x33\xb5\x26\x74\x0a\x63\x79\x67\x56\x6b\xcd\x68\x81\x3a\x3d\x4d\xf9\x6c\x33\xe7\x3b\xe9\xf3\x26\x21\x78\xfa\x69\x5d\x61\xd6\x43\xa7\x0a\x74\x22\x88\xab\x72\xbf\xfb\x2e\x0d\xd1\xfa\x89\x7b\x1c\x3c\x18\x6f\xa9\x49\xb9\x8c\x43\x88\x3a\xba\x9c\x9f\xcf\x2f\x07\x44\x5e\xf8\x59\x2f\xac\x6f\xf4\xe1\x44\x4f\xb7\x0b\xeb\xfb\x61\x81\xa6\xc2\xfa\x53\x06\x11\xba\xbc\xbb\x67\x99\x2d\x69\x75\xd6\x36\xcb\x0b\x2e\x33\x71\xcf\xa2\x0f\x35\x06\x36\x4c\x87\xd6\x09\x37\x83\x88\x52\xc8\xf9\x7f\x9f\x5d\xc5\x72\x88\xc4\xa4\x13\x98\x76\xce\x99\x4c\x38\x01\x8d\xb7\x52\xcb\xd8\x7b\x1b\x0f\x97\x21\xdf\xd0\x65\x08\xec\x9f\x6f\xfd\x02\x84\x97\xbc\xe1\xb4\x11\x81\x1a\xc0\x7e\x54\xa0\x95\x8d\x58\xe9\xad\x70\x69\x04\xc0\xc5\x36\x18\xe3\x9e\x4c\xbf\x45\x76\x70\x84\x39\x9c\xae\x32\xc9\x3b\xb4\xbd\x41\x1a\xe6\x31\x29\xd9\x03\xfe\xaa\xd7\x3a\x99\xb7\xff\xa6\x93\x68\xd5\x5a\xa5\xc5\xdf\x5f\xfd\xcd\xb9\x46\xf9\x7b\x57\x8e\xad\x8b\x74\x3d\x12\x2d\x74\x1d\xf0\x18\xec\x16\xf0\x20\x84\xff\x1e\xab\x7b\x74\xe8\x0e\xc7\xf9\x9f\x2d\x2d\x70\xa4\x3e\xec\x1a\x7f\xea\x8f\x72\x64\x63\xcc\x6c\x9b\xd1\xfd\xd0\x45\x00\x5a\xc9\xc0\x0a\xe2\x37\x9a\x9a\x96\x52\x0d\x79\x2c\xf0\xd3\x91\xbe\xf4\x3a\x22\x2f\x9a\xac\x0a\xa2\x3e\xed\x29\x25\x1e\x1b\xab\x47\xf8\x5d\x97\x0a\x3f\xfd\xeb\x7b\xbc\x21\x82\xf5\x18\x1b\x88\xe9\x35\xf4\x0a\x5e\x25\xef\xb8\x6c\x30\x03\x13\x65\x01\x51\x16\x24\x46\xfb\x6e\xf2\x4a\x72\x79\x05\xb0\x9c\xd5\xbf\x68\x9e\xd7\xaf\xd0\x9e\x19\x30\x92\x1a\x4e\x6f\xa2\x23\xc3\x8b\x60\x4f\x7a\xd1\xac\x2b\x9e\xc1\x51\xed\xd3\xf9\x15\xc8\x90\xe4\xaf\x3f\x23\x7a\xc2\x7f\xfd\xf9\xe7\x1f\x3c\x93\xf9\x54\x99\xea\x89\xf1\x8e\x27\xbc\x6f\xda\xc9\x51\x48\xcd\x8d\x04\x47\x65\x6e\x79\xd6\xf4\x5e\xc5\x55\xa5\xa6\xab\xd3\xd9\xb1\xee\xcc\x21\xbf\xef\x59\x71\xfb\x70\xea\x50\x1f\x6c\xaf\x49\x50\x89\x5c\x0d\x94\x08\xf1\x52\x61\x6e\xa3\x44\x1c\x55\xe1\x73\x98\x52\x95\xc8\xce\xa7\x45\xfe\xfb\x78\x4f\x67\xca\x92\x4c\xfc\xc5\x1d\xf9\x6d\x4e\x9a\xd3\x5b\xa2\xbf\x15\x50\x7f\xa8\x33\xa1\x73\x63\x07\x15\x00\x17\x1f\xe6\xff\x7a\x77\xf6\xfa\xcd\x3b\xcd\xe9\x00\x29\x04\x08\xaf\xe6\xb9\x81\xdc\x26\xeb\x2b\x7e\x27\x8d\xaf\xfa\xc0\x04\x95\x71\x37\x33\x1f\x06\x7c\xbe\x25\xf9\x30\x49\xe6\x9b\x58\xd3\xbe\x6b\x0c\xa7\x5c\x4c\xf4\xfc\x11\x82\x60\x26\xc2\xca\xbe\xf4\xab\x3a\xd4\x60\x48\x56\x03\xf2\xe3\xa3\x85\x6e\x26\x3b\x4a\x9e\xe1\xde\x41\xf5\x18\x47\x01\x8f\x7e\x9e\x1e\x6f\x77\xe3\xf0\xac\xe3\x18\xb2\xfc\x75\x7c\x29\xd4\xd1\x1c\xbe\x6d\x6e\xad\xd4\x2e\xc1\x54\xa3\x5a\xa9\x71\xa5\xc0\x99\x94\x61\x10\x93\xe1\x0a\x7b\xb6\x75\xb4\x75\xf4\x6f\xa6\xdb\xbf\x8d\xc2\xb6\x59\x3d\xa8\x92\xcf\x0b\xca\x27\x50\x28\x06\xbb\x76\xec\x45\xfc\xdf\x39\x06\x09\x7b\x57\x31\x5d\x9d\xca\x94\x12\x17\x84\x92\x51\x99\x5d\x3e\x03\xd5\xc7\x5b\xc0\x03\x8c\x08\x7d\xa4\xcc\xa0\x1d\x86\x99\x99\x4c\xfb\x11\x7e\x92\xa9\xc6\x6c\xad\x10\xe1\xed\x94\xe4\xb9\x73\xf3\xc2\xb0\xd6\x6f\x62\x98\xfc\xfe\xfa\xe6\x00\x1a\xc2\xf0\x4a\x98\x9a\xc6\x1e\xd4\xfd\xde\x75\xc4\x8e\x23\x4c\x1e\x45\x13\xff\x96\x58\xf3\x15\x3e\xf5\xef\x7e\xfe\x09\xa9\x81\x6e\x25\x6d\xb5\xdd\x97\xa2\x11\x65\x72\xe2\xff\xd5\xc8\x6b\xfd\xfd\x8d\xdf\x38\xc7\xd2\x94\x62\x3a\x3c\xd0\x89\xc0\x3c\xce\x31\xba\xdd\x49\x62\xdd\x2d\xb7\xde\x7f\x6a\x91\xea\xde\x20\x21\x62\x52\x49\xf2\xe8\x72\x98\xcb\x0b\xed\xcc\x99\x92\x17\xa9\x17\x07\xb1\xab\xc3\x59\x07\x9e\xfe\x7a\x73\xf0\x77\x37\xa7\xf9\x76\xac\x97\x6a\x42\x1f\x44\x1d\x5f\x94\x7e\xd5\x7b\x61\x90\xa1\xa0\xff\x36\xac\x19\x9b\x72\xf1\xbf\x96\x5d\x32\x87\xeb\x56\xa7\x2b\x63\xb7\x29\x66\xef\x78\xa6\x78\x6c\x53\x45\x6d\x1d\x8f\xcc\x91\x4d\x85\x5b\x27\xbc\x65\x7c\x16\x6f\x7f\x9b\x29\xd1\x48\xc5\x16\x38\x87\x00\x94\x52\x0b\x9c\x77\xf2\xe4\x13\x99\x76\x7f\xd5\x5f\xd7\x07\x7e\x35\x3f\x56\x7d\xd0\x6e\x0b\x85\x52\xb1\x9e\x95\x0e\xb7\x63\xb0\x8c\xd0\x09\x88\x4f\xbe\x10\x35\xc0\x56\x71\x2c\x5f\xb6\x90\x9c\xba\x44\xf9\x58\x93\x4f\xac\x68\x35\x09\x36\xa9\x54\x82\x0b\x6d\xbe\xe5\xf6\x4f\x47\xe8\x7f\x1f\x82\xe5\x77\xc1\xf7\xa3\x54\x80\x07\x96\x7f\x14\x6a\xdf\x23\x74\x0a\x84\x3f\x00\xb5\xef\x91\x98\x0a\x51\xec\x40\x10\x7b\xa4\x46\x83\x13\x5b\xf0\xe1\x27\xb8\xc4\xd1\xcb\x30\x72\x21\x18\x80\x7d\x93\x2c\x8a\xdb\xc0\xcb\x4e\x90\x06\xad\x7f\xd5\x49\xc4\x91\xd6\xd8\x02\x96\xdf\x96\x16\xa2\xbc\x0d\xa3\xf9\x0a\x37\xd9\x81\xe5\x5d\x2e\xc1\xba\xf2\x06\xcb\x63\x51\x67\x03\x74\xd8\x13\x9d\x73\x21\x17\x2c\x43\x87\xe5\xc5\x86\x7a\x69\x6f\xb9\x5d\xd7\xca\x20\x1a\x79\x1a\x82\x6e\x70\x92\x46\xfb\x13\xc1\x74\x1c\x21\x92\xb8\x6c\xc8\x61\xce\xe3\x28\x89\xe3\xbc\xc8\x6e\x56\xc9\x80\xfd\x38\x4a\xaa\x9f\x21\x19\xa5\x8f\xf0\x20\x47\xc9\x6e\x42\x5c\xc9\x23\x8c\xc8\x51\x82\x63\x58\x93\x3b\x6e\xe4\x28\x89\x49\xfc\xc9\xd1\x9d\x4f\x62\x52\x8e\x5b\x56\x0e\xdb\x72\x90\x53\x39\x4a\xe2\x04\xef\xf2\x14\xbb\x72\x94\xcc\x18\x2e\x53\x92\xb2\x45\x93\x59\x99\xa3\x64\x92\x28\xee\x66\xfb\xa4\x68\x1f\x7c\x22\xf8\x9c\xed\xb3\x23\xb3\xb3\x7d\x92\x80\xa8\xf1\x89\x21\x7a\x98\x68\xa9\x9f\xf2\x21\x5a\x26\x71\xc8\x21\xfc\xe4\x0f\x09\x22\x27\x68\x22\x26\x68\x20\x12\x04\x7b\x08\x23\x5c\x42\x88\x24\x89\xfb\xa1\x8e\xb0\x4f\x34\x89\x44\x82\xcc\x34\xf2\xa4\xe1\x93\x42\x2c\x61\x9f\x78\x8a\x09\xfb\xc4\x90\x4d\xd8\x27\x9e\x7b\x3a\x65\x39\x77\x2c\xd5\x01\x16\xea\x04\x99\xa3\x7c\xd5\x96\xb6\xab\xc7\x47\x9d\x20\xd6\xcb\x5c\x9d\x28\x2d\x59\xf9\xc4\x82\xcc\xe3\x13\xe2\xad\x76\xbf\x19\x28\x3a\xb0\x4f\x34\x1f\x8e\xfb\x75\x5f\x66\x93\x7d\xc2\x49\x36\xf8\x7c\xcd\xa9\x36\xf8\xa4\x26\xdc\x44\x09\x0d\x27\xe5\xe0\x93\xb4\xaa\xc2\x5c\xd9\xf6\x49\x66\xcd\x8e\xea\x56\xc7\xac\x1d\xc3\x9f\x3d\xec\xa5\x3f\x32\xd5\xff\x6e\xc4\x9a\x0d\x32\x31\x3a\x5f\x0d\x9f\xec\x1c\x69\x70\xb6\x0b\xf6\xca\x3a\x30\xcf\x7f\xb6\xdb\x64\xd5\xdb\xa0\xbd\x8b\x9a\xde\x48\x4b\xb0\xad\x7b\x1b\xe2\xe2\x8b\xd4\xc5\x03\x34\x44\x3f\x2b\x5f\xac\x5d\x8d\xe0\xee\x73\xbe\x9d\xec\x30\xc7\xf2\xf9\xd9\x27\x9e\xd9\x2f\xc9\x15\x45\x0e\xc0\x00\xc7\x5f\x82\xc4\x5d\xd8\x00\xed\x93\x3e\xa0\x24\x99\x21\xd0\x3e\x71\x5c\x81\x49\x22\x89\x65\x16\x0c\xb2\x06\x26\x0a\x4e\xe0\x18\x74\x5e\x4a\x3f\x2a\x91\x54\xde\x41\xfb\xc4\x32\x10\x26\xf6\xdc\x24\x48\x6c\xcb\x45\x68\x9f\xad\x86\x23\xcd\x81\x23\x49\x4c\x85\xc3\xa6\x45\xfb\x68\xe4\x70\xa8\x3d\x1c\x6a\x23\x9f\x3f\xc0\xa1\x36\xc4\xa5\x98\x78\x06\xed\x81\xa2\x4d\xb1\x2a\x26\xc8\xdc\xe4\x5f\x9c\xe4\x57\x4c\x39\xd6\x4e\x32\x31\xf6\x99\x16\x13\x1d\x83\x20\x27\x63\x24\xe7\xa2\x23\x35\x5d\xed\xa6\xf2\x30\xda\x27\x9d\x91\x31\x65\x2b\x29\x7f\x29\x9e\x9b\x31\x41\x72\x9f\xc5\x31\xcc\xd2\x98\xe2\x1f\x6d\xc9\xe7\x68\x9f\xed\xfc\xb2\x64\x8e\x47\xfb\xc4\xb1\x3d\x26\xfa\x11\x2e\x37\xe4\xf6\xbc\x8f\xf6\xd9\xd2\xb9\x4a\xe0\x82\x74\x5e\x8a\x64\x85\x4c\x1c\x12\xbd\x17\xfc\xfc\x90\x89\x32\xe3\xd8\x24\xed\xb3\xe5\x30\xa6\x30\x4c\xda\x67\xbf\x5c\x93\x3b\x76\x62\x1b\xcf\x32\x92\x89\x72\xd8\xb2\x04\xc7\x32\x35\x60\xf9\xfc\x61\xc8\x68\xc1\x98\xb8\xb3\x87\x30\x91\xe6\x3b\xd0\xb7\xff\x5f\x4f\x04\xe8\x09\x6f\xf7\x75\x45\x67\x00\x63\xd1\x3e\x29\x57\xfb\xf1\xd1\x87\xc3\xd5\xfe\xe3\x5c\xed\xcf\x35\x57\xc7\xe1\x5e\x7f\xb4\x37\x87\x7b\x7d\xfb\x1c\xee\xf5\x0f\x21\x90\x43\x08\x64\xf3\x39\xdc\xeb\xf7\xba\x75\xb8\xd7\x3f\xdc\xeb\x1f\xee\xf5\x7d\xcf\x5e\xef\xf5\xb5\x7b\x8e\x97\xfa\xd1\x8b\xef\x2b\xb9\xd3\xd7\x2c\x59\x67\x59\x26\xda\xb2\xf9\x24\xee\x58\xf0\x6a\x2f\xea\xd0\xb6\x21\x35\xd8\xc1\xc7\x3b\xe1\xd1\x36\xe7\xea\x24\x95\x3c\xdb\x67\xfa\x45\x73\xc8\x51\x16\xa6\xcc\x59\xde\x49\x8c\x0d\xf9\xaa\x97\x1b\x35\x0a\x27\xe4\x8c\xd4\x2c\xe3\x15\x67\x48\x83\x4f\xf1\x73\x5c\x0e\x86\xde\x23\xd2\xd1\x97\xac\x58\x68\x62\x84\xd2\x21\xd6\x72\xce\x26\x5a\xf5\x9b\xe6\x46\xc9\xd5\x4a\x05\x9a\x85\xee\x80\x30\x28\xfd\x86\x71\xac\x66\xff\xd6\x1e\x47\x5c\xef\xb1\xe7\x9f\x9c\x96\xb8\x41\x2f\x1c\xda\x18\x5e\xb0\x8d\x46\xd2\x8a\x6b\xc4\x82\x7d\x6b\x08\xf6\xa5\xe2\x35\x2c\xeb\x39\xcb\x44\xe9\xe3\x41\xb6\x4f\x6f\xf1\xbc\x19\x4a\x30\xab\x48\xc7\x97\x23\x8f\xb1\x79\x5b\x77\xbc\xc7\xf7\xb4\xe0\x39\x6f\xd6\xdd\xd5\xb9\xa6\xb8\xa3\xb8\xcf\xf4\x40\x47\x89\x3d\x93\x76\x96\x09\xad\xaa\x5a\xd0\x6c\xc9\xa4\xd3\x6f\xf4\x81\x75\x65\x65\x94\x4c\x53\xf7\x82\xe4\x91\xe0\x00\x83\x5c\xe5\x27\x15\x6b\x52\x8b\xc6\xa4\x8d\xe8\x86\xc7\x1d\x3f\x7b\x9d\xc3\x63\x0f\x36\x0a\x7f\x02\x5d\x92\xa6\x5e\x43\xfe\x49\x5c\x08\xd5\x69\x0a\x8e\x00\x5f\xb8\xff\x90\x44\x14\xb9\x01\x37\xfa\xeb\x0f\x71\x47\x3f\x56\x67\x7a\x4f\xc3\xf1\x86\xaf\x20\xc2\x59\x28\x1f\x51\x99\x86\xfe\x0f\xc4\x2d\x72\xdb\x88\x3f\xff\x44\x96\xa2\xad\xe5\x89\x5b\x03\xf9\x23\x7c\x86\xe7\xf3\xd8\x5b\x32\xe5\x58\x36\xa4\x60\x54\x36\xe4\xc7\x1f\xc8\x8a\x97\xad\x72\x0d\x22\xde\x75\x5c\xf3\x9f\x7f\x8a\xde\x6e\xb1\x4e\x79\xac\x3b\xbe\x99\xf8\xa0\x77\x55\x85\xa0\xe7\xda\x2b\xd7\x5a\x25\x54\x75\xeb\xfc\x3e\x10\x1e\x0c\xee\x21\xb5\x29\x72\x67\xae\x6c\xc4\x9e\x75\x4d\xac\x77\x1b\xe5\xad\x46\xda\xfd\xa8\xaf\x85\x9c\xd8\x50\x09\xa9\xbe\xe0\x18\xfd\x6b\xa0\x01\xbf\xb7\xe2\x66\xdd\xc4\xd4\x94\xff\x13\xbf\xd9\x2f\x26\x37\x1f\x8e\x83\x47\x4d\x74\xb8\xc7\xe5\x61\xb1\xa3\x46\xbf\x1d\xf6\x3e\x6e\xd5\x69\x3a\xb2\x6e\x10\x4e\xde\xe6\x34\x68\xc2\xb4\x59\xc6\x90\x73\xf8\xc2\xb2\xc5\x95\x02\xe5\x06\xa6\x6c\x9f\x35\xd7\x5e\x84\x26\x33\xce\xa6\x7e\xd0\xa7\x7c\xf7\xcf\x0b\x11\xe3\x0f\xd7\xec\x96\xcb\x26\x81\x82\x07\xbf\xde\x5f\x4e\x92\x97\xb7\x48\x99\xb0\x6a\x8b\x86\x57\x45\xd7\x73\x4f\x7f\x3b\x51\xda\xd6\xb9\x21\x63\xea\xc4\x26\x29\x82\x16\x20\xc4\x5e\xe0\xda\xe0\x45\xf7\xfb\xac\x6c\x10\xa9\xbf\x56\xc6\xb4\xa2\x35\xed\x06\x16\x48\xc9\xe5\x4b\x1d\x97\xa6\x99\x37\xfd\x4d\x63\xdf\x28\xcb\x55\xd3\xa2\x1b\x2e\xf7\x02\x77\x97\xc5\xd6\xb0\x92\x96\x9e\x5b\xa0\x7e\x58\x05\xbe\x4c\xc4\x83\xc9\x24\xd5\x4c\x4c\x83\x55\x16\x2c\x79\x7e\x4d\xb3\x3b\x56\xe6\x40\xa7\x87\x43\x92\xaf\x4b\xba\xd2\x18\xa6\x1d\xe9\x18\xcb\x07\x92\x27\x2b\xcb\xd5\x83\x51\x46\x2c\x99\x36\x40\x0c\x01\x26\xf0\x88\xf1\x69\x65\x34\xc8\xd7\x67\xa9\x7c\x01\xbf\x8e\x90\x78\xa7\x5a\xf3\xfb\x8c\x69\xb7\xc9\xd3\x25\xf5\xe3\xbb\x34\xfe\xde\x83\xfb\xb1\xd1\x7c\x8d\xf9\xc1\x9d\x95\x0f\xc1\xcb\xee\x9a\x0b\x10\xff\x68\xa1\xd4\x82\xef\xfc\x63\x0a\xeb\x07\x8b\xe2\x66\xbd\x2b\x61\x57\x98\xa3\x0a\xb7\xc6\xc4\x9f\x3d\x78\x0c\x01\x5b\x57\xdf\xc4\xe0\x24\x1c\x5d\xbf\xbe\xe8\x6b\xa5\x6b\x9a\x0b\x49\x5e\x17\x22\xbb\x23\x17\x0c\xce\x01\xae\xbd\x9b\x18\x89\x21\x84\xe2\x8e\xdc\x55\xf5\x4d\xbe\x3b\xb7\xc0\x01\x0f\xff\x1b\xc2\xc3\xaf\x6f\x7c\x03\xf0\x6d\xa0\xe1\xaf\xe8\x6d\x3c\x9d\x8a\x3a\xb1\xc3\x56\x83\xd7\x0c\x4c\xeb\x96\x5b\xe4\xfb\xa5\x78\x98\x35\x62\xd6\x4a\x36\xe3\x9e\xc4\x97\x88\x5e\xdc\xb1\xb5\xfa\x6b\x6c\x3f\xfe\x81\x5f\xef\x1d\x97\x1a\x01\x17\x0f\xf0\xb9\xb2\xf8\xd7\xaf\x2f\x94\x99\x89\x41\x77\xe3\x92\x9c\xb2\x26\x3b\xcd\x58\xb5\x3c\xd5\x4d\xf9\x2a\x86\x65\x25\x4a\xde\x88\x3a\x9a\x01\xef\x8c\x64\xa2\x28\x34\xaa\x86\x58\x90\x73\x56\x2d\x3b\x21\x8f\xdf\xa3\xa7\x42\x48\xaf\x84\x88\x45\x90\x76\x96\xbc\x7a\x4b\xaf\x78\x67\xe2\xeb\x9b\x54\x05\xf3\xd4\x8b\xe0\x1b\x23\x20\x7e\x84\xe1\xd9\x2f\xb0\xfc\xd1\xdc\xbc\x00\xc7\x50\xe7\xee\xa9\x8f\x23\xaf\x05\x7b\x46\xc8\x55\x33\xe4\x72\x81\xee\x78\xce\x72\x22\xee\x59\x5d\xf3\x9c\x49\xd2\x69\x13\xf7\xe4\xcb\x8b\x3d\x11\x04\x6e\x35\xa6\x07\x18\xfc\x67\x85\xc1\x4f\x38\x26\x39\xca\x4b\xbd\xb5\xa9\xbc\x68\xbe\xe2\x65\x22\xac\xeb\xd3\xaa\xaf\x20\x9c\xbd\xf2\x43\x26\xfe\x66\x0c\xd7\x36\x07\x11\x99\xd1\x82\x5d\x7e\x8c\x38\x8c\xcc\xf1\x9b\xfd\xf3\x88\xf9\xd0\x41\x36\xdd\x0a\xcb\xf1\x1f\xdd\x62\x27\xa5\xc8\xa7\x62\xd3\x7f\x5c\xb4\x53\x67\x2d\x23\x98\xe3\x2e\x86\xf2\x96\x36\xec\x81\x46\xb3\x8c\x9b\xae\xf4\x31\xc5\xbb\xa9\x3f\xbb\xba\x24\xbf\xa0\xc4\xdd\x40\x56\x6b\xd1\xa0\x47\x76\x21\x56\x94\x47\x33\x29\x39\xe0\xd0\x6e\xb3\xae\x3a\x71\x04\xe5\x29\x2b\x14\x38\x67\x20\xee\x58\xab\xce\x59\xfa\x04\x74\x40\xba\xdc\xb3\x53\x61\x7d\x0a\x27\x08\x64\x52\x7d\x2d\x89\x8d\x9e\xc5\x40\x20\xcb\x5e\x54\x13\xc9\x4a\xc9\xe1\x16\xc8\x49\x4e\xd0\xfc\xa1\x48\x3e\x8b\x99\xba\xe8\x78\xf8\x76\xde\x3b\x71\xcb\x4b\xb3\x6f\x85\xbe\xd2\x5c\x50\x9f\x2f\x72\xf0\x14\x9e\xd5\x53\x90\xb2\x78\x53\xd2\x9b\xc2\x77\x9d\xd6\x57\xfc\x05\xbd\x55\x8b\x8e\xc1\x5b\xa7\x39\x97\xea\xbf\x64\x3e\x7f\x07\x81\xf4\xb6\x34\x9e\x6d\x20\xb5\x59\xab\xbd\xae\x9a\x07\xb7\xed\x6e\xfb\x09\xf5\x4e\x02\x12\xe9\x65\x99\xab\xe6\x32\xd9\xcb\x4f\xd2\x72\x10\x64\xb5\x4b\x31\x87\x4c\x0e\xff\x7d\xcd\xa7\x25\xcf\xee\xae\x9c\x78\xb9\xa8\xd5\x67\xa5\xf3\x51\xcf\x1c\x0d\xff\xb6\x8b\xc2\xd4\x8d\xbe\x8a\x3f\xb6\x7e\x72\x34\xfe\x5c\x77\x59\xbd\x4e\xa8\x94\x22\xe3\xf6\x82\x24\x00\x98\x6a\x8d\x45\x0e\xc6\x62\xb7\x6e\x80\xa5\xdf\xd2\x7e\x99\x89\x33\xc4\xd8\xd2\xb1\x4a\xfe\x43\xa8\x1e\x87\x9d\x9a\x8e\x0b\x25\x81\xa9\xe1\x53\x8f\x9b\xc1\xf8\x7e\x18\xd1\xef\xe2\xf6\x3a\x02\x18\x56\xea\xc6\x1b\xd3\x74\x38\x9b\x93\xd8\x71\x34\xe8\x8b\xe6\x47\x8c\xfd\x6b\x2f\x69\xe2\xaf\x9d\xdd\x9b\xfa\xfb\xb4\xcf\x18\xf2\xc8\x3d\x45\x54\x63\xe7\xf3\xc1\xb5\x25\x7e\xa6\x83\xfd\x90\xb8\x55\x89\xaa\x2d\xe8\xe4\xbd\xe5\x06\xf1\xc5\x0e\x14\x30\xf8\xeb\xdb\x5e\x09\xa4\xa3\x30\xfb\x8b\x0c\xfa\x80\xcc\xfe\x08\xbe\x81\x6a\x8e\x03\x64\x0e\x43\x8c\x34\x82\xfc\xf0\xf3\x4f\x3f\x4d\x81\x37\x4f\x42\x34\x7b\x3d\x54\x1f\x78\xb3\x0f\xa2\xd9\x2b\xd4\x0b\xde\x3c\x55\x22\xe0\xbb\xac\x9b\x06\x6f\x9e\x76\x07\xf6\x87\xde\x1c\x88\xad\xa6\xd6\xf3\xb9\xb5\x7a\xbe\x08\x57\xb8\x8a\x6f\xbc\xbe\xcd\x23\xd3\x53\xbb\xe7\xaf\xcb\xf3\xc9\x1c\xa9\xd8\x8b\xac\xc6\x0b\x9c\x9d\x6c\xa2\xc3\xbe\x6a\xf0\x92\x2a\xef\xdc\xaa\xba\x40\x4b\xfd\xf5\x76\x13\xb5\x74\x1e\x99\xe3\x55\x76\xe1\x0a\x3a\x8f\xc8\x5e\x6d\x5d\xa0\xd2\x22\x0d\x4d\x3c\x5c\x23\x17\x55\xfd\x16\x9b\x89\x1d\x51\xe9\xb6\x63\x7d\x5b\x74\xd2\x5d\x4c\x2d\x5b\x8a\x71\xb1\x75\x69\x01\xa1\xc4\x5f\xb7\x36\x55\x8d\x16\x94\x3a\x5e\xad\xe6\xab\x41\x0b\x8a\xf4\x9b\x91\xed\x2a\xcf\xa2\xeb\xcd\x1c\x93\x11\x14\x1a\x5d\x65\x96\x52\x5b\x16\x9f\xbc\x1a\x93\xb8\x1a\x5f\x3d\xe6\xd4\x84\x05\x3b\xee\xaf\x19\x1b\xaf\x04\x8b\x5a\x49\x9b\x95\x62\xfe\xfa\xaf\xa0\xd0\x98\xfa\xb0\xc8\xcd\x1b\x93\x2d\x1b\xaa\x00\x0b\x66\xd2\xee\x25\x3d\x36\xa6\xca\x28\xbd\xb6\xa8\xb3\x2e\x5e\x2d\xef\x2f\x29\x8a\x0f\xe6\xa5\xf0\xf4\xb9\x31\x2a\x7d\xf4\x30\x0e\x2e\x26\x18\x59\xd0\x42\xaf\x07\xd1\x4e\x5c\x92\xee\xeb\xf0\x41\x62\x16\x5b\xe8\x60\x86\xbf\x27\x62\x88\x6d\x75\x2c\xe2\xe3\x7c\x70\x5d\xd2\x7d\x7c\xb8\x25\xf9\xc6\x39\xe1\x0e\xc1\xfd\xcd\x4e\xda\xe0\xbe\xec\x41\x28\x99\xa0\x04\xfa\x4e\x0b\x51\x13\x71\xa3\xc1\x63\x03\xbe\xba\xdd\x30\x67\x57\x97\xea\x3c\x0f\x15\x63\xb4\x90\x27\x64\xa4\x7e\x5f\xbb\x41\xa1\xf3\x8f\x3d\xe1\xd0\xa6\x61\xab\xaa\xf1\x2d\x85\x43\x6c\xff\x59\x63\xfb\xc9\x01\xc9\x5f\xbb\x17\x3a\x6a\xe4\x76\x45\xcb\x99\xda\x6d\x10\xe5\x77\x82\xad\x9e\x1e\x0c\x35\xf5\x09\x31\xd9\xcc\x30\xa0\x10\xba\x81\x42\x86\x1e\x47\x3b\xf1\xc5\x08\x2c\x7b\xef\x7e\x22\xb4\x20\x2b\x79\x54\xd0\x18\x0f\xf6\x67\x26\x86\x39\xb5\x5e\x15\x04\x5d\xed\x46\xc8\x6c\x45\xc7\xd6\xf7\x4e\xec\xcd\x92\x85\xb2\xf7\xaf\xa0\xfa\xc6\xbe\xdf\x3f\xc3\xe0\x21\x86\x16\x85\x78\xc0\xf6\x5a\x3b\x18\x18\x6e\xe8\x19\x96\x08\x42\x2d\x0a\x57\x07\x7d\x1d\x4d\x76\xbb\x00\x3a\xa9\x51\xa7\x24\xaf\xe3\x0f\x47\x83\x5a\x5f\x2d\xce\x59\xe3\x2e\x36\x75\x8c\x2e\x31\x21\x5d\xfd\xbf\xc9\x6c\x0a\x74\xdc\x5c\x1c\xdd\xb0\x25\xbd\xe7\xa2\xad\x51\x6e\x23\xc8\x77\xfa\x4f\x60\xb4\xd6\xa2\xed\x82\x85\x6d\x20\x61\xb6\x1b\x45\x39\x32\x53\x1f\xec\x1f\xe1\x30\x97\x0b\x13\x47\x99\xb1\x2f\xdc\x5b\x4e\xb8\x31\x66\x66\x92\x0c\x6a\xe7\xa3\x39\x5e\xf7\xb2\x52\x56\x31\x9a\x72\xf4\x57\xf7\xfb\x7d\x07\xec\x7e\x0e\x7f\xfa\xd6\x08\x47\x0f\x2e\xd8\xd8\xd3\x5d\x17\x16\x3c\x5b\x47\x93\x6d\xda\x6b\x42\xf5\x1a\x79\x4d\x25\xcb\xc9\x7b\x5a\xd2\x5b\x3c\xfb\xbe\x98\x5f\xbd\x7e\xff\x52\x4d\x61\x20\xbc\x71\x79\x31\x76\xcb\x68\xe4\xa3\xf8\x0f\xbb\xd5\xa7\x0c\xfa\x98\x60\x06\xf7\xd6\xcb\x1d\x2b\x6c\x8c\xc1\xf2\xa3\x9d\x6f\x16\xf8\x0e\x49\x94\x07\x1b\xf7\x7e\x95\x3f\x22\x39\xb2\x6d\x72\xba\xba\x9a\x96\x3d\x1b\x87\xdd\xf3\x48\x1b\x8f\x36\x8c\xbe\x20\x1b\xda\xb4\x3d\x6d\xd3\x77\x38\xdf\xab\x3d\x5e\x33\xac\x56\xbf\x01\xfc\x84\x5c\xbf\x64\x0c\xff\xa7\x25\x2d\x85\xbc\x6e\x0b\x56\x93\xac\x68\x65\xc3\x6a\x3c\x97\x40\xc5\x66\x7f\x0d\x7c\x10\xea\xa0\x9f\x15\x6d\x0e\x21\x79\x56\x1a\x80\x03\xa8\x2a\xa8\xc5\xaa\x8f\xd4\x70\x8c\xbe\x52\xf7\x07\xe7\xa7\x7a\x62\x3f\x82\x12\x12\x35\x78\xfb\x88\x75\x31\xea\x15\xdf\xf2\x66\xd9\xde\x9c\x64\x62\xe5\x38\xc8\xa7\x3a\x77\xa3\x59\x9f\xde\x14\xe2\xe6\x74\x45\x55\x17\x94\xbb\xdc\xd4\xfc\xa6\x6d\x44\x2d\x4f\x73\x76\xcf\x8a\x53\xc9\x6f\x67\xb4\xce\x96\xbc\x61\x59\xd3\xd6\xec\x94\x56\x7c\x96\x89\xf2\x5e\x2d\x37\x51\xca\x93\x55\xfe\xbd\x52\x51\x33\x5a\xe6\x33\x1c\x24\xd7\xdb\x9d\xd2\xee\xf4\x9e\xf2\x42\xf9\x98\xd7\x4c\x29\x41\xba\xa1\xfc\xfb\x21\x41\xd1\xd0\x82\x94\xed\xea\x86\xd5\x70\x7b\x6e\xde\x26\x95\xc8\x25\x1e\x0f\xb1\x26\xb3\xab\xdd\x5f\xf1\x52\xcd\xc7\x5a\x63\x4b\x6c\x82\x14\x37\xb4\xbe\x65\x2e\xd7\xab\x3b\xa7\x39\xab\x0a\xb1\x5e\x8d\xdc\xba\xf8\x82\xa4\xd3\x41\xd1\x8a\x2a\xf7\xcc\xdb\xc7\x6b\x6b\x7b\x4d\x80\x4b\x39\x49\x14\x09\x52\x4d\x91\x76\x5b\xe6\xac\x2e\x00\xca\x61\x05\x1a\x6a\xd3\x1e\xeb\x43\x0d\x38\x41\x37\x4c\x7d\xb3\x62\xb5\x6a\xb6\xf2\x0f\xe1\x00\x9c\x2b\xd3\xcc\x3a\xd1\xdd\x1d\x56\xf7\xb5\xd1\x7e\x8d\x9d\x7f\xeb\x6d\x66\xaf\x14\xe5\xac\x61\xf5\x8a\x97\x60\x0d\x60\x0a\x7d\xb3\xb1\xd1\x43\x3b\x3b\xe4\x45\xb3\x64\xbc\xd6\x54\x21\x64\x45\x9b\x4c\x07\x5e\x01\x38\x57\xd4\x2f\xf7\x33\x7f\x6d\xb9\xdb\x82\x75\xde\xdf\xa9\xbf\x7b\xea\x4d\x95\xab\x91\xdf\xaa\x27\xfb\x9c\x3c\x30\x5c\x4b\x7a\x8f\xf1\x99\x9c\x49\x65\x0c\x0c\x9d\x06\x9c\x8a\xf6\xd1\xdf\x31\x2b\x33\xdb\x54\x40\xbd\xbf\xe2\x7e\xed\x7d\x54\x8f\x7d\x6f\x64\x5d\xf4\xff\xde\x1f\x69\xbf\x65\x1a\x36\x74\x06\x43\xf0\xa7\xd1\xef\xeb\x41\x7a\x45\xee\x7f\xb4\xff\x82\x99\x9c\x69\x64\x72\xf8\x03\xe2\x57\xb1\xfc\x15\x69\xea\x16\xed\xa9\xf6\x92\xf4\x27\xd6\x16\xd2\x2c\x63\x55\xc3\x72\x38\xf6\x60\x13\xee\x78\x99\xbf\x22\xdf\x21\x86\x76\x55\xb4\x35\x2d\xf4\x3f\x95\x4e\xe5\xa0\x3d\x5e\x91\xff\xf9\xdf\x3f\xa1\x54\x96\xff\x6a\xda\xa1\x3e\xfc\xff\x00\x00\x00\xff\xff\xa7\x5a\xa2\x04\x4f\x3b\x04\x00") - -func examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYamlBytes() ([]byte, error) { - return bindataRead( - _examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml", - ) -} - -func examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml() (*asset, error) { - bytes, err := examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml", size: 277327, mode: os.FileMode(420), modTime: time.Unix(1, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml": examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml": examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml": examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml": examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml": examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml, - "example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml": examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "example": &bintree{nil, map[string]*bintree{ - "prometheus-operator-crd": &bintree{nil, map[string]*bintree{ - "monitoring.coreos.com_alertmanagers.yaml": &bintree{examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml, map[string]*bintree{}}, - "monitoring.coreos.com_podmonitors.yaml": &bintree{examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml, map[string]*bintree{}}, - "monitoring.coreos.com_prometheuses.yaml": &bintree{examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml, map[string]*bintree{}}, - "monitoring.coreos.com_prometheusrules.yaml": &bintree{examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYaml, map[string]*bintree{}}, - "monitoring.coreos.com_servicemonitors.yaml": &bintree{examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml, map[string]*bintree{}}, - "monitoring.coreos.com_thanosrulers.yaml": &bintree{examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml, map[string]*bintree{}}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/crd_kinds.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/crd_kinds.go deleted file mode 100644 index 03a8c86d..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/crd_kinds.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2018 The prometheus-operator Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1 - -import ( - "fmt" - "strings" -) - -type CrdKind struct { - Kind string - Plural string - SpecName string -} - -type CrdKinds struct { - KindsString string - Prometheus CrdKind - Alertmanager CrdKind - ServiceMonitor CrdKind - PodMonitor CrdKind - PrometheusRule CrdKind - ThanosRuler CrdKind -} - -var DefaultCrdKinds = CrdKinds{ - KindsString: "", - Prometheus: CrdKind{Plural: PrometheusName, Kind: PrometheusesKind, SpecName: "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1.Prometheus"}, - ServiceMonitor: CrdKind{Plural: ServiceMonitorName, Kind: ServiceMonitorsKind, SpecName: "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1.ServiceMonitor"}, - PodMonitor: CrdKind{Plural: PodMonitorName, Kind: PodMonitorsKind, SpecName: "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1.PodMonitor"}, - Alertmanager: CrdKind{Plural: AlertmanagerName, Kind: AlertmanagersKind, SpecName: "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1.Alertmanager"}, - PrometheusRule: CrdKind{Plural: PrometheusRuleName, Kind: PrometheusRuleKind, SpecName: "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1.PrometheusRule"}, - ThanosRuler: CrdKind{Plural: ThanosRulerName, Kind: ThanosRulerKind, SpecName: "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1.ThanosRuler"}, -} - -// Implement the flag.Value interface -func (crdkinds *CrdKinds) String() string { - return crdkinds.KindsString -} - -// Set Implement the flag.Set interface -func (crdkinds *CrdKinds) Set(value string) error { - *crdkinds = DefaultCrdKinds - if value == "" { - value = fmt.Sprintf("%s=%s:%s,%s=%s:%s,%s=%s:%s,%s=%s:%s,%s=%s:%s,%s=%s:%s", - PrometheusKindKey, PrometheusesKind, PrometheusName, - AlertManagerKindKey, AlertmanagersKind, AlertmanagerName, - ServiceMonitorKindKey, ServiceMonitorsKind, ServiceMonitorName, - PodMonitorKindKey, PodMonitorsKind, PodMonitorName, - PrometheusRuleKindKey, PrometheusRuleKind, PrometheusRuleName, - ThanosRulerKindKey, ThanosRulerKind, ThanosRulerName, - ) - } - splited := strings.Split(value, ",") - for _, pair := range splited { - sp := strings.Split(pair, "=") - kind := strings.Split(sp[1], ":") - crdKind := CrdKind{Plural: kind[1], Kind: kind[0]} - switch kindKey := sp[0]; kindKey { - case PrometheusKindKey: - (*crdkinds).Prometheus = crdKind - case ServiceMonitorKindKey: - (*crdkinds).ServiceMonitor = crdKind - case PodMonitorKindKey: - (*crdkinds).PodMonitor = crdKind - case AlertManagerKindKey: - (*crdkinds).Alertmanager = crdKind - case PrometheusRuleKindKey: - (*crdkinds).PrometheusRule = crdKind - case ThanosRulerKindKey: - (*crdkinds).ThanosRuler = crdKind - default: - fmt.Printf("Warning: unknown kind: %s... ignoring", kindKey) - } - - } - (*crdkinds).KindsString = value - return nil -} diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go deleted file mode 100644 index 5f022264..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go +++ /dev/null @@ -1,1112 +0,0 @@ -// Copyright 2018 The prometheus-operator Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package v1 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/intstr" -) - -const ( - Version = "v1" - - PrometheusesKind = "Prometheus" - PrometheusName = "prometheuses" - PrometheusKindKey = "prometheus" - - AlertmanagersKind = "Alertmanager" - AlertmanagerName = "alertmanagers" - AlertManagerKindKey = "alertmanager" - - ServiceMonitorsKind = "ServiceMonitor" - ServiceMonitorName = "servicemonitors" - ServiceMonitorKindKey = "servicemonitor" - - PodMonitorsKind = "PodMonitor" - PodMonitorName = "podmonitors" - PodMonitorKindKey = "podmonitor" - - PrometheusRuleKind = "PrometheusRule" - PrometheusRuleName = "prometheusrules" - PrometheusRuleKindKey = "prometheusrule" -) - -// PodMeta is a subset of k8s.io/apimachinery/pkg/apis/meta/v1/ObjectMeta which only -// includes fields applicable to the generated stateful set pod template of the -// custom resource types. -type PodMeta struct { - // Map of string keys and values that can be used to organize and categorize - // (scope and select) objects. May match selectors of replication controllers - // and services. - // More info: http://kubernetes.io/docs/user-guide/labels - // +optional - Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"` - - // Annotations is an unstructured key value map stored with a resource that may be - // set by external tools to store and retrieve arbitrary metadata. They are not - // queryable and should be preserved when modifying objects. - // More info: http://kubernetes.io/docs/user-guide/annotations - // +optional - Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"` -} - -// Prometheus defines a Prometheus deployment. -// +genclient -// +k8s:openapi-gen=true -// +kubebuilder:printcolumn:name="Version",type="string",JSONPath=".spec.version",description="The version of Prometheus" -// +kubebuilder:printcolumn:name="Replicas",type="integer",JSONPath=".spec.replicas",description="The desired replicas number of Prometheuses" -// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -type Prometheus struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - // Specification of the desired behavior of the Prometheus cluster. More info: - // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - Spec PrometheusSpec `json:"spec"` - // Most recent observed status of the Prometheus cluster. Read-only. Not - // included when requesting from the apiserver, only from the Prometheus - // Operator API itself. More info: - // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - Status *PrometheusStatus `json:"status,omitempty"` -} - -// PrometheusList is a list of Prometheuses. -// +k8s:openapi-gen=true -type PrometheusList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - metav1.ListMeta `json:"metadata,omitempty"` - // List of Prometheuses - Items []*Prometheus `json:"items"` -} - -// PrometheusSpec is a specification of the desired behavior of the Prometheus cluster. More info: -// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -// +k8s:openapi-gen=true -type PrometheusSpec struct { - // PodMetadata configures Labels and Annotations which are propagated to the prometheus pods. - PodMetadata *PodMeta `json:"podMetadata,omitempty"` - // ServiceMonitors to be selected for target discovery. - ServiceMonitorSelector *metav1.LabelSelector `json:"serviceMonitorSelector,omitempty"` - // Namespaces to be selected for ServiceMonitor discovery. If nil, only - // check own namespace. - ServiceMonitorNamespaceSelector *metav1.LabelSelector `json:"serviceMonitorNamespaceSelector,omitempty"` - // *Experimental* PodMonitors to be selected for target discovery. - PodMonitorSelector *metav1.LabelSelector `json:"podMonitorSelector,omitempty"` - // Namespaces to be selected for PodMonitor discovery. If nil, only - // check own namespace. - PodMonitorNamespaceSelector *metav1.LabelSelector `json:"podMonitorNamespaceSelector,omitempty"` - // Version of Prometheus to be deployed. - Version string `json:"version,omitempty"` - // Tag of Prometheus container image to be deployed. Defaults to the value of `version`. - // Version is ignored if Tag is set. - Tag string `json:"tag,omitempty"` - // SHA of Prometheus container image to be deployed. Defaults to the value of `version`. - // Similar to a tag, but the SHA explicitly deploys an immutable container image. - // Version and Tag are ignored if SHA is set. - SHA string `json:"sha,omitempty"` - // When a Prometheus deployment is paused, no actions except for deletion - // will be performed on the underlying objects. - Paused bool `json:"paused,omitempty"` - // Image if specified has precedence over baseImage, tag and sha - // combinations. Specifying the version is still necessary to ensure the - // Prometheus Operator knows what version of Prometheus is being - // configured. - Image *string `json:"image,omitempty"` - // Base image to use for a Prometheus deployment. - BaseImage string `json:"baseImage,omitempty"` - // An optional list of references to secrets in the same namespace - // to use for pulling prometheus and alertmanager images from registries - // see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod - ImagePullSecrets []v1.LocalObjectReference `json:"imagePullSecrets,omitempty"` - // Number of instances to deploy for a Prometheus deployment. - Replicas *int32 `json:"replicas,omitempty"` - // Name of Prometheus external label used to denote replica name. - // Defaults to the value of `prometheus_replica`. External label will - // _not_ be added when value is set to empty string (`""`). - ReplicaExternalLabelName *string `json:"replicaExternalLabelName,omitempty"` - // Name of Prometheus external label used to denote Prometheus instance - // name. Defaults to the value of `prometheus`. External label will - // _not_ be added when value is set to empty string (`""`). - PrometheusExternalLabelName *string `json:"prometheusExternalLabelName,omitempty"` - // Time duration Prometheus shall retain data for. Default is '24h', - // and must match the regular expression `[0-9]+(ms|s|m|h|d|w|y)` (milliseconds seconds minutes hours days weeks years). - Retention string `json:"retention,omitempty"` - // Maximum amount of disk space used by blocks. - RetentionSize string `json:"retentionSize,omitempty"` - // Disable prometheus compaction. - DisableCompaction bool `json:"disableCompaction,omitempty"` - // Enable compression of the write-ahead log using Snappy. This flag is - // only available in versions of Prometheus >= 2.11.0. - WALCompression *bool `json:"walCompression,omitempty"` - // Log level for Prometheus to be configured with. - LogLevel string `json:"logLevel,omitempty"` - // Log format for Prometheus to be configured with. - LogFormat string `json:"logFormat,omitempty"` - // Interval between consecutive scrapes. - ScrapeInterval string `json:"scrapeInterval,omitempty"` - // Interval between consecutive evaluations. - EvaluationInterval string `json:"evaluationInterval,omitempty"` - // /--rules.*/ command-line arguments. - Rules Rules `json:"rules,omitempty"` - // The labels to add to any time series or alerts when communicating with - // external systems (federation, remote storage, Alertmanager). - ExternalLabels map[string]string `json:"externalLabels,omitempty"` - // Enable access to prometheus web admin API. Defaults to the value of `false`. - // WARNING: Enabling the admin APIs enables mutating endpoints, to delete data, - // shutdown Prometheus, and more. Enabling this should be done with care and the - // user is advised to add additional authentication authorization via a proxy to - // ensure only clients authorized to perform these actions can do so. - // For more information see https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-admin-apis - EnableAdminAPI bool `json:"enableAdminAPI,omitempty"` - // The external URL the Prometheus instances will be available under. This is - // necessary to generate correct URLs. This is necessary if Prometheus is not - // served from root of a DNS name. - ExternalURL string `json:"externalUrl,omitempty"` - // The route prefix Prometheus registers HTTP handlers for. This is useful, - // if using ExternalURL and a proxy is rewriting HTTP routes of a request, - // and the actual ExternalURL is still true, but the server serves requests - // under a different route prefix. For example for use with `kubectl proxy`. - RoutePrefix string `json:"routePrefix,omitempty"` - // QuerySpec defines the query command line flags when starting Prometheus. - Query *QuerySpec `json:"query,omitempty"` - // Storage spec to specify how storage shall be used. - Storage *StorageSpec `json:"storage,omitempty"` - // Volumes allows configuration of additional volumes on the output StatefulSet definition. Volumes specified will - // be appended to other volumes that are generated as a result of StorageSpec objects. - Volumes []v1.Volume `json:"volumes,omitempty"` - // VolumeMounts allows configuration of additional VolumeMounts on the output StatefulSet definition. - // VolumeMounts specified will be appended to other VolumeMounts in the prometheus container, - // that are generated as a result of StorageSpec objects. - VolumeMounts []v1.VolumeMount `json:"volumeMounts,omitempty"` - // A selector to select which PrometheusRules to mount for loading alerting - // rules from. Until (excluding) Prometheus Operator v0.24.0 Prometheus - // Operator will migrate any legacy rule ConfigMaps to PrometheusRule custom - // resources selected by RuleSelector. Make sure it does not match any config - // maps that you do not want to be migrated. - RuleSelector *metav1.LabelSelector `json:"ruleSelector,omitempty"` - // Namespaces to be selected for PrometheusRules discovery. If unspecified, only - // the same namespace as the Prometheus object is in is used. - RuleNamespaceSelector *metav1.LabelSelector `json:"ruleNamespaceSelector,omitempty"` - // Define details regarding alerting. - Alerting *AlertingSpec `json:"alerting,omitempty"` - // Define resources requests and limits for single Pods. - Resources v1.ResourceRequirements `json:"resources,omitempty"` - // Define which Nodes the Pods are scheduled on. - NodeSelector map[string]string `json:"nodeSelector,omitempty"` - // ServiceAccountName is the name of the ServiceAccount to use to run the - // Prometheus Pods. - ServiceAccountName string `json:"serviceAccountName,omitempty"` - // Secrets is a list of Secrets in the same namespace as the Prometheus - // object, which shall be mounted into the Prometheus Pods. - // The Secrets are mounted into /etc/prometheus/secrets/. - Secrets []string `json:"secrets,omitempty"` - // ConfigMaps is a list of ConfigMaps in the same namespace as the Prometheus - // object, which shall be mounted into the Prometheus Pods. - // The ConfigMaps are mounted into /etc/prometheus/configmaps/. - ConfigMaps []string `json:"configMaps,omitempty"` - // If specified, the pod's scheduling constraints. - Affinity *v1.Affinity `json:"affinity,omitempty"` - // If specified, the pod's tolerations. - Tolerations []v1.Toleration `json:"tolerations,omitempty"` - // If specified, the remote_write spec. This is an experimental feature, it may change in any upcoming release in a breaking way. - RemoteWrite []RemoteWriteSpec `json:"remoteWrite,omitempty"` - // If specified, the remote_read spec. This is an experimental feature, it may change in any upcoming release in a breaking way. - RemoteRead []RemoteReadSpec `json:"remoteRead,omitempty"` - // SecurityContext holds pod-level security attributes and common container settings. - // This defaults to the default PodSecurityContext. - SecurityContext *v1.PodSecurityContext `json:"securityContext,omitempty"` - // ListenLocal makes the Prometheus server listen on loopback, so that it - // does not bind against the Pod IP. - ListenLocal bool `json:"listenLocal,omitempty"` - // Containers allows injecting additional containers or modifying operator generated - // containers. This can be used to allow adding an authentication proxy to a Prometheus pod or - // to change the behavior of an operator generated container. Containers described here modify - // an operator generated container if they share the same name and modifications are done via a - // strategic merge patch. The current container names are: `prometheus`, - // `prometheus-config-reloader`, `rules-configmap-reloader`, and `thanos-sidecar`. Overriding - // containers is entirely outside the scope of what the maintainers will support and by doing - // so, you accept that this behaviour may break at any time without notice. - Containers []v1.Container `json:"containers,omitempty"` - // InitContainers allows adding initContainers to the pod definition. Those can be used to e.g. - // fetch secrets for injection into the Prometheus configuration from external sources. Any errors - // during the execution of an initContainer will lead to a restart of the Pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ - // Using initContainers for any use case other then secret fetching is entirely outside the scope - // of what the maintainers will support and by doing so, you accept that this behaviour may break - // at any time without notice. - InitContainers []v1.Container `json:"initContainers,omitempty"` - // AdditionalScrapeConfigs allows specifying a key of a Secret containing - // additional Prometheus scrape configurations. Scrape configurations - // specified are appended to the configurations generated by the Prometheus - // Operator. Job configurations specified must have the form as specified - // in the official Prometheus documentation: - // https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config. - // As scrape configs are appended, the user is responsible to make sure it - // is valid. Note that using this feature may expose the possibility to - // break upgrades of Prometheus. It is advised to review Prometheus release - // notes to ensure that no incompatible scrape configs are going to break - // Prometheus after the upgrade. - AdditionalScrapeConfigs *v1.SecretKeySelector `json:"additionalScrapeConfigs,omitempty"` - // AdditionalAlertRelabelConfigs allows specifying a key of a Secret containing - // additional Prometheus alert relabel configurations. Alert relabel configurations - // specified are appended to the configurations generated by the Prometheus - // Operator. Alert relabel configurations specified must have the form as specified - // in the official Prometheus documentation: - // https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alert_relabel_configs. - // As alert relabel configs are appended, the user is responsible to make sure it - // is valid. Note that using this feature may expose the possibility to - // break upgrades of Prometheus. It is advised to review Prometheus release - // notes to ensure that no incompatible alert relabel configs are going to break - // Prometheus after the upgrade. - AdditionalAlertRelabelConfigs *v1.SecretKeySelector `json:"additionalAlertRelabelConfigs,omitempty"` - // AdditionalAlertManagerConfigs allows specifying a key of a Secret containing - // additional Prometheus AlertManager configurations. AlertManager configurations - // specified are appended to the configurations generated by the Prometheus - // Operator. Job configurations specified must have the form as specified - // in the official Prometheus documentation: - // https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alertmanager_config. - // As AlertManager configs are appended, the user is responsible to make sure it - // is valid. Note that using this feature may expose the possibility to - // break upgrades of Prometheus. It is advised to review Prometheus release - // notes to ensure that no incompatible AlertManager configs are going to break - // Prometheus after the upgrade. - AdditionalAlertManagerConfigs *v1.SecretKeySelector `json:"additionalAlertManagerConfigs,omitempty"` - // APIServerConfig allows specifying a host and auth methods to access apiserver. - // If left empty, Prometheus is assumed to run inside of the cluster - // and will discover API servers automatically and use the pod's CA certificate - // and bearer token file at /var/run/secrets/kubernetes.io/serviceaccount/. - APIServerConfig *APIServerConfig `json:"apiserverConfig,omitempty"` - // Thanos configuration allows configuring various aspects of a Prometheus - // server in a Thanos environment. - // - // This section is experimental, it may change significantly without - // deprecation notice in any release. - // - // This is experimental and may change significantly without backward - // compatibility in any release. - Thanos *ThanosSpec `json:"thanos,omitempty"` - // Priority class assigned to the Pods - PriorityClassName string `json:"priorityClassName,omitempty"` - // Port name used for the pods and governing service. - // This defaults to web - PortName string `json:"portName,omitempty"` - // ArbitraryFSAccessThroughSMs configures whether configuration - // based on a service monitor can access arbitrary files on the file system - // of the Prometheus container e.g. bearer token files. - ArbitraryFSAccessThroughSMs ArbitraryFSAccessThroughSMsConfig `json:"arbitraryFSAccessThroughSMs,omitempty"` - // OverrideHonorLabels if set to true overrides all user configured honor_labels. - // If HonorLabels is set in ServiceMonitor or PodMonitor to true, this overrides honor_labels to false. - OverrideHonorLabels bool `json:"overrideHonorLabels,omitempty"` - // OverrideHonorTimestamps allows to globally enforce honoring timestamps in all scrape configs. - OverrideHonorTimestamps bool `json:"overrideHonorTimestamps,omitempty"` - // IgnoreNamespaceSelectors if set to true will ignore NamespaceSelector settings from - // the podmonitor and servicemonitor configs, and they will only discover endpoints - // within their current namespace. Defaults to false. - IgnoreNamespaceSelectors bool `json:"ignoreNamespaceSelectors,omitempty"` - // EnforcedNamespaceLabel enforces adding a namespace label of origin for each alert - // and metric that is user created. The label value will always be the namespace of the object that is - // being created. - EnforcedNamespaceLabel string `json:"enforcedNamespaceLabel,omitempty"` -} - -// ArbitraryFSAccessThroughSMsConfig enables users to configure, whether -// a service monitor selected by the Prometheus instance is allowed to use -// arbitrary files on the file system of the Prometheus container. This is the case -// when e.g. a service monitor specifies a BearerTokenFile in an endpoint. A -// malicious user could create a service monitor selecting arbitrary secret files -// in the Prometheus container. Those secrets would then be sent with a scrape -// request by Prometheus to a malicious target. Denying the above would prevent the -// attack, users can instead use the BearerTokenSecret field. -type ArbitraryFSAccessThroughSMsConfig struct { - Deny bool `json:"deny,omitempty"` -} - -// PrometheusStatus is the most recent observed status of the Prometheus cluster. Read-only. Not -// included when requesting from the apiserver, only from the Prometheus -// Operator API itself. More info: -// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -// +k8s:openapi-gen=true -type PrometheusStatus struct { - // Represents whether any actions on the underlaying managed objects are - // being performed. Only delete actions will be performed. - Paused bool `json:"paused"` - // Total number of non-terminated pods targeted by this Prometheus deployment - // (their labels match the selector). - Replicas int32 `json:"replicas"` - // Total number of non-terminated pods targeted by this Prometheus deployment - // that have the desired version spec. - UpdatedReplicas int32 `json:"updatedReplicas"` - // Total number of available pods (ready for at least minReadySeconds) - // targeted by this Prometheus deployment. - AvailableReplicas int32 `json:"availableReplicas"` - // Total number of unavailable pods targeted by this Prometheus deployment. - UnavailableReplicas int32 `json:"unavailableReplicas"` -} - -// AlertingSpec defines parameters for alerting configuration of Prometheus servers. -// +k8s:openapi-gen=true -type AlertingSpec struct { - // AlertmanagerEndpoints Prometheus should fire alerts against. - Alertmanagers []AlertmanagerEndpoints `json:"alertmanagers"` -} - -// StorageSpec defines the configured storage for a group Prometheus servers. -// If neither `emptyDir` nor `volumeClaimTemplate` is specified, then by default an [EmptyDir](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) will be used. -// +k8s:openapi-gen=true -type StorageSpec struct { - // EmptyDirVolumeSource to be used by the Prometheus StatefulSets. If specified, used in place of any volumeClaimTemplate. More - // info: https://kubernetes.io/docs/concepts/storage/volumes/#emptydir - EmptyDir *v1.EmptyDirVolumeSource `json:"emptyDir,omitempty"` - // A PVC spec to be used by the Prometheus StatefulSets. - VolumeClaimTemplate v1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` -} - -// QuerySpec defines the query command line flags when starting Prometheus. -// +k8s:openapi-gen=true -type QuerySpec struct { - // The delta difference allowed for retrieving metrics during expression evaluations. - LookbackDelta *string `json:"lookbackDelta,omitempty"` - // Number of concurrent queries that can be run at once. - MaxConcurrency *int32 `json:"maxConcurrency,omitempty"` - // Maximum number of samples a single query can load into memory. Note that queries will fail if they would load more samples than this into memory, so this also limits the number of samples a query can return. - MaxSamples *int32 `json:"maxSamples,omitempty"` - // Maximum time a query may take before being aborted. - Timeout *string `json:"timeout,omitempty"` -} - -// ThanosSpec defines parameters for a Prometheus server within a Thanos deployment. -// +k8s:openapi-gen=true -type ThanosSpec struct { - // Image if specified has precedence over baseImage, tag and sha - // combinations. Specifying the version is still necessary to ensure the - // Prometheus Operator knows what version of Thanos is being - // configured. - Image *string `json:"image,omitempty"` - // Version describes the version of Thanos to use. - Version *string `json:"version,omitempty"` - // Tag of Thanos sidecar container image to be deployed. Defaults to the value of `version`. - // Version is ignored if Tag is set. - Tag *string `json:"tag,omitempty"` - // SHA of Thanos container image to be deployed. Defaults to the value of `version`. - // Similar to a tag, but the SHA explicitly deploys an immutable container image. - // Version and Tag are ignored if SHA is set. - SHA *string `json:"sha,omitempty"` - // Thanos base image if other than default. - BaseImage *string `json:"baseImage,omitempty"` - // Resources defines the resource requirements for the Thanos sidecar. - // If not provided, no requests/limits will be set - Resources v1.ResourceRequirements `json:"resources,omitempty"` - // ObjectStorageConfig configures object storage in Thanos. - ObjectStorageConfig *v1.SecretKeySelector `json:"objectStorageConfig,omitempty"` - // ListenLocal makes the Thanos sidecar listen on loopback, so that it - // does not bind against the Pod IP. - ListenLocal bool `json:"listenLocal,omitempty"` - // TracingConfig configures tracing in Thanos. This is an experimental feature, it may change in any upcoming release in a breaking way. - TracingConfig *v1.SecretKeySelector `json:"tracingConfig,omitempty"` - // GRPCServerTLSConfig configures the gRPC server from which Thanos Querier reads - // recorded rule data. - // Note: Currently only the CAFile, CertFile, and KeyFile fields are supported. - // Maps to the '--grpc-server-tls-*' CLI args. - GRPCServerTLSConfig *TLSConfig `json:"grpcServerTlsConfig,omitempty"` -} - -// RemoteWriteSpec defines the remote_write configuration for prometheus. -// +k8s:openapi-gen=true -type RemoteWriteSpec struct { - //The URL of the endpoint to send samples to. - URL string `json:"url"` - //Timeout for requests to the remote write endpoint. - RemoteTimeout string `json:"remoteTimeout,omitempty"` - //The list of remote write relabel configurations. - WriteRelabelConfigs []RelabelConfig `json:"writeRelabelConfigs,omitempty"` - //BasicAuth for the URL. - BasicAuth *BasicAuth `json:"basicAuth,omitempty"` - // File to read bearer token for remote write. - BearerToken string `json:"bearerToken,omitempty"` - // File to read bearer token for remote write. - BearerTokenFile string `json:"bearerTokenFile,omitempty"` - // TLS Config to use for remote write. - TLSConfig *TLSConfig `json:"tlsConfig,omitempty"` - //Optional ProxyURL - ProxyURL string `json:"proxyUrl,omitempty"` - // QueueConfig allows tuning of the remote write queue parameters. - QueueConfig *QueueConfig `json:"queueConfig,omitempty"` -} - -// QueueConfig allows the tuning of remote_write queue_config parameters. This object -// is referenced in the RemoteWriteSpec object. -// +k8s:openapi-gen=true -type QueueConfig struct { - // Capacity is the number of samples to buffer per shard before we start dropping them. - Capacity int `json:"capacity,omitempty"` - // MinShards is the minimum number of shards, i.e. amount of concurrency. - MinShards int `json:"minShards,omitempty"` - // MaxShards is the maximum number of shards, i.e. amount of concurrency. - MaxShards int `json:"maxShards,omitempty"` - // MaxSamplesPerSend is the maximum number of samples per send. - MaxSamplesPerSend int `json:"maxSamplesPerSend,omitempty"` - // BatchSendDeadline is the maximum time a sample will wait in buffer. - BatchSendDeadline string `json:"batchSendDeadline,omitempty"` - // MaxRetries is the maximum number of times to retry a batch on recoverable errors. - MaxRetries int `json:"maxRetries,omitempty"` - // MinBackoff is the initial retry delay. Gets doubled for every retry. - MinBackoff string `json:"minBackoff,omitempty"` - // MaxBackoff is the maximum retry delay. - MaxBackoff string `json:"maxBackoff,omitempty"` -} - -// RemoteReadSpec defines the remote_read configuration for prometheus. -// +k8s:openapi-gen=true -type RemoteReadSpec struct { - //The URL of the endpoint to send samples to. - URL string `json:"url"` - //An optional list of equality matchers which have to be present - // in a selector to query the remote read endpoint. - RequiredMatchers map[string]string `json:"requiredMatchers,omitempty"` - //Timeout for requests to the remote read endpoint. - RemoteTimeout string `json:"remoteTimeout,omitempty"` - //Whether reads should be made for queries for time ranges that - // the local storage should have complete data for. - ReadRecent bool `json:"readRecent,omitempty"` - //BasicAuth for the URL. - BasicAuth *BasicAuth `json:"basicAuth,omitempty"` - // bearer token for remote read. - BearerToken string `json:"bearerToken,omitempty"` - // File to read bearer token for remote read. - BearerTokenFile string `json:"bearerTokenFile,omitempty"` - // TLS Config to use for remote read. - TLSConfig *TLSConfig `json:"tlsConfig,omitempty"` - //Optional ProxyURL - ProxyURL string `json:"proxyUrl,omitempty"` -} - -// RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion. -// It defines ``-section of Prometheus configuration. -// More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs -// +k8s:openapi-gen=true -type RelabelConfig struct { - //The source labels select values from existing labels. Their content is concatenated - //using the configured separator and matched against the configured regular expression - //for the replace, keep, and drop actions. - SourceLabels []string `json:"sourceLabels,omitempty"` - //Separator placed between concatenated source label values. default is ';'. - Separator string `json:"separator,omitempty"` - //Label to which the resulting value is written in a replace action. - //It is mandatory for replace actions. Regex capture groups are available. - TargetLabel string `json:"targetLabel,omitempty"` - //Regular expression against which the extracted value is matched. Default is '(.*)' - Regex string `json:"regex,omitempty"` - // Modulus to take of the hash of the source label values. - Modulus uint64 `json:"modulus,omitempty"` - //Replacement value against which a regex replace is performed if the - //regular expression matches. Regex capture groups are available. Default is '$1' - Replacement string `json:"replacement,omitempty"` - // Action to perform based on regex matching. Default is 'replace' - Action string `json:"action,omitempty"` -} - -// APIServerConfig defines a host and auth methods to access apiserver. -// More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config -// +k8s:openapi-gen=true -type APIServerConfig struct { - // Host of apiserver. - // A valid string consisting of a hostname or IP followed by an optional port number - Host string `json:"host"` - // BasicAuth allow an endpoint to authenticate over basic authentication - BasicAuth *BasicAuth `json:"basicAuth,omitempty"` - // Bearer token for accessing apiserver. - BearerToken string `json:"bearerToken,omitempty"` - // File to read bearer token for accessing apiserver. - BearerTokenFile string `json:"bearerTokenFile,omitempty"` - // TLS Config to use for accessing apiserver. - TLSConfig *TLSConfig `json:"tlsConfig,omitempty"` -} - -// AlertmanagerEndpoints defines a selection of a single Endpoints object -// containing alertmanager IPs to fire alerts against. -// +k8s:openapi-gen=true -type AlertmanagerEndpoints struct { - // Namespace of Endpoints object. - Namespace string `json:"namespace"` - // Name of Endpoints object in Namespace. - Name string `json:"name"` - // Port the Alertmanager API is exposed on. - Port intstr.IntOrString `json:"port"` - // Scheme to use when firing alerts. - Scheme string `json:"scheme,omitempty"` - // Prefix for the HTTP path alerts are pushed to. - PathPrefix string `json:"pathPrefix,omitempty"` - // TLS Config to use for alertmanager connection. - TLSConfig *TLSConfig `json:"tlsConfig,omitempty"` - // BearerTokenFile to read from filesystem to use when authenticating to - // Alertmanager. - BearerTokenFile string `json:"bearerTokenFile,omitempty"` - // Version of the Alertmanager API that Prometheus uses to send alerts. It - // can be "v1" or "v2". - APIVersion string `json:"apiVersion,omitempty"` -} - -// ServiceMonitor defines monitoring for a set of services. -// +genclient -// +k8s:openapi-gen=true -type ServiceMonitor struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - // Specification of desired Service selection for target discovery by - // Prometheus. - Spec ServiceMonitorSpec `json:"spec"` -} - -// ServiceMonitorSpec contains specification parameters for a ServiceMonitor. -// +k8s:openapi-gen=true -type ServiceMonitorSpec struct { - // The label to use to retrieve the job name from. - JobLabel string `json:"jobLabel,omitempty"` - // TargetLabels transfers labels on the Kubernetes Service onto the target. - TargetLabels []string `json:"targetLabels,omitempty"` - // PodTargetLabels transfers labels on the Kubernetes Pod onto the target. - PodTargetLabels []string `json:"podTargetLabels,omitempty"` - // A list of endpoints allowed as part of this ServiceMonitor. - Endpoints []Endpoint `json:"endpoints"` - // Selector to select Endpoints objects. - Selector metav1.LabelSelector `json:"selector"` - // Selector to select which namespaces the Endpoints objects are discovered from. - NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty"` - // SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - SampleLimit uint64 `json:"sampleLimit,omitempty"` -} - -// Endpoint defines a scrapeable endpoint serving Prometheus metrics. -// +k8s:openapi-gen=true -type Endpoint struct { - // Name of the service port this endpoint refers to. Mutually exclusive with targetPort. - Port string `json:"port,omitempty"` - // Name or number of the pod port this endpoint refers to. Mutually exclusive with port. - TargetPort *intstr.IntOrString `json:"targetPort,omitempty"` - // HTTP path to scrape for metrics. - Path string `json:"path,omitempty"` - // HTTP scheme to use for scraping. - Scheme string `json:"scheme,omitempty"` - // Optional HTTP URL parameters - Params map[string][]string `json:"params,omitempty"` - // Interval at which metrics should be scraped - Interval string `json:"interval,omitempty"` - // Timeout after which the scrape is ended - ScrapeTimeout string `json:"scrapeTimeout,omitempty"` - // TLS configuration to use when scraping the endpoint - TLSConfig *TLSConfig `json:"tlsConfig,omitempty"` - // File to read bearer token for scraping targets. - BearerTokenFile string `json:"bearerTokenFile,omitempty"` - // Secret to mount to read bearer token for scraping targets. The secret - // needs to be in the same namespace as the service monitor and accessible by - // the Prometheus Operator. - BearerTokenSecret v1.SecretKeySelector `json:"bearerTokenSecret,omitempty"` - // HonorLabels chooses the metric's labels on collisions with target labels. - HonorLabels bool `json:"honorLabels,omitempty"` - // HonorTimestamps controls whether Prometheus respects the timestamps present in scraped data. - HonorTimestamps *bool `json:"honorTimestamps,omitempty"` - // BasicAuth allow an endpoint to authenticate over basic authentication - // More info: https://prometheus.io/docs/operating/configuration/#endpoints - BasicAuth *BasicAuth `json:"basicAuth,omitempty"` - // MetricRelabelConfigs to apply to samples before ingestion. - MetricRelabelConfigs []*RelabelConfig `json:"metricRelabelings,omitempty"` - // RelabelConfigs to apply to samples before scraping. - // More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config - RelabelConfigs []*RelabelConfig `json:"relabelings,omitempty"` - // ProxyURL eg http://proxyserver:2195 Directs scrapes to proxy through this endpoint. - ProxyURL *string `json:"proxyUrl,omitempty"` -} - -// PodMonitor defines monitoring for a set of pods. -// +genclient -// +k8s:openapi-gen=true -type PodMonitor struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - // Specification of desired Pod selection for target discovery by Prometheus. - Spec PodMonitorSpec `json:"spec"` -} - -// PodMonitorSpec contains specification parameters for a PodMonitor. -// +k8s:openapi-gen=true -type PodMonitorSpec struct { - // The label to use to retrieve the job name from. - JobLabel string `json:"jobLabel,omitempty"` - // PodTargetLabels transfers labels on the Kubernetes Pod onto the target. - PodTargetLabels []string `json:"podTargetLabels,omitempty"` - // A list of endpoints allowed as part of this PodMonitor. - PodMetricsEndpoints []PodMetricsEndpoint `json:"podMetricsEndpoints"` - // Selector to select Pod objects. - Selector metav1.LabelSelector `json:"selector"` - // Selector to select which namespaces the Endpoints objects are discovered from. - NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty"` - // SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. - SampleLimit uint64 `json:"sampleLimit,omitempty"` -} - -// PodMetricsEndpoint defines a scrapeable endpoint of a Kubernetes Pod serving Prometheus metrics. -// +k8s:openapi-gen=true -type PodMetricsEndpoint struct { - // Name of the pod port this endpoint refers to. Mutually exclusive with targetPort. - Port string `json:"port,omitempty"` - // Deprecated: Use 'port' instead. - TargetPort *intstr.IntOrString `json:"targetPort,omitempty"` - // HTTP path to scrape for metrics. - Path string `json:"path,omitempty"` - // HTTP scheme to use for scraping. - Scheme string `json:"scheme,omitempty"` - // Optional HTTP URL parameters - Params map[string][]string `json:"params,omitempty"` - // Interval at which metrics should be scraped - Interval string `json:"interval,omitempty"` - // Timeout after which the scrape is ended - ScrapeTimeout string `json:"scrapeTimeout,omitempty"` - // HonorLabels chooses the metric's labels on collisions with target labels. - HonorLabels bool `json:"honorLabels,omitempty"` - // HonorTimestamps controls whether Prometheus respects the timestamps present in scraped data. - HonorTimestamps *bool `json:"honorTimestamps,omitempty"` - // MetricRelabelConfigs to apply to samples before ingestion. - MetricRelabelConfigs []*RelabelConfig `json:"metricRelabelings,omitempty"` - // RelabelConfigs to apply to samples before ingestion. - // More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config - RelabelConfigs []*RelabelConfig `json:"relabelings,omitempty"` - // ProxyURL eg http://proxyserver:2195 Directs scrapes to proxy through this endpoint. - ProxyURL *string `json:"proxyUrl,omitempty"` -} - -// BasicAuth allow an endpoint to authenticate over basic authentication -// More info: https://prometheus.io/docs/operating/configuration/#endpoints -// +k8s:openapi-gen=true -type BasicAuth struct { - // The secret in the service monitor namespace that contains the username - // for authentication. - Username v1.SecretKeySelector `json:"username,omitempty"` - // The secret in the service monitor namespace that contains the password - // for authentication. - Password v1.SecretKeySelector `json:"password,omitempty"` -} - -// SecretOrConfigMap allows to specify data as a Secret or ConfigMap. Fields are mutually exclusive. -type SecretOrConfigMap struct { - // Secret containing data to use for the targets. - Secret *v1.SecretKeySelector `json:"secret,omitempty"` - // ConfigMap containing data to use for the targets. - ConfigMap *v1.ConfigMapKeySelector `json:"configMap,omitempty"` -} - -// SecretOrConfigMapValidationError is returned by SecretOrConfigMap.Validate() -// on semantically invalid configurations. -// +k8s:openapi-gen=false -type SecretOrConfigMapValidationError struct { - err string -} - -func (e *SecretOrConfigMapValidationError) Error() string { - return e.err -} - -// Validate semantically validates the given TLSConfig. -func (c *SecretOrConfigMap) Validate() error { - if &c.Secret != nil && &c.ConfigMap != nil { - return &SecretOrConfigMapValidationError{"SecretOrConfigMap can not specify both Secret and ConfigMap"} - } - - return nil -} - -// TLSConfig specifies TLS configuration parameters. -// +k8s:openapi-gen=true -type TLSConfig struct { - // Path to the CA cert in the Prometheus container to use for the targets. - CAFile string `json:"caFile,omitempty"` - // Stuct containing the CA cert to use for the targets. - CA SecretOrConfigMap `json:"ca,omitempty"` - - // Path to the client cert file in the Prometheus container for the targets. - CertFile string `json:"certFile,omitempty"` - // Struct containing the client cert file for the targets. - Cert SecretOrConfigMap `json:"cert,omitempty"` - - // Path to the client key file in the Prometheus container for the targets. - KeyFile string `json:"keyFile,omitempty"` - // Secret containing the client key file for the targets. - KeySecret *v1.SecretKeySelector `json:"keySecret,omitempty"` - - // Used to verify the hostname for the targets. - ServerName string `json:"serverName,omitempty"` - // Disable target certificate validation. - InsecureSkipVerify bool `json:"insecureSkipVerify,omitempty"` -} - -// TLSConfigValidationError is returned by TLSConfig.Validate() on semantically -// invalid tls configurations. -// +k8s:openapi-gen=false -type TLSConfigValidationError struct { - err string -} - -func (e *TLSConfigValidationError) Error() string { - return e.err -} - -// Validate semantically validates the given TLSConfig. -func (c *TLSConfig) Validate() error { - if c.CA != (SecretOrConfigMap{}) { - if c.CAFile != "" { - return &TLSConfigValidationError{"tls config can not both specify CAFile and CA"} - } - if err := c.CA.Validate(); err != nil { - return err - } - } - - if c.Cert != (SecretOrConfigMap{}) { - if c.CertFile != "" { - return &TLSConfigValidationError{"tls config can not both specify CertFile and Cert"} - } - if err := c.Cert.Validate(); err != nil { - return err - } - } - - if c.KeyFile != "" && c.KeySecret != nil { - return &TLSConfigValidationError{"tls config can not both specify KeyFile and KeySecret"} - } - - return nil -} - -// ServiceMonitorList is a list of ServiceMonitors. -// +k8s:openapi-gen=true -type ServiceMonitorList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - metav1.ListMeta `json:"metadata,omitempty"` - // List of ServiceMonitors - Items []*ServiceMonitor `json:"items"` -} - -// PodMonitorList is a list of PodMonitors. -// +k8s:openapi-gen=true -type PodMonitorList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - metav1.ListMeta `json:"metadata,omitempty"` - // List of PodMonitors - Items []*PodMonitor `json:"items"` -} - -// PrometheusRuleList is a list of PrometheusRules. -// +k8s:openapi-gen=true -type PrometheusRuleList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - metav1.ListMeta `json:"metadata,omitempty"` - // List of Rules - Items []*PrometheusRule `json:"items"` -} - -// PrometheusRule defines alerting rules for a Prometheus instance -// +genclient -// +k8s:openapi-gen=true -type PrometheusRule struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - // Specification of desired alerting rule definitions for Prometheus. - Spec PrometheusRuleSpec `json:"spec"` -} - -// PrometheusRuleSpec contains specification parameters for a Rule. -// +k8s:openapi-gen=true -type PrometheusRuleSpec struct { - // Content of Prometheus rule file - Groups []RuleGroup `json:"groups,omitempty"` -} - -// RuleGroup and Rule are copied instead of vendored because the -// upstream Prometheus struct definitions don't have json struct tags. - -// RuleGroup is a list of sequentially evaluated recording and alerting rules. -// Note: PartialResponseStrategy is only used by ThanosRuler and will -// be ignored by Prometheus instances. Valid values for this field are 'warn' -// or 'abort'. More info: https://github.com/thanos-io/thanos/blob/master/docs/components/rule.md#partial-response -// +k8s:openapi-gen=true -type RuleGroup struct { - Name string `json:"name"` - Interval string `json:"interval,omitempty"` - Rules []Rule `json:"rules"` - PartialResponseStrategy string `json:"partial_response_strategy,omitempty"` -} - -// Rule describes an alerting or recording rule. -// +k8s:openapi-gen=true -type Rule struct { - Record string `json:"record,omitempty"` - Alert string `json:"alert,omitempty"` - Expr intstr.IntOrString `json:"expr"` - For string `json:"for,omitempty"` - Labels map[string]string `json:"labels,omitempty"` - Annotations map[string]string `json:"annotations,omitempty"` -} - -// Alertmanager describes an Alertmanager cluster. -// +genclient -// +k8s:openapi-gen=true -// +kubebuilder:printcolumn:name="Version",type="string",JSONPath=".spec.version",description="The version of Alertmanager" -// +kubebuilder:printcolumn:name="Replicas",type="integer",JSONPath=".spec.replicas",description="The desired replicas number of Alertmanagers" -// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -type Alertmanager struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - // Specification of the desired behavior of the Alertmanager cluster. More info: - // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - Spec AlertmanagerSpec `json:"spec"` - // Most recent observed status of the Alertmanager cluster. Read-only. Not - // included when requesting from the apiserver, only from the Prometheus - // Operator API itself. More info: - // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - Status *AlertmanagerStatus `json:"status,omitempty"` -} - -// AlertmanagerSpec is a specification of the desired behavior of the Alertmanager cluster. More info: -// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -// +k8s:openapi-gen=true -type AlertmanagerSpec struct { - // PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods. - PodMetadata *PodMeta `json:"podMetadata,omitempty"` - // Image if specified has precedence over baseImage, tag and sha - // combinations. Specifying the version is still necessary to ensure the - // Prometheus Operator knows what version of Alertmanager is being - // configured. - Image *string `json:"image,omitempty"` - // Version the cluster should be on. - Version string `json:"version,omitempty"` - // Tag of Alertmanager container image to be deployed. Defaults to the value of `version`. - // Version is ignored if Tag is set. - Tag string `json:"tag,omitempty"` - // SHA of Alertmanager container image to be deployed. Defaults to the value of `version`. - // Similar to a tag, but the SHA explicitly deploys an immutable container image. - // Version and Tag are ignored if SHA is set. - SHA string `json:"sha,omitempty"` - // Base image that is used to deploy pods, without tag. - BaseImage string `json:"baseImage,omitempty"` - // An optional list of references to secrets in the same namespace - // to use for pulling prometheus and alertmanager images from registries - // see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod - ImagePullSecrets []v1.LocalObjectReference `json:"imagePullSecrets,omitempty"` - // Secrets is a list of Secrets in the same namespace as the Alertmanager - // object, which shall be mounted into the Alertmanager Pods. - // The Secrets are mounted into /etc/alertmanager/secrets/. - Secrets []string `json:"secrets,omitempty"` - // ConfigMaps is a list of ConfigMaps in the same namespace as the Alertmanager - // object, which shall be mounted into the Alertmanager Pods. - // The ConfigMaps are mounted into /etc/alertmanager/configmaps/. - ConfigMaps []string `json:"configMaps,omitempty"` - // ConfigSecret is the name of a Kubernetes Secret in the same namespace as the - // Alertmanager object, which contains configuration for this Alertmanager - // instance. Defaults to 'alertmanager-' - // The secret is mounted into /etc/alertmanager/config. - ConfigSecret string `json:"configSecret,omitempty"` - // Log level for Alertmanager to be configured with. - LogLevel string `json:"logLevel,omitempty"` - // Log format for Alertmanager to be configured with. - LogFormat string `json:"logFormat,omitempty"` - // Size is the expected size of the alertmanager cluster. The controller will - // eventually make the size of the running cluster equal to the expected - // size. - Replicas *int32 `json:"replicas,omitempty"` - // Time duration Alertmanager shall retain data for. Default is '120h', - // and must match the regular expression `[0-9]+(ms|s|m|h)` (milliseconds seconds minutes hours). - Retention string `json:"retention,omitempty"` - // Storage is the definition of how storage will be used by the Alertmanager - // instances. - Storage *StorageSpec `json:"storage,omitempty"` - // Volumes allows configuration of additional volumes on the output StatefulSet definition. - // Volumes specified will be appended to other volumes that are generated as a result of - // StorageSpec objects. - Volumes []v1.Volume `json:"volumes,omitempty"` - // VolumeMounts allows configuration of additional VolumeMounts on the output StatefulSet definition. - // VolumeMounts specified will be appended to other VolumeMounts in the alertmanager container, - // that are generated as a result of StorageSpec objects. - VolumeMounts []v1.VolumeMount `json:"volumeMounts,omitempty"` - // The external URL the Alertmanager instances will be available under. This is - // necessary to generate correct URLs. This is necessary if Alertmanager is not - // served from root of a DNS name. - ExternalURL string `json:"externalUrl,omitempty"` - // The route prefix Alertmanager registers HTTP handlers for. This is useful, - // if using ExternalURL and a proxy is rewriting HTTP routes of a request, - // and the actual ExternalURL is still true, but the server serves requests - // under a different route prefix. For example for use with `kubectl proxy`. - RoutePrefix string `json:"routePrefix,omitempty"` - // If set to true all actions on the underlaying managed objects are not - // goint to be performed, except for delete actions. - Paused bool `json:"paused,omitempty"` - // Define which Nodes the Pods are scheduled on. - NodeSelector map[string]string `json:"nodeSelector,omitempty"` - // Define resources requests and limits for single Pods. - Resources v1.ResourceRequirements `json:"resources,omitempty"` - // If specified, the pod's scheduling constraints. - Affinity *v1.Affinity `json:"affinity,omitempty"` - // If specified, the pod's tolerations. - Tolerations []v1.Toleration `json:"tolerations,omitempty"` - // SecurityContext holds pod-level security attributes and common container settings. - // This defaults to the default PodSecurityContext. - SecurityContext *v1.PodSecurityContext `json:"securityContext,omitempty"` - // ServiceAccountName is the name of the ServiceAccount to use to run the - // Prometheus Pods. - ServiceAccountName string `json:"serviceAccountName,omitempty"` - // ListenLocal makes the Alertmanager server listen on loopback, so that it - // does not bind against the Pod IP. Note this is only for the Alertmanager - // UI, not the gossip communication. - ListenLocal bool `json:"listenLocal,omitempty"` - // Containers allows injecting additional containers. This is meant to - // allow adding an authentication proxy to an Alertmanager pod. - Containers []v1.Container `json:"containers,omitempty"` - // InitContainers allows adding initContainers to the pod definition. Those can be used to e.g. - // fetch secrets for injection into the Alertmanager configuration from external sources. Any - // errors during the execution of an initContainer will lead to a restart of the Pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ - // Using initContainers for any use case other then secret fetching is entirely outside the scope - // of what the maintainers will support and by doing so, you accept that this behaviour may break - // at any time without notice. - InitContainers []v1.Container `json:"initContainers,omitempty"` - // Priority class assigned to the Pods - PriorityClassName string `json:"priorityClassName,omitempty"` - // AdditionalPeers allows injecting a set of additional Alertmanagers to peer with to form a highly available cluster. - AdditionalPeers []string `json:"additionalPeers,omitempty"` - // Port name used for the pods and governing service. - // This defaults to web - PortName string `json:"portName,omitempty"` -} - -// AlertmanagerList is a list of Alertmanagers. -// +k8s:openapi-gen=true -type AlertmanagerList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata - // More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata - metav1.ListMeta `json:"metadata,omitempty"` - // List of Alertmanagers - Items []Alertmanager `json:"items"` -} - -// AlertmanagerStatus is the most recent observed status of the Alertmanager cluster. Read-only. Not -// included when requesting from the apiserver, only from the Prometheus -// Operator API itself. More info: -// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status -// +k8s:openapi-gen=true -type AlertmanagerStatus struct { - // Represents whether any actions on the underlaying managed objects are - // being performed. Only delete actions will be performed. - Paused bool `json:"paused"` - // Total number of non-terminated pods targeted by this Alertmanager - // cluster (their labels match the selector). - Replicas int32 `json:"replicas"` - // Total number of non-terminated pods targeted by this Alertmanager - // cluster that have the desired version spec. - UpdatedReplicas int32 `json:"updatedReplicas"` - // Total number of available pods (ready for at least minReadySeconds) - // targeted by this Alertmanager cluster. - AvailableReplicas int32 `json:"availableReplicas"` - // Total number of unavailable pods targeted by this Alertmanager cluster. - UnavailableReplicas int32 `json:"unavailableReplicas"` -} - -// NamespaceSelector is a selector for selecting either all namespaces or a -// list of namespaces. -// +k8s:openapi-gen=true -type NamespaceSelector struct { - // Boolean describing whether all namespaces are selected in contrast to a - // list restricting them. - Any bool `json:"any,omitempty"` - // List of namespace names. - MatchNames []string `json:"matchNames,omitempty"` - - // TODO(fabxc): this should embed metav1.LabelSelector eventually. - // Currently the selector is only used for namespaces which require more complex - // implementation to support label selections. -} - -// /--rules.*/ command-line arguments -// +k8s:openapi-gen=true -type Rules struct { - Alert RulesAlert `json:"alert,omitempty"` -} - -// /--rules.alert.*/ command-line arguments -// +k8s:openapi-gen=true -type RulesAlert struct { - // Max time to tolerate prometheus outage for restoring 'for' state of alert. - ForOutageTolerance string `json:"forOutageTolerance,omitempty"` - // Minimum duration between alert and restored 'for' state. - // This is maintained only for alerts with configured 'for' time greater than grace period. - ForGracePeriod string `json:"forGracePeriod,omitempty"` - // Minimum amount of time to wait before resending an alert to Alertmanager. - ResendDelay string `json:"resendDelay,omitempty"` -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *Alertmanager) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *AlertmanagerList) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *Prometheus) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *PrometheusList) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *ServiceMonitor) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *ServiceMonitorList) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *PodMonitor) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *PodMonitorList) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (f *PrometheusRule) DeepCopyObject() runtime.Object { - return f.DeepCopy() -} - -// DeepCopyObject implements the runtime.Object interface. -func (l *PrometheusRuleList) DeepCopyObject() runtime.Object { - return l.DeepCopy() -} diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go deleted file mode 100644 index 5d67ca7b..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go +++ /dev/null @@ -1,1600 +0,0 @@ -// +build !ignore_autogenerated - -// Copyright 2018 The prometheus-operator Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by controller-gen. DO NOT EDIT. - -package v1 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *APIServerConfig) DeepCopyInto(out *APIServerConfig) { - *out = *in - if in.BasicAuth != nil { - in, out := &in.BasicAuth, &out.BasicAuth - *out = new(BasicAuth) - (*in).DeepCopyInto(*out) - } - if in.TLSConfig != nil { - in, out := &in.TLSConfig, &out.TLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerConfig. -func (in *APIServerConfig) DeepCopy() *APIServerConfig { - if in == nil { - return nil - } - out := new(APIServerConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlertingSpec) DeepCopyInto(out *AlertingSpec) { - *out = *in - if in.Alertmanagers != nil { - in, out := &in.Alertmanagers, &out.Alertmanagers - *out = make([]AlertmanagerEndpoints, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlertingSpec. -func (in *AlertingSpec) DeepCopy() *AlertingSpec { - if in == nil { - return nil - } - out := new(AlertingSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Alertmanager) DeepCopyInto(out *Alertmanager) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - if in.Status != nil { - in, out := &in.Status, &out.Status - *out = new(AlertmanagerStatus) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Alertmanager. -func (in *Alertmanager) DeepCopy() *Alertmanager { - if in == nil { - return nil - } - out := new(Alertmanager) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlertmanagerEndpoints) DeepCopyInto(out *AlertmanagerEndpoints) { - *out = *in - out.Port = in.Port - if in.TLSConfig != nil { - in, out := &in.TLSConfig, &out.TLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlertmanagerEndpoints. -func (in *AlertmanagerEndpoints) DeepCopy() *AlertmanagerEndpoints { - if in == nil { - return nil - } - out := new(AlertmanagerEndpoints) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlertmanagerList) DeepCopyInto(out *AlertmanagerList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Alertmanager, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlertmanagerList. -func (in *AlertmanagerList) DeepCopy() *AlertmanagerList { - if in == nil { - return nil - } - out := new(AlertmanagerList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlertmanagerSpec) DeepCopyInto(out *AlertmanagerSpec) { - *out = *in - if in.PodMetadata != nil { - in, out := &in.PodMetadata, &out.PodMetadata - *out = new(PodMeta) - (*in).DeepCopyInto(*out) - } - if in.Image != nil { - in, out := &in.Image, &out.Image - *out = new(string) - **out = **in - } - if in.ImagePullSecrets != nil { - in, out := &in.ImagePullSecrets, &out.ImagePullSecrets - *out = make([]corev1.LocalObjectReference, len(*in)) - copy(*out, *in) - } - if in.Secrets != nil { - in, out := &in.Secrets, &out.Secrets - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.ConfigMaps != nil { - in, out := &in.ConfigMaps, &out.ConfigMaps - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Replicas != nil { - in, out := &in.Replicas, &out.Replicas - *out = new(int32) - **out = **in - } - if in.Storage != nil { - in, out := &in.Storage, &out.Storage - *out = new(StorageSpec) - (*in).DeepCopyInto(*out) - } - if in.Volumes != nil { - in, out := &in.Volumes, &out.Volumes - *out = make([]corev1.Volume, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.VolumeMounts != nil { - in, out := &in.VolumeMounts, &out.VolumeMounts - *out = make([]corev1.VolumeMount, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.NodeSelector != nil { - in, out := &in.NodeSelector, &out.NodeSelector - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - in.Resources.DeepCopyInto(&out.Resources) - if in.Affinity != nil { - in, out := &in.Affinity, &out.Affinity - *out = new(corev1.Affinity) - (*in).DeepCopyInto(*out) - } - if in.Tolerations != nil { - in, out := &in.Tolerations, &out.Tolerations - *out = make([]corev1.Toleration, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.SecurityContext != nil { - in, out := &in.SecurityContext, &out.SecurityContext - *out = new(corev1.PodSecurityContext) - (*in).DeepCopyInto(*out) - } - if in.Containers != nil { - in, out := &in.Containers, &out.Containers - *out = make([]corev1.Container, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.InitContainers != nil { - in, out := &in.InitContainers, &out.InitContainers - *out = make([]corev1.Container, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.AdditionalPeers != nil { - in, out := &in.AdditionalPeers, &out.AdditionalPeers - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlertmanagerSpec. -func (in *AlertmanagerSpec) DeepCopy() *AlertmanagerSpec { - if in == nil { - return nil - } - out := new(AlertmanagerSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AlertmanagerStatus) DeepCopyInto(out *AlertmanagerStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlertmanagerStatus. -func (in *AlertmanagerStatus) DeepCopy() *AlertmanagerStatus { - if in == nil { - return nil - } - out := new(AlertmanagerStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ArbitraryFSAccessThroughSMsConfig) DeepCopyInto(out *ArbitraryFSAccessThroughSMsConfig) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArbitraryFSAccessThroughSMsConfig. -func (in *ArbitraryFSAccessThroughSMsConfig) DeepCopy() *ArbitraryFSAccessThroughSMsConfig { - if in == nil { - return nil - } - out := new(ArbitraryFSAccessThroughSMsConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BasicAuth) DeepCopyInto(out *BasicAuth) { - *out = *in - in.Username.DeepCopyInto(&out.Username) - in.Password.DeepCopyInto(&out.Password) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuth. -func (in *BasicAuth) DeepCopy() *BasicAuth { - if in == nil { - return nil - } - out := new(BasicAuth) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CrdKind) DeepCopyInto(out *CrdKind) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CrdKind. -func (in *CrdKind) DeepCopy() *CrdKind { - if in == nil { - return nil - } - out := new(CrdKind) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CrdKinds) DeepCopyInto(out *CrdKinds) { - *out = *in - out.Prometheus = in.Prometheus - out.Alertmanager = in.Alertmanager - out.ServiceMonitor = in.ServiceMonitor - out.PodMonitor = in.PodMonitor - out.PrometheusRule = in.PrometheusRule - out.ThanosRuler = in.ThanosRuler -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CrdKinds. -func (in *CrdKinds) DeepCopy() *CrdKinds { - if in == nil { - return nil - } - out := new(CrdKinds) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Endpoint) DeepCopyInto(out *Endpoint) { - *out = *in - if in.TargetPort != nil { - in, out := &in.TargetPort, &out.TargetPort - *out = new(intstr.IntOrString) - **out = **in - } - if in.Params != nil { - in, out := &in.Params, &out.Params - *out = make(map[string][]string, len(*in)) - for key, val := range *in { - var outVal []string - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make([]string, len(*in)) - copy(*out, *in) - } - (*out)[key] = outVal - } - } - if in.TLSConfig != nil { - in, out := &in.TLSConfig, &out.TLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } - in.BearerTokenSecret.DeepCopyInto(&out.BearerTokenSecret) - if in.HonorTimestamps != nil { - in, out := &in.HonorTimestamps, &out.HonorTimestamps - *out = new(bool) - **out = **in - } - if in.BasicAuth != nil { - in, out := &in.BasicAuth, &out.BasicAuth - *out = new(BasicAuth) - (*in).DeepCopyInto(*out) - } - if in.MetricRelabelConfigs != nil { - in, out := &in.MetricRelabelConfigs, &out.MetricRelabelConfigs - *out = make([]*RelabelConfig, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(RelabelConfig) - (*in).DeepCopyInto(*out) - } - } - } - if in.RelabelConfigs != nil { - in, out := &in.RelabelConfigs, &out.RelabelConfigs - *out = make([]*RelabelConfig, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(RelabelConfig) - (*in).DeepCopyInto(*out) - } - } - } - if in.ProxyURL != nil { - in, out := &in.ProxyURL, &out.ProxyURL - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Endpoint. -func (in *Endpoint) DeepCopy() *Endpoint { - if in == nil { - return nil - } - out := new(Endpoint) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamespaceSelector) DeepCopyInto(out *NamespaceSelector) { - *out = *in - if in.MatchNames != nil { - in, out := &in.MatchNames, &out.MatchNames - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespaceSelector. -func (in *NamespaceSelector) DeepCopy() *NamespaceSelector { - if in == nil { - return nil - } - out := new(NamespaceSelector) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMeta) DeepCopyInto(out *PodMeta) { - *out = *in - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Annotations != nil { - in, out := &in.Annotations, &out.Annotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMeta. -func (in *PodMeta) DeepCopy() *PodMeta { - if in == nil { - return nil - } - out := new(PodMeta) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetricsEndpoint) DeepCopyInto(out *PodMetricsEndpoint) { - *out = *in - if in.TargetPort != nil { - in, out := &in.TargetPort, &out.TargetPort - *out = new(intstr.IntOrString) - **out = **in - } - if in.Params != nil { - in, out := &in.Params, &out.Params - *out = make(map[string][]string, len(*in)) - for key, val := range *in { - var outVal []string - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make([]string, len(*in)) - copy(*out, *in) - } - (*out)[key] = outVal - } - } - if in.HonorTimestamps != nil { - in, out := &in.HonorTimestamps, &out.HonorTimestamps - *out = new(bool) - **out = **in - } - if in.MetricRelabelConfigs != nil { - in, out := &in.MetricRelabelConfigs, &out.MetricRelabelConfigs - *out = make([]*RelabelConfig, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(RelabelConfig) - (*in).DeepCopyInto(*out) - } - } - } - if in.RelabelConfigs != nil { - in, out := &in.RelabelConfigs, &out.RelabelConfigs - *out = make([]*RelabelConfig, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(RelabelConfig) - (*in).DeepCopyInto(*out) - } - } - } - if in.ProxyURL != nil { - in, out := &in.ProxyURL, &out.ProxyURL - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetricsEndpoint. -func (in *PodMetricsEndpoint) DeepCopy() *PodMetricsEndpoint { - if in == nil { - return nil - } - out := new(PodMetricsEndpoint) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMonitor) DeepCopyInto(out *PodMonitor) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMonitor. -func (in *PodMonitor) DeepCopy() *PodMonitor { - if in == nil { - return nil - } - out := new(PodMonitor) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMonitorList) DeepCopyInto(out *PodMonitorList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]*PodMonitor, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PodMonitor) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMonitorList. -func (in *PodMonitorList) DeepCopy() *PodMonitorList { - if in == nil { - return nil - } - out := new(PodMonitorList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMonitorSpec) DeepCopyInto(out *PodMonitorSpec) { - *out = *in - if in.PodTargetLabels != nil { - in, out := &in.PodTargetLabels, &out.PodTargetLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PodMetricsEndpoints != nil { - in, out := &in.PodMetricsEndpoints, &out.PodMetricsEndpoints - *out = make([]PodMetricsEndpoint, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.Selector.DeepCopyInto(&out.Selector) - in.NamespaceSelector.DeepCopyInto(&out.NamespaceSelector) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMonitorSpec. -func (in *PodMonitorSpec) DeepCopy() *PodMonitorSpec { - if in == nil { - return nil - } - out := new(PodMonitorSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Prometheus) DeepCopyInto(out *Prometheus) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - if in.Status != nil { - in, out := &in.Status, &out.Status - *out = new(PrometheusStatus) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Prometheus. -func (in *Prometheus) DeepCopy() *Prometheus { - if in == nil { - return nil - } - out := new(Prometheus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusList) DeepCopyInto(out *PrometheusList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]*Prometheus, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(Prometheus) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusList. -func (in *PrometheusList) DeepCopy() *PrometheusList { - if in == nil { - return nil - } - out := new(PrometheusList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusRule) DeepCopyInto(out *PrometheusRule) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusRule. -func (in *PrometheusRule) DeepCopy() *PrometheusRule { - if in == nil { - return nil - } - out := new(PrometheusRule) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusRuleList) DeepCopyInto(out *PrometheusRuleList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]*PrometheusRule, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PrometheusRule) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusRuleList. -func (in *PrometheusRuleList) DeepCopy() *PrometheusRuleList { - if in == nil { - return nil - } - out := new(PrometheusRuleList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusRuleSpec) DeepCopyInto(out *PrometheusRuleSpec) { - *out = *in - if in.Groups != nil { - in, out := &in.Groups, &out.Groups - *out = make([]RuleGroup, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusRuleSpec. -func (in *PrometheusRuleSpec) DeepCopy() *PrometheusRuleSpec { - if in == nil { - return nil - } - out := new(PrometheusRuleSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusSpec) DeepCopyInto(out *PrometheusSpec) { - *out = *in - if in.PodMetadata != nil { - in, out := &in.PodMetadata, &out.PodMetadata - *out = new(PodMeta) - (*in).DeepCopyInto(*out) - } - if in.ServiceMonitorSelector != nil { - in, out := &in.ServiceMonitorSelector, &out.ServiceMonitorSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.ServiceMonitorNamespaceSelector != nil { - in, out := &in.ServiceMonitorNamespaceSelector, &out.ServiceMonitorNamespaceSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.PodMonitorSelector != nil { - in, out := &in.PodMonitorSelector, &out.PodMonitorSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.PodMonitorNamespaceSelector != nil { - in, out := &in.PodMonitorNamespaceSelector, &out.PodMonitorNamespaceSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.Image != nil { - in, out := &in.Image, &out.Image - *out = new(string) - **out = **in - } - if in.ImagePullSecrets != nil { - in, out := &in.ImagePullSecrets, &out.ImagePullSecrets - *out = make([]corev1.LocalObjectReference, len(*in)) - copy(*out, *in) - } - if in.Replicas != nil { - in, out := &in.Replicas, &out.Replicas - *out = new(int32) - **out = **in - } - if in.ReplicaExternalLabelName != nil { - in, out := &in.ReplicaExternalLabelName, &out.ReplicaExternalLabelName - *out = new(string) - **out = **in - } - if in.PrometheusExternalLabelName != nil { - in, out := &in.PrometheusExternalLabelName, &out.PrometheusExternalLabelName - *out = new(string) - **out = **in - } - if in.WALCompression != nil { - in, out := &in.WALCompression, &out.WALCompression - *out = new(bool) - **out = **in - } - out.Rules = in.Rules - if in.ExternalLabels != nil { - in, out := &in.ExternalLabels, &out.ExternalLabels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Query != nil { - in, out := &in.Query, &out.Query - *out = new(QuerySpec) - (*in).DeepCopyInto(*out) - } - if in.Storage != nil { - in, out := &in.Storage, &out.Storage - *out = new(StorageSpec) - (*in).DeepCopyInto(*out) - } - if in.Volumes != nil { - in, out := &in.Volumes, &out.Volumes - *out = make([]corev1.Volume, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.VolumeMounts != nil { - in, out := &in.VolumeMounts, &out.VolumeMounts - *out = make([]corev1.VolumeMount, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.RuleSelector != nil { - in, out := &in.RuleSelector, &out.RuleSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.RuleNamespaceSelector != nil { - in, out := &in.RuleNamespaceSelector, &out.RuleNamespaceSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.Alerting != nil { - in, out := &in.Alerting, &out.Alerting - *out = new(AlertingSpec) - (*in).DeepCopyInto(*out) - } - in.Resources.DeepCopyInto(&out.Resources) - if in.NodeSelector != nil { - in, out := &in.NodeSelector, &out.NodeSelector - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Secrets != nil { - in, out := &in.Secrets, &out.Secrets - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.ConfigMaps != nil { - in, out := &in.ConfigMaps, &out.ConfigMaps - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Affinity != nil { - in, out := &in.Affinity, &out.Affinity - *out = new(corev1.Affinity) - (*in).DeepCopyInto(*out) - } - if in.Tolerations != nil { - in, out := &in.Tolerations, &out.Tolerations - *out = make([]corev1.Toleration, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.RemoteWrite != nil { - in, out := &in.RemoteWrite, &out.RemoteWrite - *out = make([]RemoteWriteSpec, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.RemoteRead != nil { - in, out := &in.RemoteRead, &out.RemoteRead - *out = make([]RemoteReadSpec, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.SecurityContext != nil { - in, out := &in.SecurityContext, &out.SecurityContext - *out = new(corev1.PodSecurityContext) - (*in).DeepCopyInto(*out) - } - if in.Containers != nil { - in, out := &in.Containers, &out.Containers - *out = make([]corev1.Container, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.InitContainers != nil { - in, out := &in.InitContainers, &out.InitContainers - *out = make([]corev1.Container, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.AdditionalScrapeConfigs != nil { - in, out := &in.AdditionalScrapeConfigs, &out.AdditionalScrapeConfigs - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.AdditionalAlertRelabelConfigs != nil { - in, out := &in.AdditionalAlertRelabelConfigs, &out.AdditionalAlertRelabelConfigs - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.AdditionalAlertManagerConfigs != nil { - in, out := &in.AdditionalAlertManagerConfigs, &out.AdditionalAlertManagerConfigs - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.APIServerConfig != nil { - in, out := &in.APIServerConfig, &out.APIServerConfig - *out = new(APIServerConfig) - (*in).DeepCopyInto(*out) - } - if in.Thanos != nil { - in, out := &in.Thanos, &out.Thanos - *out = new(ThanosSpec) - (*in).DeepCopyInto(*out) - } - out.ArbitraryFSAccessThroughSMs = in.ArbitraryFSAccessThroughSMs -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusSpec. -func (in *PrometheusSpec) DeepCopy() *PrometheusSpec { - if in == nil { - return nil - } - out := new(PrometheusSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusStatus) DeepCopyInto(out *PrometheusStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusStatus. -func (in *PrometheusStatus) DeepCopy() *PrometheusStatus { - if in == nil { - return nil - } - out := new(PrometheusStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *QuerySpec) DeepCopyInto(out *QuerySpec) { - *out = *in - if in.LookbackDelta != nil { - in, out := &in.LookbackDelta, &out.LookbackDelta - *out = new(string) - **out = **in - } - if in.MaxConcurrency != nil { - in, out := &in.MaxConcurrency, &out.MaxConcurrency - *out = new(int32) - **out = **in - } - if in.MaxSamples != nil { - in, out := &in.MaxSamples, &out.MaxSamples - *out = new(int32) - **out = **in - } - if in.Timeout != nil { - in, out := &in.Timeout, &out.Timeout - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QuerySpec. -func (in *QuerySpec) DeepCopy() *QuerySpec { - if in == nil { - return nil - } - out := new(QuerySpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *QueueConfig) DeepCopyInto(out *QueueConfig) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueueConfig. -func (in *QueueConfig) DeepCopy() *QueueConfig { - if in == nil { - return nil - } - out := new(QueueConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RelabelConfig) DeepCopyInto(out *RelabelConfig) { - *out = *in - if in.SourceLabels != nil { - in, out := &in.SourceLabels, &out.SourceLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RelabelConfig. -func (in *RelabelConfig) DeepCopy() *RelabelConfig { - if in == nil { - return nil - } - out := new(RelabelConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RemoteReadSpec) DeepCopyInto(out *RemoteReadSpec) { - *out = *in - if in.RequiredMatchers != nil { - in, out := &in.RequiredMatchers, &out.RequiredMatchers - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.BasicAuth != nil { - in, out := &in.BasicAuth, &out.BasicAuth - *out = new(BasicAuth) - (*in).DeepCopyInto(*out) - } - if in.TLSConfig != nil { - in, out := &in.TLSConfig, &out.TLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteReadSpec. -func (in *RemoteReadSpec) DeepCopy() *RemoteReadSpec { - if in == nil { - return nil - } - out := new(RemoteReadSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RemoteWriteSpec) DeepCopyInto(out *RemoteWriteSpec) { - *out = *in - if in.WriteRelabelConfigs != nil { - in, out := &in.WriteRelabelConfigs, &out.WriteRelabelConfigs - *out = make([]RelabelConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.BasicAuth != nil { - in, out := &in.BasicAuth, &out.BasicAuth - *out = new(BasicAuth) - (*in).DeepCopyInto(*out) - } - if in.TLSConfig != nil { - in, out := &in.TLSConfig, &out.TLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } - if in.QueueConfig != nil { - in, out := &in.QueueConfig, &out.QueueConfig - *out = new(QueueConfig) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteWriteSpec. -func (in *RemoteWriteSpec) DeepCopy() *RemoteWriteSpec { - if in == nil { - return nil - } - out := new(RemoteWriteSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Rule) DeepCopyInto(out *Rule) { - *out = *in - out.Expr = in.Expr - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Annotations != nil { - in, out := &in.Annotations, &out.Annotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Rule. -func (in *Rule) DeepCopy() *Rule { - if in == nil { - return nil - } - out := new(Rule) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RuleGroup) DeepCopyInto(out *RuleGroup) { - *out = *in - if in.Rules != nil { - in, out := &in.Rules, &out.Rules - *out = make([]Rule, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RuleGroup. -func (in *RuleGroup) DeepCopy() *RuleGroup { - if in == nil { - return nil - } - out := new(RuleGroup) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Rules) DeepCopyInto(out *Rules) { - *out = *in - out.Alert = in.Alert -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Rules. -func (in *Rules) DeepCopy() *Rules { - if in == nil { - return nil - } - out := new(Rules) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RulesAlert) DeepCopyInto(out *RulesAlert) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RulesAlert. -func (in *RulesAlert) DeepCopy() *RulesAlert { - if in == nil { - return nil - } - out := new(RulesAlert) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SecretOrConfigMap) DeepCopyInto(out *SecretOrConfigMap) { - *out = *in - if in.Secret != nil { - in, out := &in.Secret, &out.Secret - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.ConfigMap != nil { - in, out := &in.ConfigMap, &out.ConfigMap - *out = new(corev1.ConfigMapKeySelector) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretOrConfigMap. -func (in *SecretOrConfigMap) DeepCopy() *SecretOrConfigMap { - if in == nil { - return nil - } - out := new(SecretOrConfigMap) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SecretOrConfigMapValidationError) DeepCopyInto(out *SecretOrConfigMapValidationError) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretOrConfigMapValidationError. -func (in *SecretOrConfigMapValidationError) DeepCopy() *SecretOrConfigMapValidationError { - if in == nil { - return nil - } - out := new(SecretOrConfigMapValidationError) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceMonitor) DeepCopyInto(out *ServiceMonitor) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceMonitor. -func (in *ServiceMonitor) DeepCopy() *ServiceMonitor { - if in == nil { - return nil - } - out := new(ServiceMonitor) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceMonitorList) DeepCopyInto(out *ServiceMonitorList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]*ServiceMonitor, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(ServiceMonitor) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceMonitorList. -func (in *ServiceMonitorList) DeepCopy() *ServiceMonitorList { - if in == nil { - return nil - } - out := new(ServiceMonitorList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceMonitorSpec) DeepCopyInto(out *ServiceMonitorSpec) { - *out = *in - if in.TargetLabels != nil { - in, out := &in.TargetLabels, &out.TargetLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PodTargetLabels != nil { - in, out := &in.PodTargetLabels, &out.PodTargetLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Endpoints != nil { - in, out := &in.Endpoints, &out.Endpoints - *out = make([]Endpoint, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.Selector.DeepCopyInto(&out.Selector) - in.NamespaceSelector.DeepCopyInto(&out.NamespaceSelector) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceMonitorSpec. -func (in *ServiceMonitorSpec) DeepCopy() *ServiceMonitorSpec { - if in == nil { - return nil - } - out := new(ServiceMonitorSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StorageSpec) DeepCopyInto(out *StorageSpec) { - *out = *in - if in.EmptyDir != nil { - in, out := &in.EmptyDir, &out.EmptyDir - *out = new(corev1.EmptyDirVolumeSource) - (*in).DeepCopyInto(*out) - } - in.VolumeClaimTemplate.DeepCopyInto(&out.VolumeClaimTemplate) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageSpec. -func (in *StorageSpec) DeepCopy() *StorageSpec { - if in == nil { - return nil - } - out := new(StorageSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSConfig) DeepCopyInto(out *TLSConfig) { - *out = *in - in.CA.DeepCopyInto(&out.CA) - in.Cert.DeepCopyInto(&out.Cert) - if in.KeySecret != nil { - in, out := &in.KeySecret, &out.KeySecret - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSConfig. -func (in *TLSConfig) DeepCopy() *TLSConfig { - if in == nil { - return nil - } - out := new(TLSConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSConfigValidationError) DeepCopyInto(out *TLSConfigValidationError) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSConfigValidationError. -func (in *TLSConfigValidationError) DeepCopy() *TLSConfigValidationError { - if in == nil { - return nil - } - out := new(TLSConfigValidationError) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ThanosRuler) DeepCopyInto(out *ThanosRuler) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - if in.Status != nil { - in, out := &in.Status, &out.Status - *out = new(ThanosRulerStatus) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ThanosRuler. -func (in *ThanosRuler) DeepCopy() *ThanosRuler { - if in == nil { - return nil - } - out := new(ThanosRuler) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ThanosRulerList) DeepCopyInto(out *ThanosRulerList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]*ThanosRuler, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(ThanosRuler) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ThanosRulerList. -func (in *ThanosRulerList) DeepCopy() *ThanosRulerList { - if in == nil { - return nil - } - out := new(ThanosRulerList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ThanosRulerSpec) DeepCopyInto(out *ThanosRulerSpec) { - *out = *in - if in.PodMetadata != nil { - in, out := &in.PodMetadata, &out.PodMetadata - *out = new(PodMeta) - (*in).DeepCopyInto(*out) - } - if in.ImagePullSecrets != nil { - in, out := &in.ImagePullSecrets, &out.ImagePullSecrets - *out = make([]corev1.LocalObjectReference, len(*in)) - copy(*out, *in) - } - if in.Replicas != nil { - in, out := &in.Replicas, &out.Replicas - *out = new(int32) - **out = **in - } - if in.NodeSelector != nil { - in, out := &in.NodeSelector, &out.NodeSelector - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - in.Resources.DeepCopyInto(&out.Resources) - if in.Affinity != nil { - in, out := &in.Affinity, &out.Affinity - *out = new(corev1.Affinity) - (*in).DeepCopyInto(*out) - } - if in.Tolerations != nil { - in, out := &in.Tolerations, &out.Tolerations - *out = make([]corev1.Toleration, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.SecurityContext != nil { - in, out := &in.SecurityContext, &out.SecurityContext - *out = new(corev1.PodSecurityContext) - (*in).DeepCopyInto(*out) - } - if in.Storage != nil { - in, out := &in.Storage, &out.Storage - *out = new(StorageSpec) - (*in).DeepCopyInto(*out) - } - if in.Volumes != nil { - in, out := &in.Volumes, &out.Volumes - *out = make([]corev1.Volume, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.ObjectStorageConfig != nil { - in, out := &in.ObjectStorageConfig, &out.ObjectStorageConfig - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.QueryEndpoints != nil { - in, out := &in.QueryEndpoints, &out.QueryEndpoints - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.QueryConfig != nil { - in, out := &in.QueryConfig, &out.QueryConfig - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.AlertManagersURL != nil { - in, out := &in.AlertManagersURL, &out.AlertManagersURL - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.AlertManagersConfig != nil { - in, out := &in.AlertManagersConfig, &out.AlertManagersConfig - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.RuleSelector != nil { - in, out := &in.RuleSelector, &out.RuleSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.RuleNamespaceSelector != nil { - in, out := &in.RuleNamespaceSelector, &out.RuleNamespaceSelector - *out = new(metav1.LabelSelector) - (*in).DeepCopyInto(*out) - } - if in.Containers != nil { - in, out := &in.Containers, &out.Containers - *out = make([]corev1.Container, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.InitContainers != nil { - in, out := &in.InitContainers, &out.InitContainers - *out = make([]corev1.Container, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.TracingConfig != nil { - in, out := &in.TracingConfig, &out.TracingConfig - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.AlertDropLabels != nil { - in, out := &in.AlertDropLabels, &out.AlertDropLabels - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.GRPCServerTLSConfig != nil { - in, out := &in.GRPCServerTLSConfig, &out.GRPCServerTLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ThanosRulerSpec. -func (in *ThanosRulerSpec) DeepCopy() *ThanosRulerSpec { - if in == nil { - return nil - } - out := new(ThanosRulerSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ThanosRulerStatus) DeepCopyInto(out *ThanosRulerStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ThanosRulerStatus. -func (in *ThanosRulerStatus) DeepCopy() *ThanosRulerStatus { - if in == nil { - return nil - } - out := new(ThanosRulerStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ThanosSpec) DeepCopyInto(out *ThanosSpec) { - *out = *in - if in.Image != nil { - in, out := &in.Image, &out.Image - *out = new(string) - **out = **in - } - if in.Version != nil { - in, out := &in.Version, &out.Version - *out = new(string) - **out = **in - } - if in.Tag != nil { - in, out := &in.Tag, &out.Tag - *out = new(string) - **out = **in - } - if in.SHA != nil { - in, out := &in.SHA, &out.SHA - *out = new(string) - **out = **in - } - if in.BaseImage != nil { - in, out := &in.BaseImage, &out.BaseImage - *out = new(string) - **out = **in - } - in.Resources.DeepCopyInto(&out.Resources) - if in.ObjectStorageConfig != nil { - in, out := &in.ObjectStorageConfig, &out.ObjectStorageConfig - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.TracingConfig != nil { - in, out := &in.TracingConfig, &out.TracingConfig - *out = new(corev1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.GRPCServerTLSConfig != nil { - in, out := &in.GRPCServerTLSConfig, &out.GRPCServerTLSConfig - *out = new(TLSConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ThanosSpec. -func (in *ThanosSpec) DeepCopy() *ThanosSpec { - if in == nil { - return nil - } - out := new(ThanosSpec) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go index dc2b7e51..4bce5936 100644 --- a/vendor/github.com/evanphx/json-patch/patch.go +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -568,29 +568,6 @@ func (p Patch) replace(doc *container, op Operation) error { return errors.Wrapf(err, "replace operation failed to decode path") } - if path == "" { - val := op.value() - - if val.which == eRaw { - if !val.tryDoc() { - if !val.tryAry() { - return errors.Wrapf(err, "replace operation value must be object or array") - } - } - } - - switch val.which { - case eAry: - *doc = &val.ary - case eDoc: - *doc = &val.doc - case eRaw: - return errors.Wrapf(err, "replace operation hit impossible case") - } - - return nil - } - con, key := findObject(doc, path) if con == nil { @@ -657,25 +634,6 @@ func (p Patch) test(doc *container, op Operation) error { return errors.Wrapf(err, "test operation failed to decode path") } - if path == "" { - var self lazyNode - - switch sv := (*doc).(type) { - case *partialDoc: - self.doc = *sv - self.which = eDoc - case *partialArray: - self.ary = *sv - self.which = eAry - } - - if self.equal(op.value()) { - return nil - } - - return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) - } - con, key := findObject(doc, path) if con == nil { diff --git a/vendor/github.com/go-kit/kit/log/README.md b/vendor/github.com/go-kit/kit/log/README.md index a201a3d9..5492dd94 100644 --- a/vendor/github.com/go-kit/kit/log/README.md +++ b/vendor/github.com/go-kit/kit/log/README.md @@ -1,5 +1,14 @@ # package log +**Deprecation notice:** The core Go kit log packages (log, log/level, log/term, and +log/syslog) have been moved to their own repository at github.com/go-kit/log. +The corresponding packages in this directory remain for backwards compatibility. +Their types alias the types and their functions call the functions provided by +the new repository. Using either import path should be equivalent. Prefer the +new import path when practical. + +______ + `package log` provides a minimal interface for structured logging in services. It may be wrapped to encode conventions, enforce type-safety, provide leveled logging, and so on. It can be used for both typical application log events, diff --git a/vendor/github.com/go-kit/kit/log/doc.go b/vendor/github.com/go-kit/kit/log/doc.go index 918c0af4..c9873f4b 100644 --- a/vendor/github.com/go-kit/kit/log/doc.go +++ b/vendor/github.com/go-kit/kit/log/doc.go @@ -1,5 +1,7 @@ // Package log provides a structured logger. // +// Deprecated: Use github.com/go-kit/log instead. +// // Structured logging produces logs easily consumed later by humans or // machines. Humans might be interested in debugging errors, or tracing // specific requests. Machines might be interested in counting interesting @@ -39,8 +41,8 @@ // // A contextual logger stores keyvals that it includes in all log events. // Building appropriate contextual loggers reduces repetition and aids -// consistency in the resulting log output. With and WithPrefix add context to -// a logger. We can use With to improve the RunTask example. +// consistency in the resulting log output. With, WithPrefix, and WithSuffix +// add context to a logger. We can use With to improve the RunTask example. // // func RunTask(task Task, logger log.Logger) string { // logger = log.With(logger, "taskID", task.ID) diff --git a/vendor/github.com/go-kit/kit/log/json_logger.go b/vendor/github.com/go-kit/kit/log/json_logger.go index 66094b4d..edfde2f4 100644 --- a/vendor/github.com/go-kit/kit/log/json_logger.go +++ b/vendor/github.com/go-kit/kit/log/json_logger.go @@ -1,89 +1,15 @@ package log import ( - "encoding" - "encoding/json" - "fmt" "io" - "reflect" -) -type jsonLogger struct { - io.Writer -} + "github.com/go-kit/log" +) // NewJSONLogger returns a Logger that encodes keyvals to the Writer as a // single JSON object. Each log event produces no more than one call to // w.Write. The passed Writer must be safe for concurrent use by multiple // goroutines if the returned Logger will be used concurrently. func NewJSONLogger(w io.Writer) Logger { - return &jsonLogger{w} -} - -func (l *jsonLogger) Log(keyvals ...interface{}) error { - n := (len(keyvals) + 1) / 2 // +1 to handle case when len is odd - m := make(map[string]interface{}, n) - for i := 0; i < len(keyvals); i += 2 { - k := keyvals[i] - var v interface{} = ErrMissingValue - if i+1 < len(keyvals) { - v = keyvals[i+1] - } - merge(m, k, v) - } - return json.NewEncoder(l.Writer).Encode(m) -} - -func merge(dst map[string]interface{}, k, v interface{}) { - var key string - switch x := k.(type) { - case string: - key = x - case fmt.Stringer: - key = safeString(x) - default: - key = fmt.Sprint(x) - } - - // We want json.Marshaler and encoding.TextMarshaller to take priority over - // err.Error() and v.String(). But json.Marshall (called later) does that by - // default so we force a no-op if it's one of those 2 case. - switch x := v.(type) { - case json.Marshaler: - case encoding.TextMarshaler: - case error: - v = safeError(x) - case fmt.Stringer: - v = safeString(x) - } - - dst[key] = v -} - -func safeString(str fmt.Stringer) (s string) { - defer func() { - if panicVal := recover(); panicVal != nil { - if v := reflect.ValueOf(str); v.Kind() == reflect.Ptr && v.IsNil() { - s = "NULL" - } else { - panic(panicVal) - } - } - }() - s = str.String() - return -} - -func safeError(err error) (s interface{}) { - defer func() { - if panicVal := recover(); panicVal != nil { - if v := reflect.ValueOf(err); v.Kind() == reflect.Ptr && v.IsNil() { - s = nil - } else { - panic(panicVal) - } - } - }() - s = err.Error() - return + return log.NewJSONLogger(w) } diff --git a/vendor/github.com/go-kit/kit/log/log.go b/vendor/github.com/go-kit/kit/log/log.go index 66a9e2fd..164a4f94 100644 --- a/vendor/github.com/go-kit/kit/log/log.go +++ b/vendor/github.com/go-kit/kit/log/log.go @@ -1,135 +1,51 @@ package log -import "errors" +import ( + "github.com/go-kit/log" +) // Logger is the fundamental interface for all log operations. Log creates a // log event from keyvals, a variadic sequence of alternating keys and values. // Implementations must be safe for concurrent use by multiple goroutines. In // particular, any implementation of Logger that appends to keyvals or // modifies or retains any of its elements must make a copy first. -type Logger interface { - Log(keyvals ...interface{}) error -} +type Logger = log.Logger // ErrMissingValue is appended to keyvals slices with odd length to substitute // the missing value. -var ErrMissingValue = errors.New("(MISSING)") +var ErrMissingValue = log.ErrMissingValue // With returns a new contextual logger with keyvals prepended to those passed -// to calls to Log. If logger is also a contextual logger created by With or -// WithPrefix, keyvals is appended to the existing context. +// to calls to Log. If logger is also a contextual logger created by With, +// WithPrefix, or WithSuffix, keyvals is appended to the existing context. // // The returned Logger replaces all value elements (odd indexes) containing a // Valuer with their generated value for each call to its Log method. func With(logger Logger, keyvals ...interface{}) Logger { - if len(keyvals) == 0 { - return logger - } - l := newContext(logger) - kvs := append(l.keyvals, keyvals...) - if len(kvs)%2 != 0 { - kvs = append(kvs, ErrMissingValue) - } - return &context{ - logger: l.logger, - // Limiting the capacity of the stored keyvals ensures that a new - // backing array is created if the slice must grow in Log or With. - // Using the extra capacity without copying risks a data race that - // would violate the Logger interface contract. - keyvals: kvs[:len(kvs):len(kvs)], - hasValuer: l.hasValuer || containsValuer(keyvals), - } + return log.With(logger, keyvals...) } // WithPrefix returns a new contextual logger with keyvals prepended to those // passed to calls to Log. If logger is also a contextual logger created by -// With or WithPrefix, keyvals is prepended to the existing context. +// With, WithPrefix, or WithSuffix, keyvals is prepended to the existing context. // // The returned Logger replaces all value elements (odd indexes) containing a // Valuer with their generated value for each call to its Log method. func WithPrefix(logger Logger, keyvals ...interface{}) Logger { - if len(keyvals) == 0 { - return logger - } - l := newContext(logger) - // Limiting the capacity of the stored keyvals ensures that a new - // backing array is created if the slice must grow in Log or With. - // Using the extra capacity without copying risks a data race that - // would violate the Logger interface contract. - n := len(l.keyvals) + len(keyvals) - if len(keyvals)%2 != 0 { - n++ - } - kvs := make([]interface{}, 0, n) - kvs = append(kvs, keyvals...) - if len(kvs)%2 != 0 { - kvs = append(kvs, ErrMissingValue) - } - kvs = append(kvs, l.keyvals...) - return &context{ - logger: l.logger, - keyvals: kvs, - hasValuer: l.hasValuer || containsValuer(keyvals), - } + return log.WithPrefix(logger, keyvals...) } -// context is the Logger implementation returned by With and WithPrefix. It -// wraps a Logger and holds keyvals that it includes in all log events. Its -// Log method calls bindValues to generate values for each Valuer in the -// context keyvals. -// -// A context must always have the same number of stack frames between calls to -// its Log method and the eventual binding of Valuers to their value. This -// requirement comes from the functional requirement to allow a context to -// resolve application call site information for a Caller stored in the -// context. To do this we must be able to predict the number of logging -// functions on the stack when bindValues is called. -// -// Two implementation details provide the needed stack depth consistency. +// WithSuffix returns a new contextual logger with keyvals appended to those +// passed to calls to Log. If logger is also a contextual logger created by +// With, WithPrefix, or WithSuffix, keyvals is appended to the existing context. // -// 1. newContext avoids introducing an additional layer when asked to -// wrap another context. -// 2. With and WithPrefix avoid introducing an additional layer by -// returning a newly constructed context with a merged keyvals rather -// than simply wrapping the existing context. -type context struct { - logger Logger - keyvals []interface{} - hasValuer bool -} - -func newContext(logger Logger) *context { - if c, ok := logger.(*context); ok { - return c - } - return &context{logger: logger} -} - -// Log replaces all value elements (odd indexes) containing a Valuer in the -// stored context with their generated value, appends keyvals, and passes the -// result to the wrapped Logger. -func (l *context) Log(keyvals ...interface{}) error { - kvs := append(l.keyvals, keyvals...) - if len(kvs)%2 != 0 { - kvs = append(kvs, ErrMissingValue) - } - if l.hasValuer { - // If no keyvals were appended above then we must copy l.keyvals so - // that future log events will reevaluate the stored Valuers. - if len(keyvals) == 0 { - kvs = append([]interface{}{}, l.keyvals...) - } - bindValues(kvs[:len(l.keyvals)]) - } - return l.logger.Log(kvs...) +// The returned Logger replaces all value elements (odd indexes) containing a +// Valuer with their generated value for each call to its Log method. +func WithSuffix(logger Logger, keyvals ...interface{}) Logger { + return log.WithSuffix(logger, keyvals...) } // LoggerFunc is an adapter to allow use of ordinary functions as Loggers. If // f is a function with the appropriate signature, LoggerFunc(f) is a Logger // object that calls f. -type LoggerFunc func(...interface{}) error - -// Log implements Logger by calling f(keyvals...). -func (f LoggerFunc) Log(keyvals ...interface{}) error { - return f(keyvals...) -} +type LoggerFunc = log.LoggerFunc diff --git a/vendor/github.com/go-kit/kit/log/logfmt_logger.go b/vendor/github.com/go-kit/kit/log/logfmt_logger.go index a0030529..51cde2c5 100644 --- a/vendor/github.com/go-kit/kit/log/logfmt_logger.go +++ b/vendor/github.com/go-kit/kit/log/logfmt_logger.go @@ -1,62 +1,15 @@ package log import ( - "bytes" "io" - "sync" - "github.com/go-logfmt/logfmt" + "github.com/go-kit/log" ) -type logfmtEncoder struct { - *logfmt.Encoder - buf bytes.Buffer -} - -func (l *logfmtEncoder) Reset() { - l.Encoder.Reset() - l.buf.Reset() -} - -var logfmtEncoderPool = sync.Pool{ - New: func() interface{} { - var enc logfmtEncoder - enc.Encoder = logfmt.NewEncoder(&enc.buf) - return &enc - }, -} - -type logfmtLogger struct { - w io.Writer -} - // NewLogfmtLogger returns a logger that encodes keyvals to the Writer in // logfmt format. Each log event produces no more than one call to w.Write. // The passed Writer must be safe for concurrent use by multiple goroutines if // the returned Logger will be used concurrently. func NewLogfmtLogger(w io.Writer) Logger { - return &logfmtLogger{w} -} - -func (l logfmtLogger) Log(keyvals ...interface{}) error { - enc := logfmtEncoderPool.Get().(*logfmtEncoder) - enc.Reset() - defer logfmtEncoderPool.Put(enc) - - if err := enc.EncodeKeyvals(keyvals...); err != nil { - return err - } - - // Add newline to the end of the buffer - if err := enc.EndRecord(); err != nil { - return err - } - - // The Logger interface requires implementations to be safe for concurrent - // use by multiple goroutines. For this implementation that means making - // only one call to l.w.Write() for each call to Log. - if _, err := l.w.Write(enc.buf.Bytes()); err != nil { - return err - } - return nil + return log.NewLogfmtLogger(w) } diff --git a/vendor/github.com/go-kit/kit/log/nop_logger.go b/vendor/github.com/go-kit/kit/log/nop_logger.go index 1047d626..b02c6860 100644 --- a/vendor/github.com/go-kit/kit/log/nop_logger.go +++ b/vendor/github.com/go-kit/kit/log/nop_logger.go @@ -1,8 +1,8 @@ package log -type nopLogger struct{} +import "github.com/go-kit/log" // NewNopLogger returns a logger that doesn't do anything. -func NewNopLogger() Logger { return nopLogger{} } - -func (nopLogger) Log(...interface{}) error { return nil } +func NewNopLogger() Logger { + return log.NewNopLogger() +} diff --git a/vendor/github.com/go-kit/kit/log/stdlib.go b/vendor/github.com/go-kit/kit/log/stdlib.go index ff96b5de..cb604a7a 100644 --- a/vendor/github.com/go-kit/kit/log/stdlib.go +++ b/vendor/github.com/go-kit/kit/log/stdlib.go @@ -2,9 +2,8 @@ package log import ( "io" - "log" - "regexp" - "strings" + + "github.com/go-kit/log" ) // StdlibWriter implements io.Writer by invoking the stdlib log.Print. It's @@ -13,104 +12,43 @@ import ( // // If you have any choice in the matter, you shouldn't use this. Prefer to // redirect the stdlib log to the Go kit logger via NewStdlibAdapter. -type StdlibWriter struct{} - -// Write implements io.Writer. -func (w StdlibWriter) Write(p []byte) (int, error) { - log.Print(strings.TrimSpace(string(p))) - return len(p), nil -} +type StdlibWriter = log.StdlibWriter // StdlibAdapter wraps a Logger and allows it to be passed to the stdlib // logger's SetOutput. It will extract date/timestamps, filenames, and // messages, and place them under relevant keys. -type StdlibAdapter struct { - Logger - timestampKey string - fileKey string - messageKey string -} +type StdlibAdapter = log.StdlibAdapter // StdlibAdapterOption sets a parameter for the StdlibAdapter. -type StdlibAdapterOption func(*StdlibAdapter) +type StdlibAdapterOption = log.StdlibAdapterOption // TimestampKey sets the key for the timestamp field. By default, it's "ts". func TimestampKey(key string) StdlibAdapterOption { - return func(a *StdlibAdapter) { a.timestampKey = key } + return log.TimestampKey(key) } // FileKey sets the key for the file and line field. By default, it's "caller". func FileKey(key string) StdlibAdapterOption { - return func(a *StdlibAdapter) { a.fileKey = key } + return log.FileKey(key) } // MessageKey sets the key for the actual log message. By default, it's "msg". func MessageKey(key string) StdlibAdapterOption { - return func(a *StdlibAdapter) { a.messageKey = key } + return log.MessageKey(key) +} + +// Prefix configures the adapter to parse a prefix from stdlib log events. If +// you provide a non-empty prefix to the stdlib logger, then your should provide +// that same prefix to the adapter via this option. +// +// By default, the prefix isn't included in the msg key. Set joinPrefixToMsg to +// true if you want to include the parsed prefix in the msg. +func Prefix(prefix string, joinPrefixToMsg bool) StdlibAdapterOption { + return log.Prefix(prefix, joinPrefixToMsg) } // NewStdlibAdapter returns a new StdlibAdapter wrapper around the passed // logger. It's designed to be passed to log.SetOutput. func NewStdlibAdapter(logger Logger, options ...StdlibAdapterOption) io.Writer { - a := StdlibAdapter{ - Logger: logger, - timestampKey: "ts", - fileKey: "caller", - messageKey: "msg", - } - for _, option := range options { - option(&a) - } - return a -} - -func (a StdlibAdapter) Write(p []byte) (int, error) { - result := subexps(p) - keyvals := []interface{}{} - var timestamp string - if date, ok := result["date"]; ok && date != "" { - timestamp = date - } - if time, ok := result["time"]; ok && time != "" { - if timestamp != "" { - timestamp += " " - } - timestamp += time - } - if timestamp != "" { - keyvals = append(keyvals, a.timestampKey, timestamp) - } - if file, ok := result["file"]; ok && file != "" { - keyvals = append(keyvals, a.fileKey, file) - } - if msg, ok := result["msg"]; ok { - keyvals = append(keyvals, a.messageKey, msg) - } - if err := a.Logger.Log(keyvals...); err != nil { - return 0, err - } - return len(p), nil -} - -const ( - logRegexpDate = `(?P[0-9]{4}/[0-9]{2}/[0-9]{2})?[ ]?` - logRegexpTime = `(?P