From fb52f4720bd8377d48f129811fd09eb4f6189dce Mon Sep 17 00:00:00 2001 From: Felix Matouschek Date: Mon, 25 Mar 2024 14:02:24 +0100 Subject: [PATCH 1/2] chore: Bump dependencies Signed-off-by: Felix Matouschek --- Makefile | 2 +- go.mod | 139 +- go.sum | 2189 ++-- .../Microsoft/hcsshim/.golangci.yml | 7 + vendor/github.com/Microsoft/hcsshim/Makefile | 87 +- vendor/github.com/Microsoft/hcsshim/README.md | 84 +- .../hcsshim/computestorage/attach.go | 28 + .../hcsshim/computestorage/detach.go | 26 + .../hcsshim/computestorage/storage.go | 7 +- .../computestorage/zsyscall_windows.go | 60 + .../github.com/Microsoft/hcsshim/container.go | 2 +- vendor/github.com/Microsoft/hcsshim/errors.go | 11 +- .../Microsoft/hcsshim/internal/hcs/process.go | 2 +- .../hcsshim/internal/hcs/schema2/com_port.go | 2 +- .../schema2/container_memory_information.go | 2 +- .../hcs/schema2/guest_connection_info.go | 2 +- .../internal/hcs/schema2/hv_socket_2.go | 2 +- .../internal/hcs/schema2/hv_socket_address.go | 4 +- .../hcs/schema2/hv_socket_system_config.go | 2 +- .../hcsshim/internal/hcs/schema2/layer.go | 7 + .../internal/hcs/schema2/memory_stats.go | 2 +- .../hcs/schema2/pause_notification.go | 2 +- .../internal/hcs/schema2/pause_options.go | 2 +- .../internal/hcs/schema2/process_details.go | 2 +- .../internal/hcs/schema2/processor_stats.go | 2 +- .../internal/hcs/schema2/property_query.go | 2 +- .../internal/hcs/schema2/registry_hive.go | 13 + .../internal/hcs/schema2/registry_key.go | 2 +- .../internal/hcs/schema2/registry_value.go | 2 +- .../hcs/schema2/registry_value_type.go | 17 + .../internal/hcs/schema2/silo_properties.go | 2 +- .../internal/hcs/schema2/statistics.go | 2 +- .../internal/hcs/schema2/storage_stats.go | 2 +- .../Microsoft/hcsshim/internal/hcs/system.go | 8 +- .../hcsshim/internal/hns/hnsfuncs.go | 2 +- .../hcsshim/internal/hns/namespace.go | 4 +- .../hcsshim/internal/jobobject/iocp.go | 3 +- .../hcsshim/internal/jobobject/jobobject.go | 2 +- .../hcsshim/internal/jobobject/limits.go | 7 + .../Microsoft/hcsshim/internal/log/format.go | 1 + .../hcsshim/internal/logfields/fields.go | 1 + .../Microsoft/hcsshim/internal/memory/pool.go | 6 +- .../Microsoft/hcsshim/internal/oc/errors.go | 4 +- .../hcsshim/internal/safefile/safeopen.go | 2 +- .../hcsshim/internal/vmcompute/vmcompute.go | 16 +- .../internal/wclayer/baselayerreader.go | 6 +- .../internal/wclayer/converttobaselayer.go | 2 + .../internal/wclayer/expandscratchsize.go | 18 +- .../hcsshim/internal/wclayer/legacy.go | 8 +- .../hcsshim/internal/winapi/cimfs.go | 4 +- .../hcsshim/internal/winapi/utils.go | 7 +- .../internal/winapi/zsyscall_windows.go | 14 +- .../github.com/containerd/containerd/NOTICE | 16 - .../{containerd => errdefs}/LICENSE | 0 .../github.com/containerd/errdefs/README.md | 13 + .../{containerd => }/errdefs/errors.go | 0 .../{containerd => }/errdefs/grpc.go | 0 .../image/v5/directory/directory_dest.go | 2 +- .../image/v5/docker/daemon/client.go | 7 +- .../image/v5/docker/docker_client.go | 35 +- .../image/v5/docker/docker_image_dest.go | 29 +- .../image/v5/docker/internal/tarfile/dest.go | 2 +- .../image/v5/internal/blobinfocache/types.go | 2 +- .../internal/imagedestination/impl/helpers.go | 39 +- .../stubs/put_blob_partial.go | 3 +- .../v5/internal/imagedestination/wrapper.go | 2 +- .../image/v5/internal/imagesource/wrapper.go | 2 +- .../image/v5/internal/manifest/list.go | 2 + .../image/v5/internal/manifest/manifest.go | 29 +- .../image/v5/internal/manifest/oci_index.go | 28 +- .../internal/pkg/platform/platform_matcher.go | 30 +- .../image/v5/internal/private/private.go | 22 +- .../containers/image/v5/manifest/common.go | 2 +- .../image/v5/manifest/docker_schema1.go | 15 + .../containers/image/v5/manifest/manifest.go | 2 +- .../containers/image/v5/manifest/oci.go | 2 +- .../image/v5/oci/archive/oci_dest.go | 13 +- .../image/v5/oci/layout/oci_dest.go | 2 +- .../image/v5/openshift/openshift_dest.go | 5 +- .../containers/image/v5/ostree/ostree_dest.go | 2 +- .../image/v5/pkg/compression/compression.go | 12 +- .../v5/pkg/compression/internal/types.go | 36 +- .../image/v5/storage/storage_dest.go | 617 +- .../image/v5/storage/storage_image.go | 16 +- .../image/v5/storage/storage_src.go | 114 +- .../image/v5/storage/storage_transport.go | 2 +- .../containers/image/v5/types/types.go | 4 +- .../containers/image/v5/version/version.go | 4 +- .../containers/libtrust/ec_key_no_openssl.go | 1 - .../containers/libtrust/ec_key_openssl.go | 1 - .../github.com/containers/storage/.cirrus.yml | 8 +- vendor/github.com/containers/storage/Makefile | 2 +- vendor/github.com/containers/storage/VERSION | 2 +- .../containers/storage/drivers/driver.go | 31 +- .../{composefs_supported.go => composefs.go} | 81 +- .../drivers/overlay/composefs_notsupported.go | 24 - .../storage/drivers/overlay/overlay.go | 301 +- .../storage/drivers/overlay/overlay_nocgo.go | 13 + .../storage/drivers/quota/projectquota.go | 448 - .../drivers/quota/projectquota_supported.go | 449 + .../containers/storage/drivers/vfs/driver.go | 56 +- .../github.com/containers/storage/layers.go | 241 +- .../containers/storage/pkg/archive/archive.go | 41 +- .../storage/pkg/archive/archive_unix.go | 25 + .../storage/pkg/chunked/cache_linux.go | 42 +- .../storage/pkg/chunked/compression_linux.go | 4 +- .../pkg/chunked/compressor/compressor.go | 16 +- .../storage/pkg/chunked/dump/dump.go | 24 +- .../storage/pkg/chunked/storage_linux.go | 403 +- .../pkg/chunked/storage_unsupported.go | 3 +- .../containers/storage/pkg/config/config.go | 9 + .../storage/pkg/fsverity/fsverity_linux.go | 45 + .../pkg/fsverity/fsverity_unsupported.go | 21 + .../containers/storage/pkg/homedir/homedir.go | 15 - .../storage/pkg/homedir/homedir_others.go | 21 +- .../storage/pkg/homedir/homedir_unix.go | 113 +- .../storage/pkg/homedir/homedir_windows.go | 29 + .../storage/pkg/idtools/idtools_unix.go | 2 +- .../pkg/unshare/unshare_unsupported.go | 2 +- .../containers/storage/storage.conf | 12 +- .../containers/storage/storage.conf-freebsd | 3 + vendor/github.com/containers/storage/store.go | 207 +- .../containers/storage/types/options.go | 86 +- .../containers/storage/types/utils.go | 151 +- .../github.com/containers/storage/userns.go | 4 +- vendor/github.com/containers/storage/utils.go | 14 +- .../coreos/prometheus-operator/NOTICE | 5 - .../pkg/apis/monitoring/v1/bindata.go | 365 - .../pkg/apis/monitoring/v1/crd_kinds.go | 91 - .../pkg/apis/monitoring/v1/types.go | 1142 --- .../monitoring/v1/zz_generated.deepcopy.go | 1620 --- .../github.com/davecgh/go-spew/spew/bypass.go | 1 - .../davecgh/go-spew/spew/bypasssafe.go | 1 - .../github.com/davecgh/go-spew/spew/config.go | 30 +- vendor/github.com/davecgh/go-spew/spew/doc.go | 146 +- .../github.com/davecgh/go-spew/spew/dump.go | 18 +- vendor/github.com/docker/cli/AUTHORS | 46 +- .../docker/cli/cli/config/config.go | 92 +- .../cli/cli/config/configfile/file_unix.go | 1 - .../cli/config/credentials/default_store.go | 23 +- .../credentials/default_store_unsupported.go | 1 - .../cli/config/credentials/native_store.go | 4 + .../reference/helpers_deprecated.go | 34 - .../reference/normalize_deprecated.go | 92 - .../reference/reference_deprecated.go | 172 - .../reference/regexp_deprecated.go | 50 - .../distribution/reference/sort_deprecated.go | 10 - .../client/client.go | 17 +- .../credentials/error.go | 11 +- vendor/github.com/docker/docker/AUTHORS | 49 +- vendor/github.com/docker/docker/api/README.md | 2 +- vendor/github.com/docker/docker/api/common.go | 13 +- .../docker/docker/api/common_unix.go | 7 - .../docker/docker/api/common_windows.go | 8 - .../github.com/docker/docker/api/swagger.yaml | 373 +- .../docker/docker/api/types/auth.go | 7 - .../docker/api/types/checkpoint/list.go | 7 + .../docker/api/types/checkpoint/options.go | 19 + .../docker/docker/api/types/client.go | 138 - .../docker/docker/api/types/configs.go | 49 - .../container/change_response_deprecated.go | 6 - .../docker/api/types/container/config.go | 36 +- .../docker/api/types/container/errors.go | 9 + .../docker/api/types/container/hostconfig.go | 52 +- .../api/types/container/hostconfig_unix.go | 15 +- .../api/types/container/hostconfig_windows.go | 10 +- .../docker/api/types/container/options.go | 67 + .../docker/docker/api/types/events/events.go | 84 +- .../delete_response.go} | 8 +- .../docker/docker/api/types/image/image.go | 9 + .../docker/docker/api/types/image/opts.go | 58 +- .../{image_summary.go => image/summary.go} | 15 +- .../docker/docker/api/types/mount/mount.go | 8 +- .../docker/api/types/network/endpoint.go | 147 + .../docker/docker/api/types/network/ipam.go | 134 + .../docker/api/types/network/network.go | 82 +- .../docker/api/types/registry/registry.go | 4 +- .../docker/api/types/swarm/container.go | 43 +- .../docker/api/types/swarm/runtime/gen.go | 2 +- .../api/types/swarm/runtime/plugin.pb.go | 402 +- .../api/types/swarm/runtime/plugin.proto | 2 - .../docker/docker/api/types/swarm/service.go | 6 +- .../types/swarm/service_create_response.go | 20 + .../{ => swarm}/service_update_response.go | 2 +- .../docker/docker/api/types/system/info.go | 116 + .../docker/docker/api/types/system/runtime.go | 20 + .../docker/api/types/system/security_opts.go | 48 + .../docker/docker/api/types/types.go | 247 +- .../docker/api/types/types_deprecated.go | 35 + .../docker/api/types/versions/README.md | 14 - .../docker/api/types/volume/cluster_volume.go | 10 +- .../github.com/docker/docker/client/README.md | 19 +- .../docker/docker/client/build_prune.go | 2 +- .../docker/docker/client/checkpoint_create.go | 4 +- .../docker/docker/client/checkpoint_delete.go | 4 +- .../docker/docker/client/checkpoint_list.go | 6 +- .../github.com/docker/docker/client/client.go | 179 +- .../docker/docker/client/client_unix.go | 1 - .../docker/docker/client/config_create.go | 2 +- .../docker/docker/client/config_inspect.go | 2 +- .../docker/docker/client/config_list.go | 2 +- .../docker/docker/client/config_remove.go | 2 +- .../docker/docker/client/config_update.go | 2 +- .../docker/docker/client/container_attach.go | 9 +- .../docker/docker/client/container_commit.go | 5 +- .../docker/docker/client/container_create.go | 37 +- .../docker/docker/client/container_exec.go | 17 +- .../docker/docker/client/container_list.go | 4 +- .../docker/docker/client/container_logs.go | 4 +- .../docker/docker/client/container_prune.go | 2 +- .../docker/docker/client/container_remove.go | 4 +- .../docker/docker/client/container_resize.go | 6 +- .../docker/docker/client/container_restart.go | 14 +- .../docker/docker/client/container_start.go | 4 +- .../docker/docker/client/container_stats.go | 12 +- .../docker/docker/client/container_stop.go | 14 +- .../docker/docker/client/container_wait.go | 23 +- .../docker/client/distribution_inspect.go | 15 +- .../github.com/docker/docker/client/errors.go | 53 +- .../github.com/docker/docker/client/hijack.go | 73 +- .../docker/docker/client/image_build.go | 16 +- .../docker/docker/client/image_create.go | 12 +- .../docker/docker/client/image_import.go | 5 +- .../docker/docker/client/image_list.go | 16 +- .../docker/docker/client/image_load.go | 6 +- .../docker/docker/client/image_prune.go | 2 +- .../docker/docker/client/image_pull.go | 6 +- .../docker/docker/client/image_push.go | 12 +- .../docker/docker/client/image_remove.go | 6 +- .../docker/docker/client/image_search.go | 6 +- .../docker/docker/client/image_tag.go | 2 +- .../github.com/docker/docker/client/info.go | 6 +- .../docker/docker/client/interface.go | 39 +- .../docker/client/interface_experimental.go | 8 +- .../docker/docker/client/network_create.go | 17 +- .../docker/docker/client/network_prune.go | 2 +- .../docker/docker/client/node_list.go | 1 - .../docker/docker/client/options.go | 105 +- .../github.com/docker/docker/client/ping.go | 17 +- .../docker/docker/client/plugin_install.go | 13 +- .../docker/docker/client/plugin_push.go | 6 +- .../docker/docker/client/plugin_upgrade.go | 10 +- .../docker/docker/client/request.go | 99 +- .../docker/docker/client/secret_create.go | 2 +- .../docker/docker/client/secret_inspect.go | 2 +- .../docker/docker/client/secret_list.go | 2 +- .../docker/docker/client/secret_remove.go | 2 +- .../docker/docker/client/secret_update.go | 2 +- .../docker/docker/client/service_create.go | 32 +- .../docker/docker/client/service_logs.go | 4 +- .../docker/docker/client/service_update.go | 33 +- .../docker/docker/client/task_logs.go | 4 +- .../docker/docker/client/transport.go | 17 - .../docker/docker/client/volume_prune.go | 2 +- .../docker/docker/client/volume_remove.go | 12 +- .../docker/docker/client/volume_update.go | 2 +- .../github.com/docker/docker/errdefs/defs.go | 2 +- .../docker/docker/errdefs/helpers.go | 2 +- .../docker/docker/errdefs/http_helpers.go | 2 +- vendor/github.com/docker/docker/errdefs/is.go | 18 +- .../docker/internal/multierror/multierror.go | 46 + .../homedir/{homedir_unix.go => homedir.go} | 25 +- .../docker/pkg/homedir/homedir_others.go | 1 - .../docker/pkg/homedir/homedir_windows.go | 24 - .../docker/go-connections/nat/nat.go | 40 +- .../docker/go-connections/nat/parse.go | 28 +- .../docker/go-connections/nat/sort.go | 4 +- .../docker/go-connections/sockets/proxy.go | 39 +- .../docker/go-connections/sockets/sockets.go | 23 +- .../go-connections/sockets/sockets_unix.go | 11 +- .../go-connections/sockets/sockets_windows.go | 5 +- .../go-connections/sockets/unix_socket.go | 117 +- .../{certpool_go17.go => certpool.go} | 3 - .../tlsconfig/certpool_other.go | 14 - .../docker/go-connections/tlsconfig/config.go | 84 +- .../tlsconfig/config_client_ciphers.go | 3 - .../tlsconfig/config_legacy_client_ciphers.go | 15 - .../emicklei/go-restful/v3/CHANGES.md | 23 +- .../emicklei/go-restful/v3/README.md | 7 +- .../emicklei/go-restful/v3/compress.go | 10 + .../emicklei/go-restful/v3/curly.go | 2 +- .../github.com/emicklei/go-restful/v3/doc.go | 42 +- .../go-restful/v3/entity_accessors.go | 7 + .../github.com/emicklei/go-restful/v3/json.go | 12 - .../emicklei/go-restful/v3/jsoniter.go | 13 - .../emicklei/go-restful/v3/jsr311.go | 2 +- .../emicklei/go-restful/v3/response.go | 5 +- .../emicklei/go-restful/v3/route.go | 17 +- .../emicklei/go-restful/v3/route_builder.go | 45 +- .../emicklei/go-restful/v3/web_service.go | 28 +- .../github.com/felixge/httpsnoop/.gitignore | 0 .../github.com/felixge/httpsnoop/LICENSE.txt | 19 + vendor/github.com/felixge/httpsnoop/Makefile | 10 + vendor/github.com/felixge/httpsnoop/README.md | 95 + .../felixge/httpsnoop/capture_metrics.go | 86 + vendor/github.com/felixge/httpsnoop/docs.go | 10 + .../httpsnoop/wrap_generated_gteq_1.8.go | 436 + .../httpsnoop/wrap_generated_lt_1.8.go | 278 + vendor/github.com/go-kit/kit/log/README.md | 9 + vendor/github.com/go-kit/kit/log/doc.go | 68 +- .../github.com/go-kit/kit/log/json_logger.go | 82 +- 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 | 95 +- 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/CHANGELOG.md | 46 +- vendor/github.com/go-logfmt/logfmt/README.md | 30 +- vendor/github.com/go-logfmt/logfmt/decode.go | 17 + vendor/github.com/go-logr/logr/README.md | 73 +- vendor/github.com/go-logr/logr/context.go | 33 + .../github.com/go-logr/logr/context_noslog.go | 49 + .../github.com/go-logr/logr/context_slog.go | 83 + vendor/github.com/go-logr/logr/funcr/funcr.go | 185 +- .../github.com/go-logr/logr/funcr/slogsink.go | 105 + vendor/github.com/go-logr/logr/logr.go | 43 - .../go-logr/logr/{slogr => }/sloghandler.go | 87 +- .../go-logr/logr/{slogr => }/slogr.go | 48 +- .../go-logr/logr/{slogr => }/slogsink.go | 24 +- .../runc => go-logr/stdr}/LICENSE | 14 +- vendor/github.com/go-logr/stdr/README.md | 6 + vendor/github.com/go-logr/stdr/stdr.go | 170 + .../go-openapi/jsonpointer/.golangci.yml | 61 + .../go-openapi/jsonpointer/README.md | 8 +- .../go-openapi/jsonpointer/pointer.go | 191 +- .../go-openapi/jsonreference/.golangci.yml | 57 +- .../go-openapi/jsonreference/README.md | 14 +- vendor/github.com/go-openapi/swag/.gitignore | 1 + .../github.com/go-openapi/swag/.golangci.yml | 54 +- .../github.com/go-openapi/swag/BENCHMARK.md | 52 + vendor/github.com/go-openapi/swag/README.md | 8 +- .../go-openapi/swag/initialism_index.go | 202 + vendor/github.com/go-openapi/swag/loading.go | 105 +- .../github.com/go-openapi/swag/name_lexem.go | 70 +- .../github.com/go-openapi/swag/post_go19.go | 68 - vendor/github.com/go-openapi/swag/pre_go19.go | 70 - vendor/github.com/go-openapi/swag/split.go | 470 +- .../go-openapi/swag/string_bytes.go | 8 + vendor/github.com/go-openapi/swag/util.go | 210 +- vendor/github.com/go-openapi/swag/yaml.go | 39 +- vendor/github.com/go-task/slim-sprig/dict.go | 2 +- .../go-task/slim-sprig/functions.go | 3 +- vendor/github.com/gogo/protobuf/proto/lib.go | 36 +- .../gogo/protobuf/proto/pointer_reflect.go | 1 - .../protobuf/proto/pointer_reflect_gogo.go | 1 - .../gogo/protobuf/proto/pointer_unsafe.go | 1 - .../protobuf/proto/pointer_unsafe_gogo.go | 1 - .../gogo/protobuf/proto/table_unmarshal.go | 14 +- vendor/github.com/golang/glog/glog.go | 226 +- vendor/github.com/golang/glog/glog_file.go | 16 +- .../github.com/golang/glog/glog_file_linux.go | 39 + .../github.com/golang/glog/glog_file_other.go | 30 + .../github.com/golang/glog/glog_file_posix.go | 53 + vendor/github.com/golang/glog/glog_flags.go | 9 +- .../golang/glog/internal/logsink/logsink.go | 6 + .../golang/mock/gomock/controller.go | 77 +- .../github.com/golang/mock/gomock/matchers.go | 35 +- .../github.com/golang/protobuf/ptypes/any.go | 180 - .../golang/protobuf/ptypes/any/any.pb.go | 62 - .../github.com/golang/protobuf/ptypes/doc.go | 10 - .../golang/protobuf/ptypes/duration.go | 76 - .../protobuf/ptypes/duration/duration.pb.go | 63 - .../golang/protobuf/ptypes/timestamp.go | 112 - .../protobuf/ptypes/timestamp/timestamp.pb.go | 64 - .../github.com/google/gnostic-models/LICENSE | 203 + .../google/gnostic-models/compiler/README.md | 4 + .../google/gnostic-models/compiler/context.go | 49 + .../google/gnostic-models/compiler/error.go | 70 + .../gnostic-models/compiler/extensions.go | 86 + .../google/gnostic-models/compiler/helpers.go | 397 + .../gnostic-models/compiler/main.go} | 14 +- .../google/gnostic-models/compiler/reader.go | 307 + .../extensions/README.md | 0 .../extensions/extension.pb.go | 4 +- .../extensions/extension.proto | 0 .../extensions/extensions.go | 6 +- .../jsonschema/README.md | 0 .../jsonschema/base.go | 21 +- .../jsonschema/display.go | 0 .../jsonschema/models.go | 0 .../jsonschema/operations.go | 0 .../jsonschema/reader.go | 0 .../jsonschema/schema.json | 0 .../jsonschema/writer.go | 0 .../gnostic-models/openapiv2/OpenAPIv2.go | 8820 +++++++++++++++++ .../openapiv2/OpenAPIv2.pb.go | 4 +- .../gnostic-models/openapiv2/OpenAPIv2.proto | 666 ++ .../google/gnostic-models/openapiv2/README.md | 14 + .../gnostic-models/openapiv2/document.go | 42 + .../gnostic-models/openapiv2/openapi-2.0.json | 1610 +++ .../openapiv3/OpenAPIv3.go | 2 +- .../openapiv3/OpenAPIv3.pb.go | 4 +- .../openapiv3/OpenAPIv3.proto | 0 .../openapiv3/README.md | 0 .../openapiv3/annotations.pb.go | 182 + .../openapiv3/annotations.proto | 56 + .../openapiv3/document.go | 2 +- .../google/gnostic/compiler/context.go | 29 +- .../google/gnostic/compiler/error.go | 53 +- .../google/gnostic/compiler/extensions.go | 67 +- .../google/gnostic/compiler/helpers.go | 350 +- .../google/gnostic/compiler/reader.go | 276 +- .../google/gnostic/openapiv2/OpenAPIv2.go | 3354 ------- .../gnostic/openapiv2/OpenAPIv2.pbalias.go | 102 + .../google/gnostic/openapiv2/document.go | 18 +- .../google/gnostic/openapiv3/openapi-3.0.json | 1251 --- .../google/gnostic/openapiv3/openapi-3.1.json | 1250 --- .../google/go-cmp/cmp/report_references.go | 4 +- .../pkg/v1/tarball/image.go | 33 +- vendor/github.com/google/gofuzz/fuzz.go | 13 +- .../google/pprof/profile/legacy_profile.go | 30 +- vendor/github.com/google/uuid/CHANGELOG.md | 31 + vendor/github.com/google/uuid/CONTRIBUTING.md | 2 +- vendor/github.com/google/uuid/dce.go | 4 +- vendor/github.com/google/uuid/hash.go | 10 +- vendor/github.com/google/uuid/node_js.go | 1 - vendor/github.com/google/uuid/node_net.go | 1 - vendor/github.com/google/uuid/null.go | 17 +- vendor/github.com/google/uuid/time.go | 21 +- vendor/github.com/google/uuid/uuid.go | 79 +- vendor/github.com/google/uuid/version4.go | 14 +- vendor/github.com/google/uuid/version6.go | 56 + vendor/github.com/google/uuid/version7.go | 104 + vendor/github.com/gorilla/mux/.editorconfig | 20 + vendor/github.com/gorilla/mux/.gitignore | 1 + vendor/github.com/gorilla/mux/AUTHORS | 8 - vendor/github.com/gorilla/mux/LICENSE | 2 +- vendor/github.com/gorilla/mux/Makefile | 34 + vendor/github.com/gorilla/mux/README.md | 61 +- vendor/github.com/gorilla/mux/mux.go | 2 + vendor/github.com/gorilla/mux/regexp.go | 10 +- vendor/github.com/gorilla/mux/route.go | 45 +- .../gorilla/websocket/.editorconfig | 20 + .../github.com/gorilla/websocket/.gitignore | 26 +- .../gorilla/websocket/.golangci.yml | 3 + vendor/github.com/gorilla/websocket/AUTHORS | 9 - vendor/github.com/gorilla/websocket/LICENSE | 39 +- vendor/github.com/gorilla/websocket/Makefile | 34 + vendor/github.com/gorilla/websocket/README.md | 19 +- vendor/github.com/gorilla/websocket/client.go | 44 +- .../gorilla/websocket/compression.go | 9 +- vendor/github.com/gorilla/websocket/conn.go | 83 +- vendor/github.com/gorilla/websocket/doc.go | 118 +- vendor/github.com/gorilla/websocket/mask.go | 4 + vendor/github.com/gorilla/websocket/proxy.go | 17 +- vendor/github.com/gorilla/websocket/server.go | 42 +- .../gorilla/websocket/tls_handshake.go | 3 - .../gorilla/websocket/tls_handshake_116.go | 21 - vendor/github.com/gorilla/websocket/util.go | 19 +- .../gorilla/websocket/x_net_proxy.go | 473 - vendor/github.com/imdario/mergo/README.md | 20 +- vendor/github.com/imdario/mergo/doc.go | 27 +- .../github.com/json-iterator/go/iter_float.go | 2 +- .../json-iterator/go/iter_skip_sloppy.go | 3 +- .../json-iterator/go/iter_skip_strict.go | 3 +- .../NOTICE | 1 + .../pkg/apis/k8s.cni.cncf.io/v1/types.go | 106 +- .../v1/zz_generated.deepcopy.go | 104 +- .../klauspost/compress/.goreleaser.yml | 4 - .../github.com/klauspost/compress/README.md | 26 +- .../klauspost/compress/flate/deflate.go | 2 +- .../klauspost/compress/huff0/bytereader.go | 44 - .../klauspost/compress/huff0/compress.go | 5 +- .../klauspost/compress/huff0/huff0.go | 4 +- vendor/github.com/klauspost/compress/s2sx.mod | 2 +- .../klauspost/compress/zstd/README.md | 2 +- .../klauspost/compress/zstd/decodeheader.go | 56 +- .../klauspost/compress/zstd/enc_best.go | 37 +- .../compress/zstd/encoder_options.go | 6 +- .../klauspost/compress/zstd/frameenc.go | 2 +- .../compress/zstd/fse_decoder_generic.go | 11 +- .../klauspost/compress/zstd/seqdec_amd64.s | 136 +- .../client/v4/apis/volumesnapshot/v1/types.go | 20 +- .../v1/zz_generated.deepcopy.go | 1 - .../mailru/easyjson/jlexer/bytestostr.go | 4 +- .../easyjson/jlexer/bytestostr_nounsafe.go | 3 +- .../mattn/go-shellwords/util_posix.go | 1 - .../mattn/go-shellwords/util_windows.go | 1 - .../github.com/moby/docker-image-spec/LICENSE | 201 + .../docker-image-spec/specs-go/v1/image.go | 54 + vendor/github.com/moby/sys/user/LICENSE | 202 + .../sys}/user/lookup_unix.go | 0 .../libcontainer => moby/sys}/user/user.go | 0 .../sys}/user/user_fuzzer.go | 0 .../modern-go/concurrent/go_above_19.go | 3 +- .../modern-go/concurrent/go_below_19.go | 3 +- vendor/github.com/modern-go/concurrent/log.go | 6 +- .../concurrent/unbounded_executor.go | 2 +- .../modern-go/reflect2/go_above_118.go | 6 +- .../modern-go/reflect2/go_above_19.go | 3 +- .../modern-go/reflect2/go_below_118.go | 6 +- .../github.com/modern-go/reflect2/reflect2.go | 1 - .../github.com/modern-go/reflect2/type_map.go | 2 - .../modern-go/reflect2/unsafe_link.go | 1 - vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md | 35 + vendor/github.com/onsi/ginkgo/v2/core_dsl.go | 17 +- .../ginkgo/v2/formatter/colorable_others.go | 1 - .../ginkgo/v2/formatter/colorable_windows.go | 32 +- .../ginkgo/v2/ginkgo/internal/gocovmerge.go | 129 + .../ginkgo/internal/profiles_and_reports.go | 42 +- .../onsi/ginkgo/v2/internal/node.go | 33 +- .../v2/internal/output_interceptor_win.go | 1 - .../internal/parallel_support/rpc_server.go | 8 +- .../onsi/ginkgo/v2/internal/suite.go | 14 +- .../ginkgo/v2/reporters/default_reporter.go | 47 +- .../onsi/ginkgo/v2/reporting_dsl.go | 59 +- .../github.com/onsi/ginkgo/v2/types/config.go | 5 +- .../github.com/onsi/ginkgo/v2/types/flags.go | 13 +- .../onsi/ginkgo/v2/types/version.go | 2 +- vendor/github.com/onsi/gomega/CHANGELOG.md | 13 + vendor/github.com/onsi/gomega/gomega_dsl.go | 2 +- .../opencontainers/go-digest/digest.go | 2 +- .../opencontainers/go-digest/digestset/set.go | 262 - .../opencontainers/go-digest/doc.go | 11 +- .../image-spec/specs-go/v1/mediatype.go | 26 +- .../image-spec/specs-go/version.go | 2 +- vendor/github.com/opencontainers/runc/NOTICE | 17 - .../runtime-spec/specs-go/config.go | 10 + .../runtime-spec/specs-go/version.go | 2 +- ...rsion-operator_01_clusteroperator.crd.yaml | 137 - ...ersion-operator_01_clusterversion.crd.yaml | 435 - .../0000_03_config-operator_01_proxy.crd.yaml | 78 - ...rketplace-operator_01_operatorhub.crd.yaml | 84 - ...fig-operator_01_apiserver-Default.crd.yaml | 179 - ...01_apiserver-TechPreviewNoUpgrade.crd.yaml | 179 - ...config-operator_01_authentication.crd.yaml | 101 - .../0000_10_config-operator_01_build.crd.yaml | 290 - ...000_10_config-operator_01_console.crd.yaml | 57 - .../0000_10_config-operator_01_dns.crd.yaml | 72 - ...10_config-operator_01_featuregate.crd.yaml | 153 - .../0000_10_config-operator_01_image.crd.yaml | 108 - ...ig-operator_01_imagecontentpolicy.crd.yaml | 68 - ...-operator_01_imagedigestmirrorset.crd.yaml | 74 - ...fig-operator_01_imagetagmirrorset.crd.yaml | 74 - ...perator_01_infrastructure-Default.crd.yaml | 834 -- ...r_01_infrastructure-Default.crd.yaml-patch | 24 - ...frastructure-TechPreviewNoUpgrade.crd.yaml | 905 -- ...ucture-TechPreviewNoUpgrade.crd.yaml-patch | 24 - ...000_10_config-operator_01_ingress.crd.yaml | 334 - ...000_10_config-operator_01_network.crd.yaml | 163 - .../0000_10_config-operator_01_node.crd.yaml | 59 - .../0000_10_config-operator_01_oauth.crd.yaml | 444 - ...000_10_config-operator_01_project.crd.yaml | 55 - ...0_10_config-operator_01_scheduler.crd.yaml | 68 - ...ustom.authentication.single.testsuite.yaml | 284 + .../v1/custom.authentication.testsuite.yaml | 284 + .../v1/custom.clusterversion.testsuite.yaml | 472 + .../v1/custom.infrastructure.testsuite.yaml | 321 + .../config/v1/custom.scheduler.testsuite.yaml | 14 + .../github.com/openshift/api/config/v1/doc.go | 1 + .../openshift/api/config/v1/feature_gates.go | 646 +- .../config/v1/stable.apiserver.testsuite.yaml | 2 +- ...table.authentication.single.testsuite.yaml | 21 + .../v1/stable.authentication.testsuite.yaml | 9 +- .../api/config/v1/stable.build.testsuite.yaml | 2 +- .../v1/stable.clusteroperator.testsuite.yaml | 2 +- .../v1/stable.clusterversion.testsuite.yaml | 282 +- .../config/v1/stable.console.testsuite.yaml | 2 +- .../api/config/v1/stable.dns.testsuite.yaml | 93 +- .../v1/stable.featuregate.testsuite.yaml | 2 +- ...e.hypershift.authentication.testsuite.yaml | 298 + .../api/config/v1/stable.image.testsuite.yaml | 2 +- .../stable.imagecontentpolicy.testsuite.yaml | 2 +- ...stable.imagedigestmirrorset.testsuite.yaml | 2 +- .../stable.imagetagmirrorset.testsuite.yaml | 2 +- .../v1/stable.infrastructure.testsuite.yaml | 905 +- .../config/v1/stable.ingress.testsuite.yaml | 2 +- .../config/v1/stable.network.testsuite.yaml | 25 +- .../api/config/v1/stable.node.testsuite.yaml | 2 +- .../api/config/v1/stable.oauth.testsuite.yaml | 2 +- .../v1/stable.operatorhub.testsuite.yaml | 2 +- .../config/v1/stable.project.testsuite.yaml | 2 +- .../api/config/v1/stable.proxy.testsuite.yaml | 2 +- .../config/v1/stable.scheduler.testsuite.yaml | 2 +- .../v1/techpreview.apiserver.testsuite.yaml | 35 - ...eview.authentication.single.testsuite.yaml | 298 + .../techpreview.authentication.testsuite.yaml | 298 + .../techpreview.clusterversion.testsuite.yaml | 472 + .../techpreview.infrastructure.testsuite.yaml | 535 +- .../v1/techpreview.scheduler.testsuite.yaml | 14 + .../openshift/api/config/v1/types.go | 30 + .../api/config/v1/types_apiserver.go | 7 +- .../api/config/v1/types_authentication.go | 331 +- .../openshift/api/config/v1/types_build.go | 6 + .../api/config/v1/types_cluster_operator.go | 12 + .../api/config/v1/types_cluster_version.go | 231 +- .../openshift/api/config/v1/types_console.go | 5 + .../openshift/api/config/v1/types_dns.go | 42 + .../openshift/api/config/v1/types_feature.go | 148 +- .../openshift/api/config/v1/types_image.go | 9 +- .../config/v1/types_image_content_policy.go | 5 + .../v1/types_image_digest_mirror_set.go | 5 + .../config/v1/types_image_tag_mirror_set.go | 5 + .../api/config/v1/types_infrastructure.go | 549 +- .../openshift/api/config/v1/types_ingress.go | 5 + .../openshift/api/config/v1/types_network.go | 16 + .../openshift/api/config/v1/types_node.go | 3 + .../openshift/api/config/v1/types_oauth.go | 5 + .../api/config/v1/types_operatorhub.go | 5 + .../openshift/api/config/v1/types_project.go | 5 + .../openshift/api/config/v1/types_proxy.go | 5 + .../api/config/v1/types_scheduling.go | 33 + .../api/config/v1/types_tlssecurityprofile.go | 61 +- .../api/config/v1/zz_generated.deepcopy.go | 613 +- ..._generated.featuregated-crd-manifests.yaml | 491 + .../v1/zz_generated.swagger_doc_generated.go | 319 +- .../api/route/v1/custom.route.testsuite.yaml | 103 + .../openshift/api/route/v1/generated.pb.go | 1671 +++- .../openshift/api/route/v1/generated.proto | 182 +- .../openshift/api/route/v1/route.crd.yaml | 298 - .../api/route/v1/route.crd.yaml-patch | 86 - .../api/route/v1/stable.route.testsuite.yaml | 655 +- .../route/v1/techpreview.route.testsuite.yaml | 103 + .../openshift/api/route/v1/types.go | 201 +- .../api/route/v1/zz_generated.deepcopy.go | 129 +- ..._generated.featuregated-crd-manifests.yaml | 34 + .../v1/zz_generated.swagger_doc_generated.go | 65 +- ...0000_03_security-openshift_01_scc.crd.yaml | 279 - .../openshift/api/security/v1/consts.go | 3 + .../openshift/api/security/v1/generated.proto | 22 +- ....securitycontextconstraints.testsuite.yaml | 2 +- .../openshift/api/security/v1/types.go | 22 +- ..._generated.featuregated-crd-manifests.yaml | 58 + .../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 + .../versioned/typed/route/v1/route.go | 61 + .../versioned/typed/route/v1/route_client.go | 20 +- .../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 + .../typed/security/v1/rangeallocation.go | 29 + .../typed/security/v1/security_client.go | 20 +- .../security/v1/securitycontextconstraints.go | 29 + .../conditions/v1/zz_generated.deepcopy.go | 1 - vendor/github.com/pborman/uuid/.travis.yml | 10 - .../github.com/pborman/uuid/CONTRIBUTING.md | 10 - vendor/github.com/pborman/uuid/CONTRIBUTORS | 1 - vendor/github.com/pborman/uuid/LICENSE | 27 - vendor/github.com/pborman/uuid/README.md | 15 - vendor/github.com/pborman/uuid/dce.go | 84 - vendor/github.com/pborman/uuid/doc.go | 13 - vendor/github.com/pborman/uuid/hash.go | 53 - vendor/github.com/pborman/uuid/marshal.go | 85 - vendor/github.com/pborman/uuid/node.go | 50 - vendor/github.com/pborman/uuid/sql.go | 68 - vendor/github.com/pborman/uuid/time.go | 57 - vendor/github.com/pborman/uuid/util.go | 32 - vendor/github.com/pborman/uuid/uuid.go | 162 - vendor/github.com/pborman/uuid/version1.go | 23 - vendor/github.com/pborman/uuid/version4.go | 26 - vendor/github.com/pkg/errors/errors.go | 74 +- vendor/github.com/pkg/errors/go113.go | 1 - vendor/github.com/pkg/errors/stack.go | 20 +- .../pkg/apis/monitoring}/LICENSE | 0 .../pkg/apis/monitoring/register.go | 25 + .../pkg/apis/monitoring/resource.go | 60 + .../apis/monitoring/v1/alertmanager_types.go | 451 + .../pkg/apis/monitoring/v1/doc.go | 0 .../apis/monitoring/v1/podmonitor_types.go | 310 + .../pkg/apis/monitoring/v1/probe_types.go | 228 + .../apis/monitoring/v1/prometheus_types.go | 1795 ++++ .../monitoring/v1/prometheusrule_types.go | 121 + .../pkg/apis/monitoring/v1/register.go | 4 +- .../monitoring/v1/servicemonitor_types.go | 160 + .../pkg/apis/monitoring/v1/thanos_types.go | 124 +- .../pkg/apis/monitoring/v1/types.go | 741 ++ .../monitoring/v1/zz_generated.deepcopy.go | 3336 +++++++ vendor/github.com/sirupsen/logrus/doc.go | 26 +- .../github.com/sirupsen/logrus/formatter.go | 4 +- vendor/github.com/sirupsen/logrus/logger.go | 18 +- .../logrus/terminal_check_appengine.go | 1 - .../sirupsen/logrus/terminal_check_bsd.go | 1 - .../sirupsen/logrus/terminal_check_js.go | 1 - .../logrus/terminal_check_no_terminal.go | 1 - .../logrus/terminal_check_notappengine.go | 1 - .../sirupsen/logrus/terminal_check_unix.go | 1 - .../sirupsen/logrus/terminal_check_windows.go | 1 - vendor/github.com/spf13/pflag/flag.go | 19 +- vendor/github.com/spf13/pflag/string_slice.go | 28 +- .../sylabs/sif/v2/pkg/sif/descriptor_input.go | 4 +- .../gocapability/capability/capability.go | 48 +- .../capability/capability_noop.go | 1 - .../vbatts/tar-split/archive/tar/common.go | 9 +- .../tar-split/archive/tar/stat_actime1.go | 1 - .../tar-split/archive/tar/stat_actime2.go | 1 - .../vbatts/tar-split/archive/tar/stat_unix.go | 1 - .../vbatts/tar-split/archive/tar/strconv.go | 3 +- .../instrumentation/net/http/otelhttp/LICENSE | 201 + .../net/http/otelhttp/client.go | 61 + .../net/http/otelhttp/common.go | 52 + .../net/http/otelhttp/config.go | 207 + .../instrumentation/net/http/otelhttp/doc.go | 18 + .../net/http/otelhttp/handler.go | 283 + .../http/otelhttp/internal/semconvutil/gen.go | 21 + .../otelhttp/internal/semconvutil/httpconv.go | 586 ++ .../otelhttp/internal/semconvutil/netconv.go | 215 + .../net/http/otelhttp/labeler.go | 65 + .../net/http/otelhttp/transport.go | 286 + .../net/http/otelhttp/version.go | 28 + .../instrumentation/net/http/otelhttp/wrap.go | 100 + .../go.opentelemetry.io/otel/.codespellignore | 7 + vendor/go.opentelemetry.io/otel/.codespellrc | 10 + .../go.opentelemetry.io/otel/.gitattributes | 3 + vendor/go.opentelemetry.io/otel/.gitignore | 22 + vendor/go.opentelemetry.io/otel/.gitmodules | 3 + vendor/go.opentelemetry.io/otel/.golangci.yml | 296 + vendor/go.opentelemetry.io/otel/.lycheeignore | 6 + .../otel/.markdownlint.yaml | 29 + vendor/go.opentelemetry.io/otel/CHANGELOG.md | 2939 ++++++ vendor/go.opentelemetry.io/otel/CODEOWNERS | 17 + .../go.opentelemetry.io/otel/CONTRIBUTING.md | 645 ++ vendor/go.opentelemetry.io/otel/LICENSE | 201 + vendor/go.opentelemetry.io/otel/Makefile | 318 + vendor/go.opentelemetry.io/otel/README.md | 112 + vendor/go.opentelemetry.io/otel/RELEASING.md | 139 + vendor/go.opentelemetry.io/otel/VERSIONING.md | 224 + .../otel/attribute/doc.go} | 9 +- .../otel/attribute/encoder.go | 146 + .../otel/attribute/filter.go | 60 + .../otel/attribute/iterator.go | 161 + .../go.opentelemetry.io/otel/attribute/key.go | 134 + .../go.opentelemetry.io/otel/attribute/kv.go | 86 + .../go.opentelemetry.io/otel/attribute/set.go | 452 + .../otel/attribute/type_string.go | 31 + .../otel/attribute/value.go | 270 + .../otel/baggage/baggage.go | 744 ++ .../otel/baggage/context.go | 39 + .../go.opentelemetry.io/otel/baggage/doc.go | 20 + .../go.opentelemetry.io/otel/codes/codes.go | 116 + vendor/go.opentelemetry.io/otel/codes/doc.go | 21 + vendor/go.opentelemetry.io/otel/doc.go | 34 + .../go.opentelemetry.io/otel/error_handler.go | 38 + .../go.opentelemetry.io/otel/get_main_pkgs.sh | 41 + vendor/go.opentelemetry.io/otel/handler.go | 48 + .../otel/internal/attribute/attribute.go | 111 + .../otel/internal/baggage/baggage.go | 43 + .../otel/internal/baggage/context.go | 92 + .../go.opentelemetry.io/otel/internal/gen.go | 29 + .../otel/internal/global/handler.go | 102 + .../otel/internal/global/instruments.go | 371 + .../otel/internal/global/internal_logging.go | 69 + .../otel/internal/global/meter.go | 356 + .../otel/internal/global/propagator.go | 82 + .../otel/internal/global/state.go | 156 + .../otel/internal/global/trace.go | 199 + .../otel/internal/rawhelpers.go | 55 + .../otel/internal_logging.go | 26 + vendor/go.opentelemetry.io/otel/metric.go | 53 + .../go.opentelemetry.io/otel/metric/LICENSE | 201 + .../otel/metric/asyncfloat64.go | 271 + .../otel/metric/asyncint64.go | 269 + .../go.opentelemetry.io/otel/metric/config.go | 92 + vendor/go.opentelemetry.io/otel/metric/doc.go | 170 + .../otel/metric/embedded/embedded.go | 234 + .../otel/metric/instrument.go | 357 + .../go.opentelemetry.io/otel/metric/meter.go | 212 + .../otel/metric/syncfloat64.go | 185 + .../otel/metric/syncint64.go | 185 + .../go.opentelemetry.io/otel/propagation.go | 31 + .../otel/propagation/baggage.go | 58 + .../otel/propagation/doc.go | 24 + .../otel/propagation/propagation.go | 153 + .../otel/propagation/trace_context.go | 167 + .../go.opentelemetry.io/otel/requirements.txt | 1 + .../otel/semconv/v1.20.0/attribute_group.go | 1209 +++ .../otel/semconv/v1.20.0/doc.go | 20 + .../otel/semconv/v1.20.0/event.go | 199 + .../otel/semconv/v1.20.0/exception.go | 20 + .../otel/semconv/v1.20.0/http.go | 21 + .../otel/semconv/v1.20.0/resource.go | 2071 ++++ .../otel/semconv/v1.20.0/schema.go | 20 + .../otel/semconv/v1.20.0/trace.go | 2610 +++++ vendor/go.opentelemetry.io/otel/trace.go | 47 + vendor/go.opentelemetry.io/otel/trace/LICENSE | 201 + .../go.opentelemetry.io/otel/trace/config.go | 334 + .../go.opentelemetry.io/otel/trace/context.go | 61 + vendor/go.opentelemetry.io/otel/trace/doc.go | 130 + .../otel/trace/embedded/embedded.go | 56 + .../otel/trace/nonrecording.go | 27 + vendor/go.opentelemetry.io/otel/trace/noop.go | 93 + .../go.opentelemetry.io/otel/trace/trace.go | 577 ++ .../otel/trace/tracestate.go | 331 + .../otel/verify_examples.sh | 85 + .../otel/version.go} | 16 +- vendor/go.opentelemetry.io/otel/versions.yaml | 56 + .../x/crypto/internal/poly1305/sum_ppc64le.s | 14 +- vendor/golang.org/x/exp/slices/slices.go | 44 +- vendor/golang.org/x/net/html/token.go | 12 +- vendor/golang.org/x/net/http2/frame.go | 11 +- vendor/golang.org/x/net/http2/transport.go | 9 + vendor/golang.org/x/sync/errgroup/errgroup.go | 3 + vendor/golang.org/x/sys/execabs/execabs.go | 102 - .../golang.org/x/sys/execabs/execabs_go118.go | 17 - .../golang.org/x/sys/execabs/execabs_go119.go | 20 - vendor/golang.org/x/sys/unix/aliases.go | 2 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 2 +- .../x/sys/unix/syscall_darwin_libSystem.go | 2 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 12 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 99 + vendor/golang.org/x/sys/unix/zerrors_linux.go | 36 +- .../x/sys/unix/zerrors_linux_386.go | 3 + .../x/sys/unix/zerrors_linux_amd64.go | 3 + .../x/sys/unix/zerrors_linux_arm.go | 3 + .../x/sys/unix/zerrors_linux_arm64.go | 3 + .../x/sys/unix/zerrors_linux_loong64.go | 3 + .../x/sys/unix/zerrors_linux_mips.go | 3 + .../x/sys/unix/zerrors_linux_mips64.go | 3 + .../x/sys/unix/zerrors_linux_mips64le.go | 3 + .../x/sys/unix/zerrors_linux_mipsle.go | 3 + .../x/sys/unix/zerrors_linux_ppc.go | 3 + .../x/sys/unix/zerrors_linux_ppc64.go | 3 + .../x/sys/unix/zerrors_linux_ppc64le.go | 3 + .../x/sys/unix/zerrors_linux_riscv64.go | 3 + .../x/sys/unix/zerrors_linux_s390x.go | 3 + .../x/sys/unix/zerrors_linux_sparc64.go | 3 + .../golang.org/x/sys/unix/zsyscall_linux.go | 10 + .../x/sys/unix/zsysnum_linux_386.go | 4 + .../x/sys/unix/zsysnum_linux_amd64.go | 3 + .../x/sys/unix/zsysnum_linux_arm.go | 4 + .../x/sys/unix/zsysnum_linux_arm64.go | 4 + .../x/sys/unix/zsysnum_linux_loong64.go | 4 + .../x/sys/unix/zsysnum_linux_mips.go | 4 + .../x/sys/unix/zsysnum_linux_mips64.go | 4 + .../x/sys/unix/zsysnum_linux_mips64le.go | 4 + .../x/sys/unix/zsysnum_linux_mipsle.go | 4 + .../x/sys/unix/zsysnum_linux_ppc.go | 4 + .../x/sys/unix/zsysnum_linux_ppc64.go | 4 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 4 + .../x/sys/unix/zsysnum_linux_riscv64.go | 4 + .../x/sys/unix/zsysnum_linux_s390x.go | 4 + .../x/sys/unix/zsysnum_linux_sparc64.go | 4 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 185 +- .../golang.org/x/sys/windows/env_windows.go | 17 +- .../x/sys/windows/syscall_windows.go | 3 +- .../x/text/encoding/unicode/unicode.go | 4 +- .../x/text/internal/language/lookup.go | 56 +- vendor/golang.org/x/text/language/tables.go | 6 +- vendor/golang.org/x/time/rate/rate.go | 2 + vendor/golang.org/x/tools/cover/profile.go | 266 + .../x/tools/go/gcexportdata/gcexportdata.go | 2 +- vendor/golang.org/x/tools/go/packages/doc.go | 40 +- .../x/tools/go/packages/external.go | 77 +- .../golang.org/x/tools/go/packages/golist.go | 35 +- .../x/tools/go/packages/packages.go | 46 +- .../x/tools/go/types/objectpath/objectpath.go | 20 +- .../x/tools/internal/aliases/aliases.go | 28 + .../x/tools/internal/aliases/aliases_go121.go | 30 + .../x/tools/internal/aliases/aliases_go122.go | 72 + .../x/tools/internal/gcimporter/gcimporter.go | 7 - .../x/tools/internal/gcimporter/iexport.go | 9 +- .../x/tools/internal/gcimporter/iimport.go | 34 +- .../internal/gcimporter/support_go117.go | 16 - .../internal/gcimporter/support_go118.go | 3 - .../x/tools/internal/gcimporter/unified_no.go | 4 +- .../tools/internal/gcimporter/unified_yes.go | 4 +- .../x/tools/internal/gcimporter/ureader_no.go | 19 - .../tools/internal/gcimporter/ureader_yes.go | 6 +- .../internal/tokeninternal/tokeninternal.go | 28 +- .../x/tools/internal/typeparams/common.go | 37 +- .../x/tools/internal/typeparams/coretype.go | 17 +- .../x/tools/internal/typesinternal/recv.go | 43 + .../tools/internal/typesinternal/types_118.go | 3 - .../x/tools/internal/versions/features.go | 43 + .../x/tools/internal/versions/toolchain.go | 14 + .../internal/versions/toolchain_go119.go | 14 + .../internal/versions/toolchain_go120.go | 14 + .../internal/versions/toolchain_go121.go | 14 + .../x/tools/internal/versions/types_go121.go | 18 +- .../x/tools/internal/versions/types_go122.go | 25 +- .../{versions_go121.go => versions.go} | 14 +- .../tools/internal/versions/versions_go122.go | 38 - .../grpc/attributes/attributes.go | 4 +- vendor/google.golang.org/grpc/codes/codes.go | 8 +- .../google.golang.org/grpc/credentials/tls.go | 75 +- .../grpc/internal/experimental.go | 28 + .../grpc/internal/internal.go | 33 +- .../grpc/internal/status/status.go | 43 +- .../grpc/internal/tcp_keepalive_others.go | 29 + .../grpc/internal/tcp_keepalive_unix.go | 54 + .../grpc/internal/tcp_keepalive_windows.go | 54 + vendor/google.golang.org/grpc/resolver/map.go | 113 + .../grpc/resolver/resolver.go | 23 +- .../protobuf/encoding/protojson/decode.go | 38 +- .../protobuf/encoding/protojson/doc.go | 2 +- .../protobuf/encoding/protojson/encode.go | 39 +- .../encoding/protojson/well_known_types.go | 59 +- .../protobuf/encoding/prototext/decode.go | 8 +- .../protobuf/encoding/prototext/encode.go | 4 +- .../protobuf/encoding/protowire/wire.go | 28 +- .../protobuf/internal/descfmt/stringer.go | 183 +- .../internal/editiondefaults/defaults.go | 12 + .../editiondefaults/editions_defaults.binpb | 4 + .../protobuf/internal/encoding/json/decode.go | 2 +- .../protobuf/internal/filedesc/desc.go | 102 +- .../protobuf/internal/filedesc/desc_init.go | 52 + .../protobuf/internal/filedesc/desc_lazy.go | 28 + .../protobuf/internal/filedesc/editions.go | 142 + .../protobuf/internal/genid/descriptor_gen.go | 364 +- .../internal/genid/go_features_gen.go | 31 + .../protobuf/internal/genid/struct_gen.go | 5 + .../protobuf/internal/genid/type_gen.go | 38 + .../protobuf/internal/impl/codec_extension.go | 22 +- .../protobuf/internal/impl/codec_gen.go | 113 +- .../protobuf/internal/impl/codec_tables.go | 2 +- .../protobuf/internal/impl/legacy_message.go | 19 +- .../protobuf/internal/impl/merge_gen.go | 2 + .../protobuf/internal/impl/message.go | 17 +- .../internal/impl/message_reflect_field.go | 2 +- .../protobuf/internal/impl/pointer_reflect.go | 36 + .../protobuf/internal/impl/pointer_unsafe.go | 40 + .../protobuf/internal/strs/strings.go | 2 +- ...ings_unsafe.go => strings_unsafe_go120.go} | 4 +- .../internal/strs/strings_unsafe_go121.go | 74 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/proto/decode.go | 2 +- .../google.golang.org/protobuf/proto/doc.go | 58 +- .../protobuf/proto/encode.go | 2 +- .../protobuf/proto/extension.go | 2 +- .../google.golang.org/protobuf/proto/merge.go | 2 +- .../google.golang.org/protobuf/proto/proto.go | 18 +- .../protobuf/protoadapt/convert.go | 31 + .../protobuf/reflect/protodesc/desc.go | 29 +- .../protobuf/reflect/protodesc/desc_init.go | 56 + .../reflect/protodesc/desc_resolve.go | 4 +- .../reflect/protodesc/desc_validate.go | 6 +- .../protobuf/reflect/protodesc/editions.go | 148 + .../protobuf/reflect/protodesc/proto.go | 18 +- .../protobuf/reflect/protoreflect/proto.go | 85 +- .../reflect/protoreflect/source_gen.go | 64 +- .../protobuf/reflect/protoreflect/type.go | 44 +- .../protobuf/reflect/protoreflect/value.go | 24 +- .../reflect/protoreflect/value_equal.go | 8 +- .../reflect/protoreflect/value_union.go | 44 +- ...{value_unsafe.go => value_unsafe_go120.go} | 4 +- .../protoreflect/value_unsafe_go121.go | 87 + .../reflect/protoregistry/registry.go | 24 +- .../types/descriptorpb/descriptor.pb.go | 2475 +++-- .../types/gofeaturespb/go_features.pb.go | 177 + .../types/gofeaturespb/go_features.proto | 28 + .../protobuf/types/known/anypb/any.pb.go | 3 +- .../types/known/durationpb/duration.pb.go | 374 - .../types/known/timestamppb/timestamp.pb.go | 383 - vendor/gopkg.in/inf.v0/dec.go | 50 +- vendor/gopkg.in/inf.v0/rounder.go | 1 + vendor/gopkg.in/yaml.v2/apic.go | 2 +- vendor/gopkg.in/yaml.v2/emitterc.go | 7 +- vendor/gopkg.in/yaml.v2/parserc.go | 140 +- vendor/gopkg.in/yaml.v2/readerc.go | 2 +- vendor/gopkg.in/yaml.v2/resolve.go | 2 +- vendor/gopkg.in/yaml.v2/scannerc.go | 34 +- vendor/gopkg.in/yaml.v2/sorter.go | 2 +- vendor/gopkg.in/yaml.v2/yaml.go | 55 +- vendor/gopkg.in/yaml.v2/yamlh.go | 9 +- vendor/gopkg.in/yaml.v3/apic.go | 8 +- vendor/gopkg.in/yaml.v3/emitterc.go | 9 +- vendor/gopkg.in/yaml.v3/parserc.go | 140 +- vendor/gopkg.in/yaml.v3/readerc.go | 8 +- vendor/gopkg.in/yaml.v3/scannerc.go | 42 +- vendor/gopkg.in/yaml.v3/writerc.go | 8 +- vendor/gopkg.in/yaml.v3/yaml.go | 75 +- vendor/gopkg.in/yaml.v3/yamlh.go | 10 +- vendor/gopkg.in/yaml.v3/yamlprivateh.go | 20 +- .../pkg/apis/apiextensions/deepcopy.go | 8 +- .../apis/apiextensions/types_jsonschema.go | 81 + .../pkg/apis/apiextensions/v1/deepcopy.go | 8 +- .../pkg/apis/apiextensions/v1/generated.pb.go | 550 +- .../pkg/apis/apiextensions/v1/generated.proto | 69 +- .../pkg/apis/apiextensions/v1/types.go | 6 +- .../apis/apiextensions/v1/types_jsonschema.go | 83 +- .../v1/zz_generated.conversion.go | 8 + .../apiextensions/v1/zz_generated.deepcopy.go | 14 +- .../apis/apiextensions/v1beta1/deepcopy.go | 8 +- .../apiextensions/v1beta1/generated.pb.go | 554 +- .../apiextensions/v1beta1/generated.proto | 63 + .../apiextensions/v1beta1/types_jsonschema.go | 83 +- .../v1beta1/zz_generated.conversion.go | 8 + .../v1beta1/zz_generated.deepcopy.go | 14 +- .../apiextensions/zz_generated.deepcopy.go | 14 +- .../v1/customresourcecolumndefinition.go | 84 + .../v1/customresourceconversion.go | 52 + .../v1/customresourcedefinition.go | 218 + .../v1/customresourcedefinitioncondition.go | 80 + .../v1/customresourcedefinitionnames.go | 88 + .../v1/customresourcedefinitionspec.go | 93 + .../v1/customresourcedefinitionstatus.go | 64 + .../v1/customresourcedefinitionversion.go | 107 + .../v1/customresourcesubresources.go | 52 + .../v1/customresourcesubresourcescale.go | 57 + .../v1/customresourcevalidation.go | 39 + .../apiextensions/v1/externaldocumentation.go | 48 + .../apiextensions/v1/jsonschemaprops.go | 463 + .../apiextensions/v1/servicereference.go | 66 + .../apiextensions/v1/validationrule.go | 88 + .../apiextensions/v1/webhookclientconfig.go | 59 + .../apiextensions/v1/webhookconversion.go | 50 + .../v1beta1/customresourcecolumndefinition.go | 84 + .../v1beta1/customresourceconversion.go | 63 + .../v1beta1/customresourcedefinition.go | 218 + .../customresourcedefinitioncondition.go | 80 + .../v1beta1/customresourcedefinitionnames.go | 88 + .../v1beta1/customresourcedefinitionspec.go | 134 + .../v1beta1/customresourcedefinitionstatus.go | 64 + .../customresourcedefinitionversion.go | 107 + .../v1beta1/customresourcesubresources.go | 52 + .../v1beta1/customresourcesubresourcescale.go | 57 + .../v1beta1/customresourcevalidation.go | 39 + .../v1beta1/externaldocumentation.go | 48 + .../apiextensions/v1beta1/jsonschemaprops.go | 463 + .../apiextensions/v1beta1/servicereference.go | 66 + .../apiextensions/v1beta1/validationrule.go | 88 + .../v1beta1/webhookclientconfig.go | 59 + .../client/clientset/clientset/clientset.go | 20 +- .../clientset/clientset/scheme/register.go | 2 +- .../v1/customresourcedefinition.go | 59 + .../v1beta1/customresourcedefinition.go | 59 + .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 1 - .../apimachinery/pkg/api/meta/conditions.go | 37 +- .../k8s.io/apimachinery/pkg/api/meta/help.go | 86 +- .../apimachinery/pkg/api/resource/OWNERS | 1 - .../apimachinery/pkg/api/resource/amount.go | 38 + .../apimachinery/pkg/api/resource/quantity.go | 10 + .../pkg/api/validation}/doc.go | 8 +- .../pkg/api/validation/generic.go | 88 + .../pkg/api/validation/objectmeta.go | 265 + .../pkg/apis/meta/v1/generated.pb.go | 385 +- .../pkg/apis/meta/v1/generated.proto | 71 +- .../apimachinery/pkg/apis/meta/v1/types.go | 91 +- .../meta/v1/types_swagger_doc_generated.go | 25 +- .../pkg/apis/meta/v1/unstructured/helpers.go | 2 +- .../apis/meta/v1/unstructured/unstructured.go | 5 + .../meta/v1/unstructured/unstructured_list.go | 9 + .../pkg/apis/meta/v1/validation/validation.go | 320 + .../apis/meta/v1/zz_generated.conversion.go | 7 + .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 5 + .../k8s.io/apimachinery/pkg/labels/labels.go | 2 + .../apimachinery/pkg/labels/selector.go | 131 +- .../k8s.io/apimachinery/pkg/runtime/codec.go | 1 - .../k8s.io/apimachinery/pkg/runtime/helper.go | 23 + .../apimachinery/pkg/runtime/interfaces.go | 5 + .../pkg/runtime/schema/group_version.go | 8 +- .../k8s.io/apimachinery/pkg/runtime/scheme.go | 3 +- .../pkg/runtime/serializer/codec_factory.go | 3 +- .../runtime/serializer/streaming/streaming.go | 20 - .../serializer/versioning/versioning.go | 2 +- .../k8s.io/apimachinery/pkg/runtime/splice.go | 76 + .../k8s.io/apimachinery/pkg/runtime/types.go | 2 +- .../apimachinery/pkg/types/namespacedname.go | 11 + .../apimachinery/pkg/util/errors/errors.go | 2 +- .../apimachinery/pkg/util/framer/framer.go | 2 +- .../apimachinery/pkg/util/intstr/intstr.go | 13 +- .../pkg/util/managedfields/endpoints.yaml | 7018 +++++++++++++ .../pkg/util/managedfields/fieldmanager.go | 57 + .../managedfields/internal/atmostevery.go | 60 + .../internal/buildmanagerinfo.go | 74 + .../managedfields/internal/capmanagers.go | 133 + .../util/managedfields/internal/conflict.go | 89 + .../managedfields/internal/fieldmanager.go | 209 + .../pkg/util/managedfields/internal/fields.go | 47 + .../managedfields/internal/lastapplied.go | 50 + .../internal/lastappliedmanager.go | 171 + .../internal/lastappliedupdater.go | 102 + .../managedfields/internal/managedfields.go | 248 + .../internal/managedfieldsupdater.go | 82 + .../util/managedfields/internal/manager.go | 52 + .../managedfields/internal/pathelement.go | 140 + .../managedfields/internal/skipnonapplied.go | 89 + .../util/managedfields/internal/stripmeta.go | 90 + .../managedfields/internal/structuredmerge.go | 189 + .../managedfields/internal/typeconverter.go | 193 + .../managedfields/internal/versioncheck.go | 52 + .../internal/versionconverter.go | 123 + .../pkg/util/managedfields/node.yaml | 261 + .../pkg/util/managedfields/pod.yaml | 121 + .../pkg/util/managedfields/scalehandler.go | 174 + .../pkg/util/managedfields/typeconverter.go | 47 + .../k8s.io/apimachinery/pkg/util/net/util.go | 6 + .../k8s.io/apimachinery/pkg/util/sets/set.go | 14 + .../pkg/util/validation/field/errors.go | 4 +- .../pkg/util/validation/validation.go | 8 +- .../apimachinery/pkg/util/wait/backoff.go | 502 + .../apimachinery/pkg/util/wait/delay.go | 51 + .../apimachinery/pkg/util/wait/error.go | 96 + .../k8s.io/apimachinery/pkg/util/wait/loop.go | 95 + .../k8s.io/apimachinery/pkg/util/wait/poll.go | 315 + .../apimachinery/pkg/util/wait/timer.go | 121 + .../k8s.io/apimachinery/pkg/util/wait/wait.go | 634 +- vendor/k8s.io/klog/v2/OWNERS | 4 +- vendor/k8s.io/klog/v2/contextual_slog.go | 31 + vendor/k8s.io/klog/v2/klog.go | 23 +- vendor/k8s.io/klog/v2/klogr_slog.go | 10 +- vendor/k8s.io/klog/v2/safeptr.go | 34 + .../kube-openapi/pkg/builder3/util/util.go | 51 - .../k8s.io/kube-openapi/pkg/cached/cache.go | 310 +- .../k8s.io/kube-openapi/pkg/common/common.go | 41 +- .../kube-openapi/pkg/handler3/handler.go | 79 +- .../k8s.io/kube-openapi/pkg/internal/flags.go | 1 + .../kube-openapi/pkg/openapiconv/convert.go | 322 - .../k8s.io/kube-openapi/pkg/schemaconv/smd.go | 3 - .../kube-openapi/pkg/schemamutation/walker.go | 519 - .../k8s.io/kube-openapi/pkg/spec3/encoding.go | 21 + .../k8s.io/kube-openapi/pkg/spec3/example.go | 14 + .../pkg/spec3/external_documentation.go | 13 + vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go | 27 + .../k8s.io/kube-openapi/pkg/spec3/header.go | 31 + .../kube-openapi/pkg/spec3/media_type.go | 20 + .../kube-openapi/pkg/spec3/operation.go | 27 + .../kube-openapi/pkg/spec3/parameter.go | 31 + vendor/k8s.io/kube-openapi/pkg/spec3/path.go | 47 +- .../kube-openapi/pkg/spec3/request_body.go | 21 + .../k8s.io/kube-openapi/pkg/spec3/response.go | 52 + .../kube-openapi/pkg/spec3/security_scheme.go | 17 + .../k8s.io/kube-openapi/pkg/spec3/server.go | 26 + vendor/k8s.io/kube-openapi/pkg/spec3/spec.go | 25 + .../kube-openapi/pkg/util/proto/document.go | 2 +- .../pkg/util/proto/document_v3.go | 2 +- .../kube-openapi/pkg/validation/spec/fuzz.go | 502 - .../pkg/validation/spec/gnostic.go | 2 +- .../api/clone/v1alpha1/deepcopy_generated.go | 29 +- .../kubevirt.io/api/clone/v1alpha1/types.go | 17 +- .../clone/v1alpha1/types_swagger_generated.go | 8 + .../api/core/v1/deepcopy_generated.go | 116 +- vendor/kubevirt.io/api/core/v1/defaults.go | 4 +- vendor/kubevirt.io/api/core/v1/schema.go | 17 +- .../api/core/v1/schema_swagger_generated.go | 11 +- vendor/kubevirt.io/api/core/v1/types.go | 90 +- .../api/core/v1/types_swagger_generated.go | 27 +- .../api/core/v1/zz_generated.defaults.go | 2 +- .../api/export/v1alpha1/deepcopy_generated.go | 2 +- .../v1alpha1/conversion_generated.go | 2 +- .../v1alpha1/deepcopy_generated.go | 2 +- .../v1alpha2/conversion_generated.go | 2 +- .../v1alpha2/deepcopy_generated.go | 2 +- .../v1beta1/deepcopy_generated.go | 2 +- .../migrations/v1alpha1/deepcopy_generated.go | 2 +- .../api/pool/v1alpha1/deepcopy_generated.go | 2 +- .../snapshot/v1alpha1/deepcopy_generated.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 2 +- .../versioned/typed/core/v1beta1/cdi.go | 2 +- .../versioned/typed/core/v1beta1/cdiconfig.go | 2 +- .../typed/core/v1beta1/core_client.go | 2 +- .../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 | 2 +- .../typed/core/v1beta1/objecttransfer.go | 2 +- .../typed/core/v1beta1/storageprofile.go | 2 +- .../typed/core/v1beta1/volumeclonesource.go | 2 +- .../typed/core/v1beta1/volumeimportsource.go | 2 +- .../typed/core/v1beta1/volumeuploadsource.go | 2 +- .../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 | 2 +- .../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 | 2 +- .../kubevirt/clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 2 +- .../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 | 2 +- .../v1beta1/generated_expansion.go | 2 +- .../v1beta1/instancetype_client.go | 2 +- .../virtualmachineclusterinstancetype.go | 2 +- .../virtualmachineclusterpreference.go | 2 +- .../v1beta1/virtualmachineinstancetype.go | 2 +- .../v1beta1/virtualmachinepreference.go | 2 +- .../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 | 2 +- .../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 | 4 +- .../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 +- .../kubecli/generated_mock_kubevirt.go | 11 + .../kubevirt.io/client-go/kubecli/kubecli.go | 2 +- .../kubevirt.io/client-go/kubecli/kubevirt.go | 15 + .../pkg/apis/core/v1beta1/types.go | 53 +- .../core/v1beta1/types_swagger_generated.go | 41 +- .../core/v1beta1/zz_generated.deepcopy.go | 45 + vendor/modules.txt | 270 +- .../v4/merge/conflict.go | 121 + .../structured-merge-diff/v4/merge/update.go | 358 + vendor/sigs.k8s.io/yaml/goyaml.v2/apic.go | 2 +- vendor/sigs.k8s.io/yaml/goyaml.v2/emitterc.go | 7 +- vendor/sigs.k8s.io/yaml/goyaml.v2/parserc.go | 140 +- vendor/sigs.k8s.io/yaml/goyaml.v2/readerc.go | 2 +- vendor/sigs.k8s.io/yaml/goyaml.v2/resolve.go | 2 +- vendor/sigs.k8s.io/yaml/goyaml.v2/scannerc.go | 34 +- vendor/sigs.k8s.io/yaml/goyaml.v2/sorter.go | 2 +- vendor/sigs.k8s.io/yaml/goyaml.v2/yaml.go | 55 +- vendor/sigs.k8s.io/yaml/goyaml.v2/yamlh.go | 9 +- 1286 files changed, 94495 insertions(+), 31447 deletions(-) create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_hive.go create mode 100644 vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value_type.go delete mode 100644 vendor/github.com/containerd/containerd/NOTICE rename vendor/github.com/containerd/{containerd => errdefs}/LICENSE (100%) create mode 100644 vendor/github.com/containerd/errdefs/README.md rename vendor/github.com/containerd/{containerd => }/errdefs/errors.go (100%) rename vendor/github.com/containerd/{containerd => }/errdefs/grpc.go (100%) rename vendor/github.com/containers/storage/drivers/overlay/{composefs_supported.go => composefs.go} (63%) delete mode 100644 vendor/github.com/containers/storage/drivers/overlay/composefs_notsupported.go create mode 100644 vendor/github.com/containers/storage/drivers/quota/projectquota_supported.go create mode 100644 vendor/github.com/containers/storage/pkg/fsverity/fsverity_linux.go create mode 100644 vendor/github.com/containers/storage/pkg/fsverity/fsverity_unsupported.go 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 delete mode 100644 vendor/github.com/docker/distribution/reference/helpers_deprecated.go delete mode 100644 vendor/github.com/docker/distribution/reference/normalize_deprecated.go delete mode 100644 vendor/github.com/docker/distribution/reference/reference_deprecated.go delete mode 100644 vendor/github.com/docker/distribution/reference/regexp_deprecated.go delete mode 100644 vendor/github.com/docker/distribution/reference/sort_deprecated.go delete mode 100644 vendor/github.com/docker/docker/api/common_unix.go delete mode 100644 vendor/github.com/docker/docker/api/common_windows.go delete mode 100644 vendor/github.com/docker/docker/api/types/auth.go create mode 100644 vendor/github.com/docker/docker/api/types/checkpoint/list.go create mode 100644 vendor/github.com/docker/docker/api/types/checkpoint/options.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go create mode 100644 vendor/github.com/docker/docker/api/types/container/errors.go create mode 100644 vendor/github.com/docker/docker/api/types/container/options.go rename vendor/github.com/docker/docker/api/types/{image_delete_response_item.go => image/delete_response.go} (68%) create mode 100644 vendor/github.com/docker/docker/api/types/image/image.go rename vendor/github.com/docker/docker/api/types/{image_summary.go => image/summary.go} (85%) create mode 100644 vendor/github.com/docker/docker/api/types/network/endpoint.go create mode 100644 vendor/github.com/docker/docker/api/types/network/ipam.go create mode 100644 vendor/github.com/docker/docker/api/types/swarm/service_create_response.go rename vendor/github.com/docker/docker/api/types/{ => swarm}/service_update_response.go (95%) create mode 100644 vendor/github.com/docker/docker/api/types/system/info.go create mode 100644 vendor/github.com/docker/docker/api/types/system/runtime.go create mode 100644 vendor/github.com/docker/docker/api/types/system/security_opts.go create mode 100644 vendor/github.com/docker/docker/api/types/types_deprecated.go delete mode 100644 vendor/github.com/docker/docker/api/types/versions/README.md delete mode 100644 vendor/github.com/docker/docker/client/transport.go create mode 100644 vendor/github.com/docker/docker/internal/multierror/multierror.go rename vendor/github.com/docker/docker/pkg/homedir/{homedir_unix.go => homedir.go} (52%) delete mode 100644 vendor/github.com/docker/docker/pkg/homedir/homedir_windows.go rename vendor/github.com/docker/go-connections/tlsconfig/{certpool_go17.go => certpool.go} (91%) delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go delete mode 100644 vendor/github.com/emicklei/go-restful/v3/json.go delete mode 100644 vendor/github.com/emicklei/go-restful/v3/jsoniter.go create mode 100644 vendor/github.com/felixge/httpsnoop/.gitignore create mode 100644 vendor/github.com/felixge/httpsnoop/LICENSE.txt create mode 100644 vendor/github.com/felixge/httpsnoop/Makefile create mode 100644 vendor/github.com/felixge/httpsnoop/README.md create mode 100644 vendor/github.com/felixge/httpsnoop/capture_metrics.go create mode 100644 vendor/github.com/felixge/httpsnoop/docs.go create mode 100644 vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go create mode 100644 vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.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 create mode 100644 vendor/github.com/go-logr/logr/context.go create mode 100644 vendor/github.com/go-logr/logr/context_noslog.go create mode 100644 vendor/github.com/go-logr/logr/context_slog.go create mode 100644 vendor/github.com/go-logr/logr/funcr/slogsink.go rename vendor/github.com/go-logr/logr/{slogr => }/sloghandler.go (67%) rename vendor/github.com/go-logr/logr/{slogr => }/slogr.go (66%) rename vendor/github.com/go-logr/logr/{slogr => }/slogsink.go (82%) rename vendor/github.com/{opencontainers/runc => go-logr/stdr}/LICENSE (94%) create mode 100644 vendor/github.com/go-logr/stdr/README.md create mode 100644 vendor/github.com/go-logr/stdr/stdr.go create mode 100644 vendor/github.com/go-openapi/jsonpointer/.golangci.yml create mode 100644 vendor/github.com/go-openapi/swag/BENCHMARK.md create mode 100644 vendor/github.com/go-openapi/swag/initialism_index.go delete mode 100644 vendor/github.com/go-openapi/swag/post_go19.go delete mode 100644 vendor/github.com/go-openapi/swag/pre_go19.go create mode 100644 vendor/github.com/go-openapi/swag/string_bytes.go create mode 100644 vendor/github.com/golang/glog/glog_file_linux.go create mode 100644 vendor/github.com/golang/glog/glog_file_other.go create mode 100644 vendor/github.com/golang/glog/glog_file_posix.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go create mode 100644 vendor/github.com/google/gnostic-models/LICENSE create mode 100644 vendor/github.com/google/gnostic-models/compiler/README.md create mode 100644 vendor/github.com/google/gnostic-models/compiler/context.go create mode 100644 vendor/github.com/google/gnostic-models/compiler/error.go create mode 100644 vendor/github.com/google/gnostic-models/compiler/extensions.go create mode 100644 vendor/github.com/google/gnostic-models/compiler/helpers.go rename vendor/github.com/{go-openapi/swag/post_go18.go => google/gnostic-models/compiler/main.go} (74%) create mode 100644 vendor/github.com/google/gnostic-models/compiler/reader.go rename vendor/github.com/google/{gnostic => gnostic-models}/extensions/README.md (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/extensions/extension.pb.go (99%) rename vendor/github.com/google/{gnostic => gnostic-models}/extensions/extension.proto (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/extensions/extensions.go (93%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/README.md (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/base.go (88%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/display.go (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/models.go (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/operations.go (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/reader.go (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/schema.json (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/jsonschema/writer.go (100%) create mode 100644 vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go rename vendor/github.com/google/{gnostic => gnostic-models}/openapiv2/OpenAPIv2.pb.go (99%) create mode 100644 vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.proto create mode 100644 vendor/github.com/google/gnostic-models/openapiv2/README.md create mode 100644 vendor/github.com/google/gnostic-models/openapiv2/document.go create mode 100644 vendor/github.com/google/gnostic-models/openapiv2/openapi-2.0.json rename vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/OpenAPIv3.go (99%) rename vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/OpenAPIv3.pb.go (99%) rename vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/OpenAPIv3.proto (100%) rename vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/README.md (100%) create mode 100644 vendor/github.com/google/gnostic-models/openapiv3/annotations.pb.go create mode 100644 vendor/github.com/google/gnostic-models/openapiv3/annotations.proto rename vendor/github.com/google/{gnostic => gnostic-models}/openapiv3/document.go (96%) create mode 100644 vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.pbalias.go delete mode 100644 vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json delete mode 100644 vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json create mode 100644 vendor/github.com/google/uuid/version6.go create mode 100644 vendor/github.com/google/uuid/version7.go create mode 100644 vendor/github.com/gorilla/mux/.editorconfig create mode 100644 vendor/github.com/gorilla/mux/.gitignore delete mode 100644 vendor/github.com/gorilla/mux/AUTHORS create mode 100644 vendor/github.com/gorilla/mux/Makefile create mode 100644 vendor/github.com/gorilla/websocket/.editorconfig create mode 100644 vendor/github.com/gorilla/websocket/.golangci.yml delete mode 100644 vendor/github.com/gorilla/websocket/AUTHORS create mode 100644 vendor/github.com/gorilla/websocket/Makefile delete mode 100644 vendor/github.com/gorilla/websocket/tls_handshake_116.go delete mode 100644 vendor/github.com/gorilla/websocket/x_net_proxy.go create mode 100644 vendor/github.com/k8snetworkplumbingwg/network-attachment-definition-client/NOTICE delete mode 100644 vendor/github.com/klauspost/compress/huff0/bytereader.go create mode 100644 vendor/github.com/moby/docker-image-spec/LICENSE create mode 100644 vendor/github.com/moby/docker-image-spec/specs-go/v1/image.go create mode 100644 vendor/github.com/moby/sys/user/LICENSE rename vendor/github.com/{opencontainers/runc/libcontainer => moby/sys}/user/lookup_unix.go (100%) rename vendor/github.com/{opencontainers/runc/libcontainer => moby/sys}/user/user.go (100%) rename vendor/github.com/{opencontainers/runc/libcontainer => moby/sys}/user/user_fuzzer.go (100%) create mode 100644 vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/gocovmerge.go delete mode 100644 vendor/github.com/opencontainers/go-digest/digestset/set.go delete mode 100644 vendor/github.com/opencontainers/runc/NOTICE delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_03_marketplace-operator_01_operatorhub.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-Default.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagecontentpolicy.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagedigestmirrorset.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagetagmirrorset.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml-patch delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml delete 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_ingress.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_node.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml delete mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.authentication.single.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.infrastructure.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/custom.scheduler.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.authentication.single.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.hypershift.authentication.testsuite.yaml delete 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.single.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.scheduler.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/custom.route.testsuite.yaml delete mode 100644 vendor/github.com/openshift/api/route/v1/route.crd.yaml delete mode 100644 vendor/github.com/openshift/api/route/v1/route.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/route/v1/techpreview.route.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/zz_generated.featuregated-crd-manifests.yaml delete mode 100644 vendor/github.com/openshift/api/security/v1/0000_03_security-openshift_01_scc.crd.yaml create mode 100644 vendor/github.com/openshift/api/security/v1/zz_generated.featuregated-crd-manifests.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 delete mode 100644 vendor/github.com/pborman/uuid/.travis.yml delete mode 100644 vendor/github.com/pborman/uuid/CONTRIBUTING.md delete mode 100644 vendor/github.com/pborman/uuid/CONTRIBUTORS delete mode 100644 vendor/github.com/pborman/uuid/LICENSE delete mode 100644 vendor/github.com/pborman/uuid/README.md delete mode 100644 vendor/github.com/pborman/uuid/dce.go delete mode 100644 vendor/github.com/pborman/uuid/doc.go delete mode 100644 vendor/github.com/pborman/uuid/hash.go delete mode 100644 vendor/github.com/pborman/uuid/marshal.go delete mode 100644 vendor/github.com/pborman/uuid/node.go delete mode 100644 vendor/github.com/pborman/uuid/sql.go delete mode 100644 vendor/github.com/pborman/uuid/time.go delete mode 100644 vendor/github.com/pborman/uuid/util.go delete mode 100644 vendor/github.com/pborman/uuid/uuid.go delete mode 100644 vendor/github.com/pborman/uuid/version1.go delete mode 100644 vendor/github.com/pborman/uuid/version4.go rename vendor/github.com/{coreos/prometheus-operator => prometheus-operator/prometheus-operator/pkg/apis/monitoring}/LICENSE (100%) create mode 100644 vendor/github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/register.go 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 (60%) 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/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/LICENSE create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/common.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/gen.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/httpconv.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil/netconv.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/labeler.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/transport.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/wrap.go create mode 100644 vendor/go.opentelemetry.io/otel/.codespellignore create mode 100644 vendor/go.opentelemetry.io/otel/.codespellrc create mode 100644 vendor/go.opentelemetry.io/otel/.gitattributes create mode 100644 vendor/go.opentelemetry.io/otel/.gitignore create mode 100644 vendor/go.opentelemetry.io/otel/.gitmodules create mode 100644 vendor/go.opentelemetry.io/otel/.golangci.yml create mode 100644 vendor/go.opentelemetry.io/otel/.lycheeignore create mode 100644 vendor/go.opentelemetry.io/otel/.markdownlint.yaml create mode 100644 vendor/go.opentelemetry.io/otel/CHANGELOG.md create mode 100644 vendor/go.opentelemetry.io/otel/CODEOWNERS create mode 100644 vendor/go.opentelemetry.io/otel/CONTRIBUTING.md create mode 100644 vendor/go.opentelemetry.io/otel/LICENSE create mode 100644 vendor/go.opentelemetry.io/otel/Makefile create mode 100644 vendor/go.opentelemetry.io/otel/README.md create mode 100644 vendor/go.opentelemetry.io/otel/RELEASING.md create mode 100644 vendor/go.opentelemetry.io/otel/VERSIONING.md rename vendor/{github.com/coreos/prometheus-operator/pkg/apis/monitoring/register.go => go.opentelemetry.io/otel/attribute/doc.go} (77%) create mode 100644 vendor/go.opentelemetry.io/otel/attribute/encoder.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/filter.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/iterator.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/key.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/kv.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/set.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/type_string.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/value.go create mode 100644 vendor/go.opentelemetry.io/otel/baggage/baggage.go create mode 100644 vendor/go.opentelemetry.io/otel/baggage/context.go create mode 100644 vendor/go.opentelemetry.io/otel/baggage/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/codes/codes.go create mode 100644 vendor/go.opentelemetry.io/otel/codes/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/error_handler.go create mode 100644 vendor/go.opentelemetry.io/otel/get_main_pkgs.sh create mode 100644 vendor/go.opentelemetry.io/otel/handler.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/baggage/baggage.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/baggage/context.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/gen.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/handler.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/instruments.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/meter.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/propagator.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/state.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/trace.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/rawhelpers.go create mode 100644 vendor/go.opentelemetry.io/otel/internal_logging.go create mode 100644 vendor/go.opentelemetry.io/otel/metric.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/LICENSE create mode 100644 vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/asyncint64.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/config.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/embedded/embedded.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/meter.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/syncfloat64.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/syncint64.go create mode 100644 vendor/go.opentelemetry.io/otel/propagation.go create mode 100644 vendor/go.opentelemetry.io/otel/propagation/baggage.go create mode 100644 vendor/go.opentelemetry.io/otel/propagation/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/propagation/propagation.go create mode 100644 vendor/go.opentelemetry.io/otel/propagation/trace_context.go create mode 100644 vendor/go.opentelemetry.io/otel/requirements.txt create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/attribute_group.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/event.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/exception.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/http.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/resource.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/schema.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.20.0/trace.go create mode 100644 vendor/go.opentelemetry.io/otel/trace.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/LICENSE create mode 100644 vendor/go.opentelemetry.io/otel/trace/config.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/context.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/embedded/embedded.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/nonrecording.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/noop.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/trace.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/tracestate.go create mode 100644 vendor/go.opentelemetry.io/otel/verify_examples.sh rename vendor/{github.com/go-openapi/swag/pre_go18.go => go.opentelemetry.io/otel/version.go} (67%) create mode 100644 vendor/go.opentelemetry.io/otel/versions.yaml delete mode 100644 vendor/golang.org/x/sys/execabs/execabs.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs_go118.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs_go119.go create mode 100644 vendor/golang.org/x/tools/cover/profile.go create mode 100644 vendor/golang.org/x/tools/internal/aliases/aliases.go create mode 100644 vendor/golang.org/x/tools/internal/aliases/aliases_go121.go create mode 100644 vendor/golang.org/x/tools/internal/aliases/aliases_go122.go delete mode 100644 vendor/golang.org/x/tools/internal/gcimporter/support_go117.go delete mode 100644 vendor/golang.org/x/tools/internal/gcimporter/ureader_no.go create mode 100644 vendor/golang.org/x/tools/internal/typesinternal/recv.go create mode 100644 vendor/golang.org/x/tools/internal/versions/features.go create mode 100644 vendor/golang.org/x/tools/internal/versions/toolchain.go create mode 100644 vendor/golang.org/x/tools/internal/versions/toolchain_go119.go create mode 100644 vendor/golang.org/x/tools/internal/versions/toolchain_go120.go create mode 100644 vendor/golang.org/x/tools/internal/versions/toolchain_go121.go rename vendor/golang.org/x/tools/internal/versions/{versions_go121.go => versions.go} (77%) delete mode 100644 vendor/golang.org/x/tools/internal/versions/versions_go122.go create mode 100644 vendor/google.golang.org/grpc/internal/experimental.go create mode 100644 vendor/google.golang.org/grpc/internal/tcp_keepalive_others.go create mode 100644 vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go create mode 100644 vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go create mode 100644 vendor/google.golang.org/protobuf/internal/editiondefaults/defaults.go create mode 100644 vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb create mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/editions.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go rename vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe.go => strings_unsafe_go120.go} (96%) create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go create mode 100644 vendor/google.golang.org/protobuf/protoadapt/convert.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/editions.go rename vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe.go => value_unsafe_go120.go} (97%) create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go create mode 100644 vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go create mode 100644 vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.proto delete mode 100644 vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcecolumndefinition.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourceconversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcedefinition.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcedefinitioncondition.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcedefinitionnames.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcedefinitionspec.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcedefinitionstatus.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcedefinitionversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcesubresources.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcesubresourcescale.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/customresourcevalidation.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/externaldocumentation.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/jsonschemaprops.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/servicereference.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/validationrule.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/webhookclientconfig.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1/webhookconversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcecolumndefinition.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourceconversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcedefinition.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcedefinitioncondition.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcedefinitionnames.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcedefinitionspec.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcedefinitionstatus.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcedefinitionversion.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcesubresources.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcesubresourcescale.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/customresourcevalidation.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/externaldocumentation.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/jsonschemaprops.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/servicereference.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/validationrule.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/applyconfiguration/apiextensions/v1beta1/webhookclientconfig.go rename vendor/k8s.io/{apiextensions-apiserver/pkg/client/clientset/clientset => apimachinery/pkg/api/validation}/doc.go (74%) create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/generic.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/splice.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/endpoints.yaml create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/fieldmanager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/atmostevery.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/buildmanagerinfo.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/capmanagers.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/conflict.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fieldmanager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fields.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/lastapplied.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/lastappliedmanager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/lastappliedupdater.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/managedfields.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/managedfieldsupdater.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/manager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/pathelement.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/skipnonapplied.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/stripmeta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/typeconverter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versioncheck.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versionconverter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/node.yaml create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/pod.yaml create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/scalehandler.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/typeconverter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/backoff.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/delay.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/error.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/loop.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/poll.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/timer.go create mode 100644 vendor/k8s.io/klog/v2/contextual_slog.go create mode 100644 vendor/k8s.io/klog/v2/safeptr.go delete mode 100644 vendor/k8s.io/kube-openapi/pkg/builder3/util/util.go delete mode 100644 vendor/k8s.io/kube-openapi/pkg/openapiconv/convert.go delete mode 100644 vendor/k8s.io/kube-openapi/pkg/schemamutation/walker.go delete mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/fuzz.go create mode 100644 vendor/kubevirt.io/client-go/generated/prometheus-operator/clientset/versioned/typed/monitoring/v1/probe.go create mode 100644 vendor/sigs.k8s.io/structured-merge-diff/v4/merge/conflict.go create mode 100644 vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go diff --git a/Makefile b/Makefile index c6339d3f..43fb761f 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ lint: test -s $(GOLANGCI_LINT) || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(LOCALBIN) $(GOLANGCI_LINT_VERSION) CGO_ENABLED=0 $(GOLANGCI_LINT) run --timeout 5m -GINKGO_VERSION ?= v2.15.0 +GINKGO_VERSION ?= v2.17.1 GINKGO_TIMEOUT ?= 2h .PHONY: getginkgo diff --git a/go.mod b/go.mod index f045e564..eb9562a1 100644 --- a/go.mod +++ b/go.mod @@ -3,130 +3,137 @@ module kubevirt.io/containerdisks go 1.21 replace ( - // Fixed to versions v0.26.x for kubevirt.io/client-go v1.1.x - k8s.io/api => k8s.io/api v0.26.13 - k8s.io/apimachinery => k8s.io/apimachinery v0.26.13 - k8s.io/client-go => k8s.io/client-go v0.26.13 + // Fixed to versions v0.26.x for kubevirt.io/client-go v1.2.x + k8s.io/api => k8s.io/api v0.26.15 + k8s.io/client-go => k8s.io/client-go v0.26.15 ) require ( - github.com/containers/image/v5 v5.29.1 + github.com/containers/image/v5 v5.30.0 github.com/docker/distribution v2.8.3+incompatible - github.com/google/go-containerregistry v0.18.0 - github.com/onsi/ginkgo/v2 v2.15.0 - github.com/onsi/gomega v1.31.1 + github.com/google/go-containerregistry v0.19.1 + github.com/onsi/ginkgo/v2 v2.17.1 + github.com/onsi/gomega v1.32.0 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/ulikunitz/xz v0.5.11 - golang.org/x/crypto v0.18.0 + golang.org/x/crypto v0.21.0 golang.org/x/text v0.14.0 - k8s.io/api v0.29.0 - k8s.io/apimachinery v0.28.0-alpha.1 - k8s.io/utils v0.0.0-20240102154912-e7106e64919e - kubevirt.io/api v1.1.1 - kubevirt.io/client-go v1.1.1 + k8s.io/api v0.29.3 + k8s.io/apimachinery v0.29.3 + k8s.io/utils v0.0.0-20240310230437-4693a0247e57 + kubevirt.io/api v1.2.0 + kubevirt.io/client-go v1.2.0 sigs.k8s.io/yaml v1.4.0 ) require ( dario.cat/mergo v1.0.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.12.0-rc.1 // indirect - github.com/containerd/cgroups/v3 v3.0.2 // indirect - github.com/containerd/containerd v1.7.12 // indirect + github.com/Microsoft/hcsshim v0.12.1 // indirect + github.com/containerd/cgroups/v3 v3.0.3 // indirect + github.com/containerd/errdefs v0.1.0 // indirect github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect - github.com/containers/ocicrypt v1.1.9 // indirect - github.com/containers/storage v1.51.0 // indirect - github.com/coreos/prometheus-operator v0.38.3 // indirect + github.com/containers/ocicrypt v1.1.10 // indirect + github.com/containers/storage v1.53.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.5.0 // indirect - github.com/docker/cli v24.0.7+incompatible // indirect - github.com/docker/docker v24.0.7+incompatible // indirect - github.com/docker/docker-credential-helpers v0.8.0 // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/cli v26.0.0+incompatible // indirect + github.com/docker/docker v26.0.0+incompatible // indirect + github.com/docker/docker-credential-helpers v0.8.1 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/go-kit/kit v0.10.0 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.3.0 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // 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.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // 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.1.0 // indirect + github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic v0.7.0 // indirect + github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-intervals v0.0.2 // 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/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/imdario/mergo v0.3.15 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // 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/klauspost/compress v1.17.3 // indirect + github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.6.0 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mistifyio/go-zfs/v3 v3.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/sys/mountinfo v0.7.1 // indirect + github.com/moby/sys/user v0.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect - github.com/opencontainers/runc v1.1.10 // indirect - github.com/opencontainers/runtime-spec v1.1.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opencontainers/selinux v1.11.0 // indirect - github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183 // indirect - github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47 // indirect + github.com/openshift/api v0.0.0-20240323003854-2252c7adfb79 // indirect + github.com/openshift/client-go v0.0.0-20240312121557-60dd5f9fbf8d // indirect github.com/openshift/custom-resource-status v1.1.2 // indirect github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f // indirect - github.com/pborman/uuid v1.2.1 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.72.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/sylabs/sif/v2 v2.15.0 // indirect + github.com/sylabs/sif/v2 v2.16.0 // indirect github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect github.com/tchap/go-patricia/v2 v2.3.1 // indirect github.com/vbatts/tar-split v0.11.5 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.16.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.19.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/grpc v1.58.3 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.33.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.26.4 // indirect + k8s.io/apiextensions-apiserver v0.29.3 // indirect k8s.io/client-go v12.0.0+incompatible // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 // 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 + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20240322212309-b815d8309940 // indirect + kubevirt.io/containerized-data-importer-api v1.58.3 // indirect + kubevirt.io/controller-lifecycle-operator-sdk/api v0.2.4 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index 67774e7e..0447e27a 100644 --- a/go.sum +++ b/go.sum @@ -1,417 +1,801 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/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.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= 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= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +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 v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= 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= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= 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/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= 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= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= +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= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= -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-sdk-for-go v41.3.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-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -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/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.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -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.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -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/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/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -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.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -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/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.12.0-rc.1 h1:Hy+xzYujv7urO5wrgcG58SPMOXNLrj4WCJbySs2XX/A= -github.com/Microsoft/hcsshim v0.12.0-rc.1/go.mod h1:Y1a1S0QlYp1mBpyvGiuEdOfZqnao+0uX5AWHXQ5NhZU= +github.com/Microsoft/hcsshim v0.12.1 h1:qbmS+ZplURcyTJi8IseYDay+FdDdtHqtjxg5e4/PlPw= +github.com/Microsoft/hcsshim v0.12.1/go.mod h1:RZV12pcHCXQ42XnlQ3pz6FZfmrC1C+R4gaOHhRNML1g= 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/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/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/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -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/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.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-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -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/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= -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 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 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/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/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -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/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= 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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/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/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= 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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= -github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= -github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= -github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +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/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= +github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containers/image/v5 v5.29.1 h1:9COTXQpl3FgrW/jw/roLAWlW4TN9ly7/bCAKY76wYl8= -github.com/containers/image/v5 v5.29.1/go.mod h1:kQ7qcDsps424ZAz24thD+x7+dJw1vgur3A9tTDsj97E= +github.com/containers/image/v5 v5.30.0 h1:CmHeSwI6W2kTRWnUsxATDFY5TEX4b58gPkaQcEyrLIA= +github.com/containers/image/v5 v5.30.0/go.mod h1:gSD8MVOyqBspc0ynLsuiMR9qmt8UQ4jpVImjmK0uXfk= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= -github.com/containers/ocicrypt v1.1.9 h1:2Csfba4jse85Raxk5HIyEk8OwZNjRvfkhEGijOjIdEM= -github.com/containers/ocicrypt v1.1.9/go.mod h1:dTKx1918d8TDkxXvarscpNVY+lyPakPNFN4jwA9GBys= -github.com/containers/storage v1.51.0 h1:AowbcpiWXzAjHosKz7MKvPEqpyX+ryZA/ZurytRrFNA= -github.com/containers/storage v1.51.0/go.mod h1:ybl8a3j1PPtpyaEi/5A6TOFs+5TrEyObeKJzVtkUlfc= -github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+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/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/prometheus-operator v0.38.3 h1:EaiEJFZ6uEV5PcuvZ272kB3Z/Ki8kViMeVhMDKYx7jI= -github.com/coreos/prometheus-operator v0.38.3/go.mod h1:nHyLLa5yyGbUNTcRXIbofXLsrg90aIxt2HQp5tT9Fy0= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/containers/ocicrypt v1.1.10 h1:r7UR6o8+lyhkEywetubUUgcKFjOWOaWz8cEBrCPX0ic= +github.com/containers/ocicrypt v1.1.10/go.mod h1:YfzSSr06PTHQwSTUKqDSjish9BeW1E4HUmreluQcMd8= +github.com/containers/storage v1.53.0 h1:VSES3C/u1pxjTJIXvLrSmyP7OBtDky04oGu07UvdTEA= +github.com/containers/storage v1.53.0/go.mod h1:pujcoOSc+upx15Jirdkebhtd8uJiLwbSd/mYT6zDJK8= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -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/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -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-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +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/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= -github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v26.0.0+incompatible h1:90BKrx1a1HKYpSnnBFR6AgDq/FqkHxwlUyzJVPxD30I= +github.com/docker/cli v26.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= -github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/docker v26.0.0+incompatible h1:Ng2qi+gdKADUa/VM+6b6YaY2nlZhk/lVJiKR/2bMudU= +github.com/docker/docker v26.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= +github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -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/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= 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/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -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-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/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.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.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/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= 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/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 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/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 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/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= 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/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -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/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +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-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +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.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -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.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= -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/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 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/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= 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/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/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= 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/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.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= -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/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= 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/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -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/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= 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.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -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-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.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -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.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= 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/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -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/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 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/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -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-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= 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 h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -420,14 +804,17 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +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= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -438,216 +825,156 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/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/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic v0.7.0 h1:d7EpuFp8vVdML+y0JJJYiKeOLjKTdH/GvVkLOBWqJpw= +github.com/google/gnostic v0.7.0/go.mod h1:IAcUyMl6vtC95f60EZ8oXyqTsOersP6HbwjeG7EyDPM= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= 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= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.18.0 h1:ShE7erKNPqRh5ue6Z9DUOlk04WsnFWPO6YGr3OxnfoQ= -github.com/google/go-containerregistry v0.18.0/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ= +github.com/google/go-containerregistry v0.19.1 h1:yMQ62Al6/V0Z7CqIrrS1iYoA5/oQCm88DeNujc7C1KY= +github.com/google/go-containerregistry v0.19.1/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI= github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM= github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= -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/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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= 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-20200417002340-c6e0a841f49a/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-20201218002935-b9804c9f04c2/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/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/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/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -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.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= 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-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.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= 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/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/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= -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.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= 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/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= 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/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= 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.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-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.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.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -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/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= -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/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.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-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -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-immutable-radix v1.2.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-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -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-rootcerts v1.0.2/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.2.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/golang-lru v0.5.4/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/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -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/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -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/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= 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.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= -github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +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/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY= -github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -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/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 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.9/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.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/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -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/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.6.0 h1:BT3ghAY0q7lWib9rz+tVXDFkm27dJV6SLCn7TunZwo4= +github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.6.0/go.mod h1:wxt2YWRVItDtaQmVSmaN5ubE2L1c9CiNoHQwSJnM8Ko= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -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.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= 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.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 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= @@ -655,123 +982,57 @@ 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/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -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/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= 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.1/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/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -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-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -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-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/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/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/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/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -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/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= -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 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 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.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -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/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= 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/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= 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/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -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/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -781,11 +1042,9 @@ github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47 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.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= 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= @@ -796,188 +1055,83 @@ github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeR 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.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= -github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= -github.com/openshift/api v0.0.0-20210105115604-44119421ec6b/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg= -github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183 h1:t/CahSnpqY46sQR01SoS+Jt0jtjgmhgE6lFmRnO4q70= -github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183/go.mod h1:4VWG+W22wrB4HfBL88P40DxLEpSOaiBVxUnfalfJo9k= -github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= -github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47 h1:+TEY29DK0XhqB7HFC9OfV8qf3wffSyi7MWv3AP28DGQ= -github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47/go.mod h1:u7NRAjtYVAKokiI9LouzTv4mhds8P4S1TwdVAfbjKSk= +github.com/openshift/api v0.0.0-20240323003854-2252c7adfb79 h1:ShXEPrqDUU9rUbvoIhOmQI8D6yHQdklMUks9ZVILTNE= +github.com/openshift/api v0.0.0-20240323003854-2252c7adfb79/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= +github.com/openshift/client-go v0.0.0-20240312121557-60dd5f9fbf8d h1:vdrC3QYkFcs6a1Cz2/p5RcV7dMQ22tbgIonx+8HIJc0= +github.com/openshift/client-go v0.0.0-20240312121557-60dd5f9fbf8d/go.mod h1:Y5Hp789dTrF6Fq8cA5YQlpwffmlLy8mc2un/CY0cg7Q= 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/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -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.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f h1:/UDgs8FGMqwnHagNDPGOlts35QkhAZ8by3DR7nMih7M= github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -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/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -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/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -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/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -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/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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 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.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.72.0 h1:9h7PxMhT1S8lOdadEKJnBh3ELMdO60XkoDV98grYjuM= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.72.0/go.mod h1:4FiLCL664L4dNGeqZewiiD0NS7hhqi/CxyM4UOq5dfM= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -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.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -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.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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -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 v1.8.2-0.20200507164740-ecee9c8abfd1/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= -github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -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/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday/v2 v2.1.0/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/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -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.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -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/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= 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/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/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/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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/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 v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -987,124 +1141,102 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/sylabs/sif/v2 v2.15.0 h1:Nv0tzksFnoQiQ2eUwpAis9nVqEu4c3RcNSxX8P3Cecw= -github.com/sylabs/sif/v2 v2.15.0/go.mod h1:X1H7eaPz6BAxA84POMESXoXfTqgAnLQkujyF/CQFWTc= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/sylabs/sif/v2 v2.16.0 h1:2eqaBaQQsn5DZTzm3QZm0HupZQEjNXfxRnCmtyCihEU= +github.com/sylabs/sif/v2 v2.16.0/go.mod h1:d5TxgD/mhMUU3kWLmZmWJQ99Wg0asaTP0bq3ezR1xpg= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= -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/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/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-client-go v2.23.0+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/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -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/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= 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= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -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.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -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.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= 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.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -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.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= -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.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -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= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= 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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 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-20190530122614-20be4c3c3ed5/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-20190701094942-4def268fd1a4/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-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 h1:6R2FC06FonbXQ8pK11/PDFY6N6LWlf9KlzibaCapmqc= +golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1115,6 +1247,8 @@ 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= @@ -1123,197 +1257,245 @@ 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.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= 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.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20191126235420-ef20fe5d7933/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= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/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-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/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-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/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-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -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.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/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-20190531175056-4c3a928424d2/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-20191008105621-543471e840be/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-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/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-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/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-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/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-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-20210423185535-09eb48e85fd7/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-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/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-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/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-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/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-20220128215802-99c3d69c2c27/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-20220227234510-4e6760a101f9/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-20220328115105-d36c6a25d886/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-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/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-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= 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= @@ -1323,67 +1505,51 @@ 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.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.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.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 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-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-20190927191325-030b2cf1153e/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-20191029190741-b9c20aec41a5/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-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= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1391,36 +1557,60 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200422205258-72e4a01eba43/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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-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= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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-20201124115921-2c860bdd6e78/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.0.0-20210108195828-e2f9c7f1fc8e/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.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/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.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= 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= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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= @@ -1430,11 +1620,55 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +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.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1448,48 +1682,186 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn 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= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +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-20200420144010-e5e8543f8aeb/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/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +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-20210108203827-ffc7fda8c3d7/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-20210226172003-ab064af71705/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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= 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= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +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.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +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.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -1504,43 +1876,30 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 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.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= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -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/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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -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.7/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= @@ -1548,100 +1907,101 @@ 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 h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= 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= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -k8s.io/api v0.26.13 h1:65j5feDeimcvWLjxYyiSmCpQrV4cArU3DJQjAtPOmos= -k8s.io/api v0.26.13/go.mod h1:VXIh4xfQZf+gHowQ43lFgohkElTBwZ8hQjikp1Bkm2c= -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.26.4 h1:9D2RTxYGxrG5uYg6D7QZRcykXvavBvcA59j5kTaedQI= -k8s.io/apiextensions-apiserver v0.26.4/go.mod h1:cd4uGFGIgzEqUghWpRsr9KE8j2KNTjY8Ji8pnMMazyw= -k8s.io/apimachinery v0.26.13 h1:gTwNkZp+qrfZuhQFMD594ggzvcr06mbgAtLBTbdc4Mg= -k8s.io/apimachinery v0.26.13/go.mod h1:2/HZp0l6coXtS26du1Bk36fCuAEr/lVs9Q9NbpBtd1Y= -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/client-go v0.26.13 h1:KBIXrz1Rbkuq586BOWoGuNi79pGJM4uAbYg8F83u0Vk= -k8s.io/client-go v0.26.13/go.mod h1:Cc2v7fVnJ1a9wj11fv12fhoFIjqbZT/Ksono6bK0iw8= -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= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.26.15 h1:tjMERUjIwkq+2UtPZL5ZbSsLkpxUv4gXWZfV5lQl+Og= +k8s.io/api v0.26.15/go.mod h1:CtWOrFl8VLCTLolRlhbBxo4fy83tjCLEtYa5pMubIe0= +k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI= +k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.23.3/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apimachinery v0.26.15/go.mod h1:O/uIhIOWuy6ndHqQ6qbkjD7OgeMhVtlk8+Z66ZcmJQc= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/client-go v0.26.15 h1:A2Yav2v+VZQfpEsf5ESFp2Lqq5XACKBDrwkG+jEtOg0= +k8s.io/client-go v0.26.15/go.mod h1:KJs7snLEyKPlypqTQG/ngcaqE6h3/6qTvVHDViRL+iI= k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.20.0/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/code-generator v0.23.3/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/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-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 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.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.4.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/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kube-openapi v0.0.0-20181114233023-0317810137be/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -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/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 h1:OmK1d0WrkD3IPfkskvroRykOulHVHf0s0ZIFRjyt+UI= -k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515/go.mod h1:kzo02I3kQ4BTtEfVLaPbjvCkX97YqGve33wzlb3fofQ= -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/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/kube-openapi v0.0.0-20240322212309-b815d8309940 h1:qVoMaQV5t62UUvHe16Q3eb2c5HPzLHYzsi0Tu/xLndo= +k8s.io/kube-openapi v0.0.0-20240322212309-b815d8309940/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ= -k8s.io/utils v0.0.0-20240102154912-e7106e64919e/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.1 h1:X/fk9kLW65aHRM3GW71UIzXLZsALPoggt4786yLYz1g= -kubevirt.io/client-go v1.1.1/go.mod h1:ZsE3LucLRzbkK/Mc7rhTArCgVifZt7BeNSW2WOGiCm4= -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= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0gQBEuevE/AaBsHY= +k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +kubevirt.io/api v1.2.0 h1:1f8XQLPl4BuHPsc6SHTPnYSYeDxucKCQGa8CdrGJSRc= +kubevirt.io/api v1.2.0/go.mod h1:SbeR9ma4EwnaOZEUkh/lNz0kzYm5LPpEDE30vKXC5Zg= +kubevirt.io/client-go v1.2.0 h1:KniuG2wse98++ecRCWTZEl0wLZAQiRn+HdvzlpyekgA= +kubevirt.io/client-go v1.2.0/go.mod h1:ib4Ewy6u/+4J7w79mz0rxaJjsAbPvzJjYWQqGsrN7pM= +kubevirt.io/containerized-data-importer-api v1.58.3 h1:gTccZSu7CTD/wswbm68AUlz9YThz/5SsdLK1Htt7uL8= +kubevirt.io/containerized-data-importer-api v1.58.3/go.mod h1:Y/8ETgHS1GjO89bl682DPtQOYEU/1ctPFBz6Sjxm4DM= +kubevirt.io/controller-lifecycle-operator-sdk/api v0.2.4 h1:fZYvD3/Vnitfkx6IJxjLAk8ugnZQ7CXVYcRfkSKmuZY= +kubevirt.io/controller-lifecycle-operator-sdk/api v0.2.4/go.mod h1:018lASpFYBsYN6XwmA2TIrPCx6e0gviTd/ZNtSitKgc= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= +sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= 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 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.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= @@ -1653,4 +2013,3 @@ sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/vendor/github.com/Microsoft/hcsshim/.golangci.yml b/vendor/github.com/Microsoft/hcsshim/.golangci.yml index abe77f57..7d38a2fb 100644 --- a/vendor/github.com/Microsoft/hcsshim/.golangci.yml +++ b/vendor/github.com/Microsoft/hcsshim/.golangci.yml @@ -20,6 +20,7 @@ linters: # - typecheck # - unused + - errorlint # error wrapping (eg, not using `errors.Is`, using `%s` instead of `%w` in `fmt.Errorf`) - gofmt # whether code was gofmt-ed - govet # enabled by default, but just to be sure - nolintlint # ill-formed or insufficient nolint directives @@ -53,6 +54,12 @@ issues: text: "^ST1003: should not use underscores in package names$" source: "^package cri_containerd$" + # don't bother with propper error wrapping in test code + - path: cri-containerd + linters: + - errorlint + text: "non-wrapping format verb for fmt.Errorf" + # This repo has a LOT of generated schema files, operating system bindings, and other # things that ST1003 from stylecheck won't like (screaming case Windows api constants for example). # There's also some structs that we *could* change the initialisms to be Go friendly diff --git a/vendor/github.com/Microsoft/hcsshim/Makefile b/vendor/github.com/Microsoft/hcsshim/Makefile index d8eb30b8..de643589 100644 --- a/vendor/github.com/Microsoft/hcsshim/Makefile +++ b/vendor/github.com/Microsoft/hcsshim/Makefile @@ -29,12 +29,23 @@ ifeq "$(DEV_BUILD)" "1" DELTA_TARGET=out/delta-dev.tar.gz endif +ifeq "$(SNP_BUILD)" "1" +DELTA_TARGET=out/delta-snp.tar.gz +endif + # The link aliases for gcstools GCS_TOOLS=\ generichook \ install-drivers -.PHONY: all always rootfs test +# Common path prefix. +PATH_PREFIX:= +# These have PATH_PREFIX prepended to obtain the full path in recipies e.g. $(PATH_PREFIX)/$(VMGS_TOOL) +VMGS_TOOL:= +IGVM_TOOL:= +KERNEL_PATH:= + +.PHONY: all always rootfs test snp simple .DEFAULT_GOAL := all @@ -49,9 +60,58 @@ test: rootfs: out/rootfs.vhd -out/rootfs.vhd: out/rootfs.tar.gz bin/cmd/tar2ext4 +snp: out/kernelinitrd.vmgs out/rootfs.hash.vhd out/rootfs.vhd out/v2056.vmgs + +simple: out/simple.vmgs snp + +%.vmgs: %.bin + rm -f $@ + # du -BM returns the size of the bin file in M, eg 7M. The sed command replaces the M with *1024*1024 and then bc does the math to convert to bytes + $(PATH_PREFIX)/$(VMGS_TOOL) create --filepath $@ --filesize `du -BM $< | sed "s/M.*/*1024*1024/" | bc` + $(PATH_PREFIX)/$(VMGS_TOOL) write --filepath $@ --datapath $< -i=8 + +# Simplest debug UVM used to test changes to the linux kernel. No dmverity protection. Boots an initramdisk rather than directly booting a vhd disk. +out/simple.bin: out/initrd.img $(PATH_PREFIX)/$(KERNEL_PATH) boot/startup_simple.sh + rm -f $@ + python3 $(PATH_PREFIX)/$(IGVM_TOOL) -o $@ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=7 rdinit=/startup_simple.sh" -rdinit out/initrd.img -vtl 0 + +ROOTFS_DEVICE:=/dev/sda +VERITY_DEVICE:=/dev/sdb +# Debug build for use with uvmtester. UVM with dm-verity protected vhd disk mounted directly via the kernel command line. Ignores corruption in dm-verity protected disk. (Use dmesg to see if dm-verity is ignoring data corruption.) +out/v2056.bin: out/rootfs.vhd out/rootfs.hash.vhd $(PATH_PREFIX)/$(KERNEL_PATH) out/rootfs.hash.datasectors out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt boot/startup_v2056.sh + rm -f $@ + python3 $(PATH_PREFIX)/$(IGVM_TOOL) -o $@ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=7 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(VERITY_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) 0 sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt) 1 ignore_corruption\" init=/startup_v2056.sh" -vtl 0 + +# Full UVM with dm-verity protected vhd disk mounted directly via the kernel command line. +out/kernelinitrd.bin: out/rootfs.vhd out/rootfs.hash.vhd out/rootfs.hash.datasectors out/rootfs.hash.datablocksize out/rootfs.hash.hashblocksize out/rootfs.hash.datablocks out/rootfs.hash.rootdigest out/rootfs.hash.salt $(PATH_PREFIX)/$(KERNEL_PATH) boot/startup.sh + rm -f $@ + python3 $(PATH_PREFIX)/$(IGVM_TOOL) -o $@ -kernel $(PATH_PREFIX)/$(KERNEL_PATH) -append "8250_core.nr_uarts=0 panic=-1 debug loglevel=7 root=/dev/dm-0 dm-mod.create=\"dmverity,,,ro,0 $(shell cat out/rootfs.hash.datasectors) verity 1 $(ROOTFS_DEVICE) $(VERITY_DEVICE) $(shell cat out/rootfs.hash.datablocksize) $(shell cat out/rootfs.hash.hashblocksize) $(shell cat out/rootfs.hash.datablocks) 0 sha256 $(shell cat out/rootfs.hash.rootdigest) $(shell cat out/rootfs.hash.salt)\" init=/startup.sh" -vtl 0 + +# Rule to make a vhd from a file. This is used to create the rootfs.hash.vhd from rootfs.hash. +%.vhd: % bin/cmd/tar2ext4 + ./bin/cmd/tar2ext4 -only-vhd -i $< -o $@ + +# Rule to make a vhd from an ext4 file. This is used to create the rootfs.vhd from rootfs.ext4. +%.vhd: %.ext4 bin/cmd/tar2ext4 + ./bin/cmd/tar2ext4 -only-vhd -i $< -o $@ + +%.hash %.hash.info %.hash.datablocks %.hash.rootdigest %hash.datablocksize %.hash.datasectors %.hash.hashblocksize: %.ext4 %.hash.salt + veritysetup format --no-superblock --salt $(shell cat out/rootfs.hash.salt) $< $*.hash > $*.hash.info + # Retrieve info required by dm-verity at boot time + # Get the blocksize of rootfs + cat $*.hash.info | awk '/^Root hash:/{ print $$3 }' > $*.hash.rootdigest + cat $*.hash.info | awk '/^Salt:/{ print $$2 }' > $*.hash.salt + cat $*.hash.info | awk '/^Data block size:/{ print $$4 }' > $*.hash.datablocksize + cat $*.hash.info | awk '/^Hash block size:/{ print $$4 }' > $*.hash.hashblocksize + cat $*.hash.info | awk '/^Data blocks:/{ print $$3 }' > $*.hash.datablocks + echo $$(( $$(cat $*.hash.datablocks) * $$(cat $*.hash.datablocksize) / 512 )) > $*.hash.datasectors + +out/rootfs.hash.salt: + hexdump -vn32 -e'8/4 "%08X" 1 "\n"' /dev/random > $@ + +out/rootfs.ext4: out/rootfs.tar.gz bin/cmd/tar2ext4 gzip -f -d ./out/rootfs.tar.gz - bin/cmd/tar2ext4 -vhd -i ./out/rootfs.tar -o $@ + ./bin/cmd/tar2ext4 -i ./out/rootfs.tar -o $@ out/rootfs.tar.gz: out/initrd.img rm -rf rootfs-conv @@ -74,6 +134,20 @@ out/delta-dev.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report tar -zcf $@ -C rootfs-dev . rm -rf rootfs-dev +out/delta-snp.tar.gz: out/delta.tar.gz bin/internal/tools/snp-report boot/startup_v2056.sh boot/startup_simple.sh boot/startup.sh + rm -rf rootfs-snp + mkdir rootfs-snp + tar -xzf out/delta.tar.gz -C rootfs-snp + cp boot/startup_v2056.sh rootfs-snp/startup_v2056.sh + cp boot/startup_simple.sh rootfs-snp/startup_simple.sh + cp boot/startup.sh rootfs-snp/startup.sh + cp bin/internal/tools/snp-report rootfs-snp/bin/ + chmod a+x rootfs-snp/startup_v2056.sh + chmod a+x rootfs-snp/startup_simple.sh + chmod a+x rootfs-snp/startup.sh + tar -zcf $@ -C rootfs-snp . + rm -rf rootfs-snp + out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths Makefile @mkdir -p out rm -rf rootfs @@ -94,7 +168,10 @@ out/delta.tar.gz: bin/init bin/vsockexec bin/cmd/gcs bin/cmd/gcstools bin/cmd/ho tar -zcf $@ -C rootfs . rm -rf rootfs -bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths bin/cmd/tar2ext4 bin/internal/tools/snp-report: +out/containerd-shim-runhcs-v1.exe: + GOOS=windows $(GO_BUILD) -o $@ $(SRCROOT)/cmd/containerd-shim-runhcs-v1 + +bin/cmd/gcs bin/cmd/gcstools bin/cmd/hooks/wait-paths bin/cmd/tar2ext4 bin/internal/tools/snp-report bin/cmd/dmverity-vhd: @mkdir -p $(dir $@) GOOS=linux $(GO_BUILD) -o $@ $(SRCROOT)/$(@:bin/%=%) @@ -108,4 +185,4 @@ bin/init: init/init.o vsockexec/vsock.o %.o: %.c @mkdir -p $(dir $@) - $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< + $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< \ No newline at end of file diff --git a/vendor/github.com/Microsoft/hcsshim/README.md b/vendor/github.com/Microsoft/hcsshim/README.md index 5a136153..32043804 100644 --- a/vendor/github.com/Microsoft/hcsshim/README.md +++ b/vendor/github.com/Microsoft/hcsshim/README.md @@ -9,15 +9,18 @@ It is primarily used in the [Moby](https://github.com/moby/moby) and [Containerd ## Building While this repository can be used as a library of sorts to call the HCS apis, there are a couple binaries built out of the repository as well. The main ones being the Linux guest agent, and an implementation of the [runtime v2 containerd shim api](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md). + ### Linux Hyper-V Container Guest Agent To build the Linux guest agent itself all that's needed is to set your GOOS to "Linux" and build out of ./cmd/gcs. + ```powershell C:\> $env:GOOS="linux" C:\> go build .\cmd\gcs\ ``` or on a Linux machine + ```sh > go build ./cmd/gcs ``` @@ -33,13 +36,15 @@ make all ``` If the build is successful, in the `./out` folder you should see: + ```sh > ls ./out/ delta.tar.gz initrd.img rootfs.tar.gz ``` ### Containerd Shim -For info on the Runtime V2 API: https://github.com/containerd/containerd/blob/master/runtime/v2/README.md. + +For info on the [Runtime V2 API](https://github.com/containerd/containerd/blob/master/runtime/v2/README.md). Contrary to the typical Linux architecture of shim -> runc, the runhcs shim is used both to launch and manage the lifetime of containers. @@ -48,7 +53,9 @@ C:\> $env:GOOS="windows" C:\> go build .\cmd\containerd-shim-runhcs-v1 ``` -Then place the binary in the same directory that Containerd is located at in your environment. A default Containerd configuration file can be generated by running: +Then place the binary in the same directory that Containerd is located at in your environment. +A default Containerd configuration file can be generated by running: + ```powershell .\containerd.exe config default | Out-File "C:\Program Files\containerd\config.toml" -Encoding ascii ``` @@ -56,6 +63,7 @@ Then place the binary in the same directory that Containerd is located at in you This config file will already have the shim set as the default runtime for cri interactions. To trial using the shim out with ctr.exe: + ```powershell C:\> ctr.exe run --runtime io.containerd.runhcs.v1 --rm mcr.microsoft.com/windows/nanoserver:2004 windows-test cmd /c "echo Hello World!" ``` @@ -64,16 +72,69 @@ C:\> ctr.exe run --runtime io.containerd.runhcs.v1 --rm mcr.microsoft.com/window This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.microsoft.com. +the rights to use your contribution. For details, visit [Microsoft CLA](https://cla.microsoft.com). When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. -We also require that contributors [sign their commits](https://git-scm.com/docs/git-commit) using `git commit -s` or `git commit --signoff` to -certify they either authored the work themselves or otherwise have permission to use it in this project. Please see https://developercertificate.org/ for -more info, as well as to make sure that you can attest to the rules listed. Our CI uses the [DCO Github app](https://github.com/apps/dco) to ensure -that all commits in a given PR are signed-off. +We require that contributors sign their commits +to certify they either authored the work themselves or otherwise have permission to use it in this project. + +We also require that contributors sign their commits using using [`git commit --signoff`][git-commit-s] +to certify they either authored the work themselves or otherwise have permission to use it in this project. +A range of commits can be signed off using [`git rebase --signoff`][git-rebase-s]. + +Please see [the developer certificate](https://developercertificate.org) for more info, +as well as to make sure that you can attest to the rules listed. +Our CI uses the [DCO Github app](https://github.com/apps/dco) to ensure that all commits in a given PR are signed-off. + +### Linting + +Code must pass a linting stage, which uses [`golangci-lint`][lint]. +Since `./test` is a separate Go module, the linter is run from both the root and the +`test` directories. Additionally, the linter is run with `GOOS` set to both `windows` and +`linux`. + +The linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run +automatically with VSCode by adding the following to your workspace or folder settings: + +```json + "go.lintTool": "golangci-lint", + "go.lintOnSave": "package", +``` + +Additional editor [integrations options are also available][lint-ide]. + +Alternatively, `golangci-lint` can be [installed][lint-install] and run locally: + +```shell +# use . or specify a path to only lint a package +# to show all lint errors, use flags "--max-issues-per-linter=0 --max-same-issues=0" +> golangci-lint run +``` + +To run across the entire repo for both `GOOS=windows` and `linux`: + +```powershell +> foreach ( $goos in ('windows', 'linux') ) { + foreach ( $repo in ('.', 'test') ) { + pwsh -Command "cd $repo && go env -w GOOS=$goos && golangci-lint.exe run --verbose" + } +} +``` + +### Go Generate + +The pipeline checks that auto-generated code, via `go generate`, are up to date. +Similar to the [linting stage](#linting), `go generate` is run in both the root and test Go modules. + +This can be done via: + +```shell +> go generate ./... +> cd test && go generate ./... +``` ## Code of Conduct @@ -83,7 +144,7 @@ contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additio ## Dependencies -This project requires Golang 1.17 or newer to build. +This project requires Golang 1.18 or newer to build. For system requirements to run this project, see the Microsoft docs on [Windows Container requirements](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/system-requirements). @@ -100,3 +161,10 @@ For additional details, see [Report a Computer Security Vulnerability](https://t --------------- Copyright (c) 2018 Microsoft Corp. All rights reserved. + +[lint]: https://golangci-lint.run/ +[lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration +[lint-install]: https://golangci-lint.run/usage/install/#local-installation + +[git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s +[git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go b/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go index 54c4b3bc..301a1088 100644 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/attach.go @@ -38,3 +38,31 @@ func AttachLayerStorageFilter(ctx context.Context, layerPath string, layerData L } return nil } + +// AttachOverlayFilter sets up a filter of the given type on a writable container layer. Currently the only +// supported filter types are WCIFS & UnionFS (defined in internal/hcs/schema2/layer.go) +// +// `volumePath` is volume path at which writable layer is mounted. If the +// path does not end in a `\` the platform will append it automatically. +// +// `layerData` is the parent read-only layer data. +func AttachOverlayFilter(ctx context.Context, volumePath string, layerData LayerData) (err error) { + title := "hcsshim::AttachOverlayFilter" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes( + trace.StringAttribute("volumePath", volumePath), + ) + + bytes, err := json.Marshal(layerData) + if err != nil { + return err + } + + err = hcsAttachOverlayFilter(volumePath, string(bytes)) + if err != nil { + return errors.Wrap(err, "failed to attach overlay filter") + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go b/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go index daf1bfff..6e00e4a1 100644 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/detach.go @@ -4,7 +4,9 @@ package computestorage import ( "context" + "encoding/json" + hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2" "github.com/Microsoft/hcsshim/internal/oc" "github.com/pkg/errors" "go.opencensus.io/trace" @@ -26,3 +28,27 @@ func DetachLayerStorageFilter(ctx context.Context, layerPath string) (err error) } return nil } + +// DetachOverlayFilter detaches the filter on a writable container layer. +// +// `volumePath` is a path to writable container volume. +func DetachOverlayFilter(ctx context.Context, volumePath string, filterType hcsschema.FileSystemFilterType) (err error) { + title := "hcsshim::DetachOverlayFilter" + ctx, span := oc.StartSpan(ctx, title) //nolint:ineffassign,staticcheck + defer span.End() + defer func() { oc.SetSpanStatus(span, err) }() + span.AddAttributes(trace.StringAttribute("volumePath", volumePath)) + + layerData := LayerData{} + layerData.FilterType = filterType + bytes, err := json.Marshal(layerData) + if err != nil { + return err + } + + err = hcsDetachOverlayFilter(volumePath, string(bytes)) + if err != nil { + return errors.Wrap(err, "failed to detach overlay filter") + } + return nil +} diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go b/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go index c38d3aa5..5af931f2 100644 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/storage.go @@ -19,14 +19,17 @@ import ( //sys hcsFormatWritableLayerVhd(handle windows.Handle) (hr error) = computestorage.HcsFormatWritableLayerVhd? //sys hcsGetLayerVhdMountPath(vhdHandle windows.Handle, mountPath **uint16) (hr error) = computestorage.HcsGetLayerVhdMountPath? //sys hcsSetupBaseOSVolume(layerPath string, volumePath string, options string) (hr error) = computestorage.HcsSetupBaseOSVolume? +//sys hcsAttachOverlayFilter(volumePath string, layerData string) (hr error) = computestorage.HcsAttachOverlayFilter? +//sys hcsDetachOverlayFilter(volumePath string, layerData string) (hr error) = computestorage.HcsDetachOverlayFilter? type Version = hcsschema.Version type Layer = hcsschema.Layer // LayerData is the data used to describe parent layer information. type LayerData struct { - SchemaVersion Version `json:"SchemaVersion,omitempty"` - Layers []Layer `json:"Layers,omitempty"` + SchemaVersion Version `json:"SchemaVersion,omitempty"` + Layers []Layer `json:"Layers,omitempty"` + FilterType hcsschema.FileSystemFilterType `json:"FilterType,omitempty"` } // ExportLayerOptions are the set of options that are used with the `computestorage.HcsExportLayer` syscall. diff --git a/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go index b996b35e..53d0beb8 100644 --- a/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go +++ b/vendor/github.com/Microsoft/hcsshim/computestorage/zsyscall_windows.go @@ -43,8 +43,10 @@ var ( modcomputestorage = windows.NewLazySystemDLL("computestorage.dll") procHcsAttachLayerStorageFilter = modcomputestorage.NewProc("HcsAttachLayerStorageFilter") + procHcsAttachOverlayFilter = modcomputestorage.NewProc("HcsAttachOverlayFilter") procHcsDestroyLayer = modcomputestorage.NewProc("HcsDestroyLayer") procHcsDetachLayerStorageFilter = modcomputestorage.NewProc("HcsDetachLayerStorageFilter") + procHcsDetachOverlayFilter = modcomputestorage.NewProc("HcsDetachOverlayFilter") procHcsExportLayer = modcomputestorage.NewProc("HcsExportLayer") procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd") procHcsGetLayerVhdMountPath = modcomputestorage.NewProc("HcsGetLayerVhdMountPath") @@ -83,6 +85,35 @@ func _hcsAttachLayerStorageFilter(layerPath *uint16, layerData *uint16) (hr erro return } +func hcsAttachOverlayFilter(volumePath string, layerData string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(volumePath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + return _hcsAttachOverlayFilter(_p0, _p1) +} + +func _hcsAttachOverlayFilter(volumePath *uint16, layerData *uint16) (hr error) { + hr = procHcsAttachOverlayFilter.Find() + if hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsAttachOverlayFilter.Addr(), 2, uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(layerData)), 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + func hcsDestroyLayer(layerPath string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) @@ -131,6 +162,35 @@ func _hcsDetachLayerStorageFilter(layerPath *uint16) (hr error) { return } +func hcsDetachOverlayFilter(volumePath string, layerData string) (hr error) { + var _p0 *uint16 + _p0, hr = syscall.UTF16PtrFromString(volumePath) + if hr != nil { + return + } + var _p1 *uint16 + _p1, hr = syscall.UTF16PtrFromString(layerData) + if hr != nil { + return + } + return _hcsDetachOverlayFilter(_p0, _p1) +} + +func _hcsDetachOverlayFilter(volumePath *uint16, layerData *uint16) (hr error) { + hr = procHcsDetachOverlayFilter.Find() + if hr != nil { + return + } + r0, _, _ := syscall.Syscall(procHcsDetachOverlayFilter.Addr(), 2, uintptr(unsafe.Pointer(volumePath)), uintptr(unsafe.Pointer(layerData)), 0) + if int32(r0) < 0 { + if r0&0x1fff0000 == 0x00070000 { + r0 &= 0xffff + } + hr = syscall.Errno(r0) + } + return +} + func hcsExportLayer(layerPath string, exportFolderPath string, layerData string, options string) (hr error) { var _p0 *uint16 _p0, hr = syscall.UTF16PtrFromString(layerPath) diff --git a/vendor/github.com/Microsoft/hcsshim/container.go b/vendor/github.com/Microsoft/hcsshim/container.go index c8f09f88..0ad7f495 100644 --- a/vendor/github.com/Microsoft/hcsshim/container.go +++ b/vendor/github.com/Microsoft/hcsshim/container.go @@ -75,7 +75,7 @@ func init() { func CreateContainer(id string, c *ContainerConfig) (Container, error) { fullConfig, err := mergemaps.MergeJSON(c, createContainerAdditionalJSON) if err != nil { - return nil, fmt.Errorf("failed to merge additional JSON '%s': %s", createContainerAdditionalJSON, err) + return nil, fmt.Errorf("failed to merge additional JSON '%s': %w", createContainerAdditionalJSON, err) } system, err := hcs.CreateComputeSystem(context.Background(), id, fullConfig) diff --git a/vendor/github.com/Microsoft/hcsshim/errors.go b/vendor/github.com/Microsoft/hcsshim/errors.go index 594bbfb7..b441b0cd 100644 --- a/vendor/github.com/Microsoft/hcsshim/errors.go +++ b/vendor/github.com/Microsoft/hcsshim/errors.go @@ -115,6 +115,7 @@ func (e *ContainerError) Error() string { s += " encountered an error during " + e.Operation } + //nolint:errorlint // legacy code switch e.Err.(type) { case nil: break @@ -145,6 +146,7 @@ func (e *ProcessError) Error() string { s += " encountered an error during " + e.Operation } + //nolint:errorlint // legacy code switch e.Err.(type) { case nil: break @@ -166,10 +168,10 @@ func (e *ProcessError) Error() string { // already exited, or does not exist. Both IsAlreadyStopped and IsNotExist // will currently return true when the error is ErrElementNotFound. func IsNotExist(err error) bool { - if _, ok := err.(EndpointNotFoundError); ok { + if _, ok := err.(EndpointNotFoundError); ok { //nolint:errorlint // legacy code return true } - if _, ok := err.(NetworkNotFoundError); ok { + if _, ok := err.(NetworkNotFoundError); ok { //nolint:errorlint // legacy code return true } return hcs.IsNotExist(getInnerError(err)) @@ -224,6 +226,7 @@ func IsAccessIsDenied(err error) bool { } func getInnerError(err error) error { + //nolint:errorlint // legacy code switch pe := err.(type) { case nil: return nil @@ -236,14 +239,14 @@ func getInnerError(err error) error { } func convertSystemError(err error, c *container) error { - if serr, ok := err.(*hcs.SystemError); ok { + if serr, ok := err.(*hcs.SystemError); ok { //nolint:errorlint // legacy code return &ContainerError{Container: c, Operation: serr.Op, Err: serr.Err, Events: serr.Events} } return err } func convertProcessError(err error, p *process) error { - if perr, ok := err.(*hcs.ProcessError); ok { + if perr, ok := err.(*hcs.ProcessError); ok { //nolint:errorlint // legacy code return &ProcessError{Process: p, Operation: perr.Op, Err: perr.Err, Events: perr.Events} } return err diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go index 37afbf69..8ef611d6 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go @@ -63,7 +63,7 @@ func (process *Process) SystemID() string { } func (process *Process) processSignalResult(ctx context.Context, err error) (bool, error) { - switch err { + switch err { //nolint:errorlint case nil: return true, nil case ErrVmcomputeOperationInvalidState, ErrComputeSystemDoesNotExist, ErrElementNotFound: diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go index e46cae43..8bf8cab6 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/com_port.go @@ -9,7 +9,7 @@ package hcsschema -// ComPort specifies the named pipe that will be used for the port, with empty string indicating a disconnected port. +// ComPort specifies the named pipe that will be used for the port, with empty string indicating a disconnected port. type ComPort struct { NamedPipe string `json:"NamedPipe,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go index a5384ff3..1fd7ca5d 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/container_memory_information.go @@ -9,7 +9,7 @@ package hcsschema -// memory usage as viewed from within the container +// memory usage as viewed from within the container type ContainerMemoryInformation struct { TotalPhysicalBytes int32 `json:"TotalPhysicalBytes,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go index 4a3851e9..8a369bab 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/guest_connection_info.go @@ -9,7 +9,7 @@ package hcsschema -// Information about the guest. +// Information about the guest. type GuestConnectionInfo struct { // Each schema version x.y stands for the range of versions a.b where a==x and b<=y. This list comes from the SupportedSchemaVersions field in GcsCapabilities. diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go index 3f8aea5d..a017691f 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_2.go @@ -9,7 +9,7 @@ package hcsschema -// HvSocket configuration for a VM +// HvSocket configuration for a VM type HvSocket2 struct { HvSocketConfig *HvSocketSystemConfig `json:"HvSocketConfig,omitempty"` } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go index 9ae843ae..84c11b93 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_address.go @@ -9,8 +9,8 @@ package hcsschema -// This class defines address settings applied to a VM -// by the GCS every time a VM starts or restores. +// This class defines address settings applied to a VM +// by the GCS every time a VM starts or restores. type HvSocketAddress struct { LocalAddress string `json:"LocalAddress,omitempty"` ParentAddress string `json:"ParentAddress,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go index b1ee1d4a..69f4f9d3 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/hv_socket_system_config.go @@ -9,7 +9,7 @@ package hcsschema -// This is the HCS Schema version of the HvSocket configuration. The VMWP version is located in Config.Devices.IC in V1. +// This is the HCS Schema version of the HvSocket configuration. The VMWP version is located in Config.Devices.IC in V1. type HvSocketSystemConfig struct { // SDDL string that HvSocket will check before allowing a host process to bind to an unlisted service for this specific container/VM (not wildcard binds). diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go index 176c49d4..cb8dea08 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/layer.go @@ -9,6 +9,13 @@ package hcsschema +type FileSystemFilterType string + +const ( + UnionFS FileSystemFilterType = "UnionFS" + WCIFS FileSystemFilterType = "WCIFS" +) + type Layer struct { Id string `json:"Id,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go index 3065f21a..906ba597 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/memory_stats.go @@ -9,7 +9,7 @@ package hcsschema -// Memory runtime statistics +// Memory runtime statistics type MemoryStats struct { MemoryUsageCommitBytes uint64 `json:"MemoryUsageCommitBytes,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go index a9769c93..d96c9501 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_notification.go @@ -9,7 +9,7 @@ package hcsschema -// Notification data that is indicated to components running in the Virtual Machine. +// Notification data that is indicated to components running in the Virtual Machine. type PauseNotification struct { Reason string `json:"Reason,omitempty"` } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go index d48e0434..21707a88 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/pause_options.go @@ -9,7 +9,7 @@ package hcsschema -// Options for HcsPauseComputeSystem +// Options for HcsPauseComputeSystem type PauseOptions struct { SuspensionLevel string `json:"SuspensionLevel,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go index de56374b..e9a662dd 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/process_details.go @@ -13,7 +13,7 @@ import ( "time" ) -// Information about a process running in a container +// Information about a process running in a container type ProcessDetails struct { ProcessId int32 `json:"ProcessId,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go index db42a19e..6157e252 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/processor_stats.go @@ -9,7 +9,7 @@ package hcsschema -// CPU runtime statistics +// CPU runtime statistics type ProcessorStats struct { TotalRuntime100ns uint64 `json:"TotalRuntime100ns,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go index c7ebd660..d6d80df1 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/property_query.go @@ -9,7 +9,7 @@ package hcsschema -// By default the basic properties will be returned. This query provides a way to request specific properties. +// By default the basic properties will be returned. This query provides a way to request specific properties. type PropertyQuery struct { PropertyTypes []PropertyType `json:"PropertyTypes,omitempty"` } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_hive.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_hive.go new file mode 100644 index 00000000..e7b605fd --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_hive.go @@ -0,0 +1,13 @@ +package hcsschema + +// NOTE: manually added + +type RegistryHive string + +// List of RegistryHive +const ( + RegistryHive_SYSTEM RegistryHive = "System" + RegistryHive_SOFTWARE RegistryHive = "Software" + RegistryHive_SECURITY RegistryHive = "Security" + RegistryHive_SAM RegistryHive = "Sam" +) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go index 26fde99c..1883444a 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_key.go @@ -10,7 +10,7 @@ package hcsschema type RegistryKey struct { - Hive string `json:"Hive,omitempty"` + Hive RegistryHive `json:"Hive,omitempty"` Name string `json:"Name,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go index 3f203176..13f24d53 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value.go @@ -14,7 +14,7 @@ type RegistryValue struct { Name string `json:"Name,omitempty"` - Type_ string `json:"Type,omitempty"` + Type_ RegistryValueType `json:"Type,omitempty"` // One and only one value type must be set. StringValue string `json:"StringValue,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value_type.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value_type.go new file mode 100644 index 00000000..c8b4f6c9 --- /dev/null +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/registry_value_type.go @@ -0,0 +1,17 @@ +package hcsschema + +// NOTE: manually added + +type RegistryValueType string + +// List of RegistryValueType +const ( + RegistryValueType_NONE RegistryValueType = "None" + RegistryValueType_STRING RegistryValueType = "String" + RegistryValueType_EXPANDED_STRING RegistryValueType = "ExpandedString" + RegistryValueType_MULTI_STRING RegistryValueType = "MultiString" + RegistryValueType_BINARY RegistryValueType = "Binary" + RegistryValueType_D_WORD RegistryValueType = "DWord" + RegistryValueType_Q_WORD RegistryValueType = "QWord" + RegistryValueType_CUSTOM_TYPE RegistryValueType = "CustomType" +) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go index eb7338c6..5eaf6a7f 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/silo_properties.go @@ -9,7 +9,7 @@ package hcsschema -// Silo job information +// Silo job information type SiloProperties struct { Enabled bool `json:"Enabled,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go index 6e2dce6f..ba7a6b39 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/statistics.go @@ -13,7 +13,7 @@ import ( "time" ) -// Runtime statistics for a container +// Runtime statistics for a container type Statistics struct { Timestamp time.Time `json:"Timestamp,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go index 36f190ae..4f042ffd 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/schema2/storage_stats.go @@ -9,7 +9,7 @@ package hcsschema -// Storage runtime statistics +// Storage runtime statistics type StorageStats struct { ReadCountNormalized uint64 `json:"ReadCountNormalized,omitempty"` diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go index cf1db7da..81d60ed4 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go @@ -97,7 +97,7 @@ func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface in events, err := processAsyncHcsResult(ctx, createError, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemCreateCompleted, &timeout.SystemCreate) if err != nil { - if err == ErrTimeout { + if errors.Is(err, ErrTimeout) { // Terminate the compute system if it still exists. We're okay to // ignore a failure here. _ = computeSystem.Terminate(ctx) @@ -238,7 +238,7 @@ func (computeSystem *System) Shutdown(ctx context.Context) error { resultJSON, err := vmcompute.HcsShutdownComputeSystem(ctx, computeSystem.handle, "") events := processHcsResult(ctx, resultJSON) - switch err { + switch err { //nolint:errorlint case nil, ErrVmcomputeAlreadyStopped, ErrComputeSystemDoesNotExist, ErrVmcomputeOperationPending: default: return makeSystemError(computeSystem, operation, err, events) @@ -259,7 +259,7 @@ func (computeSystem *System) Terminate(ctx context.Context) error { resultJSON, err := vmcompute.HcsTerminateComputeSystem(ctx, computeSystem.handle, "") events := processHcsResult(ctx, resultJSON) - switch err { + switch err { //nolint:errorlint case nil, ErrVmcomputeAlreadyStopped, ErrComputeSystemDoesNotExist, ErrVmcomputeOperationPending: default: return makeSystemError(computeSystem, operation, err, events) @@ -279,7 +279,7 @@ func (computeSystem *System) waitBackground() { span.AddAttributes(trace.StringAttribute("cid", computeSystem.id)) err := waitForNotification(ctx, computeSystem.callbackNumber, hcsNotificationSystemExited, nil) - switch err { + switch err { //nolint:errorlint case nil: log.G(ctx).Debug("system exited") case ErrVmcomputeUnexpectedExit: diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go index 0a8f36d8..e61dc8de 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnsfuncs.go @@ -31,7 +31,7 @@ func hnsCallRawResponse(method, path, request string) (*hnsResponse, error) { func hnsCall(method, path, request string, returnResponse interface{}) error { hnsresponse, err := hnsCallRawResponse(method, path, request) if err != nil { - return fmt.Errorf("failed during hnsCallRawResponse: %v", err) + return fmt.Errorf("failed during hnsCallRawResponse: %w", err) } if !hnsresponse.Success { return fmt.Errorf("hns failed with error : %s", hnsresponse.Error) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go index 749588ad..a64b6792 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/hns/namespace.go @@ -56,7 +56,7 @@ func issueNamespaceRequest(id *string, method, subpath string, request interface if strings.Contains(err.Error(), "Element not found.") { return nil, os.ErrNotExist } - return nil, fmt.Errorf("%s %s: %s", method, hnspath, err) + return nil, fmt.Errorf("%s %s: %w", method, hnspath, err) } return &ns, err } @@ -86,7 +86,7 @@ func GetNamespaceEndpoints(id string) ([]string, error) { var endpoint namespaceEndpointRequest err = json.Unmarshal(rsrc.Data, &endpoint) if err != nil { - return nil, fmt.Errorf("unmarshal endpoint: %s", err) + return nil, fmt.Errorf("unmarshal endpoint: %w", err) } endpoints = append(endpoints, endpoint.ID) } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go index bcca84b0..eae3cc50 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go @@ -4,6 +4,7 @@ package jobobject import ( "context" + "errors" "fmt" "sync" "unsafe" @@ -59,7 +60,7 @@ func pollIOCP(ctx context.Context, iocpHandle windows.Handle) { }).Warn("failed to parse job object message") continue } - if err := msq.Enqueue(notification); err == queue.ErrQueueClosed { + if err := msq.Enqueue(notification); errors.Is(err, queue.ErrQueueClosed) { // Write will only return an error when the queue is closed. // The only time a queue would ever be closed is when we call `Close` on // the job it belongs to which also removes it from the jobMap, so something diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go index 4a224fbe..10ae4d67 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go @@ -374,7 +374,7 @@ func (job *JobObject) Pids() ([]uint32, error) { return []uint32{}, nil } - if err != winapi.ERROR_MORE_DATA { + if err != winapi.ERROR_MORE_DATA { //nolint:errorlint return nil, fmt.Errorf("failed initial query for PIDs in job object: %w", err) } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go index 03f71d9a..e3b1a1ed 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go @@ -143,6 +143,13 @@ func (job *JobObject) SetCPUAffinity(affinityBitMask uint64) error { return err } info.BasicLimitInformation.LimitFlags |= uint32(windows.JOB_OBJECT_LIMIT_AFFINITY) + + // We really, really shouldn't be running on 32 bit, but just in case (and to satisfy CodeQL) ... + const maxUintptr = ^uintptr(0) + if affinityBitMask > uint64(maxUintptr) { + return fmt.Errorf("affinity bitmask (%d) exceeds max allowable value (%d)", affinityBitMask, maxUintptr) + } + info.BasicLimitInformation.Affinity = uintptr(affinityBitMask) return job.setExtendedInformation(info) } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/log/format.go b/vendor/github.com/Microsoft/hcsshim/internal/log/format.go index 6d69c15b..1ceb26ba 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/log/format.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/log/format.go @@ -104,6 +104,7 @@ func encode(v interface{}) (_ []byte, err error) { if jErr := enc.Encode(v); jErr != nil { if err != nil { // TODO (go1.20): use multierror via fmt.Errorf("...: %w; ...: %w", ...) + //nolint:errorlint // non-wrapping format verb for fmt.Errorf return nil, fmt.Errorf("protojson encoding: %v; json encoding: %w", err, jErr) } return nil, fmt.Errorf("json encoding: %w", jErr) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go b/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go index 3e175e52..cceb3e2d 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/logfields/fields.go @@ -46,6 +46,7 @@ const ( ExpectedType = "expected-type" Bool = "bool" + Int32 = "int32" Uint32 = "uint32" Uint64 = "uint64" diff --git a/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go b/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go index 1ef5814d..6d39ca3b 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/memory/pool.go @@ -126,7 +126,7 @@ func (pa *PoolAllocator) Allocate(size uint64) (MappedRegion, error) { // this means that there are no more regions for the current class, try expanding if nextCls != memCls { if err := pa.split(memCls); err != nil { - if err == ErrInvalidMemoryClass { + if errors.Is(err, ErrInvalidMemoryClass) { return nil, ErrNotEnoughSpace } return nil, err @@ -147,7 +147,7 @@ func (pa *PoolAllocator) Allocate(size uint64) (MappedRegion, error) { } // Release marks a memory region of class `memCls` and offset `offset` as free and tries to merge smaller regions into -// a bigger one +// a bigger one. func (pa *PoolAllocator) Release(reg MappedRegion) error { mp := pa.pools[reg.Type()] if mp == nil { @@ -164,7 +164,7 @@ func (pa *PoolAllocator) Release(reg MappedRegion) error { return ErrNotAllocated } if err := pa.merge(n.parent); err != nil { - if err != ErrEarlyMerge { + if !errors.Is(err, ErrEarlyMerge) { return err } } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/oc/errors.go b/vendor/github.com/Microsoft/hcsshim/internal/oc/errors.go index 71df25b8..8c41a366 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/oc/errors.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/oc/errors.go @@ -6,7 +6,7 @@ import ( "net" "os" - "github.com/containerd/containerd/errdefs" + "github.com/containerd/errdefs" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -16,7 +16,7 @@ import ( func toStatusCode(err error) codes.Code { // checks if err implements GRPCStatus() *"google.golang.org/grpc/status".Status, - // wraps an error defined in "github.com/containerd/containerd/errdefs", or is a + // wraps an error defined in "github.com/containerd/errdefs", or is a // context timeout or cancelled error if s, ok := status.FromError(errdefs.ToGRPC(err)); ok { return s.Code() diff --git a/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go b/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go index 70368533..b087b987 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/safefile/safeopen.go @@ -243,7 +243,7 @@ func RemoveRelative(path string, root *os.File) error { if err == nil { defer f.Close() err = deleteOnClose(f) - if err == syscall.ERROR_ACCESS_DENIED { + if err == syscall.ERROR_ACCESS_DENIED { //nolint:errorlint // Maybe the file is marked readonly. Clear the bit and retry. _ = clearReadOnly(f) err = deleteOnClose(f) diff --git a/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go b/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go index 79b14ef9..67ca897c 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/vmcompute/vmcompute.go @@ -104,7 +104,7 @@ func execute(ctx gcontext.Context, timeout time.Duration, f func() error) error }() select { case <-ctx.Done(): - if ctx.Err() == gcontext.DeadlineExceeded { + if ctx.Err() == gcontext.DeadlineExceeded { //nolint:errorlint log.G(ctx).WithField(logfields.Timeout, trueTimeout). Warning("Syscall did not complete within operation timeout. This may indicate a platform issue. " + "If it appears to be making no forward progress, obtain the stacks and see if there is a syscall " + @@ -150,7 +150,7 @@ func HcsCreateComputeSystem(ctx gcontext.Context, id string, configuration strin if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() @@ -205,7 +205,7 @@ func HcsStartComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, option if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() @@ -228,7 +228,7 @@ func HcsShutdownComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, opt if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() @@ -251,7 +251,7 @@ func HcsTerminateComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, op if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() @@ -274,7 +274,7 @@ func HcsPauseComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, option if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() @@ -297,7 +297,7 @@ func HcsResumeComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, optio if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() @@ -621,7 +621,7 @@ func HcsSaveComputeSystem(ctx gcontext.Context, computeSystem HcsSystem, options if result != "" { span.AddAttributes(trace.StringAttribute("result", result)) } - if hr != errVmcomputeOperationPending { + if hr != errVmcomputeOperationPending { //nolint:errorlint // explicitly returned oc.SetSpanStatus(span, hr) } }() diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go index 792f13f5..807b7de1 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayerreader.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( @@ -64,7 +66,7 @@ func (r *baseLayerReader) walkUntilCancelled() error { return nil }) - if err == errorIterationCanceled { + if err == errorIterationCanceled { //nolint:errorlint // explicitly returned return nil } @@ -103,7 +105,7 @@ func (r *baseLayerReader) walkUntilCancelled() error { return nil }) - if err == errorIterationCanceled { + if err == errorIterationCanceled { //nolint:errorlint // explicitly returned return nil } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go index c542f556..d25c3c52 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/converttobaselayer.go @@ -1,3 +1,5 @@ +//go:build windows + package wclayer import ( diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go index e2ec27ad..35fcbedb 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go @@ -11,7 +11,6 @@ import ( "github.com/Microsoft/hcsshim/internal/hcserror" "github.com/Microsoft/hcsshim/internal/oc" - "github.com/Microsoft/hcsshim/osversion" "go.opencensus.io/trace" ) @@ -30,14 +29,17 @@ func ExpandScratchSize(ctx context.Context, path string, size uint64) (err error return hcserror.New(err, title, "") } - // Manually expand the volume now in order to work around bugs in 19H1 and - // prerelease versions of Vb. Remove once this is fixed in Windows. - if build := osversion.Build(); build >= osversion.V19H1 && build < 19020 { - err = expandSandboxVolume(ctx, path) - if err != nil { - return err - } + // Always expand the volume too. In case of legacy layers not expanding the volume here works because + // the PrepareLayer call internally handles the expansion. However, in other cases (like CimFS) we + // don't call PrepareLayer and so the volume will never be expanded. This also means in case of + // legacy layers, we might have a small perf hit because the VHD is mounted twice for expansion (once + // here and once during the PrepareLayer call). But as long as the perf hit is minimal, we should be + // okay. + err = expandSandboxVolume(ctx, path) + if err != nil { + return err } + return nil } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go index 807d8331..fc12eeba 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/wclayer/legacy.go @@ -154,7 +154,7 @@ func (r *legacyLayerReader) walkUntilCancelled() error { } return nil }) - if err == errorIterationCanceled { + if err == errorIterationCanceled { //nolint:errorlint // explicitly returned return nil } if err == nil { @@ -196,7 +196,7 @@ func findBackupStreamSize(r io.Reader) (int64, error) { for { hdr, err := br.Next() if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { err = nil } return 0, err @@ -428,7 +428,7 @@ func (w *legacyLayerWriter) initUtilityVM() error { // immutable. err = cloneTree(w.parentRoots[0], w.destRoot, UtilityVMFilesPath, mutatedUtilityVMFiles) if err != nil { - return fmt.Errorf("cloning the parent utility VM image failed: %s", err) + return fmt.Errorf("cloning the parent utility VM image failed: %w", err) } w.HasUtilityVM = true } @@ -451,7 +451,7 @@ func (w *legacyLayerWriter) reset() error { for { bhdr, err := br.Next() - if err == io.EOF { + if errors.Is(err, io.EOF) { // end of backupstream data break } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/cimfs.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/cimfs.go index d04bffc1..21664577 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/cimfs.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/cimfs.go @@ -1,3 +1,5 @@ +//go:build windows + package winapi import ( @@ -34,7 +36,7 @@ type CimFsFileMetadata struct { //sys CimDismountImage(volumeID *g) (hr error) = cimfs.CimDismountImage? //sys CimCreateImage(imagePath string, oldFSName *uint16, newFSName *uint16, cimFSHandle *FsHandle) (hr error) = cimfs.CimCreateImage? -//sys CimCloseImage(cimFSHandle FsHandle) (hr error) = cimfs.CimCloseImage? +//sys CimCloseImage(cimFSHandle FsHandle) = cimfs.CimCloseImage? //sys CimCommitImage(cimFSHandle FsHandle) (hr error) = cimfs.CimCommitImage? //sys CimCreateFile(cimFSHandle FsHandle, path string, file *CimFsFileMetadata, cimStreamHandle *StreamHandle) (hr error) = cimfs.CimCreateFile? diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go index 93d633d4..70c43fc1 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/utils.go @@ -4,7 +4,6 @@ package winapi import ( "errors" - "reflect" "syscall" "unsafe" @@ -14,11 +13,7 @@ import ( // Uint16BufferToSlice wraps a uint16 pointer-and-length into a slice // for easier interop with Go APIs func Uint16BufferToSlice(buffer *uint16, bufferLength int) (result []uint16) { - hdr := (*reflect.SliceHeader)(unsafe.Pointer(&result)) - hdr.Data = uintptr(unsafe.Pointer(buffer)) - hdr.Cap = bufferLength - hdr.Len = bufferLength - + result = unsafe.Slice(buffer, bufferLength) return } diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go index b5b9fccc..ffd3cd7f 100644 --- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go +++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go @@ -184,18 +184,12 @@ func _CMLocateDevNode(pdnDevInst *uint32, pDeviceID *uint16, uFlags uint32) (hr return } -func CimCloseImage(cimFSHandle FsHandle) (hr error) { - hr = procCimCloseImage.Find() - if hr != nil { +func CimCloseImage(cimFSHandle FsHandle) (err error) { + err = procCimCloseImage.Find() + if err != nil { return } - r0, _, _ := syscall.Syscall(procCimCloseImage.Addr(), 1, uintptr(cimFSHandle), 0, 0) - if int32(r0) < 0 { - if r0&0x1fff0000 == 0x00070000 { - r0 &= 0xffff - } - hr = syscall.Errno(r0) - } + syscall.Syscall(procCimCloseImage.Addr(), 1, uintptr(cimFSHandle), 0, 0) return } diff --git a/vendor/github.com/containerd/containerd/NOTICE b/vendor/github.com/containerd/containerd/NOTICE deleted file mode 100644 index 8915f027..00000000 --- a/vendor/github.com/containerd/containerd/NOTICE +++ /dev/null @@ -1,16 +0,0 @@ -Docker -Copyright 2012-2015 Docker, Inc. - -This product includes software developed at Docker, Inc. (https://www.docker.com). - -The following is courtesy of our legal counsel: - - -Use and transfer of Docker may be subject to certain restrictions by the -United States and other governments. -It is your responsibility to ensure that your use and/or transfer does not -violate applicable laws. - -For more information, please see https://www.bis.doc.gov - -See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/vendor/github.com/containerd/containerd/LICENSE b/vendor/github.com/containerd/errdefs/LICENSE similarity index 100% rename from vendor/github.com/containerd/containerd/LICENSE rename to vendor/github.com/containerd/errdefs/LICENSE diff --git a/vendor/github.com/containerd/errdefs/README.md b/vendor/github.com/containerd/errdefs/README.md new file mode 100644 index 00000000..bd418c63 --- /dev/null +++ b/vendor/github.com/containerd/errdefs/README.md @@ -0,0 +1,13 @@ +# errdefs + +A Go package for defining and checking common containerd errors. + +## Project details + +**errdefs** is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE). +As a containerd sub-project, you will find the: + * [Project governance](https://github.com/containerd/project/blob/main/GOVERNANCE.md), + * [Maintainers](https://github.com/containerd/project/blob/main/MAINTAINERS), + * and [Contributing guidelines](https://github.com/containerd/project/blob/main/CONTRIBUTING.md) + +information in our [`containerd/project`](https://github.com/containerd/project) repository. diff --git a/vendor/github.com/containerd/containerd/errdefs/errors.go b/vendor/github.com/containerd/errdefs/errors.go similarity index 100% rename from vendor/github.com/containerd/containerd/errdefs/errors.go rename to vendor/github.com/containerd/errdefs/errors.go diff --git a/vendor/github.com/containerd/containerd/errdefs/grpc.go b/vendor/github.com/containerd/errdefs/grpc.go similarity index 100% rename from vendor/github.com/containerd/containerd/errdefs/grpc.go rename to vendor/github.com/containerd/errdefs/grpc.go diff --git a/vendor/github.com/containers/image/v5/directory/directory_dest.go b/vendor/github.com/containers/image/v5/directory/directory_dest.go index 222723a8..9d921924 100644 --- a/vendor/github.com/containers/image/v5/directory/directory_dest.go +++ b/vendor/github.com/containers/image/v5/directory/directory_dest.go @@ -190,7 +190,7 @@ func (d *dirImageDestination) PutBlobWithOptions(ctx context.Context, stream io. // If the blob has been successfully reused, returns (true, info, nil). // If the transport can not reuse the requested blob, TryReusingBlob returns (false, {}, nil); it returns a non-nil error only on an unexpected failure. func (d *dirImageDestination) TryReusingBlobWithOptions(ctx context.Context, info types.BlobInfo, options private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { - if !impl.OriginalBlobMatchesRequiredCompression(options) { + if !impl.OriginalCandidateMatchesTryReusingBlobOptions(options) { return false, private.ReusedBlob{}, nil } if info.Digest == "" { diff --git a/vendor/github.com/containers/image/v5/docker/daemon/client.go b/vendor/github.com/containers/image/v5/docker/daemon/client.go index 2c245f54..354af214 100644 --- a/vendor/github.com/containers/image/v5/docker/daemon/client.go +++ b/vendor/github.com/containers/image/v5/docker/daemon/client.go @@ -9,11 +9,6 @@ import ( "github.com/docker/go-connections/tlsconfig" ) -const ( - // The default API version to be used in case none is explicitly specified - defaultAPIVersion = "1.22" -) - // NewDockerClient initializes a new API client based on the passed SystemContext. func newDockerClient(sys *types.SystemContext) (*dockerclient.Client, error) { host := dockerclient.DefaultDockerHost @@ -23,7 +18,7 @@ func newDockerClient(sys *types.SystemContext) (*dockerclient.Client, error) { opts := []dockerclient.Opt{ dockerclient.WithHost(host), - dockerclient.WithVersion(defaultAPIVersion), + dockerclient.WithAPIVersionNegotiation(), } // We conditionalize building the TLS configuration only to TLS sockets: diff --git a/vendor/github.com/containers/image/v5/docker/docker_client.go b/vendor/github.com/containers/image/v5/docker/docker_client.go index 6ce8f700..a60ec563 100644 --- a/vendor/github.com/containers/image/v5/docker/docker_client.go +++ b/vendor/github.com/containers/image/v5/docker/docker_client.go @@ -978,13 +978,10 @@ func (c *dockerClient) fetchManifest(ctx context.Context, ref dockerReference, t // This function can return nil reader when no url is supported by this function. In this case, the caller // should fallback to fetch the non-external blob (i.e. pull from the registry). func (c *dockerClient) getExternalBlob(ctx context.Context, urls []string) (io.ReadCloser, int64, error) { - var ( - resp *http.Response - err error - ) if len(urls) == 0 { return nil, 0, errors.New("internal error: getExternalBlob called with no URLs") } + var remoteErrors []error for _, u := range urls { blobURL, err := url.Parse(u) if err != nil || (blobURL.Scheme != "http" && blobURL.Scheme != "https") { @@ -993,24 +990,28 @@ func (c *dockerClient) getExternalBlob(ctx context.Context, urls []string) (io.R // NOTE: we must not authenticate on additional URLs as those // can be abused to leak credentials or tokens. Please // refer to CVE-2020-15157 for more information. - resp, err = c.makeRequestToResolvedURL(ctx, http.MethodGet, blobURL, nil, nil, -1, noAuth, nil) - if err == nil { - if resp.StatusCode != http.StatusOK { - err = fmt.Errorf("error fetching external blob from %q: %d (%s)", u, resp.StatusCode, http.StatusText(resp.StatusCode)) - logrus.Debug(err) - resp.Body.Close() - continue - } - break + resp, err := c.makeRequestToResolvedURL(ctx, http.MethodGet, blobURL, nil, nil, -1, noAuth, nil) + if err != nil { + remoteErrors = append(remoteErrors, err) + continue + } + if resp.StatusCode != http.StatusOK { + err := fmt.Errorf("error fetching external blob from %q: %d (%s)", u, resp.StatusCode, http.StatusText(resp.StatusCode)) + remoteErrors = append(remoteErrors, err) + logrus.Debug(err) + resp.Body.Close() + continue } + return resp.Body, getBlobSize(resp), nil } - if resp == nil && err == nil { + if remoteErrors == nil { return nil, 0, nil // fallback to non-external blob } - if err != nil { - return nil, 0, err + err := fmt.Errorf("failed fetching external blob from all urls: %w", remoteErrors[0]) + for _, e := range remoteErrors[1:] { + err = fmt.Errorf("%s, %w", err, e) } - return resp.Body, getBlobSize(resp), nil + return nil, 0, err } func getBlobSize(resp *http.Response) int64 { diff --git a/vendor/github.com/containers/image/v5/docker/docker_image_dest.go b/vendor/github.com/containers/image/v5/docker/docker_image_dest.go index a9a36f0a..877d11b7 100644 --- a/vendor/github.com/containers/image/v5/docker/docker_image_dest.go +++ b/vendor/github.com/containers/image/v5/docker/docker_image_dest.go @@ -27,6 +27,7 @@ import ( "github.com/containers/image/v5/internal/uploadreader" "github.com/containers/image/v5/manifest" "github.com/containers/image/v5/pkg/blobinfocache/none" + compressiontypes "github.com/containers/image/v5/pkg/compression/types" "github.com/containers/image/v5/types" "github.com/docker/distribution/registry/api/errcode" v2 "github.com/docker/distribution/registry/api/v2" @@ -311,6 +312,13 @@ func (d *dockerImageDestination) tryReusingExactBlob(ctx context.Context, info t return false, private.ReusedBlob{}, nil } +func optionalCompressionName(algo *compressiontypes.Algorithm) string { + if algo != nil { + return algo.Name() + } + return "nil" +} + // TryReusingBlobWithOptions checks whether the transport already contains, or can efficiently reuse, a blob, and if so, applies it to the current destination // (e.g. if the blob is a filesystem layer, this signifies that the changes it describes need to be applied again when composing a filesystem tree). // info.Digest must not be empty. @@ -321,7 +329,7 @@ func (d *dockerImageDestination) TryReusingBlobWithOptions(ctx context.Context, return false, private.ReusedBlob{}, errors.New("Can not check for a blob with unknown digest") } - if impl.OriginalBlobMatchesRequiredCompression(options) { + if impl.OriginalCandidateMatchesTryReusingBlobOptions(options) { // First, check whether the blob happens to already exist at the destination. haveBlob, reusedInfo, err := d.tryReusingExactBlob(ctx, info, options.Cache) if err != nil { @@ -331,11 +339,8 @@ func (d *dockerImageDestination) TryReusingBlobWithOptions(ctx context.Context, return true, reusedInfo, nil } } else { - requiredCompression := "nil" - if options.OriginalCompression != nil { - requiredCompression = options.OriginalCompression.Name() - } - logrus.Debugf("Ignoring exact blob match case due to compression mismatch ( %s vs %s )", options.RequiredCompression.Name(), requiredCompression) + logrus.Debugf("Ignoring exact blob match, compression %s does not match required %s or MIME types %#v", + optionalCompressionName(options.OriginalCompression), optionalCompressionName(options.RequiredCompression), options.PossibleManifestFormats) } // Then try reusing blobs from other locations. @@ -355,15 +360,13 @@ func (d *dockerImageDestination) TryReusingBlobWithOptions(ctx context.Context, continue } } - if !impl.BlobMatchesRequiredCompression(options, compressionAlgorithm) { - requiredCompression := "nil" - if compressionAlgorithm != nil { - requiredCompression = compressionAlgorithm.Name() - } + if !impl.CandidateMatchesTryReusingBlobOptions(options, compressionAlgorithm) { if !candidate.UnknownLocation { - logrus.Debugf("Ignoring candidate blob %s as reuse candidate due to compression mismatch ( %s vs %s ) in %s", candidate.Digest.String(), options.RequiredCompression.Name(), requiredCompression, candidateRepo.Name()) + logrus.Debugf("Ignoring candidate blob %s in %s, compression %s does not match required %s or MIME types %#v", candidate.Digest.String(), candidateRepo.Name(), + optionalCompressionName(compressionAlgorithm), optionalCompressionName(options.RequiredCompression), options.PossibleManifestFormats) } else { - logrus.Debugf("Ignoring candidate blob %s as reuse candidate due to compression mismatch ( %s vs %s ) with no location match, checking current repo", candidate.Digest.String(), options.RequiredCompression.Name(), requiredCompression) + logrus.Debugf("Ignoring candidate blob %s with no known location, compression %s does not match required %s or MIME types %#v", candidate.Digest.String(), + optionalCompressionName(compressionAlgorithm), optionalCompressionName(options.RequiredCompression), options.PossibleManifestFormats) } continue } diff --git a/vendor/github.com/containers/image/v5/docker/internal/tarfile/dest.go b/vendor/github.com/containers/image/v5/docker/internal/tarfile/dest.go index 7507d855..b44f4ca1 100644 --- a/vendor/github.com/containers/image/v5/docker/internal/tarfile/dest.go +++ b/vendor/github.com/containers/image/v5/docker/internal/tarfile/dest.go @@ -129,7 +129,7 @@ func (d *Destination) PutBlobWithOptions(ctx context.Context, stream io.Reader, // If the blob has been successfully reused, returns (true, info, nil). // If the transport can not reuse the requested blob, TryReusingBlob returns (false, {}, nil); it returns a non-nil error only on an unexpected failure. func (d *Destination) TryReusingBlobWithOptions(ctx context.Context, info types.BlobInfo, options private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { - if !impl.OriginalBlobMatchesRequiredCompression(options) { + if !impl.OriginalCandidateMatchesTryReusingBlobOptions(options) { return false, private.ReusedBlob{}, nil } if err := d.archive.lock(); err != nil { diff --git a/vendor/github.com/containers/image/v5/internal/blobinfocache/types.go b/vendor/github.com/containers/image/v5/internal/blobinfocache/types.go index 429d6826..4d3858ab 100644 --- a/vendor/github.com/containers/image/v5/internal/blobinfocache/types.go +++ b/vendor/github.com/containers/image/v5/internal/blobinfocache/types.go @@ -36,7 +36,7 @@ type BlobInfoCache2 interface { // that could possibly be reused within the specified (transport scope) (if they still // exist, which is not guaranteed). // - // If !canSubstitute, the returned cadidates will match the submitted digest exactly; if + // If !canSubstitute, the returned candidates will match the submitted digest exactly; if // canSubstitute, data from previous RecordDigestUncompressedPair calls is used to also look // up variants of the blob which have the same uncompressed digest. // diff --git a/vendor/github.com/containers/image/v5/internal/imagedestination/impl/helpers.go b/vendor/github.com/containers/image/v5/internal/imagedestination/impl/helpers.go index 5d28b3e7..553569a0 100644 --- a/vendor/github.com/containers/image/v5/internal/imagedestination/impl/helpers.go +++ b/vendor/github.com/containers/image/v5/internal/imagedestination/impl/helpers.go @@ -1,25 +1,42 @@ package impl import ( + "github.com/containers/image/v5/internal/manifest" "github.com/containers/image/v5/internal/private" compression "github.com/containers/image/v5/pkg/compression/types" + "golang.org/x/exp/slices" ) -// BlobMatchesRequiredCompression validates if compression is required by the caller while selecting a blob, if it is required +// CandidateMatchesTryReusingBlobOptions validates if compression is required by the caller while selecting a blob, if it is required // then function performs a match against the compression requested by the caller and compression of existing blob // (which can be nil to represent uncompressed or unknown) -func BlobMatchesRequiredCompression(options private.TryReusingBlobOptions, candidateCompression *compression.Algorithm) bool { - if options.RequiredCompression == nil { - return true // no requirement imposed +func CandidateMatchesTryReusingBlobOptions(options private.TryReusingBlobOptions, candidateCompression *compression.Algorithm) bool { + if options.RequiredCompression != nil { + if options.RequiredCompression.Name() == compression.ZstdChunkedAlgorithmName { + // HACK: Never match when the caller asks for zstd:chunked, because we don’t record the annotations required to use the chunked blobs. + // The caller must re-compress to build those annotations. + return false + } + if candidateCompression == nil || + (options.RequiredCompression.Name() != candidateCompression.Name() && options.RequiredCompression.Name() != candidateCompression.BaseVariantName()) { + return false + } } - if options.RequiredCompression.Name() == compression.ZstdChunkedAlgorithmName { - // HACK: Never match when the caller asks for zstd:chunked, because we don’t record the annotations required to use the chunked blobs. - // The caller must re-compress to build those annotations. - return false + + // For candidateCompression == nil, we can’t tell the difference between “uncompressed†and “unknownâ€; + // and “uncompressed†is acceptable in all known formats (well, it seems to work in practice for schema1), + // so don’t impose any restrictions if candidateCompression == nil + if options.PossibleManifestFormats != nil && candidateCompression != nil { + if !slices.ContainsFunc(options.PossibleManifestFormats, func(mt string) bool { + return manifest.MIMETypeSupportsCompressionAlgorithm(mt, *candidateCompression) + }) { + return false + } } - return candidateCompression != nil && (options.RequiredCompression.Name() == candidateCompression.Name()) + + return true } -func OriginalBlobMatchesRequiredCompression(opts private.TryReusingBlobOptions) bool { - return BlobMatchesRequiredCompression(opts, opts.OriginalCompression) +func OriginalCandidateMatchesTryReusingBlobOptions(opts private.TryReusingBlobOptions) bool { + return CandidateMatchesTryReusingBlobOptions(opts, opts.OriginalCompression) } diff --git a/vendor/github.com/containers/image/v5/internal/imagedestination/stubs/put_blob_partial.go b/vendor/github.com/containers/image/v5/internal/imagedestination/stubs/put_blob_partial.go index 0dc6bd5a..bbb53c19 100644 --- a/vendor/github.com/containers/image/v5/internal/imagedestination/stubs/put_blob_partial.go +++ b/vendor/github.com/containers/image/v5/internal/imagedestination/stubs/put_blob_partial.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "github.com/containers/image/v5/internal/blobinfocache" "github.com/containers/image/v5/internal/private" "github.com/containers/image/v5/types" ) @@ -39,7 +38,7 @@ func (stub NoPutBlobPartialInitialize) SupportsPutBlobPartial() bool { // It is available only if SupportsPutBlobPartial(). // Even if SupportsPutBlobPartial() returns true, the call can fail, in which case the caller // should fall back to PutBlobWithOptions. -func (stub NoPutBlobPartialInitialize) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, cache blobinfocache.BlobInfoCache2) (private.UploadedBlob, error) { +func (stub NoPutBlobPartialInitialize) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, options private.PutBlobPartialOptions) (private.UploadedBlob, error) { return private.UploadedBlob{}, fmt.Errorf("internal error: PutBlobPartial is not supported by the %q transport", stub.transportName) } diff --git a/vendor/github.com/containers/image/v5/internal/imagedestination/wrapper.go b/vendor/github.com/containers/image/v5/internal/imagedestination/wrapper.go index 17e1870c..cdd3c5e5 100644 --- a/vendor/github.com/containers/image/v5/internal/imagedestination/wrapper.go +++ b/vendor/github.com/containers/image/v5/internal/imagedestination/wrapper.go @@ -28,7 +28,7 @@ type wrapped struct { // // NOTE: The returned API MUST NOT be a public interface (it can be either just a struct // with public methods, or perhaps a private interface), so that we can add methods -// without breaking any external implementors of a public interface. +// without breaking any external implementers of a public interface. func FromPublic(dest types.ImageDestination) private.ImageDestination { if dest2, ok := dest.(private.ImageDestination); ok { return dest2 diff --git a/vendor/github.com/containers/image/v5/internal/imagesource/wrapper.go b/vendor/github.com/containers/image/v5/internal/imagesource/wrapper.go index 886b4e83..f0d1d042 100644 --- a/vendor/github.com/containers/image/v5/internal/imagesource/wrapper.go +++ b/vendor/github.com/containers/image/v5/internal/imagesource/wrapper.go @@ -27,7 +27,7 @@ type wrapped struct { // // NOTE: The returned API MUST NOT be a public interface (it can be either just a struct // with public methods, or perhaps a private interface), so that we can add methods -// without breaking any external implementors of a public interface. +// without breaking any external implementers of a public interface. func FromPublic(src types.ImageSource) private.ImageSource { if src2, ok := src.(private.ImageSource); ok { return src2 diff --git a/vendor/github.com/containers/image/v5/internal/manifest/list.go b/vendor/github.com/containers/image/v5/internal/manifest/list.go index 189f1a71..1d60da75 100644 --- a/vendor/github.com/containers/image/v5/internal/manifest/list.go +++ b/vendor/github.com/containers/image/v5/internal/manifest/list.go @@ -73,6 +73,7 @@ type ListUpdate struct { Platform *imgspecv1.Platform Annotations map[string]string CompressionAlgorithmNames []string + ArtifactType string } } @@ -101,6 +102,7 @@ type ListEdit struct { AddDigest digest.Digest AddSize int64 AddMediaType string + AddArtifactType string AddPlatform *imgspecv1.Platform AddAnnotations map[string]string AddCompressionAlgorithms []compression.Algorithm diff --git a/vendor/github.com/containers/image/v5/internal/manifest/manifest.go b/vendor/github.com/containers/image/v5/internal/manifest/manifest.go index 1dbcc141..c77db752 100644 --- a/vendor/github.com/containers/image/v5/internal/manifest/manifest.go +++ b/vendor/github.com/containers/image/v5/internal/manifest/manifest.go @@ -3,6 +3,7 @@ package manifest import ( "encoding/json" + compressiontypes "github.com/containers/image/v5/pkg/compression/types" "github.com/containers/libtrust" digest "github.com/opencontainers/go-digest" imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1" @@ -14,7 +15,7 @@ import ( const ( // DockerV2Schema1MediaType MIME type represents Docker manifest schema 1 DockerV2Schema1MediaType = "application/vnd.docker.distribution.manifest.v1+json" - // DockerV2Schema1MediaType MIME type represents Docker manifest schema 1 with a JWS signature + // DockerV2Schema1SignedMediaType MIME type represents Docker manifest schema 1 with a JWS signature DockerV2Schema1SignedMediaType = "application/vnd.docker.distribution.manifest.v1+prettyjws" // DockerV2Schema2MediaType MIME type represents Docker manifest schema 2 DockerV2Schema2MediaType = "application/vnd.docker.distribution.manifest.v2+json" @@ -165,3 +166,29 @@ func NormalizedMIMEType(input string) string { return DockerV2Schema1SignedMediaType } } + +// CompressionAlgorithmIsUniversallySupported returns true if MIMETypeSupportsCompressionAlgorithm(mimeType, algo) returns true for all mimeType values. +func CompressionAlgorithmIsUniversallySupported(algo compressiontypes.Algorithm) bool { + // Compare the discussion about BaseVariantName in MIMETypeSupportsCompressionAlgorithm(). + switch algo.Name() { + case compressiontypes.GzipAlgorithmName: + return true + default: + return false + } +} + +// MIMETypeSupportsCompressionAlgorithm returns true if mimeType can represent algo. +func MIMETypeSupportsCompressionAlgorithm(mimeType string, algo compressiontypes.Algorithm) bool { + if CompressionAlgorithmIsUniversallySupported(algo) { + return true + } + // This does not use BaseVariantName: Plausibly a manifest format might support zstd but not have annotation fields. + // The logic might have to be more complex (and more ad-hoc) if more manifest formats, with more capabilities, emerge. + switch algo.Name() { + case compressiontypes.ZstdAlgorithmName, compressiontypes.ZstdChunkedAlgorithmName: + return mimeType == imgspecv1.MediaTypeImageManifest + default: // Includes Bzip2AlgorithmName and XzAlgorithmName, which are defined names but are not supported anywhere + return false + } +} diff --git a/vendor/github.com/containers/image/v5/internal/manifest/oci_index.go b/vendor/github.com/containers/image/v5/internal/manifest/oci_index.go index d8d06513..829852a8 100644 --- a/vendor/github.com/containers/image/v5/internal/manifest/oci_index.go +++ b/vendor/github.com/containers/image/v5/internal/manifest/oci_index.go @@ -61,6 +61,7 @@ func (index *OCI1IndexPublic) Instance(instanceDigest digest.Digest) (ListUpdate ret.ReadOnly.Platform = manifest.Platform ret.ReadOnly.Annotations = manifest.Annotations ret.ReadOnly.CompressionAlgorithmNames = annotationsToCompressionAlgorithmNames(manifest.Annotations) + ret.ReadOnly.ArtifactType = manifest.ArtifactType return ret, nil } } @@ -102,7 +103,7 @@ func addCompressionAnnotations(compressionAlgorithms []compression.Algorithm, an *annotationsMap = map[string]string{} } for _, algo := range compressionAlgorithms { - switch algo.Name() { + switch algo.BaseVariantName() { case compression.ZstdAlgorithmName: (*annotationsMap)[OCI1InstanceAnnotationCompressionZSTD] = OCI1InstanceAnnotationCompressionZSTDValue default: @@ -157,11 +158,13 @@ func (index *OCI1IndexPublic) editInstances(editInstances []ListEdit) error { } addCompressionAnnotations(editInstance.AddCompressionAlgorithms, &annotations) addedEntries = append(addedEntries, imgspecv1.Descriptor{ - MediaType: editInstance.AddMediaType, - Size: editInstance.AddSize, - Digest: editInstance.AddDigest, - Platform: editInstance.AddPlatform, - Annotations: annotations}) + MediaType: editInstance.AddMediaType, + ArtifactType: editInstance.AddArtifactType, + Size: editInstance.AddSize, + Digest: editInstance.AddDigest, + Platform: editInstance.AddPlatform, + Annotations: annotations, + }) default: return fmt.Errorf("internal error: invalid operation: %d", editInstance.ListOperation) } @@ -299,12 +302,13 @@ func OCI1IndexPublicFromComponents(components []imgspecv1.Descriptor, annotation platform = &platformCopy } m := imgspecv1.Descriptor{ - MediaType: component.MediaType, - Size: component.Size, - Digest: component.Digest, - URLs: slices.Clone(component.URLs), - Annotations: maps.Clone(component.Annotations), - Platform: platform, + MediaType: component.MediaType, + ArtifactType: component.ArtifactType, + Size: component.Size, + Digest: component.Digest, + URLs: slices.Clone(component.URLs), + Annotations: maps.Clone(component.Annotations), + Platform: platform, } index.Manifests[i] = m } diff --git a/vendor/github.com/containers/image/v5/internal/pkg/platform/platform_matcher.go b/vendor/github.com/containers/image/v5/internal/pkg/platform/platform_matcher.go index 3ba0e408..94002d6d 100644 --- a/vendor/github.com/containers/image/v5/internal/pkg/platform/platform_matcher.go +++ b/vendor/github.com/containers/image/v5/internal/pkg/platform/platform_matcher.go @@ -25,6 +25,7 @@ import ( "github.com/containers/image/v5/types" imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1" + "github.com/sirupsen/logrus" "golang.org/x/exp/slices" ) @@ -82,15 +83,40 @@ func getCPUVariantWindows(arch string) string { func getCPUVariantArm() string { variant, err := getCPUInfo("Cpu architecture") if err != nil { + logrus.Errorf("Couldn't get cpu architecture: %v", err) return "" } - // TODO handle RPi Zero mismatch (https://github.com/moby/moby/pull/36121#issuecomment-398328286) switch strings.ToLower(variant) { case "8", "aarch64": variant = "v8" - case "7", "7m", "?(12)", "?(13)", "?(14)", "?(15)", "?(16)", "?(17)": + case "7m", "?(12)", "?(13)", "?(14)", "?(15)", "?(16)", "?(17)": variant = "v7" + case "7": + // handle RPi Zero variant mismatch due to wrong variant from kernel + // https://github.com/containerd/containerd/pull/4530 + // https://www.raspberrypi.org/forums/viewtopic.php?t=12614 + // https://github.com/moby/moby/pull/36121#issuecomment-398328286 + model, err := getCPUInfo("model name") + if err != nil { + logrus.Errorf("Couldn't get cpu model name, it may be the corner case where variant is 6: %v", err) + return "" + } + // model name is NOT a value provided by the CPU; it is another outcome of Linux CPU detection, + // https://github.com/torvalds/linux/blob/190bf7b14b0cf3df19c059061be032bd8994a597/arch/arm/mm/proc-v6.S#L178C35-L178C35 + // (matching happens based on value + mask at https://github.com/torvalds/linux/blob/190bf7b14b0cf3df19c059061be032bd8994a597/arch/arm/mm/proc-v6.S#L273-L274 ) + // ARM CPU ID starts with a “main†ID register https://developer.arm.com/documentation/ddi0406/cb/System-Level-Architecture/System-Control-Registers-in-a-VMSA-implementation/VMSA-System-control-registers-descriptions--in-register-order/MIDR--Main-ID-Register--VMSA?lang=en , + // but the ARMv6/ARMv7 differences are not a single dimension, https://developer.arm.com/documentation/ddi0406/cb/System-Level-Architecture/The-CPUID-Identification-Scheme?lang=en . + // The Linux "cpu architecture" is determined by a “memory model†feature. + // + // So, the "armv6-compatible" check basically checks for a "v6 or v7 CPU, but not one found listed as a known v7 one in the .proc.info.init tables of + // https://github.com/torvalds/linux/blob/190bf7b14b0cf3df19c059061be032bd8994a597/arch/arm/mm/proc-v7.S . + if strings.HasPrefix(strings.ToLower(model), "armv6-compatible") { + logrus.Debugf("Detected corner case, setting cpu variant to v6") + variant = "v6" + } else { + variant = "v7" + } case "6", "6tej": variant = "v6" case "5", "5t", "5te", "5tej": diff --git a/vendor/github.com/containers/image/v5/internal/private/private.go b/vendor/github.com/containers/image/v5/internal/private/private.go index 95d561fc..562adbea 100644 --- a/vendor/github.com/containers/image/v5/internal/private/private.go +++ b/vendor/github.com/containers/image/v5/internal/private/private.go @@ -55,7 +55,7 @@ type ImageDestinationInternalOnly interface { // It is available only if SupportsPutBlobPartial(). // Even if SupportsPutBlobPartial() returns true, the call can fail, in which case the caller // should fall back to PutBlobWithOptions. - PutBlobPartial(ctx context.Context, chunkAccessor BlobChunkAccessor, srcInfo types.BlobInfo, cache blobinfocache.BlobInfoCache2) (UploadedBlob, error) + PutBlobPartial(ctx context.Context, chunkAccessor BlobChunkAccessor, srcInfo types.BlobInfo, options PutBlobPartialOptions) (UploadedBlob, error) // TryReusingBlobWithOptions checks whether the transport already contains, or can efficiently reuse, a blob, and if so, applies it to the current destination // (e.g. if the blob is a filesystem layer, this signifies that the changes it describes need to be applied again when composing a filesystem tree). @@ -100,6 +100,12 @@ type PutBlobOptions struct { LayerIndex *int // If the blob is a layer, a zero-based index of the layer within the image; nil otherwise. } +// PutBlobPartialOptions are used in PutBlobPartial. +type PutBlobPartialOptions struct { + Cache blobinfocache.BlobInfoCache2 // Cache to use and/or update. + LayerIndex int // A zero-based index of the layer within the image (PutBlobPartial is only called with layer-like blobs, not configs) +} + // TryReusingBlobOptions are used in TryReusingBlobWithOptions. type TryReusingBlobOptions struct { Cache blobinfocache.BlobInfoCache2 // Cache to use and/or update. @@ -112,11 +118,13 @@ type TryReusingBlobOptions struct { // Transports, OTOH, MUST support these fields being zero-valued for types.ImageDestination callers // if they use internal/imagedestination/impl.Compat; // in that case, they will all be consistently zero-valued. - RequiredCompression *compression.Algorithm // If set, reuse blobs with a matching algorithm as per implementations in internal/imagedestination/impl.helpers.go - OriginalCompression *compression.Algorithm // Must be set if RequiredCompression is set; can be set to nil to indicate “uncompressed†or “unknownâ€. - EmptyLayer bool // True if the blob is an "empty"/"throwaway" layer, and may not necessarily be physically represented. - LayerIndex *int // If the blob is a layer, a zero-based index of the layer within the image; nil otherwise. - SrcRef reference.Named // A reference to the source image that contains the input blob. + EmptyLayer bool // True if the blob is an "empty"/"throwaway" layer, and may not necessarily be physically represented. + LayerIndex *int // If the blob is a layer, a zero-based index of the layer within the image; nil otherwise. + SrcRef reference.Named // A reference to the source image that contains the input blob. + PossibleManifestFormats []string // A set of possible manifest formats; at least one should support the reused layer blob. + RequiredCompression *compression.Algorithm // If set, reuse blobs with a matching algorithm as per implementations in internal/imagedestination/impl.helpers.go + OriginalCompression *compression.Algorithm // May be nil to indicate “uncompressed†or “unknownâ€. + TOCDigest digest.Digest // If specified, the blob can be looked up in the destination also by its TOC digest. } // ReusedBlob is information about a blob reused in a destination. @@ -128,6 +136,8 @@ type ReusedBlob struct { // a differently-compressed blob. CompressionOperation types.LayerCompression // Compress/Decompress, matching the reused blob; PreserveOriginal if N/A CompressionAlgorithm *compression.Algorithm // Algorithm if compressed, nil if decompressed or N/A + + MatchedByTOCDigest bool // Whether the layer was reused/matched by TOC digest. Used only for UI purposes. } // ImageSourceChunk is a portion of a blob. diff --git a/vendor/github.com/containers/image/v5/manifest/common.go b/vendor/github.com/containers/image/v5/manifest/common.go index 1bdcf3d3..de462811 100644 --- a/vendor/github.com/containers/image/v5/manifest/common.go +++ b/vendor/github.com/containers/image/v5/manifest/common.go @@ -55,7 +55,7 @@ func compressionVariantMIMEType(variantTable []compressionMIMETypeSet, mimeType if variants != nil { name := mtsUncompressed if algorithm != nil { - name = algorithm.InternalUnstableUndocumentedMIMEQuestionMark() + name = algorithm.BaseVariantName() } if res, ok := variants[name]; ok { if res != mtsUnsupportedMIMEType { diff --git a/vendor/github.com/containers/image/v5/manifest/docker_schema1.go b/vendor/github.com/containers/image/v5/manifest/docker_schema1.go index a80af701..76281557 100644 --- a/vendor/github.com/containers/image/v5/manifest/docker_schema1.go +++ b/vendor/github.com/containers/image/v5/manifest/docker_schema1.go @@ -10,6 +10,7 @@ import ( "github.com/containers/image/v5/docker/reference" "github.com/containers/image/v5/internal/manifest" "github.com/containers/image/v5/internal/set" + compressiontypes "github.com/containers/image/v5/pkg/compression/types" "github.com/containers/image/v5/types" "github.com/containers/storage/pkg/regexp" "github.com/docker/docker/api/types/versions" @@ -142,6 +143,15 @@ func (m *Schema1) LayerInfos() []LayerInfo { return layers } +const fakeSchema1MIMEType = DockerV2Schema2LayerMediaType // Used only in schema1CompressionMIMETypeSets +var schema1CompressionMIMETypeSets = []compressionMIMETypeSet{ + { + mtsUncompressed: fakeSchema1MIMEType, + compressiontypes.GzipAlgorithmName: fakeSchema1MIMEType, + compressiontypes.ZstdAlgorithmName: mtsUnsupportedMIMEType, + }, +} + // UpdateLayerInfos replaces the original layers with the specified BlobInfos (size+digest+urls), in order (the root layer first, and then successive layered layers) func (m *Schema1) UpdateLayerInfos(layerInfos []types.BlobInfo) error { // Our LayerInfos includes empty layers (where m.ExtractedV1Compatibility[].ThrowAway), so expect them to be included here as well. @@ -150,6 +160,11 @@ func (m *Schema1) UpdateLayerInfos(layerInfos []types.BlobInfo) error { } m.FSLayers = make([]Schema1FSLayers, len(layerInfos)) for i, info := range layerInfos { + // There are no MIME types in schema1, but we do a “conversion†here to reject unsupported compression algorithms, + // in a way that is consistent with the other schema implementations. + if _, err := updatedMIMEType(schema1CompressionMIMETypeSets, fakeSchema1MIMEType, info); err != nil { + return fmt.Errorf("preparing updated manifest, layer %q: %w", info.Digest, err) + } // (docker push) sets up m.ExtractedV1Compatibility[].{Id,Parent} based on values of info.Digest, // but (docker pull) ignores them in favor of computing DiffIDs from uncompressed data, except verifying the child->parent links and uniqueness. // So, we don't bother recomputing the IDs in m.History.V1Compatibility. diff --git a/vendor/github.com/containers/image/v5/manifest/manifest.go b/vendor/github.com/containers/image/v5/manifest/manifest.go index 959aac93..828b8da0 100644 --- a/vendor/github.com/containers/image/v5/manifest/manifest.go +++ b/vendor/github.com/containers/image/v5/manifest/manifest.go @@ -16,7 +16,7 @@ import ( const ( // DockerV2Schema1MediaType MIME type represents Docker manifest schema 1 DockerV2Schema1MediaType = manifest.DockerV2Schema1MediaType - // DockerV2Schema1MediaType MIME type represents Docker manifest schema 1 with a JWS signature + // DockerV2Schema1SignedMediaType MIME type represents Docker manifest schema 1 with a JWS signature DockerV2Schema1SignedMediaType = manifest.DockerV2Schema1SignedMediaType // DockerV2Schema2MediaType MIME type represents Docker manifest schema 2 DockerV2Schema2MediaType = manifest.DockerV2Schema2MediaType diff --git a/vendor/github.com/containers/image/v5/manifest/oci.go b/vendor/github.com/containers/image/v5/manifest/oci.go index a85641c3..548994ff 100644 --- a/vendor/github.com/containers/image/v5/manifest/oci.go +++ b/vendor/github.com/containers/image/v5/manifest/oci.go @@ -235,7 +235,7 @@ func (m *OCI1) Inspect(configGetter func(types.BlobInfo) ([]byte, error)) (*type } // ImageID computes an ID which can uniquely identify this image by its contents. -func (m *OCI1) ImageID([]digest.Digest) (string, error) { +func (m *OCI1) ImageID(diffIDs []digest.Digest) (string, error) { // The way m.Config.Digest “uniquely identifies†an image is // by containing RootFS.DiffIDs, which identify the layers of the image. // For non-image artifacts, the we can’t expect the config to change diff --git a/vendor/github.com/containers/image/v5/oci/archive/oci_dest.go b/vendor/github.com/containers/image/v5/oci/archive/oci_dest.go index 8386c47a..a3eb5d7a 100644 --- a/vendor/github.com/containers/image/v5/oci/archive/oci_dest.go +++ b/vendor/github.com/containers/image/v5/oci/archive/oci_dest.go @@ -6,13 +6,13 @@ import ( "io" "os" - "github.com/containers/image/v5/internal/blobinfocache" "github.com/containers/image/v5/internal/imagedestination" "github.com/containers/image/v5/internal/imagedestination/impl" "github.com/containers/image/v5/internal/private" "github.com/containers/image/v5/internal/signature" "github.com/containers/image/v5/types" "github.com/containers/storage/pkg/archive" + "github.com/containers/storage/pkg/idtools" digest "github.com/opencontainers/go-digest" "github.com/sirupsen/logrus" ) @@ -119,8 +119,8 @@ func (d *ociArchiveImageDestination) PutBlobWithOptions(ctx context.Context, str // It is available only if SupportsPutBlobPartial(). // Even if SupportsPutBlobPartial() returns true, the call can fail, in which case the caller // should fall back to PutBlobWithOptions. -func (d *ociArchiveImageDestination) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, cache blobinfocache.BlobInfoCache2) (private.UploadedBlob, error) { - return d.unpackedDest.PutBlobPartial(ctx, chunkAccessor, srcInfo, cache) +func (d *ociArchiveImageDestination) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, options private.PutBlobPartialOptions) (private.UploadedBlob, error) { + return d.unpackedDest.PutBlobPartial(ctx, chunkAccessor, srcInfo, options) } // TryReusingBlobWithOptions checks whether the transport already contains, or can efficiently reuse, a blob, and if so, applies it to the current destination @@ -169,10 +169,15 @@ func (d *ociArchiveImageDestination) Commit(ctx context.Context, unparsedTopleve // tar converts the directory at src and saves it to dst func tarDirectory(src, dst string) error { // input is a stream of bytes from the archive of the directory at path - input, err := archive.Tar(src, archive.Uncompressed) + input, err := archive.TarWithOptions(src, &archive.TarOptions{ + Compression: archive.Uncompressed, + // Don’t include the data about the user account this code is running under. + ChownOpts: &idtools.IDPair{UID: 0, GID: 0}, + }) if err != nil { return fmt.Errorf("retrieving stream of bytes from %q: %w", src, err) } + defer input.Close() // creates the tar file outFile, err := os.Create(dst) diff --git a/vendor/github.com/containers/image/v5/oci/layout/oci_dest.go b/vendor/github.com/containers/image/v5/oci/layout/oci_dest.go index 100d1676..305d8c9c 100644 --- a/vendor/github.com/containers/image/v5/oci/layout/oci_dest.go +++ b/vendor/github.com/containers/image/v5/oci/layout/oci_dest.go @@ -173,7 +173,7 @@ func (d *ociImageDestination) PutBlobWithOptions(ctx context.Context, stream io. // If the blob has been successfully reused, returns (true, info, nil). // If the transport can not reuse the requested blob, TryReusingBlob returns (false, {}, nil); it returns a non-nil error only on an unexpected failure. func (d *ociImageDestination) TryReusingBlobWithOptions(ctx context.Context, info types.BlobInfo, options private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { - if !impl.OriginalBlobMatchesRequiredCompression(options) { + if !impl.OriginalCandidateMatchesTryReusingBlobOptions(options) { return false, private.ReusedBlob{}, nil } if info.Digest == "" { diff --git a/vendor/github.com/containers/image/v5/openshift/openshift_dest.go b/vendor/github.com/containers/image/v5/openshift/openshift_dest.go index 50a5339e..656f4518 100644 --- a/vendor/github.com/containers/image/v5/openshift/openshift_dest.go +++ b/vendor/github.com/containers/image/v5/openshift/openshift_dest.go @@ -12,7 +12,6 @@ import ( "github.com/containers/image/v5/docker" "github.com/containers/image/v5/docker/reference" - "github.com/containers/image/v5/internal/blobinfocache" "github.com/containers/image/v5/internal/imagedestination" "github.com/containers/image/v5/internal/imagedestination/impl" "github.com/containers/image/v5/internal/imagedestination/stubs" @@ -128,8 +127,8 @@ func (d *openshiftImageDestination) PutBlobWithOptions(ctx context.Context, stre // It is available only if SupportsPutBlobPartial(). // Even if SupportsPutBlobPartial() returns true, the call can fail, in which case the caller // should fall back to PutBlobWithOptions. -func (d *openshiftImageDestination) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, cache blobinfocache.BlobInfoCache2) (private.UploadedBlob, error) { - return d.docker.PutBlobPartial(ctx, chunkAccessor, srcInfo, cache) +func (d *openshiftImageDestination) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, options private.PutBlobPartialOptions) (private.UploadedBlob, error) { + return d.docker.PutBlobPartial(ctx, chunkAccessor, srcInfo, options) } // TryReusingBlobWithOptions checks whether the transport already contains, or can efficiently reuse, a blob, and if so, applies it to the current destination diff --git a/vendor/github.com/containers/image/v5/ostree/ostree_dest.go b/vendor/github.com/containers/image/v5/ostree/ostree_dest.go index d00a0cdf..228af90c 100644 --- a/vendor/github.com/containers/image/v5/ostree/ostree_dest.go +++ b/vendor/github.com/containers/image/v5/ostree/ostree_dest.go @@ -335,7 +335,7 @@ func (d *ostreeImageDestination) importConfig(repo *otbuiltin.Repo, blob *blobTo // reflected in the manifest that will be written. // If the transport can not reuse the requested blob, TryReusingBlob returns (false, {}, nil); it returns a non-nil error only on an unexpected failure. func (d *ostreeImageDestination) TryReusingBlobWithOptions(ctx context.Context, info types.BlobInfo, options private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { - if !impl.OriginalBlobMatchesRequiredCompression(options) { + if !impl.OriginalCandidateMatchesTryReusingBlobOptions(options) { return false, private.ReusedBlob{}, nil } if d.repo == nil { diff --git a/vendor/github.com/containers/image/v5/pkg/compression/compression.go b/vendor/github.com/containers/image/v5/pkg/compression/compression.go index 4443dda7..b83a257e 100644 --- a/vendor/github.com/containers/image/v5/pkg/compression/compression.go +++ b/vendor/github.com/containers/image/v5/pkg/compression/compression.go @@ -19,19 +19,19 @@ type Algorithm = types.Algorithm var ( // Gzip compression. - Gzip = internal.NewAlgorithm(types.GzipAlgorithmName, types.GzipAlgorithmName, + Gzip = internal.NewAlgorithm(types.GzipAlgorithmName, "", []byte{0x1F, 0x8B, 0x08}, GzipDecompressor, gzipCompressor) // Bzip2 compression. - Bzip2 = internal.NewAlgorithm(types.Bzip2AlgorithmName, types.Bzip2AlgorithmName, + Bzip2 = internal.NewAlgorithm(types.Bzip2AlgorithmName, "", []byte{0x42, 0x5A, 0x68}, Bzip2Decompressor, bzip2Compressor) // Xz compression. - Xz = internal.NewAlgorithm(types.XzAlgorithmName, types.XzAlgorithmName, + Xz = internal.NewAlgorithm(types.XzAlgorithmName, "", []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, XzDecompressor, xzCompressor) // Zstd compression. - Zstd = internal.NewAlgorithm(types.ZstdAlgorithmName, types.ZstdAlgorithmName, + Zstd = internal.NewAlgorithm(types.ZstdAlgorithmName, "", []byte{0x28, 0xb5, 0x2f, 0xfd}, ZstdDecompressor, zstdCompressor) - // ZstdChunked is a Zstd compression with chunk metadta which allows random access to individual files. - ZstdChunked = internal.NewAlgorithm(types.ZstdChunkedAlgorithmName, types.ZstdAlgorithmName, /* Note: InternalUnstableUndocumentedMIMEQuestionMark is not ZstdChunkedAlgorithmName */ + // ZstdChunked is a Zstd compression with chunk metadata which allows random access to individual files. + ZstdChunked = internal.NewAlgorithm(types.ZstdChunkedAlgorithmName, types.ZstdAlgorithmName, nil, ZstdDecompressor, compressor.ZstdCompressor) compressionAlgorithms = map[string]Algorithm{ diff --git a/vendor/github.com/containers/image/v5/pkg/compression/internal/types.go b/vendor/github.com/containers/image/v5/pkg/compression/internal/types.go index ba619be0..d6f85274 100644 --- a/vendor/github.com/containers/image/v5/pkg/compression/internal/types.go +++ b/vendor/github.com/containers/image/v5/pkg/compression/internal/types.go @@ -12,23 +12,28 @@ type DecompressorFunc func(io.Reader) (io.ReadCloser, error) // Algorithm is a compression algorithm that can be used for CompressStream. type Algorithm struct { - name string - mime string - prefix []byte // Initial bytes of a stream compressed using this algorithm, or empty to disable detection. - decompressor DecompressorFunc - compressor CompressorFunc + name string + baseVariantName string + prefix []byte // Initial bytes of a stream compressed using this algorithm, or empty to disable detection. + decompressor DecompressorFunc + compressor CompressorFunc } // NewAlgorithm creates an Algorithm instance. +// nontrivialBaseVariantName is typically "". // This function exists so that Algorithm instances can only be created by code that // is allowed to import this internal subpackage. -func NewAlgorithm(name, mime string, prefix []byte, decompressor DecompressorFunc, compressor CompressorFunc) Algorithm { +func NewAlgorithm(name, nontrivialBaseVariantName string, prefix []byte, decompressor DecompressorFunc, compressor CompressorFunc) Algorithm { + baseVariantName := name + if nontrivialBaseVariantName != "" { + baseVariantName = nontrivialBaseVariantName + } return Algorithm{ - name: name, - mime: mime, - prefix: prefix, - decompressor: decompressor, - compressor: compressor, + name: name, + baseVariantName: baseVariantName, + prefix: prefix, + decompressor: decompressor, + compressor: compressor, } } @@ -37,10 +42,11 @@ func (c Algorithm) Name() string { return c.name } -// InternalUnstableUndocumentedMIMEQuestionMark ??? -// DO NOT USE THIS anywhere outside of c/image until it is properly documented. -func (c Algorithm) InternalUnstableUndocumentedMIMEQuestionMark() string { - return c.mime +// BaseVariantName returns the name of the “base variant†of the compression algorithm. +// It is either equal to Name() of the same algorithm, or equal to Name() of some other Algorithm (the “base variantâ€). +// This supports a single level of “is-a†relationship between compression algorithms, e.g. where "zstd:chunked" data is valid "zstd" data. +func (c Algorithm) BaseVariantName() string { + return c.baseVariantName } // AlgorithmCompressor returns the compressor field of algo. diff --git a/vendor/github.com/containers/image/v5/storage/storage_dest.go b/vendor/github.com/containers/image/v5/storage/storage_dest.go index 07e1d5e1..c06d6c09 100644 --- a/vendor/github.com/containers/image/v5/storage/storage_dest.go +++ b/vendor/github.com/containers/image/v5/storage/storage_dest.go @@ -16,7 +16,6 @@ import ( "sync/atomic" "github.com/containers/image/v5/docker/reference" - "github.com/containers/image/v5/internal/blobinfocache" "github.com/containers/image/v5/internal/imagedestination/impl" "github.com/containers/image/v5/internal/imagedestination/stubs" "github.com/containers/image/v5/internal/private" @@ -55,41 +54,61 @@ type storageImageDestination struct { stubs.ImplementsPutBlobPartial stubs.AlwaysSupportsSignatures - imageRef storageReference - directory string // Temporary directory where we store blobs until Commit() time - nextTempFileID atomic.Int32 // A counter that we use for computing filenames to assign to blobs - manifest []byte // Manifest contents, temporary - manifestDigest digest.Digest // Valid if len(manifest) != 0 - signatures []byte // Signature contents, temporary - signatureses map[digest.Digest][]byte // Instance signature contents, temporary - SignatureSizes []int `json:"signature-sizes,omitempty"` // List of sizes of each signature slice - SignaturesSizes map[digest.Digest][]int `json:"signatures-sizes,omitempty"` // Sizes of each manifest's signature slice - - // A storage destination may be used concurrently. Accesses are - // serialized via a mutex. Please refer to the individual comments - // below for details. - lock sync.Mutex + imageRef storageReference + directory string // Temporary directory where we store blobs until Commit() time + nextTempFileID atomic.Int32 // A counter that we use for computing filenames to assign to blobs + manifest []byte // Manifest contents, temporary + manifestDigest digest.Digest // Valid if len(manifest) != 0 + untrustedDiffIDValues []digest.Digest // From config’s RootFS.DiffIDs, valid if not nil + signatures []byte // Signature contents, temporary + signatureses map[digest.Digest][]byte // Instance signature contents, temporary + metadata storageImageMetadata // Metadata contents being built + // Mapping from layer (by index) to the associated ID in the storage. // It's protected *implicitly* since `commitLayer()`, at any given // time, can only be executed by *one* goroutine. Please refer to // `queueOrCommit()` for further details on how the single-caller // guarantee is implemented. - indexToStorageID map[int]*string - // All accesses to below data are protected by `lock` which is made - // *explicit* in the code. - blobDiffIDs map[digest.Digest]digest.Digest // Mapping from layer blobsums to their corresponding DiffIDs - fileSizes map[digest.Digest]int64 // Mapping from layer blobsums to their sizes - filenames map[digest.Digest]string // Mapping from layer blobsums to names of files we used to hold them - currentIndex int // The index of the layer to be committed (i.e., lower indices have already been committed) - indexToAddedLayerInfo map[int]addedLayerInfo // Mapping from layer (by index) to blob to add to the image - blobAdditionalLayer map[digest.Digest]storage.AdditionalLayer // Mapping from layer blobsums to their corresponding additional layer - diffOutputs map[digest.Digest]*graphdriver.DriverWithDifferOutput // Mapping from digest to differ output + indexToStorageID map[int]string + + // A storage destination may be used concurrently, due to HasThreadSafePutBlob. + lock sync.Mutex // Protects lockProtected + lockProtected storageImageDestinationLockProtected +} + +// storageImageDestinationLockProtected contains storageImageDestination data which might be +// accessed concurrently, due to HasThreadSafePutBlob. +// _During the concurrent TryReusingBlob/PutBlob/* calls_ (but not necessarily during the final Commit) +// uses must hold storageImageDestination.lock. +type storageImageDestinationLockProtected struct { + currentIndex int // The index of the layer to be committed (i.e., lower indices have already been committed) + indexToAddedLayerInfo map[int]addedLayerInfo // Mapping from layer (by index) to blob to add to the image + + // In general, a layer is identified either by (compressed) digest, or by TOC digest. + // When creating a layer, the c/storage layer metadata and image IDs must _only_ be based on trusted values + // we have computed ourselves. (Layer reuse can then look up against such trusted values, but it might not + // recompute those values for incomding layers — the point of the reuse is that we don’t need to consume the incoming layer.) + + // Layer identification: For a layer, at least one of indexToTOCDigest and blobDiffIDs must be available before commitLayer is called. + // The presence of an indexToTOCDigest is what decides how the layer is identified, i.e. which fields must be trusted. + blobDiffIDs map[digest.Digest]digest.Digest // Mapping from layer blobsums to their corresponding DiffIDs + indexToTOCDigest map[int]digest.Digest // Mapping from layer index to a TOC Digest, IFF the layer was created/found/reused by TOC digest + + // Layer data: Before commitLayer is called, either at least one of (diffOutputs, blobAdditionalLayer, filenames) + // should be available; or indexToTOCDigest/blobDiffIDs should be enough to locate an existing c/storage layer. + // They are looked up in the order they are mentioned above. + diffOutputs map[int]*graphdriver.DriverWithDifferOutput // Mapping from layer index to a partially-pulled layer intermediate data + blobAdditionalLayer map[digest.Digest]storage.AdditionalLayer // Mapping from layer blobsums to their corresponding additional layer + // Mapping from layer blobsums to names of files we used to hold them. If set, fileSizes and blobDiffIDs must also be set. + filenames map[digest.Digest]string + // Mapping from layer blobsums to their sizes. If set, filenames and blobDiffIDs must also be set. + fileSizes map[digest.Digest]int64 } // addedLayerInfo records data about a layer to use in this image. type addedLayerInfo struct { - digest digest.Digest - emptyLayer bool // The layer is an “emptyâ€/“throwaway†one, and may or may not be physically represented in various transport / storage systems. false if the manifest type does not have the concept. + digest digest.Digest // Mandatory, the digest of the layer. + emptyLayer bool // The layer is an “emptyâ€/“throwaway†one, and may or may not be physically represented in various transport / storage systems. false if the manifest type does not have the concept. } // newImageDestination sets us up to write a new image, caching blobs in a temporary directory until @@ -117,18 +136,23 @@ func newImageDestination(sys *types.SystemContext, imageRef storageReference) (* HasThreadSafePutBlob: true, }), - imageRef: imageRef, - directory: directory, - signatureses: make(map[digest.Digest][]byte), - blobDiffIDs: make(map[digest.Digest]digest.Digest), - blobAdditionalLayer: make(map[digest.Digest]storage.AdditionalLayer), - fileSizes: make(map[digest.Digest]int64), - filenames: make(map[digest.Digest]string), - SignatureSizes: []int{}, - SignaturesSizes: make(map[digest.Digest][]int), - indexToStorageID: make(map[int]*string), - indexToAddedLayerInfo: make(map[int]addedLayerInfo), - diffOutputs: make(map[digest.Digest]*graphdriver.DriverWithDifferOutput), + imageRef: imageRef, + directory: directory, + signatureses: make(map[digest.Digest][]byte), + metadata: storageImageMetadata{ + SignatureSizes: []int{}, + SignaturesSizes: make(map[digest.Digest][]int), + }, + indexToStorageID: make(map[int]string), + lockProtected: storageImageDestinationLockProtected{ + indexToAddedLayerInfo: make(map[int]addedLayerInfo), + blobDiffIDs: make(map[digest.Digest]digest.Digest), + indexToTOCDigest: make(map[int]digest.Digest), + diffOutputs: make(map[int]*graphdriver.DriverWithDifferOutput), + blobAdditionalLayer: make(map[digest.Digest]storage.AdditionalLayer), + filenames: make(map[digest.Digest]string), + fileSizes: make(map[digest.Digest]int64), + }, } dest.Compat = impl.AddCompat(dest) return dest, nil @@ -142,12 +166,13 @@ func (s *storageImageDestination) Reference() types.ImageReference { // Close cleans up the temporary directory and additional layer store handlers. func (s *storageImageDestination) Close() error { - for _, al := range s.blobAdditionalLayer { + // This is outside of the scope of HasThreadSafePutBlob, so we don’t need to hold s.lock. + for _, al := range s.lockProtected.blobAdditionalLayer { al.Release() } - for _, v := range s.diffOutputs { + for _, v := range s.lockProtected.diffOutputs { if v.Target != "" { - _ = s.imageRef.transport.store.CleanupStagingDirectory(v.Target) + _ = s.imageRef.transport.store.CleanupStagedLayer(v) } } return os.RemoveAll(s.directory) @@ -227,9 +252,9 @@ func (s *storageImageDestination) putBlobToPendingFile(stream io.Reader, blobinf // Record information about the blob. s.lock.Lock() - s.blobDiffIDs[blobDigest] = diffID.Digest() - s.fileSizes[blobDigest] = counter.Count - s.filenames[blobDigest] = filename + s.lockProtected.blobDiffIDs[blobDigest] = diffID.Digest() + s.lockProtected.fileSizes[blobDigest] = counter.Count + s.lockProtected.filenames[blobDigest] = filename s.lock.Unlock() // This is safe because we have just computed diffID, and blobDigest was either computed // by us, or validated by the caller (usually copy.digestingReader). @@ -269,14 +294,14 @@ func (f *zstdFetcher) GetBlobAt(chunks []chunked.ImageSourceChunk) (chan io.Read // It is available only if SupportsPutBlobPartial(). // Even if SupportsPutBlobPartial() returns true, the call can fail, in which case the caller // should fall back to PutBlobWithOptions. -func (s *storageImageDestination) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, cache blobinfocache.BlobInfoCache2) (private.UploadedBlob, error) { +func (s *storageImageDestination) PutBlobPartial(ctx context.Context, chunkAccessor private.BlobChunkAccessor, srcInfo types.BlobInfo, options private.PutBlobPartialOptions) (private.UploadedBlob, error) { fetcher := zstdFetcher{ chunkAccessor: chunkAccessor, ctx: ctx, blobInfo: srcInfo, } - differ, err := chunked.GetDiffer(ctx, s.imageRef.transport.store, srcInfo.Size, srcInfo.Annotations, &fetcher) + differ, err := chunked.GetDiffer(ctx, s.imageRef.transport.store, srcInfo.Digest, srcInfo.Size, srcInfo.Annotations, &fetcher) if err != nil { return private.UploadedBlob{}, err } @@ -286,13 +311,25 @@ func (s *storageImageDestination) PutBlobPartial(ctx context.Context, chunkAcces return private.UploadedBlob{}, err } + if out.TOCDigest == "" && out.UncompressedDigest == "" { + return private.UploadedBlob{}, errors.New("internal error: ApplyDiffWithDiffer succeeded with neither TOCDigest nor UncompressedDigest set") + } + blobDigest := srcInfo.Digest s.lock.Lock() - s.blobDiffIDs[blobDigest] = blobDigest - s.fileSizes[blobDigest] = 0 - s.filenames[blobDigest] = "" - s.diffOutputs[blobDigest] = out + if out.UncompressedDigest != "" { + // The computation of UncompressedDigest means the whole layer has been consumed; while doing that, chunked.GetDiffer is + // responsible for ensuring blobDigest has been validated. + s.lockProtected.blobDiffIDs[blobDigest] = out.UncompressedDigest + } else { + // Don’t identify layers by TOC if UncompressedDigest is available. + // - Using UncompressedDigest allows image reuse with non-partially-pulled layers + // - If UncompressedDigest has been computed, that means the layer was read completely, and the TOC has been created from scratch. + // That TOC is quite unlikely to match with any other TOC value. + s.lockProtected.indexToTOCDigest[options.LayerIndex] = out.TOCDigest + } + s.lockProtected.diffOutputs[options.LayerIndex] = out s.lock.Unlock() return private.UploadedBlob{ @@ -307,7 +344,7 @@ func (s *storageImageDestination) PutBlobPartial(ctx context.Context, chunkAcces // If the blob has been successfully reused, returns (true, info, nil). // If the transport can not reuse the requested blob, TryReusingBlob returns (false, {}, nil); it returns a non-nil error only on an unexpected failure. func (s *storageImageDestination) TryReusingBlobWithOptions(ctx context.Context, blobinfo types.BlobInfo, options private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { - if !impl.OriginalBlobMatchesRequiredCompression(options) { + if !impl.OriginalCandidateMatchesTryReusingBlobOptions(options) { return false, private.ReusedBlob{}, nil } reused, info, err := s.tryReusingBlobAsPending(blobinfo.Digest, blobinfo.Size, &options) @@ -321,68 +358,79 @@ func (s *storageImageDestination) TryReusingBlobWithOptions(ctx context.Context, }) } -// tryReusingBlobAsPending implements TryReusingBlobWithOptions for (digest, size or -1), filling s.blobDiffIDs and other metadata. +// tryReusingBlobAsPending implements TryReusingBlobWithOptions for (blobDigest, size or -1), filling s.blobDiffIDs and other metadata. // The caller must arrange the blob to be eventually committed using s.commitLayer(). -func (s *storageImageDestination) tryReusingBlobAsPending(digest digest.Digest, size int64, options *private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { +func (s *storageImageDestination) tryReusingBlobAsPending(blobDigest digest.Digest, size int64, options *private.TryReusingBlobOptions) (bool, private.ReusedBlob, error) { // lock the entire method as it executes fairly quickly s.lock.Lock() defer s.lock.Unlock() if options.SrcRef != nil { // Check if we have the layer in the underlying additional layer store. - aLayer, err := s.imageRef.transport.store.LookupAdditionalLayer(digest, options.SrcRef.String()) + aLayer, err := s.imageRef.transport.store.LookupAdditionalLayer(blobDigest, options.SrcRef.String()) if err != nil && !errors.Is(err, storage.ErrLayerUnknown) { - return false, private.ReusedBlob{}, fmt.Errorf(`looking for compressed layers with digest %q and labels: %w`, digest, err) + return false, private.ReusedBlob{}, fmt.Errorf(`looking for compressed layers with digest %q and labels: %w`, blobDigest, err) } else if err == nil { - // Record the uncompressed value so that we can use it to calculate layer IDs. - s.blobDiffIDs[digest] = aLayer.UncompressedDigest() - s.blobAdditionalLayer[digest] = aLayer + s.lockProtected.blobDiffIDs[blobDigest] = aLayer.UncompressedDigest() + s.lockProtected.blobAdditionalLayer[blobDigest] = aLayer return true, private.ReusedBlob{ - Digest: digest, + Digest: blobDigest, Size: aLayer.CompressedSize(), }, nil } } - if digest == "" { + if blobDigest == "" { return false, private.ReusedBlob{}, errors.New(`Can not check for a blob with unknown digest`) } - if err := digest.Validate(); err != nil { + if err := blobDigest.Validate(); err != nil { return false, private.ReusedBlob{}, fmt.Errorf("Can not check for a blob with invalid digest: %w", err) } + if options.TOCDigest != "" { + if err := options.TOCDigest.Validate(); err != nil { + return false, private.ReusedBlob{}, fmt.Errorf("Can not check for a blob with invalid digest: %w", err) + } + } + + // Check if we have a wasn't-compressed layer in storage that's based on that blob. // Check if we've already cached it in a file. - if size, ok := s.fileSizes[digest]; ok { + if size, ok := s.lockProtected.fileSizes[blobDigest]; ok { + // s.lockProtected.blobDiffIDs is set either by putBlobToPendingFile or in createNewLayer when creating the + // filenames/fileSizes entry. return true, private.ReusedBlob{ - Digest: digest, + Digest: blobDigest, Size: size, }, nil } - // Check if we have a wasn't-compressed layer in storage that's based on that blob. - layers, err := s.imageRef.transport.store.LayersByUncompressedDigest(digest) + layers, err := s.imageRef.transport.store.LayersByUncompressedDigest(blobDigest) if err != nil && !errors.Is(err, storage.ErrLayerUnknown) { - return false, private.ReusedBlob{}, fmt.Errorf(`looking for layers with digest %q: %w`, digest, err) + return false, private.ReusedBlob{}, fmt.Errorf(`looking for layers with digest %q: %w`, blobDigest, err) } if len(layers) > 0 { - // Save this for completeness. - s.blobDiffIDs[digest] = layers[0].UncompressedDigest + s.lockProtected.blobDiffIDs[blobDigest] = blobDigest return true, private.ReusedBlob{ - Digest: digest, + Digest: blobDigest, Size: layers[0].UncompressedSize, }, nil } // Check if we have a was-compressed layer in storage that's based on that blob. - layers, err = s.imageRef.transport.store.LayersByCompressedDigest(digest) + layers, err = s.imageRef.transport.store.LayersByCompressedDigest(blobDigest) if err != nil && !errors.Is(err, storage.ErrLayerUnknown) { - return false, private.ReusedBlob{}, fmt.Errorf(`looking for compressed layers with digest %q: %w`, digest, err) + return false, private.ReusedBlob{}, fmt.Errorf(`looking for compressed layers with digest %q: %w`, blobDigest, err) } if len(layers) > 0 { - // Record the uncompressed value so that we can use it to calculate layer IDs. - s.blobDiffIDs[digest] = layers[0].UncompressedDigest + // LayersByCompressedDigest only finds layers which were created from a full layer blob, and extracting that + // always sets UncompressedDigest. + diffID := layers[0].UncompressedDigest + if diffID == "" { + return false, private.ReusedBlob{}, fmt.Errorf("internal error: compressed layer %q (for compressed digest %q) does not have an uncompressed digest", layers[0].ID, blobDigest.String()) + } + s.lockProtected.blobDiffIDs[blobDigest] = diffID return true, private.ReusedBlob{ - Digest: digest, + Digest: blobDigest, Size: layers[0].CompressedSize, }, nil } @@ -391,23 +439,23 @@ func (s *storageImageDestination) tryReusingBlobAsPending(digest digest.Digest, // Because we must return the size, which is unknown for unavailable compressed blobs, the returned BlobInfo refers to the // uncompressed layer, and that can happen only if options.CanSubstitute, or if the incoming manifest already specifies the size. if options.CanSubstitute || size != -1 { - if uncompressedDigest := options.Cache.UncompressedDigest(digest); uncompressedDigest != "" && uncompressedDigest != digest { + if uncompressedDigest := options.Cache.UncompressedDigest(blobDigest); uncompressedDigest != "" && uncompressedDigest != blobDigest { layers, err := s.imageRef.transport.store.LayersByUncompressedDigest(uncompressedDigest) if err != nil && !errors.Is(err, storage.ErrLayerUnknown) { return false, private.ReusedBlob{}, fmt.Errorf(`looking for layers with digest %q: %w`, uncompressedDigest, err) } if len(layers) > 0 { if size != -1 { - s.blobDiffIDs[digest] = layers[0].UncompressedDigest + s.lockProtected.blobDiffIDs[blobDigest] = uncompressedDigest return true, private.ReusedBlob{ - Digest: digest, + Digest: blobDigest, Size: size, }, nil } if !options.CanSubstitute { - return false, private.ReusedBlob{}, fmt.Errorf("Internal error: options.CanSubstitute was expected to be true for blob with digest %s", digest) + return false, private.ReusedBlob{}, fmt.Errorf("Internal error: options.CanSubstitute was expected to be true for blob with digest %s", blobDigest) } - s.blobDiffIDs[uncompressedDigest] = layers[0].UncompressedDigest + s.lockProtected.blobDiffIDs[uncompressedDigest] = uncompressedDigest return true, private.ReusedBlob{ Digest: uncompressedDigest, Size: layers[0].UncompressedSize, @@ -416,6 +464,32 @@ func (s *storageImageDestination) tryReusingBlobAsPending(digest digest.Digest, } } + if options.TOCDigest != "" && options.LayerIndex != nil { + // Check if we have a chunked layer in storage with the same TOC digest. + layers, err := s.imageRef.transport.store.LayersByTOCDigest(options.TOCDigest) + + if err != nil && !errors.Is(err, storage.ErrLayerUnknown) { + return false, private.ReusedBlob{}, fmt.Errorf(`looking for layers with TOC digest %q: %w`, options.TOCDigest, err) + } + if len(layers) > 0 { + if size != -1 { + s.lockProtected.indexToTOCDigest[*options.LayerIndex] = options.TOCDigest + return true, private.ReusedBlob{ + Digest: blobDigest, + Size: size, + MatchedByTOCDigest: true, + }, nil + } else if options.CanSubstitute && layers[0].UncompressedDigest != "" { + s.lockProtected.indexToTOCDigest[*options.LayerIndex] = options.TOCDigest + return true, private.ReusedBlob{ + Digest: layers[0].UncompressedDigest, + Size: layers[0].UncompressedSize, + MatchedByTOCDigest: true, + }, nil + } + } + } + // Nope, we don't have it. return false, private.ReusedBlob{}, nil } @@ -425,6 +499,8 @@ func (s *storageImageDestination) tryReusingBlobAsPending(digest digest.Digest, // that since we don't have a recommendation, a random ID should be used if one needs // to be allocated. func (s *storageImageDestination) computeID(m manifest.Manifest) string { + // This is outside of the scope of HasThreadSafePutBlob, so we don’t need to hold s.lock. + // Build the diffID list. We need the decompressed sums that we've been calculating to // fill in the DiffIDs. It's expected (but not enforced by us) that the number of // diffIDs corresponds to the number of non-EmptyLayer entries in the history. @@ -438,24 +514,59 @@ func (s *storageImageDestination) computeID(m manifest.Manifest) string { continue } blobSum := m.FSLayers[i].BlobSum - diffID, ok := s.blobDiffIDs[blobSum] + diffID, ok := s.lockProtected.blobDiffIDs[blobSum] if !ok { + // this can, in principle, legitimately happen when a layer is reused by TOC. logrus.Infof("error looking up diffID for layer %q", blobSum.String()) return "" } diffIDs = append([]digest.Digest{diffID}, diffIDs...) } case *manifest.Schema2, *manifest.OCI1: - // We know the ID calculation for these formats doesn't actually use the diffIDs, - // so we don't need to populate the diffID list. + // We know the ID calculation doesn't actually use the diffIDs, so we don't need to populate + // the diffID list. default: return "" } - id, err := m.ImageID(diffIDs) + + // We want to use the same ID for “the same†images, but without risking unwanted sharing / malicious image corruption. + // + // Traditionally that means the same ~config digest, as computed by m.ImageID; + // but if we pull a layer by TOC, we verify the layer against neither the (compressed) blob digest in the manifest, + // nor against the config’s RootFS.DiffIDs. We don’t really want to do either, to allow partial layer pulls where we never see + // most of the data. + // + // So, if a layer is pulled by TOC (and we do validate against the TOC), the fact that we used the TOC, and the value of the TOC, + // must enter into the image ID computation. + // But for images where no TOC was used, continue to use IDs computed the traditional way, to maximize image reuse on upgrades, + // and to introduce the changed behavior only when partial pulls are used. + // + // Note that it’s not 100% guaranteed that an image pulled by TOC uses an OCI manifest; consider + // (skopeo copy --format v2s2 docker://…/zstd-chunked-image containers-storage:… ). So this is not happening only in the OCI case above. + ordinaryImageID, err := m.ImageID(diffIDs) if err != nil { return "" } - return id + tocIDInput := "" + hasLayerPulledByTOC := false + for i := range m.LayerInfos() { + layerValue := "" // An empty string is not a valid digest, so this is unambiguous with the TOC case. + tocDigest, ok := s.lockProtected.indexToTOCDigest[i] // "" if not a TOC + if ok { + hasLayerPulledByTOC = true + layerValue = tocDigest.String() + } + tocIDInput += layerValue + "|" // "|" can not be present in a TOC digest, so this is an unambiguous separator. + } + + if !hasLayerPulledByTOC { + return ordinaryImageID + } + // ordinaryImageID is a digest of a config, which is a JSON value. + // To avoid the risk of collisions, start the input with @ so that the input is not a valid JSON. + tocImageID := digest.FromString("@With TOC:" + tocIDInput).Hex() + logrus.Debugf("Ordinary storage image ID %s; a layer was looked up by TOC, so using image ID %s", ordinaryImageID, tocImageID) + return tocImageID } // getConfigBlob exists only to let us retrieve the configuration blob so that the manifest package can dig @@ -468,7 +579,7 @@ func (s *storageImageDestination) getConfigBlob(info types.BlobInfo) ([]byte, er return nil, fmt.Errorf("invalid digest supplied when reading blob: %w", err) } // Assume it's a file, since we're only calling this from a place that expects to read files. - if filename, ok := s.filenames[info.Digest]; ok { + if filename, ok := s.lockProtected.filenames[info.Digest]; ok { contents, err2 := os.ReadFile(filename) if err2 != nil { return nil, fmt.Errorf(`reading blob from file %q: %w`, filename, err2) @@ -502,23 +613,23 @@ func (s *storageImageDestination) queueOrCommit(index int, info addedLayerInfo) // caller is the "worker" routine committing layers. All other routines // can continue pulling and queuing in layers. s.lock.Lock() - s.indexToAddedLayerInfo[index] = info + s.lockProtected.indexToAddedLayerInfo[index] = info // We're still waiting for at least one previous/parent layer to be // committed, so there's nothing to do. - if index != s.currentIndex { + if index != s.lockProtected.currentIndex { s.lock.Unlock() return nil } for { - info, ok := s.indexToAddedLayerInfo[index] + info, ok := s.lockProtected.indexToAddedLayerInfo[index] if !ok { break } s.lock.Unlock() // Note: commitLayer locks on-demand. - if err := s.commitLayer(index, info, -1); err != nil { + if stopQueue, err := s.commitLayer(index, info, -1); stopQueue || err != nil { return err } s.lock.Lock() @@ -527,185 +638,337 @@ func (s *storageImageDestination) queueOrCommit(index int, info addedLayerInfo) // Set the index at the very end to make sure that only one routine // enters stage 2). - s.currentIndex = index + s.lockProtected.currentIndex = index s.lock.Unlock() return nil } +// singleLayerIDComponent returns a single layer’s the input to computing a layer (chain) ID, +// and an indication whether the input already has the shape of a layer ID. +// It returns ("", false) if the layer is not found at all (which should never happen) +func (s *storageImageDestination) singleLayerIDComponent(layerIndex int, blobDigest digest.Digest) (string, bool) { + s.lock.Lock() + defer s.lock.Unlock() + + if d, found := s.lockProtected.indexToTOCDigest[layerIndex]; found { + return "@TOC=" + d.Hex(), false // "@" is not a valid start of a digest.Digest, so this is unambiguous. + } + + if d, found := s.lockProtected.blobDiffIDs[blobDigest]; found { + return d.Hex(), true // This looks like chain IDs, and it uses the traditional value. + } + return "", false +} + // commitLayer commits the specified layer with the given index to the storage. // size can usually be -1; it can be provided if the layer is not known to be already present in blobDiffIDs. // +// If the layer cannot be committed yet, the function returns (true, nil). +// // Note that the previous layer is expected to already be committed. // // Caution: this function must be called without holding `s.lock`. Callers // must guarantee that, at any given time, at most one goroutine may execute // `commitLayer()`. -func (s *storageImageDestination) commitLayer(index int, info addedLayerInfo, size int64) error { +func (s *storageImageDestination) commitLayer(index int, info addedLayerInfo, size int64) (bool, error) { // Already committed? Return early. if _, alreadyCommitted := s.indexToStorageID[index]; alreadyCommitted { - return nil + return false, nil } // Start with an empty string or the previous layer ID. Note that // `s.indexToStorageID` can only be accessed by *one* goroutine at any // given time. Hence, we don't need to lock accesses. - var lastLayer string - if prev := s.indexToStorageID[index-1]; prev != nil { - lastLayer = *prev + var parentLayer string + if index != 0 { + prev, ok := s.indexToStorageID[index-1] + if !ok { + return false, fmt.Errorf("Internal error: commitLayer called with previous layer %d not committed yet", index-1) + } + parentLayer = prev } // Carry over the previous ID for empty non-base layers. if info.emptyLayer { - s.indexToStorageID[index] = &lastLayer - return nil + s.indexToStorageID[index] = parentLayer + return false, nil } // Check if there's already a layer with the ID that we'd give to the result of applying // this layer blob to its parent, if it has one, or the blob's hex value otherwise. - s.lock.Lock() - diffID, haveDiffID := s.blobDiffIDs[info.digest] - s.lock.Unlock() - if !haveDiffID { - // Check if it's elsewhere and the caller just forgot to pass it to us in a PutBlob(), - // or to even check if we had it. - // Use none.NoCache to avoid a repeated DiffID lookup in the BlobInfoCache; a caller + // The layerID refers either to the DiffID or the digest of the TOC. + layerIDComponent, layerIDComponentStandalone := s.singleLayerIDComponent(index, info.digest) + if layerIDComponent == "" { + // Check if it's elsewhere and the caller just forgot to pass it to us in a PutBlob() / TryReusingBlob() / … + // + // Use none.NoCache to avoid a repeated DiffID lookup in the BlobInfoCache: a caller // that relies on using a blob digest that has never been seen by the store had better call // TryReusingBlob; not calling PutBlob already violates the documented API, so there’s only // so far we are going to accommodate that (if we should be doing that at all). - logrus.Debugf("looking for diffID for blob %+v", info.digest) + // + // We are also ignoring lookups by TOC, and other non-trivial situations. + // Those can only happen using the c/image/internal/private API, + // so those internal callers should be fixed to follow the API instead of expanding this fallback. + logrus.Debugf("looking for diffID for blob=%+v", info.digest) + // Use tryReusingBlobAsPending, not the top-level TryReusingBlobWithOptions, to prevent recursion via queueOrCommit. has, _, err := s.tryReusingBlobAsPending(info.digest, size, &private.TryReusingBlobOptions{ Cache: none.NoCache, CanSubstitute: false, }) if err != nil { - return fmt.Errorf("checking for a layer based on blob %q: %w", info.digest.String(), err) + return false, fmt.Errorf("checking for a layer based on blob %q: %w", info.digest.String(), err) } if !has { - return fmt.Errorf("error determining uncompressed digest for blob %q", info.digest.String()) + return false, fmt.Errorf("error determining uncompressed digest for blob %q", info.digest.String()) } - diffID, haveDiffID = s.blobDiffIDs[info.digest] - if !haveDiffID { - return fmt.Errorf("we have blob %q, but don't know its uncompressed digest", info.digest.String()) + + layerIDComponent, layerIDComponentStandalone = s.singleLayerIDComponent(index, info.digest) + if layerIDComponent == "" { + return false, fmt.Errorf("we have blob %q, but don't know its layer ID", info.digest.String()) } } - id := diffID.Hex() - if lastLayer != "" { - id = digest.Canonical.FromBytes([]byte(lastLayer + "+" + diffID.Hex())).Hex() + + id := layerIDComponent + if !layerIDComponentStandalone || parentLayer != "" { + id = digest.Canonical.FromString(parentLayer + "+" + layerIDComponent).Hex() } if layer, err2 := s.imageRef.transport.store.Layer(id); layer != nil && err2 == nil { // There's already a layer that should have the right contents, just reuse it. - lastLayer = layer.ID - s.indexToStorageID[index] = &lastLayer - return nil + s.indexToStorageID[index] = layer.ID + return false, nil } + layer, err := s.createNewLayer(index, info.digest, parentLayer, id) + if err != nil { + return false, err + } + if layer == nil { + return true, nil + } + s.indexToStorageID[index] = layer.ID + return false, nil +} + +// createNewLayer creates a new layer newLayerID for (index, layerDigest) on top of parentLayer (which may be ""). +// If the layer cannot be committed yet, the function returns (nil, nil). +func (s *storageImageDestination) createNewLayer(index int, layerDigest digest.Digest, parentLayer, newLayerID string) (*storage.Layer, error) { s.lock.Lock() - diffOutput, ok := s.diffOutputs[info.digest] + diffOutput, ok := s.lockProtected.diffOutputs[index] s.lock.Unlock() if ok { - layer, err := s.imageRef.transport.store.CreateLayer(id, lastLayer, nil, "", false, nil) - if err != nil { - return err + var untrustedUncompressedDigest digest.Digest + if diffOutput.UncompressedDigest == "" { + d, err := s.untrustedLayerDiffID(index) + if err != nil { + return nil, err + } + if d == "" { + logrus.Debugf("Skipping commit for layer %q, manifest not yet available", newLayerID) + return nil, nil + } + untrustedUncompressedDigest = d } - // FIXME: what to do with the uncompressed digest? - diffOutput.UncompressedDigest = info.digest - - if err := s.imageRef.transport.store.ApplyDiffFromStagingDirectory(layer.ID, diffOutput.Target, diffOutput, nil); err != nil { - _ = s.imageRef.transport.store.Delete(layer.ID) - return err + flags := make(map[string]interface{}) + if untrustedUncompressedDigest != "" { + flags[expectedLayerDiffIDFlag] = untrustedUncompressedDigest + logrus.Debugf("Setting uncompressed digest to %q for layer %q", untrustedUncompressedDigest, newLayerID) } - s.indexToStorageID[index] = &layer.ID - return nil + args := storage.ApplyStagedLayerOptions{ + ID: newLayerID, + ParentLayer: parentLayer, + + DiffOutput: diffOutput, + DiffOptions: &graphdriver.ApplyDiffWithDifferOpts{ + Flags: flags, + }, + } + layer, err := s.imageRef.transport.store.ApplyStagedLayer(args) + if err != nil && !errors.Is(err, storage.ErrDuplicateID) { + return nil, fmt.Errorf("failed to put layer using a partial pull: %w", err) + } + return layer, nil } s.lock.Lock() - al, ok := s.blobAdditionalLayer[info.digest] + al, ok := s.lockProtected.blobAdditionalLayer[layerDigest] s.lock.Unlock() if ok { - layer, err := al.PutAs(id, lastLayer, nil) + layer, err := al.PutAs(newLayerID, parentLayer, nil) if err != nil && !errors.Is(err, storage.ErrDuplicateID) { - return fmt.Errorf("failed to put layer from digest and labels: %w", err) + return nil, fmt.Errorf("failed to put layer from digest and labels: %w", err) } - lastLayer = layer.ID - s.indexToStorageID[index] = &lastLayer - return nil + return layer, nil } // Check if we previously cached a file with that blob's contents. If we didn't, // then we need to read the desired contents from a layer. + var trustedUncompressedDigest, trustedOriginalDigest digest.Digest // For storage.LayerOptions s.lock.Lock() - filename, ok := s.filenames[info.digest] + tocDigest := s.lockProtected.indexToTOCDigest[index] // "" if not set + optionalDiffID := s.lockProtected.blobDiffIDs[layerDigest] // "" if not set + filename, gotFilename := s.lockProtected.filenames[layerDigest] s.lock.Unlock() - if !ok { - // Try to find the layer with contents matching that blobsum. - layer := "" - layers, err2 := s.imageRef.transport.store.LayersByUncompressedDigest(diffID) - if err2 == nil && len(layers) > 0 { - layer = layers[0].ID + if gotFilename && tocDigest == "" { + // If tocDigest != "", if we now happen to find a layerDigest match, the newLayerID has already been computed as TOC-based, + // and we don't know the relationship of the layerDigest and TOC digest. + // We could recompute newLayerID to be DiffID-based and use the file, but such a within-image layer + // reuse is expected to be pretty rare; instead, ignore the unexpected file match and proceed to the + // originally-planned TOC match. + + // Because tocDigest == "", optionaldiffID must have been set; and even if it weren’t, PutLayer will recompute the digest from the stream. + trustedUncompressedDigest = optionalDiffID + trustedOriginalDigest = layerDigest // The code setting .filenames[layerDigest] is responsible for the contents matching. + } else { + // Try to find the layer with contents matching the data we use. + var layer *storage.Layer // = nil + if tocDigest != "" { + layers, err2 := s.imageRef.transport.store.LayersByTOCDigest(tocDigest) + if err2 == nil && len(layers) > 0 { + layer = &layers[0] + } else { + return nil, fmt.Errorf("locating layer for TOC digest %q: %w", tocDigest, err2) + } } else { - layers, err2 = s.imageRef.transport.store.LayersByCompressedDigest(info.digest) + // Because tocDigest == "", optionaldiffID must have been set + layers, err2 := s.imageRef.transport.store.LayersByUncompressedDigest(optionalDiffID) if err2 == nil && len(layers) > 0 { - layer = layers[0].ID + layer = &layers[0] + } else { + layers, err2 = s.imageRef.transport.store.LayersByCompressedDigest(layerDigest) + if err2 == nil && len(layers) > 0 { + layer = &layers[0] + } + } + if layer == nil { + return nil, fmt.Errorf("locating layer for blob %q: %w", layerDigest, err2) } - } - if layer == "" { - return fmt.Errorf("locating layer for blob %q: %w", info.digest, err2) } // Read the layer's contents. noCompression := archive.Uncompressed diffOptions := &storage.DiffOptions{ Compression: &noCompression, } - diff, err2 := s.imageRef.transport.store.Diff("", layer, diffOptions) + diff, err2 := s.imageRef.transport.store.Diff("", layer.ID, diffOptions) if err2 != nil { - return fmt.Errorf("reading layer %q for blob %q: %w", layer, info.digest, err2) + return nil, fmt.Errorf("reading layer %q for blob %q: %w", layer.ID, layerDigest, err2) } // Copy the layer diff to a file. Diff() takes a lock that it holds // until the ReadCloser that it returns is closed, and PutLayer() wants // the same lock, so the diff can't just be directly streamed from one // to the other. filename = s.computeNextBlobCacheFile() - file, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_WRONLY|os.O_EXCL, 0600) + file, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_WRONLY|os.O_EXCL, 0o600) if err != nil { diff.Close() - return fmt.Errorf("creating temporary file %q: %w", filename, err) + return nil, fmt.Errorf("creating temporary file %q: %w", filename, err) } // Copy the data to the file. // TODO: This can take quite some time, and should ideally be cancellable using // ctx.Done(). - _, err = io.Copy(file, diff) + fileSize, err := io.Copy(file, diff) diff.Close() file.Close() if err != nil { - return fmt.Errorf("storing blob to file %q: %w", filename, err) + return nil, fmt.Errorf("storing blob to file %q: %w", filename, err) + } + + if optionalDiffID == "" && layer.UncompressedDigest != "" { + optionalDiffID = layer.UncompressedDigest + } + // The stream we have is uncompressed, this matches contents of the stream. + // If tocDigest != "", trustedUncompressedDigest might still be ""; in that case PutLayer will compute the value from the stream. + trustedUncompressedDigest = optionalDiffID + // FIXME? trustedOriginalDigest could be set to layerDigest IF tocDigest == "" (otherwise layerDigest is untrusted). + // But for c/storage to reasonably use it (as a CompressedDigest value), we should also ensure the CompressedSize of the created + // layer is correct, and the API does not currently make it possible (.CompressedSize is set from the input stream). + // + // We can legitimately set storage.LayerOptions.OriginalDigest to "", + // but that would just result in PutLayer computing the digest of the input stream == optionalDiffID. + // So, instead, set .OriginalDigest to the value we know already, to avoid that digest computation. + trustedOriginalDigest = optionalDiffID + + // Allow using the already-collected layer contents without extracting the layer again. + // + // This only matches against the uncompressed digest. + // We don’t have the original compressed data here to trivially set filenames[layerDigest]. + // In particular we can’t achieve the correct Layer.CompressedSize value with the current c/storage API. + // Within-image layer reuse is probably very rare, for now we prefer to avoid that complexity. + if trustedUncompressedDigest != "" { + s.lock.Lock() + s.lockProtected.blobDiffIDs[trustedUncompressedDigest] = trustedUncompressedDigest + s.lockProtected.filenames[trustedUncompressedDigest] = filename + s.lockProtected.fileSizes[trustedUncompressedDigest] = fileSize + s.lock.Unlock() } - // Make sure that we can find this file later, should we need the layer's - // contents again. - s.lock.Lock() - s.filenames[info.digest] = filename - s.lock.Unlock() } // Read the cached blob and use it as a diff. file, err := os.Open(filename) if err != nil { - return fmt.Errorf("opening file %q: %w", filename, err) + return nil, fmt.Errorf("opening file %q: %w", filename, err) } defer file.Close() // Build the new layer using the diff, regardless of where it came from. // TODO: This can take quite some time, and should ideally be cancellable using ctx.Done(). - layer, _, err := s.imageRef.transport.store.PutLayer(id, lastLayer, nil, "", false, &storage.LayerOptions{ - OriginalDigest: info.digest, - UncompressedDigest: diffID, + layer, _, err := s.imageRef.transport.store.PutLayer(newLayerID, parentLayer, nil, "", false, &storage.LayerOptions{ + OriginalDigest: trustedOriginalDigest, + UncompressedDigest: trustedUncompressedDigest, }, file) if err != nil && !errors.Is(err, storage.ErrDuplicateID) { - return fmt.Errorf("adding layer with blob %q: %w", info.digest, err) + return nil, fmt.Errorf("adding layer with blob %q: %w", layerDigest, err) } + return layer, nil +} - s.indexToStorageID[index] = &layer.ID - return nil +// untrustedLayerDiffID returns a DiffID value for layerIndex from the image’s config. +// If the value is not yet available (but it can be available after s.manifets is set), it returns ("", nil). +// WARNING: We don’t validate the DiffID value against the layer contents; it must not be used for any deduplication. +func (s *storageImageDestination) untrustedLayerDiffID(layerIndex int) (digest.Digest, error) { + // At this point, we are either inside the multi-threaded scope of HasThreadSafePutBlob, and + // nothing is writing to s.manifest yet, or PutManifest has been called and s.manifest != nil. + // Either way this function does not need the protection of s.lock. + if s.manifest == nil { + logrus.Debugf("Skipping commit for layer %d, manifest not yet available", layerIndex) + return "", nil + } + + if s.untrustedDiffIDValues == nil { + mt := manifest.GuessMIMEType(s.manifest) + if mt != imgspecv1.MediaTypeImageManifest { + // We could, in principle, build an ImageSource, support arbitrary image formats using image.FromUnparsedImage, + // and then use types.Image.OCIConfig so that we can parse the image. + // + // In practice, this should, right now, only matter for pulls of OCI images (this code path implies that a layer has annotation), + // while converting to a non-OCI formats, using a manual (skopeo copy) or something similar, not (podman pull). + // So it is not implemented yet. + return "", fmt.Errorf("determining DiffID for manifest type %q is not yet supported", mt) + } + man, err := manifest.FromBlob(s.manifest, mt) + if err != nil { + return "", fmt.Errorf("parsing manifest: %w", err) + } + + cb, err := s.getConfigBlob(man.ConfigInfo()) + if err != nil { + return "", err + } + + // retrieve the expected uncompressed digest from the config blob. + configOCI := &imgspecv1.Image{} + if err := json.Unmarshal(cb, configOCI); err != nil { + return "", err + } + s.untrustedDiffIDValues = slices.Clone(configOCI.RootFS.DiffIDs) + if s.untrustedDiffIDValues == nil { // Unlikely but possible in theory… + s.untrustedDiffIDValues = []digest.Digest{} + } + } + if layerIndex >= len(s.untrustedDiffIDValues) { + return "", fmt.Errorf("image config has only %d DiffID values, but a layer with index %d exists", len(s.untrustedDiffIDValues), layerIndex) + } + return s.untrustedDiffIDValues[layerIndex], nil } // Commit marks the process of storing the image as successful and asks for the image to be persisted. @@ -716,6 +979,8 @@ func (s *storageImageDestination) commitLayer(index int, info addedLayerInfo, si // - Uploaded data MAY be visible to others before Commit() is called // - Uploaded data MAY be removed or MAY remain around if Close() is called without Commit() (i.e. rollback is allowed but not guaranteed) func (s *storageImageDestination) Commit(ctx context.Context, unparsedToplevel types.UnparsedImage) error { + // This function is outside of the scope of HasThreadSafePutBlob, so we don’t need to hold s.lock. + if len(s.manifest) == 0 { return errors.New("Internal error: storageImageDestination.Commit() called without PutManifest()") } @@ -752,20 +1017,22 @@ func (s *storageImageDestination) Commit(ctx context.Context, unparsedToplevel t // Extract, commit, or find the layers. for i, blob := range layerBlobs { - if err := s.commitLayer(i, addedLayerInfo{ + if stopQueue, err := s.commitLayer(i, addedLayerInfo{ digest: blob.Digest, emptyLayer: blob.EmptyLayer, }, blob.Size); err != nil { return err + } else if stopQueue { + return fmt.Errorf("Internal error: storageImageDestination.Commit(): commitLayer() not ready to commit for layer %q", blob.Digest) } } var lastLayer string - if len(layerBlobs) > 0 { // Can happen when using caches - prev := s.indexToStorageID[len(layerBlobs)-1] - if prev == nil { + if len(layerBlobs) > 0 { // Zero-layer images rarely make sense, but it is technically possible, and may happen for non-image artifacts. + prev, ok := s.indexToStorageID[len(layerBlobs)-1] + if !ok { return fmt.Errorf("Internal error: storageImageDestination.Commit(): previous layer %d hasn't been committed (lastLayer == nil)", len(layerBlobs)-1) } - lastLayer = *prev + lastLayer = prev } // If one of those blobs was a configuration blob, then we can try to dig out the date when the image @@ -779,14 +1046,14 @@ func (s *storageImageDestination) Commit(ctx context.Context, unparsedToplevel t // Set up to save the non-layer blobs as data items. Since we only share layers, they should all be in files, so // we just need to screen out the ones that are actually layers to get the list of non-layers. dataBlobs := set.New[digest.Digest]() - for blob := range s.filenames { + for blob := range s.lockProtected.filenames { dataBlobs.Add(blob) } for _, layerBlob := range layerBlobs { dataBlobs.Delete(layerBlob.Digest) } for _, blob := range dataBlobs.Values() { - v, err := os.ReadFile(s.filenames[blob]) + v, err := os.ReadFile(s.lockProtected.filenames[blob]) if err != nil { return fmt.Errorf("copying non-layer blob %q to image: %w", blob, err) } @@ -839,7 +1106,7 @@ func (s *storageImageDestination) Commit(ctx context.Context, unparsedToplevel t } // Set up to save our metadata. - metadata, err := json.Marshal(s) + metadata, err := json.Marshal(s.metadata) if err != nil { return fmt.Errorf("encoding metadata for image: %w", err) } @@ -944,7 +1211,7 @@ func (s *storageImageDestination) PutSignaturesWithFormat(ctx context.Context, s } if instanceDigest == nil { s.signatures = sigblob - s.SignatureSizes = sizes + s.metadata.SignatureSizes = sizes if len(s.manifest) > 0 { manifestDigest := s.manifestDigest instanceDigest = &manifestDigest @@ -952,7 +1219,7 @@ func (s *storageImageDestination) PutSignaturesWithFormat(ctx context.Context, s } if instanceDigest != nil { s.signatureses[*instanceDigest] = sigblob - s.SignaturesSizes[*instanceDigest] = sizes + s.metadata.SignaturesSizes[*instanceDigest] = sizes } return nil } diff --git a/vendor/github.com/containers/image/v5/storage/storage_image.go b/vendor/github.com/containers/image/v5/storage/storage_image.go index ac09f3db..eed846eb 100644 --- a/vendor/github.com/containers/image/v5/storage/storage_image.go +++ b/vendor/github.com/containers/image/v5/storage/storage_image.go @@ -18,11 +18,6 @@ var ( ErrNoSuchImage = storage.ErrNotAnImage ) -type storageImageCloser struct { - types.ImageCloser - size int64 -} - // manifestBigDataKey returns a key suitable for recording a manifest with the specified digest using storage.Store.ImageBigData and related functions. // If a specific manifest digest is explicitly requested by the user, the key returned by this function should be used preferably; // for compatibility, if a manifest is not available under this key, check also storage.ImageDigestBigDataKey @@ -36,6 +31,17 @@ func signatureBigDataKey(digest digest.Digest) string { return "signature-" + digest.Encoded() } +// storageImageMetadata is stored, as JSON, in storage.Image.Metadata +type storageImageMetadata struct { + SignatureSizes []int `json:"signature-sizes,omitempty"` // List of sizes of each signature slice + SignaturesSizes map[digest.Digest][]int `json:"signatures-sizes,omitempty"` // Sizes of each manifest's signature slice +} + +type storageImageCloser struct { + types.ImageCloser + size int64 +} + // Size() returns the previously-computed size of the image, with no error. func (s *storageImageCloser) Size() (int64, error) { return s.size, nil diff --git a/vendor/github.com/containers/image/v5/storage/storage_src.go b/vendor/github.com/containers/image/v5/storage/storage_src.go index f1ce0861..ead3300f 100644 --- a/vendor/github.com/containers/image/v5/storage/storage_src.go +++ b/vendor/github.com/containers/image/v5/storage/storage_src.go @@ -34,16 +34,30 @@ type storageImageSource struct { impl.PropertyMethodsInitialize stubs.NoGetBlobAtInitialize - imageRef storageReference - image *storage.Image - systemContext *types.SystemContext // SystemContext used in GetBlob() to create temporary files - layerPosition map[digest.Digest]int // Where we are in reading a blob's layers - cachedManifest []byte // A cached copy of the manifest, if already known, or nil - getBlobMutex sync.Mutex // Mutex to sync state for parallel GetBlob executions - SignatureSizes []int `json:"signature-sizes,omitempty"` // List of sizes of each signature slice - SignaturesSizes map[digest.Digest][]int `json:"signatures-sizes,omitempty"` // List of sizes of each signature slice + imageRef storageReference + image *storage.Image + systemContext *types.SystemContext // SystemContext used in GetBlob() to create temporary files + metadata storageImageMetadata + cachedManifest []byte // A cached copy of the manifest, if already known, or nil + getBlobMutex sync.Mutex // Mutex to sync state for parallel GetBlob executions + getBlobMutexProtected getBlobMutexProtected } +// getBlobMutexProtected contains storageImageSource data protected by getBlobMutex. +type getBlobMutexProtected struct { + // digestToLayerID is a lookup map from a possibly-untrusted uncompressed layer digest (as returned by LayerInfosForCopy) to the + // layer ID in the store. + digestToLayerID map[digest.Digest]string + + // layerPosition stores where we are in reading a blob's layers + layerPosition map[digest.Digest]int +} + +// expectedLayerDiffIDFlag is a per-layer flag containing an UNTRUSTED uncompressed digest of the layer. +// It is set when pulling a layer by TOC; later, this value is used with digestToLayerID +// to allow identifying the layer — and the consumer is expected to verify the blob returned by GetBlob against the digest. +const expectedLayerDiffIDFlag = "expected-layer-diffid" + // newImageSource sets up an image for reading. func newImageSource(sys *types.SystemContext, imageRef storageReference) (*storageImageSource, error) { // First, locate the image. @@ -59,16 +73,21 @@ func newImageSource(sys *types.SystemContext, imageRef storageReference) (*stora }), NoGetBlobAtInitialize: stubs.NoGetBlobAt(imageRef), - imageRef: imageRef, - systemContext: sys, - image: img, - layerPosition: make(map[digest.Digest]int), - SignatureSizes: []int{}, - SignaturesSizes: make(map[digest.Digest][]int), + imageRef: imageRef, + systemContext: sys, + image: img, + metadata: storageImageMetadata{ + SignatureSizes: []int{}, + SignaturesSizes: make(map[digest.Digest][]int), + }, + getBlobMutexProtected: getBlobMutexProtected{ + digestToLayerID: make(map[digest.Digest]string), + layerPosition: make(map[digest.Digest]int), + }, } image.Compat = impl.AddCompat(image) if img.Metadata != "" { - if err := json.Unmarshal([]byte(img.Metadata), image); err != nil { + if err := json.Unmarshal([]byte(img.Metadata), &image.metadata); err != nil { return nil, fmt.Errorf("decoding metadata for source image: %w", err) } } @@ -91,6 +110,7 @@ func (s *storageImageSource) Close() error { func (s *storageImageSource) GetBlob(ctx context.Context, info types.BlobInfo, cache types.BlobInfoCache) (rc io.ReadCloser, n int64, err error) { // We need a valid digest value. digest := info.Digest + err = digest.Validate() if err != nil { return nil, 0, err @@ -100,10 +120,25 @@ func (s *storageImageSource) GetBlob(ctx context.Context, info types.BlobInfo, c return io.NopCloser(bytes.NewReader(image.GzippedEmptyLayer)), int64(len(image.GzippedEmptyLayer)), nil } - // Check if the blob corresponds to a diff that was used to initialize any layers. Our - // callers should try to retrieve layers using their uncompressed digests, so no need to - // check if they're using one of the compressed digests, which we can't reproduce anyway. - layers, _ := s.imageRef.transport.store.LayersByUncompressedDigest(digest) + var layers []storage.Layer + + // This lookup path is strictly necessary for layers identified by TOC digest + // (where LayersByUncompressedDigest might not find our layer); + // for other layers it is an optimization to avoid the cost of the LayersByUncompressedDigest call. + s.getBlobMutex.Lock() + layerID, found := s.getBlobMutexProtected.digestToLayerID[digest] + s.getBlobMutex.Unlock() + + if found { + if layer, err := s.imageRef.transport.store.Layer(layerID); err == nil { + layers = []storage.Layer{*layer} + } + } else { + // Check if the blob corresponds to a diff that was used to initialize any layers. Our + // callers should try to retrieve layers using their uncompressed digests, so no need to + // check if they're using one of the compressed digests, which we can't reproduce anyway. + layers, _ = s.imageRef.transport.store.LayersByUncompressedDigest(digest) + } // If it's not a layer, then it must be a data item. if len(layers) == 0 { @@ -174,8 +209,8 @@ func (s *storageImageSource) getBlobAndLayerID(digest digest.Digest, layers []st // which claim to have the same contents, that we actually do have multiple layers, otherwise we could // just go ahead and use the first one every time. s.getBlobMutex.Lock() - i := s.layerPosition[digest] - s.layerPosition[digest] = i + 1 + i := s.getBlobMutexProtected.layerPosition[digest] + s.getBlobMutexProtected.layerPosition[digest] = i + 1 s.getBlobMutex.Unlock() if len(layers) > 0 { layer = layers[i%len(layers)] @@ -267,14 +302,35 @@ func (s *storageImageSource) LayerInfosForCopy(ctx context.Context, instanceDige if err != nil { return nil, fmt.Errorf("reading layer %q in image %q: %w", layerID, s.image.ID, err) } - if layer.UncompressedDigest == "" { - return nil, fmt.Errorf("uncompressed digest for layer %q is unknown", layerID) - } if layer.UncompressedSize < 0 { return nil, fmt.Errorf("uncompressed size for layer %q is unknown", layerID) } + + blobDigest := layer.UncompressedDigest + if blobDigest == "" { + if layer.TOCDigest == "" { + return nil, fmt.Errorf("uncompressed digest and TOC digest for layer %q is unknown", layerID) + } + if layer.Flags == nil || layer.Flags[expectedLayerDiffIDFlag] == nil { + return nil, fmt.Errorf("TOC digest %q for layer %q is present but %q flag is not set", layer.TOCDigest, layerID, expectedLayerDiffIDFlag) + } + expectedDigest, ok := layer.Flags[expectedLayerDiffIDFlag].(string) + if !ok { + return nil, fmt.Errorf("TOC digest %q for layer %q is present but %q flag is not a string", layer.TOCDigest, layerID, expectedLayerDiffIDFlag) + } + // If the layer is stored by its TOC, report the expected diffID as the layer Digest; + // the generic code is responsible for validating the digest. + // We can locate the layer without further c/storage help using s.getBlobMutexProtected.digestToLayerID. + blobDigest, err = digest.Parse(expectedDigest) + if err != nil { + return nil, fmt.Errorf("parsing expected diffID %q for layer %q: %w", expectedDigest, layerID, err) + } + } + s.getBlobMutex.Lock() + s.getBlobMutexProtected.digestToLayerID[blobDigest] = layer.ID + s.getBlobMutex.Unlock() blobInfo := types.BlobInfo{ - Digest: layer.UncompressedDigest, + Digest: blobDigest, Size: layer.UncompressedSize, MediaType: uncompressedLayerType, } @@ -324,11 +380,11 @@ func buildLayerInfosForCopy(manifestInfos []manifest.LayerInfo, physicalInfos [] func (s *storageImageSource) GetSignaturesWithFormat(ctx context.Context, instanceDigest *digest.Digest) ([]signature.Signature, error) { var offset int signatureBlobs := []byte{} - signatureSizes := s.SignatureSizes + signatureSizes := s.metadata.SignatureSizes key := "signatures" instance := "default instance" if instanceDigest != nil { - signatureSizes = s.SignaturesSizes[*instanceDigest] + signatureSizes = s.metadata.SignaturesSizes[*instanceDigest] key = signatureBigDataKey(*instanceDigest) instance = instanceDigest.Encoded() } @@ -374,7 +430,7 @@ func (s *storageImageSource) getSize() (int64, error) { sum += bigSize } // Add the signature sizes. - for _, sigSize := range s.SignatureSizes { + for _, sigSize := range s.metadata.SignatureSizes { sum += int64(sigSize) } // Walk the layer list. @@ -384,7 +440,7 @@ func (s *storageImageSource) getSize() (int64, error) { if err != nil { return -1, err } - if layer.UncompressedDigest == "" || layer.UncompressedSize < 0 { + if (layer.TOCDigest == "" && layer.UncompressedDigest == "") || layer.UncompressedSize < 0 { return -1, fmt.Errorf("size for layer %q is unknown, failing getSize()", layerID) } sum += layer.UncompressedSize diff --git a/vendor/github.com/containers/image/v5/storage/storage_transport.go b/vendor/github.com/containers/image/v5/storage/storage_transport.go index deb500b4..b981953a 100644 --- a/vendor/github.com/containers/image/v5/storage/storage_transport.go +++ b/vendor/github.com/containers/image/v5/storage/storage_transport.go @@ -213,7 +213,7 @@ func (s *storageTransport) GetStore() (storage.Store, error) { // Return the transport's previously-set store. If we don't have one // of those, initialize one now. if s.store == nil { - options, err := storage.DefaultStoreOptionsAutoDetectUID() + options, err := storage.DefaultStoreOptions() if err != nil { return nil, err } diff --git a/vendor/github.com/containers/image/v5/types/types.go b/vendor/github.com/containers/image/v5/types/types.go index 180a98c5..7d609734 100644 --- a/vendor/github.com/containers/image/v5/types/types.go +++ b/vendor/github.com/containers/image/v5/types/types.go @@ -135,8 +135,8 @@ type BlobInfo struct { // CompressionOperation is used in Image.UpdateLayerInfos to instruct // whether the original layer's "compressed or not" should be preserved, // possibly while changing the compression algorithm from one to another, - // or if it should be compressed or decompressed. The field defaults to - // preserve the original layer's compressedness. + // or if it should be changed to compressed or decompressed. + // The field defaults to preserve the original layer's compressedness. // TODO: To remove together with CryptoOperation in re-design to remove // field out of BlobInfo. CompressionOperation LayerCompression diff --git a/vendor/github.com/containers/image/v5/version/version.go b/vendor/github.com/containers/image/v5/version/version.go index f5ee5a7f..a14c8e2f 100644 --- a/vendor/github.com/containers/image/v5/version/version.go +++ b/vendor/github.com/containers/image/v5/version/version.go @@ -6,9 +6,9 @@ const ( // VersionMajor is for an API incompatible changes VersionMajor = 5 // VersionMinor is for functionality in a backwards-compatible manner - VersionMinor = 29 + VersionMinor = 30 // VersionPatch is for backwards-compatible bug fixes - VersionPatch = 1 + VersionPatch = 0 // VersionDev indicates development branch. Releases will be empty string. VersionDev = "" diff --git a/vendor/github.com/containers/libtrust/ec_key_no_openssl.go b/vendor/github.com/containers/libtrust/ec_key_no_openssl.go index 90d0e21f..d6cdaca3 100644 --- a/vendor/github.com/containers/libtrust/ec_key_no_openssl.go +++ b/vendor/github.com/containers/libtrust/ec_key_no_openssl.go @@ -1,4 +1,3 @@ -//go:build !libtrust_openssl // +build !libtrust_openssl package libtrust diff --git a/vendor/github.com/containers/libtrust/ec_key_openssl.go b/vendor/github.com/containers/libtrust/ec_key_openssl.go index 42bc2e4d..4137511f 100644 --- a/vendor/github.com/containers/libtrust/ec_key_openssl.go +++ b/vendor/github.com/containers/libtrust/ec_key_openssl.go @@ -1,4 +1,3 @@ -//go:build libtrust_openssl // +build libtrust_openssl package libtrust diff --git a/vendor/github.com/containers/storage/.cirrus.yml b/vendor/github.com/containers/storage/.cirrus.yml index c41dd5da..13bc20e7 100644 --- a/vendor/github.com/containers/storage/.cirrus.yml +++ b/vendor/github.com/containers/storage/.cirrus.yml @@ -17,13 +17,13 @@ env: #### #### Cache-image names to test with (double-quotes around names are critical) ### - FEDORA_NAME: "fedora-39ß" + FEDORA_NAME: "fedora-39" DEBIAN_NAME: "debian-13" # GCE project where images live IMAGE_PROJECT: "libpod-218412" # VM Image built in containers/automation_images - IMAGE_SUFFIX: "c20231004t194547z-f39f38d13" + IMAGE_SUFFIX: "c20240102t155643z-f39f38d13" FEDORA_CACHE_IMAGE_NAME: "fedora-${IMAGE_SUFFIX}" DEBIAN_CACHE_IMAGE_NAME: "debian-${IMAGE_SUFFIX}" @@ -167,7 +167,7 @@ vendor_task: cross_task: container: - image: golang:1.19 + image: golang:1.20 build_script: make cross @@ -181,6 +181,6 @@ success_task: - vendor - cross container: - image: golang:1.19 + image: golang:1.20 clone_script: 'mkdir -p "$CIRRUS_WORKING_DIR"' # Source code not needed script: /bin/true diff --git a/vendor/github.com/containers/storage/Makefile b/vendor/github.com/containers/storage/Makefile index 77189d49..8461c090 100644 --- a/vendor/github.com/containers/storage/Makefile +++ b/vendor/github.com/containers/storage/Makefile @@ -41,7 +41,7 @@ containers-storage: ## build using gc on the host $(GO) build -compiler gc $(BUILDFLAGS) ./cmd/containers-storage codespell: - codespell -S Makefile,build,buildah,buildah.spec,imgtype,copy,AUTHORS,bin,vendor,.git,go.sum,CHANGELOG.md,changelog.txt,seccomp.json,.cirrus.yml,"*.xz,*.gz,*.tar,*.tgz,*ico,*.png,*.1,*.5,*.orig,*.rej" -L worl,flate,uint,iff,od,ERRO -w + codespell -S Makefile,build,buildah,buildah.spec,imgtype,copy,AUTHORS,bin,vendor,.git,go.sum,CHANGELOG.md,changelog.txt,seccomp.json,.cirrus.yml,"*.xz,*.gz,*.tar,*.tgz,*ico,*.png,*.1,*.5,*.orig,*.rej" -L plack,worl,flate,uint,iff,od,ERRO -w binary local-binary: containers-storage diff --git a/vendor/github.com/containers/storage/VERSION b/vendor/github.com/containers/storage/VERSION index ba0a7191..3f483015 100644 --- a/vendor/github.com/containers/storage/VERSION +++ b/vendor/github.com/containers/storage/VERSION @@ -1 +1 @@ -1.51.0 +1.53.0 diff --git a/vendor/github.com/containers/storage/drivers/driver.go b/vendor/github.com/containers/storage/drivers/driver.go index ab32d652..aa99fdea 100644 --- a/vendor/github.com/containers/storage/drivers/driver.go +++ b/vendor/github.com/containers/storage/drivers/driver.go @@ -73,6 +73,13 @@ type ApplyDiffOpts struct { ForceMask *os.FileMode } +// ApplyDiffWithDifferOpts contains optional arguments for ApplyDiffWithDiffer methods. +type ApplyDiffWithDifferOpts struct { + ApplyDiffOpts + + Flags map[string]interface{} +} + // InitFunc initializes the storage driver. type InitFunc func(homedir string, options Options) (Driver, error) @@ -189,6 +196,8 @@ type DriverWithDifferOutput struct { BigData map[string][]byte TarSplit []byte TOCDigest digest.Digest + // RootDirMode is the mode of the root directory of the layer, if specified. + RootDirMode *os.FileMode // Artifacts is a collection of additional artifacts // generated by the differ that the storage driver can use. Artifacts map[string]interface{} @@ -205,10 +214,26 @@ const ( DifferOutputFormatFlat ) +type DifferFsVerity int + +const ( + // DifferFsVerityDisabled means no fs-verity is used + DifferFsVerityDisabled = iota + + // DifferFsVerityEnabled means fs-verity is used when supported + DifferFsVerityEnabled + + // DifferFsVerityRequired means fs-verity is required + DifferFsVerityRequired +) + // DifferOptions overrides how the differ work type DifferOptions struct { // Format defines the destination directory layout format Format DifferOutputFormat + + // UseFsVerity defines whether fs-verity is used + UseFsVerity DifferFsVerity } // Differ defines the interface for using a custom differ. @@ -223,9 +248,9 @@ type DriverWithDiffer interface { Driver // ApplyDiffWithDiffer applies the changes using the callback function. // If id is empty, then a staging directory is created. The staging directory is guaranteed to be usable with ApplyDiffFromStagingDirectory. - ApplyDiffWithDiffer(id, parent string, options *ApplyDiffOpts, differ Differ) (output DriverWithDifferOutput, err error) - // ApplyDiffFromStagingDirectory applies the changes using the specified staging directory. - ApplyDiffFromStagingDirectory(id, parent, stagingDirectory string, diffOutput *DriverWithDifferOutput, options *ApplyDiffOpts) error + ApplyDiffWithDiffer(id, parent string, options *ApplyDiffWithDifferOpts, differ Differ) (output DriverWithDifferOutput, err error) + // ApplyDiffFromStagingDirectory applies the changes using the diffOutput target directory. + ApplyDiffFromStagingDirectory(id, parent string, diffOutput *DriverWithDifferOutput, options *ApplyDiffWithDifferOpts) error // CleanupStagingDirectory cleanups the staging directory. It can be used to cleanup the staging directory on errors CleanupStagingDirectory(stagingDirectory string) error // DifferTarget gets the location where files are stored for the layer. diff --git a/vendor/github.com/containers/storage/drivers/overlay/composefs_supported.go b/vendor/github.com/containers/storage/drivers/overlay/composefs.go similarity index 63% rename from vendor/github.com/containers/storage/drivers/overlay/composefs_supported.go rename to vendor/github.com/containers/storage/drivers/overlay/composefs.go index 26dd3686..baa9d7be 100644 --- a/vendor/github.com/containers/storage/drivers/overlay/composefs_supported.go +++ b/vendor/github.com/containers/storage/drivers/overlay/composefs.go @@ -1,5 +1,5 @@ -//go:build linux && composefs && cgo -// +build linux,composefs,cgo +//go:build linux && cgo +// +build linux,cgo package overlay @@ -7,15 +7,13 @@ import ( "encoding/binary" "errors" "fmt" - "io/fs" "os" "os/exec" "path/filepath" "sync" - "syscall" - "unsafe" "github.com/containers/storage/pkg/chunked/dump" + "github.com/containers/storage/pkg/fsverity" "github.com/containers/storage/pkg/loopback" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" @@ -34,77 +32,6 @@ func getComposeFsHelper() (string, error) { return composeFsHelperPath, composeFsHelperErr } -func composeFsSupported() bool { - _, err := getComposeFsHelper() - return err == nil -} - -func enableVerity(description string, fd int) error { - enableArg := unix.FsverityEnableArg{ - Version: 1, - Hash_algorithm: unix.FS_VERITY_HASH_ALG_SHA256, - Block_size: 4096, - } - - _, _, e1 := syscall.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(unix.FS_IOC_ENABLE_VERITY), uintptr(unsafe.Pointer(&enableArg))) - if e1 != 0 && !errors.Is(e1, unix.EEXIST) { - return fmt.Errorf("failed to enable verity for %q: %w", description, e1) - } - return nil -} - -type verityDigest struct { - Fsv unix.FsverityDigest - Buf [64]byte -} - -func measureVerity(description string, fd int) (string, error) { - var digest verityDigest - digest.Fsv.Size = 64 - _, _, e1 := syscall.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(unix.FS_IOC_MEASURE_VERITY), uintptr(unsafe.Pointer(&digest))) - if e1 != 0 { - return "", fmt.Errorf("failed to measure verity for %q: %w", description, e1) - } - return fmt.Sprintf("%x", digest.Buf[:digest.Fsv.Size]), nil -} - -func enableVerityRecursive(root string) (map[string]string, error) { - digests := make(map[string]string) - walkFn := func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if !d.Type().IsRegular() { - return nil - } - - f, err := os.Open(path) - if err != nil { - return err - } - defer f.Close() - - if err := enableVerity(path, int(f.Fd())); err != nil { - return err - } - - verity, err := measureVerity(path, int(f.Fd())) - if err != nil { - return err - } - - relPath, err := filepath.Rel(root, path) - if err != nil { - return err - } - - digests[relPath] = verity - return nil - } - err := filepath.WalkDir(root, walkFn) - return digests, err -} - func getComposefsBlob(dataDir string) string { return filepath.Join(dataDir, "composefs.blob") } @@ -156,7 +83,7 @@ func generateComposeFsBlob(verityDigests map[string]string, toc interface{}, com return err } - if err := enableVerity("manifest file", int(newFd.Fd())); err != nil && !errors.Is(err, unix.ENOTSUP) && !errors.Is(err, unix.ENOTTY) { + if err := fsverity.EnableVerity("manifest file", int(newFd.Fd())); err != nil && !errors.Is(err, unix.ENOTSUP) && !errors.Is(err, unix.ENOTTY) { logrus.Warningf("%s", err) } diff --git a/vendor/github.com/containers/storage/drivers/overlay/composefs_notsupported.go b/vendor/github.com/containers/storage/drivers/overlay/composefs_notsupported.go deleted file mode 100644 index 347e4d35..00000000 --- a/vendor/github.com/containers/storage/drivers/overlay/composefs_notsupported.go +++ /dev/null @@ -1,24 +0,0 @@ -//go:build !linux || !composefs || !cgo -// +build !linux !composefs !cgo - -package overlay - -import ( - "fmt" -) - -func composeFsSupported() bool { - return false -} - -func generateComposeFsBlob(verityDigests map[string]string, toc interface{}, composefsDir string) error { - return fmt.Errorf("composefs is not supported") -} - -func mountComposefsBlob(dataDir, mountPoint string) error { - return fmt.Errorf("composefs is not supported") -} - -func enableVerityRecursive(path string) (map[string]string, error) { - return nil, fmt.Errorf("composefs is not supported") -} diff --git a/vendor/github.com/containers/storage/drivers/overlay/overlay.go b/vendor/github.com/containers/storage/drivers/overlay/overlay.go index 04ecf871..f007aa94 100644 --- a/vendor/github.com/containers/storage/drivers/overlay/overlay.go +++ b/vendor/github.com/containers/storage/drivers/overlay/overlay.go @@ -82,7 +82,8 @@ const ( lowerFile = "lower" maxDepth = 500 - tocArtifact = "toc" + tocArtifact = "toc" + fsVerityDigestsArtifact = "fs-verity-digests" // idLength represents the number of random characters // which can be used to create the unique link identifier @@ -105,6 +106,7 @@ type overlayOptions struct { mountOptions string ignoreChownErrors bool forceMask *os.FileMode + useComposefs bool } // Driver contains information about the home directory and the list of active mounts that are created using this driver. @@ -122,6 +124,7 @@ type Driver struct { supportsDType bool supportsVolatile *bool usingMetacopy bool + usingComposefs bool supportsIDMappedMounts *bool } @@ -293,7 +296,7 @@ func isNetworkFileSystem(fsMagic graphdriver.FsMagic) bool { // a bunch of network file systems... case graphdriver.FsMagicNfsFs, graphdriver.FsMagicSmbFs, graphdriver.FsMagicAcfs, graphdriver.FsMagicAfs, graphdriver.FsMagicCephFs, graphdriver.FsMagicCIFS, - graphdriver.FsMagicFHGFSFs, graphdriver.FsMagicGPFS, graphdriver.FsMagicIBRIX, + graphdriver.FsMagicGPFS, graphdriver.FsMagicIBRIX, graphdriver.FsMagicKAFS, graphdriver.FsMagicLUSTRE, graphdriver.FsMagicNCP, graphdriver.FsMagicNFSD, graphdriver.FsMagicOCFS2, graphdriver.FsMagicPANFS, graphdriver.FsMagicPRLFS, graphdriver.FsMagicSMB2, graphdriver.FsMagicSNFS, @@ -307,16 +310,6 @@ func isNetworkFileSystem(fsMagic graphdriver.FsMagic) bool { // If overlay filesystem is not supported on the host, a wrapped graphdriver.ErrNotSupported is returned as error. // If an overlay filesystem is not supported over an existing filesystem then a wrapped graphdriver.ErrIncompatibleFS is returned. func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) { - // If custom --imagestore is selected never - // ditch the original graphRoot, instead add it as - // additionalImageStore so its images can still be - // read and used. - if options.ImageStore != "" { - graphRootAsAdditionalStore := fmt.Sprintf("AdditionalImageStore=%s", options.ImageStore) - options.DriverOptions = append(options.DriverOptions, graphRootAsAdditionalStore) - // complete base name with driver name included - options.ImageStore = filepath.Join(options.ImageStore, "overlay") - } opts, err := parseOptions(options.DriverOptions) if err != nil { return nil, err @@ -387,6 +380,22 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) } } + if opts.useComposefs { + if unshare.IsRootless() { + return nil, fmt.Errorf("composefs is not supported in user namespaces") + } + supportsDataOnly, err := supportsDataOnlyLayersCached(home, runhome) + if err != nil { + return nil, err + } + if !supportsDataOnly { + return nil, fmt.Errorf("composefs is not supported on this kernel: %w", graphdriver.ErrIncompatibleFS) + } + if _, err := getComposeFsHelper(); err != nil { + return nil, fmt.Errorf("composefs helper program not found: %w", err) + } + } + var usingMetacopy bool var supportsDType bool var supportsVolatile *bool @@ -448,6 +457,7 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) supportsDType: supportsDType, usingMetacopy: usingMetacopy, supportsVolatile: supportsVolatile, + usingComposefs: opts.useComposefs, options: *opts, } @@ -555,6 +565,12 @@ func parseOptions(options []string) (*overlayOptions, error) { withReference: withReference, }) } + case "use_composefs": + logrus.Debugf("overlay: use_composefs=%s", val) + o.useComposefs, err = strconv.ParseBool(val) + if err != nil { + return nil, err + } case "mount_program": logrus.Debugf("overlay: mount_program=%s", val) if val != "" { @@ -782,7 +798,7 @@ func supportsOverlay(home string, homeMagic graphdriver.FsMagic, rootUID, rootGI } func (d *Driver) useNaiveDiff() bool { - if d.useComposeFs() { + if d.usingComposefs { return true } @@ -837,22 +853,15 @@ func (d *Driver) Status() [][2]string { // Metadata returns meta data about the overlay driver such as // LowerDir, UpperDir, WorkDir and MergeDir used to store data. func (d *Driver) Metadata(id string) (map[string]string, error) { - dir, imagestore, _ := d.dir2(id) + dir := d.dir(id) if _, err := os.Stat(dir); err != nil { return nil, err } - workDirBase := dir - if imagestore != "" { - if _, err := os.Stat(dir); err != nil { - return nil, err - } - workDirBase = imagestore - } metadata := map[string]string{ - "WorkDir": path.Join(workDirBase, "work"), - "MergedDir": path.Join(workDirBase, "merged"), - "UpperDir": path.Join(workDirBase, "diff"), + "WorkDir": path.Join(dir, "work"), + "MergedDir": path.Join(dir, "merged"), + "UpperDir": path.Join(dir, "diff"), } lowerDirs, err := d.getLowerDirs(id) @@ -870,7 +879,7 @@ func (d *Driver) Metadata(id string) (map[string]string, error) { // is being shutdown. For now, we just have to unmount the bind mounted // we had created. func (d *Driver) Cleanup() error { - _ = os.RemoveAll(d.getStagingDir()) + _ = os.RemoveAll(filepath.Join(d.home, stagingDir)) return mount.Unmount(d.home) } @@ -966,8 +975,10 @@ func (d *Driver) Create(id, parent string, opts *graphdriver.CreateOpts) (retErr return d.create(id, parent, opts, true) } -func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disableQuota bool) (retErr error) { - dir, imageStore, _ := d.dir2(id) +func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, readOnly bool) (retErr error) { + dir, homedir, _ := d.dir2(id, readOnly) + + disableQuota := readOnly uidMaps := d.uidMaps gidMaps := d.gidMaps @@ -978,7 +989,7 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable } // Make the link directory if it does not exist - if err := idtools.MkdirAllAs(path.Join(d.home, linkDir), 0o755, 0, 0); err != nil { + if err := idtools.MkdirAllAs(path.Join(homedir, linkDir), 0o755, 0, 0); err != nil { return err } @@ -995,20 +1006,8 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable if err := idtools.MkdirAllAndChownNew(path.Dir(dir), 0o755, idPair); err != nil { return err } - workDirBase := dir - if imageStore != "" { - workDirBase = imageStore - if err := idtools.MkdirAllAndChownNew(path.Dir(imageStore), 0o755, idPair); err != nil { - return err - } - } if parent != "" { - parentBase, parentImageStore, inAdditionalStore := d.dir2(parent) - // If parentBase path is additional image store, select the image contained in parentBase. - // See https://github.com/containers/podman/issues/19748 - if parentImageStore != "" && !inAdditionalStore { - parentBase = parentImageStore - } + parentBase := d.dir(parent) st, err := system.Stat(filepath.Join(parentBase, "diff")) if err != nil { return err @@ -1029,11 +1028,6 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable if err := idtools.MkdirAllAndChownNew(dir, 0o700, idPair); err != nil { return err } - if imageStore != "" { - if err := idtools.MkdirAllAndChownNew(imageStore, 0o700, idPair); err != nil { - return err - } - } defer func() { // Clean up on failure @@ -1041,11 +1035,6 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable if err2 := os.RemoveAll(dir); err2 != nil { logrus.Errorf("While recovering from a failure creating a layer, error deleting %#v: %v", dir, err2) } - if imageStore != "" { - if err2 := os.RemoveAll(workDirBase); err2 != nil { - logrus.Errorf("While recovering from a failure creating a layer, error deleting %#v: %v", workDirBase, err2) - } - } } }() @@ -1068,11 +1057,6 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable if err := d.quotaCtl.SetQuota(dir, quota); err != nil { return err } - if imageStore != "" { - if err := d.quotaCtl.SetQuota(imageStore, quota); err != nil { - return err - } - } } perms := defaultPerms @@ -1081,12 +1065,7 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable } if parent != "" { - parentBase, parentImageStore, inAdditionalStore := d.dir2(parent) - // If parentBase path is additional image store, select the image contained in parentBase. - // See https://github.com/containers/podman/issues/19748 - if parentImageStore != "" && !inAdditionalStore { - parentBase = parentImageStore - } + parentBase := d.dir(parent) st, err := system.Stat(filepath.Join(parentBase, "diff")) if err != nil { return err @@ -1094,17 +1073,14 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable perms = os.FileMode(st.Mode()) } - if err := idtools.MkdirAs(path.Join(workDirBase, "diff"), perms, rootUID, rootGID); err != nil { + if err := idtools.MkdirAs(path.Join(dir, "diff"), perms, rootUID, rootGID); err != nil { return err } lid := generateID(idLength) linkBase := path.Join("..", id, "diff") - if imageStore != "" { - linkBase = path.Join(imageStore, "diff") - } - if err := os.Symlink(linkBase, path.Join(d.home, linkDir, lid)); err != nil { + if err := os.Symlink(linkBase, path.Join(homedir, linkDir, lid)); err != nil { return err } @@ -1113,10 +1089,10 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, disable return err } - if err := idtools.MkdirAs(path.Join(workDirBase, "work"), 0o700, rootUID, rootGID); err != nil { + if err := idtools.MkdirAs(path.Join(dir, "work"), 0o700, rootUID, rootGID); err != nil { return err } - if err := idtools.MkdirAs(path.Join(workDirBase, "merged"), 0o700, rootUID, rootGID); err != nil { + if err := idtools.MkdirAs(path.Join(dir, "merged"), 0o700, rootUID, rootGID); err != nil { return err } @@ -1198,26 +1174,39 @@ func (d *Driver) getLower(parent string) (string, error) { } func (d *Driver) dir(id string) string { - p, _, _ := d.dir2(id) + p, _, _ := d.dir2(id, false) return p } -func (d *Driver) dir2(id string) (string, string, bool) { - newpath := path.Join(d.home, id) - imageStore := "" +func (d *Driver) getAllImageStores() []string { + additionalImageStores := d.AdditionalImageStores() if d.imageStore != "" { - imageStore = path.Join(d.imageStore, id) + additionalImageStores = append([]string{d.imageStore}, additionalImageStores...) + } + return additionalImageStores +} + +func (d *Driver) dir2(id string, useImageStore bool) (string, string, bool) { + var homedir string + + if useImageStore && d.imageStore != "" { + homedir = path.Join(d.imageStore, d.name) + } else { + homedir = d.home } + + newpath := path.Join(homedir, id) + if _, err := os.Stat(newpath); err != nil { - for _, p := range d.AdditionalImageStores() { + for _, p := range d.getAllImageStores() { l := path.Join(p, d.name, id) _, err = os.Stat(l) if err == nil { - return l, imageStore, true + return l, homedir, true } } } - return newpath, imageStore, false + return newpath, homedir, false } func (d *Driver) getLowerDirs(id string) ([]string, error) { @@ -1427,14 +1416,11 @@ func (d *Driver) Get(id string, options graphdriver.MountOpts) (string, error) { } func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountOpts) (_ string, retErr error) { - dir, imageStore, inAdditionalStore := d.dir2(id) + dir, _, inAdditionalStore := d.dir2(id, false) if _, err := os.Stat(dir); err != nil { return "", err } - workDirBase := dir - if imageStore != "" { - workDirBase = imageStore - } + readWrite := !inAdditionalStore if !d.SupportsShifting() || options.DisableShifting { @@ -1539,7 +1525,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO }() composeFsLayers := []string{} - composeFsLayersDir := filepath.Join(workDirBase, "composefs-layers") + composeFsLayersDir := filepath.Join(dir, "composefs-layers") maybeAddComposefsMount := func(lowerID string, i int, readWrite bool) (string, error) { composefsBlob := d.getComposefsData(lowerID) _, err = os.Stat(composefsBlob) @@ -1573,7 +1559,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO return dest, nil } - diffDir := path.Join(workDirBase, "diff") + diffDir := path.Join(dir, "diff") if dest, err := maybeAddComposefsMount(id, 0, readWrite); err != nil { return "", err @@ -1591,7 +1577,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO lower := "" newpath := path.Join(d.home, l) if st, err := os.Stat(newpath); err != nil { - for _, p := range d.AdditionalImageStores() { + for _, p := range d.getAllImageStores() { lower = path.Join(p, d.name, l) if st2, err2 := os.Stat(lower); err2 == nil { if !permsKnown { @@ -1659,21 +1645,27 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO optsList = append(optsList, "metacopy=on", "redirect_dir=on") } - if len(absLowers) == 0 { - absLowers = append(absLowers, path.Join(dir, "empty")) - } - // user namespace requires this to move a directory from lower to upper. rootUID, rootGID, err := idtools.GetRootUIDGID(options.UidMaps, options.GidMaps) if err != nil { return "", err } + if len(absLowers) == 0 { + absLowers = append(absLowers, path.Join(dir, "empty")) + } + if err := idtools.MkdirAllAs(diffDir, perms, rootUID, rootGID); err != nil { - return "", err + if !inAdditionalStore { + return "", err + } + // if it is in an additional store, do not fail if the directory already exists + if _, err2 := os.Stat(diffDir); err2 != nil { + return "", err + } } - mergedDir := path.Join(workDirBase, "merged") + mergedDir := path.Join(dir, "merged") // Create the driver merged dir if err := idtools.MkdirAs(mergedDir, 0o700, rootUID, rootGID); err != nil && !os.IsExist(err) { return "", err @@ -1691,7 +1683,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO } }() - workdir := path.Join(workDirBase, "work") + workdir := path.Join(dir, "work") if d.options.mountProgram == "" && unshare.IsRootless() { optsList = append(optsList, "userxattr") @@ -1841,7 +1833,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO // Put unmounts the mount path created for the give id. func (d *Driver) Put(id string) error { - dir := d.dir(id) + dir, _, inAdditionalStore := d.dir2(id, false) if _, err := os.Stat(dir); err != nil { return err } @@ -1902,11 +1894,27 @@ func (d *Driver) Put(id string) error { } } - if err := unix.Rmdir(mountpoint); err != nil && !os.IsNotExist(err) { - logrus.Debugf("Failed to remove mountpoint %s overlay: %s - %v", id, mountpoint, err) - return fmt.Errorf("removing mount point %q: %w", mountpoint, err) - } + if !inAdditionalStore { + uid, gid := int(0), int(0) + fi, err := os.Stat(mountpoint) + if err != nil { + return err + } + if stat, ok := fi.Sys().(*syscall.Stat_t); ok { + uid, gid = int(stat.Uid), int(stat.Gid) + } + tmpMountpoint := path.Join(dir, "merged.1") + if err := idtools.MkdirAs(tmpMountpoint, 0o700, uid, gid); err != nil && !errors.Is(err, os.ErrExist) { + return err + } + // rename(2) can be used on an empty directory, as it is the mountpoint after umount, and it retains + // its atomic semantic. In this way the "merged" directory is never removed. + if err := unix.Rename(tmpMountpoint, mountpoint); err != nil { + logrus.Debugf("Failed to replace mountpoint %s overlay: %s - %v", id, mountpoint, err) + return fmt.Errorf("replacing mount point %q: %w", mountpoint, err) + } + } return nil } @@ -1994,14 +2002,18 @@ func (g *overlayFileGetter) Close() error { return nil } -func (d *Driver) getStagingDir() string { - return filepath.Join(d.home, stagingDir) +func (d *Driver) getStagingDir(id string) string { + _, homedir, _ := d.dir2(id, d.imageStore != "") + return filepath.Join(homedir, stagingDir) } // DiffGetter returns a FileGetCloser that can read files from the directory that // contains files for the layer differences, either for this layer, or one of our // lowers if we're just a template directory. Used for direct access for tar-split. func (d *Driver) DiffGetter(id string) (graphdriver.FileGetCloser, error) { + if d.usingComposefs { + return nil, nil + } p, err := d.getDiffPath(id) if err != nil { return nil, err @@ -2018,9 +2030,9 @@ func (d *Driver) CleanupStagingDirectory(stagingDirectory string) error { return os.RemoveAll(stagingDirectory) } -func (d *Driver) supportsDataOnlyLayers() (bool, error) { +func supportsDataOnlyLayersCached(home, runhome string) (bool, error) { feature := "dataonly-layers" - overlayCacheResult, overlayCacheText, err := cachedFeatureCheck(d.runhome, feature) + overlayCacheResult, overlayCacheText, err := cachedFeatureCheck(runhome, feature) if err == nil { if overlayCacheResult { logrus.Debugf("Cached value indicated that data-only layers for overlay are supported") @@ -2029,27 +2041,15 @@ func (d *Driver) supportsDataOnlyLayers() (bool, error) { logrus.Debugf("Cached value indicated that data-only layers for overlay are not supported") return false, errors.New(overlayCacheText) } - supportsDataOnly, err := supportsDataOnlyLayers(d.home) - if err2 := cachedFeatureRecord(d.runhome, feature, supportsDataOnly, ""); err2 != nil { + supportsDataOnly, err := supportsDataOnlyLayers(home) + if err2 := cachedFeatureRecord(runhome, feature, supportsDataOnly, ""); err2 != nil { return false, fmt.Errorf("recording overlay data-only layers support status: %w", err2) } return supportsDataOnly, err } -func (d *Driver) useComposeFs() bool { - if !composeFsSupported() || unshare.IsRootless() { - return false - } - supportsDataOnlyLayers, err := d.supportsDataOnlyLayers() - if err != nil { - logrus.Debugf("Check for data-only layers failed with: %v", err) - return false - } - return supportsDataOnlyLayers -} - // ApplyDiff applies the changes in the new layer using the specified function -func (d *Driver) ApplyDiffWithDiffer(id, parent string, options *graphdriver.ApplyDiffOpts, differ graphdriver.Differ) (output graphdriver.DriverWithDifferOutput, err error) { +func (d *Driver) ApplyDiffWithDiffer(id, parent string, options *graphdriver.ApplyDiffWithDifferOpts, differ graphdriver.Differ) (output graphdriver.DriverWithDifferOutput, err error) { var idMappings *idtools.IDMappings if options != nil { idMappings = options.Mappings @@ -2061,15 +2061,22 @@ func (d *Driver) ApplyDiffWithDiffer(id, parent string, options *graphdriver.App var applyDir string if id == "" { - err := os.MkdirAll(d.getStagingDir(), 0o700) + stagingDir := d.getStagingDir(id) + err := os.MkdirAll(stagingDir, 0o700) if err != nil && !os.IsExist(err) { return graphdriver.DriverWithDifferOutput{}, err } - applyDir, err = os.MkdirTemp(d.getStagingDir(), "") + applyDir, err = os.MkdirTemp(stagingDir, "") if err != nil { return graphdriver.DriverWithDifferOutput{}, err } - + perms := defaultPerms + if d.options.forceMask != nil { + perms = *d.options.forceMask + } + if err := os.Chmod(applyDir, perms); err != nil { + return graphdriver.DriverWithDifferOutput{}, err + } } else { var err error applyDir, err = d.getDiffPath(id) @@ -2083,8 +2090,9 @@ func (d *Driver) ApplyDiffWithDiffer(id, parent string, options *graphdriver.App differOptions := graphdriver.DifferOptions{ Format: graphdriver.DifferOutputFormatDir, } - if d.useComposeFs() { + if d.usingComposefs { differOptions.Format = graphdriver.DifferOutputFormatFlat + differOptions.UseFsVerity = graphdriver.DifferFsVerityEnabled } out, err := differ.ApplyDiff(applyDir, &archive.TarOptions{ UIDMaps: idMappings.UIDs(), @@ -2100,33 +2108,42 @@ func (d *Driver) ApplyDiffWithDiffer(id, parent string, options *graphdriver.App } // ApplyDiffFromStagingDirectory applies the changes using the specified staging directory. -func (d *Driver) ApplyDiffFromStagingDirectory(id, parent, stagingDirectory string, diffOutput *graphdriver.DriverWithDifferOutput, options *graphdriver.ApplyDiffOpts) error { - if filepath.Dir(stagingDirectory) != d.getStagingDir() { +func (d *Driver) ApplyDiffFromStagingDirectory(id, parent string, diffOutput *graphdriver.DriverWithDifferOutput, options *graphdriver.ApplyDiffWithDifferOpts) error { + stagingDirectory := diffOutput.Target + if filepath.Dir(stagingDirectory) != d.getStagingDir(id) { return fmt.Errorf("%q is not a staging directory", stagingDirectory) } + diffPath, err := d.getDiffPath(id) + if err != nil { + return err + } - if d.useComposeFs() { - // FIXME: move this logic into the differ so we don't have to open - // the file twice. - verityDigests, err := enableVerityRecursive(stagingDirectory) - if err != nil && !errors.Is(err, unix.ENOTSUP) && !errors.Is(err, unix.ENOTTY) { - logrus.Warningf("%s", err) + // If the current layer doesn't set the mode for the parent, override it with the parent layer's mode. + if d.options.forceMask == nil && diffOutput.RootDirMode == nil && parent != "" { + parentDiffPath, err := d.getDiffPath(parent) + if err != nil { + return err + } + parentSt, err := os.Stat(parentDiffPath) + if err != nil { + return err } + if err := os.Chmod(stagingDirectory, parentSt.Mode()); err != nil { + return err + } + } + + if d.usingComposefs { toc := diffOutput.Artifacts[tocArtifact] + verityDigests := diffOutput.Artifacts[fsVerityDigestsArtifact].(map[string]string) if err := generateComposeFsBlob(verityDigests, toc, d.getComposefsData(id)); err != nil { return err } } - diffPath, err := d.getDiffPath(id) - if err != nil { - return err - } if err := os.RemoveAll(diffPath); err != nil && !os.IsNotExist(err) { return err } - diffOutput.UncompressedDigest = diffOutput.TOCDigest - return os.Rename(stagingDirectory, diffPath) } @@ -2179,12 +2196,8 @@ func (d *Driver) getComposefsData(id string) string { } func (d *Driver) getDiffPath(id string) (string, error) { - dir, imagestore, _ := d.dir2(id) - base := dir - if imagestore != "" { - base = imagestore - } - return redirectDiffIfAdditionalLayer(path.Join(base, "diff")) + dir := d.dir(id) + return redirectDiffIfAdditionalLayer(path.Join(dir, "diff")) } func (d *Driver) getLowerDiffPaths(id string) ([]string, error) { @@ -2275,12 +2288,8 @@ func (d *Driver) AdditionalImageStores() []string { // by toContainer to those specified by toHost. func (d *Driver) UpdateLayerIDMap(id string, toContainer, toHost *idtools.IDMappings, mountLabel string) error { var err error - dir, imagestore, _ := d.dir2(id) - base := dir - if imagestore != "" { - base = imagestore - } - diffDir := filepath.Join(base, "diff") + dir := d.dir(id) + diffDir := filepath.Join(dir, "diff") rootUID, rootGID := 0, 0 if toHost != nil { diff --git a/vendor/github.com/containers/storage/drivers/overlay/overlay_nocgo.go b/vendor/github.com/containers/storage/drivers/overlay/overlay_nocgo.go index 2a7a307a..d4f540c9 100644 --- a/vendor/github.com/containers/storage/drivers/overlay/overlay_nocgo.go +++ b/vendor/github.com/containers/storage/drivers/overlay/overlay_nocgo.go @@ -4,6 +4,7 @@ package overlay import ( + "fmt" "path" "github.com/containers/storage/pkg/directory" @@ -15,3 +16,15 @@ import ( func (d *Driver) ReadWriteDiskUsage(id string) (*directory.DiskUsage, error) { return directory.Usage(path.Join(d.dir(id), "diff")) } + +func getComposeFsHelper() (string, error) { + return "", fmt.Errorf("composefs not supported on this build") +} + +func mountComposefsBlob(dataDir, mountPoint string) error { + return fmt.Errorf("composefs not supported on this build") +} + +func generateComposeFsBlob(verityDigests map[string]string, toc interface{}, composefsDir string) error { + return fmt.Errorf("composefs not supported on this build") +} diff --git a/vendor/github.com/containers/storage/drivers/quota/projectquota.go b/vendor/github.com/containers/storage/drivers/quota/projectquota.go index 2be79698..081fb2b1 100644 --- a/vendor/github.com/containers/storage/drivers/quota/projectquota.go +++ b/vendor/github.com/containers/storage/drivers/quota/projectquota.go @@ -1,453 +1,5 @@ -//go:build linux && !exclude_disk_quota && cgo -// +build linux,!exclude_disk_quota,cgo - -// -// projectquota.go - implements XFS project quota controls -// for setting quota limits on a newly created directory. -// It currently supports the legacy XFS specific ioctls. -// -// TODO: use generic quota control ioctl FS_IOC_FS{GET,SET}XATTR -// for both xfs/ext4 for kernel version >= v4.5 -// - package quota -/* -#include -#include -#include -#include -#include - -#ifndef FS_XFLAG_PROJINHERIT -struct fsxattr { - __u32 fsx_xflags; - __u32 fsx_extsize; - __u32 fsx_nextents; - __u32 fsx_projid; - unsigned char fsx_pad[12]; -}; -#define FS_XFLAG_PROJINHERIT 0x00000200 -#endif -#ifndef FS_IOC_FSGETXATTR -#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) -#endif -#ifndef FS_IOC_FSSETXATTR -#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) -#endif - -#ifndef PRJQUOTA -#define PRJQUOTA 2 -#endif -#ifndef FS_PROJ_QUOTA -#define FS_PROJ_QUOTA 2 -#endif -#ifndef Q_XSETPQLIM -#define Q_XSETPQLIM QCMD(Q_XSETQLIM, PRJQUOTA) -#endif -#ifndef Q_XGETPQUOTA -#define Q_XGETPQUOTA QCMD(Q_XGETQUOTA, PRJQUOTA) -#endif -*/ -import "C" - -import ( - "errors" - "fmt" - "math" - "os" - "path" - "path/filepath" - "sync" - "syscall" - "unsafe" - - "github.com/containers/storage/pkg/directory" - "github.com/sirupsen/logrus" - "golang.org/x/sys/unix" -) - -const projectIDsAllocatedPerQuotaHome = 10000 - // BackingFsBlockDeviceLink is the name of a file that we place in // the home directory of a driver that uses this package. const BackingFsBlockDeviceLink = "backingFsBlockDev" - -// Quota limit params - currently we only control blocks hard limit and inodes -type Quota struct { - Size uint64 - Inodes uint64 -} - -// Control - Context to be used by storage driver (e.g. overlay) -// who wants to apply project quotas to container dirs -type Control struct { - backingFsBlockDev string - nextProjectID uint32 - quotas *sync.Map - basePath string -} - -// Attempt to generate a unigue projectid. Multiple directories -// per file system can have quota and they need a group of unique -// ids. This function attempts to allocate at least projectIDsAllocatedPerQuotaHome(10000) -// unique projectids, based on the inode of the basepath. -func generateUniqueProjectID(path string) (uint32, error) { - fileinfo, err := os.Stat(path) - if err != nil { - return 0, err - } - stat, ok := fileinfo.Sys().(*syscall.Stat_t) - if !ok { - return 0, fmt.Errorf("not a syscall.Stat_t %s", path) - } - projectID := projectIDsAllocatedPerQuotaHome + (stat.Ino*projectIDsAllocatedPerQuotaHome)%(math.MaxUint32-projectIDsAllocatedPerQuotaHome) - return uint32(projectID), nil -} - -// NewControl - initialize project quota support. -// Test to make sure that quota can be set on a test dir and find -// the first project id to be used for the next container create. -// -// Returns nil (and error) if project quota is not supported. -// -// First get the project id of the basePath directory. -// This test will fail if the backing fs is not xfs. -// -// xfs_quota tool can be used to assign a project id to the driver home directory, e.g.: -// echo 100000:/var/lib/containers/storage/overlay >> /etc/projects -// echo 200000:/var/lib/containers/storage/volumes >> /etc/projects -// echo storage:100000 >> /etc/projid -// echo volumes:200000 >> /etc/projid -// xfs_quota -x -c 'project -s storage volumes' / -// -// In the example above, the storage directory project id will be used as a -// "start offset" and all containers will be assigned larger project ids -// (e.g. >= 100000). Then the volumes directory project id will be used as a -// "start offset" and all volumes will be assigned larger project ids -// (e.g. >= 200000). -// This is a way to prevent xfs_quota management from conflicting with -// containers/storage. - -// Then try to create a test directory with the next project id and set a quota -// on it. If that works, continue to scan existing containers to map allocated -// project ids. -func NewControl(basePath string) (*Control, error) { - // - // Get project id of parent dir as minimal id to be used by driver - // - minProjectID, err := getProjectID(basePath) - if err != nil { - return nil, err - } - if minProjectID == 0 { - // Indicates the storage was never initialized - // Generate a unique range of Projectids for this basepath - minProjectID, err = generateUniqueProjectID(basePath) - if err != nil { - return nil, err - } - - } - // - // create backing filesystem device node - // - backingFsBlockDev, err := makeBackingFsDev(basePath) - if err != nil { - return nil, err - } - - // - // Test if filesystem supports project quotas by trying to set - // a quota on the first available project id - // - quota := Quota{ - Size: 0, - Inodes: 0, - } - - q := Control{ - backingFsBlockDev: backingFsBlockDev, - nextProjectID: minProjectID + 1, - quotas: &sync.Map{}, - basePath: basePath, - } - - if err := q.setProjectQuota(minProjectID, quota); err != nil { - return nil, err - } - - // - // get first project id to be used for next container - // - err = q.findNextProjectID() - if err != nil { - return nil, err - } - - logrus.Debugf("NewControl(%s): nextProjectID = %d", basePath, q.nextProjectID) - return &q, nil -} - -// SetQuota - assign a unique project id to directory and set the quota limits -// for that project id -func (q *Control) SetQuota(targetPath string, quota Quota) error { - var projectID uint32 - value, ok := q.quotas.Load(targetPath) - if ok { - projectID, ok = value.(uint32) - } - if !ok { - projectID = q.nextProjectID - - // - // assign project id to new container directory - // - err := setProjectID(targetPath, projectID) - if err != nil { - return err - } - - q.quotas.Store(targetPath, projectID) - q.nextProjectID++ - } - - // - // set the quota limit for the container's project id - // - logrus.Debugf("SetQuota path=%s, size=%d, inodes=%d, projectID=%d", targetPath, quota.Size, quota.Inodes, projectID) - return q.setProjectQuota(projectID, quota) -} - -// ClearQuota removes the map entry in the quotas map for targetPath. -// It does so to prevent the map leaking entries as directories are deleted. -func (q *Control) ClearQuota(targetPath string) { - q.quotas.Delete(targetPath) -} - -// setProjectQuota - set the quota for project id on xfs block device -func (q *Control) setProjectQuota(projectID uint32, quota Quota) error { - var d C.fs_disk_quota_t - d.d_version = C.FS_DQUOT_VERSION - d.d_id = C.__u32(projectID) - d.d_flags = C.FS_PROJ_QUOTA - - if quota.Size > 0 { - d.d_fieldmask = d.d_fieldmask | C.FS_DQ_BHARD | C.FS_DQ_BSOFT - d.d_blk_hardlimit = C.__u64(quota.Size / 512) - d.d_blk_softlimit = d.d_blk_hardlimit - } - if quota.Inodes > 0 { - d.d_fieldmask = d.d_fieldmask | C.FS_DQ_IHARD | C.FS_DQ_ISOFT - d.d_ino_hardlimit = C.__u64(quota.Inodes) - d.d_ino_softlimit = d.d_ino_hardlimit - } - - cs := C.CString(q.backingFsBlockDev) - defer C.free(unsafe.Pointer(cs)) - - runQuotactl := func() syscall.Errno { - _, _, errno := unix.Syscall6(unix.SYS_QUOTACTL, C.Q_XSETPQLIM, - uintptr(unsafe.Pointer(cs)), uintptr(d.d_id), - uintptr(unsafe.Pointer(&d)), 0, 0) - return errno - } - - errno := runQuotactl() - - // If the backingFsBlockDev does not exist any more then try to recreate it. - if errors.Is(errno, unix.ENOENT) { - if _, err := makeBackingFsDev(q.basePath); err != nil { - return fmt.Errorf( - "failed to recreate missing backingFsBlockDev %s for projid %d: %w", - q.backingFsBlockDev, projectID, err, - ) - } - - if errno := runQuotactl(); errno != 0 { - return fmt.Errorf("failed to set quota limit for projid %d on %s after backingFsBlockDev recreation: %w", - projectID, q.backingFsBlockDev, errno) - } - - } else if errno != 0 { - return fmt.Errorf("failed to set quota limit for projid %d on %s: %w", - projectID, q.backingFsBlockDev, errno) - } - - return nil -} - -// GetQuota - get the quota limits of a directory that was configured with SetQuota -func (q *Control) GetQuota(targetPath string, quota *Quota) error { - d, err := q.fsDiskQuotaFromPath(targetPath) - if err != nil { - return err - } - quota.Size = uint64(d.d_blk_hardlimit) * 512 - quota.Inodes = uint64(d.d_ino_hardlimit) - return nil -} - -// GetDiskUsage - get the current disk usage of a directory that was configured with SetQuota -func (q *Control) GetDiskUsage(targetPath string, usage *directory.DiskUsage) error { - d, err := q.fsDiskQuotaFromPath(targetPath) - if err != nil { - return err - } - usage.Size = int64(d.d_bcount) * 512 - usage.InodeCount = int64(d.d_icount) - - return nil -} - -func (q *Control) fsDiskQuotaFromPath(targetPath string) (C.fs_disk_quota_t, error) { - var d C.fs_disk_quota_t - var projectID uint32 - value, ok := q.quotas.Load(targetPath) - if ok { - projectID, ok = value.(uint32) - } - if !ok { - return d, fmt.Errorf("quota not found for path : %s", targetPath) - } - - // - // get the quota limit for the container's project id - // - cs := C.CString(q.backingFsBlockDev) - defer C.free(unsafe.Pointer(cs)) - - _, _, errno := unix.Syscall6(unix.SYS_QUOTACTL, C.Q_XGETPQUOTA, - uintptr(unsafe.Pointer(cs)), uintptr(C.__u32(projectID)), - uintptr(unsafe.Pointer(&d)), 0, 0) - if errno != 0 { - return d, fmt.Errorf("failed to get quota limit for projid %d on %s: %w", - projectID, q.backingFsBlockDev, errno) - } - - return d, nil -} - -// getProjectID - get the project id of path on xfs -func getProjectID(targetPath string) (uint32, error) { - dir, err := openDir(targetPath) - if err != nil { - return 0, err - } - defer closeDir(dir) - - var fsx C.struct_fsxattr - _, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR, - uintptr(unsafe.Pointer(&fsx))) - if errno != 0 { - return 0, fmt.Errorf("failed to get projid for %s: %w", targetPath, errno) - } - - return uint32(fsx.fsx_projid), nil -} - -// setProjectID - set the project id of path on xfs -func setProjectID(targetPath string, projectID uint32) error { - dir, err := openDir(targetPath) - if err != nil { - return err - } - defer closeDir(dir) - - var fsx C.struct_fsxattr - _, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR, - uintptr(unsafe.Pointer(&fsx))) - if errno != 0 { - return fmt.Errorf("failed to get projid for %s: %w", targetPath, errno) - } - fsx.fsx_projid = C.__u32(projectID) - fsx.fsx_xflags |= C.FS_XFLAG_PROJINHERIT - _, _, errno = unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSSETXATTR, - uintptr(unsafe.Pointer(&fsx))) - if errno != 0 { - return fmt.Errorf("failed to set projid for %s: %w", targetPath, errno) - } - - return nil -} - -// findNextProjectID - find the next project id to be used for containers -// by scanning driver home directory to find used project ids -func (q *Control) findNextProjectID() error { - files, err := os.ReadDir(q.basePath) - if err != nil { - return fmt.Errorf("read directory failed : %s", q.basePath) - } - for _, file := range files { - if !file.IsDir() { - continue - } - path := filepath.Join(q.basePath, file.Name()) - projid, err := getProjectID(path) - if err != nil { - return err - } - if projid > 0 { - q.quotas.Store(path, projid) - } - if q.nextProjectID <= projid { - q.nextProjectID = projid + 1 - } - } - - return nil -} - -func free(p *C.char) { - C.free(unsafe.Pointer(p)) -} - -func openDir(path string) (*C.DIR, error) { - Cpath := C.CString(path) - defer free(Cpath) - - dir, errno := C.opendir(Cpath) - if dir == nil { - return nil, fmt.Errorf("can't open dir %v: %w", Cpath, errno) - } - return dir, nil -} - -func closeDir(dir *C.DIR) { - if dir != nil { - C.closedir(dir) - } -} - -func getDirFd(dir *C.DIR) uintptr { - return uintptr(C.dirfd(dir)) -} - -// Get the backing block device of the driver home directory -// and create a block device node under the home directory -// to be used by quotactl commands -func makeBackingFsDev(home string) (string, error) { - var stat unix.Stat_t - if err := unix.Stat(home, &stat); err != nil { - return "", err - } - - backingFsBlockDev := path.Join(home, BackingFsBlockDeviceLink) - backingFsBlockDevTmp := backingFsBlockDev + ".tmp" - // Re-create just in case someone copied the home directory over to a new device - if err := unix.Mknod(backingFsBlockDevTmp, unix.S_IFBLK|0o600, int(stat.Dev)); err != nil { - if !errors.Is(err, unix.EEXIST) { - return "", fmt.Errorf("failed to mknod %s: %w", backingFsBlockDevTmp, err) - } - // On EEXIST, try again after unlinking any potential leftover. - _ = unix.Unlink(backingFsBlockDevTmp) - if err := unix.Mknod(backingFsBlockDevTmp, unix.S_IFBLK|0o600, int(stat.Dev)); err != nil { - return "", fmt.Errorf("failed to mknod %s: %w", backingFsBlockDevTmp, err) - } - } - if err := unix.Rename(backingFsBlockDevTmp, backingFsBlockDev); err != nil { - return "", fmt.Errorf("failed to rename %s to %s: %w", backingFsBlockDevTmp, backingFsBlockDev, err) - } - - return backingFsBlockDev, nil -} diff --git a/vendor/github.com/containers/storage/drivers/quota/projectquota_supported.go b/vendor/github.com/containers/storage/drivers/quota/projectquota_supported.go new file mode 100644 index 00000000..b0623bda --- /dev/null +++ b/vendor/github.com/containers/storage/drivers/quota/projectquota_supported.go @@ -0,0 +1,449 @@ +//go:build linux && !exclude_disk_quota && cgo +// +build linux,!exclude_disk_quota,cgo + +// +// projectquota.go - implements XFS project quota controls +// for setting quota limits on a newly created directory. +// It currently supports the legacy XFS specific ioctls. +// +// TODO: use generic quota control ioctl FS_IOC_FS{GET,SET}XATTR +// for both xfs/ext4 for kernel version >= v4.5 +// + +package quota + +/* +#include +#include +#include +#include +#include + +#ifndef FS_XFLAG_PROJINHERIT +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + unsigned char fsx_pad[12]; +}; +#define FS_XFLAG_PROJINHERIT 0x00000200 +#endif +#ifndef FS_IOC_FSGETXATTR +#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) +#endif +#ifndef FS_IOC_FSSETXATTR +#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) +#endif + +#ifndef PRJQUOTA +#define PRJQUOTA 2 +#endif +#ifndef FS_PROJ_QUOTA +#define FS_PROJ_QUOTA 2 +#endif +#ifndef Q_XSETPQLIM +#define Q_XSETPQLIM QCMD(Q_XSETQLIM, PRJQUOTA) +#endif +#ifndef Q_XGETPQUOTA +#define Q_XGETPQUOTA QCMD(Q_XGETQUOTA, PRJQUOTA) +#endif +*/ +import "C" + +import ( + "errors" + "fmt" + "math" + "os" + "path" + "path/filepath" + "sync" + "syscall" + "unsafe" + + "github.com/containers/storage/pkg/directory" + "github.com/sirupsen/logrus" + "golang.org/x/sys/unix" +) + +const projectIDsAllocatedPerQuotaHome = 10000 + +// Quota limit params - currently we only control blocks hard limit and inodes +type Quota struct { + Size uint64 + Inodes uint64 +} + +// Control - Context to be used by storage driver (e.g. overlay) +// who wants to apply project quotas to container dirs +type Control struct { + backingFsBlockDev string + nextProjectID uint32 + quotas *sync.Map + basePath string +} + +// Attempt to generate a unigue projectid. Multiple directories +// per file system can have quota and they need a group of unique +// ids. This function attempts to allocate at least projectIDsAllocatedPerQuotaHome(10000) +// unique projectids, based on the inode of the basepath. +func generateUniqueProjectID(path string) (uint32, error) { + fileinfo, err := os.Stat(path) + if err != nil { + return 0, err + } + stat, ok := fileinfo.Sys().(*syscall.Stat_t) + if !ok { + return 0, fmt.Errorf("not a syscall.Stat_t %s", path) + } + projectID := projectIDsAllocatedPerQuotaHome + (stat.Ino*projectIDsAllocatedPerQuotaHome)%(math.MaxUint32-projectIDsAllocatedPerQuotaHome) + return uint32(projectID), nil +} + +// NewControl - initialize project quota support. +// Test to make sure that quota can be set on a test dir and find +// the first project id to be used for the next container create. +// +// Returns nil (and error) if project quota is not supported. +// +// First get the project id of the basePath directory. +// This test will fail if the backing fs is not xfs. +// +// xfs_quota tool can be used to assign a project id to the driver home directory, e.g.: +// echo 100000:/var/lib/containers/storage/overlay >> /etc/projects +// echo 200000:/var/lib/containers/storage/volumes >> /etc/projects +// echo storage:100000 >> /etc/projid +// echo volumes:200000 >> /etc/projid +// xfs_quota -x -c 'project -s storage volumes' / +// +// In the example above, the storage directory project id will be used as a +// "start offset" and all containers will be assigned larger project ids +// (e.g. >= 100000). Then the volumes directory project id will be used as a +// "start offset" and all volumes will be assigned larger project ids +// (e.g. >= 200000). +// This is a way to prevent xfs_quota management from conflicting with +// containers/storage. + +// Then try to create a test directory with the next project id and set a quota +// on it. If that works, continue to scan existing containers to map allocated +// project ids. +func NewControl(basePath string) (*Control, error) { + // + // Get project id of parent dir as minimal id to be used by driver + // + minProjectID, err := getProjectID(basePath) + if err != nil { + return nil, err + } + if minProjectID == 0 { + // Indicates the storage was never initialized + // Generate a unique range of Projectids for this basepath + minProjectID, err = generateUniqueProjectID(basePath) + if err != nil { + return nil, err + } + + } + // + // create backing filesystem device node + // + backingFsBlockDev, err := makeBackingFsDev(basePath) + if err != nil { + return nil, err + } + + // + // Test if filesystem supports project quotas by trying to set + // a quota on the first available project id + // + quota := Quota{ + Size: 0, + Inodes: 0, + } + + q := Control{ + backingFsBlockDev: backingFsBlockDev, + nextProjectID: minProjectID + 1, + quotas: &sync.Map{}, + basePath: basePath, + } + + if err := q.setProjectQuota(minProjectID, quota); err != nil { + return nil, err + } + + // + // get first project id to be used for next container + // + err = q.findNextProjectID() + if err != nil { + return nil, err + } + + logrus.Debugf("NewControl(%s): nextProjectID = %d", basePath, q.nextProjectID) + return &q, nil +} + +// SetQuota - assign a unique project id to directory and set the quota limits +// for that project id +func (q *Control) SetQuota(targetPath string, quota Quota) error { + var projectID uint32 + value, ok := q.quotas.Load(targetPath) + if ok { + projectID, ok = value.(uint32) + } + if !ok { + projectID = q.nextProjectID + + // + // assign project id to new container directory + // + err := setProjectID(targetPath, projectID) + if err != nil { + return err + } + + q.quotas.Store(targetPath, projectID) + q.nextProjectID++ + } + + // + // set the quota limit for the container's project id + // + logrus.Debugf("SetQuota path=%s, size=%d, inodes=%d, projectID=%d", targetPath, quota.Size, quota.Inodes, projectID) + return q.setProjectQuota(projectID, quota) +} + +// ClearQuota removes the map entry in the quotas map for targetPath. +// It does so to prevent the map leaking entries as directories are deleted. +func (q *Control) ClearQuota(targetPath string) { + q.quotas.Delete(targetPath) +} + +// setProjectQuota - set the quota for project id on xfs block device +func (q *Control) setProjectQuota(projectID uint32, quota Quota) error { + var d C.fs_disk_quota_t + d.d_version = C.FS_DQUOT_VERSION + d.d_id = C.__u32(projectID) + d.d_flags = C.FS_PROJ_QUOTA + + if quota.Size > 0 { + d.d_fieldmask = d.d_fieldmask | C.FS_DQ_BHARD | C.FS_DQ_BSOFT + d.d_blk_hardlimit = C.__u64(quota.Size / 512) + d.d_blk_softlimit = d.d_blk_hardlimit + } + if quota.Inodes > 0 { + d.d_fieldmask = d.d_fieldmask | C.FS_DQ_IHARD | C.FS_DQ_ISOFT + d.d_ino_hardlimit = C.__u64(quota.Inodes) + d.d_ino_softlimit = d.d_ino_hardlimit + } + + cs := C.CString(q.backingFsBlockDev) + defer C.free(unsafe.Pointer(cs)) + + runQuotactl := func() syscall.Errno { + _, _, errno := unix.Syscall6(unix.SYS_QUOTACTL, C.Q_XSETPQLIM, + uintptr(unsafe.Pointer(cs)), uintptr(d.d_id), + uintptr(unsafe.Pointer(&d)), 0, 0) + return errno + } + + errno := runQuotactl() + + // If the backingFsBlockDev does not exist any more then try to recreate it. + if errors.Is(errno, unix.ENOENT) { + if _, err := makeBackingFsDev(q.basePath); err != nil { + return fmt.Errorf( + "failed to recreate missing backingFsBlockDev %s for projid %d: %w", + q.backingFsBlockDev, projectID, err, + ) + } + + if errno := runQuotactl(); errno != 0 { + return fmt.Errorf("failed to set quota limit for projid %d on %s after backingFsBlockDev recreation: %w", + projectID, q.backingFsBlockDev, errno) + } + + } else if errno != 0 { + return fmt.Errorf("failed to set quota limit for projid %d on %s: %w", + projectID, q.backingFsBlockDev, errno) + } + + return nil +} + +// GetQuota - get the quota limits of a directory that was configured with SetQuota +func (q *Control) GetQuota(targetPath string, quota *Quota) error { + d, err := q.fsDiskQuotaFromPath(targetPath) + if err != nil { + return err + } + quota.Size = uint64(d.d_blk_hardlimit) * 512 + quota.Inodes = uint64(d.d_ino_hardlimit) + return nil +} + +// GetDiskUsage - get the current disk usage of a directory that was configured with SetQuota +func (q *Control) GetDiskUsage(targetPath string, usage *directory.DiskUsage) error { + d, err := q.fsDiskQuotaFromPath(targetPath) + if err != nil { + return err + } + usage.Size = int64(d.d_bcount) * 512 + usage.InodeCount = int64(d.d_icount) + + return nil +} + +func (q *Control) fsDiskQuotaFromPath(targetPath string) (C.fs_disk_quota_t, error) { + var d C.fs_disk_quota_t + var projectID uint32 + value, ok := q.quotas.Load(targetPath) + if ok { + projectID, ok = value.(uint32) + } + if !ok { + return d, fmt.Errorf("quota not found for path : %s", targetPath) + } + + // + // get the quota limit for the container's project id + // + cs := C.CString(q.backingFsBlockDev) + defer C.free(unsafe.Pointer(cs)) + + _, _, errno := unix.Syscall6(unix.SYS_QUOTACTL, C.Q_XGETPQUOTA, + uintptr(unsafe.Pointer(cs)), uintptr(C.__u32(projectID)), + uintptr(unsafe.Pointer(&d)), 0, 0) + if errno != 0 { + return d, fmt.Errorf("failed to get quota limit for projid %d on %s: %w", + projectID, q.backingFsBlockDev, errno) + } + + return d, nil +} + +// getProjectID - get the project id of path on xfs +func getProjectID(targetPath string) (uint32, error) { + dir, err := openDir(targetPath) + if err != nil { + return 0, err + } + defer closeDir(dir) + + var fsx C.struct_fsxattr + _, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR, + uintptr(unsafe.Pointer(&fsx))) + if errno != 0 { + return 0, fmt.Errorf("failed to get projid for %s: %w", targetPath, errno) + } + + return uint32(fsx.fsx_projid), nil +} + +// setProjectID - set the project id of path on xfs +func setProjectID(targetPath string, projectID uint32) error { + dir, err := openDir(targetPath) + if err != nil { + return err + } + defer closeDir(dir) + + var fsx C.struct_fsxattr + _, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR, + uintptr(unsafe.Pointer(&fsx))) + if errno != 0 { + return fmt.Errorf("failed to get projid for %s: %w", targetPath, errno) + } + fsx.fsx_projid = C.__u32(projectID) + fsx.fsx_xflags |= C.FS_XFLAG_PROJINHERIT + _, _, errno = unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSSETXATTR, + uintptr(unsafe.Pointer(&fsx))) + if errno != 0 { + return fmt.Errorf("failed to set projid for %s: %w", targetPath, errno) + } + + return nil +} + +// findNextProjectID - find the next project id to be used for containers +// by scanning driver home directory to find used project ids +func (q *Control) findNextProjectID() error { + files, err := os.ReadDir(q.basePath) + if err != nil { + return fmt.Errorf("read directory failed : %s", q.basePath) + } + for _, file := range files { + if !file.IsDir() { + continue + } + path := filepath.Join(q.basePath, file.Name()) + projid, err := getProjectID(path) + if err != nil { + return err + } + if projid > 0 { + q.quotas.Store(path, projid) + } + if q.nextProjectID <= projid { + q.nextProjectID = projid + 1 + } + } + + return nil +} + +func free(p *C.char) { + C.free(unsafe.Pointer(p)) +} + +func openDir(path string) (*C.DIR, error) { + Cpath := C.CString(path) + defer free(Cpath) + + dir, errno := C.opendir(Cpath) + if dir == nil { + return nil, fmt.Errorf("can't open dir %v: %w", Cpath, errno) + } + return dir, nil +} + +func closeDir(dir *C.DIR) { + if dir != nil { + C.closedir(dir) + } +} + +func getDirFd(dir *C.DIR) uintptr { + return uintptr(C.dirfd(dir)) +} + +// Get the backing block device of the driver home directory +// and create a block device node under the home directory +// to be used by quotactl commands +func makeBackingFsDev(home string) (string, error) { + var stat unix.Stat_t + if err := unix.Stat(home, &stat); err != nil { + return "", err + } + + backingFsBlockDev := path.Join(home, BackingFsBlockDeviceLink) + backingFsBlockDevTmp := backingFsBlockDev + ".tmp" + // Re-create just in case someone copied the home directory over to a new device + if err := unix.Mknod(backingFsBlockDevTmp, unix.S_IFBLK|0o600, int(stat.Dev)); err != nil { + if !errors.Is(err, unix.EEXIST) { + return "", fmt.Errorf("failed to mknod %s: %w", backingFsBlockDevTmp, err) + } + // On EEXIST, try again after unlinking any potential leftover. + _ = unix.Unlink(backingFsBlockDevTmp) + if err := unix.Mknod(backingFsBlockDevTmp, unix.S_IFBLK|0o600, int(stat.Dev)); err != nil { + return "", fmt.Errorf("failed to mknod %s: %w", backingFsBlockDevTmp, err) + } + } + if err := unix.Rename(backingFsBlockDevTmp, backingFsBlockDev); err != nil { + return "", fmt.Errorf("failed to rename %s to %s: %w", backingFsBlockDevTmp, backingFsBlockDev, err) + } + + return backingFsBlockDev, nil +} diff --git a/vendor/github.com/containers/storage/drivers/vfs/driver.go b/vendor/github.com/containers/storage/drivers/vfs/driver.go index 599cf095..9b552254 100644 --- a/vendor/github.com/containers/storage/drivers/vfs/driver.go +++ b/vendor/github.com/containers/storage/drivers/vfs/driver.go @@ -31,8 +31,9 @@ func init() { func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) { d := &Driver{ name: "vfs", - homes: []string{home}, + home: home, idMappings: idtools.NewIDMappingsFromMaps(options.UIDMaps, options.GIDMaps), + imageStore: options.ImageStore, } rootIDs := d.idMappings.RootPair() @@ -47,7 +48,7 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) key = strings.ToLower(key) switch key { case "vfs.imagestore", ".imagestore": - d.homes = append(d.homes, strings.Split(val, ",")...) + d.additionalHomes = append(d.additionalHomes, strings.Split(val, ",")...) continue case "vfs.mountopt": return nil, fmt.Errorf("vfs driver does not support mount options") @@ -62,12 +63,7 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) return nil, fmt.Errorf("vfs driver does not support %s options", key) } } - // If --imagestore is provided, lets add writable graphRoot - // to vfs's additional image store, as it is done for - // `overlay` driver. - if options.ImageStore != "" { - d.homes = append(d.homes, options.ImageStore) - } + d.updater = graphdriver.NewNaiveLayerIDMapUpdater(d) d.naiveDiff = graphdriver.NewNaiveDiffDriver(d, d.updater) @@ -80,11 +76,13 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) // Driver must be wrapped in NaiveDiffDriver to be used as a graphdriver.Driver type Driver struct { name string - homes []string + home string + additionalHomes []string idMappings *idtools.IDMappings ignoreChownErrors bool naiveDiff graphdriver.DiffDriver updater graphdriver.LayerIDMapUpdater + imageStore string } func (d *Driver) String() string { @@ -158,7 +156,7 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, ro bool idMappings = opts.IDMappings } - dir := d.dir(id) + dir := d.dir2(id, ro) rootIDs := idMappings.RootPair() if err := idtools.MkdirAllAndChown(filepath.Dir(dir), 0o700, rootIDs); err != nil { return err @@ -204,18 +202,32 @@ func (d *Driver) create(id, parent string, opts *graphdriver.CreateOpts, ro bool return nil } -func (d *Driver) dir(id string) string { - for i, home := range d.homes { - if i > 0 { - home = filepath.Join(home, d.String()) +func (d *Driver) dir2(id string, useImageStore bool) string { + var homedir string + + if useImageStore && d.imageStore != "" { + homedir = filepath.Join(d.imageStore, d.String(), "dir", filepath.Base(id)) + } else { + homedir = filepath.Join(d.home, "dir", filepath.Base(id)) + } + if _, err := os.Stat(homedir); err != nil { + additionalHomes := d.additionalHomes[:] + if d.imageStore != "" { + additionalHomes = append(additionalHomes, d.imageStore) } - candidate := filepath.Join(home, "dir", filepath.Base(id)) - fi, err := os.Stat(candidate) - if err == nil && fi.IsDir() { - return candidate + for _, home := range additionalHomes { + candidate := filepath.Join(home, d.String(), "dir", filepath.Base(id)) + fi, err := os.Stat(candidate) + if err == nil && fi.IsDir() { + return candidate + } } } - return filepath.Join(d.homes[0], "dir", filepath.Base(id)) + return homedir +} + +func (d *Driver) dir(id string) string { + return d.dir2(id, false) } // Remove deletes the content from the directory for a given id. @@ -263,7 +275,7 @@ func (d *Driver) Exists(id string) bool { // List layers (not including additional image stores) func (d *Driver) ListLayers() ([]string, error) { - entries, err := os.ReadDir(filepath.Join(d.homes[0], "dir")) + entries, err := os.ReadDir(filepath.Join(d.home, "dir")) if err != nil { return nil, err } @@ -285,8 +297,8 @@ func (d *Driver) ListLayers() ([]string, error) { // AdditionalImageStores returns additional image stores supported by the driver func (d *Driver) AdditionalImageStores() []string { - if len(d.homes) > 1 { - return d.homes[1:] + if len(d.additionalHomes) > 0 { + return d.additionalHomes } return nil } diff --git a/vendor/github.com/containers/storage/layers.go b/vendor/github.com/containers/storage/layers.go index d105e73f..f1325262 100644 --- a/vendor/github.com/containers/storage/layers.go +++ b/vendor/github.com/containers/storage/layers.go @@ -126,6 +126,13 @@ type Layer struct { // as a DiffID. UncompressedDigest digest.Digest `json:"diff-digest,omitempty"` + // TOCDigest represents the digest of the Table of Contents (TOC) of the blob. + // This digest is utilized when the UncompressedDigest is not + // validated during the partial image pull process, but the + // TOC itself is validated. + // It serves as an alternative reference under these specific conditions. + TOCDigest digest.Digest `json:"toc-digest,omitempty"` + // UncompressedSize is the length of the blob that was last passed to // ApplyDiff() or create(), after we decompressed it. If // UncompressedDigest is not set, this should be treated as if it were @@ -174,6 +181,13 @@ type DiffOptions struct { Compression *archive.Compression } +// stagedLayerOptions are the options passed to .create to populate a staged +// layer +type stagedLayerOptions struct { + DiffOutput *drivers.DriverWithDifferOutput + DiffOptions *drivers.ApplyDiffWithDifferOpts +} + // roLayerStore wraps a graph driver, adding the ability to refer to layers by // name, and keeping track of parent-child relationships, along with a list of // all known layers. @@ -228,6 +242,10 @@ type roLayerStore interface { // specified uncompressed digest value recorded for them. LayersByUncompressedDigest(d digest.Digest) ([]Layer, error) + // LayersByTOCDigest returns a slice of the layers with the + // specified uncompressed digest value recorded for them. + LayersByTOCDigest(d digest.Digest) ([]Layer, error) + // Layers returns a slice of the known layers. Layers() ([]Layer, error) } @@ -256,7 +274,7 @@ type rwLayerStore interface { // underlying drivers do not themselves distinguish between writeable // and read-only layers. Returns the new layer structure and the size of the // diff which was applied to its parent to initialize its contents. - create(id string, parent *Layer, names []string, mountLabel string, options map[string]string, moreOptions *LayerOptions, writeable bool, diff io.Reader) (*Layer, int64, error) + create(id string, parent *Layer, names []string, mountLabel string, options map[string]string, moreOptions *LayerOptions, writeable bool, diff io.Reader, slo *stagedLayerOptions) (*Layer, int64, error) // updateNames modifies names associated with a layer based on (op, names). updateNames(id string, names []string, op updateNameOperation) error @@ -296,13 +314,13 @@ type rwLayerStore interface { // ApplyDiffWithDiffer applies the changes through the differ callback function. // If to is the empty string, then a staging directory is created by the driver. - ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) + ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffWithDifferOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) // CleanupStagingDirectory cleanups the staging directory. It can be used to cleanup the staging directory on errors CleanupStagingDirectory(stagingDirectory string) error - // ApplyDiffFromStagingDirectory uses stagingDirectory to create the diff. - ApplyDiffFromStagingDirectory(id, stagingDirectory string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffOpts) error + // applyDiffFromStagingDirectory uses diffOutput.Target to create the diff. + applyDiffFromStagingDirectory(id string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffWithDifferOpts) error // DifferTarget gets the location where files are stored for the layer. DifferTarget(id string) (string, error) @@ -316,10 +334,71 @@ type rwLayerStore interface { GarbageCollect() error } +type multipleLockFile struct { + lockfiles []*lockfile.LockFile +} + +func (l multipleLockFile) Lock() { + for _, lock := range l.lockfiles { + lock.Lock() + } +} + +func (l multipleLockFile) RLock() { + for _, lock := range l.lockfiles { + lock.RLock() + } +} + +func (l multipleLockFile) Unlock() { + for _, lock := range l.lockfiles { + lock.Unlock() + } +} + +func (l multipleLockFile) ModifiedSince(lastWrite lockfile.LastWrite) (lockfile.LastWrite, bool, error) { + // Look up only the first lockfile, since this is the value returned by RecordWrite(). + return l.lockfiles[0].ModifiedSince(lastWrite) +} + +func (l multipleLockFile) AssertLockedForWriting() { + for _, lock := range l.lockfiles { + lock.AssertLockedForWriting() + } +} + +func (l multipleLockFile) GetLastWrite() (lockfile.LastWrite, error) { + return l.lockfiles[0].GetLastWrite() +} + +func (l multipleLockFile) RecordWrite() (lockfile.LastWrite, error) { + var lastWrite *lockfile.LastWrite + for _, lock := range l.lockfiles { + lw, err := lock.RecordWrite() + if err != nil { + return lw, err + } + // Return the first value we get so we know that + // all the locks have a write time >= to this one. + if lastWrite == nil { + lastWrite = &lw + } + } + return *lastWrite, nil +} + +func (l multipleLockFile) IsReadWrite() bool { + return l.lockfiles[0].IsReadWrite() +} + +func newMultipleLockFile(l ...*lockfile.LockFile) *multipleLockFile { + return &multipleLockFile{lockfiles: l} +} + type layerStore struct { // The following fields are only set when constructing layerStore, and must never be modified afterwards. // They are safe to access without any other locking. - lockfile *lockfile.LockFile // lockfile.IsReadWrite can be used to distinguish between read-write and read-only layer stores. + lockfile *multipleLockFile // lockfile.IsReadWrite can be used to distinguish between read-write and read-only layer stores. mountsLockfile *lockfile.LockFile // Can _only_ be obtained with inProcessLock held. rundir string jsonPath [numLayerLocationIndex]string @@ -337,6 +416,7 @@ type layerStore struct { bymount map[string]*Layer bycompressedsum map[digest.Digest][]string byuncompressedsum map[digest.Digest][]string + bytocsum map[digest.Digest][]string layerspathsModified [numLayerLocationIndex]time.Time // FIXME: This field is only set when constructing layerStore, but locking rules of the driver @@ -366,6 +446,7 @@ func copyLayer(l *Layer) *Layer { CompressedSize: l.CompressedSize, UncompressedDigest: l.UncompressedDigest, UncompressedSize: l.UncompressedSize, + TOCDigest: l.TOCDigest, CompressionType: l.CompressionType, ReadOnly: l.ReadOnly, volatileStore: l.volatileStore, @@ -745,6 +826,7 @@ func (r *layerStore) load(lockedForWriting bool) (bool, error) { names := make(map[string]*Layer) compressedsums := make(map[digest.Digest][]string) uncompressedsums := make(map[digest.Digest][]string) + tocsums := make(map[digest.Digest][]string) var errorToResolveBySaving error // == nil; if there are multiple errors, this is one of them. if r.lockfile.IsReadWrite() { selinux.ClearLabels() @@ -765,6 +847,9 @@ func (r *layerStore) load(lockedForWriting bool) (bool, error) { if layer.UncompressedDigest != "" { uncompressedsums[layer.UncompressedDigest] = append(uncompressedsums[layer.UncompressedDigest], layer.ID) } + if layer.TOCDigest != "" { + tocsums[layer.TOCDigest] = append(tocsums[layer.TOCDigest], layer.ID) + } if layer.MountLabel != "" { selinux.ReserveLabel(layer.MountLabel) } @@ -792,6 +877,7 @@ func (r *layerStore) load(lockedForWriting bool) (bool, error) { r.byname = names r.bycompressedsum = compressedsums r.byuncompressedsum = uncompressedsums + r.bytocsum = tocsums // Load and merge information about which layers are mounted, and where. if r.lockfile.IsReadWrite() { @@ -998,22 +1084,37 @@ func (r *layerStore) saveMounts() error { return r.loadMounts() } -func (s *store) newLayerStore(rundir string, layerdir string, driver drivers.Driver, transient bool) (rwLayerStore, error) { +func (s *store) newLayerStore(rundir, layerdir, imagedir string, driver drivers.Driver, transient bool) (rwLayerStore, error) { if err := os.MkdirAll(rundir, 0o700); err != nil { return nil, err } if err := os.MkdirAll(layerdir, 0o700); err != nil { return nil, err } + if imagedir != "" { + if err := os.MkdirAll(imagedir, 0o700); err != nil { + return nil, err + } + } // Note: While the containers.lock file is in rundir for transient stores // we don't want to do this here, because the non-transient layers in // layers.json might be used externally as a read-only layer (using e.g. // additionalimagestores), and that would look for the lockfile in the // same directory + var lockFiles []*lockfile.LockFile lockFile, err := lockfile.GetLockFile(filepath.Join(layerdir, "layers.lock")) if err != nil { return nil, err } + lockFiles = append(lockFiles, lockFile) + if imagedir != "" { + lockFile, err := lockfile.GetLockFile(filepath.Join(imagedir, "layers.lock")) + if err != nil { + return nil, err + } + lockFiles = append(lockFiles, lockFile) + } + mountsLockfile, err := lockfile.GetLockFile(filepath.Join(rundir, "mountpoints.lock")) if err != nil { return nil, err @@ -1023,7 +1124,7 @@ func (s *store) newLayerStore(rundir string, layerdir string, driver drivers.Dri volatileDir = rundir } rlstore := layerStore{ - lockfile: lockFile, + lockfile: newMultipleLockFile(lockFiles...), mountsLockfile: mountsLockfile, rundir: rundir, jsonPath: [numLayerLocationIndex]string{ @@ -1060,7 +1161,7 @@ func newROLayerStore(rundir string, layerdir string, driver drivers.Driver) (roL return nil, err } rlstore := layerStore{ - lockfile: lockfile, + lockfile: newMultipleLockFile(lockfile), mountsLockfile: nil, rundir: rundir, jsonPath: [numLayerLocationIndex]string{ @@ -1112,7 +1213,7 @@ func (r *layerStore) Size(name string) (int64, error) { // We use the presence of a non-empty digest as an indicator that the size value was intentionally set, and that // a zero value is not just present because it was never set to anything else (which can happen if the layer was // created by a version of this library that didn't keep track of digest and size information). - if layer.UncompressedDigest != "" { + if layer.TOCDigest != "" || layer.UncompressedDigest != "" { return layer.UncompressedSize, nil } return -1, nil @@ -1201,6 +1302,9 @@ func (r *layerStore) PutAdditionalLayer(id string, parentLayer *Layer, names []s if layer.UncompressedDigest != "" { r.byuncompressedsum[layer.UncompressedDigest] = append(r.byuncompressedsum[layer.UncompressedDigest], layer.ID) } + if layer.TOCDigest != "" { + r.bytocsum[layer.TOCDigest] = append(r.bytocsum[layer.TOCDigest], layer.ID) + } if err := r.saveFor(layer); err != nil { if e := r.Delete(layer.ID); e != nil { logrus.Errorf("While recovering from a failure to save layers, error deleting layer %#v: %v", id, e) @@ -1211,7 +1315,7 @@ func (r *layerStore) PutAdditionalLayer(id string, parentLayer *Layer, names []s } // Requires startWriting. -func (r *layerStore) create(id string, parentLayer *Layer, names []string, mountLabel string, options map[string]string, moreOptions *LayerOptions, writeable bool, diff io.Reader) (layer *Layer, size int64, err error) { +func (r *layerStore) create(id string, parentLayer *Layer, names []string, mountLabel string, options map[string]string, moreOptions *LayerOptions, writeable bool, diff io.Reader, slo *stagedLayerOptions) (layer *Layer, size int64, err error) { if moreOptions == nil { moreOptions = &LayerOptions{} } @@ -1251,6 +1355,7 @@ func (r *layerStore) create(id string, parentLayer *Layer, names []string, mount templateCompressedDigest digest.Digest templateCompressedSize int64 templateUncompressedDigest digest.Digest + templateTOCDigest digest.Digest templateUncompressedSize int64 templateCompressionType archive.Compression templateUIDs, templateGIDs []uint32 @@ -1263,6 +1368,7 @@ func (r *layerStore) create(id string, parentLayer *Layer, names []string, mount } templateMetadata = templateLayer.Metadata templateIDMappings = idtools.NewIDMappingsFromMaps(templateLayer.UIDMap, templateLayer.GIDMap) + templateTOCDigest = templateLayer.TOCDigest templateCompressedDigest, templateCompressedSize = templateLayer.CompressedDigest, templateLayer.CompressedSize templateUncompressedDigest, templateUncompressedSize = templateLayer.UncompressedDigest, templateLayer.UncompressedSize templateCompressionType = templateLayer.CompressionType @@ -1291,6 +1397,7 @@ func (r *layerStore) create(id string, parentLayer *Layer, names []string, mount CompressedDigest: templateCompressedDigest, CompressedSize: templateCompressedSize, UncompressedDigest: templateUncompressedDigest, + TOCDigest: templateTOCDigest, UncompressedSize: templateUncompressedSize, CompressionType: templateCompressionType, UIDs: templateUIDs, @@ -1402,6 +1509,11 @@ func (r *layerStore) create(id string, parentLayer *Layer, names []string, mount cleanupFailureContext = "applying layer diff" return nil, -1, err } + } else if slo != nil { + if err := r.applyDiffFromStagingDirectory(layer.ID, slo.DiffOutput, slo.DiffOptions); err != nil { + cleanupFailureContext = "applying staged directory diff" + return nil, -1, err + } } else { // applyDiffWithOptions() would have updated r.bycompressedsum // and r.byuncompressedsum for us, but if we used a template @@ -1413,6 +1525,9 @@ func (r *layerStore) create(id string, parentLayer *Layer, names []string, mount if layer.UncompressedDigest != "" { r.byuncompressedsum[layer.UncompressedDigest] = append(r.byuncompressedsum[layer.UncompressedDigest], layer.ID) } + if layer.TOCDigest != "" { + r.bytocsum[layer.TOCDigest] = append(r.bytocsum[layer.TOCDigest], layer.ID) + } } delete(layer.Flags, incompleteFlag) @@ -2007,9 +2122,16 @@ func (s *simpleGetCloser) Close() error { // LOCKING BUG: See the comments in layerStore.Diff func (r *layerStore) newFileGetter(id string) (drivers.FileGetCloser, error) { if getter, ok := r.driver.(drivers.DiffGetterDriver); ok { - return getter.DiffGetter(id) + fgc, err := getter.DiffGetter(id) + if err != nil { + return nil, err + } + if fgc != nil { + return fgc, nil + } } - path, err := r.Mount(id, drivers.MountOpts{}) + + path, err := r.Mount(id, drivers.MountOpts{Options: []string{"ro"}}) if err != nil { return nil, err } @@ -2197,6 +2319,25 @@ func (r *layerStore) DiffSize(from, to string) (size int64, err error) { return r.driver.DiffSize(to, r.layerMappings(toLayer), from, r.layerMappings(fromLayer), toLayer.MountLabel) } +func updateDigestMap(m *map[digest.Digest][]string, oldvalue, newvalue digest.Digest, id string) { + var newList []string + if oldvalue != "" { + for _, value := range (*m)[oldvalue] { + if value != id { + newList = append(newList, value) + } + } + if len(newList) > 0 { + (*m)[oldvalue] = newList + } else { + delete(*m, oldvalue) + } + } + if newvalue != "" { + (*m)[newvalue] = append((*m)[newvalue], id) + } +} + // Requires startWriting. func (r *layerStore) ApplyDiff(to string, diff io.Reader) (size int64, err error) { return r.applyDiffWithOptions(to, nil, diff) @@ -2233,7 +2374,7 @@ func (r *layerStore) applyDiffWithOptions(to string, layerOptions *LayerOptions, if layerOptions != nil && layerOptions.UncompressedDigest != "" && layerOptions.UncompressedDigest.Algorithm() == digest.Canonical { uncompressedDigest = layerOptions.UncompressedDigest - } else { + } else if compression != archive.Uncompressed { uncompressedDigester = digest.Canonical.Digester() } @@ -2312,28 +2453,17 @@ func (r *layerStore) applyDiffWithOptions(to string, layerOptions *LayerOptions, if uncompressedDigester != nil { uncompressedDigest = uncompressedDigester.Digest() } - - updateDigestMap := func(m *map[digest.Digest][]string, oldvalue, newvalue digest.Digest, id string) { - var newList []string - if oldvalue != "" { - for _, value := range (*m)[oldvalue] { - if value != id { - newList = append(newList, value) - } - } - if len(newList) > 0 { - (*m)[oldvalue] = newList - } else { - delete(*m, oldvalue) - } - } - if newvalue != "" { - (*m)[newvalue] = append((*m)[newvalue], id) - } + if uncompressedDigest == "" && compression == archive.Uncompressed { + uncompressedDigest = compressedDigest } + updateDigestMap(&r.bycompressedsum, layer.CompressedDigest, compressedDigest, layer.ID) layer.CompressedDigest = compressedDigest - layer.CompressedSize = compressedCounter.Count + if layerOptions != nil && layerOptions.OriginalDigest != "" && layerOptions.OriginalSize != nil { + layer.CompressedSize = *layerOptions.OriginalSize + } else { + layer.CompressedSize = compressedCounter.Count + } updateDigestMap(&r.byuncompressedsum, layer.UncompressedDigest, uncompressedDigest, layer.ID) layer.UncompressedDigest = uncompressedDigest layer.UncompressedSize = uncompressedCounter.Count @@ -2372,7 +2502,7 @@ func (r *layerStore) DifferTarget(id string) (string, error) { } // Requires startWriting. -func (r *layerStore) ApplyDiffFromStagingDirectory(id, stagingDirectory string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffOpts) error { +func (r *layerStore) applyDiffFromStagingDirectory(id string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffWithDifferOpts) error { ddriver, ok := r.driver.(drivers.DriverWithDiffer) if !ok { return ErrNotSupported @@ -2382,20 +2512,39 @@ func (r *layerStore) ApplyDiffFromStagingDirectory(id, stagingDirectory string, return ErrLayerUnknown } if options == nil { - options = &drivers.ApplyDiffOpts{ - Mappings: r.layerMappings(layer), - MountLabel: layer.MountLabel, + options = &drivers.ApplyDiffWithDifferOpts{ + ApplyDiffOpts: drivers.ApplyDiffOpts{ + Mappings: r.layerMappings(layer), + MountLabel: layer.MountLabel, + }, + Flags: nil, } } - err := ddriver.ApplyDiffFromStagingDirectory(layer.ID, layer.Parent, stagingDirectory, diffOutput, options) + + err := ddriver.ApplyDiffFromStagingDirectory(layer.ID, layer.Parent, diffOutput, options) if err != nil { return err } layer.UIDs = diffOutput.UIDs layer.GIDs = diffOutput.GIDs + updateDigestMap(&r.byuncompressedsum, layer.UncompressedDigest, diffOutput.UncompressedDigest, layer.ID) layer.UncompressedDigest = diffOutput.UncompressedDigest + updateDigestMap(&r.bytocsum, diffOutput.TOCDigest, diffOutput.TOCDigest, layer.ID) + layer.TOCDigest = diffOutput.TOCDigest layer.UncompressedSize = diffOutput.Size layer.Metadata = diffOutput.Metadata + if options != nil && options.Flags != nil { + if layer.Flags == nil { + layer.Flags = make(map[string]interface{}) + } + for k, v := range options.Flags { + layer.Flags[k] = v + } + } + if err = r.saveFor(layer); err != nil { + return err + } + if len(diffOutput.TarSplit) != 0 { tsdata := bytes.Buffer{} compressor, err := pgzip.NewWriterLevel(&tsdata, pgzip.BestSpeed) @@ -2425,14 +2574,11 @@ func (r *layerStore) ApplyDiffFromStagingDirectory(id, stagingDirectory string, return err } } - if err = r.saveFor(layer); err != nil { - return err - } return err } // Requires startWriting. -func (r *layerStore) ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) { +func (r *layerStore) ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffWithDifferOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) { ddriver, ok := r.driver.(drivers.DriverWithDiffer) if !ok { return nil, ErrNotSupported @@ -2448,9 +2594,11 @@ func (r *layerStore) ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffOp return nil, ErrLayerUnknown } if options == nil { - options = &drivers.ApplyDiffOpts{ - Mappings: r.layerMappings(layer), - MountLabel: layer.MountLabel, + options = &drivers.ApplyDiffWithDifferOpts{ + ApplyDiffOpts: drivers.ApplyDiffOpts{ + Mappings: r.layerMappings(layer), + MountLabel: layer.MountLabel, + }, } } output, err := ddriver.ApplyDiffWithDiffer(layer.ID, layer.Parent, options, differ) @@ -2494,6 +2642,11 @@ func (r *layerStore) LayersByUncompressedDigest(d digest.Digest) ([]Layer, error return r.layersByDigestMap(r.byuncompressedsum, d) } +// Requires startReading or startWriting. +func (r *layerStore) LayersByTOCDigest(d digest.Digest) ([]Layer, error) { + return r.layersByDigestMap(r.bytocsum, d) +} + func closeAll(closes ...func() error) (rErr error) { for _, f := range closes { if err := f(); err != nil { diff --git a/vendor/github.com/containers/storage/pkg/archive/archive.go b/vendor/github.com/containers/storage/pkg/archive/archive.go index 05d25711..70f76d66 100644 --- a/vendor/github.com/containers/storage/pkg/archive/archive.go +++ b/vendor/github.com/containers/storage/pkg/archive/archive.go @@ -339,12 +339,43 @@ func (compression *Compression) Extension() string { return "" } +// nosysFileInfo hides the system-dependent info of the wrapped FileInfo to +// prevent tar.FileInfoHeader from introspecting it and potentially calling into +// glibc. +type nosysFileInfo struct { + os.FileInfo +} + +func (fi nosysFileInfo) Sys() interface{} { + // A Sys value of type *tar.Header is safe as it is system-independent. + // The tar.FileInfoHeader function copies the fields into the returned + // header without performing any OS lookups. + if sys, ok := fi.FileInfo.Sys().(*tar.Header); ok { + return sys + } + return nil +} + +// sysStatOverride, if non-nil, populates hdr from system-dependent fields of fi. +var sysStatOverride func(fi os.FileInfo, hdr *tar.Header) error + +func fileInfoHeaderNoLookups(fi os.FileInfo, link string) (*tar.Header, error) { + if sysStatOverride == nil { + return tar.FileInfoHeader(fi, link) + } + hdr, err := tar.FileInfoHeader(nosysFileInfo{fi}, link) + if err != nil { + return nil, err + } + return hdr, sysStatOverride(fi, hdr) +} + // FileInfoHeader creates a populated Header from fi. // Compared to archive pkg this function fills in more information. // Also, regardless of Go version, this function fills file type bits (e.g. hdr.Mode |= modeISDIR), // which have been deleted since Go 1.9 archive/tar. func FileInfoHeader(name string, fi os.FileInfo, link string) (*tar.Header, error) { - hdr, err := tar.FileInfoHeader(fi, link) + hdr, err := fileInfoHeaderNoLookups(fi, link) if err != nil { return nil, err } @@ -385,7 +416,7 @@ func ReadUserXattrToTarHeader(path string, hdr *tar.Header) error { return err } for _, key := range xattrs { - if strings.HasPrefix(key, "user.") { + if strings.HasPrefix(key, "user.") && !strings.HasPrefix(key, "user.overlay.") { value, err := system.Lgetxattr(path, key) if err != nil { if errors.Is(err, system.E2BIG) { @@ -477,7 +508,7 @@ func (ta *tarAppender) addTarFile(path, name string) error { } } if fi.Mode()&os.ModeSocket != 0 { - logrus.Warnf("archive: skipping %q since it is a socket", path) + logrus.Infof("archive: skipping %q since it is a socket", path) return nil } @@ -534,6 +565,10 @@ func (ta *tarAppender) addTarFile(path, name string) error { if ta.ChownOpts != nil { hdr.Uid = ta.ChownOpts.UID hdr.Gid = ta.ChownOpts.GID + // Don’t expose the user names from the local system; they probably don’t match the ta.ChownOpts value anyway, + // and they unnecessarily give recipients of the tar file potentially private data. + hdr.Uname = "" + hdr.Gname = "" } maybeTruncateHeaderModTime(hdr) diff --git a/vendor/github.com/containers/storage/pkg/archive/archive_unix.go b/vendor/github.com/containers/storage/pkg/archive/archive_unix.go index 88192f22..c6811031 100644 --- a/vendor/github.com/containers/storage/pkg/archive/archive_unix.go +++ b/vendor/github.com/containers/storage/pkg/archive/archive_unix.go @@ -15,6 +15,31 @@ import ( "golang.org/x/sys/unix" ) +func init() { + sysStatOverride = statUnix +} + +// statUnix populates hdr from system-dependent fields of fi without performing +// any OS lookups. +// Adapted from Moby. +func statUnix(fi os.FileInfo, hdr *tar.Header) error { + s, ok := fi.Sys().(*syscall.Stat_t) + if !ok { + return nil + } + + hdr.Uid = int(s.Uid) + hdr.Gid = int(s.Gid) + + if s.Mode&unix.S_IFBLK != 0 || + s.Mode&unix.S_IFCHR != 0 { + hdr.Devmajor = int64(unix.Major(uint64(s.Rdev))) //nolint: unconvert + hdr.Devminor = int64(unix.Minor(uint64(s.Rdev))) //nolint: unconvert + } + + return nil +} + // fixVolumePathPrefix does platform specific processing to ensure that if // the path being passed in is not in a volume path format, convert it to one. func fixVolumePathPrefix(srcPath string) string { diff --git a/vendor/github.com/containers/storage/pkg/chunked/cache_linux.go b/vendor/github.com/containers/storage/pkg/chunked/cache_linux.go index 5d4befc2..1e3ad86d 100644 --- a/vendor/github.com/containers/storage/pkg/chunked/cache_linux.go +++ b/vendor/github.com/containers/storage/pkg/chunked/cache_linux.go @@ -25,7 +25,7 @@ import ( const ( cacheKey = "chunked-manifest-cache" - cacheVersion = 1 + cacheVersion = 2 digestSha256Empty = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ) @@ -207,9 +207,9 @@ func calculateHardLinkFingerprint(f *internal.FileMetadata) (string, error) { return string(digester.Digest()), nil } -// generateFileLocation generates a file location in the form $OFFSET@$PATH -func generateFileLocation(path string, offset uint64) []byte { - return []byte(fmt.Sprintf("%d@%s", offset, path)) +// generateFileLocation generates a file location in the form $OFFSET:$LEN:$PATH +func generateFileLocation(path string, offset, len uint64) []byte { + return []byte(fmt.Sprintf("%d:%d:%s", offset, len, path)) } // generateTag generates a tag in the form $DIGEST$OFFSET@LEN. @@ -245,7 +245,7 @@ func writeCache(manifest []byte, format graphdriver.DifferOutputFormat, id strin var tags []string for _, k := range toc { if k.Digest != "" { - location := generateFileLocation(k.Name, 0) + location := generateFileLocation(k.Name, 0, uint64(k.Size)) off := uint64(vdata.Len()) l := uint64(len(location)) @@ -276,7 +276,7 @@ func writeCache(manifest []byte, format graphdriver.DifferOutputFormat, id strin digestLen = len(k.Digest) } if k.ChunkDigest != "" { - location := generateFileLocation(k.Name, uint64(k.ChunkOffset)) + location := generateFileLocation(k.Name, uint64(k.ChunkOffset), uint64(k.ChunkSize)) off := uint64(vdata.Len()) l := uint64(len(location)) d := generateTag(k.ChunkDigest, off, l) @@ -490,7 +490,9 @@ func findTag(digest string, metadata *metadata) (string, uint64, uint64) { if digest == d { startOff := i*metadata.tagLen + metadata.digestLen parts := strings.Split(string(metadata.tags[startOff:(i+1)*metadata.tagLen]), "@") + off, _ := strconv.ParseInt(parts[0], 10, 64) + len, _ := strconv.ParseInt(parts[1], 10, 64) return digest, uint64(off), uint64(len) } @@ -507,12 +509,16 @@ func (c *layersCache) findDigestInternal(digest string) (string, string, int64, defer c.mutex.RUnlock() for _, layer := range c.layers { - digest, off, len := findTag(digest, layer.metadata) + digest, off, tagLen := findTag(digest, layer.metadata) if digest != "" { - position := string(layer.metadata.vdata[off : off+len]) - parts := strings.SplitN(position, "@", 2) + position := string(layer.metadata.vdata[off : off+tagLen]) + parts := strings.SplitN(position, ":", 3) + if len(parts) != 3 { + continue + } offFile, _ := strconv.ParseInt(parts[0], 10, 64) - return layer.target, parts[1], offFile, nil + // parts[1] is the chunk length, currently unused. + return layer.target, parts[2], offFile, nil } } @@ -578,7 +584,10 @@ func unmarshalToc(manifest []byte) (*internal.TOC, error) { return byteSliceAsString(buf.Bytes()[from:to]) } - iter = jsoniter.ParseBytes(jsoniter.ConfigFastest, manifest) + pool := iter.Pool() + pool.ReturnIterator(iter) + iter = pool.BorrowIterator(manifest) + for field := iter.ReadObject(); field != ""; field = iter.ReadObject() { if strings.ToLower(field) == "version" { toc.Version = iter.ReadInt() @@ -657,8 +666,17 @@ func unmarshalToc(manifest []byte) (*internal.TOC, error) { } toc.Entries = append(toc.Entries, m) } - break } + + // validate there is no extra data in the provided input. This is a security measure to avoid + // that the digest we calculate for the TOC refers to the entire document. + if iter.Error != nil && iter.Error != io.EOF { + return nil, iter.Error + } + if iter.WhatIsNext() != jsoniter.InvalidValue || !errors.Is(iter.Error, io.EOF) { + return nil, fmt.Errorf("unexpected data after manifest") + } + toc.StringsBuf = buf return &toc, nil } diff --git a/vendor/github.com/containers/storage/pkg/chunked/compression_linux.go b/vendor/github.com/containers/storage/pkg/chunked/compression_linux.go index 1d8141e3..112ca2c7 100644 --- a/vendor/github.com/containers/storage/pkg/chunked/compression_linux.go +++ b/vendor/github.com/containers/storage/pkg/chunked/compression_linux.go @@ -257,8 +257,8 @@ func readZstdChunkedManifest(blobStream ImageSourceSeekable, blobSize int64, ann return decodedBlob, decodedTarSplit, int64(footerData.Offset), err } -func decodeAndValidateBlob(blob []byte, lengthUncompressed uint64, expectedUncompressedChecksum string) ([]byte, error) { - d, err := digest.Parse(expectedUncompressedChecksum) +func decodeAndValidateBlob(blob []byte, lengthUncompressed uint64, expectedCompressedChecksum string) ([]byte, error) { + d, err := digest.Parse(expectedCompressedChecksum) if err != nil { return nil, err } diff --git a/vendor/github.com/containers/storage/pkg/chunked/compressor/compressor.go b/vendor/github.com/containers/storage/pkg/chunked/compressor/compressor.go index ca7ce30f..a2fd904c 100644 --- a/vendor/github.com/containers/storage/pkg/chunked/compressor/compressor.go +++ b/vendor/github.com/containers/storage/pkg/chunked/compressor/compressor.go @@ -420,6 +420,14 @@ func writeZstdChunkedStream(destFile io.Writer, outMetadata map[string]string, r zstdWriter.Close() return err } + + // make sure the entire tarball is flushed to the output as it might contain + // some trailing zeros that affect the checksum. + if _, err := io.Copy(zstdWriter, its); err != nil { + zstdWriter.Close() + return err + } + if err := zstdWriter.Flush(); err != nil { zstdWriter.Close() return err @@ -452,12 +460,12 @@ type zstdChunkedWriter struct { } func (w zstdChunkedWriter) Close() error { - err := <-w.tarSplitErr - if err != nil { - w.tarSplitOut.Close() + errClose := w.tarSplitOut.Close() + + if err := <-w.tarSplitErr; err != nil && err != io.EOF { return err } - return w.tarSplitOut.Close() + return errClose } func (w zstdChunkedWriter) Write(p []byte) (int, error) { diff --git a/vendor/github.com/containers/storage/pkg/chunked/dump/dump.go b/vendor/github.com/containers/storage/pkg/chunked/dump/dump.go index a0892803..d3c105c4 100644 --- a/vendor/github.com/containers/storage/pkg/chunked/dump/dump.go +++ b/vendor/github.com/containers/storage/pkg/chunked/dump/dump.go @@ -4,6 +4,7 @@ import ( "bufio" "fmt" "io" + "path/filepath" "strings" "time" "unicode" @@ -93,13 +94,18 @@ func getStMode(mode uint32, typ string) (uint32, error) { return mode, nil } -func dumpNode(out io.Writer, links map[string]int, verityDigests map[string]string, entry *internal.FileMetadata) error { - path := entry.Name - if path == "" { +func sanitizeName(name string) string { + path := filepath.Clean(name) + if path == "." { path = "/" } else if path[0] != '/' { path = "/" + path } + return path +} + +func dumpNode(out io.Writer, links map[string]int, verityDigests map[string]string, entry *internal.FileMetadata) error { + path := sanitizeName(entry.Name) if _, err := fmt.Fprint(out, escaped(path, ESCAPE_STANDARD)); err != nil { return err @@ -133,9 +139,10 @@ func dumpNode(out io.Writer, links map[string]int, verityDigests map[string]stri var payload string if entry.Linkname != "" { - payload = entry.Linkname - if entry.Type == internal.TypeLink && payload[0] != '/' { - payload = "/" + payload + if entry.Type == internal.TypeSymlink { + payload = entry.Linkname + } else { + payload = sanitizeName(entry.Linkname) } } else { if len(entry.Digest) > 10 { @@ -198,10 +205,13 @@ func GenerateDump(tocI interface{}, verityDigests map[string]string) (io.Reader, if e.Linkname == "" { continue } + if e.Type == internal.TypeSymlink { + continue + } links[e.Linkname] = links[e.Linkname] + 1 } - if len(toc.Entries) == 0 || (toc.Entries[0].Name != "" && toc.Entries[0].Name != "/") { + if len(toc.Entries) == 0 || (sanitizeName(toc.Entries[0].Name) != "/") { root := &internal.FileMetadata{ Name: "/", Type: internal.TypeDir, diff --git a/vendor/github.com/containers/storage/pkg/chunked/storage_linux.go b/vendor/github.com/containers/storage/pkg/chunked/storage_linux.go index 8493a2c1..f300df34 100644 --- a/vendor/github.com/containers/storage/pkg/chunked/storage_linux.go +++ b/vendor/github.com/containers/storage/pkg/chunked/storage_linux.go @@ -25,6 +25,7 @@ import ( "github.com/containers/storage/pkg/archive" "github.com/containers/storage/pkg/chunked/compressor" "github.com/containers/storage/pkg/chunked/internal" + "github.com/containers/storage/pkg/fsverity" "github.com/containers/storage/pkg/idtools" "github.com/containers/storage/pkg/system" "github.com/containers/storage/types" @@ -40,12 +41,14 @@ import ( const ( maxNumberMissingChunks = 1024 + autoMergePartsThreshold = 128 // if the gap between two ranges is below this threshold, automatically merge them. newFileFlags = (unix.O_CREAT | unix.O_TRUNC | unix.O_EXCL | unix.O_WRONLY) containersOverrideXattr = "user.containers.override_stat" bigDataKey = "zstd-chunked-manifest" chunkedData = "zstd-chunked-data" chunkedLayerDataKey = "zstd-chunked-layer-data" tocKey = "toc" + fsVerityDigestsKey = "fs-verity-digests" fileTypeZstdChunked = iota fileTypeEstargz @@ -71,11 +74,9 @@ type chunkedDiffer struct { zstdReader *zstd.Decoder rawReader io.Reader - // contentDigest is the digest of the uncompressed content - // (diffID) when the layer is fully retrieved. If the layer - // is not fully retrieved, instead of using the digest of the - // uncompressed content, it refers to the digest of the TOC. - contentDigest digest.Digest + // tocDigest is the digest of the TOC document when the layer + // is partially pulled. + tocDigest digest.Digest // convertedToZstdChunked is set to true if the layer needs to // be converted to the zstd:chunked format before it can be @@ -86,9 +87,18 @@ type chunkedDiffer struct { // the layer are trusted and should not be validated. skipValidation bool + // blobDigest is the digest of the whole compressed layer. It is used if + // convertToZstdChunked to validate a layer when it is converted since there + // is no TOC referenced by the manifest. + blobDigest digest.Digest + blobSize int64 storeOpts *types.StoreOptions + + useFsVerity graphdriver.DifferFsVerity + fsVerityDigests map[string]string + fsVerityMutex sync.Mutex } var xattrsToIgnore = map[string]interface{}{ @@ -188,33 +198,7 @@ func (f *seekableFile) GetBlobAt(chunks []ImageSourceChunk) (chan io.ReadCloser, return streams, errs, nil } -func convertTarToZstdChunked(destDirectory string, blobSize int64, iss ImageSourceSeekable) (*seekableFile, digest.Digest, map[string]string, error) { - var payload io.ReadCloser - var streams chan io.ReadCloser - var errs chan error - var err error - - chunksToRequest := []ImageSourceChunk{ - { - Offset: 0, - Length: uint64(blobSize), - }, - } - - streams, errs, err = iss.GetBlobAt(chunksToRequest) - if err != nil { - return nil, "", nil, err - } - select { - case p := <-streams: - payload = p - case err := <-errs: - return nil, "", nil, err - } - if payload == nil { - return nil, "", nil, errors.New("invalid stream returned") - } - +func convertTarToZstdChunked(destDirectory string, payload *os.File) (*seekableFile, digest.Digest, map[string]string, error) { diff, err := archive.DecompressStream(payload) if err != nil { return nil, "", nil, err @@ -235,10 +219,8 @@ func convertTarToZstdChunked(destDirectory string, blobSize int64, iss ImageSour return nil, "", nil, err } - digester := digest.Canonical.Digester() - hash := digester.Hash() - - if _, err := io.Copy(io.MultiWriter(chunked, hash), diff); err != nil { + convertedOutputDigester := digest.Canonical.Digester() + if _, err := io.Copy(io.MultiWriter(chunked, convertedOutputDigester.Hash()), diff); err != nil { f.Close() return nil, "", nil, err } @@ -249,27 +231,39 @@ func convertTarToZstdChunked(destDirectory string, blobSize int64, iss ImageSour is := seekableFile{ file: f, } - return &is, digester.Digest(), newAnnotations, nil + + return &is, convertedOutputDigester.Digest(), newAnnotations, nil } // GetDiffer returns a differ than can be used with ApplyDiffWithDiffer. -func GetDiffer(ctx context.Context, store storage.Store, blobSize int64, annotations map[string]string, iss ImageSourceSeekable) (graphdriver.Differ, error) { - storeOpts, err := types.DefaultStoreOptionsAutoDetectUID() +func GetDiffer(ctx context.Context, store storage.Store, blobDigest digest.Digest, blobSize int64, annotations map[string]string, iss ImageSourceSeekable) (graphdriver.Differ, error) { + storeOpts, err := types.DefaultStoreOptions() if err != nil { return nil, err } - if _, ok := annotations[internal.ManifestChecksumKey]; ok { + if !parseBooleanPullOption(&storeOpts, "enable_partial_images", true) { + return nil, errors.New("enable_partial_images not configured") + } + + _, hasZstdChunkedTOC := annotations[internal.ManifestChecksumKey] + _, hasEstargzTOC := annotations[estargz.TOCJSONDigestAnnotation] + + if hasZstdChunkedTOC && hasEstargzTOC { + return nil, errors.New("both zstd:chunked and eStargz TOC found") + } + + if hasZstdChunkedTOC { return makeZstdChunkedDiffer(ctx, store, blobSize, annotations, iss, &storeOpts) } - if _, ok := annotations[estargz.TOCJSONDigestAnnotation]; ok { + if hasEstargzTOC { return makeEstargzChunkedDiffer(ctx, store, blobSize, annotations, iss, &storeOpts) } - return makeConvertFromRawDiffer(ctx, store, blobSize, annotations, iss, &storeOpts) + return makeConvertFromRawDiffer(ctx, store, blobDigest, blobSize, annotations, iss, &storeOpts) } -func makeConvertFromRawDiffer(ctx context.Context, store storage.Store, blobSize int64, annotations map[string]string, iss ImageSourceSeekable, storeOpts *types.StoreOptions) (*chunkedDiffer, error) { +func makeConvertFromRawDiffer(ctx context.Context, store storage.Store, blobDigest digest.Digest, blobSize int64, annotations map[string]string, iss ImageSourceSeekable, storeOpts *types.StoreOptions) (*chunkedDiffer, error) { if !parseBooleanPullOption(storeOpts, "convert_images", false) { return nil, errors.New("convert_images not configured") } @@ -280,6 +274,8 @@ func makeConvertFromRawDiffer(ctx context.Context, store storage.Store, blobSize } return &chunkedDiffer{ + fsVerityDigests: make(map[string]string), + blobDigest: blobDigest, blobSize: blobSize, convertToZstdChunked: true, copyBuffer: makeCopyBuffer(), @@ -299,22 +295,23 @@ func makeZstdChunkedDiffer(ctx context.Context, store storage.Store, blobSize in return nil, err } - contentDigest, err := digest.Parse(annotations[internal.ManifestChecksumKey]) + tocDigest, err := digest.Parse(annotations[internal.ManifestChecksumKey]) if err != nil { return nil, fmt.Errorf("parse TOC digest %q: %w", annotations[internal.ManifestChecksumKey], err) } return &chunkedDiffer{ - blobSize: blobSize, - contentDigest: contentDigest, - copyBuffer: makeCopyBuffer(), - fileType: fileTypeZstdChunked, - layersCache: layersCache, - manifest: manifest, - storeOpts: storeOpts, - stream: iss, - tarSplit: tarSplit, - tocOffset: tocOffset, + fsVerityDigests: make(map[string]string), + blobSize: blobSize, + tocDigest: tocDigest, + copyBuffer: makeCopyBuffer(), + fileType: fileTypeZstdChunked, + layersCache: layersCache, + manifest: manifest, + storeOpts: storeOpts, + stream: iss, + tarSplit: tarSplit, + tocOffset: tocOffset, }, nil } @@ -328,21 +325,22 @@ func makeEstargzChunkedDiffer(ctx context.Context, store storage.Store, blobSize return nil, err } - contentDigest, err := digest.Parse(annotations[estargz.TOCJSONDigestAnnotation]) + tocDigest, err := digest.Parse(annotations[estargz.TOCJSONDigestAnnotation]) if err != nil { return nil, fmt.Errorf("parse TOC digest %q: %w", annotations[estargz.TOCJSONDigestAnnotation], err) } return &chunkedDiffer{ - blobSize: blobSize, - contentDigest: contentDigest, - copyBuffer: makeCopyBuffer(), - fileType: fileTypeEstargz, - layersCache: layersCache, - manifest: manifest, - storeOpts: storeOpts, - stream: iss, - tocOffset: tocOffset, + fsVerityDigests: make(map[string]string), + blobSize: blobSize, + tocDigest: tocDigest, + copyBuffer: makeCopyBuffer(), + fileType: fileTypeEstargz, + layersCache: layersCache, + manifest: manifest, + storeOpts: storeOpts, + stream: iss, + tocOffset: tocOffset, }, nil } @@ -939,6 +937,8 @@ func (c *chunkedDiffer) appendCompressedStreamToFile(compression compressedFileT return nil } +type recordFsVerityFunc func(string, *os.File) error + type destinationFile struct { digester digest.Digester dirfd int @@ -948,9 +948,10 @@ type destinationFile struct { options *archive.TarOptions skipValidation bool to io.Writer + recordFsVerity recordFsVerityFunc } -func openDestinationFile(dirfd int, metadata *internal.FileMetadata, options *archive.TarOptions, skipValidation bool) (*destinationFile, error) { +func openDestinationFile(dirfd int, metadata *internal.FileMetadata, options *archive.TarOptions, skipValidation bool, recordFsVerity recordFsVerityFunc) (*destinationFile, error) { file, err := openFileUnderRoot(metadata.Name, dirfd, newFileFlags, 0) if err != nil { return nil, err @@ -977,15 +978,32 @@ func openDestinationFile(dirfd int, metadata *internal.FileMetadata, options *ar options: options, dirfd: dirfd, skipValidation: skipValidation, + recordFsVerity: recordFsVerity, }, nil } func (d *destinationFile) Close() (Err error) { defer func() { - err := d.file.Close() + var roFile *os.File + var err error + + if d.recordFsVerity != nil { + roFile, err = reopenFileReadOnly(d.file) + if err == nil { + defer roFile.Close() + } else if Err == nil { + Err = err + } + } + + err = d.file.Close() if Err == nil { Err = err } + + if Err == nil && roFile != nil { + Err = d.recordFsVerity(d.metadata.Name, roFile) + } }() if !d.skipValidation { @@ -1008,6 +1026,35 @@ func closeDestinationFiles(files chan *destinationFile, errors chan error) { close(errors) } +func (c *chunkedDiffer) recordFsVerity(path string, roFile *os.File) error { + if c.useFsVerity == graphdriver.DifferFsVerityDisabled { + return nil + } + // fsverity.EnableVerity doesn't return an error if fs-verity was already + // enabled on the file. + err := fsverity.EnableVerity(path, int(roFile.Fd())) + if err != nil { + if c.useFsVerity == graphdriver.DifferFsVerityRequired { + return err + } + + // If it is not required, ignore the error if the filesystem does not support it. + if errors.Is(err, unix.ENOTSUP) || errors.Is(err, unix.ENOTTY) { + return nil + } + } + verity, err := fsverity.MeasureVerity(path, int(roFile.Fd())) + if err != nil { + return err + } + + c.fsVerityMutex.Lock() + c.fsVerityDigests[path] = verity + c.fsVerityMutex.Unlock() + + return nil +} + func (c *chunkedDiffer) storeMissingFiles(streams chan io.ReadCloser, errs chan error, dest string, dirfd int, missingParts []missingPart, options *archive.TarOptions) (Err error) { var destFile *destinationFile @@ -1095,7 +1142,11 @@ func (c *chunkedDiffer) storeMissingFiles(streams chan io.ReadCloser, errs chan } filesToClose <- destFile } - destFile, err = openDestinationFile(dirfd, mf.File, options, c.skipValidation) + recordFsVerity := c.recordFsVerity + if c.useFsVerity == graphdriver.DifferFsVerityDisabled { + recordFsVerity = nil + } + destFile, err = openDestinationFile(dirfd, mf.File, options, c.skipValidation, recordFsVerity) if err != nil { Err = err goto exit @@ -1130,22 +1181,12 @@ func (c *chunkedDiffer) storeMissingFiles(streams chan io.ReadCloser, errs chan } func mergeMissingChunks(missingParts []missingPart, target int) []missingPart { - getGap := func(missingParts []missingPart, i int) int { + getGap := func(missingParts []missingPart, i int) uint64 { prev := missingParts[i-1].SourceChunk.Offset + missingParts[i-1].SourceChunk.Length - return int(missingParts[i].SourceChunk.Offset - prev) - } - getCost := func(missingParts []missingPart, i int) int { - cost := getGap(missingParts, i) - if missingParts[i-1].OriginFile != nil { - cost += int(missingParts[i-1].SourceChunk.Length) - } - if missingParts[i].OriginFile != nil { - cost += int(missingParts[i].SourceChunk.Length) - } - return cost + return missingParts[i].SourceChunk.Offset - prev } - // simple case: merge chunks from the same file. + // simple case: merge chunks from the same file. Useful to reduce the number of parts to work with later. newMissingParts := missingParts[0:1] prevIndex := 0 for i := 1; i < len(missingParts); i++ { @@ -1165,28 +1206,50 @@ func mergeMissingChunks(missingParts []missingPart, target int) []missingPart { } missingParts = newMissingParts - if len(missingParts) <= target { - return missingParts - } - - // this implementation doesn't account for duplicates, so it could merge - // more than necessary to reach the specified target. Since target itself - // is a heuristic value, it doesn't matter. - costs := make([]int, len(missingParts)-1) - for i := 1; i < len(missingParts); i++ { - costs[i-1] = getCost(missingParts, i) + type gap struct { + from int + to int + cost uint64 + } + var requestGaps []gap + lastOffset := int(-1) + numberSourceChunks := 0 + for i, c := range missingParts { + if c.OriginFile != nil || c.Hole { + // it does not require a network request + continue + } + numberSourceChunks++ + if lastOffset >= 0 { + prevEnd := missingParts[lastOffset].SourceChunk.Offset + missingParts[lastOffset].SourceChunk.Length + cost := c.SourceChunk.Offset - prevEnd + g := gap{ + from: lastOffset, + to: i, + cost: cost, + } + requestGaps = append(requestGaps, g) + } + lastOffset = i } - sort.Ints(costs) - - toShrink := len(missingParts) - target - if toShrink >= len(costs) { - toShrink = len(costs) - 1 + sort.Slice(requestGaps, func(i, j int) bool { + return requestGaps[i].cost < requestGaps[j].cost + }) + toMergeMap := make([]bool, len(missingParts)) + remainingToMerge := numberSourceChunks - target + for _, g := range requestGaps { + if remainingToMerge < 0 && g.cost > autoMergePartsThreshold { + continue + } + for i := g.from + 1; i <= g.to; i++ { + toMergeMap[i] = true + } + remainingToMerge-- } - targetValue := costs[toShrink] newMissingParts = missingParts[0:1] for i := 1; i < len(missingParts); i++ { - if getCost(missingParts, i) > targetValue { + if !toMergeMap[i] { newMissingParts = append(newMissingParts, missingParts[i]) } else { gap := getGap(missingParts, i) @@ -1218,6 +1281,7 @@ func (c *chunkedDiffer) retrieveMissingFiles(stream ImageSourceSeekable, dest st } } + missingParts = mergeMissingChunks(missingParts, maxNumberMissingChunks) calculateChunksToRequest() // There are some missing files. Prepare a multirange request for the missing chunks. @@ -1231,14 +1295,13 @@ func (c *chunkedDiffer) retrieveMissingFiles(stream ImageSourceSeekable, dest st } if _, ok := err.(ErrBadRequest); ok { - requested := len(missingParts) // If the server cannot handle at least 64 chunks in a single request, just give up. - if requested < 64 { + if len(chunksToRequest) < 64 { return err } // Merge more chunks to request - missingParts = mergeMissingChunks(missingParts, requested/2) + missingParts = mergeMissingChunks(missingParts, len(chunksToRequest)/2) calculateChunksToRequest() continue } @@ -1426,15 +1489,39 @@ type findAndCopyFileOptions struct { options *archive.TarOptions } +func reopenFileReadOnly(f *os.File) (*os.File, error) { + path := fmt.Sprintf("/proc/self/fd/%d", f.Fd()) + fd, err := unix.Open(path, unix.O_RDONLY|unix.O_CLOEXEC, 0) + if err != nil { + return nil, err + } + return os.NewFile(uintptr(fd), f.Name()), nil +} + func (c *chunkedDiffer) findAndCopyFile(dirfd int, r *internal.FileMetadata, copyOptions *findAndCopyFileOptions, mode os.FileMode) (bool, error) { finalizeFile := func(dstFile *os.File) error { - if dstFile != nil { - defer dstFile.Close() - if err := setFileAttrs(dirfd, dstFile, mode, r, copyOptions.options, false); err != nil { - return err - } + if dstFile == nil { + return nil } - return nil + err := setFileAttrs(dirfd, dstFile, mode, r, copyOptions.options, false) + if err != nil { + dstFile.Close() + return err + } + var roFile *os.File + if c.useFsVerity != graphdriver.DifferFsVerityDisabled { + roFile, err = reopenFileReadOnly(dstFile) + } + dstFile.Close() + if err != nil { + return err + } + if roFile == nil { + return nil + } + + defer roFile.Close() + return c.recordFsVerity(r.Name, roFile) } found, dstFile, _, err := findFileInOtherLayers(c.layersCache, r, dirfd, copyOptions.useHardLinks) @@ -1491,6 +1578,43 @@ func makeEntriesFlat(mergedEntries []internal.FileMetadata) ([]internal.FileMeta return new, nil } +func (c *chunkedDiffer) copyAllBlobToFile(destination *os.File) (digest.Digest, error) { + var payload io.ReadCloser + var streams chan io.ReadCloser + var errs chan error + var err error + + chunksToRequest := []ImageSourceChunk{ + { + Offset: 0, + Length: uint64(c.blobSize), + }, + } + + streams, errs, err = c.stream.GetBlobAt(chunksToRequest) + if err != nil { + return "", err + } + select { + case p := <-streams: + payload = p + case err := <-errs: + return "", err + } + if payload == nil { + return "", errors.New("invalid stream returned") + } + + originalRawDigester := digest.Canonical.Digester() + + r := io.TeeReader(payload, originalRawDigester.Hash()) + + // copy the entire tarball and compute its digest + _, err = io.Copy(destination, r) + + return originalRawDigester.Digest(), err +} + func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, differOpts *graphdriver.DifferOptions) (graphdriver.DriverWithDifferOutput, error) { defer c.layersCache.release() defer func() { @@ -1499,11 +1623,40 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff } }() + c.useFsVerity = differOpts.UseFsVerity + // stream to use for reading the zstd:chunked or Estargz file. stream := c.stream + var uncompressedDigest digest.Digest + if c.convertToZstdChunked { - fileSource, diffID, annotations, err := convertTarToZstdChunked(dest, c.blobSize, c.stream) + fd, err := unix.Open(dest, unix.O_TMPFILE|unix.O_RDWR|unix.O_CLOEXEC, 0o600) + if err != nil { + return graphdriver.DriverWithDifferOutput{}, err + } + blobFile := os.NewFile(uintptr(fd), "blob-file") + defer func() { + if blobFile != nil { + blobFile.Close() + } + }() + + // calculate the checksum before accessing the file. + compressedDigest, err := c.copyAllBlobToFile(blobFile) + if err != nil { + return graphdriver.DriverWithDifferOutput{}, err + } + + if compressedDigest != c.blobDigest { + return graphdriver.DriverWithDifferOutput{}, fmt.Errorf("invalid digest to convert: expected %q, got %q", c.blobDigest, compressedDigest) + } + + if _, err := blobFile.Seek(0, io.SeekStart); err != nil { + return graphdriver.DriverWithDifferOutput{}, err + } + + fileSource, diffID, annotations, err := convertTarToZstdChunked(dest, blobFile) if err != nil { return graphdriver.DriverWithDifferOutput{}, err } @@ -1511,6 +1664,10 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff // need to keep it open until the entire file is processed. defer fileSource.Close() + // Close the file so that the file descriptor is released and the file is deleted. + blobFile.Close() + blobFile = nil + manifest, tarSplit, tocOffset, err := readZstdChunkedManifest(fileSource, c.blobSize, annotations) if err != nil { return graphdriver.DriverWithDifferOutput{}, fmt.Errorf("read zstd:chunked manifest: %w", err) @@ -1523,12 +1680,12 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff c.fileType = fileTypeZstdChunked c.manifest = manifest c.tarSplit = tarSplit - // since we retrieved the whole file and it was validated, use the diffID instead of the TOC digest. - c.contentDigest = diffID c.tocOffset = tocOffset // the file was generated by us and the digest for each file was already computed, no need to validate it again. c.skipValidation = true + // since we retrieved the whole file and it was validated, set the uncompressed digest. + uncompressedDigest = diffID } lcd := chunkedLayerData{ @@ -1557,11 +1714,8 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff Artifacts: map[string]interface{}{ tocKey: toc, }, - TOCDigest: c.contentDigest, - } - - if !parseBooleanPullOption(c.storeOpts, "enable_partial_images", false) { - return output, errors.New("enable_partial_images not configured") + TOCDigest: c.tocDigest, + UncompressedDigest: uncompressedDigest, } // When the hard links deduplication is used, file attributes are ignored because setting them @@ -1678,13 +1832,17 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff mode := os.FileMode(r.Mode) - r.Name = filepath.Clean(r.Name) - r.Linkname = filepath.Clean(r.Linkname) - t, err := typeToTarType(r.Type) if err != nil { return output, err } + + r.Name = filepath.Clean(r.Name) + // do not modify the value of symlinks + if r.Linkname != "" && t != tar.TypeSymlink { + r.Linkname = filepath.Clean(r.Linkname) + } + if whiteoutConverter != nil { hdr := archivetar.Header{ Typeflag: t, @@ -1730,6 +1888,9 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff } case tar.TypeDir: + if r.Name == "" || r.Name == "." { + output.RootDirMode = &mode + } if err := safeMkdir(dirfd, mode, r.Name, &r, options); err != nil { return output, err } @@ -1851,7 +2012,6 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff } // There are some missing files. Prepare a multirange request for the missing chunks. if len(missingParts) > 0 { - missingParts = mergeMissingChunks(missingParts, maxNumberMissingChunks) if err := c.retrieveMissingFiles(stream, dest, dirfd, missingParts, options); err != nil { return output, err } @@ -1867,6 +2027,8 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff logrus.Debugf("Missing %d bytes out of %d (%.2f %%)", missingPartsSize, totalChunksSize, float32(missingPartsSize*100.0)/float32(totalChunksSize)) } + output.Artifacts[fsVerityDigestsKey] = c.fsVerityDigests + return output, nil } @@ -1926,7 +2088,10 @@ func (c *chunkedDiffer) mergeTocEntries(fileType compressedFileType, entries []i e.Chunks = make([]*internal.FileMetadata, nChunks+1) for j := 0; j <= nChunks; j++ { - e.Chunks[j] = &entries[i+j] + // we need a copy here, otherwise we override the + // .Size later + copy := entries[i+j] + e.Chunks[j] = © e.EndOffset = entries[i+j].EndOffset } i += nChunks diff --git a/vendor/github.com/containers/storage/pkg/chunked/storage_unsupported.go b/vendor/github.com/containers/storage/pkg/chunked/storage_unsupported.go index 8d3fcf2b..ac6bdfec 100644 --- a/vendor/github.com/containers/storage/pkg/chunked/storage_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/chunked/storage_unsupported.go @@ -9,9 +9,10 @@ import ( storage "github.com/containers/storage" graphdriver "github.com/containers/storage/drivers" + digest "github.com/opencontainers/go-digest" ) // GetDiffer returns a differ than can be used with ApplyDiffWithDiffer. -func GetDiffer(ctx context.Context, store storage.Store, blobSize int64, annotations map[string]string, iss ImageSourceSeekable) (graphdriver.Differ, error) { +func GetDiffer(ctx context.Context, store storage.Store, blobDigest digest.Digest, blobSize int64, annotations map[string]string, iss ImageSourceSeekable) (graphdriver.Differ, error) { return nil, errors.New("format not supported on this system") } diff --git a/vendor/github.com/containers/storage/pkg/config/config.go b/vendor/github.com/containers/storage/pkg/config/config.go index 20d72ca8..febe8a0c 100644 --- a/vendor/github.com/containers/storage/pkg/config/config.go +++ b/vendor/github.com/containers/storage/pkg/config/config.go @@ -97,6 +97,8 @@ type OverlayOptionsConfig struct { Inodes string `toml:"inodes,omitempty"` // Do not create a bind mount on the storage home SkipMountHome string `toml:"skip_mount_home,omitempty"` + // Specify whether composefs must be used to mount the data layers + UseComposefs string `toml:"use_composefs,omitempty"` // ForceMask indicates the permissions mask (e.g. "0755") to use for new // files and directories ForceMask string `toml:"force_mask,omitempty"` @@ -147,6 +149,9 @@ type OptionsConfig struct { // ignored when building an image. IgnoreChownErrors string `toml:"ignore_chown_errors,omitempty"` + // Specify whether composefs must be used to mount the data layers + UseComposefs string `toml:"use_composefs,omitempty"` + // ForceMask indicates the permissions mask (e.g. "0755") to use for new // files and directories. ForceMask os.FileMode `toml:"force_mask,omitempty"` @@ -283,6 +288,7 @@ func GetGraphDriverOptions(driverName string, options OptionsConfig) []string { } case "overlay", "overlay2": + // Specify whether composefs must be used to mount the data layers if options.Overlay.IgnoreChownErrors != "" { doptions = append(doptions, fmt.Sprintf("%s.ignore_chown_errors=%s", driverName, options.Overlay.IgnoreChownErrors)) } else if options.IgnoreChownErrors != "" { @@ -316,6 +322,9 @@ func GetGraphDriverOptions(driverName string, options OptionsConfig) []string { } else if options.ForceMask != 0 { doptions = append(doptions, fmt.Sprintf("%s.force_mask=%s", driverName, options.ForceMask)) } + if options.Overlay.UseComposefs != "" { + doptions = append(doptions, fmt.Sprintf("%s.use_composefs=%s", driverName, options.Overlay.UseComposefs)) + } case "vfs": if options.Vfs.IgnoreChownErrors != "" { doptions = append(doptions, fmt.Sprintf("%s.ignore_chown_errors=%s", driverName, options.Vfs.IgnoreChownErrors)) diff --git a/vendor/github.com/containers/storage/pkg/fsverity/fsverity_linux.go b/vendor/github.com/containers/storage/pkg/fsverity/fsverity_linux.go new file mode 100644 index 00000000..5b21c4b7 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/fsverity/fsverity_linux.go @@ -0,0 +1,45 @@ +package fsverity + +import ( + "errors" + "fmt" + "syscall" + "unsafe" + + "golang.org/x/sys/unix" +) + +// verityDigest struct represents the digest used for verifying the integrity of a file. +type verityDigest struct { + Fsv unix.FsverityDigest + Buf [64]byte +} + +// EnableVerity enables the verity feature on a file represented by the file descriptor 'fd'. The file must be opened +// in read-only mode. +// The 'description' parameter is a human-readable description of the file. +func EnableVerity(description string, fd int) error { + enableArg := unix.FsverityEnableArg{ + Version: 1, + Hash_algorithm: unix.FS_VERITY_HASH_ALG_SHA256, + Block_size: 4096, + } + + _, _, e1 := syscall.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(unix.FS_IOC_ENABLE_VERITY), uintptr(unsafe.Pointer(&enableArg))) + if e1 != 0 && !errors.Is(e1, unix.EEXIST) { + return fmt.Errorf("failed to enable verity for %q: %w", description, e1) + } + return nil +} + +// MeasureVerity measures and returns the verity digest for the file represented by 'fd'. +// The 'description' parameter is a human-readable description of the file. +func MeasureVerity(description string, fd int) (string, error) { + var digest verityDigest + digest.Fsv.Size = 64 + _, _, e1 := syscall.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(unix.FS_IOC_MEASURE_VERITY), uintptr(unsafe.Pointer(&digest))) + if e1 != 0 { + return "", fmt.Errorf("failed to measure verity for %q: %w", description, e1) + } + return fmt.Sprintf("%x", digest.Buf[:digest.Fsv.Size]), nil +} diff --git a/vendor/github.com/containers/storage/pkg/fsverity/fsverity_unsupported.go b/vendor/github.com/containers/storage/pkg/fsverity/fsverity_unsupported.go new file mode 100644 index 00000000..46e68c57 --- /dev/null +++ b/vendor/github.com/containers/storage/pkg/fsverity/fsverity_unsupported.go @@ -0,0 +1,21 @@ +//go:build !linux +// +build !linux + +package fsverity + +import ( + "fmt" +) + +// EnableVerity enables the verity feature on a file represented by the file descriptor 'fd'. The file must be opened +// in read-only mode. +// The 'description' parameter is a human-readable description of the file. +func EnableVerity(description string, fd int) error { + return fmt.Errorf("fs-verity is not supported on this platform") +} + +// MeasureVerity measures and returns the verity digest for the file represented by 'fd'. +// The 'description' parameter is a human-readable description of the file. +func MeasureVerity(description string, fd int) (string, error) { + return "", fmt.Errorf("fs-verity is not supported on this platform") +} diff --git a/vendor/github.com/containers/storage/pkg/homedir/homedir.go b/vendor/github.com/containers/storage/pkg/homedir/homedir.go index 85c5e76c..7eb63b67 100644 --- a/vendor/github.com/containers/storage/pkg/homedir/homedir.go +++ b/vendor/github.com/containers/storage/pkg/homedir/homedir.go @@ -6,21 +6,6 @@ import ( "path/filepath" ) -// GetConfigHome returns XDG_CONFIG_HOME. -// GetConfigHome returns $HOME/.config and nil error if XDG_CONFIG_HOME is not set. -// -// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html -func GetConfigHome() (string, error) { - if xdgConfigHome := os.Getenv("XDG_CONFIG_HOME"); xdgConfigHome != "" { - return xdgConfigHome, nil - } - home := Get() - if home == "" { - return "", errors.New("could not get either XDG_CONFIG_HOME or HOME") - } - return filepath.Join(home, ".config"), nil -} - // GetDataHome returns XDG_DATA_HOME. // GetDataHome returns $HOME/.local/share and nil error if XDG_DATA_HOME is not set. // diff --git a/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go b/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go index 0883ee02..9057fe1b 100644 --- a/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go +++ b/vendor/github.com/containers/storage/pkg/homedir/homedir_others.go @@ -1,5 +1,5 @@ -//go:build !linux && !darwin && !freebsd -// +build !linux,!darwin,!freebsd +//go:build !linux && !darwin && !freebsd && !windows +// +build !linux,!darwin,!freebsd,!windows package homedir @@ -8,6 +8,8 @@ package homedir import ( "errors" + "os" + "path/filepath" ) // GetRuntimeDir is unsupported on non-linux system. @@ -19,3 +21,18 @@ func GetRuntimeDir() (string, error) { func StickRuntimeDirContents(files []string) ([]string, error) { return nil, errors.New("homedir.StickRuntimeDirContents() is not supported on this system") } + +// GetConfigHome returns XDG_CONFIG_HOME. +// GetConfigHome returns $HOME/.config and nil error if XDG_CONFIG_HOME is not set. +// +// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html +func GetConfigHome() (string, error) { + if xdgConfigHome := os.Getenv("XDG_CONFIG_HOME"); xdgConfigHome != "" { + return xdgConfigHome, nil + } + home := Get() + if home == "" { + return "", errors.New("could not get either XDG_CONFIG_HOME or HOME") + } + return filepath.Join(home, ".config"), nil +} diff --git a/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go b/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go index 9976f19a..45be8765 100644 --- a/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go +++ b/vendor/github.com/containers/storage/pkg/homedir/homedir_unix.go @@ -7,12 +7,16 @@ package homedir // NOTE: this package has originally been copied from github.com/docker/docker. import ( - "errors" + "fmt" "os" "path/filepath" + "strconv" "strings" + "sync" + "syscall" "github.com/containers/storage/pkg/unshare" + "github.com/sirupsen/logrus" ) // Key returns the env var name for the user's home dir based on @@ -40,18 +44,6 @@ func GetShortcutString() string { return "~" } -// GetRuntimeDir returns XDG_RUNTIME_DIR. -// XDG_RUNTIME_DIR is typically configured via pam_systemd. -// GetRuntimeDir returns non-nil error if XDG_RUNTIME_DIR is not set. -// -// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html -func GetRuntimeDir() (string, error) { - if xdgRuntimeDir := os.Getenv("XDG_RUNTIME_DIR"); xdgRuntimeDir != "" { - return filepath.EvalSymlinks(xdgRuntimeDir) - } - return "", errors.New("could not get XDG_RUNTIME_DIR") -} - // StickRuntimeDirContents sets the sticky bit on files that are under // XDG_RUNTIME_DIR, so that the files won't be periodically removed by the system. // @@ -94,3 +86,98 @@ func stick(f string) error { m |= os.ModeSticky return os.Chmod(f, m) } + +var ( + rootlessConfigHomeDirError error + rootlessConfigHomeDirOnce sync.Once + rootlessConfigHomeDir string + rootlessRuntimeDirOnce sync.Once + rootlessRuntimeDir string +) + +// isWriteableOnlyByOwner checks that the specified permission mask allows write +// access only to the owner. +func isWriteableOnlyByOwner(perm os.FileMode) bool { + return (perm & 0o722) == 0o700 +} + +// GetConfigHome returns XDG_CONFIG_HOME. +// GetConfigHome returns $HOME/.config and nil error if XDG_CONFIG_HOME is not set. +// +// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html +func GetConfigHome() (string, error) { + rootlessConfigHomeDirOnce.Do(func() { + cfgHomeDir := os.Getenv("XDG_CONFIG_HOME") + if cfgHomeDir == "" { + home := Get() + resolvedHome, err := filepath.EvalSymlinks(home) + if err != nil { + rootlessConfigHomeDirError = fmt.Errorf("cannot resolve %s: %w", home, err) + return + } + tmpDir := filepath.Join(resolvedHome, ".config") + _ = os.MkdirAll(tmpDir, 0o700) + st, err := os.Stat(tmpDir) + if err != nil { + rootlessConfigHomeDirError = err + return + } else if int(st.Sys().(*syscall.Stat_t).Uid) == os.Geteuid() { + cfgHomeDir = tmpDir + } else { + rootlessConfigHomeDirError = fmt.Errorf("path %q exists and it is not owned by the current user", tmpDir) + return + } + } + rootlessConfigHomeDir = cfgHomeDir + }) + + return rootlessConfigHomeDir, rootlessConfigHomeDirError +} + +// GetRuntimeDir returns a directory suitable to store runtime files. +// The function will try to use the XDG_RUNTIME_DIR env variable if it is set. +// XDG_RUNTIME_DIR is typically configured via pam_systemd. +// If XDG_RUNTIME_DIR is not set, GetRuntimeDir will try to find a suitable +// directory for the current user. +// +// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html +func GetRuntimeDir() (string, error) { + var rootlessRuntimeDirError error + + rootlessRuntimeDirOnce.Do(func() { + runtimeDir := os.Getenv("XDG_RUNTIME_DIR") + + if runtimeDir != "" { + rootlessRuntimeDir, rootlessRuntimeDirError = filepath.EvalSymlinks(runtimeDir) + return + } + + uid := strconv.Itoa(unshare.GetRootlessUID()) + if runtimeDir == "" { + tmpDir := filepath.Join("/run", "user", uid) + if err := os.MkdirAll(tmpDir, 0o700); err != nil { + logrus.Debug(err) + } + st, err := os.Lstat(tmpDir) + if err == nil && int(st.Sys().(*syscall.Stat_t).Uid) == os.Geteuid() && isWriteableOnlyByOwner(st.Mode().Perm()) { + runtimeDir = tmpDir + } + } + if runtimeDir == "" { + tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("storage-run-%s", uid)) + if err := os.MkdirAll(tmpDir, 0o700); err != nil { + logrus.Debug(err) + } + st, err := os.Lstat(tmpDir) + if err == nil && int(st.Sys().(*syscall.Stat_t).Uid) == os.Geteuid() && isWriteableOnlyByOwner(st.Mode().Perm()) { + runtimeDir = tmpDir + } else { + rootlessRuntimeDirError = fmt.Errorf("path %q exists and it is not writeable only by the current user", tmpDir) + return + } + } + rootlessRuntimeDir = runtimeDir + }) + + return rootlessRuntimeDir, rootlessRuntimeDirError +} diff --git a/vendor/github.com/containers/storage/pkg/homedir/homedir_windows.go b/vendor/github.com/containers/storage/pkg/homedir/homedir_windows.go index af65f2c0..a76610f9 100644 --- a/vendor/github.com/containers/storage/pkg/homedir/homedir_windows.go +++ b/vendor/github.com/containers/storage/pkg/homedir/homedir_windows.go @@ -5,6 +5,7 @@ package homedir import ( "os" + "path/filepath" ) // Key returns the env var name for the user's home dir based on @@ -25,8 +26,36 @@ func Get() string { return home } +// GetConfigHome returns the home directory of the current user with the help of +// environment variables depending on the target operating system. +// Returned path should be used with "path/filepath" to form new paths. +func GetConfigHome() (string, error) { + return filepath.Join(Get(), ".config"), nil +} + // GetShortcutString returns the string that is shortcut to user's home directory // in the native shell of the platform running on. func GetShortcutString() string { return "%USERPROFILE%" // be careful while using in format functions } + +// StickRuntimeDirContents is a no-op on Windows +func StickRuntimeDirContents(files []string) ([]string, error) { + return nil, nil +} + +// GetRuntimeDir returns a directory suitable to store runtime files. +// The function will try to use the XDG_RUNTIME_DIR env variable if it is set. +// XDG_RUNTIME_DIR is typically configured via pam_systemd. +// If XDG_RUNTIME_DIR is not set, GetRuntimeDir will try to find a suitable +// directory for the current user. +// +// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html +func GetRuntimeDir() (string, error) { + data, err := GetDataHome() + if err != nil { + return "", err + } + runtimeDir := filepath.Join(data, "containers", "storage") + return runtimeDir, nil +} diff --git a/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go b/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go index 4701dc5a..d7cb4ac2 100644 --- a/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go +++ b/vendor/github.com/containers/storage/pkg/idtools/idtools_unix.go @@ -14,7 +14,7 @@ import ( "syscall" "github.com/containers/storage/pkg/system" - "github.com/opencontainers/runc/libcontainer/user" + "github.com/moby/sys/user" ) var ( diff --git a/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go b/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go index 83de680c..e3160d0d 100644 --- a/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go +++ b/vendor/github.com/containers/storage/pkg/unshare/unshare_unsupported.go @@ -17,7 +17,7 @@ const ( // IsRootless tells us if we are running in rootless mode func IsRootless() bool { - return false + return os.Getuid() != 0 } // GetRootlessUID returns the UID of the user in the parent userNS diff --git a/vendor/github.com/containers/storage/storage.conf b/vendor/github.com/containers/storage/storage.conf index cb4525f2..924e8f13 100644 --- a/vendor/github.com/containers/storage/storage.conf +++ b/vendor/github.com/containers/storage/storage.conf @@ -59,7 +59,7 @@ additionalimagestores = [ # can deduplicate pulling of content, disk storage of content and can allow the # kernel to use less memory when running containers. -# containers/storage supports three keys +# containers/storage supports four keys # * enable_partial_images="true" | "false" # Tells containers/storage to look for files previously pulled in storage # rather then always pulling them from the container registry. @@ -70,7 +70,12 @@ additionalimagestores = [ # Tells containers/storage where an ostree repository exists that might have # previously pulled content which can be used when attempting to avoid # pulling content from the container registry -pull_options = {enable_partial_images = "false", use_hard_links = "false", ostree_repos=""} +# * convert_images = "false" | "true" +# If set to true, containers/storage will convert images to a +# format compatible with partial pulls in order to take advantage +# of local deduplication and hard linking. It is an expensive +# operation so it is not enabled by default. +pull_options = {enable_partial_images = "true", use_hard_links = "false", ostree_repos=""} # Remap-UIDs/GIDs is the mapping from UIDs/GIDs as they should appear inside of # a container, to the UIDs/GIDs as they should appear outside of the container, @@ -130,6 +135,9 @@ mountopt = "nodev" # Set to skip a PRIVATE bind mount on the storage home directory. # skip_mount_home = "false" +# Set to use composefs to mount data layers with overlay. +# use_composefs = "false" + # Size is used to set a maximum size of the container image. # size = "" diff --git a/vendor/github.com/containers/storage/storage.conf-freebsd b/vendor/github.com/containers/storage/storage.conf-freebsd index c8abee64..03bbe246 100644 --- a/vendor/github.com/containers/storage/storage.conf-freebsd +++ b/vendor/github.com/containers/storage/storage.conf-freebsd @@ -96,6 +96,9 @@ mountopt = "nodev" # Set to skip a PRIVATE bind mount on the storage home directory. # skip_mount_home = "false" +# Set to use composefs to mount data layers with overlay. +# use_composefs = "false" + # Size is used to set a maximum size of the container image. # size = "" diff --git a/vendor/github.com/containers/storage/store.go b/vendor/github.com/containers/storage/store.go index 6753b296..c6f12518 100644 --- a/vendor/github.com/containers/storage/store.go +++ b/vendor/github.com/containers/storage/store.go @@ -1,6 +1,7 @@ package storage import ( + _ "embed" "encoding/base64" "errors" "fmt" @@ -10,6 +11,7 @@ import ( "reflect" "strings" "sync" + "syscall" "time" // register all of the built-in drivers @@ -69,6 +71,19 @@ type metadataStore interface { rwMetadataStore } +// ApplyStagedLayerOptions contains options to pass to ApplyStagedLayer +type ApplyStagedLayerOptions struct { + ID string // Mandatory + ParentLayer string // Optional + Names []string // Optional + MountLabel string // Optional + Writeable bool // Optional + LayerOptions *LayerOptions // Optional + + DiffOutput *drivers.DriverWithDifferOutput // Mandatory + DiffOptions *drivers.ApplyDiffWithDifferOpts // Mandatory +} + // An roBigDataStore wraps up the read-only big-data related methods of the // various types of file-based lookaside stores that we implement. type roBigDataStore interface { @@ -313,14 +328,24 @@ type Store interface { // ApplyDiffer applies a diff to a layer. // It is the caller responsibility to clean the staging directory if it is not // successfully applied with ApplyDiffFromStagingDirectory. - ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) + ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffWithDifferOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) // ApplyDiffFromStagingDirectory uses stagingDirectory to create the diff. - ApplyDiffFromStagingDirectory(to, stagingDirectory string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffOpts) error + // Deprecated: it will be removed soon. Use ApplyStagedLayer instead. + ApplyDiffFromStagingDirectory(to, stagingDirectory string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffWithDifferOpts) error // CleanupStagingDirectory cleanups the staging directory. It can be used to cleanup the staging directory on errors + // Deprecated: it will be removed soon. Use CleanupStagedLayer instead. CleanupStagingDirectory(stagingDirectory string) error + // ApplyStagedLayer combines the functions of CreateLayer and ApplyDiffFromStagingDirectory, + // marking the layer for automatic removal if applying the diff fails + // for any reason. + ApplyStagedLayer(args ApplyStagedLayerOptions) (*Layer, error) + + // CleanupStagedLayer cleanups the staging directory. It can be used to cleanup the staging directory on errors + CleanupStagedLayer(diffOutput *drivers.DriverWithDifferOutput) error + // DifferTarget gets the path to the differ target. DifferTarget(id string) (string, error) @@ -332,6 +357,10 @@ type Store interface { // specified uncompressed digest value recorded for them. LayersByUncompressedDigest(d digest.Digest) ([]Layer, error) + // LayersByTOCDigest returns a slice of the layers with the + // specified TOC digest value recorded for them. + LayersByTOCDigest(d digest.Digest) ([]Layer, error) + // LayerSize returns a cached approximation of the layer's size, or -1 // if we don't have a value on hand. LayerSize(id string) (int64, error) @@ -391,6 +420,18 @@ type Store interface { // allow ImagesByDigest to find images by their correct digests. SetImageBigData(id, key string, data []byte, digestManifest func([]byte) (digest.Digest, error)) error + // ImageDirectory returns a path of a directory which the caller can + // use to store data, specific to the image, which the library does not + // directly manage. The directory will be deleted when the image is + // deleted. + ImageDirectory(id string) (string, error) + + // ImageRunDirectory returns a path of a directory which the caller can + // use to store data, specific to the image, which the library does not + // directly manage. The directory will be deleted when the host system + // is restarted. + ImageRunDirectory(id string) (string, error) + // ListLayerBigData retrieves a list of the (possibly large) chunks of // named data associated with a layer. ListLayerBigData(id string) ([]string, error) @@ -562,10 +603,19 @@ type LayerOptions struct { // initialize this layer. If set, it should be a child of the layer // which we want to use as the parent of the new layer. TemplateLayer string - // OriginalDigest specifies a digest of the tarstream (diff), if one is + // OriginalDigest specifies a digest of the (possibly-compressed) tarstream (diff), if one is // provided along with these LayerOptions, and reliably known by the caller. + // The digest might not be exactly the digest of the provided tarstream + // (e.g. the digest might be of a compressed representation, while providing + // an uncompressed one); in that case the caller is responsible for the two matching. // Use the default "" if this fields is not applicable or the value is not known. OriginalDigest digest.Digest + // OriginalSize specifies a size of the (possibly-compressed) tarstream corresponding + // to OriginalDigest. + // If the digest does not match the provided tarstream, OriginalSize must match OriginalDigest, + // not the tarstream. + // Use nil if not applicable or not known. + OriginalSize *int64 // UncompressedDigest specifies a digest of the uncompressed version (“DiffIDâ€) // of the tarstream (diff), if one is provided along with these LayerOptions, // and reliably known by the caller. @@ -922,11 +972,13 @@ func (s *store) load() error { if err := os.MkdirAll(gipath, 0o700); err != nil { return err } - ris, err := newImageStore(gipath) + imageStore, err := newImageStore(gipath) if err != nil { return err } - s.imageStore = ris + s.imageStore = imageStore + + s.rwImageStores = []rwImageStore{imageStore} gcpath := filepath.Join(s.graphRoot, driverPrefix+"containers") if err := os.MkdirAll(gcpath, 0o700); err != nil { @@ -944,13 +996,16 @@ func (s *store) load() error { s.containerStore = rcs - for _, store := range driver.AdditionalImageStores() { + additionalImageStores := s.graphDriver.AdditionalImageStores() + if s.imageStoreDir != "" { + additionalImageStores = append([]string{s.graphRoot}, additionalImageStores...) + } + + for _, store := range additionalImageStores { gipath := filepath.Join(store, driverPrefix+"images") var ris roImageStore - if s.imageStoreDir != "" && store == s.graphRoot { - // If --imagestore was set and current store - // is `graphRoot` then mount it as a `rw` additional - // store instead of `readonly` additional store. + // both the graphdriver and the imagestore must be used read-write. + if store == s.imageStoreDir || store == s.graphRoot { imageStore, err := newImageStore(gipath) if err != nil { return err @@ -960,6 +1015,10 @@ func (s *store) load() error { } else { ris, err = newROImageStore(gipath) if err != nil { + if errors.Is(err, syscall.EROFS) { + logrus.Debugf("Ignoring creation of lockfiles on read-only file systems %q, %v", gipath, err) + continue + } return err } } @@ -1031,15 +1090,9 @@ func (s *store) stopUsingGraphDriver() { // Almost all users should use startUsingGraphDriver instead. // The caller must hold s.graphLock. func (s *store) createGraphDriverLocked() (drivers.Driver, error) { - driverRoot := s.imageStoreDir - imageStoreBase := s.graphRoot - if driverRoot == "" { - driverRoot = s.graphRoot - imageStoreBase = "" - } config := drivers.Options{ - Root: driverRoot, - ImageStore: imageStoreBase, + Root: s.graphRoot, + ImageStore: s.imageStoreDir, RunRoot: s.runRoot, DriverPriority: s.graphDriverPriority, DriverOptions: s.graphOptions, @@ -1069,15 +1122,15 @@ func (s *store) getLayerStoreLocked() (rwLayerStore, error) { if err := os.MkdirAll(rlpath, 0o700); err != nil { return nil, err } - imgStoreRoot := s.imageStoreDir - if imgStoreRoot == "" { - imgStoreRoot = s.graphRoot - } - glpath := filepath.Join(imgStoreRoot, driverPrefix+"layers") + glpath := filepath.Join(s.graphRoot, driverPrefix+"layers") if err := os.MkdirAll(glpath, 0o700); err != nil { return nil, err } - rls, err := s.newLayerStore(rlpath, glpath, s.graphDriver, s.transientStore) + ilpath := "" + if s.imageStoreDir != "" { + ilpath = filepath.Join(s.imageStoreDir, driverPrefix+"layers") + } + rls, err := s.newLayerStore(rlpath, glpath, ilpath, s.graphDriver, s.transientStore) if err != nil { return nil, err } @@ -1108,8 +1161,10 @@ func (s *store) getROLayerStoresLocked() ([]roLayerStore, error) { if err := os.MkdirAll(rlpath, 0o700); err != nil { return nil, err } + for _, store := range s.graphDriver.AdditionalImageStores() { glpath := filepath.Join(store, driverPrefix+"layers") + rls, err := newROLayerStore(rlpath, glpath, s.graphDriver) if err != nil { return nil, err @@ -1390,8 +1445,7 @@ func (s *store) canUseShifting(uidmap, gidmap []idtools.IDMap) bool { return true } -func (s *store) PutLayer(id, parent string, names []string, mountLabel string, writeable bool, lOptions *LayerOptions, diff io.Reader) (*Layer, int64, error) { - var parentLayer *Layer +func (s *store) putLayer(id, parent string, names []string, mountLabel string, writeable bool, lOptions *LayerOptions, diff io.Reader, slo *stagedLayerOptions) (*Layer, int64, error) { rlstore, rlstores, err := s.bothLayerStoreKinds() if err != nil { return nil, -1, err @@ -1404,6 +1458,8 @@ func (s *store) PutLayer(id, parent string, names []string, mountLabel string, w return nil, -1, err } defer s.containerStore.stopWriting() + + var parentLayer *Layer var options LayerOptions if lOptions != nil { options = *lOptions @@ -1463,6 +1519,7 @@ func (s *store) PutLayer(id, parent string, names []string, mountLabel string, w } layerOptions := LayerOptions{ OriginalDigest: options.OriginalDigest, + OriginalSize: options.OriginalSize, UncompressedDigest: options.UncompressedDigest, Flags: options.Flags, } @@ -1476,7 +1533,11 @@ func (s *store) PutLayer(id, parent string, names []string, mountLabel string, w GIDMap: copyIDMap(gidMap), } } - return rlstore.create(id, parentLayer, names, mountLabel, nil, &layerOptions, writeable, diff) + return rlstore.create(id, parentLayer, names, mountLabel, nil, &layerOptions, writeable, diff, slo) +} + +func (s *store) PutLayer(id, parent string, names []string, mountLabel string, writeable bool, lOptions *LayerOptions, diff io.Reader) (*Layer, int64, error) { + return s.putLayer(id, parent, names, mountLabel, writeable, lOptions, diff, nil) } func (s *store) CreateLayer(id, parent string, names []string, mountLabel string, writeable bool, options *LayerOptions) (*Layer, error) { @@ -1686,7 +1747,7 @@ func (s *store) imageTopLayerForMapping(image *Image, ristore roImageStore, rlst } } layerOptions.TemplateLayer = layer.ID - mappedLayer, _, err := rlstore.create("", parentLayer, nil, layer.MountLabel, nil, &layerOptions, false, nil) + mappedLayer, _, err := rlstore.create("", parentLayer, nil, layer.MountLabel, nil, &layerOptions, false, nil, nil) if err != nil { return nil, fmt.Errorf("creating an ID-mapped copy of layer %q: %w", layer.ID, err) } @@ -1857,7 +1918,7 @@ func (s *store) CreateContainer(id string, names []string, image, layer, metadat options.Flags[mountLabelFlag] = mountLabel } - clayer, _, err := rlstore.create(layer, imageTopLayer, nil, mlabel, options.StorageOpt, layerOptions, true, nil) + clayer, _, err := rlstore.create(layer, imageTopLayer, nil, mlabel, options.StorageOpt, layerOptions, true, nil, nil) if err != nil { return nil, err } @@ -2530,7 +2591,7 @@ func (s *store) DeleteImage(id string, commit bool) (layers []string, err error) if err := s.writeToAllStores(func(rlstore rwLayerStore) error { // Delete image from all available imagestores configured to be used. imageFound := false - for _, is := range append([]rwImageStore{s.imageStore}, s.rwImageStores...) { + for _, is := range s.rwImageStores { if is != s.imageStore { // This is an additional writeable image store // so we must perform lock @@ -2741,7 +2802,13 @@ func (s *store) Status() ([][2]string, error) { return rlstore.Status() } +//go:embed VERSION +var storageVersion string + func (s *store) Version() ([][2]string, error) { + if trimmedVersion := strings.TrimSpace(storageVersion); trimmedVersion != "" { + return [][2]string{{"Version", trimmedVersion}}, nil + } return [][2]string{}, nil } @@ -2915,16 +2982,29 @@ func (s *store) Diff(from, to string, options *DiffOptions) (io.ReadCloser, erro return nil, ErrLayerUnknown } -func (s *store) ApplyDiffFromStagingDirectory(to, stagingDirectory string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffOpts) error { +func (s *store) ApplyDiffFromStagingDirectory(to, stagingDirectory string, diffOutput *drivers.DriverWithDifferOutput, options *drivers.ApplyDiffWithDifferOpts) error { + if stagingDirectory != diffOutput.Target { + return fmt.Errorf("invalid value for staging directory, it must be the same as the differ target directory") + } _, err := writeToLayerStore(s, func(rlstore rwLayerStore) (struct{}, error) { if !rlstore.Exists(to) { return struct{}{}, ErrLayerUnknown } - return struct{}{}, rlstore.ApplyDiffFromStagingDirectory(to, stagingDirectory, diffOutput, options) + return struct{}{}, rlstore.applyDiffFromStagingDirectory(to, diffOutput, options) }) return err } +func (s *store) ApplyStagedLayer(args ApplyStagedLayerOptions) (*Layer, error) { + slo := stagedLayerOptions{ + DiffOutput: args.DiffOutput, + DiffOptions: args.DiffOptions, + } + + layer, _, err := s.putLayer(args.ID, args.ParentLayer, args.Names, args.MountLabel, args.Writeable, args.LayerOptions, nil, &slo) + return layer, err +} + func (s *store) CleanupStagingDirectory(stagingDirectory string) error { _, err := writeToLayerStore(s, func(rlstore rwLayerStore) (struct{}, error) { return struct{}{}, rlstore.CleanupStagingDirectory(stagingDirectory) @@ -2932,7 +3012,14 @@ func (s *store) CleanupStagingDirectory(stagingDirectory string) error { return err } -func (s *store) ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) { +func (s *store) CleanupStagedLayer(diffOutput *drivers.DriverWithDifferOutput) error { + _, err := writeToLayerStore(s, func(rlstore rwLayerStore) (struct{}, error) { + return struct{}{}, rlstore.CleanupStagingDirectory(diffOutput.Target) + }) + return err +} + +func (s *store) ApplyDiffWithDiffer(to string, options *drivers.ApplyDiffWithDifferOpts, differ drivers.Differ) (*drivers.DriverWithDifferOutput, error) { return writeToLayerStore(s, func(rlstore rwLayerStore) (*drivers.DriverWithDifferOutput, error) { if to != "" && !rlstore.Exists(to) { return nil, ErrLayerUnknown @@ -2994,6 +3081,13 @@ func (s *store) LayersByUncompressedDigest(d digest.Digest) ([]Layer, error) { return s.layersByMappedDigest(func(r roLayerStore, d digest.Digest) ([]Layer, error) { return r.LayersByUncompressedDigest(d) }, d) } +func (s *store) LayersByTOCDigest(d digest.Digest) ([]Layer, error) { + if err := d.Validate(); err != nil { + return nil, fmt.Errorf("looking for TOC matching digest %q: %w", d, err) + } + return s.layersByMappedDigest(func(r roLayerStore, d digest.Digest) ([]Layer, error) { return r.LayersByTOCDigest(d) }, d) +} + func (s *store) LayerSize(id string) (int64, error) { if res, done, err := readAllLayerStores(s, func(store roLayerStore) (int64, bool, error) { if store.Exists(id) { @@ -3288,6 +3382,27 @@ func (s *store) ContainerByLayer(id string) (*Container, error) { return nil, ErrContainerUnknown } +func (s *store) ImageDirectory(id string) (string, error) { + foundImage := false + if res, done, err := readAllImageStores(s, func(store roImageStore) (string, bool, error) { + if store.Exists(id) { + foundImage = true + } + middleDir := s.graphDriverName + "-images" + gipath := filepath.Join(s.GraphRoot(), middleDir, id, "userdata") + if err := os.MkdirAll(gipath, 0o700); err != nil { + return "", true, err + } + return gipath, true, nil + }); done { + return res, err + } + if foundImage { + return "", fmt.Errorf("locating image with ID %q (consider removing the image to resolve the issue): %w", id, os.ErrNotExist) + } + return "", fmt.Errorf("locating image with ID %q: %w", id, ErrImageUnknown) +} + func (s *store) ContainerDirectory(id string) (string, error) { res, _, err := readContainerStore(s, func() (string, bool, error) { id, err := s.containerStore.Lookup(id) @@ -3305,6 +3420,28 @@ func (s *store) ContainerDirectory(id string) (string, error) { return res, err } +func (s *store) ImageRunDirectory(id string) (string, error) { + foundImage := false + if res, done, err := readAllImageStores(s, func(store roImageStore) (string, bool, error) { + if store.Exists(id) { + foundImage = true + } + + middleDir := s.graphDriverName + "-images" + rcpath := filepath.Join(s.RunRoot(), middleDir, id, "userdata") + if err := os.MkdirAll(rcpath, 0o700); err != nil { + return "", true, err + } + return rcpath, true, nil + }); done { + return res, err + } + if foundImage { + return "", fmt.Errorf("locating image with ID %q (consider removing the image to resolve the issue): %w", id, os.ErrNotExist) + } + return "", fmt.Errorf("locating image with ID %q: %w", id, ErrImageUnknown) +} + func (s *store) ContainerRunDirectory(id string) (string, error) { res, _, err := readContainerStore(s, func() (string, bool, error) { id, err := s.containerStore.Lookup(id) @@ -3545,8 +3682,8 @@ func SetDefaultConfigFilePath(path string) { } // DefaultConfigFile returns the path to the storage config file used -func DefaultConfigFile(rootless bool) (string, error) { - return types.DefaultConfigFile(rootless) +func DefaultConfigFile() (string, error) { + return types.DefaultConfigFile() } // ReloadConfigurationFile parses the specified configuration file and overrides diff --git a/vendor/github.com/containers/storage/types/options.go b/vendor/github.com/containers/storage/types/options.go index 5ae667a4..ad0bfa43 100644 --- a/vendor/github.com/containers/storage/types/options.go +++ b/vendor/github.com/containers/storage/types/options.go @@ -11,7 +11,9 @@ import ( "github.com/BurntSushi/toml" cfg "github.com/containers/storage/pkg/config" + "github.com/containers/storage/pkg/homedir" "github.com/containers/storage/pkg/idtools" + "github.com/containers/storage/pkg/unshare" "github.com/sirupsen/logrus" ) @@ -87,7 +89,7 @@ func loadDefaultStoreOptions() { _, err := os.Stat(defaultOverrideConfigFile) if err == nil { - // The DefaultConfigFile(rootless) function returns the path + // The DefaultConfigFile() function returns the path // of the used storage.conf file, by returning defaultConfigFile // If override exists containers/storage uses it by default. defaultConfigFile = defaultOverrideConfigFile @@ -109,21 +111,41 @@ func loadDefaultStoreOptions() { setDefaults() } -// defaultStoreOptionsIsolated is an internal implementation detail of DefaultStoreOptions to allow testing. -// Everyone but the tests this is intended for should only call DefaultStoreOptions, never this function. -func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf string) (StoreOptions, error) { +// loadStoreOptions returns the default storage ops for containers +func loadStoreOptions() (StoreOptions, error) { + storageConf, err := DefaultConfigFile() + if err != nil { + return defaultStoreOptions, err + } + return loadStoreOptionsFromConfFile(storageConf) +} + +// usePerUserStorage returns whether the user private storage must be used. +// We cannot simply use the unshare.IsRootless() condition, because +// that checks only if the current process needs a user namespace to +// work and it would break cases where the process is already created +// in a user namespace (e.g. nested Podman/Buildah) and the desired +// behavior is to use system paths instead of user private paths. +func usePerUserStorage() bool { + return unshare.IsRootless() && unshare.GetRootlessUID() != 0 +} + +// loadStoreOptionsFromConfFile is an internal implementation detail of DefaultStoreOptions to allow testing. +// Everyone but the tests this is intended for should only call loadStoreOptions, never this function. +func loadStoreOptionsFromConfFile(storageConf string) (StoreOptions, error) { var ( defaultRootlessRunRoot string defaultRootlessGraphRoot string err error ) + defaultStoreOptionsOnce.Do(loadDefaultStoreOptions) if loadDefaultStoreOptionsErr != nil { return StoreOptions{}, loadDefaultStoreOptionsErr } storageOpts := defaultStoreOptions - if rootless && rootlessUID != 0 { - storageOpts, err = getRootlessStorageOpts(rootlessUID, storageOpts) + if usePerUserStorage() { + storageOpts, err = getRootlessStorageOpts(storageOpts) if err != nil { return storageOpts, err } @@ -137,7 +159,7 @@ func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf str defaultRootlessGraphRoot = storageOpts.GraphRoot storageOpts = StoreOptions{} reloadConfigurationFileIfNeeded(storageConf, &storageOpts) - if rootless && rootlessUID != 0 { + if usePerUserStorage() { // If the file did not specify a graphroot or runroot, // set sane defaults so we don't try and use root-owned // directories @@ -156,6 +178,7 @@ func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf str if storageOpts.RunRoot == "" { return storageOpts, fmt.Errorf("runroot must be set") } + rootlessUID := unshare.GetRootlessUID() runRoot, err := expandEnvPath(storageOpts.RunRoot, rootlessUID) if err != nil { return storageOpts, err @@ -186,26 +209,17 @@ func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf str return storageOpts, nil } -// loadStoreOptions returns the default storage ops for containers -func loadStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) { - storageConf, err := DefaultConfigFile(rootless && rootlessUID != 0) - if err != nil { - return defaultStoreOptions, err - } - return defaultStoreOptionsIsolated(rootless, rootlessUID, storageConf) -} - // UpdateOptions should be called iff container engine received a SIGHUP, // otherwise use DefaultStoreOptions -func UpdateStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) { - storeOptions, storeError = loadStoreOptions(rootless, rootlessUID) +func UpdateStoreOptions() (StoreOptions, error) { + storeOptions, storeError = loadStoreOptions() return storeOptions, storeError } // DefaultStoreOptions returns the default storage ops for containers -func DefaultStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) { +func DefaultStoreOptions() (StoreOptions, error) { once.Do(func() { - storeOptions, storeError = loadStoreOptions(rootless, rootlessUID) + storeOptions, storeError = loadStoreOptions() }) return storeOptions, storeError } @@ -270,14 +284,26 @@ func isRootlessDriver(driver string) bool { } // getRootlessStorageOpts returns the storage opts for containers running as non root -func getRootlessStorageOpts(rootlessUID int, systemOpts StoreOptions) (StoreOptions, error) { +func getRootlessStorageOpts(systemOpts StoreOptions) (StoreOptions, error) { var opts StoreOptions - dataDir, rootlessRuntime, err := getRootlessDirInfo(rootlessUID) + rootlessUID := unshare.GetRootlessUID() + + dataDir, err := homedir.GetDataHome() + if err != nil { + return opts, err + } + + rootlessRuntime, err := homedir.GetRuntimeDir() if err != nil { return opts, err } - opts.RunRoot = rootlessRuntime + + opts.RunRoot = filepath.Join(rootlessRuntime, "containers") + if err := os.MkdirAll(opts.RunRoot, 0o700); err != nil { + return opts, fmt.Errorf("unable to make rootless runtime: %w", err) + } + opts.PullOptions = systemOpts.PullOptions if systemOpts.RootlessStoragePath != "" { opts.GraphRoot, err = expandEnvPath(systemOpts.RootlessStoragePath, rootlessUID) @@ -343,12 +369,6 @@ func getRootlessStorageOpts(rootlessUID int, systemOpts StoreOptions) (StoreOpti return opts, nil } -// DefaultStoreOptionsAutoDetectUID returns the default storage ops for containers -func DefaultStoreOptionsAutoDetectUID() (StoreOptions, error) { - uid := getRootlessUID() - return DefaultStoreOptions(uid != 0, uid) -} - var prevReloadConfig = struct { storeOptions *StoreOptions mod time.Time @@ -518,8 +538,8 @@ func Options() (StoreOptions, error) { } // Save overwrites the tomlConfig in storage.conf with the given conf -func Save(conf TomlConfig, rootless bool) error { - configFile, err := DefaultConfigFile(rootless) +func Save(conf TomlConfig) error { + configFile, err := DefaultConfigFile() if err != nil { return err } @@ -537,10 +557,10 @@ func Save(conf TomlConfig, rootless bool) error { } // StorageConfig is used to retrieve the storage.conf toml in order to overwrite it -func StorageConfig(rootless bool) (*TomlConfig, error) { +func StorageConfig() (*TomlConfig, error) { config := new(TomlConfig) - configFile, err := DefaultConfigFile(rootless) + configFile, err := DefaultConfigFile() if err != nil { return nil, err } diff --git a/vendor/github.com/containers/storage/types/utils.go b/vendor/github.com/containers/storage/types/utils.go index 73134f82..5b4b31b8 100644 --- a/vendor/github.com/containers/storage/types/utils.go +++ b/vendor/github.com/containers/storage/types/utils.go @@ -2,162 +2,15 @@ package types import ( "errors" - "fmt" "os" "path/filepath" "strconv" "strings" "github.com/containers/storage/pkg/homedir" - "github.com/containers/storage/pkg/system" "github.com/sirupsen/logrus" ) -// GetRootlessRuntimeDir returns the runtime directory when running as non root -func GetRootlessRuntimeDir(rootlessUID int) (string, error) { - path, err := getRootlessRuntimeDir(rootlessUID) - if err != nil { - return "", err - } - path = filepath.Join(path, "containers") - if err := os.MkdirAll(path, 0o700); err != nil { - return "", fmt.Errorf("unable to make rootless runtime: %w", err) - } - return path, nil -} - -type rootlessRuntimeDirEnvironment interface { - getProcCommandFile() string - getRunUserDir() string - getTmpPerUserDir() string - - homeDirGetRuntimeDir() (string, error) - systemLstat(string) (*system.StatT, error) - homedirGet() string -} - -type rootlessRuntimeDirEnvironmentImplementation struct { - procCommandFile string - runUserDir string - tmpPerUserDir string -} - -func (env rootlessRuntimeDirEnvironmentImplementation) getProcCommandFile() string { - return env.procCommandFile -} - -func (env rootlessRuntimeDirEnvironmentImplementation) getRunUserDir() string { - return env.runUserDir -} - -func (env rootlessRuntimeDirEnvironmentImplementation) getTmpPerUserDir() string { - return env.tmpPerUserDir -} - -func (rootlessRuntimeDirEnvironmentImplementation) homeDirGetRuntimeDir() (string, error) { - return homedir.GetRuntimeDir() -} - -func (rootlessRuntimeDirEnvironmentImplementation) systemLstat(path string) (*system.StatT, error) { - return system.Lstat(path) -} - -func (rootlessRuntimeDirEnvironmentImplementation) homedirGet() string { - return homedir.Get() -} - -func isRootlessRuntimeDirOwner(dir string, env rootlessRuntimeDirEnvironment) bool { - st, err := env.systemLstat(dir) - return err == nil && int(st.UID()) == os.Getuid() && st.Mode()&0o700 == 0o700 && st.Mode()&0o066 == 0o000 -} - -// getRootlessRuntimeDirIsolated is an internal implementation detail of getRootlessRuntimeDir to allow testing. -// Everyone but the tests this is intended for should only call getRootlessRuntimeDir, never this function. -func getRootlessRuntimeDirIsolated(env rootlessRuntimeDirEnvironment) (string, error) { - runtimeDir, err := env.homeDirGetRuntimeDir() - if err == nil { - return runtimeDir, nil - } - - initCommand, err := os.ReadFile(env.getProcCommandFile()) - if err != nil || string(initCommand) == "systemd" { - runUserDir := env.getRunUserDir() - if isRootlessRuntimeDirOwner(runUserDir, env) { - return runUserDir, nil - } - } - - tmpPerUserDir := env.getTmpPerUserDir() - if tmpPerUserDir != "" { - if _, err := env.systemLstat(tmpPerUserDir); os.IsNotExist(err) { - if err := os.Mkdir(tmpPerUserDir, 0o700); err != nil { - logrus.Errorf("Failed to create temp directory for user: %v", err) - } else { - return tmpPerUserDir, nil - } - } else if isRootlessRuntimeDirOwner(tmpPerUserDir, env) { - return tmpPerUserDir, nil - } - } - - homeDir := env.homedirGet() - if homeDir == "" { - return "", errors.New("neither XDG_RUNTIME_DIR nor temp dir nor HOME was set non-empty") - } - resolvedHomeDir, err := filepath.EvalSymlinks(homeDir) - if err != nil { - return "", err - } - return filepath.Join(resolvedHomeDir, "rundir"), nil -} - -func getRootlessRuntimeDir(rootlessUID int) (string, error) { - return getRootlessRuntimeDirIsolated( - rootlessRuntimeDirEnvironmentImplementation{ - "/proc/1/comm", - fmt.Sprintf("/run/user/%d", rootlessUID), - fmt.Sprintf("%s/containers-user-%d", os.TempDir(), rootlessUID), - }, - ) -} - -// getRootlessDirInfo returns the parent path of where the storage for containers and -// volumes will be in rootless mode -func getRootlessDirInfo(rootlessUID int) (string, string, error) { - rootlessRuntime, err := GetRootlessRuntimeDir(rootlessUID) - if err != nil { - return "", "", err - } - - dataDir, err := homedir.GetDataHome() - if err == nil { - return dataDir, rootlessRuntime, nil - } - - home := homedir.Get() - if home == "" { - return "", "", fmt.Errorf("neither XDG_DATA_HOME nor HOME was set non-empty: %w", err) - } - // runc doesn't like symlinks in the rootfs path, and at least - // on CoreOS /home is a symlink to /var/home, so resolve any symlink. - resolvedHome, err := filepath.EvalSymlinks(home) - if err != nil { - return "", "", err - } - dataDir = filepath.Join(resolvedHome, ".local", "share") - - return dataDir, rootlessRuntime, nil -} - -func getRootlessUID() int { - uidEnv := os.Getenv("_CONTAINERS_ROOTLESS_UID") - if uidEnv != "" { - u, _ := strconv.Atoi(uidEnv) - return u - } - return os.Geteuid() -} - func expandEnvPath(path string, rootlessUID int) (string, error) { var err error path = strings.Replace(path, "$UID", strconv.Itoa(rootlessUID), -1) @@ -169,7 +22,7 @@ func expandEnvPath(path string, rootlessUID int) (string, error) { return newpath, nil } -func DefaultConfigFile(rootless bool) (string, error) { +func DefaultConfigFile() (string, error) { if defaultConfigFileSet { return defaultConfigFile, nil } @@ -177,7 +30,7 @@ func DefaultConfigFile(rootless bool) (string, error) { if path, ok := os.LookupEnv(storageConfEnv); ok { return path, nil } - if !rootless { + if !usePerUserStorage() { if _, err := os.Stat(defaultOverrideConfigFile); err == nil { return defaultOverrideConfigFile, nil } diff --git a/vendor/github.com/containers/storage/userns.go b/vendor/github.com/containers/storage/userns.go index 32ae830b..57120731 100644 --- a/vendor/github.com/containers/storage/userns.go +++ b/vendor/github.com/containers/storage/userns.go @@ -11,7 +11,7 @@ import ( "github.com/containers/storage/pkg/idtools" "github.com/containers/storage/pkg/unshare" "github.com/containers/storage/types" - libcontainerUser "github.com/opencontainers/runc/libcontainer/user" + libcontainerUser "github.com/moby/sys/user" "github.com/sirupsen/logrus" ) @@ -175,7 +175,7 @@ outer: // We need to create a temporary layer so we can mount it and lookup the // maximum IDs used. - clayer, _, err := rlstore.create("", topLayer, nil, "", nil, layerOptions, false, nil) + clayer, _, err := rlstore.create("", topLayer, nil, "", nil, layerOptions, false, nil, nil) if err != nil { return 0, err } diff --git a/vendor/github.com/containers/storage/utils.go b/vendor/github.com/containers/storage/utils.go index 6b5a3421..5bade6ff 100644 --- a/vendor/github.com/containers/storage/utils.go +++ b/vendor/github.com/containers/storage/utils.go @@ -11,19 +11,9 @@ func ParseIDMapping(UIDMapSlice, GIDMapSlice []string, subUIDMap, subGIDMap stri return types.ParseIDMapping(UIDMapSlice, GIDMapSlice, subUIDMap, subGIDMap) } -// GetRootlessRuntimeDir returns the runtime directory when running as non root -func GetRootlessRuntimeDir(rootlessUID int) (string, error) { - return types.GetRootlessRuntimeDir(rootlessUID) -} - -// DefaultStoreOptionsAutoDetectUID returns the default storage options for containers -func DefaultStoreOptionsAutoDetectUID() (types.StoreOptions, error) { - return types.DefaultStoreOptionsAutoDetectUID() -} - // DefaultStoreOptions returns the default storage options for containers -func DefaultStoreOptions(rootless bool, rootlessUID int) (types.StoreOptions, error) { - return types.DefaultStoreOptions(rootless, rootlessUID) +func DefaultStoreOptions() (types.StoreOptions, error) { + return types.DefaultStoreOptions() } func validateMountOptions(mountOptions []string) error { 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 7cee9247..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go +++ /dev/null @@ -1,365 +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\xd2\xa4\x4a\x76\x3d\xdd\x2d\x3b\xc9\xcd\xcd\xf5\x4d\xed\x96\x62\xc9\x89\x9e\x8c\x65\x95\xa4\xf1\xdc\xfc\x5e\x6a\x82\x26\xd1\xdd\x58\x91\x00\x03\x80\x2d\xf5\xec\xee\x77\xff\x15\x0e\x00\xbe\x34\x09\x10\x6c\xb5\x6c\x27\x43\x6e\xd5\x66\xdc\x22\x0f\x80\x83\x83\x83\xf3\x7e\x7e\x35\x9f\xcf\x7f\x85\x0b\xfa\x99\x08\x49\x39\x7b\x87\x70\x41\xc9\x93\x22\x4c\xff\x4b\x2e\x1e\xfe\x20\x17\x94\x9f\x6d\xdf\x2e\x89\xc2\x6f\x7f\xf5\x40\x59\xfa\x0e\xbd\x2f\xa5\xe2\xf9\x2d\x91\xbc\x14\x09\xb9\x20\x2b\xca\xa8\xa2\x9c\xfd\x2a\x27\x0a\xa7\x58\xe1\x77\xbf\x42\x08\x33\xc6\x15\xd6\x3f\x4b\xfd\x4f\x84\x12\xce\x94\xe0\x59\x46\xc4\x7c\x4d\xd8\xe2\xa1\x5c\x92\x65\x49\xb3\x94\x08\x18\xc1\x8d\xbf\x7d\xb3\xf8\xcd\xe2\x77\xbf\x42\x28\x11\x04\x3e\xbf\xa7\x39\x91\x0a\xe7\xc5\x3b\xc4\xca\x2c\xfb\x15\x42\x0c\xe7\xe4\x1d\xc2\x19\x11\x2a\xc7\x0c\xaf\x89\x90\x8b\x9c\x33\xaa\xb8\xa0\x6c\xbd\x48\xb8\x20\x5c\x2e\x12\x9e\xff\x4a\x16\x24\x81\xc9\xa4\x29\xcc\x10\x67\x37\x82\x32\x45\xc4\x7b\x9e\x95\xb9\x99\xd9\x1c\xfd\xff\xef\x3e\x5d\xdf\x60\xb5\x79\x87\x16\xfa\x83\x85\x9d\x0b\xcc\x3a\x25\x32\x11\xb4\x50\x30\xb7\xfb\x0d\x41\xf6\x8f\x88\xaf\xd0\x79\x63\x06\xf0\xb2\x99\xd8\xe7\xc6\xe7\x6a\x57\x90\x77\x48\x2a\x3d\xb1\xde\xb1\x04\x29\x32\x9a\x60\xd9\x3f\x58\x4a\x24\x15\x24\x45\xee\x2d\xc4\xca\x7c\x49\xc4\xfe\xe0\xb2\x31\xfa\x6d\x13\xa0\x19\x5e\xaf\xd8\x4c\xb1\x35\xbe\xdb\xad\x45\x07\xd3\x0d\x70\xe7\x6b\xd2\x80\x94\x62\xa5\xff\xb9\x16\xbc\x2c\xde\xa1\x7e\x9c\x9b\x2f\xed\xa6\x1b\x82\xe9\x20\x2a\xa3\x52\xfd\xb5\xf3\xa7\xef\xa9\x54\xf0\xe7\x22\x2b\x05\xce\xf6\xb6\x18\xfe\x22\x29\x5b\x97\x19\x16\xed\xbf\xfd\x0a\xa1\x42\x10\x49\xc4\x96\xfc\xc0\x1e\x18\x7f\x64\x1f\x28\xc9\x52\xf9\x0e\xad\x70\x26\xf5\x8c\x65\xc2\xf5\xfc\xaf\xf5\xcc\x0a\x9c\x90\x54\xff\x56\x2e\x85\xa5\x61\xf9\x0e\xfd\xe7\x7f\xff\x0a\xa1\x2d\xce\x68\x0a\xb8\x30\xd3\xe7\x05\x61\xe7\x37\x57\x9f\x7f\x7b\x97\x6c\x48\x8e\xcd\x8f\x7b\xfb\xd4\x5c\x81\xfd\xcb\x92\x48\x84\x59\xfb\x2f\x49\x56\x4a\x45\xc4\xc2\x82\x28\x04\x2f\x88\x50\xd4\x21\x4a\x3f\x8d\x63\x58\xfd\xb6\x37\xd8\xa9\x9e\x8d\xa5\xc0\x54\x1f\x3c\x22\x91\xaa\xa9\x92\xa4\x48\xc2\x4c\x35\x85\xa8\x0d\x95\x9a\x72\x34\x66\x98\x39\x8a\x0d\xb0\x48\xbf\x82\x19\xe2\xcb\xff\x20\x89\x5a\xa0\x3b\x8d\x3d\x21\x91\xdc\xf0\x32\x4b\xf5\x69\xdd\x12\xa1\x90\x20\x09\x5f\x33\xfa\x73\x05\x59\x22\xc5\x61\xc8\x0c\x2b\x62\xf7\xcb\x3d\x70\xb4\x18\xce\x34\x1e\x4b\x32\x43\x98\xa5\x28\xc7\x3b\x24\x88\x1e\x03\x95\xac\x01\x0d\x5e\x91\x0b\xf4\x91\x0b\x82\x28\x5b\xf1\x77\x68\xa3\x54\x21\xdf\x9d\x9d\xad\xa9\x72\x8c\x27\xe1\x79\x5e\x32\xaa\x76\x67\xc0\x3e\xe8\xb2\x54\x5c\xc8\xb3\x94\x6c\x49\x76\x26\xe9\x7a\x8e\x45\xb2\xa1\x8a\x24\xaa\x14\xe4\x0c\x17\x74\x0e\x13\x67\xc0\x77\x16\x79\xfa\x5d\xb5\xc3\xa7\x8d\x99\xee\x9d\x4a\xf3\x00\xa9\x7a\xf1\xae\xa9\x15\x51\x89\xb0\xfd\xcc\xcc\xbf\x46\xaf\xfe\x49\x63\xe5\xf6\xf2\xee\x1e\xb9\x41\x61\x0b\xda\x38\x07\x6c\xd7\x9f\xc9\x1a\xf1\x1a\x51\x94\xad\x88\x30\x1b\xb7\x12\x3c\x07\x88\x84\xa5\x05\xa7\x4c\xc1\x3f\x92\x8c\x12\xd6\x46\xba\x2c\x97\x39\x55\x7a\xa7\xff\x51\x12\xa9\xf4\xfe\x2c\xd0\x7b\x60\xbf\x68\x49\x50\x59\xe8\x43\x9b\x2e\xd0\x15\x43\xef\x71\x4e\xb2\xf7\x58\x92\x17\x47\xbb\xc6\xb0\x9c\x6b\x94\x0e\x23\xbe\x79\x6b\xb4\x5f\x34\xd8\xaa\x7e\x76\xdc\xbc\x7f\x87\xee\x0a\x92\xd0\x15\x4d\x80\xd0\x0d\xfd\xd7\x0c\x74\x49\x36\x78\x4b\xb9\x70\xbf\x77\x38\x92\x7b\xdc\x31\xf5\x20\x68\x53\x2e\x35\x93\x3b\xd3\xb7\x97\x60\x44\x11\xd9\xc0\xd5\x32\xe3\xcb\xb3\x1c\xeb\xef\x0f\xc5\x9b\x5e\xe2\x1c\xb3\x74\x2e\x15\x56\x65\x0b\x77\x7d\x1c\x03\xb8\x46\x7d\xb7\x11\x22\xf6\xfe\xb8\xcf\xab\xda\xef\x22\x9c\x65\xfc\x51\x22\xca\x34\x9e\x35\x09\x63\x24\x89\x02\xce\x50\xbd\xd9\x73\xd3\x34\x1f\xc5\x51\x41\x88\x40\x8f\x54\x6d\xf4\x3f\x56\x5c\xe4\x08\xa3\x0d\x5d\x6f\xb2\x1d\xc2\x5b\x4c\x33\xbc\xcc\xc8\x3e\xff\xab\x58\x86\x22\x79\x67\xce\x1e\x42\x69\xfe\x09\x0b\x81\x77\x6d\x3c\xac\x40\x0e\xd9\x05\x11\x70\xb5\x02\x2a\xa2\x2b\x4a\xd2\x19\x50\x42\xc1\xd3\x53\x09\xbc\x2d\x2d\x33\x8d\x82\x84\x33\xa9\x04\xa6\xfa\x70\xee\x81\xf2\x6d\x81\x7e\x18\x4f\xc9\xb9\x67\x0a\x9d\x69\x5c\x54\xd7\x84\xfe\xac\x9a\x7a\x73\x1a\xa2\xcc\x88\xd4\xd8\x74\xb3\xdc\x9f\xcc\xd0\x84\xcc\xdf\xc9\x8a\x08\x41\xd2\x8b\x52\x63\xf2\xae\x02\x7f\xb5\x66\xbc\xfa\xf9\xf2\x89\x24\xa5\xda\xbb\x76\xbc\x73\xd7\x72\x89\x9d\x27\x6c\x7b\x96\xd9\x61\xf4\xee\xbb\x3f\xe8\x09\xc3\x4d\xa1\xd7\xd7\x25\x1a\xf7\xa8\x0d\x56\x48\x62\x45\xe5\x6a\x07\xeb\xac\x30\x41\x9e\x34\x87\x04\x21\xb4\xde\x31\xb4\xdc\x59\xe6\xa8\xaf\xf7\x99\x17\xec\xb2\x54\x88\x2a\xe0\xa8\xc9\x86\x73\x49\x10\x36\x88\x86\xf1\xb6\x94\xc3\xdd\x85\x38\x23\x88\x0b\x94\xeb\x93\x6e\xf8\x82\x17\x62\x63\x3a\x0b\xc0\x40\x0d\x8e\x4a\x94\x73\xa9\x6a\x5c\xeb\x5f\xf4\x5a\x34\x78\x7d\x2a\x02\xab\x27\x68\xad\x65\x2f\x22\x15\x92\x65\xae\x27\xf1\x48\xe8\x7a\xa3\xe4\x0c\xd1\x05\x59\xc0\xf6\x13\x9c\x6c\x1a\xc3\xe5\x84\x28\x3f\x42\x71\x96\x39\x16\xd7\xa4\x25\xf2\x8f\x92\x0a\x92\xeb\x0b\x07\xbd\xaa\x6e\x27\x7b\x63\xcc\xdc\xdf\x3b\x54\xe2\x1f\xa6\x67\x9b\x66\x88\xa8\x64\xf1\x7a\x86\x12\x9e\x17\xa5\xd2\x38\xd7\x6b\x5a\xee\xf4\x19\x17\xd8\xde\x90\x82\x97\xeb\x30\x46\x48\x66\x27\xea\x44\x18\xd8\x6c\x90\x25\x34\x53\x62\x6b\x74\x62\x90\x74\xe2\x24\x11\x59\xe6\x5e\x88\xd4\x20\x03\xf0\x97\x63\x95\x6c\xac\xc0\x94\x70\x21\x88\x2c\x38\x03\x88\xf0\x97\xcb\x7a\x2d\xff\x3b\x48\x0c\x1a\xd8\x2b\xf9\xda\xb2\xbc\x0d\x01\x66\xe7\xf6\x10\x0b\x02\xbf\xb5\x69\xa2\xef\xf0\x22\x3f\xfb\x73\x4f\x9b\x79\x33\x44\xf2\x42\xed\x1a\x94\xd6\xd8\x63\x45\x44\x5e\xad\x10\x83\x9e\xe4\x7b\xcc\xb5\x2a\xcd\xfc\x69\xae\xf5\x05\xaa\x2c\xe5\xa1\x37\xe8\x15\x90\x1e\x55\xa7\x12\x8e\xcd\x9c\x17\xaf\x17\xe8\xdc\x29\x5f\xbe\x67\x78\x52\x8c\x57\x23\xdb\x21\xf4\x44\x25\x0f\x00\xad\xc6\xf7\xbe\x33\xc4\x01\x9b\x93\x23\x2c\x21\xa1\xb7\xf6\xf1\x6d\xa8\x46\x92\x8c\x24\x4a\xf3\x61\x22\xf2\x19\xc2\x52\xf2\x84\x6a\x91\xaa\xda\xff\x20\x48\xb4\x47\x6a\x06\xcd\xfe\x05\xc5\x2f\x4a\x3f\xfb\x84\x3b\xf4\x7e\x67\x89\x5a\x13\xd3\x27\xad\xbd\xd4\x26\xc3\x18\x84\x88\xf4\x19\xd7\xdf\x9f\x4a\x94\xe1\x25\xc9\x3a\xf7\x66\xf7\x19\xa0\x7b\xef\x74\xbd\xd3\xb4\xb2\xb9\xfd\x4b\x04\x60\x7b\xf9\x68\x39\x0d\x53\x26\xad\x3e\x32\x43\x18\x3d\x90\x9d\x51\x5d\xb4\x76\x54\x68\xd6\x05\x97\x30\x56\x51\x50\x05\x31\x97\x8b\xe6\x01\x0f\x64\x07\x80\xac\xae\x13\xf1\x7d\xfc\xce\x9b\xe7\x81\xf4\x0a\x1b\x7d\x4f\xe7\x12\x87\xbd\x82\x39\x02\x26\x80\x93\x8e\xc1\x1f\x02\x95\xb5\xc8\x28\x01\x9d\x23\xf2\x9b\x80\x64\xd7\xff\xb8\x2d\x38\x68\x9d\xb7\x95\xa2\x65\x36\xf6\x54\x9a\x0d\xd2\x67\x65\x43\x8b\xe8\x75\x2a\x5e\x8b\xc6\x4e\x73\xfd\x8c\x33\x9a\x56\xd3\x93\xc0\xf9\xaf\x98\x5f\x2a\xd9\x7f\xae\xb9\xba\x62\x33\x74\xf9\x44\xa5\xbe\xf0\x2f\x38\x91\xd7\x5c\xc1\x3f\x17\xe8\xcf\xca\xd0\xe0\xf7\x03\xac\xa2\x31\xc5\xb1\x88\x35\xeb\x38\x08\xad\xe7\xcc\x08\xe0\x1a\x1d\x4d\x7d\x58\x2e\xb4\x84\x3d\xcc\x12\xeb\xa7\x3a\x60\x54\x6a\x0d\x95\x0b\x87\x16\xb0\x6a\x00\xcc\x1e\x59\x3f\xf4\xe4\xa5\x04\xc5\x97\x71\x36\x87\xfb\xd2\xcd\xa9\x35\x96\xc1\x7a\xfc\x34\x45\x6b\x7f\xba\xd3\x73\xc3\x46\x43\xf4\x4f\xed\xcf\x4a\x0f\xf7\x7d\x6b\x90\xf8\x03\x59\x4f\x66\x83\xb7\x20\x84\x51\xb6\xce\x2a\xb1\x6a\x86\x1e\x37\x34\xd9\x80\xdc\x1e\x0d\x74\x49\x8c\x69\xa7\x10\x44\xdf\x7b\x18\xac\x5b\xd6\xaa\xa8\xc5\x61\xea\x90\x40\xe3\x27\x2a\x48\x91\xe1\x84\xa4\x28\x05\xa1\xd3\x18\x56\xb0\x22\x6b\x9a\xa0\x9c\x88\x35\x41\x85\xbe\xdb\x62\xa9\x3f\xfa\x42\x31\xcf\xe8\xc3\xe2\xd7\x3b\xfb\x1f\x27\x52\xc7\x4c\x69\xae\x39\x53\xd4\x7b\x8e\x4c\x22\x5e\xee\xb5\xa0\x84\x5f\x8e\x59\x1b\x08\x1c\xd6\xba\xfa\x95\x65\x0d\xd0\x0b\x26\x59\x63\x92\x35\xbc\xcf\x24\x6b\xb8\x67\x92\x35\x26\x59\x63\x92\x35\x26\x59\xe3\x9f\x48\xd6\x88\x04\x6a\xec\x29\x23\xcc\x3a\x3f\x1a\x3b\xd7\xbe\x1d\x07\x04\x1b\xe7\xc5\x6b\x99\x6c\x06\x56\xa4\xc5\x84\x3b\x7b\x97\xdd\x83\x89\x88\x32\x00\x22\x30\x5b\x13\xf4\x76\xfe\xf6\xcd\x9b\x30\x65\xad\xb8\xc8\xb1\x02\x3f\xfd\x6f\x7f\x13\x81\x93\xda\x9f\xdf\xff\x0c\xd3\xc3\xbc\x61\x11\x0b\xbc\x64\x70\xeb\xb7\xd6\x0e\xef\xd0\xd0\x66\xfb\x2c\xcf\xcf\xf0\x4f\x58\x2e\x57\x99\xa8\x5b\xc6\xef\x8e\x2b\xc1\xbb\x38\x6b\x75\x16\x9a\xb9\x2b\x94\x13\x85\xb0\x6a\x99\x36\x69\x4e\x2a\x0f\x92\x71\x83\x18\x8f\xab\x17\xa2\xf3\x8d\xa4\x88\x33\x6b\xb9\xd6\xb4\xb3\x88\x9c\xb1\xdf\xdb\xd1\x74\x8a\xa0\x84\x60\x49\xb4\x0c\xb1\x24\xd5\xac\x79\xae\x67\x49\x99\x72\x0c\x50\x4f\x99\x38\xac\x7a\x01\xbf\x22\x8b\xf5\x02\xa5\x25\x80\xc3\xcc\xba\x92\x5f\x9b\x55\xcb\x9d\x54\x24\x07\x1f\x0b\x17\xf0\x3f\x7a\xf9\x4a\xec\x90\xf2\x5b\x74\xc9\x96\x30\x55\xe2\x2c\xdb\x21\xb2\xa5\x89\xaa\xf0\x07\xde\x6e\xaa\x8c\x3f\xcc\x77\x5a\x62\x04\xd6\xfd\xd3\x18\xe4\xd3\x7b\xe2\x9b\x21\xc5\x85\x57\x53\x51\x1a\x1e\xb8\x7f\xc2\x87\x54\xbf\x06\x94\xf3\xe9\xd6\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\xe7\xd7\x17\x1a\x23\x43\x4b\x46\xe8\x9e\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\xc4\x64\xb3\xf5\x4c\x4a\x9f\x18\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\x2b\xf9\xba\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\x77\x70\xbe\x5f\x29\x66\x5f\x13\xa1\x25\x16\xc8\xaa\xaa\x37\xde\xac\x2b\xb5\xee\x48\x92\xde\xb4\x57\x13\xe0\xde\x46\x87\x83\x49\xe3\x34\x25\x29\x2a\x88\x98\x1b\xd2\xe3\x68\x45\x59\xda\xb3\x16\xb7\x7e\x2f\xd8\xc8\x38\xfa\xf6\x24\x47\xb8\x2e\x9a\xde\x95\x16\x83\xde\x8f\xaa\x1f\xb8\x0b\xab\xfd\x7b\xc9\xa8\x7a\xd0\xbc\xdc\xe5\x36\x5e\x65\x07\xbd\xed\x1f\x25\x11\x3b\xc4\xb7\x44\xd4\x9a\x49\x95\x8c\x1a\xa3\x84\xc0\xdd\x43\x25\x4a\xb0\x34\x8c\x7a\x58\xd4\x1a\xa7\x9d\x8e\xf7\x83\x74\x16\xbb\x0f\xc2\x68\xf9\xce\x66\x01\x88\x88\x94\xde\x7a\x4d\x1b\x3d\xce\x29\x2c\x62\x45\x78\xe3\xba\x8a\x7a\x79\x94\x70\xda\xbb\xdb\x1e\x93\x47\xbc\x5a\xd0\x70\xe3\x0d\x98\x3d\xe2\x61\xee\x99\x47\x9e\x69\xfa\x40\x07\x98\x3f\xd0\x38\x13\x08\xda\x47\xaf\x9e\xa5\xbd\xa7\xbb\xd6\x90\x11\x40\x1b\xf4\x35\xde\x22\x82\x0e\xd3\x47\xc6\x5b\x46\xd0\xfe\xf2\xab\xed\x13\x1d\x33\xc9\xa8\xc5\x37\x4d\x2a\x7e\x53\xc9\x28\x90\x1d\xb3\x4a\xdb\x5c\x02\xb4\xd5\xb2\x98\xbc\x34\xb2\xc7\x59\x4b\xd0\x3e\xaa\xad\xad\x80\x82\xea\xbc\x67\x3b\x19\x85\x98\xb6\x9d\xc5\x6b\x3f\x19\x05\xd3\x67\xcc\x68\xdb\x50\x46\x83\xec\xda\x5b\x3a\x76\x94\xe3\x4c\xd3\x4e\xb1\x36\x44\x8c\x02\x6b\xaa\x58\x1c\xd3\x18\x81\xc6\x1b\x24\xd0\xa1\x74\x39\xd6\x30\x81\x46\x1a\x27\xd0\x08\x03\x05\x1a\x6b\xa4\x40\x63\x0d\x15\x68\xf4\x7a\x41\x84\xf8\x1e\x42\x20\xe2\x96\xdb\xac\xe5\x33\xf6\x36\x1a\xbd\x83\x5d\x69\xc7\x4c\xd5\x08\x3a\x39\x2e\x34\x97\xf8\x4f\x7d\x35\x03\xe1\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\x71\xa3\xd5\x73\x7d\xf9\x1a\x35\x8f\x4a\x74\xf2\x40\x76\x27\xb3\x0e\x1f\x39\xb9\x62\x27\xb1\x50\xb1\x55\x55\x5a\x3c\xa3\x92\x7c\x38\xcb\x76\xe8\x04\xfe\x76\x12\x7b\xb0\xfb\xc4\xc5\x31\x82\xe0\x01\x46\xb9\xa8\x97\x99\xab\x3b\x34\xd6\x01\x58\x7f\x58\xd9\x57\x9c\x62\x5c\xff\x29\xc6\xda\xe8\x24\xa8\xbb\xae\x1c\x84\x5e\x55\x69\xe3\x6b\x8d\x79\xf5\xda\xaf\x4a\x37\x96\xd4\x8a\x44\x03\x91\x3f\x27\x98\x49\x74\xe2\xac\x67\xa7\xb2\x9e\xe3\xc9\xf1\x3c\x8e\xa3\xce\x70\x3c\x2f\x52\x36\x80\xed\xaf\x31\xe2\xea\x9e\x8e\x6f\xad\x85\xb6\x74\xd2\x92\xd4\xe6\xc5\x14\xbd\x72\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\xc7\x0d\x11\xad\x95\x52\x69\x4b\x52\x81\x07\x42\x94\x8c\xe9\x71\x39\xb3\x66\xbd\x28\x90\x9a\xcd\x98\xca\x4a\xd6\x4c\x62\xc4\x7e\x58\x35\xc8\xfe\xf5\x2e\x45\x86\x3a\x22\x67\xc0\x84\x72\x57\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\x50\x60\x27\x86\xfb\x44\x53\x75\x9c\x6c\x30\x6f\x4e\xe6\x18\x2e\x83\xd1\x61\xf6\x8f\x47\x0e\xb3\xdf\x33\x3d\xfd\x93\x44\xd9\x47\x1a\xf5\xa6\x50\xfb\x29\xd4\xbe\x11\x6a\x0f\x1f\x19\xce\x37\x1c\x73\xef\xa7\x19\x88\xc5\x8f\x8d\xb9\x47\x3f\x6e\x08\x9c\xa8\x80\x81\x4d\x6f\x51\x5e\x66\x8a\x16\xb5\xc3\x5a\x9a\xa9\x65\x46\x7d\x34\x81\x4a\x72\xcf\x3a\x1b\xca\x08\xc0\xc9\x66\xff\x98\xc0\x38\xe0\xd0\x96\xc0\x91\xad\x9b\x05\x67\x99\x8d\xad\xd7\x7a\xa5\x7f\x8f\x88\xf5\x55\xd1\xe3\x98\xf0\x2f\x6c\x99\xc5\xca\x68\x02\xce\x89\x57\xfa\xb2\xcc\x34\x39\xe8\x2b\xcb\x71\xb5\x90\xcf\xb5\x73\xff\x1a\xab\xcc\x96\x38\x07\xc9\x9a\x6e\x09\xab\x2f\xe1\x57\xf2\xf5\xeb\xa1\xb0\x26\x15\x29\x7a\x74\x05\x8b\x00\xd0\x3e\x91\x63\x16\x79\xdd\x07\xc0\x56\x82\x40\xc4\x35\xff\xc7\xc6\xed\xf5\x6f\x01\x98\xb5\x73\xc8\x7b\xc1\x03\x7a\xaa\x2b\xbe\xda\xc0\x00\x50\x3a\xbc\x9a\x38\x3b\xe8\x08\x37\xc2\x01\x2e\x04\x44\xfd\xec\xc4\x3c\x63\xdc\x07\x5f\x2c\x7d\x22\xc2\x65\x30\x26\xcc\x6d\xd8\x5d\x10\xab\xff\x1d\x1a\xf2\x18\x74\x00\x4c\x31\x8f\xc1\x27\xde\xd8\xff\xaf\x17\xfa\x18\x30\xee\x7f\xa3\x31\x90\x07\x1b\xf5\xbf\x64\xe8\x63\xc8\x90\x3f\xd2\xdb\x85\x86\x8c\xf8\xcf\x0c\x00\x1c\x0a\x82\x8c\x86\xe9\x31\xde\xf7\x1b\xe4\xa3\xa1\xf6\x19\xee\x7b\x8d\xf1\xd1\x10\xa7\x08\xc2\xc1\xf7\xbe\x76\x04\xe1\x48\x83\xfc\xa1\xc6\xf8\x51\xbb\x33\xd6\x08\x6f\xcd\xeb\x11\xd3\x88\x34\xc0\x77\x4d\xeb\x31\x4b\x1c\x34\xbe\xef\x9b\xd5\xe3\x8c\x4e\x21\xc3\x7b\xaf\x49\x3d\x02\x6c\xbf\xd1\xfd\x59\xe2\x54\x34\x75\x46\xbe\x18\x6b\x42\x1f\x6f\x3e\x8f\x88\x25\x18\x61\x3a\x77\x86\xf1\x01\x88\xc7\x30\x9b\x47\x71\xc4\xe8\x93\x16\xc7\x21\xa2\xcd\xe4\x2f\x61\x22\x1f\x69\x1e\x8f\x51\xcb\x51\xaf\x6a\x1e\x32\x8d\x1b\x4d\x78\x00\x64\xbc\x59\xbc\xa9\x0d\x0f\x2d\x3f\xd6\x24\xde\xd4\x87\x87\x3c\x53\x51\xe6\xf0\xae\xb1\x3b\xde\x9b\x32\xca\x14\x1e\x45\xad\x31\x96\xd7\x18\xf3\xf7\xb3\x8d\xaa\x83\xc1\xeb\x4c\xd1\x43\x03\xd8\x9b\x74\xed\x89\x62\xef\x9d\x33\xde\x72\x9a\xa2\xa2\x54\x36\x94\x77\x74\x24\x7b\x2f\xd4\x5f\x54\x74\x7b\x0b\xf5\xc1\x10\xf7\xb0\x49\x7b\x76\x40\x88\xbb\x17\xa2\x3d\x96\x07\x84\xb8\xfb\x41\xda\xd0\xf7\x83\x42\xdc\xbd\x50\x21\xf4\xfd\xb0\x10\xf7\xc1\x13\xbf\x4f\x42\xfe\xbd\x72\x71\xee\x5e\x90\xc3\xf1\xef\x81\x38\x77\xbf\x85\x3c\x18\xff\x1e\x88\x73\xf7\xa3\x33\x3a\xfe\xbd\x13\xe7\x1e\x20\xf9\x29\xfe\x7d\xef\x99\xe2\xdf\x1b\xcf\x14\xff\x1e\xb9\xd8\x29\xfe\x7d\x8a\x7f\x1f\x7a\xa6\xf8\xf7\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\xa7\xf8\xf7\x29\xfe\xbd\xe7\x99\xe2\xdf\xa7\xf8\xf7\x29\xfe\xbd\xf1\x4c\xf1\xef\x03\x4b\x99\xe2\xdf\xa7\xf8\xf7\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\x7b\x5e\xf9\x2a\xf1\xef\x2d\x23\xb4\x37\x08\x3e\x60\x8e\xad\xeb\xa7\x8c\x0c\x82\xf7\xc2\x5c\x92\xe1\x20\x78\xef\xb4\xbd\x50\x3d\x35\x7e\xa2\x22\xe1\xfd\xa6\xd7\x66\x84\xfc\xa8\x48\xf8\x80\xd1\xbc\xa7\x2a\xfd\x33\xab\xcf\xa3\x46\x84\xfc\xa1\x91\xf0\x7e\x12\xe0\x53\x24\xfc\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xbc\x79\xa6\x48\xf8\x29\x12\x7e\x8a\x84\x9f\x22\xe1\xa7\x48\xf8\xce\x33\x45\xc2\xf7\x4e\x77\x8a\x84\x9f\x22\xe1\xa7\x48\xf8\xfa\x99\x22\xe1\xdb\xcf\x14\x09\x3f\x45\xc2\x07\x9e\x29\x12\xfe\x65\x22\xe1\xbd\x7f\x5a\x62\x49\xae\x72\xbc\x26\xfb\xb3\x6f\x1d\x98\x3f\x69\xad\x9d\xea\xd7\xaa\x28\xe7\x52\x92\x54\xb3\x9c\x94\x14\x19\xdf\xc1\xb6\xcc\x80\x0a\x78\xa9\x90\xc2\x9d\xc0\x78\x2f\x2a\x13\xce\x56\x74\xfd\x11\x17\x1d\xde\xd1\x9a\xc2\xfb\xea\xb5\xb6\x8a\xde\xfc\xbd\x19\x5e\xef\x4e\x48\x07\x4f\xd8\xe8\x74\xe7\x19\x11\x2a\xc7\x0c\xaf\x89\xb0\x88\x71\x6d\x1f\xe4\x06\x67\x19\x58\x51\x79\xc9\xe0\xcc\x38\xd3\x6d\xf3\xa3\x0e\xe0\x1b\x9e\x5a\x9d\xbf\x31\x27\xb0\x51\x36\xc1\x9c\x11\x95\x9c\xe1\x06\x9c\x33\x83\x80\x1c\x17\xf2\xec\x8f\xd5\x7f\xcf\xf5\x02\xfe\x6d\x1f\x89\x1e\x16\x1b\x20\x53\x1f\xc5\x98\x81\xee\x48\x22\x48\xc7\xa1\xd2\x83\x77\xf3\xa2\xd3\x87\xf5\xdc\xe0\x3c\xa3\xbf\x96\x4b\x22\x18\xd1\xda\xbc\x7b\x85\xf5\x5e\x60\xed\x4d\x89\xd8\x84\x4a\x06\x30\x33\x2d\x05\xee\xad\xdd\xb2\x02\xc3\x03\x95\x6d\x50\xfa\xee\xc3\x2c\x21\x0b\x74\x41\x56\xb8\xcc\x14\xdc\x8e\xa7\x4d\xb4\xcf\xff\xd8\xfa\x17\xa0\xfb\xb4\x03\x1e\x72\x1c\xaa\xb5\x47\x6d\xe4\x18\xc2\xd7\x2b\x24\x62\x90\xf0\xed\x6b\x86\x67\x69\x3a\xd7\x88\x02\x5d\xa7\x92\x77\x1b\xd0\x8c\x82\xd4\x59\x8a\x9e\x3f\xc1\x36\x20\x43\x03\x72\x31\xf2\x5a\x31\x2d\xd5\x86\x30\x45\x13\x40\x32\x2a\x04\x7f\xda\x59\x89\x31\x48\xf2\x05\xef\x30\x50\x0f\x89\xee\x59\xa9\xac\x9c\x0b\xa2\x8b\x1d\xb4\x5a\x80\x61\x31\x3b\x5e\xa2\x47\x3b\x5d\x51\x32\x60\x2d\xbd\x26\x46\xdc\x37\x8b\x21\x33\x11\x16\x6b\x8f\xa8\xd2\x9a\xe8\xe9\xb9\x58\x97\x46\xd6\xb4\x1c\x80\x30\x25\x76\xe0\x51\x31\x47\x3d\xe5\xc9\x83\x26\x38\xcd\x1b\x4f\xbd\x11\x91\xef\x3f\x5e\x54\x3c\x93\xda\x1c\x06\x7b\x0f\x15\x82\x6f\x69\x4a\xd2\x05\xfa\x8c\x05\xc5\xcb\x4c\xcb\xb8\xb6\x2b\xb4\x44\xbf\x7e\xf5\xf9\xfc\xf6\xa7\xeb\xf3\x8f\x97\x3e\x61\x44\x33\x18\xf2\x54\x60\x96\x92\x14\x95\xb2\xf6\x6a\x5a\x6c\x9e\x9e\x4a\x44\xd8\x96\x0a\xce\xf4\x42\x40\xb1\xc7\x68\x6b\xc7\xf2\x00\x4d\x30\x33\xc5\x9d\xc0\xc0\x9b\x6d\x49\x6a\x24\xfc\x6a\x66\x8e\xd7\x52\x56\x94\xca\x99\x33\xc0\x1f\xe6\x2d\x08\x55\xb2\x64\x83\xd9\xda\x76\xb2\x6d\xae\x0c\xc9\x1d\x53\xf8\x49\x8f\x0a\x5a\xbe\x4c\x70\xe1\x5c\xb5\x18\xa5\xbc\xf4\x4f\xf4\xd7\xbf\x9e\x21\x4a\xde\xa1\x5f\x37\xc0\x2d\xd0\xa5\x85\xd0\x40\xa4\xf1\xd5\x91\x2d\x11\x30\x84\x45\x98\xcf\xf2\x24\xc8\x1a\x8b\x34\x23\x12\x7c\x48\x8f\x1b\x02\xdd\x45\x8c\x26\x63\x37\x89\x54\x46\x0e\xc6\xd5\x02\xbd\x77\x18\xf3\xad\x1e\x1c\x67\xe9\x02\x7d\xe4\xe0\x4d\x5a\xf1\x77\x68\xa3\x54\x21\xdf\x9d\x9d\x3d\x54\x4c\x74\x41\xf9\x59\xca\x13\x79\xa6\xb0\x7c\x90\x67\xe6\xa0\xcf\x53\xac\xf0\xbc\x71\x54\xce\x8c\x00\x37\x4f\x78\x9e\x63\x96\xce\xb1\x25\xd2\x79\xb5\xe9\x67\xdf\x59\xf1\x68\x8e\xab\xb7\x28\x9b\xe3\xb9\xdc\x90\x2c\xeb\xb2\x39\x34\x24\xbe\x0f\x0a\x42\x61\xc9\xc4\xce\x21\xe6\xc4\x5d\x56\x07\xcc\x40\x5b\xa0\x6b\xae\xac\x6b\xd2\x12\x05\xd5\xc2\x2a\xac\x24\xd4\x14\x79\xef\x64\xa2\xcb\xeb\xfb\xdb\xbf\xdd\x7c\xba\xba\xbe\x1f\x3c\x8a\x1e\x88\x03\x07\x34\xe6\x28\x7a\x20\xfb\x0f\xe8\xf0\x51\xf4\xf9\x14\xfd\x07\x74\xf8\x28\xfa\xd9\x82\xf7\x80\x46\x1f\x45\x0f\x6c\xcf\x01\x8d\x3f\x8a\x1e\xb8\x9d\x03\xfa\x0b\x3f\x8a\x84\x6d\x23\x8e\xe1\xf7\x56\xba\x6e\x10\x66\x85\x6f\xb8\x0b\x65\x25\xea\xd5\xf4\xed\x3b\x37\x5d\xd4\x8f\x5f\x75\x6b\x76\x97\x6c\xfb\x19\xb7\x3d\x15\xac\x77\xaa\xc8\xbe\xe0\xd5\xb9\x80\x95\xbc\x1f\x5a\x40\x54\xcf\x7b\x9c\x77\x74\x28\xef\x02\xae\xad\x00\x6d\x24\x8a\xee\xbc\x17\xe8\xa3\xb5\xc8\x87\xad\xd9\xef\x7f\xba\xba\xb8\xbc\xbe\xbf\xfa\x70\x75\x79\x1b\xd2\x64\xa3\xf4\x58\xd0\xf9\xa3\x97\x70\x3a\x86\x1b\x06\x17\x51\x73\xca\x42\x90\x2d\xe5\x65\x6d\xa1\xe8\x27\x3f\x8f\x8a\xd1\x7c\x6a\x61\xd2\x78\x29\x77\x48\x12\xb1\xa5\x49\x3f\xba\x4d\xa6\x44\x18\xd5\xf1\x0c\xb9\xc5\x7a\x83\x30\xc7\xb2\x65\xcb\x80\x83\x30\x5f\x84\x39\x9b\xe7\x70\x16\x1d\x9e\x71\x5b\x92\x6a\x6a\x6c\x27\x27\x8b\x7e\x0e\x69\x9e\x78\xb2\xfe\x20\x78\x30\x51\xb4\x45\xda\x77\x26\x21\xda\xa8\x96\xfd\x14\x73\x6a\xbd\xe1\x61\xf3\x51\x83\xf1\x59\x71\xc3\x44\x99\x58\x79\xc3\xb8\xb3\x02\x10\x62\x5d\xdd\x95\x09\xe5\xaf\x64\x77\x4b\x56\x43\x36\xd8\xf6\x62\xc1\xb0\x66\x7d\xbd\x46\xa9\xaf\xcc\x17\x43\x66\xf5\x31\xae\xf8\x48\x37\x7c\x27\x71\xd9\xd8\x14\xad\xfd\x2f\xc6\x89\x32\xca\x97\x33\xc4\xb5\x7b\xa7\x75\xda\x64\xdf\xf6\xec\xa8\x58\x71\x22\xe1\x2c\x21\x85\x92\x67\x7c\xab\x39\x12\x79\x3c\x7b\xe4\xe2\x41\xcb\x07\xfa\xc4\xce\x8d\x11\x44\x9e\x81\xa9\xe4\xec\x3b\xf8\x9f\x28\x7f\xe1\xfd\xa7\x8b\x4f\xef\xd0\x79\x9a\xda\x56\x88\xa5\x24\xab\x32\x73\xbd\xa6\x11\x2e\xe8\x67\x22\x24\xe5\x6c\x86\x1e\x28\x0b\x74\x04\x6c\x3e\x25\x4d\xff\x3d\x74\x00\xdd\x33\x0a\xe7\xbc\x30\x26\x8b\xd1\x78\xbf\x03\xfb\xf7\xae\xc5\x61\x2a\x5a\xd5\xfc\x83\x46\x36\xab\xd5\x34\xe5\x5c\xde\xf6\xaa\x89\x5e\xe4\x92\xf3\x8c\xe0\xa1\x58\xa7\x58\x6f\x6c\x8c\x27\x36\xda\x75\x05\x7b\x3d\xf6\xfc\x9f\xd6\x0c\xc0\x84\x91\x5a\xba\x2e\x78\xfa\x0e\xc9\xb2\x28\xb8\x50\x12\xe5\x44\x61\x2d\xfb\x2e\x34\x41\x0e\xd3\x4e\xeb\x75\xb0\xf8\xcd\xea\xdf\xc0\x61\x20\x1b\x3f\x00\x97\x34\x01\x26\xc3\xa0\x65\x41\x92\x05\xe3\x29\xd1\x87\x70\x66\xfe\x69\xef\xf6\xf3\x24\xe1\x25\x53\xf6\x0f\x0a\xab\x52\x2e\x36\x5c\xaa\xab\x9b\x08\xb0\xe6\xf5\x82\xa7\x57\x37\xb3\xd6\xbf\x64\xf0\x0a\x42\x23\xd9\x60\x7d\x0e\x47\x93\xbf\xfd\xae\x59\xd1\x23\xc7\xf0\x9f\xd0\xd6\xfe\x06\x07\x8a\x4d\x34\x1f\x2a\xd1\xa3\xa0\x4a\x11\x06\x92\x0a\x84\xb0\xf2\xd5\x4c\x9f\x84\xfa\xe2\xdd\xbe\x8d\xca\x77\x1a\x75\xf0\x57\x6e\x9a\xa3\x97\xae\x3f\x72\xeb\x36\x54\x5a\x5d\x09\x31\xd2\xa0\x7b\x6a\x07\xda\xf9\xcd\x15\xda\x1a\x7c\x1e\x79\x99\xf1\x27\x7f\x15\xb9\x6b\xd1\xe7\xdf\x05\x63\x7e\x78\x26\x1f\xa8\x4a\xc2\x58\x8c\x57\xc2\xf4\x3b\x70\xc8\x0f\xe2\xab\x0a\x0a\x45\x19\xcd\xa9\x0d\xd4\xb2\xe5\x65\x24\x7a\x65\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\x64\x56\x81\x37\x60\xab\x7f\x19\xc0\xc3\xa7\xb2\x31\xc1\x2e\x74\xa3\xcb\x24\xa5\xd0\xf7\x7c\xb6\x73\x5c\x91\xa4\x47\xe5\x0c\x15\x96\xaf\x0f\x92\x49\x2a\x25\xd6\xc8\x34\x15\x1d\x82\x18\xbb\xe5\x59\x99\xc7\x65\x54\xd5\xf7\xb3\xa9\x37\xc4\xb6\x5a\xe8\x95\x47\x97\x02\x52\xba\xa5\x32\x2e\x56\xb1\x47\x08\xa0\x36\x7c\x94\x97\xaa\x28\x95\x4d\xab\x19\xea\x4c\xdc\x7c\xc8\x53\xc1\x25\xa8\x3e\x55\x00\x73\x8b\xff\xbd\x1d\x4e\x16\x1c\xb9\x60\x37\xd2\xf8\xad\x75\x65\x6b\xde\xd5\x27\xb3\x62\x7f\x47\xde\x97\x78\xee\xe5\xa6\x72\x2c\xe6\x65\xbc\x6c\xc7\x51\x60\x64\xd3\x15\x69\x82\x58\xa2\x34\x81\x7e\x87\x71\xfb\xf9\x52\x3a\x4f\x15\xf7\x00\x4b\xa9\xaf\xbb\x95\xe0\xf9\x02\x81\x7d\x28\x8a\xd0\x97\x04\xac\xc9\x19\x4d\x1d\xac\x07\x12\x54\x3a\xdd\x33\xe9\x51\xbf\x24\x3d\xca\x7a\xef\x8d\x12\x15\x5d\xc9\xe1\x5f\x4e\x89\x8a\x78\x6d\x68\x56\x73\x38\x0c\x41\xe3\x7d\x00\xfe\xa0\xf1\xde\x6f\xc9\xea\x35\xe0\x3b\x49\x4c\x71\x54\xf0\xa2\xcc\xb0\xf2\x98\x40\xc3\x6e\xa4\xda\xc6\xef\x18\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\xcf\x32\x44\x99\x61\x50\x00\xd6\x59\x43\x05\x31\x42\x16\xc2\xc6\xbc\xbf\xf5\xdb\xf1\x1f\x6d\x4e\x60\xc3\xec\x4b\xa5\x56\xe2\x84\x82\x10\x31\xc8\x19\x34\xf7\x83\x35\x36\x52\x56\x65\x0e\x7a\x60\x56\x62\x41\x15\xbf\xda\x49\x23\x36\xd1\x6f\x52\xb9\x85\xc3\xcc\x15\x7e\xf0\x81\x2c\x04\x49\x48\x4a\x20\x2e\xe5\xb3\x89\x88\x75\x38\x5c\xee\xf4\x1a\x2f\xd9\xb6\xb2\xdb\x96\xc6\xc7\x64\x2e\x03\x0d\xd9\x47\x51\xf8\x81\xb4\x20\xbf\x84\xb7\x45\x13\xdd\x9d\x2b\x13\x59\x39\x5d\xe0\x7e\xaa\x34\x05\x97\xec\xe1\x3d\x5d\x75\x54\xd4\x33\xdc\x2c\x95\xa9\x73\x40\x4c\xe8\xdc\xa9\xb5\xa1\xa8\x7d\x97\x1e\xc1\xfc\x1a\x73\xf9\x7d\xdb\x17\xdf\xd8\x4b\x2f\xea\x42\x8b\xbe\xcc\x62\x2f\xb2\x11\xc6\xc0\x71\x17\x53\xec\xa5\x14\x75\x89\x14\x82\xac\xe8\x53\x34\x6d\x9e\xb3\x5a\xe1\xa2\x29\x61\x4a\x2b\x37\x50\x42\xb7\x10\xa4\x20\x2c\xad\xd2\x92\x87\x2e\x39\xcb\xaa\x6b\xeb\x7d\xed\x44\x3c\xae\xa3\xd0\xc8\x91\x63\x0f\xe0\x5d\x9f\x24\x3b\x9d\xbe\x7f\x9d\xd3\x67\x37\xf8\xab\x1d\xbd\x67\xca\x56\xb4\x2f\x0a\xba\x67\xe9\xa7\x17\x8d\xc0\x22\xa0\xbe\xd1\xb4\x53\xc7\x6a\x9e\x01\x14\x1f\x89\xdc\xd7\xc5\x1d\xa8\xac\xd9\x44\x15\xc0\x09\xe5\x83\x05\xca\xc8\x96\x64\xf6\x66\x44\x26\x54\x33\xf7\x0b\x4b\x10\xb3\x0d\x96\x0e\x2d\xed\x6b\x32\x16\x34\x6d\x89\x4e\x30\x25\xcd\x4e\x34\x69\x67\x1c\xa7\xf0\x47\xc1\xb3\x8c\x08\xdf\x54\x33\xfa\x40\xd0\x05\xc4\x82\xdb\xdc\x1c\x96\xa2\x3b\x85\x95\x26\xe5\x3b\xa2\x7c\x56\xf4\x01\x32\x85\xb9\xdc\x94\x59\x76\xc3\x33\x9a\x78\xb4\xe9\xf6\xf6\x40\x34\x3b\x2a\xca\x2c\x43\x05\x7c\xb4\x40\x9f\x18\x9c\xf7\xf3\xec\x11\xef\xe4\x0c\x5d\x93\x2d\x11\x33\x74\xb5\xba\xe6\xea\xc6\x08\x33\x3e\x9e\xd8\x74\x46\x9b\xcf\x11\x5d\xa1\x77\x99\xa9\xd2\xad\xf0\x1a\x04\x4d\x67\x56\x9e\x69\x8c\x36\xc1\x7a\xa0\xc2\x31\x7f\xa4\xb2\x57\x5a\x7b\x36\x31\x7d\x07\x90\x34\x4b\x32\xff\x3e\x08\xf1\x19\x5d\x91\x64\x97\x64\x31\x27\xe2\x3c\x01\xdf\x4d\x9d\x1c\x5d\xd3\xa0\xeb\x96\x69\x13\x6d\x40\x58\xf5\x16\x0a\x30\x25\x3a\x4c\x0d\x93\x9a\x1c\xab\x99\x18\x15\x40\x46\x4b\xb8\xc3\x17\x48\xc1\xa5\xba\xd3\x5a\x42\x64\xed\x8d\xd3\x1b\xf7\x01\x82\x52\x06\x59\x46\x52\x44\xf3\x9c\xa4\x5a\x2b\xc8\x76\x08\xaf\x14\x54\x47\xa8\x66\x1f\xe0\x68\x1a\x02\x94\x7b\x4f\xab\x64\xdb\x0d\x66\x69\x46\x04\x5a\x61\x9a\x59\xcd\xa3\xa5\xd1\x28\x22\x72\xca\x06\xea\x65\x18\x5b\x36\x28\x3f\x5a\x79\x4a\x12\x2e\x6c\xff\x4f\x50\xed\xed\x9f\xea\xb3\x01\xfc\x7b\x90\x6b\xa0\x3a\xe1\xa7\x9e\xd2\x32\xe3\xc9\x83\x44\x25\x53\x34\x33\x0b\xe0\xfc\x01\x8a\xba\x67\x40\xab\x0d\x52\x0e\x80\x1d\x49\xe4\xd5\x7f\xce\x2b\xca\x98\xeb\x71\xe5\xd9\x77\xf5\x9f\xe0\x07\xff\x15\x19\x27\x5b\x90\x27\x92\x8c\xc8\x2a\xd3\x5c\x46\x23\x1f\x92\x16\x39\xab\x44\x8c\x15\xd7\xcc\x5a\x6f\x81\x39\x05\x03\x37\xe2\xb2\x91\xe8\xb5\x40\x97\x4f\x24\x69\x24\x0b\x42\xc9\x20\x38\x6e\x10\x90\x8e\x1f\x06\x22\x50\xe2\xad\x95\xc1\x10\x5d\xef\x9a\xdf\x9b\xaf\x5c\x62\x88\x05\x82\x32\xca\xe0\x14\xdb\xb0\xdd\x08\xbb\x10\x65\x92\xa6\xa4\x4d\x5f\xe6\x04\x58\xf9\x0a\xa5\x54\x40\x36\xdc\x0e\xad\xe2\xf2\x91\x1b\xf3\x81\x84\x31\xce\x15\x7a\x75\x7a\x76\xfa\xba\x63\xd4\x38\xd5\xb7\x6c\x46\x0c\xaf\x8a\xb1\x8d\xde\x37\x60\xeb\x0b\x80\xe6\x45\xb6\x83\xd5\x9e\xa6\x33\x44\x95\x8b\xf0\x11\x25\xb3\x2b\x8b\x00\x6a\x63\x9a\x67\x48\x72\xa4\x04\xae\x32\x3b\xe0\x57\x48\x69\x11\xa5\xe5\xb4\xaf\x4e\xff\xeb\x34\xc6\xf2\x48\x54\xf2\x1a\x3d\x72\x76\xaa\x00\x8d\x0b\x74\xcf\xb5\x74\x59\x0f\xb5\xe3\x25\x62\xc4\x64\x72\x91\xa7\x22\xa3\x09\x55\x11\x1e\x3e\x04\xcc\x0f\x41\xaa\x17\xb7\xcd\x3b\x4c\x3c\xf6\xe5\x13\x55\xd6\x7d\xae\xe9\xff\x0d\x50\x86\x61\x73\x31\x28\x90\x28\xa3\x5b\x72\xb6\x21\x38\x53\x1b\x53\x19\x84\x71\x36\xff\x99\x08\x0e\x51\xdb\xcc\xfe\xe5\x88\xf5\x53\x5e\xa4\x94\x63\xa4\xb9\x51\xb3\xbe\x3f\x77\x13\xb0\xda\x4f\xeb\xc0\xfd\xe5\xfe\xfe\xe6\xcf\x44\xed\xb1\x04\x0d\xc7\x39\x30\x41\x75\x24\x62\xc5\xc5\x00\x29\xc7\xf3\x86\x0d\x97\x03\x73\xec\xce\x93\x4b\x65\xf2\xc4\xcc\x65\xce\xb4\xc6\xa7\x78\xcb\xcb\x16\x79\x88\x0b\x9e\xa2\xab\x9b\x05\xfa\x1b\x2f\xf5\x9c\x97\x78\x99\xed\xaa\xd4\x20\x49\x14\x3a\xd1\x83\x9d\xe8\x53\xad\xf1\xf0\x17\x82\x53\xbf\x9c\xda\x7c\xf4\x91\x22\xf8\x98\x75\x11\x51\x73\x06\x63\x59\x69\x29\x15\xcf\xd1\xc6\x7c\xbc\x17\x63\x6d\xf7\x36\x86\x37\x69\x0a\x71\x99\x62\x82\x14\x70\xf4\x1c\xd4\x97\x2a\x3b\xa4\xc7\x34\xab\xb6\xbf\x2f\xa1\x42\x59\xd2\x5c\x52\x94\x43\xc1\x54\xaf\x33\xd1\x92\xcc\x2c\x45\x6f\x79\x94\xef\x66\x6c\x61\xa0\x58\x9f\x15\xea\xb3\x66\x98\x35\x59\xe5\x2c\x60\xf0\xdf\x7f\x0e\xab\x3d\x73\x9c\x69\xc6\x24\x75\x1f\x38\xcf\x71\xd5\x47\x22\xf1\x35\x8f\x9e\xf1\x0b\xd5\x1e\x29\xa2\x62\x95\xba\x91\x4a\x5a\x41\x4f\x12\x88\x87\x36\xc7\x17\x08\x59\x12\xb1\xf5\xe7\x18\xec\xcf\x2f\x0a\xf5\x05\x0f\xe9\x2e\xee\xc1\x6c\xf7\x69\xd0\xa7\x0e\x59\xea\x51\x35\x47\xf7\xdf\x3f\xa4\x6c\x8a\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\xac\x31\x94\xc4\xd1\xef\xff\xc7\xff\xf8\xed\xff\x58\x98\x29\x56\xbe\x2c\x86\xae\xce\xaf\xcf\x7f\xba\xfb\xfc\x1e\x82\xe7\x87\x77\xf1\x69\x5e\xeb\x33\x73\xca\xd4\x9c\x8b\xb9\xc1\xd4\x3b\xa4\xc4\x20\x55\x43\x74\x5f\xc4\xb9\x6f\x5b\xe5\xe0\x23\xbd\x06\x2d\xe4\xad\xb8\x70\x37\xaf\xd5\xff\x8c\x8a\x16\x77\x8d\x34\x2d\x1f\x9a\x7c\xbf\x42\xf5\x60\x4d\x0e\xc7\x90\xb2\x54\x52\xdc\xf1\xe4\x61\x94\x9c\x75\x7a\xff\xfe\xc6\x7c\xd4\x10\xb5\x30\x73\xca\x17\x65\x5b\x9e\x6d\x87\xc9\x1e\xa3\xfb\xf7\x37\xb0\x90\x05\xfc\x17\xe8\xa5\xa0\x1a\xec\x34\x64\x17\x48\x66\x4d\xc0\x5a\x8d\x18\x52\xc2\x0d\x54\x41\x70\x46\xa5\xa2\x09\x40\xad\x4d\x24\x1a\x7e\xd8\x32\xfc\xa2\x52\xdf\xe9\x27\x67\x4c\x1e\x16\x00\xe3\x0e\x63\x43\x00\x1c\x0e\xa0\xf8\x45\x70\x4e\xcb\x31\x45\x55\x85\x61\xe2\x9c\x8d\xe7\xcb\xf2\x96\x88\x97\x0a\x41\xee\x14\x2f\xa2\x2d\x8c\xe6\x75\x8f\x7d\x71\x49\x56\x5c\x90\x78\x03\x63\x6d\x30\xac\x8a\x39\x33\x88\x7d\x76\xba\x22\x6f\x9a\xfe\x82\x31\x16\xfa\x91\x65\xb2\x71\x3a\x3a\x23\x52\x9e\x81\x29\xb1\x2c\x8c\x8c\x0e\x66\xcb\x52\x90\x99\x5e\x33\xc9\x61\x45\xb3\x98\x38\x41\xbd\x18\xc2\xcc\xeb\xd0\x0a\xf5\xbe\x61\x0b\xb5\x96\x14\x87\x8c\x3d\x13\x64\x08\xaa\xc0\x72\x43\x20\xaf\x8c\x3c\xd1\xba\x1c\x2b\x96\x9c\x99\xdc\x2e\x8b\x1c\xe0\xe7\x12\x15\x58\x9a\x92\x36\xa1\x9b\xa4\x9e\x98\x01\x77\xc3\xd3\xd3\x53\xd9\x02\xb5\x16\x38\x21\x5a\x03\xa7\x3c\x45\x90\x90\x90\xf2\xc7\x90\x6b\x6b\x49\xd6\x94\x49\xb7\xb7\x7a\x08\x47\x04\x9a\x9b\x9b\x92\x4d\x2e\xff\x7d\x81\x6e\xab\x64\xbb\x61\x4b\x2d\x2f\x55\xc2\x6b\x26\x61\x67\xbe\x6f\x58\x86\xb0\x95\xba\x2c\x77\x68\xf9\x8e\x9c\x5c\xcc\x8f\x1a\x46\x81\xb5\x30\x07\xa0\x36\x08\x70\xac\x85\x39\x84\x02\xd1\xf8\xca\xbb\x3f\x50\x3f\x12\x27\x9b\xb6\xdf\x65\x32\x56\x4f\xc6\xea\xd0\x33\x19\xab\x27\x63\xf5\x64\xac\xee\x7d\x26\x63\xf5\x64\xac\x9e\x8c\xd5\xc3\xdf\x4e\xc6\xea\xc9\x58\x3d\x19\xab\x7b\x9e\x6f\xd1\xe4\x32\x19\xab\xc3\x9f\x4f\xc6\xea\xc9\x58\x1d\x80\x3a\x19\xab\x7b\xdf\xff\x25\x70\xce\xc9\x58\x1d\xfa\xf8\x1b\x33\x56\x0f\xbc\xe0\xac\xbe\x37\x5a\xc6\x8d\x89\xc4\xbe\x01\x1b\x1b\x4d\xac\x79\x98\xaf\x5a\x51\xbd\x06\xd8\xa2\xae\xbe\xe7\x99\x78\x9d\x0f\xe8\x62\x5a\xad\x11\xb8\x36\x3a\xf7\xc6\x04\x83\x3d\xcf\x03\x33\x3e\xba\xda\x85\xc0\xcb\xb3\x82\x9b\xff\x57\x5b\xf2\x1a\x26\x3c\x23\xf7\xf7\x1f\xfa\x61\x26\x16\xb6\xdd\x1d\x64\xb7\x6b\x5b\xe6\x02\xc4\xf3\x0c\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\x2f\xdf\xc2\x24\x82\x73\x5b\xb7\xda\xfd\x46\x10\xb9\xe1\x59\xe0\x24\xb5\x4e\xd1\x47\xca\x68\x5e\xe6\x9a\x30\x25\xf4\x75\xdd\x56\x1e\x3a\x59\x51\xbc\xe1\xa1\x41\xeb\x16\x34\x47\x01\xd2\x83\x6a\x32\x98\x66\x7a\x37\x20\xd1\x61\x83\xb7\xc0\x71\xca\x24\x21\x04\x6a\x98\x5f\x44\x19\xcc\x7e\xbb\xa8\x66\x57\x15\x44\x7c\xeb\xdf\x99\xb8\xa6\xc9\x31\x52\xcd\xa0\x09\xf3\x25\xcc\x97\x71\x6c\x72\x58\x80\x1d\x6d\xb2\x8c\x28\x86\xf3\x22\xe6\xca\x28\x53\x65\xe4\x29\x8a\x36\x51\x8e\x37\x4f\xc2\xfe\x0e\x29\x2f\x87\x98\x26\xa3\xb8\xc8\x68\x93\x64\x8c\x0d\xfa\x20\x73\xe4\x18\x53\xe4\x41\x75\x5e\x0e\x35\x41\x8e\xd2\x3b\xa2\x4d\x8f\xc7\x31\x3b\xbe\x48\x4d\xa5\x08\xbc\xc4\x99\x19\x47\x76\x3b\x1b\x32\x2f\x0e\x9b\x16\x8f\x69\x56\x8c\x44\xed\xb0\x52\x1c\xa1\x10\x8f\x51\x86\x47\x28\xc2\xa3\xcd\x87\x16\x49\x03\xdb\x1a\xab\x00\xef\xa9\xb7\x03\x50\x0f\x53\x7e\x9f\xa1\xf8\xc6\x98\x0b\x5f\xc4\x54\x38\xce\x4c\x78\xb4\xe6\x5f\x41\xf5\x3d\xe2\xa8\x52\x46\x15\xc5\xd9\x05\xc9\xf0\xee\x8e\x24\x9c\xa5\xb1\xcd\xe2\x4f\xaf\x2b\x9a\x93\xe6\x43\x2b\xb9\xb5\xa3\x6c\x36\xd8\x56\xcb\x09\xfa\xbd\x6d\x80\x92\xd3\xdc\xed\xe5\x62\xbb\xe3\xeb\x19\x1e\x92\xbd\x7c\x04\xfd\x1a\x1d\x55\x44\x34\x81\x41\xe3\xd0\xfc\x17\xfe\x88\xf8\x4a\x11\x86\x5e\x51\xe6\x30\xfd\xba\x21\x1c\xd6\xb2\x76\x88\xe4\x2c\x79\xea\xef\xde\xbe\x71\x60\xbe\x96\xa8\x0c\x42\xbd\x94\xc7\xd0\x3a\x2c\xa8\xe7\xa8\x1d\x16\xc4\xaa\xcc\xda\xaa\x87\x51\x47\x62\xf5\x8e\xb7\x75\x49\x94\xb7\x30\x97\x8a\x96\xb5\x36\x69\x83\x19\xbb\x08\x0f\x42\xfc\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\x22\xda\xd3\x11\x4d\xff\x63\xcc\xfe\xff\x72\x92\x4d\x84\x79\xff\x17\x24\xd9\x7c\x09\x59\x40\xd1\x9c\xf0\x52\x1d\x49\x0c\x30\xad\x16\x1b\x1c\x99\x86\xeb\x15\xf1\x72\xaf\x41\xc7\x5b\x0b\xb0\xf7\x96\x3a\x5e\x44\xed\x37\x26\x25\x0c\xec\x93\x5f\x49\xf6\x36\x01\xaa\x65\xb1\xba\x46\x39\x96\x08\xa3\x8b\xeb\xbb\x9f\xbe\x3f\xff\xd3\xe5\xf7\x0b\x74\x89\x13\x5f\xa9\xf0\x46\x95\x10\x66\x1a\x22\x1a\xda\xdf\xe0\x2d\x41\x18\x95\x8c\xfe\xa3\xb4\x6d\x3b\x5f\x55\x10\x5f\x3b\xaf\x89\x07\xe8\x50\x7d\x95\x01\x9e\x01\x8d\x03\x46\x54\xaa\x34\x8d\x06\x8c\x19\x99\x6b\x31\x5f\xf0\x7c\xdf\xed\x77\xa9\xff\xe4\x67\x51\xd8\xf0\x9e\x0d\x11\x04\xad\xe9\xd6\x1a\xec\x6c\x09\x9a\x46\xaf\x4c\x4d\x92\x9a\x12\xf4\x6d\x88\x97\x60\xa6\xf6\x72\x28\x46\x94\xa6\xbe\x4a\xe3\xe0\x4c\x36\xf3\x2f\xb4\x46\x22\x67\x68\x59\x82\xa9\xbe\x10\x34\xc7\x82\x66\xbb\xe6\x10\x38\xf3\xf1\x9b\x6b\xee\x6e\xe8\x9d\xb9\x8e\xeb\xe9\x5f\x7c\xba\xbc\x43\xd7\x9f\xee\xa1\x27\x92\xbe\x59\xc1\x8a\x0e\x7f\x07\xc4\x2c\x89\x1f\x0d\xb6\xb6\xf5\x02\x9d\xb3\x9d\xf9\xc4\x9c\x73\x2a\xa1\x6b\x2e\x71\x1d\x9f\x35\x72\x5c\x29\xa8\x93\x37\x0b\xf8\x3f\x5f\xd9\x6b\x9c\xa6\x42\x73\xf3\xca\x09\xb1\x97\x3f\xa0\xb9\x2c\xf0\x7b\xba\xcc\x1a\x7b\x67\xb1\xf7\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\x37\xe8\x8f\xe8\x09\xfd\x11\xae\xd6\xdf\x87\x80\xc5\x71\xd0\x38\xb1\xd6\x48\x6d\x57\x37\xd1\x58\xf9\x51\x1f\x01\xfd\x8d\x5e\xb9\xe2\x68\x49\x59\x6a\x3a\x34\x3d\x29\x22\xf4\xc1\xb6\xd8\x7a\x76\x85\x43\x3d\xc8\x51\x37\x0c\xac\x13\xe8\x6a\xd5\xa8\x15\x16\x96\x14\x47\x6e\x99\x06\xad\x25\xd9\x6b\x43\xe4\x61\xf3\x74\xab\x62\x59\x3d\x12\x74\x6b\x6f\x9f\x20\x7d\x85\x4b\xd5\xe8\x2d\x1c\x96\x0d\x39\x68\x08\xc6\x1d\xb8\xa1\x41\xaa\x3c\x2e\x21\x8d\x6a\xbe\xd7\xda\x85\x3d\x4c\xef\x09\x8a\x03\x42\x78\xea\x6e\xd6\x46\x3a\x54\xc1\x53\x73\x55\xc3\xa4\xd2\x06\xbb\x71\xb7\x72\x10\x68\xf7\xc6\xb6\x21\x2a\x95\xea\x0c\xf4\xa5\x4f\x82\xed\xc6\x09\x15\x2c\xc5\x40\xc6\x82\x3e\x2d\x55\x0f\xbc\xe0\xc6\x44\x9d\x8f\x42\x70\xc5\x13\x1e\xac\x19\xd9\x36\x09\xdb\x0f\x60\x19\x46\xad\x74\x9a\xf8\x0f\x17\x37\x33\xad\x11\x42\xf1\xbc\xbb\xf7\x43\x56\xb9\x56\x7b\xb8\xfb\xf7\x37\xc1\x36\x35\x11\x8b\x19\x2e\xe7\xdd\x62\xe1\x3e\xb1\xfc\x79\xb5\x27\x05\xc1\x29\x3d\x5a\x6c\x8d\x6b\x75\x58\x41\x1d\x13\x64\x93\xf3\x2d\x49\xcd\x05\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0c\x44\xde\x0c\xcb\x90\x5f\xc1\x32\x38\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\x78\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x5e\xb4\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x78\x69\x8a\xbc\xb1\x93\xfa\xa7\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\xe9\x8c\x32\x45\xde\x7c\x1b\x3e\xb5\x29\xf2\xc6\x3d\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x7b\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\xde\xf3\xbc\x28\x15\x41\xb7\x55\xbb\xfa\xaa\x67\xfa\x72\x67\xfc\x82\x8d\xc3\xf1\x52\x6e\x0e\xd3\xb6\xab\x14\x10\x2a\x72\x66\x6a\x21\xce\x13\x33\xb5\x79\xb5\x9e\x79\x35\x93\xb3\x43\x5d\x1d\xa6\x77\xbe\x9f\x1e\xea\xf8\x98\x9b\x28\xc6\x1f\xc5\xb8\xda\x18\xff\x1e\xa6\xd0\x30\xb4\x98\x66\x51\x4f\x40\xbe\x38\xe7\xa5\x29\x01\x69\x57\x1f\x18\xbb\xc2\x8b\x31\x13\x7d\x3d\xb4\xa3\xf8\x9e\xc1\x44\x7e\x65\xec\xdf\xda\x49\xec\xe3\xdf\xb2\x8f\xc3\xf0\xef\x8e\x0c\x44\x20\x54\x23\x50\x89\x78\x4e\x95\x96\x53\xb4\xb0\xd7\x88\x16\x0a\x79\x35\xa8\x6a\xd9\x50\x2d\xb5\x80\xcf\x11\x2b\x53\x05\xb5\x72\x73\x34\x7b\xae\xb9\x6e\x6a\x21\x74\x41\xe5\xdb\x4a\x5a\x82\x5d\x9f\xbb\xe6\xbb\xc0\x38\xbf\x69\x0a\x1a\x78\x41\xcb\xfb\x82\xaa\xdd\x7b\xce\x14\x79\xf2\x48\x30\x6d\x62\xb8\xb3\x9f\xd8\xae\x82\xb2\x12\xa5\xac\x13\x53\x94\x0c\xa2\x1a\x22\xae\x92\x18\x64\x99\x6e\x63\x67\x6e\xa2\x80\x15\xf2\xa4\xce\x3c\x20\xe3\xb6\x42\x61\xf9\x50\xef\x03\x99\xeb\xcb\xa9\x46\x77\x67\xac\x43\x19\x27\xb0\x98\x1b\x41\xb7\x34\x23\x6b\x72\x29\x13\x9c\xc1\x9e\xc7\x8a\x00\xe7\x9e\xef\x5d\x57\x45\x59\x75\xd1\xf4\x75\xcc\xb6\xf3\x04\xa1\x2e\xc1\x0c\xad\x31\x65\x28\xd7\x38\x2a\x1c\x58\xe8\xbe\xc7\xa0\xc3\x5b\x81\x85\x56\x08\xec\x07\x21\x89\x0b\x02\xc3\x96\x9c\x67\xd6\x23\x9b\xed\xea\x39\x59\x57\x3f\xe3\x3f\x31\xf2\xf8\x93\x1e\x47\xa2\x55\x86\xd7\xa1\x5e\xd4\xc8\x56\x84\x25\xaa\x53\xb2\xa5\x9a\x0e\xf2\xa1\x23\xc4\x18\x24\x88\x7f\x08\x9b\x0e\x8c\xbd\xed\xbe\xdf\xa1\xb7\xaf\x81\x6a\xb1\x44\x15\xf4\x90\x51\xe5\x37\xaf\xc1\xfa\xf2\xfe\xfc\xe6\xa7\xbb\xbf\xdd\xfd\x74\x7e\xf1\xf1\xea\x7a\xe8\x88\x86\xfb\x94\x26\xb8\xc0\x4b\x9a\xd1\x30\xef\xee\x58\xc1\x9b\x9f\x01\xa3\x4a\xd3\xb3\x54\xf0\xc2\xac\x53\x94\x0c\xe2\x35\xeb\x18\xac\x08\x43\x86\xf3\x41\x55\xe1\x9d\xa6\x35\x77\x7b\xa8\xb5\xc0\x4c\x39\x61\x67\xa8\x3e\xb7\x41\xb3\x28\x99\x16\x54\x9f\xeb\x71\xc3\xe9\x98\xa0\x84\xf3\x34\x25\x69\x6b\xea\x47\xf6\x01\xbd\x77\xa0\x77\x75\xc4\x28\xba\xf9\x74\x77\xf5\x7f\xe2\x47\x45\x96\x46\xa2\xdc\x03\x47\xf2\x60\x23\xa4\xc9\x64\x04\x26\x6f\x6d\x74\xcf\x84\x4b\xcf\x3b\x03\x95\xfc\x1d\x57\x89\x3c\xdc\xb7\x25\x6b\x47\xe6\xd7\x10\x50\xce\x53\xb2\x40\x37\x86\x29\x42\xb7\xdd\x20\xef\xaf\xbe\xab\xd9\x00\x98\x7f\xf5\xc7\x4c\x51\x9c\x65\x3b\xa4\x25\xb1\x2d\xce\x88\x71\x21\x0b\xee\xd5\x56\x50\x5d\x52\xcb\xc4\xa5\x36\xb9\xc6\x0a\x67\x32\x70\xc0\x63\xf8\xa0\x66\xf5\x1f\xb5\x30\x19\x89\xa7\xea\x7d\x94\x12\xc6\x95\x95\x4b\xf5\x48\x10\x50\x2b\x78\x82\x8c\x6c\x6a\xdc\x10\x81\x55\xd5\xe1\x44\x15\xb3\x04\x16\xeb\xd8\x20\x95\x6e\xad\x37\xd5\x98\xa0\x89\x07\x60\x96\x92\xc8\xbd\xdb\xc6\xb2\xc1\x5a\x5a\xd5\xe3\x0a\x82\x53\x88\x0d\x2b\xb0\xda\x80\x5d\x33\x00\x34\xc7\xf2\x81\xa4\xe6\xd5\x85\xb9\x87\xad\x24\x2d\x6d\x07\x00\x3b\xbd\x7b\x8d\x85\x15\xc1\xaa\x14\x04\xee\xdf\xb0\x90\xbb\x24\x88\x30\xbc\xcc\x42\x91\x67\x51\x41\x91\x38\xfd\xc4\xb2\xdd\x2d\xe7\xea\x43\x15\x52\x15\xb9\x9d\x3f\x56\x3d\xc1\x9b\x1a\x34\x5c\xb6\x60\xa4\x4c\xe7\x80\x26\x08\xe4\x8a\xab\x64\x7e\x51\x6f\xdf\x11\xc8\x53\x94\xec\x5c\xfe\x59\xf0\x32\xb6\x29\x87\xa6\xa0\x3f\x5f\x5d\xc0\xa9\x2a\xcd\xb9\x21\x4c\x89\x1d\x04\x45\x76\x32\x78\x86\x65\xb8\x05\xfa\x41\xd3\xd4\x1e\x15\x69\x89\xab\x64\x92\xa8\x05\xfa\x88\x77\x08\x67\x92\x5b\x61\x2a\x24\x19\x31\x74\x03\x3e\x93\xa6\xfc\xbf\x40\x10\xe3\x6c\xe2\x2e\x96\x5c\x6d\xd0\xde\x0b\x03\xc4\xd9\x85\x68\xc2\xf7\x8c\x81\xa9\x4e\x50\xa2\x6c\x1f\x70\x88\x38\xf1\x03\x91\xa8\x10\x24\x21\x29\x61\x49\x60\x0f\x1b\xb6\xa2\xdf\xff\xee\x59\xe6\x7b\xd8\xe9\x6b\xce\x34\x19\x47\xee\xf5\x15\x4b\x69\x82\x0d\x0f\xb2\xdd\xac\x6b\x12\x06\xab\xa6\x95\x31\x31\xc4\xc0\x0d\x70\xd9\x52\x12\x61\xba\x3b\x8b\x92\x18\x24\xfe\xb5\x5c\x92\x8c\x28\x13\x71\x0b\x71\xfd\x58\x99\x56\x02\xa6\xa1\x3c\x56\x8e\x30\xc2\x27\x9d\x30\x59\x42\xbb\x10\xad\x1a\x2b\x94\x72\x52\xc7\x2b\x62\x89\x7e\xb8\xba\x40\x6f\xd0\x2b\x3d\xbf\xd7\xe0\x63\x59\x61\x1a\x12\xdb\x15\x37\x5e\x98\x7d\xb9\x7a\xe5\x80\xc3\x32\x80\x3e\x11\x17\xe6\x18\xce\x10\x0b\xf9\x7c\xa0\x5b\x8c\x5d\xa1\x56\x77\x5c\x8c\xb1\xf5\xcc\x81\xd1\xa6\x4d\xe8\x01\x72\x0e\x8d\x13\x26\x74\x1f\x39\x07\x20\x0e\x13\xfa\x08\x72\x8e\x66\x49\x3f\x48\x22\x46\x70\xa4\x1f\x8e\xca\x91\x9a\x22\x80\xa6\xda\xf6\xea\x0d\x69\xe6\x44\xe1\x14\x2b\x8c\x68\x68\x3b\x4a\xd6\xe8\x08\xf2\x4b\xd8\xe0\xe3\xf1\x2b\x49\xbe\xa7\xac\x7c\x32\x2e\xb2\x31\x2a\xe4\xdd\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\x2d\xcf\xc0\xbf\x85\xab\xc5\x68\x00\xdf\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5c\xdf\x5a\x0b\xe8\x3b\xdf\xc6\x5a\xca\xe0\x4d\xd4\x59\x8b\xbe\xb8\xda\x6b\x81\x1b\xe4\x5b\x58\x4b\x84\x5a\xff\x48\x59\xca\x1f\xe5\x78\xa6\xfb\xa3\xf9\xd0\x71\x86\x44\xb3\x1e\x45\xd9\x5a\x36\x19\x2f\x0e\x1a\x4b\x9b\x7a\x6a\x1f\xe7\x75\xc6\xf9\x2a\x9f\xba\xcb\xa3\x02\xd0\x9d\xc0\x55\x4a\xeb\x9f\x39\xe0\x22\x0d\x51\x7c\x14\x6f\x3c\x3a\x07\x5c\xe7\x12\xbf\x17\x1a\x96\xa2\x38\xbb\x2b\x46\xb5\x3d\xfb\xf3\xc7\xbb\xf3\xf6\xc7\x9a\x70\x1f\x21\xe5\x5e\xaf\x47\xff\x1d\xe1\x34\xa7\x52\x86\x4d\xd2\x80\x5f\xb2\x84\x76\x74\xaf\x9c\x8f\x62\x4d\xd5\xa6\x5c\x2e\x12\x9e\x37\xdc\x15\x73\x49\xd7\xf2\xcc\x52\xd9\x5c\xcf\xfe\xf5\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\x09\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\x96\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\xbd\x6d\x12\xd2\xb1\xe9\xf4\xd9\x8e\x79\x13\xd8\x1a\x9d\xd5\x7d\xd7\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\x47\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\x8f\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\x6f\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\xd3\x87\x45\x23\xe9\xc1\x6b\xca\xf4\xa6\x42\x0c\xc5\x1c\xc3\x6c\x3e\xb1\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\x12\x29\xf1\x9a\xdc\x78\x0d\x3c\x3e\xb1\x09\x6c\x3c\x35\xaa\x81\x10\x32\x90\xa1\xea\x5f\x6a\x97\xd8\xa9\x8f\x21\x34\xa6\x82\x72\x33\x97\x2a\x06\xf0\x51\x50\xa5\x75\x2a\x2a\x4d\x2e\x1d\xd8\x35\xf7\x03\x2e\xfd\xa0\x9b\x4e\xb8\x8f\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\xed\x22\x94\x28\x59\x82\x07\x73\x96\x19\x4f\x09\xa2\x2b\xb4\x06\x6f\x97\x30\x0e\xf5\xdf\xbd\xf9\x5f\xbf\x47\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\xf6\x37\x0f\xcb\xf6\x95\x7e\x96\x92\xed\x59\x63\x5f\xe6\x19\xf7\xc6\xa5\x74\x9b\xe1\xf4\x5f\xbe\x03\xe2\x65\x0f\x41\x42\xf1\x85\x08\x92\x74\xc9\x4f\x68\xc3\x1f\x4d\x0e\x66\x0f\x45\xd5\x2e\xf1\x82\x17\x65\xe6\xef\xda\x83\xd0\x07\x4d\xc5\x80\xa7\xd2\xde\x0e\xad\x70\xc6\xde\x93\x03\x8a\xbe\x05\xec\xe7\x75\xcd\x1b\xde\xb8\x38\xdd\xf4\xb8\x8d\x87\xb2\x4a\x6e\x95\xfb\x54\x0a\xb2\x40\x1f\x70\x96\x2d\x71\xf2\x70\xcf\xbf\xe7\x6b\xf9\x89\x5d\x0a\xe1\x15\x03\x5a\xf3\xce\xb0\xe6\xcb\x9b\x92\x3d\xb4\x5b\x2d\x64\x7c\xad\xe5\xb8\xa2\x54\x2e\x62\xa5\xb1\x2a\x0f\x60\x37\x53\x38\xe3\xd5\x25\x80\x6d\x2f\x9b\x1a\x36\x79\x02\xba\x82\x80\x27\xcc\x10\xd1\x73\xf5\x61\x5a\x53\x74\x73\x2e\xb2\x49\x96\xbf\x79\xf3\xbb\x3f\x18\xd2\xd7\xda\xc5\x1f\xde\x80\xf3\x5f\xce\x0c\x73\xd1\x9c\xd1\xcf\xa1\x65\x8e\xb3\x4c\x2b\x12\x4d\xa2\xd6\xdb\xba\x88\xed\xdd\x34\x44\xad\x2a\x86\x30\xa3\x85\xbb\xfb\xfb\xbf\x05\x24\x3b\xaa\x24\xc9\x56\x33\x13\x7b\x57\xe5\xdb\x9e\xc2\x45\x71\x6a\x79\x97\xbe\xd5\xbb\x57\xc3\x61\x62\xd6\x96\x67\x65\x4e\x2e\x08\x34\x5d\x89\x58\x66\xeb\x7d\x17\xb1\x91\xd9\xfe\x68\xcb\x8c\x27\x0f\x28\xb5\x7f\x84\xc9\x7a\x96\x09\x5e\x2b\x1b\xd2\xd3\xd0\x05\xab\x28\x20\x08\xc0\x73\x91\x3c\xcf\xed\xb8\xd5\x9c\x73\xcb\xdf\x96\xe3\xa2\x80\x46\x63\x2b\x48\x10\x7a\x34\x0b\x08\xe8\x58\x00\xc1\x76\xd2\xc1\xc7\xe9\xbe\x65\x80\xfa\x2f\xe4\x9e\xf5\xd4\x9f\xb8\x0d\x28\xe0\xbf\x4d\xbc\xc8\x88\xd4\x3a\x54\x87\xed\x55\x6b\x33\x37\x86\xc6\x0c\x9c\xcc\x67\xf7\xe1\x19\xd5\xf7\x08\xcc\x0a\x8d\x4e\x4f\xcd\x78\x65\x8c\x0a\x22\x24\x34\x87\x53\x9f\x61\x47\xdf\x67\x98\x86\x32\xba\x10\xaa\x1b\x1e\x3d\x6f\x19\xc3\x1d\x78\xea\x3d\xf1\xbe\x12\xf0\xf6\x3d\xb3\x37\x8f\x21\x70\x48\xc6\x8f\x39\xc3\x37\x3c\xb5\x9f\xc0\x21\x35\x85\x0b\x7a\x44\x2d\x19\x91\xfb\x7e\xf4\xf6\x78\x9f\xeb\xb5\xb4\xcf\xaa\xfe\xa5\x3a\xac\xe6\x2d\x7b\x14\xbd\x7b\x7b\xa4\x23\x0a\x43\x8f\x3a\xa1\x70\x36\x1b\x1d\xb7\xea\xfb\xa0\x25\x42\x9b\x4d\x08\x52\x70\x2d\xca\x58\x99\x78\x81\x8c\x4d\x5b\x63\xdd\x82\x45\xa7\xef\x4e\x9f\x7d\x4e\xcd\x22\x05\x2f\xf0\x7a\xa0\x74\xd4\xde\x5a\xf7\x3f\x44\x29\x31\x02\x06\x91\x20\xa4\xc1\xdf\xc1\x6d\x14\x5c\x68\x61\x21\xb8\xce\x4e\xce\xc7\x67\xcd\xb4\x0e\x7d\x56\x04\x31\xc1\xc1\x8f\x41\x2f\x36\x42\x58\xf0\x92\xa5\x56\x3f\xaf\x0c\x21\x1f\xf7\x26\x7c\xcd\x19\x08\x39\x26\x07\x29\x10\xb6\x6a\x9e\x56\x8c\xb8\xe6\x30\x6f\x17\x6f\xdf\x7c\x59\x36\x79\xbf\xd7\x10\x4f\x63\xe4\xba\x62\x93\xe6\x6c\x3c\x7b\x46\xae\xc0\x46\xf4\xac\x3e\x5a\xa5\xad\xae\x9f\x41\x5d\x55\x01\xf8\x49\x2b\x63\x24\xaa\x14\x1e\x42\xaf\x40\xa4\xd1\xb2\x60\x23\x2b\xe1\xf5\xa8\x32\x30\x71\x69\xed\x5a\xbf\x5b\x3e\xeb\x6c\x9b\x43\x6c\x88\xb6\x4f\x17\x0e\x53\x93\xfd\xba\xe7\x98\xb7\xba\xc8\x9d\xa0\x57\xe6\xcd\x53\x09\xb1\xa8\xaf\x9f\xbd\xbd\x76\xd9\x97\x4f\x45\x30\x8f\xb2\xb5\xf4\xcb\xa7\x02\x83\x0e\x5d\x0c\xe1\x60\x40\xe8\x68\xdf\x32\x7e\x1c\xfc\x89\x6c\xf0\x96\x40\x9c\x2c\xcd\xb0\xf0\x66\x12\x58\xb8\x1c\xdd\x99\x55\x41\xb3\x5b\xc2\xb6\x54\x70\x06\x7e\xaa\x2d\x16\x14\x72\x8a\xa0\x15\x21\x61\x5a\x3e\xfd\xf5\xab\xcf\xe7\xb7\xe0\x1f\x08\x67\xbb\x99\xdc\x03\xbb\xf2\x52\x42\x0c\xc2\xde\x0a\x1a\x43\xd5\x1b\x37\x34\xd7\x9e\x4d\x75\xf3\xd7\xbb\x02\xbc\xce\xad\x47\xcf\x21\x2f\x55\x89\xfd\xd9\x14\xe6\x21\x4f\x49\x56\x4a\xba\x7d\xee\xf9\x1f\x96\x78\xaa\x5b\xf1\x2b\x08\x3c\x36\xa4\xfb\x82\x7a\x68\xb7\xbf\xe1\xee\xa9\xec\xc6\x82\x83\x59\x8f\x71\x35\xdc\xf5\xb4\xd7\xb8\x7c\x2a\xab\xda\x38\xcd\x54\x56\xab\xb8\xda\x94\x0b\xaf\x16\x54\xd5\x85\x4c\xbb\x66\x77\xc8\xcf\x3a\x8e\x0a\xeb\xdf\x4b\xcf\x1e\x05\x76\xc7\xb7\x2f\xae\xbf\xed\x0f\xa2\x93\xfa\xdf\x09\xc0\xab\x7a\xe1\xfe\x70\xfb\x3d\xac\xfa\x3c\x23\x42\x99\xf2\xa4\x02\xa2\x49\x31\x1c\xd0\xaa\x6b\xf3\x16\xd3\x4c\x9f\xde\xce\x44\x4b\x96\x36\xd5\x46\x46\x12\x22\x25\x16\x3b\x7d\xbc\xd6\x84\x11\xa1\x55\xee\x84\x0b\xbd\xd9\x7a\x34\xd9\xf3\x6e\x07\x28\x5d\xed\x4d\xc8\x39\x51\x44\xd5\x76\x12\xd2\x01\xe0\xb2\xbd\xb8\xbe\x33\x2d\x50\x7b\xf1\xd4\xb3\x21\xb0\xaf\x41\x14\x5d\x41\x66\x1e\x6d\xe4\x43\x81\x13\xa2\x4e\x56\x43\x7c\x4b\x04\x5a\x62\x49\xe0\xd5\x19\x52\x78\xdd\x6b\x77\x97\x1b\x2d\x01\xe7\x4b\x6b\xec\x91\x0b\x74\x57\xb7\xf2\x06\xbe\xad\x35\x2a\x0e\xf6\x51\xa9\x8c\x15\xba\x81\x41\x53\xbf\xa7\x4b\x1d\xa6\xf8\x57\x4e\xd4\x86\x94\x12\x7d\x82\x94\x1f\x2e\xd0\x03\xe3\x8f\x12\x3d\x6a\x8d\xd2\xc1\xe5\x5d\x54\xf6\x77\x05\xaf\x4f\xc2\x38\x44\xde\x94\x59\x76\x47\x12\x41\xba\x8a\x4f\xbb\x40\x23\xb3\x89\xea\x38\xab\xac\x15\x8d\xab\x00\x02\x86\x01\x8a\x3b\x88\x52\x8b\x53\x7a\x63\x65\x81\x93\x1e\x1c\xd4\xa1\x69\x45\x99\x65\x1a\x9f\x45\x8d\x12\xf0\x6b\xb4\xd6\xad\xe7\x6a\x6d\xfe\x82\xac\xa9\x5e\x4e\x8f\xe3\x55\x12\x13\x6e\xde\xef\x1d\x2d\x25\x11\xf3\x75\x49\x53\x72\x66\xe0\x7d\x57\x37\x66\x9f\xc3\x2f\x7a\x2a\x76\x1d\x73\xce\xe6\x78\xde\x55\x7c\x3d\x8a\x58\xbb\x20\x07\x4f\x70\xf6\x09\x4e\xff\xad\xc3\x91\xe3\x4c\xfa\xae\xe3\xe5\x7a\xd3\x6a\x50\xaf\x38\xca\x7a\x6b\x80\xed\x78\x89\xac\xe1\xcb\x44\x62\x5b\x68\xa9\x65\x2e\xce\x66\xd1\xc5\x78\x97\xcd\x85\x35\x35\xbf\xfc\xbc\xe7\x19\x6f\x04\x2e\xd8\xe9\xa8\xd1\x41\x6c\xfa\xfc\x6d\x29\x79\x3c\xb3\xd7\xc9\x5c\x8b\x42\x73\xb3\x24\x79\x06\x6b\x38\xfb\x0e\xfe\xc7\x67\x0b\x85\x30\x9a\xf3\x34\xb5\x8a\x4c\x29\xc9\xaa\xcc\x8c\x6a\x21\x17\x08\x17\xf4\xb3\x39\x41\x33\xf4\x40\x59\x3a\x43\x25\x4d\xff\xfd\x00\x53\xfb\x01\x8c\x9c\x32\xaa\xaa\x1b\x33\x7c\xa8\x4e\xaf\x5a\xef\xba\xe0\x79\x9c\xa6\xfa\x3c\xb4\x01\x35\xe2\x66\x7a\x88\x6f\x05\x01\x85\x26\x6b\x90\x4b\xe2\xfa\x46\xbb\x14\x49\xb2\x58\x2f\xd0\x8a\x68\x55\xc7\x1d\x53\x7d\xf2\x28\xd3\xeb\xea\xb3\x62\x57\xc6\x8c\x16\xf7\x69\x95\xc3\x36\x87\xb1\xba\x8a\x6c\x2d\xec\x05\x3a\x67\x3b\x63\xc7\xee\xee\x9d\x4d\x78\x84\x04\x6e\xc8\x49\xb3\x2c\x0e\xb3\xf6\x62\xcd\xc5\x95\x11\x6c\xca\x6b\x38\x1f\x22\xe2\xdd\x0a\x52\x36\xf9\xf4\xb9\x61\x94\x7a\xf8\xba\xae\xb4\xec\xd6\xac\xfe\x41\xf6\x6c\x09\xd4\x3d\x67\x3b\xe0\x64\x09\x96\x4e\xab\x06\x3f\xad\xc1\xb3\x41\x3a\x7c\xda\x45\x07\x61\x8a\x0a\x92\xed\x10\x2f\x55\x7d\x8a\x13\x6e\x6a\x62\x3e\x3a\xcb\x62\x8e\x69\xdb\x21\x65\xa3\xc9\x7a\x6f\xac\xe5\x0e\xa5\x1c\x72\x8c\xf8\x0c\xb8\x87\x71\x0f\x3b\x3b\x25\xdc\x1f\x1b\xbc\xa5\xbc\x14\x26\x29\x5b\x10\xfc\x80\xb0\x82\x75\xf4\x56\xa4\xd3\x47\x93\x97\x60\x2f\xa1\x09\xe9\xf8\xab\x62\xf8\xe1\x79\xe5\xef\x2f\x8a\x8c\x26\x75\x65\x6c\xb3\xdb\x30\x37\x3d\x57\x97\x47\xe3\x0a\x93\xf7\x5a\xa6\xa0\xc9\xfa\x58\xee\x86\xc5\x3a\xaa\x5f\xc4\xb9\x58\x97\x39\x38\xaf\x2c\xfd\xd7\x85\x06\x6c\x95\x51\x9e\x3c\xb8\xfb\xc8\xef\x4a\x7d\xff\xf1\xc2\x19\x44\x8c\xcf\xa8\x0e\x25\xb1\xd9\xca\xe9\x02\x7d\x3e\x48\xa5\x1a\x54\xa6\xf6\xb5\xa9\x2b\x2d\x65\x39\xf5\xcd\x27\x47\x57\x42\xb2\x20\x92\x67\x5b\x57\x9b\xa6\x9a\x99\xbb\xd5\x29\x2b\x4a\x65\x99\xa5\x13\x2f\x7d\x1e\x0a\x96\x6c\x30\x5b\x1b\x93\x10\x69\xae\x0c\xc9\x1d\x53\xf8\xc9\x31\x29\x22\x13\x5c\x54\x4e\x30\x94\xf2\xd2\x3f\xd1\x5f\xff\x7a\x86\x28\x79\x87\x7e\xdd\x00\xb7\x40\x97\x16\x42\x03\x91\x8d\x90\x80\x65\x8d\x30\x9f\x6a\x22\xc8\x1a\x8b\x34\x83\xe8\xbb\x55\x55\xaa\xdd\x14\x4a\xb0\x9b\x44\x9e\xa8\x54\xe0\x5c\x63\x5c\x35\xd4\x0a\xdf\xea\xc7\xb5\x0a\x31\x65\xee\x0d\x3f\x9e\xa7\x58\xe1\x79\xe3\xa8\x9c\x99\x26\x06\x73\x9b\x15\x3b\xc7\x96\x48\x1b\x85\xf0\xbf\xb3\x25\xc4\xe7\xb8\x7a\x8b\x6a\xf9\x05\xb2\x48\xfb\xef\xbd\xa0\x45\x79\x50\xc1\x0d\xab\x97\xc1\x14\xe6\xf6\x89\xbb\xac\x6b\x1a\x02\xb4\x05\xba\xe6\xaa\x2e\x55\x50\xf9\x8a\x6c\x3e\xec\xbd\x37\x22\x60\xef\x64\xa2\xcb\xeb\xfb\xdb\xbf\xdd\x7c\xba\xba\xbe\x1f\x3c\x8a\x1e\x88\x03\x07\x34\xe6\x28\x7a\x20\xfb\x0f\xe8\xf0\x51\xf4\xf9\x3d\xfd\x07\x74\xf8\x28\xfa\xd9\x82\xf7\x80\x46\x1f\x45\x0f\x6c\xcf\x01\x8d\x3f\x8a\x1e\xb8\x9d\x03\xfa\x0b\x3f\x8a\x84\x6d\x23\x8e\xe1\xf7\x56\xa5\xeb\x33\xf9\xed\xa7\x83\x0e\xba\x84\x8e\xee\xd2\xba\x64\xdb\xcf\x58\xd4\xc5\xe6\x21\x96\xa8\xd7\x3a\x69\x5f\xf0\x9a\xee\x80\x95\xbc\x3f\x86\x4f\x6b\x94\xbf\xa1\xa9\x34\xf5\xcd\xbb\x4e\xb3\x08\xb5\x07\x41\xe8\xfd\x4f\x57\x17\x97\xd7\xf7\x57\x1f\xae\x2e\x6f\x9f\x6d\xc0\x1e\x4c\x00\x6d\x33\xea\x31\xdc\x30\xb8\x88\x9a\x53\x16\x82\x68\x49\x54\x22\xd7\xa5\xa7\x9f\xfc\xe8\x70\x40\x7c\xdb\xc1\xa5\x65\x59\xa9\x35\xcc\xa4\x1f\xdd\x26\xde\x33\x8c\xea\x78\x86\xdc\x62\xbd\x61\x5f\xe4\x48\xb6\x6c\x19\x70\xd8\x5e\xfd\x12\xcc\xd9\x3c\x87\xb3\xe8\x01\x0b\x7b\x4b\x92\x6a\xbb\x69\x82\x09\x21\xf1\x64\xfd\x41\xf0\x40\x29\xfb\xfd\x6c\x49\x50\x5d\xab\x5c\xab\x3e\x8a\x39\x95\xb6\x83\x54\xf8\x78\xd6\x8c\xcf\x8a\x1b\x55\x70\xbf\xfe\x1d\x82\xc0\x42\x10\x62\x13\xcb\x8d\x1e\xfe\x11\x17\x7f\x25\xbb\x5b\x32\x90\xd7\xb2\xbf\x58\x92\x91\x44\x73\x50\xf4\x40\x76\xc6\x04\xfb\xde\x81\x1b\x4a\x07\x1d\x93\xf8\xfe\x40\x82\x8e\xcf\xde\xb9\xe9\x53\xa0\x67\x05\xf7\x8d\x9e\xe6\xd0\x84\xd0\xd8\xa4\xf7\x83\xd2\xf1\xbf\x11\x9b\x57\xfb\x19\x6b\x01\x8b\x02\xea\xb7\x92\xb5\x9f\x51\x38\x77\x76\xe3\xd1\x78\xb7\xb6\xf6\x16\x87\xa9\x68\x55\xf3\x0f\x3a\x98\x6c\x66\x1e\x4d\x53\x2e\xb5\xc9\x5e\x35\xd1\x8b\x1c\xf2\x7e\x9b\x27\xbe\x64\xc1\x03\x09\xfb\x1f\x47\xd4\x22\x80\xbd\x1e\x7b\xfe\x4f\x6b\x06\x60\x02\x31\xaa\x24\xb4\xf4\x9d\xb3\x2c\xc9\xaa\xac\xe1\x42\x13\xe4\x30\xed\xb4\x5e\x07\xf3\xf3\xac\xfe\x0d\x6a\x04\xcb\xc6\x0f\xc0\x25\x8d\x43\x65\x18\xb4\x2c\x48\xb2\x60\x3c\x25\xfa\x10\xce\xcc\x3f\xed\xdd\x7e\x9e\x24\xbc\x64\xca\xfe\x01\x42\x84\x17\x1b\x2e\xd5\xd5\x4d\x04\x58\xf3\x7a\xc1\xd3\xab\x9b\x59\xeb\x5f\x72\x20\x27\x71\x1c\x1b\xac\xcf\xe1\x68\xf2\xff\x5c\xfb\x80\x8c\x61\x70\x43\x72\x0c\xff\xf9\x41\x6f\x5c\xc0\x73\xdc\x7e\xa8\xac\xc3\xf8\x19\xc4\x2e\xeb\x7b\xbb\x5d\xf8\xe6\x64\xfb\xf6\xe4\xe8\xcc\x76\xe5\xa6\x39\x7a\xe9\xe0\xb2\x77\x85\xda\x80\x4a\xab\x2b\x21\x46\x1a\x74\x4f\xed\xff\x3b\xbf\xb9\x72\x3e\xb5\x23\x2f\x33\xfe\xe4\xaf\x22\x77\x2d\xfa\xfc\xbb\x06\x94\x1f\x9e\xc9\x07\x1c\x9c\x4e\xe4\xeb\x3b\xa8\x9a\x37\x88\xaf\xba\x53\xa8\xe9\x3f\x6b\x73\x86\x6c\x9f\xd0\x57\xe6\xc7\x45\x52\x94\x33\xfb\xc2\x22\x27\x39\x17\xbb\xe1\x53\x6a\x5f\x27\xc5\x86\xe4\x44\xe0\x6c\x2e\x15\x17\xe0\xb1\x75\xe0\x0d\xd8\xea\x5f\x06\xf0\xf0\xa9\x6c\x4c\xb0\x0b\xdd\xe8\x32\x49\x29\xf4\x3d\x9f\xed\xea\xec\xed\xa3\x72\x86\x0a\xcb\xc3\xd5\x71\xcd\xb3\xdf\xd9\xd8\x69\x3c\x20\xd3\xd4\x7d\x8d\xb5\x18\x6b\x83\x53\xe3\x2e\xfd\xca\xaf\x0b\x0d\x1b\xd8\x56\x0b\xbd\x81\x9c\xd0\xfa\x19\xc5\x0c\x52\xba\xa5\x92\x0f\x94\x9c\xef\x59\xe8\x5d\xab\x96\x98\xcd\x7d\x30\x9e\xd3\xb8\x22\xcc\xe6\x21\x4f\x05\xe4\xae\x55\xb4\xba\xc7\xff\xde\x9e\x1c\x7b\xc1\x6e\xa4\xf1\x5b\x7b\xeb\x58\x4a\x7d\x32\x2b\xf6\x77\xe4\x7d\x89\xe7\x5e\x6e\x2a\xc7\x62\x5e\xc6\x3f\x76\x1c\x05\xc6\xfa\xda\xea\x60\xf5\x81\x98\x41\x64\x35\x81\xfe\xd0\x84\xf6\xf3\xa5\x74\x1e\x77\xcb\x9b\xa5\xd4\xd7\xdd\x4a\xf0\xdc\x86\x2c\x47\x11\xfa\x92\x80\x35\x39\xa3\xa9\x83\xf5\x40\x06\x8a\x38\x9a\x67\xd2\xa3\x7e\x49\x7a\x94\x89\xf9\xb1\x4a\x54\x84\x52\x62\x9e\x7f\x39\x25\x2a\xb2\xaf\x7b\x38\x90\xf3\xe5\xc2\x34\x09\xdb\xfa\x2d\x59\xbd\x06\x7c\x27\x89\x35\x32\x2c\xfb\x4d\xa0\x61\x37\x52\x2b\xa5\x0c\x18\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\x87\xaa\xba\x86\x41\x01\x58\x67\x0d\x15\xc4\x96\xc8\x31\xa9\xc2\x64\xeb\xb7\xe3\xf7\x36\x87\x36\x29\xf7\x94\xad\x6d\xba\x82\xb9\x1f\xac\xb1\x91\xb2\xaa\x22\x80\x07\x66\x25\x16\xd4\xe5\xf1\xb1\x94\x3c\x81\x2a\x5d\x75\x45\x7a\x48\x12\xb5\x0b\x87\x99\x2b\xfc\xe0\x03\xd9\xac\x8e\xff\x59\x43\xac\x71\xb8\xdc\x41\x86\x3a\xdb\x56\x76\xdb\xd2\xf8\x98\xcc\x65\x10\x28\xa5\x0e\xe5\xc7\x9b\x90\x5f\xc2\xdb\xa2\x89\xce\x5a\x45\x1b\x4e\x17\xb8\x9f\x2a\x4d\x01\xdb\x86\xd3\xde\xd3\x55\x99\x6a\x7c\xb4\x16\x73\xb5\x56\xa6\xce\x01\x31\xa1\x73\xa7\xd6\x86\xa2\xf6\x5d\x7a\x04\xf3\x6b\xcc\xe5\xf7\x6d\x5f\x7c\x47\x0c\x9f\xab\x9f\xe8\xcb\x2c\xf6\x22\x1b\x61\x0c\x1c\x77\x31\xc5\x5e\x4a\x51\x97\x48\x21\xc8\x8a\x3e\x45\xd3\x66\x33\x90\x96\x42\x63\x98\x15\x85\x5a\xb5\x1a\x50\x41\x98\x89\xd7\xc3\xc9\x66\xf0\x92\xb3\xac\xba\xb6\xde\xd7\x4e\xc4\xe3\x3a\x0a\x8d\x1c\x39\xf6\x00\xde\xf5\x49\xb2\xd3\xe9\xfb\xd7\x39\x7d\x76\x83\xbf\xda\xd1\x7b\xa6\x6c\xd5\x9b\x47\xd0\xb3\xf4\xd3\x8b\x46\x60\x91\x49\x55\x18\x4b\x3b\x8d\xc0\x52\x13\x78\xee\x59\x51\xbb\x85\x4e\xc5\x26\x4c\x8b\x39\xfe\x88\x36\x74\xad\x91\x6f\xda\xea\x98\x9b\x11\x99\xd8\xdc\xdc\x2f\x2c\x29\x5e\x65\xd8\x70\x01\x99\x0f\x82\xa6\x9d\x44\x19\x10\x91\x5c\x50\x2c\xfc\x51\xf0\x2c\xf3\x97\x2e\xcf\xe8\x03\x41\x17\xa4\xc8\xf8\x2e\xb7\x11\x19\x29\xba\x53\x58\x69\x52\xbe\x23\xca\x67\x45\x1f\x20\xd3\x2a\x27\x21\xba\x9e\xc9\xa9\xc9\xf6\x28\xca\x2c\x43\x05\x7c\xb4\x80\x9e\x1f\x90\x39\xf1\x88\x77\x72\x86\xae\xc9\x96\x88\x19\xba\x5a\x5d\x73\x75\x63\x84\x19\x1f\x4f\x6c\x3a\xa3\xcd\xe7\x88\xae\xd0\x3b\x2d\x46\x4b\x05\x69\x22\x54\x36\xdb\xec\x70\xd1\x02\xeb\x81\x5a\xa5\x6c\x3e\x23\x2c\xc9\x4f\x4c\xdf\x01\xa4\x2a\x87\xc1\x63\xba\x1b\x40\x7c\x55\x1d\x2e\x02\xe5\xe7\xb6\x1f\x86\xaa\x23\x94\x1d\x0d\x22\x93\xec\xee\x52\x11\x41\x58\xf5\xe6\x97\x0b\x22\x0b\xce\x24\x69\x67\x28\xd7\x75\x2e\x41\x05\x90\xd1\x12\xee\xf0\x05\x52\x70\xa9\xa0\xff\x4d\x6c\x19\xc0\x1b\xf7\x01\x14\xc4\xc2\x59\x46\x52\x44\xf3\x9c\xa4\x5a\x2b\xc8\x76\xb6\xc8\x19\x8e\xaa\x15\xa1\x21\x98\xd6\x1c\xb6\x12\x16\x41\x1b\xcc\xd2\x8c\x88\x66\x23\xa5\x96\x46\xe3\xea\xcc\x04\xb9\xaa\xb1\x65\xdb\x22\x5b\x08\x27\x09\x17\xa9\x2d\xf3\xac\x55\x7b\x17\x3b\x5f\x9d\x0d\xe0\xdf\x83\x5c\x03\xf5\xf5\x4e\x83\xea\x1e\xb2\x51\xff\x0b\x5a\x23\x56\xcd\xa2\x8e\x58\xbf\xb0\x41\xe4\x75\xb5\xc2\x8a\x32\xe6\x50\x5d\xf5\xac\x51\xc8\x10\x7e\x78\x6e\x4d\xd4\x70\x57\x21\x74\x68\x67\xa1\x81\x1b\xb1\xd5\x77\xe8\x39\xdd\x85\xe2\x17\x8a\x62\xbb\x0c\x75\xd6\x1c\xd7\x69\x28\xc2\x2e\xd4\xc8\x5b\x8a\xe9\x36\x14\x63\x69\x6a\xf7\x23\x8a\xef\x38\x14\x01\xbb\xd1\x93\x28\xb2\xeb\x50\x04\x50\x4f\x5f\x22\x6f\xe7\xa1\x08\x90\x43\xbd\x89\x3c\xdd\x87\x22\x20\x87\xfa\x13\x79\x3a\x10\xc5\xa0\x20\xd0\xa3\x68\x44\x17\x22\x14\xdb\x43\x04\x8d\xb5\xb9\xc6\xb5\x7b\x88\x36\x37\x0e\xb6\xd3\x41\x2f\xd4\x52\x07\x8d\xe2\x0d\xc3\xc5\xa1\xbb\xf3\x8c\x68\xaf\x13\x79\x88\x5f\xa4\xc5\x0e\x8a\x6d\xb3\x83\xc6\x91\x48\x74\xbb\x1d\x74\x50\xcb\x9d\x88\x55\x41\x9b\x90\x83\xda\xee\xa0\x31\xc7\x66\x74\xfb\x9d\x28\x87\x82\xa9\xc7\x36\xbe\x05\x0f\x1a\xe9\x99\x43\x23\x7c\x56\xe8\x58\xed\x78\xd0\x58\x6e\x83\xc6\xb4\xe5\x19\x9e\x66\x6c\x6b\x9e\x03\xe6\x19\xeb\xaa\x41\xb1\x6d\x7a\x50\x74\xab\x1e\x34\xc6\xcb\x8c\x46\xf0\xf0\x98\xb6\x3d\xe8\xc8\xad\x7b\xd0\x38\xd4\x0f\x17\xba\x47\x71\xc5\xee\xd1\xc8\x82\xf7\x68\x5c\xd1\x7b\x74\x48\x4b\x9f\x88\x7d\xe7\x1d\xef\x54\xb0\xf8\x7d\x0c\x25\xb5\xca\xe3\x1f\x58\x00\x1f\x3d\xaf\xbd\x0f\x8a\x6c\xf1\x83\x5e\xaa\xcd\x0f\x1a\xdd\xea\x07\x8d\xa1\xdb\x38\x66\x31\x50\xea\x1f\x8d\x70\xea\x0e\xb7\xff\x40\x87\xb6\x00\x19\xc0\x0a\x34\x08\x19\xdf\x06\x64\x10\x6a\xd5\x24\x64\x54\x2b\x10\xf4\xd2\x52\xdf\x11\xdb\x82\xa0\x91\xad\x41\xd0\x2f\x85\x73\x46\xb4\x0c\xf9\x05\x73\xce\x2f\xcb\x5b\x22\x5e\x2a\x04\xb9\x53\xbc\x88\xb6\x30\x9a\xd7\x3d\xf6\x45\xdb\x41\x2c\xda\xc0\x58\x1b\x0c\x51\x5a\xc2\x49\xc4\x0c\x62\x9f\x9d\xae\xc8\x9b\xa6\xbf\x60\x8c\x05\x6a\x54\x6e\x77\x5d\x9f\xce\x6c\xc7\xa7\x46\xff\xf7\x52\x90\x99\x5e\x33\xc9\x61\x45\xb3\x98\x38\x41\x5b\x20\x1c\x5e\x27\x2a\x31\x21\x26\xce\x16\x6a\x2d\x29\x0e\x19\xf1\xb5\x78\x13\x81\xe5\xc6\x94\xbf\x26\x4f\x54\xd9\x12\xf0\x82\x60\xc9\x99\xc9\xed\x6a\x14\x3a\xa7\x12\x15\x58\x9a\xea\x28\xa1\x9b\xa4\x9e\x98\x01\x67\x9b\xc3\x37\x41\xad\x05\x4e\x88\xed\x82\x86\x20\x21\x21\xe5\x8f\x21\xd7\x16\x74\xa1\x97\x6e\x6f\x4d\x31\x28\x43\x04\x9a\x9b\x13\xb0\x30\xb9\xfc\xf7\x05\xba\xad\x92\xed\x86\x2d\xb5\xbc\x54\x09\xaf\x99\x84\x9d\xf9\xbe\x61\x19\xc2\x56\x60\xeb\x87\xaa\xe1\x55\xe4\xd4\x2c\x55\x38\x80\x02\x6b\x61\x0e\x40\x6d\x10\xe0\x58\x0b\x73\x08\x05\xa2\xf1\x95\x77\x7f\xa0\x21\x05\x4e\x36\x6d\xbf\xcb\x64\xac\x9e\x8c\xd5\xa1\x67\x32\x56\x4f\xc6\xea\xc9\x58\xdd\xfb\x4c\xc6\xea\xc9\x58\x3d\x19\xab\x87\xbf\x9d\x8c\xd5\x93\xb1\x7a\x32\x56\xf7\x3c\xdf\xa2\xc9\x65\x32\x56\x87\x3f\x9f\x8c\xd5\x93\xb1\x3a\x00\x75\x32\x56\xf7\xbe\xff\x4b\xe0\x9c\x93\xb1\x3a\xf4\xf1\x37\x66\xac\x1e\x78\xc1\x59\x7d\x6f\xb4\x8c\x1b\x13\x89\x7d\x03\x36\x36\x9a\x58\xf3\x70\xbb\x89\xa2\x05\xb6\xa8\xab\xef\x79\x26\x5e\xe7\x03\xba\x98\x56\x6b\x04\xae\x8d\xce\xbd\x31\xc1\x60\xcf\xf3\xc0\x3c\xb8\x2e\xf4\x21\x8d\xb3\x87\x99\x58\xd8\x76\x77\x90\xdd\xae\x6d\x99\x0b\x10\xcf\x33\x6c\x76\x71\xdc\x39\xca\x56\x77\x80\x9d\x2e\xce\x56\x15\x6b\xa3\xdb\xb7\xc0\x0d\x80\x8d\xb6\xcf\x35\xad\x6f\x03\x30\xe3\x6c\x73\x3e\xcb\xdb\x90\x88\xe6\xb1\xcb\x0d\x5a\xdd\x06\xe0\xf6\xdb\xe4\x82\x16\xb7\xa1\x99\xf6\xda\xe3\x82\xd6\xb6\x61\xc4\x46\xda\xe2\xa2\x0c\x0a\xd1\xd7\x61\x8c\xee\x16\xc1\xb9\xad\x5b\xed\x7e\x23\x88\xdc\xf0\x2c\x70\x92\xda\xdd\xc3\x28\xa3\x79\x99\x6b\xc2\x94\x50\x5b\x7f\x5b\x79\xe8\x64\x45\xf1\x86\x87\x06\xad\x5b\x4b\xa0\x6d\x4d\x7a\x50\x4d\x06\xd3\x4c\xef\x06\x24\x3a\x6c\xf0\x16\x38\x4e\x99\x24\x84\xa4\x7b\x3d\xb6\x02\x20\x7f\xbb\xa8\x66\x57\x15\x44\x7c\xeb\xdf\x19\x53\xdd\x05\x24\x96\xdf\xfe\x66\x00\x93\x61\xa9\x66\xd0\x84\xf9\x12\xe6\xcb\x38\x36\x39\x2c\xc0\x8e\x36\x59\x46\x14\xc3\x79\x11\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xc7\x9b\x27\x61\x7f\x87\x94\x97\x43\x4c\x93\x51\x5c\x64\xb4\x49\x32\xc6\x06\x7d\x90\x39\x72\x8c\x29\xf2\xa0\x3a\x2f\x87\x9a\x20\x47\xe9\x1d\xd1\xa6\xc7\xe3\x98\x1d\x5f\xa4\xa6\x52\x04\x5e\xe2\xcc\x8c\xd1\x26\xc6\x38\xf3\xe2\xb0\x69\xf1\x98\x66\xc5\x48\xd4\x0e\x2b\xc5\x11\x0a\xf1\x18\x65\x78\x84\x22\x3c\xda\x7c\x68\x91\x34\xb0\xad\xb1\x0a\xf0\x9e\x7a\x3b\x00\xf5\x30\xe5\xf7\x19\x8a\x6f\x8c\xb9\xf0\x45\x4c\x85\xe3\xcc\x84\x91\x4d\x5d\x87\x0e\xf7\x80\xfa\x1e\x71\x54\xa1\x97\x13\xce\x2e\x48\x86\x77\x77\x24\xe1\x2c\x0d\xb6\x3f\x6f\x95\x3a\xa8\x68\x4e\x9a\x0f\xad\xe4\xd6\x8e\xb2\xd9\x60\x5b\x2d\x27\xe8\xf7\xb6\x01\x4a\x4e\x73\xb7\x97\x0b\xd4\x46\x34\x33\x3c\x24\x7b\xf9\x08\xfa\x35\x3a\xaa\x88\x68\x02\x83\xc6\xa1\xf9\x2f\xfc\x11\xf1\x95\x22\x0c\xbd\xa2\xcc\x61\xfa\x75\x43\x38\xac\x65\xed\x10\xc9\x59\xf2\xd4\xdf\xbd\x7d\xe3\xc0\x7c\x2d\x51\x19\x84\x7a\x29\x8f\xa1\x75\x58\x50\xcf\x51\x3b\x2c\x88\x55\x99\xb5\x55\x0f\xa3\x8e\xc4\xea\x1d\x6f\xeb\x92\x28\x6f\x61\x2e\x15\x2d\x6b\x6d\xd2\x06\x33\x76\x11\x1e\x84\xf8\x05\xb6\x22\xc2\x25\x70\x90\x3b\xc0\x18\xfc\x07\xae\xd8\x51\xae\x80\xa6\xb1\x3f\x00\x77\x8c\x1b\xe0\x45\xb4\xa7\x23\x9a\xfe\xc7\x98\xfd\xff\xe5\x24\x9b\x08\xf3\xfe\x2f\x48\xb2\xf9\x12\xb2\x80\xa2\x39\xe1\xa5\x3a\x92\x18\x50\xb7\x57\xb7\x1c\x99\x86\xeb\x15\xf1\x72\xaf\x41\xc7\x5b\x0b\xb0\xf7\x96\x3a\x5e\x44\xed\x37\x26\x25\x0c\xec\x53\x64\xeb\xd4\x66\x19\xaa\x5a\x16\xab\x6b\x94\x63\x69\xda\x21\xff\xf4\xfd\xf9\x9f\x2e\xbf\x5f\xa0\x4b\xec\x6d\x03\xdf\xa8\x12\xc2\x4c\x43\x44\x43\xfb\x1b\xbc\x25\x08\xa3\x92\xd1\x7f\x94\xa6\x56\x11\x7a\x55\x41\x7c\xed\xbc\x26\x1e\xa0\xcf\x6a\x91\x6d\xb8\x58\x4c\x8f\x45\x57\xa9\xd2\x34\x1a\x30\x66\x64\x2e\x6d\xef\xfb\x3d\xb7\xdf\xa5\xfe\x93\x9f\x45\x61\xc3\x7b\x36\x44\x10\xb4\xa6\x5b\x6b\xb0\xb3\x25\x68\x70\x5a\x05\xa9\x36\x5b\xed\xe2\x25\x98\xa9\xbd\x1c\x8a\x11\xa5\xa9\xaf\xd2\x38\x38\x93\xcd\xfc\x0b\xad\x91\xc8\x19\xb4\xc7\xa7\x5a\x24\xa6\x39\x16\x34\xdb\x35\x87\xc0\x99\x8f\xdf\x5c\x57\x6d\xd2\x77\xe6\x3a\xae\xa7\x7f\xf1\xe9\xf2\x0e\x5d\x7f\xba\x87\x9e\x48\xfa\x66\x05\x2b\x3a\xfc\x1d\x10\xd3\xdf\xf5\xd9\x3c\xb6\xb6\xb5\x69\xbd\x0a\x9f\x98\x73\x4e\x25\xb4\x6a\x26\x4c\x0f\x66\xb5\x72\x57\x0a\xea\xe4\xcd\x02\xfe\xcf\x57\xf6\x1a\xa7\xa9\xd0\xdc\xbc\x72\x42\xec\xe5\x0f\x68\x2e\x0b\xfc\x9e\x2e\xb3\xc6\xde\x59\xec\x7d\xb1\xce\x60\x95\x33\xf1\x46\x2f\xbb\xd9\x20\xac\xda\x48\x40\x88\xa9\x57\x0a\x4d\x48\xbd\x7c\x60\xb0\xaf\x59\x64\xbd\xca\x7a\x42\xd1\xf5\xf2\x6a\x7e\xed\x2e\x53\x7b\x28\x78\xa3\xa4\x35\xba\xba\x71\xdb\x12\xbe\xd0\xa0\x8c\x58\x75\x17\xda\x62\xd0\x00\xd8\x98\x24\x66\xe8\x0d\xfa\x23\x7a\x42\x7f\x84\xab\xf5\xf7\x21\x60\x71\x1c\x34\x4e\xac\x35\x52\xdb\xd5\x4d\x34\x56\x7e\xd4\x47\x40\x7f\xa3\x57\xae\x38\x5a\x52\x96\x9a\x0e\x4d\xae\xe9\xb0\xc5\xd6\xb3\x2b\x1c\xea\x41\x8e\xba\x61\x60\x9d\x40\x57\x8d\x16\xf4\x61\xc7\x9a\x1a\xb9\x65\x1a\xb4\x96\x64\xaf\x0d\x91\x87\xcd\xd3\xad\x8a\x65\xf5\x48\x39\x56\xc9\xa6\x7d\x82\xf4\x15\x2e\x55\x4d\xc4\x61\x61\x38\xe5\xa0\x21\x18\x77\xe0\x86\x06\xa9\xf2\xb8\x84\x34\xaa\xf9\x5e\x6b\x17\xf6\x30\xbd\x27\x28\x0e\x08\xe1\xa9\xbb\x59\x1b\xe9\x50\x05\x4f\xcd\x55\x0d\x93\x4a\x1b\xec\xc6\xdd\xca\x41\xa0\xdd\x1b\xdb\x86\xa8\x54\xaa\x33\xd0\x97\x3e\x09\xb6\x1b\x27\x54\xb0\x14\x03\x19\x0b\xfa\xb4\x54\x3d\xf0\x82\x1b\x13\x75\x3e\x0a\xc1\x15\x4f\x78\xb0\x66\x64\xdb\x24\x6c\x3f\x30\x0d\xfe\x0d\x65\x59\x9c\xff\x70\x71\x33\xd3\x1a\x21\x14\xcf\xbb\x7b\x3f\x64\x95\x6b\xb5\x87\xbb\x7f\x7f\x13\x6c\x53\x13\xb1\x98\xe1\x72\xde\x2d\x16\xee\x13\xcb\x9f\x57\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\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\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\xb7\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\x3d\xcf\x8b\x52\x11\x74\x5b\xb5\xab\xaf\x7a\xa6\x2f\x77\xc6\x2f\xd8\x38\x1c\x2f\xe5\xe6\x30\x6d\xbb\x4a\x01\xa1\x22\x67\xa6\x16\xe2\x3c\x31\x53\x9b\x57\xeb\x99\x57\x33\x39\x3b\xd4\xd5\x61\x7a\xe7\xfb\xe9\xa1\x8e\x8f\xb9\x89\x62\xfc\x51\x8c\xab\x8d\xf1\xef\x61\x0a\x0d\x43\x8b\x69\x16\xf5\x04\xe4\x8b\x73\x5e\x9a\x12\x90\x76\xf5\x81\xb1\x2b\xbc\x18\x33\xd1\xd7\x43\x3b\x8a\xef\x19\x4c\xe4\x57\xc6\xfe\xad\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\x9b\xa6\xa0\x81\x17\xb4\xbc\x2f\xa8\xda\xbd\xe7\x4c\x91\x27\x8f\x04\xd3\x26\x86\x3b\xfb\x89\xed\x2a\x28\x2b\x51\xca\x3a\x31\x45\xc9\x20\xaa\x21\xe2\x2a\x89\x41\x96\xe9\x36\x76\xe6\x26\x0a\x58\x21\x4f\xea\xcc\x03\x32\x6e\x2b\x14\x96\x0f\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\xee\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\x13\x23\x8f\x3f\xe9\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\x1d\x7a\xfb\x1a\xa8\x16\x4b\x54\x41\x0f\x19\x55\x7e\xf3\x1a\xac\x2f\xef\xcf\x6f\x7e\xba\xfb\xdb\xdd\x4f\xe7\x17\x1f\xaf\xae\x87\x8e\x68\xb8\x4f\x69\x82\x0b\xbc\xa4\x19\x0d\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4b\x05\x2f\xcc\x3a\x45\xc9\x20\x5e\xb3\x8e\xc1\x8a\x30\x64\x38\x1f\x54\x15\xde\x69\x5a\x73\xb7\x87\x5a\x0b\xcc\x94\x13\x76\x86\xea\x73\x1b\x34\x8b\x92\x69\x41\xf5\xb9\x1e\x37\x9c\x8e\x09\x4a\x38\x4f\x53\x92\xb6\xa6\x7e\x64\x1f\xd0\x7b\x07\x7a\x57\x47\x8c\xa2\x9b\x4f\x77\x57\xff\x27\x7e\x54\x64\x69\x24\xca\x3d\x70\x24\x0f\x36\x42\x9a\x4c\x46\x60\xf2\xd6\x46\xf7\x4c\xb8\xf4\xbc\x33\x50\xc9\xdf\x71\x95\xc8\xc3\x7d\x5b\xb2\x76\x64\x7e\x0d\x01\xe5\x3c\x25\x0b\x74\x63\x98\x22\x74\xdb\x0d\xf2\xfe\xea\xbb\x9a\x0d\x80\xf9\x57\x7f\xcc\x14\xc5\x59\xb6\x43\x5a\x12\xdb\xe2\x8c\x18\x17\xb2\xe0\x5e\x6d\x05\xd5\x25\xb5\x4c\x5c\x6a\x93\x6b\xac\x70\x26\x03\x07\x3c\x86\x0f\x6a\x56\xff\x51\x0b\x93\x91\x78\xaa\xde\x47\x29\x61\x5c\x59\xb9\x54\x8f\x04\x01\xb5\x82\x27\xc8\xc8\xa6\xc6\x0d\x11\x58\x55\x1d\x4e\x54\x31\x4b\x60\xb1\x8e\x0d\x52\xe9\xd6\x7a\x53\x8d\x09\x9a\x78\x00\x66\x29\x89\xdc\xbb\x6d\x2c\x1b\xac\xa5\x55\x3d\xae\x20\x38\x85\xd8\xb0\x02\xab\x0d\xd8\x35\x03\x40\x73\x2c\x1f\x48\x6a\x5e\x5d\x98\x7b\xd8\x4a\xd2\xd2\x76\x00\xb0\xd3\xbb\xd7\x58\x58\x11\xac\x4a\x41\xe0\xfe\x0d\x0b\xb9\x4b\x82\x08\xc3\xcb\x2c\x14\x79\x16\x15\x14\x89\xd3\x4f\x2c\xdb\xdd\x72\xae\x3e\x54\x21\x55\x91\xdb\xf9\x63\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\xe5\x9f\x05\x2f\x63\x9b\x72\x68\x0a\xfa\xf3\xd5\x05\x9c\xaa\xd2\x9c\x1b\xc2\x94\xd8\x41\x50\x64\x27\x83\x67\x58\x86\x5b\xa0\x1f\x34\x4d\xed\x51\x91\x96\xb8\x4a\x26\x89\x5a\xa0\x8f\x78\x87\x70\x26\xb9\x15\xa6\x42\x92\x11\x43\x37\xe0\x33\x69\xca\xff\x0b\x04\x31\xce\x26\xee\x62\xc9\xd5\x06\xed\xbd\x30\x40\x9c\x5d\x88\x26\x7c\xcf\x18\x98\xea\x04\x25\xca\xf6\x01\x87\x88\x13\x3f\x10\x89\x0a\x41\x12\x92\x12\x96\x04\xf6\xb0\x61\x2b\xfa\xfd\xef\x9e\x65\xbe\x87\x9d\xbe\xe6\x4c\x93\x71\xe4\x5e\x5f\xb1\x94\x26\xd8\xf0\x20\xdb\xcd\xba\x26\x61\xb0\x6a\x5a\x19\x13\x43\x0c\xdc\x00\x97\x2d\x25\x11\xa6\xbb\xb3\x28\x89\x41\xe2\x5f\xcb\x25\xc9\x88\x32\x11\xb7\x10\xd7\x8f\x95\x69\x25\x60\x1a\xca\x63\xe5\x08\x23\x7c\xd2\x09\x93\x25\xb4\x0b\xd1\xaa\xb1\x42\x29\x27\x75\xbc\x22\x96\xe8\x87\xab\x0b\xf4\x06\xbd\xd2\xf3\x7b\x0d\x3e\x96\x15\xa6\x21\xb1\x5d\x71\xe3\x85\xd9\x97\xab\x57\x0e\x38\x2c\x03\xe8\x13\x71\x61\x8e\xe1\x0c\xb1\x90\xcf\x07\xba\xc5\xd8\x15\x6a\x75\xc7\xc5\x18\x5b\xcf\x1c\x18\x6d\xda\x84\x1e\x20\xe7\xd0\x38\x61\x42\xf7\x91\x73\x00\xe2\x30\xa1\x8f\x20\xe7\x68\x96\xf4\x83\x24\x62\x04\x47\xfa\xe1\xa8\x1c\xa9\x29\x02\x68\xaa\x6d\xaf\xde\x90\x66\x4e\x14\x4e\xb1\xc2\x88\x86\xb6\xa3\x64\x8d\x8e\x20\xbf\x84\x0d\x3e\x1e\xbf\x92\xe4\x7b\xca\xca\x27\xe3\x22\x1b\xa3\x42\xde\x5d\xc2\x87\x28\x71\x93\x07\x84\xe3\xa2\xc8\xa8\x09\x10\x6e\xe7\x51\x06\x30\x63\x0e\x79\x33\x3d\xa6\x4f\xf0\x81\xa3\x8c\xb3\x8c\x6b\x56\xa9\x6f\x75\xcc\x52\x9e\x07\xc0\xee\x4f\x50\x0b\x4c\x04\x27\x9b\xa6\x85\xbd\x87\x58\x46\x5d\x52\xff\xe4\xd7\x5e\x9c\xea\x9c\x91\x2d\x09\xa6\xdd\xec\x67\xd7\xea\xf7\xb5\xe0\xe4\x76\x00\x00\xa0\x0c\x2f\x49\x66\x2e\x0f\x43\x25\x91\xce\xd6\x28\x1a\x8a\x56\xcd\x04\xcf\xc6\x04\x23\xdd\xf2\x0c\xfc\x5b\xb8\x5a\x8c\x06\xf0\x8d\xac\x05\x5e\x8b\x5f\x0b\xc8\xf5\xad\xb5\x80\xbe\xf3\x6d\xac\xa5\x0c\xde\x44\x9d\xb5\xe8\x8b\xab\xbd\x16\xb8\x41\xbe\x85\xb5\x44\xa8\xf5\x8f\x94\xa5\xfc\x51\x8e\x67\xba\x3f\x9a\x0f\x1d\x67\x48\x34\xeb\x51\x94\xad\x65\x93\xf1\xe2\xa0\xb1\xb4\xa9\xa7\xf6\x71\x5e\x67\x9c\xaf\xf2\xa9\xbb\x3c\x2a\x00\xdd\x09\x5c\xa5\xb4\xfe\x99\x03\x2e\xd2\x10\xc5\x47\xf1\xc6\xa3\x73\xc0\x75\x2e\xf1\x7b\xa1\x61\x29\x8a\xb3\xbb\x62\x54\xdb\xb3\x3f\x7f\xbc\x3b\x6f\x7f\xac\x09\xf7\x11\x52\xee\xf5\x7a\xf4\xdf\x11\x4e\x73\x2a\x65\xd8\x24\x0d\xf8\x25\x4b\x68\x47\xf7\xca\xf9\x28\xd6\x54\x6d\xca\xe5\x22\xe1\x79\xc3\x5d\x31\x97\x74\x2d\xcf\x2c\x95\xcd\xf5\xec\x5f\x0f\xc0\xa5\x2c\xa3\xac\x61\x74\x80\x04\x76\x2b\xd4\xc1\x04\x93\x6a\x05\x80\x7a\x93\x69\x3a\x00\xd4\x58\x79\x7b\x10\x60\xb2\x4b\x29\xc9\x52\x6b\x88\x30\xe1\xd8\xfa\x3c\x67\xc5\x06\xcf\xe1\xc2\x18\x00\x6e\x73\xc6\x40\xaf\xdf\x70\xc6\xad\x0f\xdd\xc4\x1c\x5b\x55\xca\xd8\x25\x60\x12\xf6\xe4\xe8\xb9\x0c\x00\x6e\x5a\x3e\x8e\xc2\xda\xba\xd4\x73\x3d\x18\x58\x3f\x40\x41\x80\x40\x9b\x31\xd7\x88\xc6\x19\x58\x59\xef\x46\x1a\xe1\xfb\x97\xb0\x0f\x95\xc6\x33\x12\xfd\xa0\xf9\xd8\xcf\x34\xb7\x71\x4c\xb8\x57\x13\x1a\x58\x54\xa7\xf6\x4a\xaf\x36\xa4\x5f\x69\x6b\x44\x83\xc7\xb7\xab\x2f\x0d\x69\x45\x03\x20\xfb\x84\xdd\x67\xc9\xba\xfd\x40\x8f\x20\xef\xa2\x3e\x99\x77\x8f\x9e\x97\x44\x59\x72\x06\x82\xcd\xf1\x0e\x2d\x87\x8e\x4b\x4a\x25\x98\x35\xc1\x29\xdd\x24\xde\xdb\x26\x21\x1d\x9b\x4e\x9f\xed\x98\x37\x81\xad\xd1\x59\xdd\x77\x8d\xf7\x11\xed\x9a\xa2\x6e\x78\x6a\x42\xc6\xab\xa0\x5c\x6f\xff\x43\x1b\xba\x4e\x7f\x76\x77\x7f\x2d\x59\x30\x6e\x62\x26\x9a\x71\xe4\xae\xc1\xac\x69\x9a\xea\x81\x69\x2d\xba\xb6\xf9\x6a\x6b\x16\xc6\xca\xb5\xa1\xb2\x99\x1c\x3e\xab\x26\x1d\x70\x1a\x37\x5b\x3b\xcc\xd0\x7f\x94\x52\x21\x5c\xb9\x9f\x5b\x3d\x27\xaa\x98\x63\x20\xa7\xc4\x6b\x4d\x71\xb9\x58\x8a\xeb\xc9\x6c\x69\x4a\x50\x4a\x57\x2b\xe2\xdc\xe2\x4b\x82\x0a\x2c\x70\x4e\x14\xb8\x51\x0c\x6a\xa1\x0b\x2f\xf3\x13\x03\x5f\x21\xec\x7a\xdd\x56\x11\x70\x33\xe3\xa3\xa5\x0a\xe5\x74\xbd\x31\xb2\x0e\xc2\x28\xe3\x6c\x0d\x11\x7d\x7a\x0a\x19\xc7\xbe\x93\x08\xcc\x81\x0b\xf4\x88\x45\x8e\x30\x4a\x70\xb2\x01\x2b\x21\x66\x28\x2d\x05\x24\x78\x2a\x82\xd3\xdd\x5c\x2a\xad\x67\x6b\xe9\x08\x4c\x69\x06\x03\x5e\x2f\x74\xa7\x13\x06\xe0\x8b\x9a\x48\x64\x7d\x97\x54\xc7\xc4\xfa\x0a\x9c\x70\xd0\x24\x3f\x0f\xf4\xd6\x01\x9b\x52\xfa\xf7\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xdd\x9b\x53\x4a\x7f\xe7\x99\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\x4a\xe9\x87\x67\x4a\xe9\x1f\x3f\xb7\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\x1b\xcf\x94\xd2\xdf\x19\x65\x4a\xe9\xff\x36\x92\xf5\xa6\x94\x7e\xf7\x4c\x29\xfd\x53\x4a\xff\x94\xd2\x3f\xa5\xf4\xef\x3d\x53\x4a\xff\x94\xd2\x3f\xa5\xf4\x0f\xb9\xd0\x52\xea\x49\xb5\x8c\xc9\x3a\xb0\x06\xfc\x46\xac\xe2\xb2\x5c\xad\xb4\x86\xca\xbd\x97\xb5\x1e\xb1\x63\x89\xae\x72\xdf\x2a\x47\x97\xb5\x26\x4b\xa2\x66\x90\xd6\x60\xc2\x74\xc6\x01\xb5\x81\x94\x90\xd6\x28\x88\x84\x34\x00\x86\x2e\x3f\x7d\x58\x34\x92\x1e\xbc\xa6\x4c\x6f\x2a\xc4\x50\xcc\x31\xcc\xe6\x13\x4b\x62\x9c\x92\x35\x62\xfb\x22\x41\x2d\x7e\x93\x8c\x4b\x13\x53\x00\xa0\x7d\xae\xa9\x0d\x66\x8c\x38\xa9\x83\x2a\x90\x95\x97\x84\x30\xc4\x0b\xc2\x8c\x1f\xca\xb5\x65\x40\x58\x29\x9c\x6c\x16\x7a\x7c\x16\x84\xea\xb2\x43\xab\xd1\x35\xeb\x25\x38\x37\xc8\x15\x24\xc7\xd4\x0c\x80\x70\x22\xb8\x94\x28\x2f\x33\x45\x8b\x6a\x08\xdf\x8e\x11\x88\x01\x32\x91\x59\x15\xc2\xc0\xb1\x40\x8c\x29\x1e\x62\xfa\xed\xc6\x4a\xb7\x04\xce\x06\x03\xaf\x41\x36\x9a\x41\x42\x7b\x5e\xa8\x9d\x71\xb9\x1a\xc7\x13\x15\x52\xa1\x24\xa3\x70\xfd\xc3\xec\x4c\x4e\x28\x8c\x32\x0b\x38\xf5\x15\xe4\x8a\xc2\x5a\xa5\x5d\x2c\x4b\xe1\xd6\x28\x94\x34\x8e\xc6\x7a\x18\x3b\x40\x4a\xa5\xbd\xa3\xa5\xcf\x33\x81\x5d\xef\x10\xb3\xd9\x6e\xad\xb0\xdd\x29\x0c\xe1\xc6\xb4\x3f\x35\x06\x19\xc0\x02\xa4\x3c\x59\x45\xa9\x3e\x54\x90\x62\xec\xf2\x7c\x66\xad\x3e\x23\x45\x95\x2c\xa7\x36\xd8\x5f\x69\xc1\x1d\x44\x3b\x5b\x20\x02\x46\xb6\x9a\x66\x49\x42\xb4\x08\x8d\x3b\x27\xcc\x0c\x77\xd0\x51\x52\x44\xe4\x94\x81\x5b\xf6\x23\x91\x12\xaf\xc9\x8d\xd7\xc0\xe3\x13\x9b\xc0\xc6\x53\xa3\x1a\x08\x21\x03\x19\xaa\xfe\xa5\x76\x89\x9d\xfa\x18\x42\x63\x2a\x28\x37\x73\xa9\x62\x00\x1f\x05\x55\x5a\xa7\xa2\xd2\xe4\xd2\x81\x5d\x73\x3f\xe0\xd2\x0f\xba\xe9\x84\xfb\xe8\x40\xd7\x20\x35\x7f\x67\xa9\x71\x5c\x2d\x09\x5a\x0a\x4a\x56\x68\x45\x19\xce\xac\x07\xca\x47\x5f\x90\x23\x82\x8d\x40\x2d\xa5\x16\x4d\x39\x73\x8e\x15\xb7\x86\x05\xfa\xd1\x2e\x42\x89\x92\x25\x78\x30\x67\x99\xf1\x94\x20\xba\x42\x6b\xf0\x76\x09\xe3\x50\xff\xdd\x9b\xff\xf5\x7b\xb4\xdc\xe9\x1b\x11\x0c\x95\x8a\x2b\x9c\x55\x68\xca\x08\x5b\xeb\x3d\x00\x06\xe1\x3b\x0b\x59\xd6\x4c\xbf\x74\x98\x85\xba\x2a\x66\xe9\x6f\x7f\xf3\xb0\x6c\x5f\xe9\x67\x29\xd9\x9e\x35\xf6\x65\x9e\x71\x6f\x5c\x4a\xb7\x19\x4e\xff\xe5\x3b\x20\x5e\xf6\x10\x24\x14\x5f\x88\x20\x49\x97\xfc\x84\x36\xfc\xd1\xe4\x60\xf6\x50\x54\xed\x12\x2f\x78\x51\x66\xfe\xae\x3d\x08\x7d\xd0\x54\x0c\x78\x2a\xed\xed\xd0\x0a\x67\xec\x3d\x39\xa0\xe8\x5b\xc0\x7e\x5e\xd7\xbc\xe1\x8d\x8b\xd3\x4d\x8f\xdb\x78\x28\xab\xe4\x56\xb9\x4f\xa5\x20\x0b\xf4\x01\x67\xd9\x12\x27\x0f\xf7\xfc\x7b\xbe\x96\x9f\xd8\xa5\x10\x5e\x31\xa0\x35\xef\x0c\x6b\xbe\xbc\x29\xd9\x43\xbb\xd5\x42\xc6\xd7\x5a\x8e\x2b\x4a\xe5\x22\x56\x1a\xab\xf2\x00\x76\x33\x85\x33\x5e\x5d\x02\xd8\xf6\xb2\xa9\x61\x93\x27\xa0\x2b\x08\x78\xc2\x0c\x11\x3d\x57\x1f\xa6\x35\x45\x37\xe7\x22\x9b\x64\xf9\x9b\x37\xbf\xfb\x83\x21\x7d\xad\x5d\xfc\xe1\x0d\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\xbf\xff\x5b\x40\xb2\xa3\x4a\x92\x6c\x35\x33\xb1\x77\x55\xbe\xed\x29\x5c\x14\xa7\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\xf2\x80\x52\xfb\x47\x98\xac\x67\x99\xe0\xb5\xb2\x21\x3d\x0d\x5d\xb0\x8a\x02\x82\x00\x3c\x17\xc9\xf3\xdc\x8e\x5b\xcd\x39\xb7\xfc\x6d\x39\x2e\x0a\x68\x34\xb6\x82\x04\xa1\x47\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\x76\x1f\x9e\x51\x7d\x8f\xc0\xac\xd0\xe8\xf4\xd4\x8c\x57\xc6\xa8\x20\x42\x42\x73\x38\xf5\x19\x76\xf4\x7d\x86\x69\x28\xa3\x0b\xa1\xba\xe1\xd1\xf3\x96\x31\xdc\x81\xa7\xde\x13\xef\x2b\x01\x6f\xdf\x33\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\xfa\xee\xf4\xd9\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\x18\xf4\x62\x23\x84\x05\x2f\x59\x6a\xf5\xf3\xca\x10\xf2\x71\x6f\xc2\xd7\x9c\x81\x90\x63\x72\x90\x02\x61\xab\xe6\x69\xc5\x88\x6b\x0e\xf3\x76\xf1\xf6\xcd\x97\x65\x93\xf7\x7b\x0d\xf1\x34\x46\xae\x2b\x36\x69\xce\xc6\xb3\x67\xe4\x0a\x6c\x44\xcf\xea\xa3\x55\xda\xea\xfa\x19\xd4\x55\x15\x80\x9f\xb4\x32\x46\xa2\x4a\xe1\x21\xf4\x0a\x44\x1a\x2d\x0b\x36\xb2\x12\x5e\x8f\x2a\x03\x13\x97\xd6\xae\xf5\xbb\xe5\xb3\xce\xb6\x39\xc4\x86\x68\xfb\x74\xe1\x30\x35\xd9\xaf\x7b\x8e\x79\xab\x8b\xdc\x09\x7a\x65\xde\x3c\x95\x10\x8b\xfa\xfa\xd9\xdb\x6b\x97\x7d\xf9\x54\x04\xf3\x28\x5b\x4b\xbf\x7c\x2a\x30\xe8\xd0\xc5\x10\x0e\x06\x84\x8e\xf6\x2d\xe3\xc7\xc1\x9f\xc8\x06\x6f\x09\xc4\xc9\xd2\x0c\x0b\x6f\x26\x81\x85\xcb\xd1\x9d\x59\x15\x34\xbb\x25\x6c\x4b\x05\x67\xe0\xa7\xda\x62\x41\x21\xa7\x08\x5a\x11\x12\xa6\xe5\xd3\x5f\xbf\xfa\x7c\x7e\x0b\xfe\x81\x70\xb6\x9b\xc9\x3d\xb0\x2b\x2f\x25\xc4\x20\xec\xad\xa0\x31\x54\xbd\x71\x43\x73\xed\xd9\x54\x37\x7f\xbd\x2b\xc0\xeb\xdc\x7a\xf4\x1c\xf2\x52\x95\xd8\x9f\x4d\x61\x1e\xf2\x94\x64\xa5\xa4\xdb\xe7\x9e\xff\x61\x89\xa7\xba\x15\xbf\x82\xc0\x63\x43\xba\x2f\xa8\x87\x76\xfb\x1b\xee\x9e\xca\x6e\x2c\x38\x98\xf5\x18\x57\xc3\x5d\x4f\x7b\x8d\xcb\xa7\xb2\xaa\x8d\xd3\x4c\x65\xb5\x8a\xab\x4d\xb9\xf0\x6a\x41\x55\x5d\xc8\xb4\x6b\x76\x87\xfc\xac\xe3\xa8\xb0\xfe\xbd\xf4\xec\x51\x60\x77\x7c\xfb\x62\xba\x36\x7f\xcf\x13\xdc\x49\xfd\xef\xb4\xd2\xb6\xef\xa1\x1c\x92\xb0\xf4\xb2\xcf\x33\x22\x94\xa9\x4f\x2a\x6c\xcc\x98\x85\x88\x38\x43\x19\xe7\xc5\x12\x27\x0f\xdd\x9d\x91\xbc\x5b\x5d\x06\x5a\xee\xe2\x35\xa6\x4c\xd6\x19\x49\x57\x37\x0b\x74\xcd\xa1\x8a\x8d\xd1\x30\xe1\x7e\xea\x53\xc3\x3b\xd3\xf9\xe1\x6a\x06\x70\xf5\x1f\xd6\x5c\x4a\x5a\x40\x7c\x7f\xc9\x68\x62\x32\x5d\x7a\x31\xd4\x77\xeb\x64\x7c\xfd\xc1\x78\xa4\x82\x18\xe2\x6b\xeb\xb8\x82\x90\x85\xd6\x5c\x8c\xfe\xdf\x20\x1b\xa8\x7f\xda\x3b\x81\x1e\x5a\xc8\xf8\xfa\xfb\xbe\xda\x0c\x9d\xe1\x4d\xe2\xdb\x91\x47\x67\x3c\x25\x77\x24\x83\x63\xb7\x3f\x83\xb8\xd2\xc2\x01\x22\x6f\x2d\xe1\x02\x8a\xe6\xda\x23\x78\xcd\x53\x57\xb0\x8c\xa7\x26\x7a\x49\x26\x1b\x92\x96\x19\x78\x42\xfa\xa7\xdf\x43\xfa\x05\xd6\x07\x3b\x88\x3a\x9b\xee\x68\xfd\x2e\x60\x8c\xc5\x36\xf7\xc2\xc6\x44\x96\x2c\x25\x22\xc3\xd0\x4a\xdd\x60\x35\xb5\x63\x75\x6f\x0b\x3d\x53\x4d\x77\x6b\x28\x98\x63\x70\x5f\xd5\x25\x9a\x69\x46\x4f\x0a\x43\x22\x29\xc9\x88\x72\x69\x3c\x9d\x58\x65\x3f\x3d\x16\x3c\xfd\x68\xf3\x3f\x83\xeb\xba\xa9\xdf\xab\x77\x5f\xa2\xef\xf1\x92\x64\xc6\x7a\x79\xae\x99\x14\x36\x4b\x35\x68\xef\x13\xf7\x1b\x22\xbe\xd5\x35\x71\x93\xbc\x0a\x9e\x76\x26\x1f\x52\xcf\x70\x3d\x68\xdf\x2d\x10\x5f\xae\x7a\xe0\x3a\xdc\x2b\x95\xdb\x58\xaa\xc9\x57\x2b\x6d\x92\x0d\x1c\x89\x07\xb2\xb3\x2e\xf1\x1c\x17\x48\x2a\xee\x6b\x7b\x6c\x6c\xa6\x55\x99\x6a\xc3\xc7\x4c\x9e\x29\x50\xd1\x72\x57\xf7\x0c\x57\x9c\x67\xd6\xc7\xc6\x05\xf1\xba\xd8\x04\x51\x82\x92\x2d\x41\x58\x2c\xa9\x12\x58\xec\xaa\xfc\x5e\x70\x28\xec\x2a\x9a\xfa\x47\x49\xc4\x0e\xe4\x21\x08\x84\x02\xc1\xab\x17\xa4\xa6\x39\x41\x80\x23\xa7\x26\x91\x30\xe7\x29\x5d\x01\x01\x5b\xc2\xed\x84\x00\xf6\xfb\xf6\x4b\x49\xc4\x7c\x5d\xd2\x94\x9c\x35\x36\xae\xcf\x7d\x10\x94\x0d\xa0\x62\xc7\x97\xdc\xef\x8f\xb8\x80\x38\x0a\x78\x5b\x6f\xaf\xa1\x78\xd8\x63\xd9\xea\x72\x6d\x13\x3a\x7b\x87\xe4\x62\x8d\x19\xfd\xd9\xe0\x3b\xc1\x8a\xac\xb9\xd0\xff\x7c\x25\x13\x5e\xd8\x5d\x00\xde\xf8\xba\x81\x56\xbc\x33\xfa\x5d\x2f\x44\x69\x59\x29\xf8\x29\x04\x29\x32\x7b\x1d\xb9\xf2\xc8\x19\x24\x8e\x02\x5c\xdb\x51\x7b\x28\x3c\x23\x6a\xef\x0c\xfe\x47\x6f\x9b\x4f\xbd\xdd\x0b\x5b\xa9\xcc\x7f\x1a\x9d\xad\xbe\xe5\x18\x40\xc8\x02\x27\x64\x81\xae\xea\xa2\xee\xfd\x67\x4b\x13\x6a\x22\x08\x06\x83\x51\x55\xe8\x7c\x86\x70\xa6\x36\xbc\x5c\x6f\x90\xe4\x39\x69\x94\x88\xcf\x21\xdb\x3d\xe3\x8f\x08\x5b\xcf\x73\x3f\xe1\xf0\x3a\x11\x48\x4b\x03\x84\xd9\x6c\x57\x50\xbc\x19\xc2\x85\xe6\x57\x82\x62\x65\xcd\x96\xb8\x54\x3c\xc7\x8a\x26\x5a\x6e\xef\x97\xdc\x5c\x69\x86\x42\xd0\x1c\x0b\xaa\xb5\x66\xe7\xa9\x84\xc0\x67\x58\x05\x67\x88\xa6\x24\x2f\xb8\xd2\xaa\x8b\x21\xa2\x66\x6d\x77\x8f\x10\xbc\x82\x38\x5d\xce\xfa\xc4\xc8\xd1\xa7\x96\x42\x19\x88\x15\x25\x42\x7e\x07\x7b\xe1\x27\x82\xde\xa3\xe5\xbf\x59\xb9\x50\x7d\x25\x16\xf6\xee\x20\x61\xc3\xf6\xe0\x98\xd5\xad\xe6\x53\x43\xe5\x6b\xbe\x25\x02\xaa\x50\x5b\x7a\xf7\x58\x72\x9a\xe9\x52\x8f\x64\x19\x2b\xbc\x14\x82\x72\xa8\x2e\x90\x61\x29\x87\x27\x6b\xdf\x46\x89\x7e\x1d\x61\x29\xe9\x9a\xd5\xb7\x9e\x16\x44\x62\x07\xb6\x27\xbb\xc3\xc9\xda\xf1\xf2\x9a\x95\x58\x57\x00\x79\x2a\x48\xa2\xaf\x58\xa9\x7f\xb4\xce\x80\xd6\x3d\xab\x15\x44\xd5\x67\x11\xbd\xb7\x0a\x88\xe1\x1e\x46\xa1\x21\x5b\xc2\x8c\xda\x09\xe2\xba\x89\x60\x69\x40\xae\x6a\x7f\x1b\xa0\x1d\x98\xe4\x1f\x25\x5c\x60\xdd\xb9\xed\x8f\x1f\x0a\xd6\xf2\x87\x68\x79\xdb\xa9\xf4\x49\x84\xed\x9e\x10\xd0\x06\xc2\x24\x1a\x43\x17\x07\x4d\x53\x36\xb0\xe7\x66\xa4\x28\xe2\x6f\x5c\xf2\x42\xb7\xd2\xb8\x36\x25\xf5\xc2\x7b\x47\xfe\xaa\x0d\x4a\x82\xd7\x46\xa8\x29\xc9\x0b\x61\x76\x6c\x0b\x92\x01\xdc\x8e\x6e\x3e\xd2\x6c\x31\xe2\xbb\x84\x46\xb7\x1d\x09\x36\x17\xe9\x1d\xe5\x2b\x36\x1c\x19\xb4\x3e\xf4\xfc\x49\x10\xa5\x6f\xa7\xae\xdb\xa2\x6d\x37\x87\x5a\xc6\x76\x7a\x7b\x46\x87\x0d\x86\x48\x3c\xf0\xa7\x80\xa6\xb3\xe2\x75\x4c\x41\x67\x96\x54\xa2\xd3\xb7\xbf\x79\xb3\x39\x9d\x99\xfa\x30\x6d\x5b\xbc\x20\xeb\x32\xc3\x42\xef\x8a\x30\x21\x7a\xe8\xef\xff\xf7\x9b\xf9\xff\xfa\x7f\xff\x7f\xaf\x72\xf9\x5f\xf2\xbf\xf2\xff\xda\xbc\xfe\x7b\x07\xe6\xab\x9c\x66\x19\x75\x01\xbb\xee\x7f\x73\xca\x4a\x05\xae\x94\x52\xc8\x8e\xd9\xd7\x7f\x6f\xf0\x52\x91\x1b\x41\x56\xf4\x29\x8c\x12\x3d\x5d\xfd\xae\x96\xf3\x57\xf4\xa9\x8d\x15\x41\xd6\x54\x42\x09\x12\xc8\xe6\xdb\x60\x96\x82\x5c\xb9\xea\x0b\xf3\x70\xce\xfb\x52\x92\x55\x99\xcd\xa0\xa4\x10\x58\x4b\x2f\xad\x1e\xf3\xc3\xed\xf7\x26\xe4\x4f\xf3\xd2\xa7\x9d\x09\xaf\x7b\x14\x14\xa4\xb4\xde\xe4\x5c\x98\x99\xb4\xfe\x79\x73\x78\x66\x95\x0f\x08\x27\xfa\x62\x6a\x41\xa7\x12\x49\xa5\xaf\x2d\xe3\x76\x58\x96\xdd\x9d\x83\x0b\xcc\x58\x98\xe0\x7f\x1a\x77\x01\x68\xe7\x08\x37\x2a\xb1\x34\x31\xb3\x40\x1f\xb8\xde\x52\xac\x0f\x51\x07\xac\x3e\xc6\xa5\x34\xe2\x2a\xfa\xbb\x3e\x23\x89\xca\xcc\x3a\xff\x1e\xbd\x69\x92\x24\x82\x74\xb9\x5d\xfb\xae\x37\xef\x98\x28\x09\x17\x78\x51\xfd\x68\xcc\x0c\x52\xcb\x49\x95\xbc\x8c\xb0\xec\x8d\x44\x6b\xed\xb4\x39\x53\xce\x6e\x69\x4e\x43\x6d\x89\xaf\xbd\xc3\xcd\x8f\x3a\x10\xe1\xda\x34\xd5\x5e\xed\x84\xc0\x6e\xdd\x84\x71\x46\x54\x72\xd6\x14\x47\xce\xec\xa2\xcf\xfe\x68\xfe\x63\xae\xe7\xfd\x6f\xfb\x28\xf3\xf8\x8f\x07\xc5\xcd\xae\xa1\x72\xa0\x11\xd1\x3e\xae\x5b\x05\xab\x36\x3c\x4b\x25\x82\x68\x74\xb0\x90\x39\x58\x08\x2b\x25\xe8\x12\x68\xb5\x4f\x39\x4f\x78\x9e\x37\x83\x6e\xab\x32\x8c\x36\xe2\x25\xf5\xb4\x44\xe9\xa9\xa9\x35\x42\x28\x59\xf9\x2b\xc8\xb7\x56\x79\x72\x6e\xee\x0c\x9c\x41\xa2\x8f\xbd\x21\x32\xb4\xd6\x5f\xb7\x8a\x63\xda\x6a\x91\x8d\x10\xc3\xde\xbb\x03\xd4\xb5\x82\xa7\x0b\x74\xa7\xd5\x2c\xeb\xde\xd1\x1b\x62\x9b\xa1\xb5\xaa\x8c\x2b\x0e\x41\xd7\x6b\x23\x5b\xf2\x47\x0d\x76\x43\x8b\x7e\x35\xda\xde\x78\x0e\x24\x18\xc5\xf4\x27\x55\x30\x51\xc1\xd3\x77\xe8\xff\x61\xe8\xad\xa1\x43\xfe\x08\xd2\xe9\x9f\xaf\x2e\xfc\xf5\x9d\x96\x66\xe4\x0f\x77\x80\x2e\xf4\x1b\xf3\xa5\x24\x6a\x4d\x53\xb4\x34\x35\x59\x24\x51\xe8\x15\x23\x8f\x26\x22\xc2\x68\x65\x40\xd2\xfd\x57\x74\xed\x12\x73\x5e\x81\x6a\x92\x76\x98\xd7\xe8\xb7\x66\x9c\x82\x08\x5b\xca\x51\x8f\xe5\xf7\x93\x7f\xba\x3d\xb5\x81\x76\xe2\x71\x2e\x1e\xe7\xf3\xf9\x5c\xaf\xd3\x55\x3c\xef\xa9\xdc\xae\x15\x3e\x63\xad\xf1\x06\xa2\x56\xd8\x06\xa6\x5a\x4f\xc5\xb0\x5c\xb6\xb3\xab\x58\x9c\xf4\x7c\x3d\x54\x53\x3a\x9c\x56\x11\xee\x70\xf0\x8c\xde\x06\xe1\xa6\x52\xe3\xba\x1a\xf4\xd4\x95\xf3\x17\x02\x3f\xb0\x04\x78\x20\xbf\x7f\x54\xcd\x52\xab\x12\x63\x15\x8e\x79\x39\xc2\xae\x05\xba\x15\xbc\x48\x9f\x82\xe3\x77\x28\x38\xb0\x37\x41\xd5\x81\xc0\x7b\xe8\x47\x74\x25\xd8\xef\x3d\xe0\x31\x12\xc7\xf4\x23\xf0\x15\x19\xf7\x31\xe7\xc3\x48\x74\xa0\xb8\xe4\x81\x65\x75\xc3\x31\x1a\xc1\xa6\x03\xcf\x68\x37\x10\x66\x12\x23\x1b\x0d\x74\x0a\x67\x7a\x94\xec\xa8\x3d\xf3\xed\x4f\x3f\xcc\xf8\x3d\x8b\x2d\x91\xf9\x55\xd8\xca\x70\x53\x81\xf1\xed\x04\xda\x72\x4a\xff\x46\x3f\xa7\x93\x80\x9b\x41\x2f\xe0\x91\x3d\x04\xfe\xd5\x2e\x99\xa1\xa0\xca\x60\x87\x80\xc3\x7a\x03\x0c\x95\xbf\x1a\x0c\x04\x1d\x8c\x89\x09\x75\x02\x38\xac\x07\xc0\xcb\xcf\x39\x54\xf1\xff\xb0\x5a\xff\x2f\x3f\xe7\x50\x65\xff\xc3\x6a\xfa\xbf\xf4\x9c\x83\x26\xcc\xa6\x4a\x05\xf2\xee\x30\x7f\x3b\xaf\xf4\x7a\x50\xc1\xe4\x7e\x97\x14\x93\x82\xe9\xba\xad\x9a\x52\x91\xbd\x33\x6f\xb3\x9e\x19\x28\x66\xd6\x6a\xda\xe9\x64\x70\xea\x5c\x50\x3b\x2d\x6c\xfb\x39\x50\x8b\x61\x32\xee\xa6\xe8\x24\x15\x9c\xda\x1c\x3b\xad\x3d\x04\x11\x1b\x08\x09\x1f\x6e\x57\x33\x94\xb3\x1d\x0a\x1f\x93\x3b\x99\xa8\x7e\x1f\x72\x5b\xfb\x37\xef\x81\xd6\xdf\xb0\xb5\x54\x76\x95\xd4\x41\xaa\x5c\x52\x5e\xb9\x10\x94\x61\x88\x3f\x01\x0d\xae\x64\x75\x45\x0d\x07\xe3\xd5\x7e\x36\x8c\xbb\x7f\xfa\x83\x13\x4d\x64\x99\x93\x4a\x33\x5c\xb2\xa4\x13\x8a\x33\x80\xe5\x9e\xc5\x1a\x9f\x21\xc4\xdb\x3f\x10\xc1\x48\x56\x57\x21\xb6\x37\xac\x4f\xac\x1c\x8e\xa3\x0f\x47\x38\xf7\x54\xd0\x5a\x19\x43\xa1\x06\xbb\xb3\x25\xfd\xbc\x9f\x47\x44\x34\x0e\x14\x8c\x6b\x27\x21\x80\xf0\x74\xdc\x19\x84\x23\x2a\x03\xd1\x92\xa1\x12\x70\x03\x71\x94\xa1\x63\x30\xdc\x54\xe4\xe0\x76\x22\x07\x09\x5e\xae\x91\x48\x37\xbd\xea\x54\x46\x89\xae\x2f\xd6\x4b\xe4\x88\x5d\x44\x86\x8e\x49\x7c\xe7\x90\x97\xe8\x19\x72\xfc\x6e\x21\x87\xf5\x09\x41\xcb\x40\x01\xdd\x17\xe8\x10\xf2\x02\x3d\x29\x62\xaa\xfc\x0f\xb2\x8c\x71\x9d\x40\x0e\xeb\x01\x82\x82\xcb\x18\xdd\xfd\xa3\x89\x4b\x2f\xd4\x71\x38\x3e\x0e\x2e\xa3\xba\x79\x1c\xde\xc7\x03\x71\x7f\x7b\xc0\x83\x3a\x78\x54\xa6\x06\x2f\xd8\x11\xbd\x3b\x22\x3c\x09\xf5\x73\x18\xe7\x0c\x4a\xd8\x87\x70\xcf\x70\x26\x56\xb8\x53\x47\x64\x2f\x8e\x97\x3c\xbd\x87\x78\xb1\x6d\xe8\xd2\x79\x92\xf0\x92\x0d\xc7\x44\xdd\x75\x5e\xef\x3b\xdf\xed\xb7\xfa\x02\x14\x4b\x13\x20\xe0\x88\xfa\x46\xf0\x9c\xa8\x0d\x29\x65\x6f\x1c\x8c\xdf\x7b\xb9\x09\x87\x11\xdf\xfd\xe5\x5c\xcf\xa9\xe5\x76\xdc\xcb\x77\xb0\x42\x66\x4a\x8a\x8c\xef\x9a\x49\x50\x5d\xcf\x1f\x6f\x5c\xcb\x7c\x85\xfe\xae\xb9\x08\xe5\xec\xef\x0b\x74\x67\x92\x85\x40\x16\x41\x0a\xaf\xc1\x0f\x6c\x50\xf1\x97\xf3\x46\xa4\x44\x07\xa6\x19\x56\x9a\x48\x89\xbc\x54\xc0\x8c\x3a\x19\x19\x9f\xcd\x40\x40\x6d\xf7\x78\x6d\xea\x61\xae\x59\x6f\xa0\x2f\x5d\xc1\x98\xc6\x81\x14\x8f\x48\xc5\x05\x5e\x0f\xec\xbd\x79\xc7\x6d\x78\x1d\xeb\xa7\x91\xb1\xe1\x8f\x0e\x48\x4b\x2a\xea\xbb\x57\x3b\xf9\x0e\x94\x49\x85\x59\x42\x46\x05\x40\x41\x81\x08\x4f\x3a\x4e\x3b\xbe\xe6\xd2\xbe\x69\xb2\x14\xef\x6c\xf0\x33\x6f\x4c\x71\x8f\x08\x7b\x8f\xdf\x9d\xc2\x8a\xac\xca\xec\x8e\x28\xb9\xdf\x3b\xc6\x55\xc4\x2e\x32\x9c\x90\xb6\x23\x0b\x32\xc6\xef\x49\x5e\x64\x58\x79\x32\xa4\x46\x46\xbc\x58\x34\x9f\xd9\x7c\xea\xb3\xef\x00\x13\x29\x15\x7d\x91\x2d\x43\xd2\x5f\x4e\x52\x5a\x7a\x7b\x98\xb7\xf1\xf8\x23\xf8\x54\x6c\x03\x7a\xb7\xd9\x06\x40\x95\x49\x87\x93\x07\x93\xf0\x52\xa7\x3b\x79\x59\xde\x5e\x0f\xfa\x93\x13\x97\xc2\x44\x30\x73\x96\x70\xc3\x5b\x78\x4a\x4e\x1b\x79\x4f\x66\x4c\x3f\xe0\x8f\x75\x51\x3e\x53\x46\xc4\x86\x52\xbf\xb2\x00\x5e\x23\x2e\xd0\x47\x92\x43\x32\xd6\xf3\xb0\x1f\x44\x3e\x8a\x91\x12\x24\xfd\x99\x40\x74\x55\xdc\x26\xdc\x43\x85\x9e\x3a\x26\x2c\x83\xbc\x26\xb7\x1b\x4e\xe3\xb3\x56\xd3\xc0\x6d\xe6\x0e\x85\xf3\xb7\x1a\x0f\x34\xfd\xd9\x96\xee\x31\x32\x96\xe4\x46\xcd\x4a\x80\x2f\x69\x98\x39\x60\x2d\x20\x20\xc0\xce\x00\x30\x17\x1b\x58\xba\x0a\x34\xe6\x5b\x47\x31\xd5\x04\x1e\xbd\xa9\x00\xa8\x76\x95\xe7\xad\xda\x7f\x4b\xa2\x1e\x09\x31\x77\xc7\x9d\xc3\x5f\xe3\xb2\xd7\x5a\x48\x50\xf4\x86\x90\x95\x32\xd7\x08\xb4\xb3\xb2\x11\x99\xfa\xec\xb6\x2b\x1a\xd5\xa1\x05\xf7\x01\x71\xa3\x41\xc7\x8c\x66\x6d\x42\x76\xae\xc8\x0a\xb1\x25\xb3\x71\x70\x86\xfa\x02\xaa\x4c\x74\xa8\xf4\x91\xc8\x31\xa8\xdc\xf7\x30\xb4\x08\xc3\xe2\xcd\xe7\xf7\x95\x20\xef\xe5\xb8\x6d\xee\x7a\x00\x1f\xc3\x05\xb5\xb7\x64\xdc\x31\x3a\xbf\xb9\x72\xb7\xaa\x33\x40\xc1\xe5\x6e\x7e\x23\xa9\xa9\x20\x8e\x8d\x44\x13\x38\x46\x82\x40\xb2\x8a\x8d\x6f\xb4\x41\xf9\x06\x7f\x0b\x90\x83\x34\x09\xb9\x72\x80\x9c\x6d\x89\x50\x48\x90\x84\xaf\x19\xfd\x39\x50\x0a\xdb\x8c\x5e\xc9\xe9\x1a\xd5\x12\x0a\x66\x98\xec\x1c\x38\x05\xb3\x4a\xfa\x14\x44\x8f\x87\x4a\x16\x01\xd9\x64\x91\xf4\xb2\xbd\x35\x55\x8b\x87\x3f\x00\x79\xd9\x74\x43\xb5\x3b\x83\xe8\x6c\xba\x2c\x15\x17\xf2\x2c\xd5\x42\xef\x99\xa4\xeb\x39\x16\xc9\x86\x2a\x02\x29\x48\x67\xb8\xa0\x73\x58\x1c\x33\xe9\x60\x79\xfa\x5d\x15\x79\x79\x30\x5f\x7c\xa0\xfe\x8e\x4e\xed\xbd\xfc\x2b\x35\x0a\x20\x76\x7c\xde\x30\x89\x6a\x6b\x5c\xfa\xf4\xed\xe5\xdd\x7d\x15\x3b\x1b\x50\x9d\xb4\x2e\x09\x3b\x58\x83\x90\xf5\x66\x6a\x84\x53\xb6\x72\x75\x97\xaa\xca\x11\x84\xa5\xe1\xf6\x8a\x8d\x1a\x83\xb2\x5c\x02\xb7\xa9\xe2\x00\x15\xef\x4d\x98\xb8\x62\xe8\x3d\xce\x49\xf6\x1e\x87\xca\x0e\xbc\xf0\x56\x42\x14\xd5\x5c\x6f\xc7\xe1\x9b\x99\x7b\x92\xfe\x7a\x37\xf4\x32\x5f\x92\x34\x25\xad\x0c\x40\x05\xe5\x14\x2b\xfd\x53\x90\x8c\x6c\x71\xbf\x6e\xe1\x1e\xcc\x2a\x48\xb7\x76\xd3\x9f\x53\x92\x65\x20\xf7\xaf\x7a\x2d\x3a\x46\xdc\x3d\x91\x85\x91\x0f\xcf\x09\x0c\x8e\x6e\xf2\x05\xc7\xe7\x06\x86\x97\xd4\xc8\x1b\x8c\xcf\x11\x0c\x82\xec\xcb\x1f\x8c\xca\x15\x0c\x42\x3d\x72\x1e\x61\xb5\xfe\x98\xe6\x28\xfe\xbc\x42\xf7\x7c\x21\x5a\x8a\xce\x37\x0c\x0e\xed\x9a\x4b\x1e\x90\x77\x18\xde\x22\x97\x93\x78\x40\xfe\xe1\x51\xf7\xde\x9f\x87\xd8\xc6\xfe\xc0\xb6\x8f\x2a\xbb\x33\x22\x3f\x31\xb8\xd6\x4a\x2f\x18\x9b\xa7\x18\x84\xda\xcd\x61\x1c\x93\xaf\x18\x04\xdd\x93\xcb\x18\x9b\xb7\x18\x84\x1b\xcc\x69\x1c\xc8\x5f\x3c\x2a\x35\x45\xe5\x36\xba\x27\xe2\x58\x0f\xd2\x9e\x8c\xf5\xec\x9c\x82\x33\xa7\x29\x15\xa7\x44\x02\xf1\x24\x1b\x2c\x70\xa2\x88\x80\xee\x0b\x46\x59\xf2\x0b\x9a\x26\x1a\xd9\x52\x83\x2b\x63\x5d\xf0\x54\x6f\xeb\x86\x8b\x83\x35\xef\xba\x26\xdf\xdc\x69\x3d\xf5\x4f\xe6\x97\x44\xeb\x28\x5e\x8c\x46\xdd\xf6\x50\x27\xf5\x23\x4f\xc3\x1c\x77\xef\x52\xae\x3f\xaa\x65\x96\x26\x02\x6d\xbf\x82\x5c\xbf\x11\xe6\xe3\x75\x38\xb7\xbd\xea\x36\x78\x3b\x3e\x39\x2a\x80\x32\x33\x95\x39\x4c\x65\xfe\x36\x44\x7c\x11\xbd\xe6\x22\xaf\x9d\x98\x56\x60\x5a\x2c\x30\x26\xba\x71\xb5\xc9\x8c\x75\xbe\x2a\x5f\xaa\x11\x68\xed\x7d\x0c\x17\x72\xc3\xd5\x45\x05\x38\xb8\x94\x76\x2b\xe0\x35\x04\xf9\x82\xe2\xea\xba\x02\x03\xd7\x28\x85\x20\x4c\x65\xbb\xbd\x31\xc2\xac\xc7\xcc\x0a\x5c\x7e\x75\x30\x06\x88\xb3\x56\x3a\x35\xf5\xbe\x89\xe9\xcf\x0c\x7a\x68\xb8\x94\xa6\xbe\x95\x2d\xa4\xbd\x89\x34\xc1\x42\x7e\x1f\xd8\x64\x4d\x0e\x41\x78\xf9\x88\x91\x47\x47\x7a\x7a\xa9\x00\xc8\x59\x74\x05\xb1\xe2\xa2\xb3\x85\xdb\xf7\x06\x3a\xc0\xb9\xfc\xa0\x46\xa7\x80\xd6\x22\xeb\x58\xe8\xfe\xd5\x04\xa1\xb7\x56\xda\x4c\x81\xb0\xdc\xdb\x25\x4e\x38\xb3\x8f\x2d\x7b\x1c\x84\x59\xaf\xd7\xee\x92\x29\xc6\x0d\x99\xc9\xa0\x95\x01\xa0\x52\x93\xc8\x0c\x3d\x12\x54\x64\x98\x0d\x35\x4f\x74\x4b\xcb\xf5\x11\x6e\x4c\xda\x65\xa9\xd8\xe9\x2d\xc9\x06\x6f\x29\x77\x4d\xdc\x82\x20\x9b\x28\xd4\x77\xb1\x49\x6a\x09\xdd\x53\xb1\x8d\x18\x71\x41\xbd\x99\x12\xcd\xa7\x6d\xeb\xb9\xb9\x32\xf9\x2c\x96\xd2\x4d\x36\x8f\xcb\x9b\x1f\x54\xbc\xdd\xb3\x24\x46\x34\xb1\x55\xd3\x4c\x60\x45\x13\x76\xbb\x76\xd6\x20\x96\x50\x2b\xe4\x14\x8c\x05\x7b\x9d\x5f\x12\xbd\x25\xe7\x37\x57\x66\xc6\x90\x75\x37\x08\x11\xb3\x9d\x2d\x09\xa9\x36\x54\xa4\xf3\x02\x43\xc4\x8e\xde\xcb\x59\x6b\xb6\x55\x3a\xee\x00\xc8\xe8\xfe\x38\x21\xc3\x88\x7b\x5a\xfb\xe2\xec\x23\x50\x88\xdb\x9a\xef\x2b\x45\x6f\x1f\xdb\xc7\x9a\x65\x4c\x1b\xcf\x6e\x04\xd6\x9e\x33\xf1\x85\x67\x19\xd3\x36\x73\x0e\xf8\x0e\xbe\x30\xd0\x53\x33\x4a\x2b\xf0\x16\x15\x68\x3e\xfb\x69\xe3\x75\x69\x01\x67\xa6\x6a\xd9\xca\xe3\x84\xf8\x97\x17\x35\x06\x6d\x81\x68\x04\x67\xf2\xd7\x3d\x68\x3e\xe3\x35\x67\x34\x86\xb8\x0f\xab\x8d\x30\x38\x7e\x27\xbf\xff\xeb\xd6\x49\xe8\xa2\x26\xa2\xdd\x6b\xa8\x7e\x42\xf3\xf9\xc2\x3b\x14\x55\x63\x61\x70\xf8\xbe\x1a\x0c\x83\xf5\x16\x06\xa1\x86\xea\x31\xf4\xd6\x5e\x18\x84\x78\xf4\xda\x0c\xcd\xe7\x2b\xd6\x69\x68\x3e\x91\x14\x19\xf5\x9a\xf4\x14\x09\x6c\x3e\xfb\xf1\xf2\x10\xf3\x0f\x56\x49\xc4\xb7\x44\x34\xcb\x9b\xbb\xae\x92\x81\xa6\x0b\xe6\x59\x52\x96\x52\xe6\x8d\xf7\x41\x23\xf8\x22\x98\xc8\x2e\xab\xea\x0f\xe3\x9a\x83\xef\x7f\xdc\x4e\xf5\x37\x4b\x75\x38\x1a\xa4\x0f\x7b\x1e\x72\xe3\x36\xb9\xdf\x90\xd6\x2f\x60\xec\x3d\xbf\xbe\x18\x16\x88\xa2\x7a\x9c\x7b\xf6\xc5\x4d\xb6\x39\xb4\x75\x11\xc5\x2e\x03\xb5\xb2\x8e\xa4\x35\x87\xce\x20\x4e\x7d\x67\x7c\x6f\x18\x3a\x68\x09\xac\x6c\x8a\x52\x04\x4c\x41\x32\x9b\x9f\x4a\xc0\x48\x5f\x1b\x5a\x87\xd0\x31\xae\x8b\x3a\xd2\xd0\x63\x5e\xdb\x43\xa0\x9e\x93\x6b\xb1\x01\x98\xd4\x3f\x54\x1e\xec\x11\xc8\x43\xa0\x45\xb8\x64\x98\xe1\xc5\xa1\x71\xdc\x5d\x3f\x0e\xf7\x07\x2c\xb3\xda\xb6\x86\xe8\x04\x1b\x7b\x2a\xcd\x16\xe9\x53\xe0\x2b\x09\xd0\x33\x71\x0e\x94\x05\xa7\xc5\x39\x58\x3f\xe3\x8c\xa6\xd5\x40\x86\xee\xaf\x98\xaf\xd4\xef\xfe\x73\xcd\xd5\x15\x9b\xa1\xcb\x27\xea\x4a\x46\x5d\x70\x22\xaf\xb9\x82\x5f\x5e\x04\x9d\x66\xe2\x07\x20\xd3\x3a\x0a\x8c\x1b\x0a\xac\x3b\x0d\x77\x42\x2c\x71\x9b\xc7\xda\x06\xaa\xed\xa1\x52\x6b\xdb\x5c\x38\x7c\x54\x01\x78\x72\xb0\xa3\x7c\xf3\x71\xfa\x1e\xe3\x6c\x0e\x11\x12\x8b\xbe\x91\x0c\xb2\x23\x41\x72\xd1\xda\x91\xee\xd4\xaa\x41\xcd\x80\x91\x60\xc1\x96\x65\xbe\x07\xdd\x11\x22\xca\x52\x94\x96\xc2\x74\xd3\x95\x4a\x60\x45\xd6\x34\x41\x39\x11\x81\x48\xdd\xf6\x53\x68\xfe\x1e\x37\x85\x48\xae\x6b\x9e\x91\x14\x16\x67\x01\x74\x4f\x8c\x76\x66\x9e\xb9\x3e\xb9\x11\x6f\xb9\xcd\x8e\x14\x33\x23\xa4\xdd\xf8\x15\xc1\x15\xfb\xfd\xa0\xcb\x0f\x7d\x71\xd1\xb8\x31\x31\x73\x43\xe6\xc6\x1d\xf8\x9f\xfa\x9a\x03\x82\xfe\x6f\x54\x60\xea\xcb\xab\x69\x3e\xe7\xae\x98\x5d\xf3\x5b\x6b\x63\x69\x0e\xa3\x47\xa0\x12\xe9\xfd\xdd\xe2\xcc\x57\xfa\xb2\xb5\x38\x10\x58\x89\x6d\x01\xcd\x57\x1d\x89\x65\x86\x1e\x37\x5c\x9a\x3b\x15\x4c\xc1\x83\x20\xa9\x44\x27\x0f\x64\x77\x32\xeb\xf0\x81\x93\x2b\x76\x52\xd7\x7c\x1a\xc5\x6e\x2a\x69\x01\xac\xbc\x27\xf0\xed\xc9\x73\x84\xa0\xa3\x4a\xb9\x46\x45\xf7\x16\x94\x6c\x3e\x3d\x5e\x48\x17\xdc\xdd\x80\x52\xfb\x15\x5d\x2a\x61\x86\x69\x20\x30\x13\x1d\x1e\xed\xda\x63\x57\x80\x52\x97\x61\xdf\x45\xd4\xa1\x70\xbd\x8c\xd2\x78\x8c\xd4\x9f\x54\x8e\xb2\xc7\x66\x74\xac\x35\xa8\xd0\x81\xaa\xb1\xee\x69\x61\xaf\x4e\x05\xfc\x50\xf5\x42\x82\x76\x92\xb9\x49\x78\x7b\xb4\xad\x65\xc2\xce\x06\x96\x64\x65\x6a\xa2\x92\x01\x2c\x28\x82\xe3\xda\x9d\x8d\x46\xe1\x28\xa2\xfa\x5c\x7d\xe2\x04\x4e\xab\x0d\xd5\x66\xbe\xa1\x2c\x6a\xfd\xdc\xec\x75\xe8\x82\x10\x64\x13\xf1\x05\x2d\x59\x07\xe8\xf1\x28\x9e\x55\xe8\xb5\x18\xe9\x5b\x35\x7d\x19\xf7\x2c\x76\xd6\x9f\x04\xc7\x42\xe4\x46\x45\x36\x50\xbd\x53\xdf\x6b\x4f\xe6\x28\xce\x92\xd0\xad\x6b\x88\xf3\x4b\xf2\xb2\xda\xea\x7c\x87\x38\x59\x6b\xa2\x21\x10\xb0\xba\xc1\xfd\x21\x92\xff\x62\xce\xd6\x04\x17\x38\xa1\xbe\x66\x93\xe6\xf9\x32\x41\x48\xb7\xed\x03\x61\xb7\xb2\x36\xb2\xd9\xcb\xc7\x74\x33\xd8\x0d\x89\x38\xdb\xc8\x7e\x54\x03\x17\x66\xc2\x99\x59\x7b\x3c\x75\xbe\xb7\x27\xf9\xbd\xfb\x54\xcf\xdc\x77\x4c\x83\x6b\x80\x84\x65\xb7\xda\x1e\x10\x90\x88\x66\x83\x78\xe8\xcf\x04\x84\x95\x70\xec\x8b\x46\x60\x3d\x2f\xe7\xe3\xb4\xfd\x23\x4e\x6f\x01\xcc\x9d\x69\x3d\x1d\x6c\xee\x16\x41\xa3\xed\xda\xd4\x7d\x4d\x14\xeb\x89\x98\x33\x9c\x49\x94\x12\xf8\xdf\x21\xe9\x78\xc9\x4b\x05\x3c\x17\xee\xc8\x62\x9b\x0c\xf9\x48\x23\x45\xe8\x0c\x4b\x75\x23\xf8\x92\xdc\xd3\x61\xd7\xd5\x7e\xd1\x18\x2c\x95\xe9\x06\xfe\x08\x9e\xed\x25\xa9\xfa\xd6\x9a\x55\x0e\x0b\xcf\xae\x02\x45\x8a\x15\x99\x7b\xeb\x88\x35\x9f\x11\x12\xbf\x5e\xdb\xbd\xc0\x4c\xc2\x64\x9e\xb5\xc0\xd6\xb2\x90\xaa\x80\x46\x58\x8e\x91\x89\x96\xe6\x8c\xb8\xfe\xc4\x20\xd7\x83\x5d\xfa\x2b\x23\xc8\xb6\x1f\x1e\x89\x95\xbf\x94\x39\x66\x73\x41\x70\x0a\x91\xa9\xae\x87\x31\x35\x65\xe8\xa0\xeb\x53\x14\x4d\xa3\x8a\xae\xa1\xa5\x72\x8d\xd4\x61\xac\x8c\x58\xa3\x20\x58\x86\xbb\x2c\xf6\x2c\xf1\x07\x88\x39\x9c\x19\x71\xaa\x0e\xbb\xc5\xfa\xbf\x85\x9a\xa1\x1c\x27\x1b\xca\x62\x0c\x11\xc0\xcd\xa4\xc2\xcc\x20\xcb\xda\x87\xc0\xb6\xb8\xa6\x5b\x6b\x13\x35\x73\x1c\x34\x9c\x9b\xa7\x22\xc3\x53\xd9\x41\x9c\xe6\x9f\x54\xd9\x08\x0e\x89\x4e\x5a\xec\xad\xaf\xb8\xe4\xfe\x63\x22\xa0\x6d\x06\x0f\x89\xe3\xc5\x51\x06\x60\xe0\xd6\x47\xdd\xd8\xb0\x00\x7a\x10\xc8\x50\x19\xa7\xfa\x19\xc1\xe6\x6d\xb9\xa7\x98\x83\x60\x4a\x14\xd6\x89\xb6\x61\xc0\x0b\x0d\xf9\x78\x4b\x8f\xb3\x3a\xcd\xd1\x80\x78\x6e\x5e\x52\x43\x53\x1b\xa5\xde\x87\x65\xb9\x62\x83\x65\xbc\xf6\x75\xa3\xdf\xf6\xa9\x21\x00\xca\x8b\xf9\x97\x55\xa7\x0e\x49\x62\x57\x78\x1d\xae\x38\x8e\xd7\x5f\x24\x0d\xdc\x65\x94\x69\x15\xdb\xa4\x67\x23\xba\x82\xd1\x47\xa6\x63\x2b\x9e\xd9\xb0\xe9\x70\x65\xee\x76\x16\xb2\x2d\xfb\x74\x2a\x9b\xdf\x47\x96\xb5\xee\x94\xa1\x28\x78\x6a\x78\xfe\x7d\x05\x0b\xec\x06\x4a\xe1\x64\x63\x23\x00\xcd\x5f\x20\x78\xad\x8f\x2e\x35\x7e\x95\xcb\x24\x51\xc9\xc6\xb2\x78\x25\x68\x91\x11\xf4\xc7\xca\x46\x38\x23\xab\x15\x49\xd4\xbf\x35\x3a\x5d\xc2\xfb\xfd\x34\x54\x59\xea\xfe\xe8\xfe\xab\x53\xba\x7b\x48\xea\x33\xe3\x45\x94\xa8\xba\x84\x17\xdd\x7d\xee\xe6\x0f\xcb\x32\x30\xa0\x99\x35\x18\xd7\x4d\x3e\xab\x87\xe6\xcd\x35\x62\xb2\x18\x70\x96\xb5\x40\x48\xdb\x2c\xb8\xb1\x91\x36\xea\xc3\x9a\x1e\x3d\x30\xb1\x20\xe8\x9a\xdf\xd9\xc6\x72\x33\x74\x03\x66\x93\xfa\x17\x30\x60\x5e\xf3\xcb\x27\x92\x94\xbe\xcc\xf3\x81\xe3\xea\x75\x21\xb6\xc3\xcb\x6a\x97\xa1\x59\x57\xcb\x65\x58\x93\xa2\x73\x07\xfa\xf8\x02\xb7\x38\xf4\x60\xeb\x81\xec\x64\xe5\xb6\xb1\x6e\x4a\x70\xad\xcc\x86\xec\xfa\xce\x11\x63\xfc\x3b\xff\xdb\x5a\x86\x78\xbe\xa4\xcc\x4c\xac\x4a\x38\xaf\xc7\x74\x56\x5f\x6f\xe8\x97\x7e\x09\xa6\x74\x08\x62\xc3\x9e\xcb\x16\x76\x3f\x45\x7a\x2a\x5b\x7c\xc9\xc7\xa2\xfb\x7c\x92\x0d\x17\xe3\xe5\x3f\x4a\x9c\xb5\xab\xc4\xd8\x9f\x82\xae\xb1\x96\x29\x1f\xba\x1c\xd1\x2c\x4d\xb0\x30\x69\x19\x36\x57\xd5\xf5\xcd\x34\x29\x00\x09\xc4\xcb\x1a\xf6\x11\x40\x30\xec\xbc\x6d\xc6\x50\x60\xa1\x68\x02\x4d\x2e\x6c\x56\x91\xc7\xa9\x36\x94\xe2\x5c\x11\xe4\x9d\xe9\x77\x11\xb1\x09\xf7\xfb\xdf\xec\xdf\x9c\x05\x11\x94\xa7\x60\xa5\xb0\x3a\x92\x97\xca\xab\xe3\xf0\xca\x26\x89\x5b\xea\xe4\x2b\xc7\x53\xaa\x43\xdb\x0a\xd9\xf1\x67\x21\x57\x85\x69\xec\xa5\xf3\xba\xc1\x99\xab\x53\xb9\x40\x7f\xda\xb9\xa8\x22\x88\x30\x32\x81\xb4\x1e\x90\x50\xde\xbd\x5d\x8d\xc1\x40\x6c\x1c\xf3\x15\x17\x64\x4b\x04\x7a\x95\x72\x08\xc9\x25\x5b\x9a\xf8\xbb\x44\xff\x5f\x44\x70\x20\x32\x46\xd6\x58\xd1\x6d\xe5\x58\x71\x76\x08\xe5\xe2\xb4\x25\x7a\x83\x5e\x01\x30\x44\xf3\x9c\xa4\x14\x2b\x92\xed\x7c\x05\xbf\xac\xe9\xdc\x98\xc9\xfb\x07\x7f\x7e\x6d\xc7\x40\x21\xbf\x9e\x22\x7e\x2d\x66\x68\xe4\x84\x3d\x4e\x58\x5d\x87\xde\xc0\x08\xaf\x7b\xba\x55\x6a\xb9\x52\xc7\x1c\x23\x1c\xe8\x74\xfe\x1f\x9a\xd6\x70\xd5\x2c\xc6\x9c\x91\x03\x4e\xd1\x01\xdd\x7a\xb7\xfd\xd9\xf9\x6d\xf4\x59\xf9\xc9\xf8\x42\xa0\xbb\x57\x63\x8d\xbe\xce\xa9\x3d\x73\x74\xee\x99\x92\x0d\xb4\x36\xf9\xdc\x78\xd1\x5c\xbb\x72\x2f\x25\x4c\xf3\x9e\xca\x02\xda\x7a\xbf\x83\x15\x3b\x73\x5e\xaa\xa2\x54\xcd\x8a\x06\xad\xbc\xb2\xd6\x90\x75\x5c\x7a\x6f\xaf\x08\x53\x5f\xda\xa4\xb8\x29\x6e\xe3\xcd\x5b\x00\xac\x77\x15\xf7\x8a\xb6\xb3\xfe\xa8\x24\xcd\xf5\x6d\x62\x9e\x4d\x6d\xd0\x5a\x69\x99\x99\xbe\x2e\xc6\x8a\x0d\x39\x60\x9e\xfc\xcc\x18\x11\xb2\x31\xc9\x46\xc8\x25\x36\x9d\x59\x20\x3d\x57\xf3\xf4\xcf\x2e\x5d\xc3\x24\x34\xf6\x10\x62\xa0\x9e\x6b\x58\xc6\xab\x7a\x85\x47\x1c\xdb\xfd\xfe\xfa\xb5\x6e\x80\x55\xa3\xc1\x7e\x2b\x4a\xda\xc7\x8e\x1a\xad\xe4\x4d\x1d\x1a\xcd\x1a\x2d\x40\x74\xfa\xce\x63\x58\x1d\xb8\xb3\xcc\x62\x6c\x2f\x5b\x6f\x8d\x8b\xb6\x5b\x7f\xef\x13\x94\x12\x45\x44\x0e\xae\xca\x0d\x7f\x34\x7f\x37\x12\x40\xdd\x24\xd7\x77\xc1\xb8\x1a\x07\x1b\x2e\x95\x0d\x70\x74\x08\xb2\x5e\x72\x43\x9a\x8f\x78\x87\xb0\xe0\x25\x4b\xad\x50\x3b\x70\xc3\x7c\xdc\x9b\xe4\x35\x67\xc4\xf6\x73\xea\x54\x55\x04\x7f\x25\x65\xe8\xed\xe2\xed\x9b\x83\x90\xe8\xcf\x48\xe8\x66\x93\xed\x75\xd7\xaa\xab\xc3\x7e\x0e\x78\x16\x06\xc6\x17\x04\xa7\x9f\x58\x16\x23\x52\x7f\xb4\xfd\x8b\x84\x73\xe3\x41\xf0\x2f\xf4\xa2\x80\x9f\x1e\x05\x55\xa4\x21\x1c\xbc\x82\x1e\x0f\x1e\x4c\x73\xd1\xac\xd5\xf7\xba\x2d\xdf\xc1\x87\xa1\xe5\xf8\xfa\x24\x20\x24\xcb\xe5\x81\xe7\xcb\x1e\x24\x20\xab\xfa\x78\x35\x8a\xaf\x7a\x56\xd2\x4e\x53\x68\x1e\xb5\xe6\x92\x4e\x4e\xd0\x2b\xf3\xa6\x16\x91\x39\xf7\xc9\x24\x03\xdb\x65\x97\x77\xf9\x54\xc4\x88\xe9\x97\x4f\x05\x06\x36\x5d\xbc\xf8\x5a\xff\x44\x36\x78\x4b\x24\x92\xa6\xe8\x5c\x06\x75\x82\xef\xcc\x6c\xa1\xee\x1c\x61\x5b\x2a\x38\xcb\xfd\x81\x35\x5b\x2c\x28\x18\x61\x2b\x57\xbb\x44\xbf\x7e\xf5\xf9\xfc\xf6\xa7\xeb\xf3\x8f\x97\xaf\x81\x2b\x10\xb7\xa2\x5a\x2b\x1f\x9e\x75\x63\xe8\xc1\x4d\x71\x73\xd6\x18\x0e\x28\x5a\x6e\x65\xd0\xd7\xab\xb4\x8d\x41\xc9\x93\x96\x0f\xe8\xf6\x90\x93\xe8\xb7\xf0\xcd\xeb\x5b\xa3\xe7\x6f\xbd\x69\x3e\x87\x48\x42\xc6\x29\x1c\x21\x97\x44\x89\x24\x2e\xee\xdc\x48\x1f\x5d\xa1\x24\x46\x1a\xd9\x17\x44\x9a\x82\x47\x9f\x01\xcc\x70\xfb\x2a\xe2\x1d\xf4\xba\x2f\x26\x54\xb4\x35\x61\x53\xbd\xd7\xd9\xe1\x6d\xad\xae\x66\xf9\x92\x1e\x02\x31\xee\x78\x9b\x92\xde\x2c\x1a\xef\xc4\xa9\x82\xf7\x18\xe8\xc3\xf2\x06\x7e\x94\x97\x19\x96\x8a\x26\x7f\xca\x78\xf2\xa0\x57\x1c\x73\xdb\x9c\x9e\xff\x78\xd7\xf9\xae\xb5\x42\x86\xce\x7f\xbc\x43\x17\x54\x3e\x0c\xa5\x50\xba\xce\x9c\x4d\x1b\x1d\x46\x0f\xa6\x71\xd1\xe9\xa9\x34\xd7\xb7\x75\xd8\xb8\x9b\x9b\xe9\x83\xce\xa5\xf7\xee\xb7\x66\x05\x28\x80\xf6\xcc\x52\x79\xf8\x51\x12\xb3\xd4\xa5\x5e\x2a\xa4\x12\xf7\xc7\x42\x0c\x3b\x6d\x57\xf2\x3e\xe8\xa1\x68\x23\xb9\x11\x48\xe5\x22\xb4\x1a\xbc\x19\xf0\xb6\xe3\x25\x7a\xc4\xc1\x50\x44\xc5\x0d\x7f\x58\xa0\x7b\x5a\xbc\x43\x97\x8d\x7e\x4e\xa6\x47\x42\x7b\x10\x2a\xeb\x34\xef\x00\x54\xab\xc0\xc2\xde\x18\x75\x0f\x5a\x4a\x1b\x7d\x16\x5d\x9a\xe6\x8f\xf2\x1d\x3a\x21\x4f\xea\x77\x27\x33\x74\xf2\xb4\x92\xfa\x7f\x98\x5a\xc9\x93\x90\x2d\xfe\x2a\xaf\x92\x80\xa0\x5e\x95\xcd\xdb\x5e\x12\x0b\xaa\x5b\xc4\x37\xdc\xac\xdd\x3c\xc7\xda\xf8\xc0\x10\xf7\x9f\x2e\x3e\xbd\x03\x21\x35\xe5\xc6\x9f\x0e\x89\xd7\x88\x08\xc1\x45\xa5\xf2\x34\xd0\x0d\x97\x6b\xc2\xf3\x42\xf0\x9c\xca\x81\xb0\x18\xb0\x2e\xc3\x11\xf0\xc7\xe1\x44\xb8\x31\xc0\x1c\xe5\x97\xc5\x51\xb7\x70\xa3\x3e\x45\xee\x23\xd4\x96\x0e\x5a\x14\x18\x4e\x24\xb7\x14\x78\xb5\x72\xe9\x65\x33\x57\x8d\xd5\xd5\x1f\x74\x64\xaa\x29\xcb\xc2\xd7\x4c\x32\x44\x2a\x35\x95\x7d\xe0\x8e\xaf\xa3\xb3\x94\x6c\xcf\x64\x8a\xdf\xce\x60\x6a\x86\x50\x6c\xcb\x43\xb7\x8e\x00\x4c\x2c\xd1\xc9\xdb\x93\xaa\x36\x6e\xb6\x9b\x35\x57\x5c\x63\x62\xc5\x45\x35\x54\xd8\x41\x78\xf2\xe6\x04\xbd\xe2\x02\x66\x93\x60\x86\x32\x82\xb7\xc4\xd5\x12\x30\x1d\x13\xc0\x0e\xf2\x7a\xe1\xdf\xd9\x50\xcb\xef\xfa\x19\xb2\x07\xa1\x41\x71\x1e\xf5\x56\x55\xd1\xf8\x3b\xd1\x72\xfc\x09\xc8\xde\x5c\x24\xae\x20\x92\x61\x21\xb7\x16\x66\x00\x09\xd5\x52\x29\x6b\x5b\x02\xb4\x90\x05\xa0\xbd\xc4\x11\x80\x4a\x25\x3a\x01\x55\xe0\xe4\x0b\x72\x79\x14\xa1\x64\xa0\x4a\x60\xba\xba\x88\xc5\xb4\x09\x59\x40\x57\x17\x8e\xcf\x37\x1c\xf6\x69\xf3\x1e\xf5\x35\xb1\x31\x8f\xbe\x76\x5f\x9d\xe7\xf8\x67\xce\xd0\xe5\x9f\xee\xec\x34\x5e\x7f\x15\x04\x3d\xa3\xc9\x87\xc3\x5e\x40\x50\xf6\x3a\x63\xf1\xcf\xa5\x20\x5a\xf4\x88\x90\x64\xce\xdd\xbb\xfb\xd2\x8b\xfe\x1d\x5d\x60\x85\x8d\x10\x63\xb3\xa1\x7d\x98\xaf\xee\x42\x7d\x2e\x96\x50\xac\xc1\x16\x11\xf7\x4b\x66\x28\x4a\x64\x48\x80\xeb\xaf\xc3\x71\xde\x6d\x4a\xfa\x8b\x9e\xc8\x7b\xf3\x1d\x04\x94\xbe\x43\xd7\x9c\x91\x19\x1c\x54\xa4\x4f\xaa\xfd\xcf\x1f\xb5\x42\x1e\x60\x3b\x11\x17\x8a\xa6\xcc\x70\x00\x75\xc7\x47\xdb\x0c\xcb\x87\x8a\x22\x40\xdd\xf6\x6a\x59\x66\x7c\xe9\x42\xfe\x9f\x3b\xaf\x1f\x6e\xaf\x46\x4c\xeb\x87\xdb\xab\x97\x9d\xd2\x28\xe1\x6f\x5f\xf6\xab\xa5\xb8\xaa\x4c\x74\x43\x96\x08\x49\x0e\xfa\xeb\xba\x70\xcf\x90\xdc\xb6\x70\x12\x5b\xe8\x46\x6b\xc9\x72\xa3\x25\xb6\xe7\xe0\x30\x5c\x45\x64\xaf\x80\xfa\x53\x41\x12\x55\x39\xa4\xd1\xdd\x06\x6b\x86\x83\xf2\x32\x53\xe0\xcb\x87\x8d\xd5\x3b\x1d\xba\xbe\x0b\x22\xaa\x3a\xd5\xd8\xb6\x06\x40\x17\xc4\xb8\xd6\xd3\x77\x2e\x77\xa8\x82\xd5\xfc\x20\x24\x67\x38\x50\x1f\xc1\xfc\x9d\xbe\x33\x5c\x0b\x19\x6b\x78\xda\xa0\xc2\x57\xc6\x92\xc6\xdc\x9f\x42\x40\xb7\x98\x66\x78\x49\x33\xaa\x76\xfa\x76\x7e\xbd\x68\x65\xe4\x4b\x40\xc0\xb3\x8e\xfb\x48\xf1\xa1\x63\xb3\x43\xaf\x34\x84\x33\xb0\x04\xbe\x5e\x54\x92\x43\xb8\xf4\xb5\xad\x6c\x64\x04\x8f\xa6\xc0\xe1\xda\x2a\xed\x4b\x15\x43\x24\x16\xba\xb8\x87\x2e\x26\xc7\xf0\x02\x7f\xfe\xe1\xf6\xea\xe0\x6b\x4b\x9f\xfb\xd8\x6b\x4b\xbf\xdb\x7b\x6d\xc1\x1f\x6c\x3b\x0b\x14\xaa\x11\x61\x7d\x3f\x2f\x73\x73\xfd\xeb\xd3\x0a\x34\xc9\x17\xa4\xb7\x01\x89\x67\x95\xcd\x3a\x41\xe6\xe3\xbd\x84\x7d\xb3\x83\x77\x83\x0c\xc4\xb5\x29\x81\xdb\x54\xef\xdd\x5f\x03\xc9\xa4\x11\x27\x1b\x98\xc3\x88\x85\x00\x37\x45\xc1\xe6\x30\xcf\x16\x02\x6b\xec\xfa\x5e\x70\x93\x3e\xe4\xbc\x25\xa4\xd8\xac\x62\xe2\x28\xde\x93\x62\xf3\xe1\xae\x6d\xc0\xd3\xbf\xa1\x0f\x77\x95\x5c\xd8\x70\x34\xf9\x4b\x2a\xc0\x74\xa5\x31\xf6\x9d\x4a\x94\xd1\x15\xf1\x46\x84\x0f\x9f\xaf\x9c\x33\xaa\xb8\x08\x44\xd0\x76\x8b\xc9\x00\xb6\xd1\x47\xfb\xa5\x49\xa9\x4b\x78\x96\x91\xc4\xd9\x68\x61\x61\x0e\x74\x80\xfe\x7a\xd4\x09\x62\xf5\x71\x57\xc3\xdb\xb5\xfa\x30\x88\x3e\xbb\xbd\x3c\xbf\xf8\x78\xb9\xc8\xd3\xef\x36\xfc\x71\xae\xf8\xbc\x94\x64\x4e\x95\xff\x3e\x1a\xcc\xd8\x88\x0a\x8f\x1d\x8e\x42\x2d\xbc\xfe\xa0\x2e\x12\x4d\x17\x40\x9c\x41\x57\x55\xb0\x18\x83\x69\xc6\x79\xbe\x38\x57\x33\x24\xb0\xad\xb0\xe6\x65\x1b\xc8\xaa\x0c\xab\x32\xcb\x0c\xc6\x95\x20\x64\xd6\xb4\x87\x04\x2a\xc9\x1c\xff\x9e\x6e\x2c\x2b\x96\x0d\x87\x8c\x6d\x44\x90\xd1\x6c\x38\xdc\x53\x02\xbd\x30\xa9\xc5\xf3\x7a\xff\x05\x1d\xc2\xea\x5d\xf5\xad\x8b\xb3\x01\x8f\x9b\xe2\x10\x13\x38\x10\xde\xbd\xe2\x02\xfa\xab\xb5\xe9\x83\xa8\x04\x96\x0b\xe5\x79\x17\xf6\x2e\xf9\x02\xa7\x32\xe6\x2e\x81\xc9\xdc\x92\xd5\xa1\x88\xba\x25\x2b\x93\x85\xdc\x4e\xa9\x85\x1a\xbc\x84\x29\x5b\x41\x3b\x80\x32\x8b\x8e\x5e\xcc\xd9\x52\x1a\x5f\x00\x55\x71\x59\x5c\xc3\x35\x07\xfd\x69\xed\x16\x43\x6a\xb4\x79\x87\x6f\xb5\x78\x48\x1e\xcf\x1e\xb9\x78\xa0\x6c\x3d\x7f\xa4\x6a\x33\xb7\x5e\xae\x33\x28\xed\x7c\x66\x2a\x3c\x07\x67\xe6\xcc\xde\xe7\x69\x6a\xdd\x6b\xa5\x24\xab\x32\x33\x01\x10\x72\xd1\xe8\x70\x32\x03\xe5\x6d\x86\x4a\x9a\xfe\x7b\xb8\x4a\xd6\x08\xb6\x1e\xcc\x41\x08\x35\xc8\x0e\xf2\x75\xe1\x0e\xa9\xc0\x29\x97\xa6\xdf\xa0\xc6\xc5\x2c\xce\x26\x89\xd3\x9c\xb2\x6f\xe2\x28\x0e\x09\x58\xc1\x7b\x7e\x48\x7c\xa2\x2c\xf5\xe1\xb7\x8d\xdb\xf7\xf0\x66\x5b\x7e\x32\x5f\xd7\xa5\x78\xad\xef\x0f\x3b\xfd\xc3\xab\xe7\x72\xe6\x7c\x83\x6d\xcf\x60\xd4\x81\xce\x77\xf2\x1f\xd9\xdc\x8c\x3d\x2f\xd2\x1a\xe3\x5f\xc7\xa1\xf7\xa5\x8c\x3a\x7b\xce\xb8\xaf\x60\xda\x89\x92\x17\x47\xee\x0e\x9a\x44\xa1\xa3\x62\x31\x46\xfa\x39\xe8\x4e\x87\x06\x43\xd2\x95\x1b\x83\x8b\xd9\x76\x2a\xb2\x5a\x6f\x58\xfc\xa9\x3a\xab\xcb\xaa\x5b\x47\xc2\x19\xb3\x79\x2c\x9f\x0a\xc2\xee\x14\x4e\x1e\x02\x76\xec\xe9\x1e\xfe\xaa\xf7\xf0\x58\x4f\x98\x0b\x8b\x49\xab\xfd\xb6\x6d\x27\x76\x4d\x5f\x2c\x65\xf6\x12\xf9\x06\xb9\xce\x4b\x7a\xb7\x4c\x54\xd5\x47\xec\xa9\x72\xde\xb6\x5c\xb8\x77\xf7\x2e\xdf\xea\x67\xb0\x3d\xd9\x68\xbd\x82\x17\x65\xe6\xcf\x6c\x81\xfc\x23\x33\xf1\x03\x2f\x4b\x2b\x3c\x8d\x71\x65\xd5\x4c\x24\xe7\x29\x41\x4b\xaa\xaa\x16\x9b\x9c\x55\x45\xf2\xe1\xce\x0c\x50\xc1\xb2\xca\x21\x69\xde\xb4\xed\xa6\x8c\x6f\x40\xf6\x78\xf3\x3f\xff\xe7\xff\x0c\x64\x51\x36\xb0\xc1\xd1\x9b\xdf\xff\xee\xff\x63\xef\xda\x7a\xe3\x36\xb2\xf4\xfb\xfc\x8a\x42\xe6\x41\x36\xa0\x96\x93\xd9\x20\x18\x18\x83\x01\x64\xc9\xce\x0a\xe3\x38\x1a\xcb\x49\x1e\x16\x8b\x41\x35\x59\x52\xd7\x88\xcd\x62\x58\xa4\x64\xed\xaf\x5f\xd4\x39\x75\x23\x9b\xac\x4b\x77\x4b\xb2\x27\xcd\x97\xc4\xad\xe6\xe9\xba\x9e\x3a\x75\x2e\xdf\xf7\xfd\x09\x39\xd7\x8c\xa1\x9c\x49\x3f\x81\xb2\x31\xc9\x7f\xb5\xe8\x08\x85\x0a\x99\x30\x5d\xbb\x1e\x60\x7d\x26\xe8\x34\xe2\x35\xbf\x59\x19\xc8\x77\x35\x69\x15\x2f\x3a\x24\xbd\xc2\x4d\x2e\x60\x78\x82\xed\x84\x2c\x37\x5d\xf5\xa7\xf3\x4f\x60\x2c\x8f\x49\xc5\x6f\x19\xb9\x96\x00\xf9\xee\x80\xc3\x30\xfd\x2d\x20\x11\x49\x95\x74\x03\xdc\xac\x48\xd6\x3d\x49\x02\x43\xc4\x29\x34\x2e\x34\xf5\xac\x93\x63\xc2\x68\xb1\x52\x17\xee\x05\x4e\x7d\x43\xb9\xcd\x9d\x3b\xa7\xdd\x3c\x29\x8c\x29\x56\x1a\x2a\xfb\x82\x95\xde\x06\x33\x09\x88\x4d\x2b\xfe\x8d\x93\xcd\xeb\x60\x4a\x8c\xcf\x44\x21\xb5\xe1\xa7\xe1\xe0\x6a\x0f\x5e\xca\xc0\xad\xaa\xa3\x12\xe1\x60\x63\x32\x11\xe8\x78\xb3\xc8\xb6\xe2\x40\x68\x03\x4c\x59\x1b\xad\x0d\x9a\x1b\xfa\xf6\xed\xb2\x2d\xd5\xea\x96\xb8\x66\xfa\x7a\x43\x2e\x52\x58\x84\x4e\x74\x54\x45\xd0\x48\x6a\xaa\x22\xbd\x5c\x4e\x48\x38\xd6\x94\x09\xfa\xbb\x7a\x9e\x02\x42\xed\x54\x0c\x32\x76\x24\xeb\x7a\x3d\x39\x90\x88\xa5\xda\xcb\xa4\xd4\xa5\x64\x6b\xda\xde\x06\xfb\x2e\xb4\xfe\x39\x81\x6c\x70\x69\xcb\xde\xb0\x86\xf1\x8e\x59\x32\x4b\xbf\x5e\x22\xdc\xce\xa3\x93\x93\x23\x54\x0f\xa2\x25\xb2\xa3\xad\xde\xd1\xea\xf3\xf9\xa3\x2c\xea\x0b\x1d\x66\xe2\xd3\xc6\x23\x96\x84\xca\x56\x01\xc5\x88\x2e\xcb\x9b\x26\xc0\x0d\xa5\xa2\xd0\x24\x80\xf6\x6e\x84\xdb\x75\xa3\xf4\x02\xdc\x1b\xcd\xc4\x3a\x82\x87\xb7\xd1\x96\xc8\x11\x83\x6c\x99\xbc\x62\x71\x08\xdc\x75\xc2\xc9\x72\x71\x3d\xe2\x01\x89\x4a\xf5\xd6\xb2\x77\x7e\x0e\xd8\xca\x47\x87\x45\x54\x64\xf8\x30\x99\x3c\x32\xe2\x9d\x8f\x1e\x29\x9b\x07\x47\x54\x68\xc2\xc1\x82\x4f\xda\xf1\x82\x4f\xca\x21\x83\x4f\x38\x2e\x80\xcf\xc6\xba\xb6\x9a\x01\xb7\xf8\xb5\x3b\x75\xa1\x52\xbb\x49\x22\x7e\xc1\xcd\x71\x02\x2c\x82\x9a\x10\x88\xd6\x84\x2e\xa5\xa8\xfa\x0e\x45\xbb\x3f\x6a\xb5\x93\xb4\x92\xa0\x51\x06\x90\x14\x34\x8e\x15\xe3\xa9\x22\x50\xf6\x69\xf0\xb8\x61\xad\xa5\x7f\x78\xaf\xbc\x26\x41\xcc\xdc\x05\xf4\x30\x1a\x32\x8a\x40\x97\xc4\x43\x46\xe1\xbb\xe2\x97\x7a\x4f\xdc\xf3\x1d\x31\x61\x5e\xcd\xf9\x99\x1a\x54\xd6\xd9\xa6\xf7\x2b\xa6\x43\x68\xcc\x33\xb1\x44\x4b\x94\x42\x00\x43\x43\x29\xdb\x90\xc5\x6f\x10\x4e\xe7\x0f\xf7\xb8\xd3\x23\x76\x11\x93\x3c\xe5\x0a\x76\x75\x41\x5e\x9c\xd9\x52\x0d\x1d\xd8\x27\x17\x75\xc7\xda\x6b\x5a\xb0\x97\xfe\xd5\x2c\x9c\x37\x64\x2a\x25\x56\xb4\x2e\x2b\x53\x07\xe2\x08\x6e\xd5\x2f\x95\x2d\x87\xe2\xf6\x53\x9f\x0f\x6e\xa6\x92\x2c\xe1\xc2\x06\xd2\x52\xf3\x37\xf0\xa7\x47\x5c\x48\x30\x83\xae\x61\xd0\x05\x6c\x7f\xd8\x8e\xb5\x77\xcd\x13\xb5\x00\xe0\xfc\x00\xd5\xf4\x20\xfa\x56\x3b\xd8\x0d\x45\x57\x21\x5a\x75\x05\x8b\x11\x1a\x51\x49\x5a\x76\xa3\x6c\xd5\x16\x01\x66\xbd\x7a\xed\x9d\x72\xd2\xf6\x94\xd7\xe7\xe5\xde\x69\x37\x6c\xc8\x4f\x6b\x1c\xb4\xd7\xda\x48\x16\x77\xbc\x34\x86\x3e\x04\xb8\xb4\x11\xc2\x25\x69\xa8\x94\x96\xfc\x2e\x38\x40\x52\x14\x1c\x2e\xd4\xde\x8c\xa1\x31\x0e\xe6\x86\xad\xc5\x1d\xe4\xee\xa7\x39\xac\x05\xe0\xa8\x04\x00\xe5\x13\x06\xba\x16\x25\xbb\xec\x97\x15\x97\xab\xab\x4c\x6f\xe4\x87\x89\x57\x31\xfb\x61\x23\xc6\x88\x1e\xca\xd0\x9d\x60\xec\xbb\x24\x92\x01\x7e\xdb\x1d\xf3\xa1\x70\xc1\xba\xa5\xd2\xb2\xe1\x9f\x5d\x4d\x67\x85\xe9\xd6\xea\xfd\x21\xa0\x22\xa4\x62\x1a\xb3\x42\x4d\x84\xd7\xf6\x5f\x1d\xc3\xa1\xfa\xf4\x97\xba\xf1\x3f\x0f\x5e\xda\xab\x4a\x8e\x6b\x93\x8d\x72\x46\x4b\xcd\xf0\x66\xe3\xea\xe1\x6a\x61\xc5\xc7\x82\x8f\x88\x84\xdc\x00\x8e\x86\x49\x22\x83\x60\xb7\xa2\x35\x11\x41\xe0\x3d\x7c\x1d\xe0\x84\x8c\x28\xaf\xde\x13\x2a\xbf\x61\x41\xcf\x2f\xa5\x83\xbb\xf7\x59\xdd\xbd\x99\x01\x97\x2b\x7d\x17\xc2\xcd\x68\x2a\xc7\x87\xb5\xa3\x46\xd5\xc7\xaf\xac\x91\x98\xcd\x4e\x21\x10\xfc\xf5\xd3\xae\x6b\xf9\xb2\xef\x82\x08\xd1\x99\xe8\xc3\x49\x43\x3f\x51\x54\xea\xda\x82\xcc\xf5\x52\xeb\x91\x85\xbe\x60\x16\xde\x5e\x88\x3a\x09\xed\xce\xf2\x34\x96\x96\xe7\x0e\x61\x38\x7f\xf1\xc3\xd9\x72\x6a\x68\xac\x28\x7a\x4b\xd2\x05\xf3\xe7\xc2\x95\x31\x72\x95\xe8\x1a\x8b\xe6\xe8\x42\xfb\xb6\xb1\xe9\x4a\x71\x5f\xdf\xd3\xb6\x3c\xbd\x9c\x29\x1d\x18\x9a\x3c\xee\xdb\xbe\x15\x67\x84\x00\x39\x27\x02\xa4\xea\x54\xda\x90\x61\x37\xf2\xc2\x1f\xfc\xed\xc3\x21\x3a\xf8\xdb\xbf\x02\x7f\xbb\xfa\xee\x90\x85\x6d\xb0\x17\x0c\xaa\x44\xc8\xa1\x94\xe7\xe8\xf4\x76\x20\x6a\xc4\x71\x4e\xbc\x67\x90\x85\x0f\x3f\xa1\x57\xb7\x9b\x35\xcf\xc0\xd3\xdb\x37\xca\xd1\x92\xea\x30\x05\x39\x41\xeb\x75\xa2\xaf\x5e\x02\xef\x15\x30\x9a\x61\xd4\xc0\x0b\x4c\x34\x22\x81\x76\x08\x8e\x57\x5a\xd7\x02\x75\xb3\x3c\x46\xca\x34\x79\x8c\x77\x36\x00\x3b\x53\x06\x48\x43\x0b\x06\x3b\xca\x2a\xee\xa8\x1b\x2e\x87\xea\xcd\x59\x28\x29\xb4\x4d\x93\x80\x5b\xba\xd7\xb2\x58\xb1\x35\x85\xff\x7d\xa7\x46\x63\x12\x08\x63\xea\xe1\x92\x28\xb3\xa0\x63\x58\xd8\xcc\xda\xb5\x24\xe2\xfa\x78\x50\x33\xf3\xcd\xdd\x77\xc1\x72\x75\xf3\x64\x71\x4a\x5d\x9b\x66\x66\x77\xfd\x72\xe0\x54\x54\x53\xdf\x09\xcd\x6f\x17\x8f\x90\xb8\xc7\xc5\x5a\x60\x5b\xe2\x78\xee\xb9\x9b\xa9\x44\x58\x0b\x37\x1c\x49\x7e\xc4\x04\x7e\xab\x43\x10\xe0\x10\x04\x08\x7f\xf7\x11\x83\x00\x9e\x9a\x86\xdd\xca\x25\xd1\x03\xe0\x07\x06\x22\xce\x2a\x7c\x46\xd1\x83\x25\x33\x16\xd8\x89\x03\x69\x53\x6b\xcd\xc4\x05\x12\xe0\xe7\xbd\x18\x25\x39\x3a\x3a\x39\x39\x3a\x32\xd1\x04\xbd\x70\xfb\xee\x7a\xf1\x57\xc2\xea\x42\x94\xb8\xa8\xe2\xcd\xbc\xe6\xad\xec\xe0\xe0\x76\xf7\x63\xbf\xaf\x6b\xd3\x56\x17\x62\x88\xc7\x15\xa0\x6d\x69\x6c\xba\x49\xf8\xe8\x58\x3b\xff\x6e\xab\x83\xd7\x1d\xb7\xb6\x06\x5f\x77\xd4\x62\xf0\xbc\x86\x73\x35\xda\x2d\x47\x0d\x83\x8c\xe0\xb0\x3d\x0c\xf9\x34\x79\x81\x1f\x9e\x14\x4d\x7f\xac\xbf\x70\xb2\x66\x6b\xd1\x3e\xc4\x55\x84\x11\xa2\x5e\x1e\x48\xd5\x12\x10\x1e\x4b\x63\xa5\x57\x0f\x8f\x74\xaa\xdb\xf1\x88\x91\x6a\x99\x67\x94\x29\x6c\xfd\xe4\xe0\x9d\x71\x44\x6d\xd7\x16\xe0\x43\xa6\x71\x91\x1a\xdf\x16\xbc\xc9\xea\x3b\x72\x47\xdb\x20\x93\xbb\x79\xb2\x0e\xf2\x92\xdf\x71\x99\x46\xe5\x3a\xe3\xf3\xf0\xa0\x37\x51\x7f\xe9\x95\x95\xd4\x49\x8d\x81\xe4\x56\xd5\xc8\x76\xf9\x2e\x89\x31\x22\xa7\xc3\xe6\x97\xf2\xa7\xd6\x69\x45\xbb\x87\xac\xe9\xb2\xe7\x79\x49\xb7\x3c\x22\xd0\x54\xc3\xdf\x8e\x1a\x1e\x69\x01\xcc\xa7\x08\x50\x46\x84\x80\x8b\xf7\x9c\x27\x25\xef\xbf\xd5\xdf\x1d\x66\x10\x76\x6c\xdd\x88\x96\xb6\x0f\xa4\xd4\xf7\xf1\x07\xe3\xc5\xa0\xed\x3c\xf8\x3b\x14\x3e\x7a\x95\x8f\x3b\xa3\x92\x40\x4f\x4a\xde\x6e\x9b\xbf\xbf\x66\x25\xef\xd7\xa9\xde\x91\xdf\x7c\xb2\x44\x03\x0a\x80\x22\x2c\xe4\x21\x2d\x6e\x43\xa8\xd7\x20\xd4\x0c\x19\x52\x6c\x7a\xa5\x49\xdf\x7c\x33\x82\xaf\x06\x0b\x14\xe2\x69\xa2\x64\x47\x61\x8f\x9b\x16\x83\xed\xf1\x1c\x2f\xb5\x76\xe9\xeb\x6c\xa0\x17\xfa\x8b\x2f\x89\x68\xc9\x4f\x70\x36\x64\x66\xd0\xee\x6f\x82\x48\x62\x3d\x19\xff\x3f\xf6\x5e\x1d\x87\xc9\xa8\x55\xa2\xa3\x15\xa1\xba\x38\xf7\x9a\x54\xa2\xa0\x95\x9d\xb1\xc1\xa9\x12\x99\x2b\xbb\xfc\x4d\x34\x52\xcd\x98\x6a\x0f\x9e\xcf\xe0\xec\xa8\x24\x46\xb7\x78\x01\xe8\x94\x4a\x2a\x9e\xb9\x01\xb9\x66\x96\x3e\x01\xb0\xd7\x67\xbe\xee\xd7\xa4\x07\x1a\x26\x40\xf6\x57\x6f\x9b\x95\x65\x9b\x70\x1f\x40\xf0\x25\x18\xf4\x86\x62\x54\x5e\x83\xb8\xe1\x05\x44\xfd\xe5\xca\x8c\xa3\x77\x01\x8c\x54\xd3\x1b\xf3\x5d\xf6\x60\xdc\xe9\x96\x69\xe3\x45\x5c\x43\x94\xc6\x1e\xfa\xd2\x42\x19\x86\x56\xd4\x68\xcd\xd7\xbc\x1a\x2e\x7a\x83\x4c\x67\x07\xb8\xaf\x75\x2c\x3f\x63\x9d\x4e\x2f\xd3\x5e\xb2\x76\x71\xd3\xf3\x72\xaf\x0b\x34\xa2\x6d\xaf\x8b\x04\x3d\xfb\xee\x6c\xa8\x60\xdf\xf1\x65\xcb\xc8\xd9\x8a\xd6\x35\xab\xbc\x23\x73\x04\x96\x38\xe7\x50\xf6\x21\x14\x23\x08\x8a\x7b\x40\x7a\xf8\x3a\xaa\xa0\x9e\x13\xda\xe6\x2b\x81\x07\xac\xfa\x64\x60\x40\xe7\x31\x79\x77\x46\x3a\xda\xde\xb0\x4e\xbd\x4e\xea\x7e\xbd\x64\x81\xdd\xf4\x7c\x50\x76\xcf\x5f\xd8\xb5\x5b\x05\x16\x0e\xf2\x6f\xbf\x7d\x48\x46\x7c\x98\x9a\xa3\x7b\xd1\x56\xe5\x3d\x2f\x31\x45\x47\x92\x17\x4a\xe0\xcb\xe7\x07\x61\xb8\xbf\xe7\x73\xa4\x26\x91\x8e\x69\xc7\x18\x74\x8c\x40\xcf\x74\xb9\x10\x57\x27\xd2\x0b\x10\x3c\xc7\xc3\xa1\x9e\xb7\x1c\x51\xe0\xd5\xf7\x94\x4d\xe4\x73\xec\xa8\xcb\x98\x1d\x76\x50\x9d\x6a\x8d\x6b\x27\x5f\x40\x26\xe0\xc4\x2f\x7b\xed\xa2\x11\xdd\x8a\x48\xbe\xee\xab\x8e\xd6\x4c\xf4\xb2\x7a\x08\x2c\x85\xa7\x19\xf0\xd8\x99\x55\xb1\xcf\xb8\x74\x53\xce\x2e\xfb\xe5\xe1\x19\x06\xc0\xca\xbc\x30\x13\x34\x38\xc4\xe6\xa2\x4d\x12\x73\x99\x24\x50\x73\xbe\xb2\x75\xc1\x88\xe6\x0d\xd9\x6e\xac\x20\x4b\xaa\xce\xad\xa6\xea\x6f\xf8\x8c\xd7\xfa\xc9\x72\xdb\x5c\xde\x8e\xb2\xd4\x13\x0c\xca\x58\x0a\xc3\x1f\x18\x48\xee\xd3\x64\x56\x19\x29\x59\xc3\xea\x12\xa0\xc2\xdd\x4a\x0b\xed\x3d\xe8\xfc\x4e\x23\xac\xbd\xe0\xcf\x99\xe0\xe1\xe9\xb8\xb7\x9f\xbb\x96\x2a\xb5\xb4\x56\x0a\xc8\x78\xe8\xf9\x35\xa1\x75\x48\x91\xec\x3f\x55\xe7\xab\x3f\x42\x1f\x0d\x98\xe4\xb1\x92\x06\x51\xc7\x45\x17\xbb\x49\xed\x9b\x4d\xe1\x33\xbf\xef\xd7\x59\x05\x51\xb8\xd3\x53\xf9\xfc\x84\xbd\xe0\x89\xa8\xbe\x25\x27\xd2\x8c\xb0\x8f\xb6\x27\x87\x32\xee\x2f\x32\xaf\xef\xf1\x72\xae\xae\x2b\x51\xdc\x26\x21\x89\xbc\xc3\x6f\x8e\x6e\xca\xfa\xc3\x31\x94\x88\xba\x03\xcf\x74\x77\xfa\x66\xac\xf7\x90\x77\xdc\x40\x4a\x81\x16\xaf\x16\x7f\x2b\xe6\x56\xb8\xd4\x60\x8b\x9a\xdb\xbe\xaf\x67\x31\x0d\x12\x2c\x13\xda\x51\x99\x05\x2a\x38\x46\xd4\x95\xac\xc3\x7c\x40\x00\x28\x5b\xb3\x8e\x02\x9c\xe8\xe2\xef\xb1\xb0\xa3\xee\xb3\x91\xa1\xcc\x19\xd3\x7f\x47\xe9\x52\x88\x5a\xf2\x92\x69\xe9\xa5\x9a\x8b\x22\x40\xc3\x94\x06\xd7\x8b\xbf\xf8\xcb\x2f\xc9\x28\x01\xea\xab\xa3\x3e\xeb\x09\x04\x8f\x11\x60\x69\xbb\x7b\x40\xa8\xcf\xd7\xde\x22\xd2\x92\x1e\xcd\x17\x74\x53\x30\xc7\x4e\x9c\x08\x51\x7d\xf4\xe3\xd9\xdb\xe1\x4b\xc3\x0d\xf0\xe3\xd9\xdb\xff\x08\xa2\x8d\x9b\x82\x39\xc8\xf3\x92\xcb\xdb\x03\xcb\xc6\x1f\x80\x65\x63\x63\xd6\xbf\x76\x1f\xda\x81\x62\xe3\x0b\xa6\xd8\x78\x22\x1d\x45\xf6\xea\xe8\x6c\xca\x0c\x5b\xc0\xf0\x48\xf8\x4e\x8a\xcb\x73\x9f\x3c\x42\x1d\x18\x27\x00\x5f\x1a\xd6\x67\x03\xd0\x1d\x03\x88\x0f\xef\x3e\xdd\x20\x3e\x02\xbe\xd7\x00\x47\x3a\x76\xff\x0c\x8c\xd0\x06\x6a\xd7\x26\x41\xe1\x93\x0f\xd4\x2e\xc0\xe6\xb8\xca\xb6\x32\x6a\x78\xf7\x91\x35\x33\x27\xc3\xc8\x94\xc1\xaf\x8e\xfc\x84\xbc\x53\x1f\x08\xc9\x21\x8f\x00\xe9\xb6\x2d\x6f\xf6\xec\xb4\xa3\x97\xf0\x84\x9c\xbf\xbd\xfc\xf8\xf6\xec\xf4\xd3\xdb\xf3\xd7\xc4\xc8\xe7\xbe\x61\x7a\x42\x3e\x09\xe7\x56\x9c\xbd\x15\x38\x3e\x35\xc8\x87\x74\xed\x3a\xd6\x6a\x93\xd6\x2e\x16\x0b\xa0\x28\xb4\x26\x17\x35\xef\x6c\xd6\x52\xc8\xf0\x2a\x2a\x51\xeb\x7c\x1f\x25\x53\x7b\x34\x6f\x78\x77\x8c\x66\x96\x46\x5d\x5f\xb1\xe1\x6f\xcc\x8a\x64\xe4\x12\x73\x29\x1c\xd7\xec\xb6\xf6\x92\xcd\x47\x48\x65\xcb\xc0\x48\x82\xcb\xfc\x80\x53\x64\x93\x37\xd6\xe0\x9b\x04\x36\x91\x43\x3e\x01\x9f\xc3\xd1\xc9\x91\x31\x8d\x2a\x8b\x5b\x63\x12\x5f\xed\xcf\x4d\x92\x0e\xbb\x47\x87\xc1\x87\xab\xea\x84\x90\x9f\x0d\xf1\xe8\xb1\xb2\x6e\x46\xe0\x38\x81\x42\x1b\xd3\x52\x17\xe9\x9e\x90\x6f\xce\x6d\xd9\x2f\xfd\x86\x86\x53\x7d\x40\xca\x1d\xab\x23\xc7\x70\x92\x12\x34\x0d\x49\x9c\xc3\x8f\xae\xe5\xbf\x7c\x7c\xbf\xdb\x4f\xe3\xbe\x4a\xfc\xe1\x33\xb1\x5e\xf3\x8e\xac\xa8\x5c\xd9\xb2\x3e\x97\x8d\x60\x77\xf5\xf6\x2d\x8a\xe9\x39\x37\x54\x5b\xe9\x3a\x2c\x18\x4f\xc2\x8d\x3f\xfa\xd1\x7c\x79\x74\x61\xb3\x1f\x6f\xa0\xc7\x87\x34\xc8\x00\x3d\x3e\x96\x44\x35\x07\x35\x6b\xdb\xbf\x3b\xf6\x29\xab\x4b\x44\x76\x4c\x26\x64\x31\x2f\x7c\xf0\xf0\xad\x8c\x14\x34\x58\xa0\xa3\x25\xeb\x28\xaf\x42\x06\x9f\x1b\xc1\x4e\x34\xa2\x12\x37\x79\x78\xce\x13\x83\xf0\x67\xcc\xac\x5e\xd0\x85\x1a\xdd\xdd\xec\xff\x74\x34\x79\x93\x20\xae\x06\xc2\xf5\xc9\x5a\xc2\x90\x97\x9d\x73\xf1\x7a\x96\x0e\xef\xd5\x00\x1b\x8f\x42\xd8\x44\x75\x04\xc3\x78\x92\xb8\xfa\xe1\x86\xb5\x6b\x2e\x95\x2a\x99\xb4\xcc\x02\x62\x9f\x70\x1d\xed\x62\xae\xd9\xdd\x37\x67\xce\xcd\xa5\x99\x46\x14\x9c\xd2\x42\x89\x04\xd9\x40\x34\x06\x4b\x78\xa0\xde\x9a\x96\x2d\xd8\x67\x2e\xc1\x57\x01\xb5\x0b\xa2\x75\xa7\xf7\x5c\xc4\xcd\x63\xd0\x30\x2e\x28\xe3\xb0\xc2\x77\x81\x3f\x79\x90\xb1\x14\x60\xd9\xc7\xc7\xb8\x03\x91\xe1\xb7\xaa\x1e\x10\x50\x14\xaa\x91\xd1\x41\x40\x6f\xa0\xd1\xa2\xd5\xee\xf6\xa6\xe5\x77\xbc\x62\xf3\x34\x4b\xdd\x8a\xd7\x37\x1e\x79\x30\x50\x1d\x33\x5d\x86\xc5\x36\xfa\xa0\xf6\xaf\xec\xbc\x0c\xb9\x19\xb1\xb0\x0b\x3e\xfc\xfc\x89\xd4\x4c\x09\x5b\x71\xb9\xf3\xe5\x41\x35\x23\x90\x6b\xbc\x58\x2c\xc0\x9f\xf2\xe2\xdf\xca\x2e\x2d\xab\x97\xe4\x37\xa6\x7f\x5d\x99\xe7\x6a\xc7\x17\x1d\xb9\x5f\x09\xb8\x51\xf7\x52\xf7\x2b\x36\x8f\x86\xa0\xbf\x2e\xcd\xbb\xaf\xd4\xfb\xca\x2c\xc4\xc3\x6e\x20\x05\xaa\xfe\x25\x71\x91\xc3\xad\x6d\xd8\x6c\xad\x6b\x5c\xc7\xd6\x58\xf3\x56\xa0\x85\xb2\x88\xe4\x6a\x43\xa5\xab\x7c\x58\x57\xbc\xbe\x3d\x26\xbc\x33\xca\x4c\xad\x09\x9d\xc2\x58\xdf\x9a\xd5\xda\x32\x5a\xa1\x4e\xcf\x53\x3e\xdb\xcc\xf9\x4e\xfa\xbc\xcb\x70\x9e\x7e\x7a\x68\x30\xeb\xc1\xaa\x02\x9d\x08\x32\x62\x51\xcf\x42\xb4\x7e\xe2\x1e\x47\x2f\xc6\x5b\x6a\x52\x2e\xd3\x10\xa2\x8e\x2e\xae\xce\xae\x2e\x46\x44\x5e\xf8\xd9\xc0\xad\x6f\xf4\xe1\x4c\x4f\xb7\x73\xeb\x87\x61\x81\xe6\xdc\xfa\x73\x07\x22\x74\x79\x77\xcb\xb2\x58\xd1\xe6\xb4\xef\x56\xe7\x5c\x16\xe2\x8e\x25\x5f\x6a\x0c\x6c\x98\x76\xad\x13\x6e\x06\x11\xa5\x90\xb3\xff\x3e\xbd\x4c\xe5\x10\x49\x49\x27\x30\xed\xbc\x62\x32\xe3\x06\x34\xdd\x4a\x2d\x63\xef\x6d\x3c\x04\x43\xbe\xa2\x60\x08\xec\x9f\xaf\x3d\x00\xc2\x6b\xde\x71\xda\x89\x48\x0d\xe0\xd0\x2b\xd0\xcb\x4e\xac\xf5\x56\xb8\x30\x02\x20\xb0\x0d\x87\xf1\x40\x66\xf8\x44\xf6\x70\x84\x39\xdc\xae\x0a\xc9\x2d\xda\xde\x28\x0d\xf3\x98\xd4\xec\x1e\x7f\x35\x78\x3a\x99\xb7\xff\xa6\x93\x68\xd5\x5a\xa5\xd5\xdf\x5f\xff\xcd\x0b\xa3\xfc\xdd\x96\x63\xeb\x22\xdd\x80\x44\x07\x5d\x07\x3c\x06\xbb\x39\x3c\x08\xe1\xbf\xa7\xea\x1e\xed\xba\xc3\x71\xfe\x67\x4f\x2b\x1c\xa9\x0f\xbb\xfa\x9f\x86\xa3\x9c\xd8\x18\x33\xdb\x66\x74\x3f\x58\x0f\x40\x2f\x19\x9c\x82\xf8\x8d\xae\xa5\xb5\x54\x43\x9e\x0a\xfc\x74\xa4\x83\x5e\x47\xe4\x45\x57\x34\x51\xd4\xa7\x3d\xa5\xc4\x63\x63\xf5\x08\xbf\xb7\xa9\xf0\xf3\xbf\xbe\xc7\x08\x11\xac\xc7\x54\x47\xcc\xa0\xa1\x97\xf0\x2a\x79\xcf\x65\x87\x19\x98\x28\x0b\x88\xb2\x20\x31\x3a\x14\xc9\xab\xc9\xc5\x25\xc0\x72\x36\xff\xa2\x65\xd9\xbe\xc6\xf3\xcc\x80\x91\xb4\x70\x7b\x13\x96\x0c\x2f\x81\x3d\xe9\x45\xf7\xd0\xf0\x02\xae\x6a\x9f\xce\x2e\x41\x86\x24\x7f\xfd\x01\xd1\x13\xfe\xeb\x2f\x3f\x7c\x1b\x98\xcc\xa7\xca\x54\xcf\xf4\x77\x3c\x61\xbc\x69\x27\x43\x21\x37\x37\x12\x0c\x95\x2b\xc7\xb3\xa6\xf7\x2a\xae\x2a\x35\x5d\x56\x67\xa7\x9a\x33\x87\xfc\xbe\x67\xc5\xed\xc3\xa9\x43\x7d\xb0\xbd\x26\x41\x25\x72\x39\x52\x22\x24\x48\x85\xb9\x8d\x12\xf1\x54\x45\xc8\x60\xca\x55\x22\x3b\xdf\x16\xf9\xef\xd3\x3d\x5d\xa8\x93\x64\xe6\x2f\xfe\xc8\x6f\x73\xd3\x9c\xdf\x12\xc3\xad\x80\xfa\x43\xdd\x09\xbd\x88\x1d\x54\x00\x9c\x7f\xb8\xfa\xd7\xfb\xd3\x37\x6f\xdf\x6b\x4e\x07\x48\x21\x40\x78\xb5\x40\x04\x72\x9b\xac\xaf\xf4\x9d\x34\xbd\xea\x23\x13\x54\xa7\x45\x66\x3e\x8c\xf8\x7c\x6b\xf2\x61\x96\xcc\x37\xb3\xa6\x7d\x57\x1f\x4e\x7d\x3d\xd3\xf3\x47\x70\x82\x19\x0f\x2b\xfb\x3c\xac\xea\x50\x83\x21\x59\x0b\xc8\x8f\x8f\xe6\xba\x99\xed\x28\x79\x86\xb8\x83\xea\x31\x8e\x02\x5e\xfd\x02\x3d\xde\x2e\xe2\xf0\xac\xe3\x18\x3b\xf9\xdb\xf4\x52\xa8\xa3\x2b\xf8\xb6\x89\x5a\xa9\x5d\x82\xa9\x46\xad\x52\xe3\x4a\x81\x33\x29\xe3\x20\x26\xe3\x15\xf6\x6c\xeb\x68\x6b\xef\xdf\x42\xb7\x7f\x1b\x85\xed\xb2\x7a\x50\x25\x9f\x55\x94\xcf\xa0\x50\x8c\x76\xed\xd4\x8b\xf8\xbf\x57\xe8\x24\x1c\x84\x62\x6c\x9d\xca\x9c\x12\x17\x84\x92\x49\x99\x36\x9f\x81\xea\xeb\x2d\xe0\x01\x26\xb8\x3e\x72\x66\xd0\x0d\xc3\xc2\x4c\xa6\xfb\x08\x3f\x29\x54\x63\xb6\x56\x88\xf0\x76\x4e\xf2\xdc\x99\x79\x61\x5c\xeb\x37\x33\x4c\x61\x7b\x7d\x73\x00\x0d\x61\x78\x23\x4c\x4d\xe3\x00\xea\x7e\xef\x3a\x62\xc7\x11\x26\x8f\xa2\x89\x7f\xcb\xac\xf9\x8a\xdf\xfa\x77\xbf\xff\xc4\xd4\x80\x5d\x49\x5b\x6d\xf7\x95\xe8\x44\x9d\x9d\xf8\x7f\x39\xf1\xda\x70\x7f\xe3\x37\xce\xb0\x34\xa5\x9a\x77\x0f\x58\x11\x98\xc7\x39\x45\xb7\x3b\x4b\xac\xbb\xe5\xd6\xfb\x4f\x2d\x52\xdd\x1b\x24\x44\x4a\x2a\x49\x99\x5c\x0e\x73\x71\xae\x8d\x39\x53\xf2\x22\xf5\xe2\x20\x6e\x75\x78\xeb\x20\xd0\xdf\x60\x0e\xfe\xee\xc7\x69\xb9\x1d\xeb\xa5\x9a\xd0\x7b\xd1\xa6\x17\xa5\x5f\x0e\x5e\x18\x65\x28\xe8\xbf\x8d\x6b\xc6\xe6\x4c\xfc\x2f\x65\x97\x5c\x41\xb8\xd5\xeb\xca\x54\x34\xc5\xec\x9d\xc0\x14\x4f\x6d\xaa\xa4\xad\x13\x90\x39\xb1\xa9\x70\xeb\xc4\xb7\x4c\xe8\xc4\xdb\xdf\x66\xca\x3c\xa4\x52\x0b\x9c\x63\x00\x4a\xb9\x05\xce\x3b\x59\xf2\x99\x4c\xbb\xbf\xea\xaf\xeb\x0b\xbf\x9a\x1f\xa7\x3e\xa8\xdd\x42\xb1\x54\xac\x67\xa5\xc3\xb5\x0c\x96\x09\x3a\x01\xf1\xc9\xaf\x45\x0b\xb0\x55\x1c\xcb\x97\x1d\x24\xa7\x2e\x51\x3e\xd6\xe4\x13\x6b\xda\xcc\x82\x4d\x2a\x95\xe0\x43\x9b\x6f\xb9\xfd\xf3\x11\xfa\x7f\x8a\xc1\xf2\xfb\xe0\xfb\x49\x2a\x20\x00\xcb\x3f\x09\xb5\x1f\x10\x3a\x07\xc2\x1f\x81\xda\x0f\x48\xcc\x85\x28\xf6\x20\x88\x03\x52\x93\xc1\x89\x1d\xf8\xf0\x13\x04\x71\xf4\x32\x4c\x5c\x08\x06\x60\xdf\x24\x8b\xe2\x36\x08\xb2\x13\xe4\x41\xeb\x5f\x5a\x89\x38\xd2\x1a\x5b\xc0\xf1\xdb\xd2\x4a\xd4\x37\x71\x34\x5f\xe1\x27\x3b\xb0\xd2\xe6\x12\x3c\x34\x41\x67\x79\x2a\xea\x6c\x84\x0e\x7b\xa6\x73\x3e\xe4\x82\x63\xe8\x70\xbc\xd8\x50\x2f\x1d\x2c\xb7\xb3\xad\x8c\xa2\x91\xe7\x21\xe8\x46\x27\x69\xb2\x3f\x09\x4c\xc7\x09\x22\x89\xcf\x86\x1c\xe7\x3c\x4e\x92\x38\xcd\x8b\xec\x67\x95\x8c\xd8\x8f\x93\xa4\x86\x19\x92\x51\xfa\x04\x0f\x72\x92\xec\x2e\xc6\x95\x3c\xc1\x88\x9c\x24\x38\x85\x35\xd9\x72\x23\x27\x49\xcc\xe2\x4f\x4e\xee\x7c\x16\x93\x72\xda\xb2\xf2\xd8\x96\xa3\x9c\xca\x49\x12\x67\x78\x97\xe7\xd8\x95\x93\x64\xa6\x70\x99\x92\x9c\x2d\x9a\xcd\xca\x9c\x24\x93\x24\x71\x37\xbb\x27\x47\xfb\xe0\x93\xc0\xe7\xec\x9e\x1d\x99\x9d\xdd\x93\x05\x44\x8d\x4f\x0a\xd1\xc3\x4c\x4b\xc3\x94\x0f\xc9\x32\x89\x47\x0e\x11\x26\x7f\xc8\x10\x39\x43\x13\x31\x43\x03\x91\x21\x38\x40\x18\xe1\x13\x42\x64\x49\xdc\x0f\x75\x84\x7b\x92\x49\x24\x32\x64\xe6\x91\x27\x8d\x9f\x1c\x62\x09\xf7\xa4\x53\x4c\xb8\x27\x85\x6c\xc2\x3d\xe9\xdc\xd3\x39\xcb\xd9\xb2\x54\x47\x58\xa8\x33\x64\x4e\xf2\x55\x3b\xda\xae\x01\x1f\x75\x86\xd8\x20\x73\x75\xa6\xb4\x6c\xe5\x93\x0a\x32\x8f\x4f\x8c\xb7\xda\xff\x66\xa4\xe8\xc0\x3d\xc9\x7c\x38\xfe\xd7\x43\x99\x4d\xee\x89\x27\xd9\xe0\xf3\x25\xa7\xda\xe0\x93\x9b\x70\x93\x24\x34\x9e\x94\x83\x4f\xd6\xaa\x8a\x73\x65\xbb\x27\x9b\x35\x3b\xa9\x5b\x96\x59\x3b\x85\x3f\x7b\xdc\xcb\xb0\x67\x6a\xf8\xdd\x84\x35\x1b\x65\x62\xf4\xbe\x1a\xbf\xd9\x79\xd2\xe0\x6e\x17\xed\x95\x33\x60\x9e\xff\x6e\xb7\xc9\xaa\xb7\x41\x7b\x97\x34\xbd\x89\x27\xc1\xb6\xe6\x6d\x8c\x8b\x2f\x51\x17\x8f\xd0\x10\xc3\xac\x7c\xa9\xe7\x6a\x02\x77\x9f\xf7\xed\x6c\x83\x39\x95\xcf\xcf\x3d\xe9\xcc\x7e\x59\xa6\x28\x72\x00\x46\x38\xfe\x32\x24\xee\xc2\x06\xe8\x9e\xfc\x01\x25\xd9\x0c\x81\xee\x49\xe3\x0a\xcc\x12\x49\x1c\xb3\x60\x94\x35\x30\x53\x70\x06\xc7\xa0\xf7\x52\xfe\x55\x89\xe4\xf2\x0e\xba\x27\x95\x81\x30\xb3\xe7\x26\x41\x62\x5b\x2e\x42\xf7\x6c\x35\x1c\x79\x06\x1c\xc9\x62\x2a\x1c\x37\x2d\xd9\x46\x23\x87\x4b\xed\xe1\x52\x9b\xf8\xfc\x01\x2e\xb5\x31\x2e\xc5\xcc\x3b\xe8\x00\x14\x6d\x8e\x55\x31\x43\xe6\x26\xff\xe2\x2c\xbf\x62\xce\xb5\x76\x96\x89\x71\xc8\xb4\x98\x69\x18\x44\x39\x19\x13\x39\x17\x3d\xa9\xf9\x6a\x37\x97\x87\xd1\x3d\xf9\x8c\x8c\x39\x5b\x49\xd9\x4b\xe9\xdc\x8c\x19\x92\x87\x2c\x8e\x71\x96\xc6\x1c\xfb\x68\x4b\x3e\x47\xf7\x6c\x67\x97\x65\x73\x3c\xba\x27\x8d\xed\x31\xd3\x8e\xf0\xb9\x21\xb7\xe7\x7d\x74\xcf\x96\xc6\x55\x06\x17\xa4\xf7\x52\x22\x2b\x64\xe6\x90\xe8\xbd\x10\xe6\x87\xcc\x94\x99\xc6\x26\xe9\x9e\x2d\x87\x31\x87\x61\xd2\x3d\xfb\xe5\x9a\xdc\xb1\x13\xdb\x58\x96\x89\x4c\x94\xe3\x96\x65\x18\x96\xb9\x0e\xcb\xe7\x77\x43\x26\x0b\xc6\xc4\x9d\x3d\xb8\x89\x34\xdf\x81\x8e\xfe\x7f\x39\x1e\xa0\x27\x8c\xee\xeb\x8a\xce\x08\xc6\xa2\x7b\x72\x42\xfb\xe9\xde\x87\x43\x68\xff\x71\x42\xfb\x57\x9a\xab\xe3\x10\xd7\x9f\xec\xcd\x21\xae\xef\x9e\x43\x5c\xff\xe0\x02\x39\xb8\x40\x36\x9f\x43\x5c\x7f\xd0\xad\x43\x5c\xff\x10\xd7\x3f\xc4\xf5\x43\xcf\x5e\xe3\xfa\xda\x3c\xc7\xa0\x7e\xf2\xe2\xfb\x42\x62\xfa\x9a\x25\xeb\xb4\x28\x44\x5f\x77\x9f\xc4\x2d\x8b\x86\xf6\x92\x2e\x6d\x1b\x52\xa3\x1d\x7c\xbc\x1b\x1e\xed\x4b\xae\x6e\x52\xd9\xb3\x7d\xaa\x5f\x34\x97\x1c\x75\xc2\xd4\x25\x2b\xad\xc4\x54\x97\xaf\x7a\xb9\x53\xa3\x70\x42\x4e\x49\xcb\x0a\xde\x70\x86\x34\xf8\x14\x3f\xc7\xe5\x60\xe8\x3d\x12\x0d\x7d\xc9\xaa\x6b\x4d\x8c\x50\x7b\xc4\x5a\xde\xdd\x44\xab\x7e\xd3\xdc\x24\xb9\x5a\xa9\x40\xb3\xd0\x1c\x10\x06\xa5\xdf\x30\x8e\xb5\xec\xdf\xda\xe2\x48\xeb\x3d\xf6\xfc\x93\xd7\x12\xdf\xe9\x85\x43\x9b\xc2\x0b\xb6\xd1\x48\xda\x70\x8d\x58\xb0\x6f\x0d\xc1\x3e\x37\xbc\x85\x65\x7d\xc5\x0a\x51\x87\x78\x90\xdd\x33\x58\x3c\x6f\xc7\x12\xcc\x2a\xd2\xfe\xe5\xc4\x6b\x6c\xd9\xb7\x96\xf7\xf8\x8e\x56\xbc\xe4\xdd\x83\x0d\x9d\x6b\x8a\x3b\x8a\xfb\x4c\x0f\x74\x92\xd8\x53\xe9\x66\x99\xd0\xa6\x69\x05\x2d\x56\x4c\x7a\xfd\x46\x1b\x58\x57\x56\x26\xc9\x34\x75\x2f\x48\x1e\x09\x06\x30\xc8\x55\x76\x52\xf5\x40\x5a\xd1\x99\xb4\x11\xdd\xf0\xb4\xeb\xe7\xa0\x73\x78\xed\xc1\x46\xe1\x4f\xa0\x49\xd2\xb5\x0f\x90\x7f\x92\xe6\x42\xf5\x9a\x82\x23\xc0\xaf\xfd\x7f\x48\x22\xaa\xd2\x80\x1b\xfd\xf5\xdb\xb4\xab\x1f\x6b\x0b\xbd\xa7\xe1\x7a\xc3\xd7\xe0\xe1\xac\x94\x8d\xa8\x8e\x86\xe1\x0f\xa4\x2d\x72\xd7\x88\xbf\x7c\x4f\x56\xa2\x6f\xe5\x89\x5f\x03\xf9\x1d\x7c\x86\xf7\xf3\xd4\x28\x99\x32\x2c\x3b\x52\x31\x2a\x3b\xf2\xdd\xb7\x64\xcd\xeb\x5e\x99\x06\x09\xef\x7a\xa6\xf9\x0f\xdf\x27\x6f\xb7\x54\xa3\x3c\xd5\x1c\xdf\x4c\x7c\xd0\xbb\xaa\x41\xd0\x73\x6d\x95\x6b\xad\x12\xab\xba\xf5\x7e\x1f\x08\x0f\x46\x71\x48\x7d\x14\xf9\x33\x57\x77\x62\xcf\xba\x26\xd5\xba\x4d\xb2\x56\x13\xcf\xfd\xa4\xaf\xc5\x8c\xd8\x58\x09\xa9\x0e\x70\x4c\xfe\x35\xd2\x80\xdf\x7b\xb1\x7c\xe8\x52\x6a\xca\xff\x89\xdf\x1c\x16\x93\x9b\x0f\xa7\xc1\xa3\x66\x3a\x3c\xe0\xf2\x70\xd8\x51\x93\xdf\x8e\x5b\x1f\x37\xea\x36\x9d\x58\x37\x08\x37\x6f\x73\x1b\x34\x6e\xda\xa2\x60\xc8\x39\x7c\xee\xd8\xe2\x6a\x81\x72\x23\x53\xb6\xcf\x9a\xeb\x20\x42\x93\x19\x67\x53\x3f\x18\x52\xbe\xfb\xe7\x85\x48\xb1\x87\x5b\x76\xc3\x65\x97\x41\xc1\x83\x5f\x1f\x2e\x27\xc9\xeb\x1b\xa4\x4c\x58\xf7\x55\xc7\x9b\xca\xf6\x3c\xd0\x5f\x2b\x4a\x9f\x75\xbe\xcb\x98\x7a\xbe\x49\x8a\xa0\x05\x08\xb1\x17\x09\x1b\xbc\xb0\xbf\xcf\xea\x0e\x91\xfa\x5b\x75\x98\x36\xb4\xa5\x76\x60\x81\x94\x5c\xbe\xd4\x7e\x69\x5a\x04\xd3\xdf\x34\xf6\x8d\x3a\xb9\x5a\x5a\xd9\xe1\xf2\x03\xb8\xbb\x2c\xb6\x8e\xd5\xb4\x0e\x44\x81\x86\x6e\x15\xf8\x32\x11\xf7\x26\x93\x54\x33\x31\x8d\x56\x59\xb4\xe4\xf9\x0d\x2d\x6e\x59\x5d\x02\x9d\x1e\x0e\x49\xf9\x50\xd3\xb5\xc6\x30\xb5\xa4\x63\xac\x1c\x49\x9e\xad\x2c\x57\x0f\x7a\x19\xb1\x64\xda\x00\x31\x44\x98\xc0\x13\xc6\xa7\x97\xc9\x20\x5f\xbf\x48\x65\x0b\x84\x75\x84\xc4\x98\x6a\xcb\xef\x0a\xa6\xcd\xa6\x40\x97\xd4\x8f\xef\xd2\xf8\xbb\x00\xee\xc7\x46\xf3\x35\xe6\x07\xf7\x56\x3e\x38\x2f\x6d\x98\x0b\x10\xff\x68\xa5\xd4\x42\xe8\xfe\x63\x0a\xeb\x47\x8b\x62\xf9\xb0\x2b\x61\x57\x9c\xa3\x0a\xb7\xc6\xcc\x9f\x03\x78\x0c\x91\xb3\xae\x5d\xa6\xe0\x24\x1c\x7d\x7c\x73\x3e\xd4\x4a\x1f\x69\x29\x24\x79\x53\x89\xe2\x96\x9c\x33\xb8\x07\xf8\xe7\xdd\xcc\x48\x8c\x21\x14\x77\xe4\xae\x6a\x97\xe5\xee\xdc\x02\x07\x3c\xfc\xaf\x08\x0f\xbf\x5d\x86\x06\xe0\xeb\x40\xc3\x5f\xd3\x9b\x74\x3a\x15\x75\x63\x87\xad\x06\xaf\x19\x98\xd6\x2d\xb7\xc8\x9f\x57\xe2\x7e\xd1\x89\x45\x2f\xd9\x82\x07\x12\x5f\x12\x7a\x71\xcb\x1e\xd4\x5f\x53\xfb\xf1\x0f\xfc\xfa\xe0\xba\xd4\x09\x08\x3c\xc0\xe7\xea\xc4\xff\xf8\xe6\x5c\x1d\x33\x29\xe8\x6e\x5c\x92\x57\xac\x2b\x5e\x15\xac\x59\xbd\xd2\x4d\xf9\x22\x86\x65\x2d\x6a\xde\x89\x36\x99\x01\xef\x94\x14\xa2\xaa\x34\xaa\x86\xb8\x26\x67\xac\x59\x59\x21\x8f\xdf\xa3\xa7\x42\x48\x6f\x84\x48\x45\x90\xf6\x96\xbc\x7a\x4b\xaf\x78\x6f\xe2\xdb\x65\xae\x82\x79\xea\x45\xf0\x95\x11\x10\x3f\xc2\xf0\xec\x17\x58\xfe\xe8\xca\xbc\x00\xd7\x50\x2f\xf6\x34\xc4\x91\xd7\x82\x03\x23\xe4\xab\x19\x72\x71\x8d\xe6\x78\xc9\x4a\x22\xee\x58\xdb\xf2\x92\x49\x62\xb5\x89\x7f\xf3\xe5\xd5\x9e\x08\x02\xb7\x1a\xd3\x03\x0c\xfe\xb3\xc2\xe0\x67\x5c\x93\x3c\xe5\xa5\xde\xda\x54\x5e\xb4\x5c\xf3\x3a\x13\xd6\xf5\x69\xd5\x57\x14\xce\x5e\xd9\x21\x33\x7f\x33\x07\xd7\x36\x17\x11\x59\xd0\x8a\x5d\xfc\x9c\x70\x19\xb9\xc2\x6f\x0e\xef\x23\xe6\x43\x0f\xd9\x74\x2b\x2c\xc7\x7f\xd8\xc5\x4e\x6a\x51\xce\xf9\xa6\xff\xb8\x68\xa7\xde\x5a\x46\x30\xc7\x5d\x0e\xca\x1b\xda\xb1\x7b\x9a\xcc\x32\x6e\xba\x32\xc4\x14\xb7\x53\x7f\x7a\x79\x41\x7e\x44\x89\xbb\x81\xac\xb6\xa2\x43\x8b\xec\x5c\xac\x29\x4f\x66\x52\xf2\xc0\xa1\xfd\x66\x5d\x5a\x71\x04\xe5\xa9\x53\x28\x72\xcf\x40\xdc\xb1\x5e\xdd\xb3\xf4\x0d\xe8\x80\x74\xb9\x67\xa3\xc2\xd9\x14\x9e\x13\xc8\xa4\xfa\x3a\x12\x1b\x3d\x8b\x11\x47\x96\x0b\x54\x13\xc9\x6a\xc9\x21\x0a\xe4\x25\x27\x68\xfe\x50\x24\x9f\xc5\x4c\x5d\x34\x3c\x42\x3b\xef\xbd\xb8\xe1\xb5\xd9\xb7\x42\x87\x34\xaf\x69\xc8\x16\x39\x58\x0a\xcf\x6a\x29\x48\x59\xbd\xad\xe9\xb2\x0a\x85\xd3\x86\x8a\xbf\xa2\x37\x6a\xd1\x31\x78\xeb\x55\xc9\xa5\xfa\x2f\xb9\xba\x7a\x0f\x8e\xf4\xbe\x36\x96\x6d\x24\xb5\x59\xab\x3d\x5b\xcd\x83\xdb\x76\xb7\xfd\x84\x7a\x27\x03\x89\xf4\xa2\x2e\x55\x73\x99\x1c\xe4\x27\x69\x39\x08\xb2\x6a\x53\xcc\x21\x93\x23\x1c\xaf\xf9\xb4\xe2\xc5\xed\xa5\xe7\x2f\x17\xad\xfa\xac\xf6\x3e\x1a\x1c\x47\xe3\xbf\xed\xa2\x30\x75\xa3\x2f\xd3\xaf\xad\x9f\x3c\x8d\x7f\xa5\xbb\xac\x5e\x27\x54\x4a\x51\x70\x17\x20\x89\x00\xa6\xba\xc3\xa2\x84\xc3\x62\xb7\x6e\xc0\x49\xbf\xe5\xf9\x65\x26\xce\x10\x63\x4b\xef\x54\x0a\x5f\x42\xf5\x38\xec\xd4\x74\x5c\x28\x19\x4c\x0d\x9f\x06\xdc\x0c\xc6\xf6\x43\x8f\xbe\xf5\xdb\x6b\x0f\x60\x5c\xa9\x1b\x6b\x4c\xd3\xe1\x6c\x4e\xa2\xe5\x68\xd0\x81\xe6\x47\xf4\xfd\x6b\x2b\x69\xe6\xaf\xf6\xdc\x9b\xfb\xfb\xbc\xcd\x18\xb3\xc8\x03\x45\x54\x53\xf7\xf3\x51\xd8\x12\x3f\xd3\xce\x7e\x48\xdc\x6a\x44\xd3\x57\x74\x36\x6e\xb9\x41\x7c\xb1\x03\x05\x0c\xfe\xfa\xb6\x21\x81\x7c\x14\xe6\x70\x91\xc1\x10\x90\x39\xec\xc1\x37\x50\xcd\x69\x80\xcc\x71\x88\x91\x4e\x90\x6f\x7f\xf8\xfe\xfb\x39\xf0\xe6\x59\x88\xe6\xa0\x85\x1a\x02\x6f\x0e\x41\x34\x07\x85\x06\xc1\x9b\xe7\x4a\x04\x42\xc1\xba\x79\xf0\xe6\x79\x73\x60\x7f\xe8\xcd\x11\xdf\x6a\x6e\x3d\x9f\x5f\xab\x17\xf2\x70\xc5\xab\xf8\xa6\xeb\xdb\x02\x32\x03\xb5\x7b\xe1\xba\xbc\x90\xcc\x89\x8a\xbd\xc4\x6a\xbc\xc8\xdd\xc9\x25\x3a\xec\xab\x06\x2f\xab\xf2\xce\xaf\xaa\x8b\xb4\x34\x5c\x6f\x37\x53\x4b\x17\x90\x39\x5d\x65\x17\xaf\xa0\x0b\x88\x1c\xd4\xd6\x45\x2a\x2d\xf2\xd0\xc4\xe3\x35\x72\x49\xd5\x6f\xa9\x99\xd8\x09\x95\x6e\x3b\xd6\xb7\x25\x27\xdd\xa5\xd4\xb2\xe5\x1c\x2e\xae\x2e\x2d\x22\x94\x84\xeb\xd6\xe6\xaa\xd1\xa2\x52\xa7\xab\xd5\x42\x35\x68\x51\x91\xe1\x63\x64\xbb\xca\xb3\xe4\x7a\x33\xef\xc8\x88\x0a\x4d\xae\x32\xcb\xa9\x2d\x4b\x4f\x5e\x4d\x49\x5c\x4d\xaf\x1e\xf3\x6a\xc2\xa2\x1d\x0f\xd7\x8c\x4d\x57\x82\x25\xad\xa4\xcd\x4a\xb1\x70\xfd\x57\x54\x68\x4a\x7d\x58\xe2\xe6\x4d\xc9\x96\x8d\x55\x80\x45\x33\x69\xf7\x92\x1e\x9b\x52\x65\x94\x5f\x5b\x64\x4f\x97\xa0\x96\x0f\x97\x14\xa5\x3b\xf3\x72\x78\xfa\x7c\x1f\x95\xbe\x7a\x18\x03\x17\x13\x8c\x1c\x68\x61\xd0\x82\xe8\x67\x82\xa4\xfb\xba\x7c\x90\x94\xc5\x16\xbb\x98\xe1\xef\x89\x14\x62\x5b\xed\x8b\xf8\xf9\x6a\x14\x2e\xb1\x1f\x1f\xa2\x24\x5f\x39\x27\xdc\xc1\xb9\xbf\xd9\x49\xe7\xdc\x97\x03\x08\x25\xe3\x94\x40\xdb\xe9\x5a\xb4\x44\x2c\x35\x78\x6c\xc4\x56\x77\x1b\xe6\xf4\xf2\x42\xdd\xe7\xa1\x62\x8c\x56\xf2\x84\x4c\xd4\xef\x6b\x33\x28\x76\xff\x71\x37\x1c\xda\x75\x6c\xdd\x74\xa1\xa5\x70\xf0\xed\x3f\xab\x6f\x3f\xdb\x21\xf9\xab\x7d\xc1\x52\x23\xf7\x6b\x5a\x2f\xd4\x6e\x03\x2f\xbf\xe7\x6c\x0d\xf4\x60\xac\xa9\x4f\x88\xc9\x66\x86\x01\x05\xd7\x0d\x14\x32\x0c\x38\xda\x49\xc8\x47\xe0\xd8\x7b\xf7\xe3\xa1\x05\x59\xd9\xa3\x82\x87\xf1\x68\x7f\x16\x62\x9c\x53\x1b\x54\x41\xd0\x55\x3b\x42\x66\x2b\x7a\x67\xfd\xe0\xc6\xde\xad\x58\x2c\x7b\xff\x12\xaa\x6f\xdc\xfb\xc3\x3b\x0c\x5e\x62\x68\x55\x89\x7b\x6c\xaf\x3b\x07\x23\xc3\x0d\x3d\xc3\x12\x41\xa8\x45\xe1\xea\xa2\xaf\xbd\xc9\x7e\x17\x40\x27\x75\xea\x96\x14\x34\xfc\xe1\x6a\xd0\xea\xd0\xe2\x15\xeb\xfc\xc5\xa6\xae\xd1\x35\x26\xa4\xab\xff\x37\x99\x4d\x91\x8e\x9b\xc0\xd1\x92\xad\xe8\x1d\x17\x7d\x8b\x72\x3b\x41\xbe\xd1\x7f\x82\x43\xeb\x41\xf4\xd6\x59\xd8\x47\x12\x66\xed\x28\xca\x89\x99\xfa\xe0\xfe\x08\x97\xb9\x52\x18\x3f\xca\x82\x7d\xe6\xc1\x72\xc2\x8d\x31\x33\x93\x64\x50\x3b\x1f\xcd\xf0\xba\x93\x8d\x3a\x15\x93\x29\x47\x7f\xf5\xbf\x3f\x34\xc0\xee\xae\xe0\x4f\x5f\x1b\xe1\xe8\xc1\x04\x9b\x7a\x6c\xb8\xb0\xe2\xc5\x43\x32\xd9\xa6\x0b\x13\xaa\xd7\xc8\x1b\x2a\x59\x49\x7e\xa2\x35\xbd\xc1\xbb\xef\x8b\xab\xcb\x37\x3f\xbd\x54\x53\x18\x71\x6f\x5c\x9c\x4f\x45\x19\x8d\x7c\x14\xff\x61\xb7\xfa\x94\x51\x1f\x33\x8e\xc1\xbd\xf5\x72\xc7\x0a\x1b\x73\x60\x85\xd1\xce\x37\x0b\x7c\xc7\x24\xca\xa3\x8d\x7b\xb7\x2e\x1f\x91\x1c\xd9\x35\x39\x5f\x5d\xcd\xcb\x5e\x4c\xc3\xee\x05\xa4\x4d\x7b\x1b\x26\x5f\x90\x1d\xed\xfa\x81\xb6\x19\x1a\x9c\x3f\xa9\x3d\xde\x32\xac\x56\x5f\x02\x7e\x42\xa9\x5f\x32\x07\xff\x69\xc5\xda\x6e\x0d\x4b\xa4\x25\x45\xd5\xcb\x8e\xb5\x78\x31\x81\x92\xcd\xe1\x22\xf8\x20\xd4\x4d\xbf\xa8\xfa\x12\x7c\xf2\xac\x36\x08\x07\x50\x56\xd0\x8a\xf5\x10\xaa\xe1\x18\x8d\x25\xfb\x87\xcb\x56\xac\x59\xb7\x62\xfd\xf0\x04\xff\x19\x94\x90\x68\xc1\xda\x47\xac\x8b\x49\xab\xf8\x86\x77\xab\x7e\x79\x52\x88\xb5\x67\x20\xbf\xd2\xb9\x1b\xdd\xc3\xab\x65\x25\x96\xaf\xd6\x54\xf5\x40\x99\xcb\x5d\xcb\x97\x7d\x27\x5a\xf9\xaa\x64\x77\xac\x7a\x25\xf9\xcd\x82\xb6\xc5\x8a\x77\xac\xe8\xfa\x96\xbd\xa2\x0d\x5f\x14\xa2\xbe\x53\xcb\x4d\xd4\xf2\x64\x5d\xfe\x59\xa9\xa8\x05\xad\xcb\x05\x0e\x92\x6f\xed\xce\x69\x77\x7a\x47\x79\xa5\x6c\xcc\x8f\x4c\x29\x41\xba\xa1\xfc\x87\x2e\x41\xd1\xd1\x8a\xd4\xfd\x7a\xc9\x5a\x88\x9e\x9b\xb7\x49\x23\x4a\x89\xd7\x43\xac\xc9\xb4\xb5\xfb\x6b\x5e\xab\xe9\x78\xd0\xd8\x12\x9b\x20\xc5\x1d\x6d\x6f\x98\xcf\xf5\x3a\x39\xa7\xa3\xd7\x42\x2e\xd2\x79\x97\x68\x43\x95\x71\x16\xec\xe1\x47\x77\xf2\x1a\xf7\x96\x32\x91\x28\xd2\xa3\x9a\x12\xed\xbe\x2e\x59\x5b\x51\x40\x72\xc0\x96\x6e\x1e\xc7\xfa\x4e\x03\x36\xd0\x92\xa9\x6f\x36\xac\x55\xed\x56\xe6\x21\xdc\x7f\x4b\x75\x32\x33\x2b\xdb\x86\xb0\xec\xd7\x26\x3b\x36\x75\xfd\x6d\xb7\x99\xbc\x5a\xd4\x8b\x8e\xb5\x6b\x5e\xc3\x61\x00\x33\x18\x9c\x8c\x8d\x2e\xea\xc9\x21\x2f\xba\x15\xe3\xad\xe6\x09\x21\x6b\xda\x15\xda\xeb\x0a\xa8\xb9\xa2\x7d\xb9\x9f\xe9\xeb\xeb\xdd\x56\xab\xf7\xfe\x0e\xbd\xdd\x53\x5f\x9a\x52\x8d\xfa\x56\xfd\xd8\xdf\xc4\xc1\x89\xb5\xa2\x77\xe8\x98\x29\x99\x54\xa7\x80\xe1\xd1\x80\xeb\xd0\x3e\x7a\x3b\x75\xbc\x2c\x36\x35\xcf\xe0\xaf\xb8\x55\x07\x1f\xb5\x53\xdf\x9b\x58\x13\xc3\xbf\x0f\xc7\x39\x7c\x24\x8d\x1b\xba\x80\x21\xf8\xd3\xe4\xf7\xf5\x20\xbd\x26\x77\xdf\xb9\x7f\xc1\x3c\x2e\x34\x24\x39\xfc\x01\x81\xab\x58\xf9\x9a\x74\x6d\x8f\x07\xa9\x36\x8f\xf4\x27\xee\x10\xa4\x45\xc1\x9a\x8e\x95\x70\xdf\xc1\x26\xdc\xf2\xba\x7c\x4d\xbe\x41\xf0\xec\xa6\xea\x5b\x5a\xe9\x7f\x2a\x65\xca\x41\x6f\xbc\x26\xff\xf3\xbf\x7f\x42\xa9\xac\xfc\xd5\xb4\x43\x7d\xf8\xff\x01\x00\x00\xff\xff\x40\xb7\x3b\xba\x5b\x18\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: 268379, 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\xfd\x7d\x73\xdc\x36\xb6\x20\x8c\xff\x9f\x4f\x81\x72\xa6\x4a\xf6\xfe\xba\x5b\x71\x66\x76\xea\xae\x77\x6a\x6f\x69\x6c\x27\xa3\xbd\xb6\xac\xb5\x14\x67\xa7\x7e\xf5\x54\x82\x26\xd1\xdd\x58\x91\x00\x07\x00\x5b\xea\xd9\xe7\x7e\xf7\xa7\x70\x0e\xc0\x97\x26\x09\x82\x52\x3b\xf1\x24\xe4\xad\xba\x13\xab\x49\xbc\x1c\x1c\x9c\xf7\x97\xaf\x96\xcb\xe5\x57\xb4\xe0\x9f\x98\xd2\x5c\x8a\x57\x84\x16\x9c\x3d\x18\x26\xec\xbf\xf4\xea\xee\xdf\xf4\x8a\xcb\xf3\xfd\xcb\x35\x33\xf4\xe5\x57\x77\x5c\xa4\xaf\xc8\xeb\x52\x1b\x99\x7f\x64\x5a\x96\x2a\x61\x6f\xd8\x86\x0b\x6e\xb8\x14\x5f\xe5\xcc\xd0\x94\x1a\xfa\xea\x2b\x42\xa8\x10\xd2\x50\xfb\x67\x6d\xff\x49\x48\x22\x85\x51\x32\xcb\x98\x5a\x6e\x99\x58\xdd\x95\x6b\xb6\x2e\x79\x96\x32\x05\x33\xf8\xf9\xf7\xdf\xac\xbe\x5d\xfd\xe9\x2b\x42\x12\xc5\xe0\xf3\x5b\x9e\x33\x6d\x68\x5e\xbc\x22\xa2\xcc\xb2\xaf\x08\x11\x34\x67\xaf\x48\xa1\x64\xce\xcc\x8e\x95\x9a\xe9\x55\x2e\x05\x37\x52\x71\xb1\x5d\x25\x52\x31\xa9\x57\x89\xcc\xbf\xd2\x05\x4b\x60\x2d\x69\x0a\x0b\xa4\xd9\xb5\xe2\xc2\x30\xf5\x5a\x66\x65\x8e\x0b\x5b\x92\xff\x79\xf3\xe1\xea\x9a\x9a\xdd\x2b\xb2\xb2\x1f\xac\xdc\x52\x60\xd1\x29\xd3\x89\xe2\x85\x81\xa5\xdd\xee\x18\x71\x3f\x12\xb9\x21\xd7\xd5\x02\xe0\x55\x5c\xd5\xa7\xc6\xc7\xe6\x50\xb0\x57\x44\x1b\xbb\xac\xde\x99\x14\x2b\x32\x9e\x50\xdd\x3f\x55\xca\x34\x57\x2c\x25\xfe\x2d\x22\xca\x7c\xcd\x54\x7b\x6a\xd6\x9c\xfc\x63\x73\x3c\x9c\xdd\x6e\x77\xcb\xd4\xf1\xf4\xfe\xa4\x56\x1d\x28\x37\x86\xbb\xd8\xb2\xc6\x48\x29\x35\xf6\x9f\x5b\x25\xcb\xe2\x15\xe9\x07\x38\x7e\xe9\x0e\x1c\x91\xe5\x08\x4a\x19\xd7\xe6\x3f\x8e\x7e\x78\xc7\xb5\x81\x1f\x8b\xac\x54\x34\x6b\x1f\x2d\xfc\xa0\xb9\xd8\x96\x19\x55\xcd\x9f\xbe\x22\xa4\x50\x4c\x33\xb5\x67\x3f\x88\x3b\x21\xef\xc5\x77\x9c\x65\xa9\x7e\x45\x36\x34\xd3\x76\xa9\x3a\x91\x76\xe1\x57\x76\x49\x05\x4d\x58\x6a\xff\x56\xae\x95\x43\x5c\xfd\x8a\xfc\xdf\xff\xfc\x8a\x90\x3d\xcd\x78\x0a\x40\xc0\x75\xcb\x82\x89\x8b\xeb\xcb\x4f\x7f\xbc\x49\x76\x2c\xa7\xf8\xc7\xa3\xf3\xa9\x17\x4f\x52\x8b\xff\x4c\x13\xda\xfe\x63\x91\xc9\x43\xce\x84\x59\xb9\xcf\x0b\x25\x0b\xa6\x0c\xf7\xd0\xb1\x4f\xe3\xde\x55\x7f\x3b\x9a\xe8\xcc\xae\xc4\xe1\x9c\x9f\xc9\xd4\x78\xc8\x52\xa2\x61\x95\x16\x2b\xcc\x8e\x6b\x8b\x2d\x16\x2a\x02\xef\x5e\x63\x58\x62\x5f\xa1\x82\xc8\xf5\xff\x61\x89\x59\x91\x1b\x0b\x39\xa5\x89\xde\xc9\x32\x4b\xed\xf5\xdc\x33\x65\x88\x62\x89\xdc\x0a\xfe\xcf\x6a\x64\x4d\x8c\x84\x29\x33\x6a\x98\x3b\x28\xff\xc0\x65\x12\x34\xb3\x30\x2c\xd9\x82\x50\x91\x92\x9c\x1e\x88\x62\x76\x0e\x52\x8a\xc6\x68\xf0\x8a\x5e\x91\xf7\x52\x31\xc2\xc5\x46\xbe\x22\x3b\x63\x0a\xfd\xea\xfc\x7c\xcb\x8d\xa7\x34\x89\xcc\xf3\x52\x70\x73\x38\x07\x7a\xc1\xd7\xa5\x91\x4a\x9f\xa7\x6c\xcf\xb2\x73\xcd\xb7\x4b\xaa\x92\x1d\x37\x2c\x31\xa5\x62\xe7\xb4\xe0\x4b\x58\xb8\x00\x42\xb3\xca\xd3\xaf\xab\xd3\x3d\x6b\xac\xf4\xe8\x26\xe2\x03\xf8\x39\x08\x77\x8b\xa4\x84\xdb\x63\xc5\xcf\x70\xfd\x35\x78\xed\x9f\x2c\x54\x3e\xbe\xbd\xb9\x25\x7e\x52\x38\x82\x36\xcc\x01\xda\xf5\x67\xba\x06\xbc\x05\x14\x17\x1b\xa6\xf0\xe0\x36\x4a\xe6\x30\x22\x13\x69\x21\xb9\x30\xf0\x8f\x24\xe3\x4c\xb4\x81\xae\xcb\x75\xce\x8d\x3d\xe9\x7f\x94\x4c\x1b\x7b\x3e\x2b\xf2\x1a\xe8\x2d\x59\x33\x52\x16\xf6\xa6\xa6\x2b\x72\x29\xc8\x6b\x9a\xb3\xec\x35\xd5\xec\xb3\x83\xdd\x42\x58\x2f\x2d\x48\xc7\x01\xdf\x64\x13\xed\x17\x11\x5a\xd5\x9f\x3d\xfd\xee\x3f\xa1\x9b\x82\x25\x7c\xc3\x13\x40\x74\xc4\xff\x9a\x68\xae\xd9\x8e\xee\xb9\x54\xfe\xef\x8d\xbb\x99\x64\xa5\x36\x4c\xad\x5a\x40\xed\x07\xcf\xae\x5c\x5b\xba\x76\x6e\x99\x95\x12\xcc\x30\xdd\x80\xd4\x3a\x93\xeb\xf3\x9c\xda\xb1\x1e\x0b\x35\xbb\xc1\x25\x15\xe9\x52\x1b\x6a\xca\x16\xe4\xfa\xe8\x05\xd0\x8c\x8a\x97\x5d\x64\x4c\x99\xf7\x54\xd0\xad\x65\x68\x62\xc3\xb7\x47\xaf\x76\x48\x49\xe8\x53\x42\xb3\x4c\xde\x6b\x80\x39\xdf\x1c\x2c\x7a\x53\x72\xc7\x0e\x47\x23\x22\x15\x21\x37\x2c\x51\xcc\x00\x4f\xa7\x5c\xc0\xcb\xd5\xe0\x4d\x58\x37\x27\xb2\x6f\x6f\xf8\xb6\x54\x28\x15\xac\x3a\x23\x07\x5e\x76\xcb\xe2\x2c\x25\x54\x31\x42\x8b\x82\x89\x94\xa5\x9e\x34\xb5\x5f\xee\x0c\xbc\x65\x82\x29\x7b\x29\xc8\xfa\x70\x8c\x0d\x1f\x0a\xfb\x93\x54\x2b\xf2\x3f\xe5\x7a\x70\xd6\xce\x90\x79\xa9\x0d\xd9\xd1\x3d\x83\xf1\x36\x52\xe5\x84\x36\x57\xc9\x05\xfc\x20\x37\x1b\x9e\xf0\x36\x4c\x52\x99\x94\xb9\x27\xd0\xc7\x27\x46\x2a\xf4\xab\x39\x9d\xbd\xa0\xa9\x4c\x74\xe3\x4f\xe7\x48\x8c\xcf\x5b\xeb\x3d\xfa\xd7\xd7\xd4\xc2\x33\x47\x78\xfe\x84\xbf\xf5\x00\xbd\xf7\x90\x74\x0b\xcc\x0b\xd8\x4b\xa9\x99\x22\xc0\x61\x74\x21\x85\xe6\xeb\x8c\x59\xf8\xe7\xf4\x8e\x75\x46\xd5\xa5\xbd\x4e\xc6\xbe\x0e\xec\x75\x45\xae\xa4\xb1\xb0\xa2\x86\x94\x1a\x69\xa7\xa5\x79\x8c\xda\xab\x01\xa4\x90\x3d\x14\x52\x23\x38\x0b\xa9\x35\x5f\xf3\x8c\x9b\x2e\xfa\x19\x49\xd6\x8a\xd1\x3b\x52\x16\x5b\x45\x53\xa6\xdb\xf2\xd0\x8a\x5c\xc2\xac\x34\xdd\x73\x8d\x08\xa2\xd8\x9e\xb3\xfb\x63\x41\xa4\xf9\x28\x96\x31\xaa\x19\x11\xd2\x30\x60\x77\x4c\xc0\x06\x60\xb9\x42\x12\x2e\x12\x99\x17\xd4\xc0\x96\xfb\xa0\xd5\x19\xd1\x42\x6f\x2b\x61\x9f\x7e\xbd\x0d\x0c\xa0\x1b\x03\x54\x9f\xf9\x4d\xac\xce\x8e\x46\x18\xba\xfd\xf6\xb9\x63\x87\xee\x1f\x7b\xe4\xc7\x3b\x76\xf0\xd4\x4f\xe3\x75\x35\x92\x68\x96\x59\x7e\x64\x99\xcd\x8a\x90\xf7\x16\x8b\xd7\x8c\x50\x3c\xa5\x9e\x51\x89\xff\xf6\x8e\x1d\xba\xc8\x33\x40\xe0\xfd\x03\x62\xe4\xd8\x52\xcf\xac\x7c\xe6\x17\xaa\xd8\x86\x29\x2b\x35\xf5\x11\xe4\x9a\x0a\x57\x37\x22\x91\x22\x61\x85\xd1\xe7\x72\xcf\x94\x3d\xe6\xf3\x7b\xa9\xee\xb8\xd8\x2e\xef\xb9\xd9\x2d\x91\x9f\xe8\x73\x90\x4a\xcf\xbf\x86\xff\xe9\xdd\xe4\xed\x87\x37\x1f\x5e\x91\x8b\x34\x25\xd2\xec\x98\xb2\xb8\xbe\x29\x33\xb2\x01\x89\x72\xd5\x10\xd4\x16\x20\x36\x2c\x48\xc9\xd3\x7f\x3f\x3e\xb4\x51\x78\xc8\x02\x29\xe4\x28\x4c\x90\xb5\x1d\xc8\xfd\x8e\xc1\x72\x2c\x68\x1c\xc9\x95\x8a\x58\xe6\x6f\x0f\x37\x77\xa7\x87\x72\x61\xdf\xe9\xe1\x6a\xd6\x52\x66\x8c\x8a\xa3\xdf\xad\xf8\x60\x59\xe5\xf1\x62\x96\x3d\x54\xbf\x97\x3b\x93\x2e\x37\xfa\xc8\x32\xba\x66\xd9\x63\xb8\x51\xfb\xd3\xcf\xc3\x8d\x80\x20\xda\xdb\x6e\x67\x8a\x63\x47\x03\x6f\xff\x12\xfc\x28\x34\x7f\x97\xe0\x56\xeb\x79\x3c\x67\xea\x0c\xda\xe6\x54\xa7\xe6\x4c\x3f\xb9\xad\x39\xd6\xd4\x77\x02\xfd\x47\x16\xcf\x9c\xba\x6c\x9b\xde\xb1\xa7\x31\xa7\xce\x90\x0d\x66\xf5\x68\xe6\xd4\x19\xb4\x81\x10\x93\x98\x53\x0b\x5c\x9d\x51\x9b\xe0\x9b\xb9\xd3\xcc\x9d\xda\xcf\x6f\x99\x3b\xdd\x24\x8a\x16\x6c\x22\x5f\x6a\x7d\x34\xc4\x91\x9a\x1c\xa8\xef\xc2\x85\x39\x92\x86\x29\x8e\x59\x11\xb9\xe9\xfb\x73\x80\xe6\x8f\xf3\xa0\x10\xcf\xe9\x0c\x1c\xa7\x13\x8d\x71\x9a\xce\xb0\xd1\x3a\xd1\x09\x39\x0d\x02\x38\xa4\xfd\xb4\x8e\x60\xa2\xde\x03\xac\xa4\xbb\xcf\xdf\xa4\xde\xd3\x03\x27\xe0\x21\xc3\x2b\x9d\x79\x4a\xff\x52\x67\x9e\xd2\x85\xc9\xbf\x0e\x4f\xd9\x80\xbb\xab\x83\x90\xad\xdd\x5c\x6e\x6a\x32\xb8\x70\x57\x3b\x3d\xd3\x60\x51\x4f\xcb\xcc\xd2\x81\x44\x0a\x6d\x14\xe5\xc2\x74\x04\xdf\xd0\x55\x10\x32\x65\x17\x03\x4b\xe8\x2c\xe3\x0d\xfc\x63\xcd\x34\x7c\x56\x2d\xbd\xb9\x0c\x55\x66\x4c\x5b\xda\xed\x57\xd9\x87\xf2\xa1\x05\xe1\xef\x16\x89\x15\x4b\xdf\x94\x16\x0b\x6e\xaa\xe1\x2f\xb7\x42\x56\x7f\x7e\xfb\xc0\x92\xb2\xdf\xe6\xd5\xb3\x76\x7b\x9f\xdd\x3a\x99\x22\xf7\x3c\xcb\xdc\x34\x70\xa7\xdd\x0f\x76\xc1\x40\xb8\xec\xfe\xfa\xf1\xdc\x3e\x40\xcf\x34\x35\x5c\x6f\x90\xf7\x55\x90\x60\x0f\x85\x62\x5a\x1f\x31\x36\xe0\x90\x96\x4c\xdb\xcb\xb0\x18\x1c\x76\x5d\x1a\x4b\xeb\x2d\x11\x4f\x76\xd2\x12\x71\x8a\x80\x86\xf9\xf6\x5c\x02\x83\x22\x52\x30\x8b\xc3\xb9\xbd\xde\x78\xe9\x07\x47\x6c\x2c\x67\x05\x10\xa8\x87\xe3\x9a\xe4\x52\x9b\x1a\xd6\xf6\x2f\xc0\x4e\x05\x23\xf6\xea\x07\x76\xcf\xc8\x56\x31\x60\x96\x44\x97\xb9\x5d\xc4\x3d\xe3\xdb\x9d\xd1\x0b\xc2\x57\x6c\x05\xc7\xcf\x68\xb2\x6b\x4c\x97\x33\x66\x86\x01\x4a\xb3\xac\x22\xb4\x0d\x5c\xc2\xfb\x65\xf9\xb8\x26\xcf\x2b\x9f\x88\xf3\x53\x2c\xaa\xfb\x77\x8c\x25\xc3\xd3\xf4\x1c\xd3\x82\x30\x93\xac\x5e\x2c\x88\x65\x4d\xa5\xb1\x30\xb7\x7b\x5a\x1f\x08\x37\x56\x6a\x41\x1e\xab\x64\xb9\x0d\x43\x84\x65\x6e\xa1\xde\x71\x06\x87\x0d\x1e\x2c\x2b\xaa\x89\x2d\x79\x86\x40\x7a\xe6\x05\x2a\x5d\xe6\x83\x23\x72\x04\x06\xc0\x2f\xa7\x26\xd9\x39\x37\x5d\x22\x15\x8a\x0d\x30\x22\xfc\xf2\xb6\xde\xcb\x7f\x0f\x22\x83\x1d\xec\xb9\x7e\x01\x87\x0b\x83\xed\xf8\x76\xe7\xcf\x90\x2a\x14\x19\xda\x38\xd1\x77\x79\x61\x79\x86\xe5\x03\x77\x97\x1c\x5f\xbc\x0b\x41\x58\x5e\x98\x43\x03\xd3\x1a\x67\x6c\x98\xca\xab\x1d\xd2\xac\xab\x63\xd6\x8f\x63\x45\xb8\x7e\x9e\x17\x19\x4f\xb8\x71\x98\x47\xbe\x21\xcf\x01\xf5\xb8\x39\xd3\x70\x6d\x96\xb2\x78\xb1\x22\x17\xde\xc7\x3f\xf4\x8c\x2f\x4a\xc8\x6a\x66\x37\x85\x5d\xa8\xee\xda\x02\xea\xa7\x9a\x7f\xf0\x9d\x31\x0a\xd8\x5c\x1c\x13\x49\xaf\x0c\x50\x3f\x6d\x78\x23\xd6\xa0\x98\x62\xe9\x30\x53\xf9\x82\x50\xad\x65\xc2\x41\x5e\xf7\xe7\x1f\x1c\x92\x1c\xa1\x1a\x82\x79\x78\x43\xf1\x9b\x22\x60\x36\x69\x23\xee\xd8\xfb\x9d\x2d\x66\x5c\x1b\x7b\xd3\xda\x5b\x6d\x12\x8c\xd1\x11\x89\xbd\xe3\xf6\xfb\x33\x4d\xc0\xbc\xd1\x63\x30\x3a\x7e\x46\xf0\x7e\x70\xb9\x83\xcb\x74\x1e\x61\xf7\x4b\xc4\xc0\x8e\xf9\x38\x45\x50\x3b\x2f\xf8\x02\x75\x47\x74\x98\x53\x41\xa4\x53\xb8\xe0\xe5\xa8\x51\x15\x43\xe6\x62\x9c\xd8\x6b\x07\x72\x1e\xf6\x88\xef\xe3\x4f\x1e\x9f\x01\x01\xbc\xef\xe9\x30\x71\xb4\xdc\xd9\x35\x02\x24\x50\x38\x9f\x00\x3f\x02\x81\x12\x45\xc6\x41\x45\x89\xd9\x1d\x19\x93\x4a\xfb\x1e\x7f\x04\x8f\xda\xe7\xc7\xca\xbd\x8f\x07\x7b\xa6\xf1\x80\xec\x5d\xd9\xf1\x22\x7a\x9f\x46\x02\x76\xc1\x55\xf1\xf1\x12\x9f\xac\x9e\x52\x2d\x0f\x15\xaf\x4b\x31\x2c\x95\x1c\x3f\x57\xd2\x5c\x8a\x05\x79\xfb\xc0\xb5\x65\xf8\x6f\x24\xd3\x57\xd2\xc0\x3f\x57\xe4\x7b\x83\x38\xf8\x6e\x84\x54\x34\x96\x38\x15\xb0\xb8\x8f\x47\x81\xf5\x42\x10\xaa\x14\x05\xa5\xae\x19\x85\x61\xb5\xdd\xb0\x20\x75\xfc\x54\x17\x8c\x6b\x72\x29\xac\x38\xe6\xc0\x02\xb1\x34\x30\x26\x4e\x15\x3d\xa2\x57\x45\x84\x14\x4b\xe0\x97\x7e\x4d\xad\xb9\x10\xea\xf1\xcb\x54\xad\xf3\xe9\x2e\xcf\x4f\x1b\x3d\xe2\xf0\xd2\xbe\x07\xcd\xea\x5d\x6b\x92\xf8\x0b\x59\x2f\x06\x0c\x40\x14\x42\xb4\xb2\x4a\xac\x5a\x90\xfb\x1d\x4f\x76\x20\xb7\x47\x0f\xba\x66\x18\x50\x54\x28\x66\xf9\x1e\xd5\x96\x34\xba\x00\x36\x2b\x0e\x73\x0f\x04\x1e\xbf\x50\xc5\x8a\x8c\x26\x2c\x25\x29\x08\x9d\x18\xce\x43\x0d\xdb\xf2\x84\xe4\x4c\x6d\x19\x29\x2c\x6f\x8b\xc5\xfe\x68\x86\x82\xcf\xe4\xcb\xe2\x3f\x89\xc5\xc5\x21\x95\xb6\xef\xe9\x53\x73\xfb\xdf\xf3\x68\x12\xf1\xf2\xa0\x9e\x3c\xfc\x72\xcc\xde\x40\xe0\x70\xf1\x7c\xbf\xb2\xac\xe1\x2c\x22\xb3\xac\x31\xcb\x1a\x03\xcf\x2c\x6b\xf8\x67\x96\x35\x66\x59\x63\x96\x35\x66\x59\xe3\x5f\x48\xd6\x88\x1c\x14\xed\x29\x13\xcc\x3a\x3f\xa2\x9d\xeb\xd8\x8e\x03\x82\x8d\x8f\x1d\x6f\x99\x6c\x46\x76\x64\xc5\x84\x1b\xc7\xcb\x6e\xc1\x44\xe4\xdc\xa9\x8a\x8a\x2d\x23\x2f\x97\x2f\xbf\xf9\x26\x8c\x59\x1b\xa9\x72\x6a\x20\x25\xe4\x8f\xdf\x46\xc0\xa4\x4e\x1d\xe9\x7f\xc6\xf1\x61\xd9\xb0\x88\x05\x5e\x42\xd8\x0e\x5b\x6b\xc7\x4f\x68\xec\xb0\x87\x2c\xcf\x4f\xf0\x4f\x38\x2a\x57\x99\xa8\x5b\xc6\xef\x8e\x2b\x61\x70\x73\xce\xea\xac\xc0\x09\x4b\x72\x66\x08\x35\x2d\xd3\x26\xcf\x59\xe5\x41\x42\x37\x08\xc6\xf9\x0f\x8e\xe8\x7d\x23\x29\x91\xc2\x59\xae\x2d\xee\xac\x22\x57\x3c\xec\xed\x68\x3a\x45\x48\x02\x8e\x63\x23\x2d\x21\xf5\xab\x96\xb9\x5d\x25\x17\xc6\x13\x40\xbb\x64\xe6\xa1\x3a\x38\xf0\x73\xb6\xda\xae\x48\x5a\xc2\x70\x54\xb8\x04\x86\x17\xb8\x6b\x7d\xd0\x86\xe5\xe0\x63\x91\x0a\xfe\xc7\x6e\xdf\xa8\x43\x5f\x74\x97\x7f\xd8\x9e\x09\x53\xd2\x2c\x3b\x10\xb6\xe7\x89\xa9\xe0\x07\x39\x16\xdc\xa0\x3f\x6c\xe8\xb6\xc4\x08\xac\xc7\xb7\x31\x48\xa7\x8f\xc4\x37\x44\xc5\xd5\xa0\xa6\x62\xec\x78\xe0\xfe\x09\x5f\x52\xfb\x1a\x60\xce\x87\x8f\xc3\x96\x7f\x12\xc7\x48\x8e\x75\x92\x32\xcb\x2c\xbc\xd1\x11\xd0\x5d\x9e\x37\xb6\x8f\xd2\x2c\x6f\x8a\x47\x6f\x56\x0b\xe3\xd0\x7f\x84\x9e\x8c\x8b\xab\x37\x16\x22\x63\x5b\x26\xe4\x56\x16\x32\x93\xdb\x43\x13\xf6\x70\xfb\xc1\xc1\xe0\x46\xa6\x44\x97\x6b\x27\xd9\x8e\x0b\x6e\x57\x47\x47\x39\xdb\xcc\x67\x3d\xb6\xef\x99\xf5\xd8\xce\x33\xeb\xb1\x91\x4b\x9c\xf5\x58\x78\x66\x3d\x76\xd6\x63\x47\x9f\x59\x8f\xed\x79\x79\xb6\x99\xcf\xb2\x46\xe0\x99\x65\x8d\xce\x33\xcb\x1a\xb3\xac\x31\xcb\x1a\xb3\xac\x11\x7c\x66\x59\xa3\xe7\xe5\x93\xd9\xcc\xc7\x87\x1b\x03\xcf\xb2\x6b\x68\x0b\x5a\x80\x07\x97\x14\xfc\xb9\x90\xe9\x23\x42\xea\x0b\x99\x06\x22\xea\xd1\xa8\x99\xc8\x65\x26\x13\x2c\x9c\xd4\xb3\x28\x7b\x63\xec\x30\xce\x92\xaf\x69\x8e\xb6\xda\x05\xf9\xa7\x14\x0c\x23\x9d\x21\xa5\x4a\xe6\xcc\xa5\x69\x14\x32\x7d\xae\x5f\xf4\x46\xaa\xce\x51\xfa\xbd\xcf\x1c\xa5\x3f\x47\xe9\xbb\xa7\x19\xa5\xbf\xa3\x1a\xf1\x12\x19\xe1\x70\xd0\x7e\x83\x3a\x58\x02\xf4\xdf\x83\xeb\xfd\x95\x62\xf6\x2d\x12\x3a\x64\x81\x7c\xd4\xfa\xe0\x71\x5f\xa9\x73\x47\xb2\xf4\xba\xbd\x9b\x00\xf5\x46\x1d\x0e\xf3\x21\xd3\x94\xa5\xa4\x60\x6a\x89\xa8\x27\xc9\x86\x8b\xb4\x67\x2f\x7e\xff\x83\xc3\x46\xc6\xd1\xb7\x17\x39\xc1\x75\xd1\xf4\xae\xb4\x08\xf4\x71\x54\xfd\x08\x2f\xac\xce\xef\x73\x46\xd5\x83\xe6\xe5\x99\xdb\x74\x95\x1d\xf4\xb6\x7f\x94\x4c\x1d\x88\xdc\x33\x55\x6b\x26\x55\x09\xb4\x18\x25\x04\x78\x0f\xd7\x24\xa1\x1a\x09\xf5\xb8\xa8\x35\x4d\x3b\x9d\xee\x07\xe9\x6c\xf6\x78\x08\xd4\xf2\xbd\xcd\xa2\xbf\xd6\x41\xff\xd3\x6b\xda\xe8\x71\x4e\xd1\x9e\xb4\xde\xfe\x07\x5d\x57\x51\x2f\x4f\x12\x4e\x7b\x4f\x7b\xc0\xe4\x11\xaf\x16\x34\xdc\x78\x23\x66\x8f\xf8\x31\x8f\xcc\x23\x4f\x34\x7d\x90\x47\x98\x3f\xc8\x34\x13\x08\x39\x06\xaf\x5d\xa5\xe3\xd3\x5d\x6b\xc8\x84\x41\x1b\xf8\x35\xdd\x22\x42\x1e\xa7\x8f\x4c\xb7\x8c\x90\xe3\xed\x57\xc7\xa7\x3a\x66\x92\x49\x9b\x6f\x9a\x54\x86\x4d\x25\x93\x86\xec\x98\x55\xda\xe6\x12\xc0\xad\x96\xc5\xe4\x73\x03\x7b\x9a\xb5\x84\x1c\x83\xda\xd9\x0a\x38\xa8\xce\x47\xb6\x93\x49\x80\x69\xdb\x59\x06\xed\x27\x93\xc6\x1c\x32\x66\xb4\x6d\x28\x93\x87\xec\xda\x5b\x3a\x76\x94\xd3\x2c\xd3\x2d\xb1\x36\x44\x4c\x1a\x16\x6b\xa7\x9e\xd2\x18\x41\xa6\x1b\x24\xc8\x63\xf1\x72\xaa\x61\x82\x4c\x34\x4e\x90\x09\x06\x0a\x32\xd5\x48\x41\xa6\x1a\x2a\xc8\xe4\xfd\x82\x08\xf1\x0e\x42\x20\xe2\xb6\xdb\xac\x19\x3d\x95\x1b\x4d\x3e\xc1\xae\xb4\x83\x4b\x45\x41\x27\xa7\x85\xa5\x12\xff\xd7\xb2\x66\x40\xfc\xff\x8c\xe5\xa3\x94\x2b\x6d\x45\x61\x67\xfc\x6b\x8c\xe0\x6d\x0e\x8d\xc9\x22\x07\xb5\xab\xe1\x9a\x58\xdc\xd9\xd3\xcc\x0a\x20\x18\xb6\xe5\x54\x35\xbb\xd2\x63\x79\x2d\xf6\x7e\xdf\xef\xac\x7a\x6e\x99\x2f\xaa\x79\x5c\x93\x67\x77\xec\xf0\x6c\xd1\xa1\x23\xcf\x2e\xc5\xb3\xd8\x51\xa9\x53\x55\x5a\x34\xa3\x92\x7c\xa4\xc8\x0e\xe4\x19\xfc\xf6\x2c\xf6\x62\xf7\x89\x8b\x53\x04\xc1\x47\x18\xe5\xa2\x5e\x16\xbe\xd2\xf5\x54\x07\x60\xfd\x61\x65\x5f\xf1\x8a\x71\xfd\x53\x8c\xb5\xd1\x4b\x50\x37\x5d\x39\x88\x3c\xaf\xd2\xc6\xb7\x16\xf2\xe6\xc5\xb0\x2a\xdd\xd8\x52\x2b\x12\x0d\x44\xfe\x9c\x51\xa1\xc9\x33\x6f\x3d\x3b\xd3\xf5\x1a\x9f\x9d\xce\xe3\x38\xe9\x0e\xc7\xd3\x22\xe3\x02\xd8\xfe\x23\x46\x5c\x3d\xd2\xf1\x9d\xb5\xd0\x15\xec\x5e\xb3\xda\xbc\x98\x92\xe7\x5e\xd3\x1d\xd6\xbd\xeb\x47\x2a\x88\xa2\x6c\x7d\x2e\x0c\x5f\x56\x63\xd4\xfa\xaf\xd5\x08\x63\xc9\xab\x0f\x6b\x6e\x63\x80\x37\x6e\x56\x76\xbb\x1a\xa3\x62\x6e\xf0\xfd\x8e\xa9\xd6\x4e\xb9\x2f\xb9\x0e\x1e\x08\x55\x0a\x28\xaf\x25\x85\x33\xeb\x45\x0d\x69\xc9\x0c\xd6\xf3\x76\x66\x12\x14\xfb\x61\xd7\x20\xfb\xd7\xa7\x14\x19\xea\x48\xbc\x01\x13\x8a\xac\xbb\x98\x49\x29\xdc\x25\xb2\x7f\xa9\x0a\x13\x59\xb8\xb0\x34\x16\xb2\xbc\xda\xe3\x8a\xbc\x85\x4b\xd0\x5c\x1c\xd7\x70\x92\x50\x9b\x2c\x86\xfa\x44\x63\x75\x9c\x6c\xb0\x6c\x2e\xe6\x14\x2e\x83\xc9\x61\xf6\xf7\x27\x0e\xb3\x3f\x32\x3d\xfd\x8b\x44\xd9\x47\x1a\xf5\xe6\x50\xfb\x39\xd4\xbe\x11\x6a\x0f\x1f\x21\xe5\x1b\x8f\xb9\x1f\xc6\x19\x88\xc5\x8f\x8d\xb9\x27\x3f\xee\x18\xdc\xa8\x80\x81\xcd\x1e\x51\x5e\x66\x86\x17\xb5\xc3\x5a\xe3\xd2\x32\x54\x1f\x31\x50\x49\x1f\x59\x67\x43\x19\x01\x34\xd9\x1d\x5f\x13\x98\x07\x1c\xda\x1a\x28\xb2\x73\xb3\xd0\x2c\x73\xb1\xf5\x56\xaf\x1c\x3e\x23\xe6\x7c\x55\xfc\x34\x26\xfc\x37\x55\x1b\x11\x67\x34\x01\xe7\xc4\x73\xcb\x2c\x33\x8b\x0e\x96\x65\x79\xaa\x16\xf2\xb9\x76\xf8\x2f\x5a\x65\xf6\xcc\x3b\x48\xb6\x7c\xcf\x44\xcd\x84\x9f\xeb\x17\x2f\xc6\xc2\x9a\x4c\xa4\xe8\xd1\x15\x2c\x02\x83\xf6\x89\x1c\x8b\x48\x76\x1f\x18\xb6\x12\x04\x22\xd8\xfc\x5f\x1a\xdc\xeb\x7f\x04\xc6\xac\x9d\x43\x83\x0c\x1e\xc0\x53\xb1\xf8\xea\x00\x03\x83\xf2\xf1\xdd\xc4\xd9\x41\x27\xb8\x11\x1e\xe1\x42\x20\x7c\x98\x9c\xe0\x33\xc5\x7d\xf0\x8b\xa5\x4f\x44\xb8\x0c\xa6\x84\xb9\x8d\xbb\x0b\x62\xf5\xbf\xc7\x86\x3c\x06\x1d\x00\x73\xcc\x63\xf0\x89\x37\xf6\xff\xf6\x42\x1f\x03\xc6\xfd\x2f\x34\x06\xf2\xd1\x46\xfd\x5f\x32\xf4\x31\x64\xc8\x9f\xe8\xed\x22\x63\x46\xfc\x27\x06\x00\x8e\x05\x41\x46\x8f\x39\x60\xbc\xef\x37\xc8\x47\x8f\xda\x67\xb8\xef\x35\xc6\x47\x8f\x38\x47\x10\x8e\xbe\xf7\x6b\x47\x10\x4e\x34\xc8\x3f\xd6\x18\x3f\xe9\x74\xa6\x1a\xe1\x9d\x79\x3d\x62\x19\x91\x06\xf8\xae\x69\x3d\x66\x8b\xa3\xc6\xf7\x63\xb3\x7a\x9c\xd1\x29\x64\x78\xef\x35\xa9\x47\x0c\xdb\x6f\x74\x7f\x92\x38\x15\x8d\x9d\x91\x2f\xc6\x9a\xd0\xa7\x9b\xcf\x23\x62\x09\x26\x98\xce\xbd\x61\x7c\x64\xc4\x53\x98\xcd\xa3\x28\x62\xf4\x4d\x8b\xa3\x10\xd1\x66\xf2\xcf\x61\x22\x9f\x68\x1e\x8f\x51\xcb\x49\xaf\x6a\x1e\x32\x8d\xa3\x26\x3c\x32\x64\xbc\x59\xbc\xa9\x0d\x8f\x6d\x3f\xd6\x24\xde\xd4\x87\xc7\x3c\x53\x51\xe6\xf0\xae\xb1\x3b\xde\x9b\x32\xc9\x14\x1e\x85\xad\x31\x96\xd7\x18\xf3\xf7\x93\x8d\xaa\xa3\xc1\xeb\xc2\xf0\xc7\x06\xb0\x37\xf1\x7a\x20\x8a\xbd\x77\xcd\x74\x2f\x79\x4a\x8a\xd2\x98\xaa\xa9\xc5\xb4\x48\xf6\xde\x51\x7f\x57\xd1\xed\x2d\xd0\x07\x43\xdc\xc3\x26\xed\xc5\x23\x42\xdc\x07\x47\x74\xd7\xf2\x11\x21\xee\xc3\x43\xba\xd0\xf7\x47\x85\xb8\x0f\x8e\x0a\xa1\xef\x8f\x0b\x71\x1f\xbd\xf1\xc7\x28\x34\x7c\x56\x3e\xce\x7d\x70\xc8\xf1\xf8\xf7\x40\x9c\xfb\xb0\x85\x3c\x18\xff\x1e\x88\x73\x1f\x06\x67\x74\xfc\x7b\x27\xce\x3d\x80\xf2\x73\xfc\xfb\xd1\x33\xc7\xbf\x37\x9e\x39\xfe\x3d\x72\xb3\x73\xfc\xfb\x1c\xff\x3e\xf6\xcc\xf1\xef\x73\xfc\xfb\x1c\xff\x3e\xc7\xbf\xcf\xf1\xef\x73\xfc\x7b\xcf\x33\xc7\xbf\xcf\xf1\xef\x73\xfc\x7b\xe3\x99\xe3\xdf\x47\xb6\x32\xc7\xbf\xcf\xf1\xef\x73\xfc\xfb\x1c\xff\x3e\xc7\xbf\xf7\xbc\xf2\xab\xc4\xbf\xb7\x8c\xd0\x83\x41\xf0\x01\x73\x6c\x5d\x3f\x65\x62\x10\xfc\xe0\x98\x6b\x36\x1e\x04\x3f\xb8\xec\xc1\x51\x07\x6a\xfc\x44\x45\xc2\x0f\x9b\x5e\x9b\x11\xf2\x93\x22\xe1\x03\x46\xf3\x9e\xaa\xf4\x4f\xac\x3e\x4f\x1a\x11\xf2\x8f\x8d\x84\x1f\x46\x01\x39\x47\xc2\xcf\x91\xf0\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xe3\x33\x47\xc2\xcf\x91\xf0\x73\x24\xfc\x1c\x09\x3f\x47\xc2\x77\x9e\x39\x12\xbe\x77\xb9\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xd7\xcf\x1c\x09\xdf\x7e\xe6\x48\xf8\x39\x12\x3e\xf0\xcc\x91\xf0\x9f\x27\x12\x7e\xf0\x27\x9a\x59\x2e\x29\xb6\xc7\x8b\xef\xb1\x39\x91\x94\x19\xca\x33\x2b\x71\x6d\xa9\x82\x88\x47\xff\xf5\x31\x14\x43\x3a\x1a\x7c\x93\x53\x41\xb7\x4c\xf5\x92\x8b\xb6\x42\xdb\x78\xfb\xad\x48\xc1\x96\xa9\xc9\xb5\x92\x39\x33\x3b\x56\x6a\x7f\x85\x37\x5c\x31\x1c\xba\x5f\x4e\x75\x04\xb1\xef\xb8\x03\x74\x2b\x62\x29\x69\xc3\x1e\x67\x51\x94\x4b\x01\xa8\xee\x58\xf9\xc0\x41\xd6\xdf\xe3\x99\x78\x96\x57\x01\xd5\xcd\x43\x2e\xaf\x35\x46\xd4\x86\xb7\x17\xdc\x60\x8c\xce\x4c\x0b\xfe\x89\x29\x1d\x30\xba\x1f\x41\xc3\xbd\xed\xef\x67\x13\x38\xe4\xe2\xfa\x12\xef\x7c\x7d\x4e\x81\x6b\x56\x6a\x64\x5e\x9a\x89\xd4\xed\x71\x45\x2e\x0d\x49\xa8\xb0\x94\xf9\xd9\xfe\xe5\x33\x4b\x6a\x9f\xed\xbf\x0d\xb8\xe0\x23\x6e\xea\x9a\x51\xc5\xd4\xad\xbc\x63\xe2\x3b\x9e\xb1\xc8\x7d\xfe\xb5\xfd\x95\x5d\xa8\x62\xd4\x99\xab\x37\x3c\x63\xae\x1e\x8c\x91\x76\x23\x21\xe7\xd5\x8e\x09\x42\x4b\xb3\x63\xc2\xf0\xc4\x05\xb9\xcb\x16\xe0\x9e\xb4\x3d\xcb\x13\x22\xf7\x74\x45\x73\x30\x75\x76\xb0\x90\x0b\xf8\x0d\x58\xcb\x93\x17\x03\xa3\x4c\x58\x11\xbc\xdf\xb7\xac\x27\xad\xa4\xa0\x66\x77\xad\xd8\x86\x3f\x44\x2e\x05\x5f\x86\x64\x0b\x8b\xd8\x7f\xbb\xbd\xbd\x86\x41\x1c\x6a\x82\xd0\x59\x94\x7a\xc7\xd2\xa0\x2d\x27\x66\x69\x52\x05\x9c\x99\x54\x1c\x3e\x6c\x82\x3c\x25\xca\x43\xb8\x8c\x63\x62\x6d\x10\x48\x65\xfa\x6f\xb5\xd5\x3a\x1e\x0a\xa9\xc1\x9f\x35\xbc\xf9\x87\xe5\x5d\xb9\x66\x4a\x30\xc3\xf4\x92\x0b\xb3\x94\x6a\x89\x0b\x78\x45\x8c\x1a\x94\x2c\x74\xb2\x63\xd1\x48\x7c\x03\x2f\xbb\x7b\x87\xb7\x6b\xc3\x55\x45\x40\x03\x0a\x57\x04\x40\x4c\xa6\x5f\x4b\xb1\xe1\x1d\xbe\x38\xb0\x98\xdb\x77\x37\x04\x3f\xf0\x0b\xb2\xf8\xd3\xa2\xe4\x89\x14\x02\xf9\xc3\xf0\xca\xe2\x6c\x9b\x09\x9d\x20\xeb\xde\x98\xb2\xcd\x5e\xec\xb9\xbe\xbe\x20\x09\x53\xa6\xb9\xd6\x71\xad\xc3\x50\xb5\x65\x21\xb8\xc6\xef\x80\xa0\x92\xb7\xe1\xdb\xf7\xb4\x98\x68\xb1\x7f\xed\xbf\x6b\x6e\x2a\xa5\x86\x36\x76\x13\xa3\x0f\xef\x58\xdc\x8e\xa6\xed\x8a\x4c\xb1\x38\x77\xb2\x74\x50\x80\x76\x92\xc4\x94\x68\xb1\x68\xc3\x52\x98\x4b\x0c\x2e\xee\xcc\xb3\x0c\x88\x76\xc0\xae\xf5\x66\x45\xde\x4b\x70\x8d\x6e\x64\xac\x21\x6c\x67\x4c\xa1\x5f\x9d\x9f\xd7\xe4\x61\xc5\xe5\x79\x2a\x13\x7d\x9e\x48\x91\xb0\xc2\xe8\x73\xb9\x67\x6a\xcf\xd9\xfd\xf9\xbd\x54\x77\x5c\x6c\x97\x56\xb7\x58\xba\x56\xd9\xe7\xc0\x59\xce\xbf\x86\xff\x89\x9c\xf4\xf6\xc3\x9b\x0f\xaf\xc8\x45\x9a\xba\x2e\x41\xa5\x66\x9b\x32\xf3\x6d\x18\x1b\xa2\xcf\x82\xdc\x71\x11\x68\x96\xd3\x7e\x4a\x9e\xfe\xfb\xd9\xe7\x38\x23\x59\xa0\x0d\xeb\x11\xe7\x74\x03\x2a\xe2\xc1\x92\x43\xd8\x2a\x5c\xf6\xea\xc2\x44\xbb\x2b\xb8\xd1\x80\x8b\xde\x2e\xec\x34\xc6\x09\x9b\x5d\x4b\x99\x31\x3a\xe6\x12\x9c\x62\xb6\x8c\x33\x5a\x4e\xb0\x42\x6a\x96\x28\x36\x12\x4d\x44\x3a\x00\x86\x8f\x02\xa4\x27\x32\x29\xe4\x8b\x24\x3d\x95\xae\x0d\x7b\xac\x08\x11\xc8\xba\x2b\x42\xde\xc7\x9b\xeb\xd7\x8c\x50\xb2\x07\x6f\x8f\x1b\xed\x8e\x1d\x66\x82\x36\x13\xb4\x88\x67\x94\xa0\xb9\x3b\x28\x95\xa5\x53\x91\x7b\xfb\x8d\x53\xb3\xc8\x17\x13\x1a\xd6\x7c\x49\x47\x13\xb0\x8a\x8f\x0b\x08\xf2\x42\xa3\xb3\x46\x36\x6c\x30\x8e\x1a\x06\xb4\x10\xb7\xca\x16\x95\x8c\xa3\x81\x91\xa8\x66\x57\x36\x49\x2a\x56\x3d\x62\x71\x92\x71\x26\x0c\xee\xd2\xaa\xf6\x11\xa2\x64\xf4\x3e\x66\xc1\x78\x16\x8c\x03\xcf\xcc\x47\x66\xc1\xb8\xf5\xcc\x82\xf1\xc8\x33\x0b\xc6\xe1\x67\x26\x68\xbf\x3b\x82\x36\x0b\xc6\x8f\x7d\xd1\x8a\x7c\x4f\x10\x8d\x3b\x82\x63\x47\x46\x1e\x97\xf9\x50\x82\xfe\x2c\xc2\x31\x17\x9a\x25\xa5\x62\x37\x77\xbc\xf8\xc4\x14\xdf\x4c\x09\x96\x78\xc3\x35\x5d\x67\x7e\x41\xb0\x47\xbe\xe1\x09\x35\x0c\xe9\x18\x0d\x9b\xb4\xc9\x04\x5c\xb9\x63\x87\xa7\x1f\x02\xc6\x2f\x7d\x71\x67\x70\xc7\x0e\x37\x11\x7c\x75\x84\xa7\xf6\xed\xf3\x57\x51\x52\xa2\xf8\xe9\x67\xe4\xa5\x8f\xe4\xa3\x13\xe8\x73\x1c\xff\x9c\xc6\x3b\x7f\x79\xae\xf8\x19\x38\x62\x1c\x37\x9c\x00\xe9\x78\x2e\x38\x8d\x03\x46\x46\xb9\x4e\xe5\x7e\xf1\x9c\x2f\x36\x4d\x76\x6c\x9d\x91\x4c\x4c\x33\xb5\x67\xea\x6a\x14\x6f\x5b\x50\xfc\x41\x83\x23\x9b\xec\x81\x2f\x60\x55\x3a\xa9\x8d\xc5\xaf\xcf\x40\x07\x47\x77\x12\x06\xd9\x12\x6e\x65\xe0\x27\x88\x21\x18\xf8\xbd\x90\xaa\x7f\xce\x91\x45\x0d\x07\x5d\x0d\x2d\x76\xd9\x0e\x72\xfa\x2a\x72\x3a\x5a\x70\x3c\xc2\x7e\xd7\x73\x3b\x18\xe9\xfa\xf2\xa6\xf1\x2e\x86\xb3\xf9\xb0\xd2\x03\x96\xa7\xb1\xe7\x88\x59\x3a\xa5\xd9\x11\xcb\x04\xfb\x32\xcd\x8c\x24\x34\x49\x98\xd6\xf5\xfc\x10\xfd\x9f\xb1\x8d\xc1\xb8\xd0\x45\xd3\xd6\xc7\x35\xa1\x5a\x97\x39\x62\x8d\x2a\x85\x95\x2e\x78\x4f\x66\xbd\x23\x83\x49\x56\x6a\xc3\x14\xac\x03\x12\x66\x53\xae\x13\x48\x22\xbb\xb8\xbe\x74\x28\xab\xed\x0a\x65\x4e\x0d\x4f\x20\x31\xd4\xbe\xdb\x17\x4c\xe3\x22\x29\xcf\xb4\xb7\x45\x7a\x41\xc4\x7e\x80\xe1\x3d\xc4\xc8\x3b\x88\x04\xc8\x18\xa1\x86\x9c\xef\xa9\x3a\x57\xa5\x38\x47\x26\xa1\x8f\x08\xaf\x9d\x9e\x27\x8c\x26\x89\x2c\x85\x39\x9f\x12\xc6\xb6\xa6\x9a\x27\x17\xa5\xd9\x8d\x86\xb0\xfd\xd5\xbf\x89\x87\x04\x61\xd8\x2e\xc2\x05\x80\x5f\x87\x04\x31\xcc\xae\x83\xa1\x7b\x31\xb5\x19\x3e\xd4\xdb\xc8\x6a\xb4\x0e\x2c\xd5\xfa\x5e\xaa\x41\x8a\xd4\x2d\xf0\x8a\x04\xd5\x47\xa0\x22\xbc\x48\x2e\x05\x37\x52\xd5\x57\x2e\x9c\xfc\x55\xc5\x73\xc3\x01\xba\x25\x60\x84\x44\x6b\x43\x43\x04\x26\x46\x2c\x19\x11\x48\x3e\x8b\x28\x32\x59\x08\x89\xa2\x91\x63\x82\xc7\x97\x2b\x72\x4c\x15\x36\x46\x45\x89\x28\x78\xc5\x88\x0f\xd3\x05\x87\xf1\xe4\xa4\x28\x91\x21\x46\x58\x18\x13\x13\x42\x02\xc2\x28\x43\x2d\x35\x53\x21\x8c\xfa\x05\x6e\xbc\x5f\xc2\x7c\xe3\x07\x9e\xf9\xc6\x4f\x83\xd7\x7c\xe3\xc7\xa4\xd5\x81\x9f\x1b\x21\xd0\xe3\x62\x4b\x4b\x9e\xb2\x37\x17\xa4\x44\x10\x2d\x2b\x41\x71\x70\x01\x03\x27\x18\x11\x83\xdd\x5a\x44\x2b\xe4\x7a\xfd\x39\x56\x64\x85\xe4\xd1\x65\xfc\x4d\x62\x3d\x80\x86\x84\x7c\xe1\xc9\x00\xa6\xf2\x26\x52\x68\xae\x21\xa8\x1b\xa2\xff\xbd\x0e\xd5\x7b\x88\x52\x91\xcb\x6b\xb2\x91\x98\x82\x42\xd6\x07\xcc\xa3\x47\xa4\x06\x3d\x85\x88\x32\x5f\xf7\xfa\xd3\x83\x9b\x09\x86\xad\xc6\x04\xac\xc6\x01\x74\x8c\x3a\x0f\x07\xa8\x3e\x36\x34\x75\x4c\x05\x8d\xe1\x17\x51\x7e\xf5\xc9\x1e\xf5\x58\x05\x39\xd6\xb4\x16\x61\x58\x7b\x9a\x77\x3c\xda\x30\x13\x63\x00\xfb\x72\x39\x13\xf9\x1c\xdc\x69\x12\xfc\x62\xcd\x5a\x93\xfc\xd4\xd1\x76\xad\x69\x56\xad\x58\x9b\x56\x8c\x45\x6b\xcc\x9e\x15\x65\xcd\x1a\xf7\x41\x4f\xf7\x3e\x7f\x09\xd7\xf4\x14\xd6\xef\x47\xd9\xbe\xe7\x6b\xff\xaf\x76\xed\x1f\x21\xa0\x92\x58\x21\x95\x7c\x79\x77\x7e\xf4\x95\x70\xf0\xe2\x67\x09\x5b\x9c\x46\x3f\x46\x51\x24\x14\xa4\xf8\xc8\xf0\xc4\x60\x54\xcd\x2c\x34\x0d\xac\x71\x16\x9a\x86\x9f\xdf\x08\xf5\x9c\x85\xa6\xbe\x67\x16\x9a\x66\xa1\xa9\xff\xf9\x8d\x5c\xfb\x59\x68\x6a\x3f\x63\x81\x6d\x9f\x23\xa4\x6d\x72\x20\xd5\x28\x9a\xc4\x07\xb0\x9d\x2e\x74\x6d\xfc\xa4\x47\xc2\xd5\x1e\x1f\xa8\x16\x21\x99\x9e\x0a\xb2\xa3\x61\x69\x8f\x0b\x48\x3b\x95\xcd\x6e\xf6\xf1\xfc\xfa\xdc\x61\xf6\xf1\x0c\xec\xe0\x57\xf4\xea\x8e\x87\x7a\x9d\x3a\xc8\x6b\xe4\xd0\x02\x2b\x1e\x8e\x92\xb2\x6b\xf8\x2a\x72\x1c\xaa\xd6\xdc\x28\xaa\x0e\xdf\xdd\x5c\x80\x97\xe2\x16\x1b\xc4\xde\xbc\xef\x90\x8f\x76\xa0\xd4\xf0\x77\x4e\xb9\x2d\x15\x54\xe1\x43\xac\xf1\x7f\xea\x0f\xb0\x59\x53\xac\x7c\x02\xd5\x9e\xda\x8e\xf1\x84\x8a\x2a\x8e\xca\x4f\x89\xf5\x81\xec\xfb\x16\xc0\xf6\x1f\x9d\x11\x5d\xf5\x20\x77\xd5\xfb\x58\x00\x81\x5a\xfc\x9d\xe8\xa6\xce\x41\x85\xc8\x69\xca\x44\x2f\x1d\x0d\xe1\xf1\xe0\x49\x58\x20\x5c\xe6\x74\xdb\x41\xbd\xe3\xa8\x27\x46\xb8\x7d\xad\xe5\x60\x6a\x6e\x31\x65\x45\x26\x0f\xb9\x25\x6d\xbd\x73\xf7\x20\x5b\x65\x8e\x08\x1f\x7a\xa5\xfc\x1d\xd5\xf3\x6e\xfe\xbd\xd9\x8b\x7b\x30\x72\x90\xea\xe3\x73\x41\x80\x2c\x5c\x85\x3a\xbd\xa3\x59\x06\x0d\x17\x64\x29\xa0\xbc\x9e\xef\xf2\x10\x90\x93\xae\x65\xea\x8a\x83\x37\xd6\x03\xcd\x0c\x9a\x83\x9c\x33\x93\x9c\x17\xd5\x28\xe7\xb8\xf5\x9c\x16\xfa\xfc\x2f\xd5\x7f\x2f\xed\xd2\xff\xc7\x31\xf8\x06\x2a\x9a\x05\xae\xf0\x50\x8c\x63\x85\x85\x61\x78\x9f\xbd\xae\xde\xf3\x91\x88\x5c\x58\x38\x81\x2b\xb1\x2a\xca\xda\x18\x0e\x5b\x6d\xa7\x18\xab\xd8\x59\x69\x55\x49\x74\xcb\x84\xfd\x2f\x96\x36\x3e\x75\x05\x80\x5d\x79\xb0\xd2\x91\x36\x17\x5b\x87\x6d\x9f\x7b\x88\x72\x3b\xee\xc4\xde\x96\x87\x03\xd6\xa8\x6e\x1c\x2e\x14\xe7\x87\xfe\xe5\xc9\x0e\x5a\xba\xd8\x93\x5c\xb3\x1d\xdd\xf3\x9e\x20\x7b\xa8\x68\x18\x5c\xeb\x8a\x34\x00\x93\xba\xde\xf2\x29\x81\xde\x05\xb8\xfb\xee\x3a\xc3\x23\xba\xee\xd5\x07\x8b\x79\xae\x61\x74\x85\xc2\x10\x06\x09\xc3\xba\x5d\x76\x51\xcf\x7e\x93\x4a\xc1\xc8\x9e\xd3\xc1\x06\x86\x80\x9a\x49\xa9\x14\x28\x00\xd5\xcc\xfd\x92\x02\x55\xec\x15\xf9\xb9\xc6\xd3\x9f\x17\xcd\x7f\x2d\x11\x53\x97\x8a\x65\x92\xa6\x4c\xd9\x5f\xa1\x79\xfe\xb2\x46\xe1\xfa\xb7\x1e\x60\xa4\xe4\x67\xb3\xa3\x42\xea\xa5\xe6\x29\x4b\xa8\xfa\x79\x45\x3e\xec\x99\x52\x3c\x75\x6e\x77\x0f\x5e\xae\x89\x3d\x5f\xc5\xb2\x03\x91\xa5\xb1\xaf\xf7\x1a\x47\x75\x22\x0b\x90\xad\xee\x7d\x2d\xf7\x9c\xf2\x6a\x14\x08\x51\xd5\x65\x01\x4e\x78\x08\x2b\x3d\x90\x54\xda\xa9\xb4\x5c\x90\x83\x2c\x81\xc8\x17\x5d\xae\xec\x2a\xc3\x73\xed\xf1\xa5\xc4\xd6\x27\x6b\xc5\xe8\x1d\xa1\x06\x8a\x59\x1a\x9e\x63\xb7\x77\x59\x1a\x22\xa4\xe1\x09\x5b\x1d\x4b\x4a\x03\x97\xf7\xa8\xcc\xbf\x2b\x14\x0c\xb5\x5f\x1d\x4a\xd7\x27\x05\x6b\xb1\x6b\xbd\xa7\x18\x63\xaa\x4a\x01\xd3\xf6\xf6\x68\x80\x9e\x14\x5d\xb6\x1f\x16\xcf\xa9\xda\xc6\xd4\x4c\x3c\xbb\x50\xdb\x12\x8b\xf5\x3a\xba\xc8\x84\x51\x07\x08\x7e\x45\x3c\x4b\x65\x72\x67\xd1\xda\x72\x8a\xb3\xc1\x96\xb2\xaf\xdf\xbf\xb1\x07\x0c\x97\x9d\xbb\x26\xf0\xae\x90\x67\xa1\xe4\x9e\xa7\x2c\x5d\x91\x4f\x54\x71\xd0\xf7\x9c\xc4\x9c\x30\x4d\xfe\xf0\xfc\xd3\xc5\xc7\x9f\xae\x2e\xde\xbf\x1d\xaa\xe6\x6a\xaf\x04\x7b\x28\xa8\x48\x59\x4a\x4a\x5d\xb7\x85\x72\xd0\x3c\x3b\xb3\x88\xb5\xe7\x4a\x0a\x60\x55\xe4\x72\x03\xfa\x01\xce\x35\x30\x68\x42\x85\x5d\xdb\x9a\x41\x87\x8c\x6c\xcf\xd2\x45\x53\x96\x4f\x2a\xa5\x8f\x8b\xa2\x34\x3e\x88\x04\x90\x6f\x3d\x34\x66\x29\x90\x28\xa5\x08\xb8\xc6\xce\x88\x3e\x08\x43\x1f\x3c\x49\x64\x3a\xa1\x85\xef\x75\x45\x49\x2a\xcb\xe1\x85\xfe\xe1\x0f\x0b\xc2\xd9\x2b\xf2\x87\xc6\x70\x2b\xf2\xd6\x8d\xd0\x00\x24\x36\x3b\x62\x10\x9f\x5c\x03\x6c\x28\x5f\x04\x4b\x84\x66\x56\x1a\x82\x9b\x56\x8b\xe4\x1e\x70\x84\x55\x55\xe2\x85\x34\x2b\xf2\xda\x43\x6c\x68\xf7\xd0\x79\x28\x8d\x55\x82\x0c\xd5\x77\xfa\x1c\x99\xd0\x32\xa5\x86\x2e\x1b\x57\xe5\x1c\x25\xfc\x65\x22\xf3\x9c\x8a\x74\x49\x1d\x92\x2e\xab\x43\x3f\xff\xda\xd5\x97\x5d\xd2\xea\x2d\x2e\x96\x74\xa9\x77\x2c\xcb\xfa\x95\x9b\x60\xfd\xe3\x51\x9d\x27\x5c\xda\xd5\xad\x21\xe6\xc6\xbd\xad\x2e\x18\x8e\xb6\x22\x57\xd2\xb8\xde\x4e\x0e\x29\x38\x08\xb0\x76\x27\x80\x4a\x43\x1a\x44\xfb\x66\x92\xb7\x57\xb7\x1f\xff\x7e\xfd\xe1\xf2\xea\x76\xf4\x2a\x0e\x8c\x38\x72\x41\x63\xae\xe2\xc0\xc8\xc3\x17\x74\xfc\x2a\x0e\x0c\x19\xb8\xa0\xe3\x57\x71\x98\x2c\x0c\x5e\xd0\xe8\xab\x38\x30\xf6\xc0\x05\x8d\xbf\x8a\x03\xe3\x76\x2e\xe8\xef\xfc\x2a\x32\xb1\x8f\xb8\x86\xef\x9c\xc6\xd1\x40\xcc\x0a\xde\xae\xda\x6d\xe5\x92\xae\xc5\xc5\x21\xee\xd7\x01\xfd\xf4\x5d\xb7\x56\xf7\x56\xec\x3f\xd1\x76\xab\x17\xd1\xbb\x54\xe2\x5e\x18\xb4\x85\x00\x29\x79\x3d\xb6\x81\x18\x53\xdf\x24\x03\x59\xd3\x3e\xd6\xb7\xee\x15\x98\xf9\xc0\x94\x17\xb4\xf6\xbc\xfe\xe9\xf2\xcd\xdb\xab\xdb\xcb\xef\x2e\xdf\x7e\x7c\xb2\x89\x0f\x8a\xa6\xc7\xdb\xf8\xa6\x50\xc3\xe0\x26\x6a\x4a\x59\x28\x66\x25\xcf\xba\xc4\x7b\x3f\xfa\x21\xde\x05\xc7\xac\x85\x49\x6c\xf3\x74\xa8\x0c\x1e\xbd\x43\x22\xd1\x0d\x8e\x18\x4f\x90\x5b\xa4\x37\x38\xe6\x54\xb2\xec\x08\x70\x70\xcc\xcf\x42\x9c\xf1\x79\x3c\x89\x0e\xaf\xb8\x2d\x49\xbd\x61\x1b\x5a\x66\x28\x71\x3f\x7b\xd6\xd1\x2f\x9a\x4f\x3c\x5a\x7f\xa7\x64\x1e\x6f\x8a\x85\x9e\x70\x95\x65\xb1\x0f\x63\xce\x5c\x3b\xb1\xb0\x07\xb6\x41\xf8\x9c\xb8\x81\x6d\xfa\x9c\xbc\x81\xfd\x80\x02\x23\xc4\x3a\xa6\x2b\xb3\xd2\x7f\xb0\xc3\x47\x16\xa8\xba\xdc\xb7\x59\xf0\x2e\xb8\x66\x59\x18\xfc\x5d\x99\x75\xc6\xfc\xcb\x53\x6a\xd8\x44\x56\xb0\x79\x7a\xe9\xac\x49\x35\x4c\x62\xab\xcc\x7c\xb9\xee\x0d\xff\x7c\x96\xda\x31\xb1\x95\x63\x26\xc1\x7c\x4a\xd5\x98\xc9\x71\x32\x51\xdb\x7a\x5c\xd1\x98\x29\x25\x63\x62\x0b\xc6\xc4\x94\x8b\x89\x2e\x16\x03\x67\x3d\xf5\xfe\x9f\xd5\x04\x00\xfb\xf0\x3a\xbc\x2e\x64\xfa\xca\x5b\x92\x34\xc9\x99\xa1\x56\xf6\x5d\x59\x84\x1c\xc7\x9d\xd6\xeb\x60\x9a\x5e\xd4\x7f\x83\x8e\x2b\xba\xf1\x07\xa0\x92\x68\xf1\x1b\x1f\x5a\x17\x2c\x59\x09\x99\x32\x7b\x09\x17\xf8\x4f\xc7\xdb\x2f\x30\x0f\xda\xfd\x60\xa8\x29\xf5\x6a\x27\xb5\xb9\xbc\x8e\x18\x16\x5f\x2f\x64\x7a\x79\xbd\x68\xfd\x4b\x07\x59\x10\x99\x48\x06\x63\x1a\x55\xd4\x4f\xa8\x65\x05\x54\x9b\xa7\xf0\x9f\xdf\xd9\x83\xbb\xa6\x66\x17\x85\xfd\x5c\x93\x7b\xc5\x8d\x61\x02\x24\x15\xe8\x01\x2c\x37\x0b\x7b\x13\x6a\xc6\xbb\x7f\x19\xe8\x56\x51\x3f\x93\x2e\xfe\xc6\x2f\x73\xf2\xd6\x21\xfc\xc0\xed\x1b\xb1\xb4\xf6\x8b\x47\x48\x83\xfe\xa9\x3b\x10\x5d\x5c\x5f\x92\x3d\xc2\xf3\xc4\xdb\x8c\xbf\xf9\x9b\xc8\x53\x8b\xbe\xff\xbe\x9b\xed\x77\x4f\xa4\x03\x7e\x9c\xaa\x06\x82\x17\xa6\x5f\x41\x47\xb3\x51\x78\x55\x5d\x75\x49\xc6\x73\xee\x3a\x5d\x5a\xb8\x30\x2b\xe7\x3d\xc7\x3f\xae\x92\xa2\x5c\xb8\x17\x56\x39\xcb\xa5\x3a\x8c\xdf\x52\xf7\x3a\x2b\x76\x2c\x67\x8a\x66\x4b\x6d\xa4\xa2\x5b\xb6\xa8\x86\xc7\x61\xab\x7f\xe1\xc0\xe3\xb7\xb2\xb1\xc0\xee\xe8\xa8\xcb\x38\x8f\x42\x76\xf0\x54\x91\xa5\x27\xa5\x0c\x15\x94\xc7\x2b\xa0\xe0\x33\xe0\xc2\x42\x99\xa6\xc2\x43\x10\x63\xf7\x32\x2b\x73\x16\x41\x5d\x49\x83\x3f\xc3\x97\x4c\xec\xad\xd0\xab\x4f\x2e\x05\xa4\x7c\xcf\x75\x5c\xb3\xd7\x1e\x21\x80\xbb\xfe\xbb\xb2\x34\x45\x69\xec\x4a\x73\xec\xd1\x15\x4b\x0a\x7c\x1b\x90\x46\x07\xe8\x16\xfd\x7b\x19\x6e\x16\xf7\x88\x0d\xfb\x99\xa6\x1f\xed\x47\x4f\x52\xea\x9b\x59\x91\xbf\x13\x9f\x4b\x3c\xf5\xf2\x4b\x39\x15\xf1\xc2\x58\xa5\xd3\x28\x30\xed\x1a\x00\x50\x72\x25\x4a\x13\x18\x2e\xbf\x53\x3f\xbf\x94\xce\x73\xaa\x9a\x9d\x8f\xae\xd8\x39\xeb\x51\xbf\x27\x3d\xea\x31\x95\xc7\xa6\xd7\x1e\xfb\xe2\x95\xa8\x88\xd7\xc6\x03\xe3\x06\x13\xe7\x23\xc6\x1f\x35\xde\x0f\x5b\xb2\x7a\x0d\xf8\x5e\x12\x33\x92\x14\xb2\x28\x33\x6a\x06\x4c\xa0\x61\x37\x52\x23\x24\xc4\x11\xa8\xda\x48\x5b\xbb\xe4\x90\x37\xe5\x23\xa6\xeb\x96\xd1\x9a\x5c\x64\x19\xe1\x02\x09\x14\x0c\xeb\xad\xa1\x8a\xa1\x90\x45\x28\x9a\xf7\xf7\xc3\x76\x7c\xe8\x9e\xd5\x5a\xa6\x55\x72\xb4\xa1\xd8\xdd\x91\xfc\x08\xbd\xeb\x80\xac\x3a\x63\x23\x17\x24\x2f\x33\xc3\x8b\x41\xdb\x64\x25\x16\x54\x0d\x80\x09\xd5\x5a\x26\x9c\x7a\x37\x24\xc1\xf6\xa1\xda\xf8\x8d\xc3\xca\x0d\xbd\x1b\x1a\xb2\x50\x2c\x61\x29\x13\x09\x83\x56\xf2\x25\xab\x61\x88\x35\x14\xde\x8a\x7d\x65\xb7\x2d\xd1\xc7\x84\xcc\xc0\x8e\x3c\x84\x51\xf4\x8e\xb5\x46\xfe\x1c\xde\x16\x8b\x74\xce\x2a\xda\x70\xba\x00\x7f\xaa\x34\x05\xdf\x2d\x7f\xf0\x76\xd5\xd1\x62\x4f\x70\xb3\x54\xa6\xce\x11\x31\xa1\xc3\x53\x6b\x43\x51\x9b\x97\x9e\xc0\xfc\x3a\x67\xcf\xf4\x3e\xbf\x66\xd2\xdc\xe7\xc9\x84\x8b\x62\x22\xc5\x48\xb7\xc6\xe3\x58\xa8\x46\xe9\x14\x9e\x32\x61\xac\x72\x03\x31\x7c\x85\x62\x05\x13\x60\xea\x60\x34\xd9\x8d\x32\x39\x47\xaa\x6b\xeb\x7d\xed\x44\x3c\xad\xa3\x10\xe5\xc8\xa9\x17\xf0\xa6\x4f\x92\x9d\x6f\xdf\x6f\xe7\xf6\xb9\x03\xfe\xd5\xae\xde\x13\x65\x2b\xde\x17\x13\xde\xb3\xf5\xb3\x37\x8d\xc0\x22\xc0\xbe\xc9\xb8\x53\x87\x7d\x9e\xc3\x28\x43\x28\x02\x81\xc2\x68\xef\xe4\xba\x26\x13\x55\xb8\xf0\x8e\x6f\x2d\xf0\x33\xb6\x67\x99\xe3\x8c\x04\xab\xb6\xe6\xc3\xc2\x92\x91\xde\xd2\x61\xa5\x7d\x89\xc1\xa8\x2d\xd1\x09\x96\x64\xc9\x89\x45\xed\x4c\x52\x8c\xdf\x55\x32\xcb\xba\xd5\x60\xfd\x93\xf1\x3b\x46\xde\x54\x11\xf1\x68\xf3\xbb\x31\xd4\x58\x54\xbe\x61\x66\xc8\x8a\x3e\x82\xa6\xb0\x96\xeb\x32\xcb\xae\x65\xc6\x93\x01\x6d\xba\x7d\x3c\x10\xdb\x4f\x8a\x32\xcb\x48\x01\x1f\xad\xc8\x07\x01\xf7\xfd\x22\xbb\xa7\x07\xbd\x20\x57\x6c\xcf\xd4\x82\x5c\x6e\xae\xa4\xb9\x46\x61\x66\x88\x26\x36\x9d\xd1\xf8\x39\xe1\x1b\xf2\xca\x8a\xd1\xda\x10\x43\xb7\x20\x68\x7a\xb3\xf2\x02\x4a\x63\x35\x86\x1d\x18\x15\xae\xf9\x3d\xd7\xbd\xd2\xda\x93\x91\xe9\x6b\x18\xc9\x92\x24\xfc\xf7\xa3\x00\x9f\xf1\x0d\x4b\x0e\xc9\x50\x7a\x60\x9b\x85\x41\x5b\x58\xed\x63\x88\x59\x03\x07\x7d\x82\x88\x6b\x73\x0e\xc2\x6a\x6f\x14\x2f\x41\x0b\x59\x21\x85\x06\xeb\x56\x8d\x8e\xd5\x4a\x50\x05\xd0\xd1\x12\xee\x38\x03\x29\xa4\x36\x37\x56\x4b\x18\xa6\x7d\x6d\xdc\xba\xf6\x1f\x10\x88\xe0\xcf\x32\x96\x12\x9e\xe7\x2c\xb5\x5a\x41\x76\x20\x74\x03\xb5\x82\xa3\x3a\x8a\xd9\x11\x14\xc3\x23\xbf\x44\x66\xb4\xa3\x22\xcd\x98\x22\x1b\xca\x33\xa7\x79\xb4\x34\x1a\xc3\x54\xce\x85\xfd\x24\x30\x2e\xda\xb2\x41\xf9\xb1\xca\x53\x92\x48\x6c\x76\x6f\x24\xa8\xf6\xee\xa7\xfa\x6e\x00\xfd\x1e\xa5\x1a\xa4\x51\x12\xb9\x5a\xd2\x3a\x93\xc9\x9d\x26\xa5\x30\x3c\x73\x59\x59\xf2\x8e\x24\x32\x2f\x32\xc0\xd5\xb8\xb6\x2b\x13\x91\xbc\xfa\xcf\x65\x85\x19\x4b\x3b\xaf\x3e\xff\xba\xfe\x09\xfe\x30\xcc\x22\xe3\x64\x0b\xf6\xc0\x92\x09\xa5\xc8\x2d\x95\xb1\xc0\x97\x22\x3b\x10\x29\x2a\x11\x03\x0b\xe5\x41\x0c\x3e\xdc\x82\x11\x8e\xb8\x66\x35\x41\x59\x91\xb7\x0f\x2c\xa9\xfe\x8d\x2a\x17\xc5\x2e\xfd\x46\xc2\x75\x3a\x5d\xdb\xb6\x40\x88\xee\xe0\x9e\x5f\xe3\x57\x80\x9c\x80\x1a\xf8\xcf\x8c\x0b\xb8\xc5\x2e\x6c\x37\xc2\x2e\x84\x55\xb8\xdb\xf8\x85\x37\xc0\xc9\x57\x24\xe5\x8a\x25\x46\xaa\xc3\x84\x46\x70\x7e\x3d\x76\x7d\x4a\x4a\x43\x9e\x9f\x9d\x9f\xbd\xe8\x18\x35\xce\x74\xa3\x15\x7e\x8c\x6d\xf4\xb6\x31\xb6\x65\x00\x3c\x2f\xb2\x03\xec\xf6\x2c\x5d\x10\x6e\x7c\x84\x4f\xa0\xbe\x78\xf7\x71\x31\xcd\x0b\xa2\x25\x31\x8a\x56\x59\x47\xf0\x57\x3b\x0c\x54\xd5\x01\x4a\xfb\xfc\xec\xff\x3d\x8b\xb1\x3c\x32\x93\xbc\x20\xf7\x52\x9c\x19\x00\xe3\x8a\xdc\x62\x2e\x5b\x35\xd5\x41\x96\x44\x30\x4c\x41\x62\x0f\x45\xc6\x13\x6e\x22\x3c\x7c\x04\x88\x1f\x91\xa5\xc1\xbc\x08\x6a\x7c\x3c\xf6\xdb\x07\x6e\x9c\xfb\xdc\xe2\xff\x37\x80\x19\x48\xe6\x62\x40\xa0\x49\xc6\xf7\xec\x7c\xc7\x68\x66\x76\x58\x49\x5d\x48\xb1\xfc\x27\x53\x12\xa2\xb6\x85\xfb\x65\xfc\x90\x82\xf6\x8d\xe6\x33\xc9\xe6\x1a\x16\x21\x8f\xdf\x1b\x35\x37\x5a\xd2\xf7\xfd\xa4\x9e\x2a\x7f\xbb\xbd\xbd\xfe\x9e\x99\x23\x92\x60\xc7\xf1\x0e\x4c\x50\x1d\x99\xda\x48\x35\x82\xca\xf1\xb4\x61\xa8\xc8\x68\x68\x9d\x52\x1b\xcc\xea\x42\x66\x2e\xac\xc6\x67\x64\xcb\xcb\x16\x79\x89\x0b\x99\x92\xcb\xeb\x15\xf9\xbb\x2c\xed\x9a\xd7\x74\x9d\x1d\xaa\xd4\x20\xcd\x0c\x79\x66\x27\x7b\x66\x6f\xb5\x85\xc3\xdf\x18\x4d\x87\xe5\xd4\xe6\x63\xaf\x14\xa3\x83\xe1\xfe\x8d\x55\xc4\xa3\x48\x63\x05\x53\x49\x69\xa9\x8d\xcc\xc9\x0e\x3f\x3e\x8a\xb1\x76\x67\x1b\x43\x9b\x2c\x86\xf8\x2c\x46\xc5\x0a\xb8\x7a\x7e\xd4\x13\x5e\x9b\x0e\x56\xe2\xae\xab\x34\x41\x6d\xc5\xa0\xe6\x96\xa2\x1c\x0a\x46\xd6\xd1\x92\x02\xb7\x62\x8f\x3c\xca\x77\x33\xad\xa3\xde\x94\x0e\x73\x3d\xd6\x0c\xdc\x93\x53\xce\x02\x06\xff\xe3\x67\x62\x87\xb5\x88\xa8\xec\xf8\x65\xc2\x50\x9f\x67\x9d\xf1\x0d\xd2\x46\x1c\x24\xed\x17\x63\x57\x3c\xa1\x3b\x64\x3c\x0d\x27\xa4\x88\x8a\x55\xea\x2d\x94\xe2\x72\xe9\x5d\xee\x3c\x20\xf2\x70\x41\xe2\xbe\xf5\x45\x81\xbe\x90\x63\x6d\x83\x09\x68\x04\x87\x0f\xa3\x3e\x75\x0b\x6e\x9c\x99\x0b\xc3\xb6\x11\xf7\x75\x39\x31\xe0\xa3\x9b\x00\xa1\x5c\x9d\xe8\x3a\xe6\x10\x2b\x27\x23\xf0\x22\xce\x5d\x76\xbc\x53\x57\x38\xa0\x37\x42\x79\xf2\x09\xd9\xd0\x2f\x63\x30\x49\x92\x3f\xff\xd7\xff\xfa\xc7\xff\xba\xc2\x25\x56\xbe\x2c\x41\x2e\x2f\xae\x2e\x7e\xba\xf9\xf4\x1a\x82\xe7\xc7\x4f\xf1\x61\x59\xeb\x33\x4b\x2e\xcc\x52\xaa\x25\x42\xea\x15\x31\x6a\x14\xab\x21\xba\x6f\x6a\x03\xaf\x1b\xf8\xa8\x59\xb0\xc0\x71\x5e\xa7\xff\xf9\xc2\x19\x31\x6c\xa4\x69\xf9\xb0\xe8\x7b\x42\xbc\x8d\xed\x2b\x35\xd8\xf1\xa8\x3d\xe3\xb8\x53\x37\x29\x6e\x64\x72\x37\x49\xce\x3a\xbb\x7d\x7d\x8d\x1f\x35\x44\x2d\xa8\x91\x01\xca\x17\x17\x7b\x99\xed\xc7\xd1\x9e\x92\xdb\xd7\xd7\xb0\x91\x15\xfc\x17\xe8\xa5\xa0\x1a\x1c\xec\xc8\x3e\x90\xcc\x99\x80\xad\x1a\x31\xa6\x84\xe3\xa8\x8a\xd1\x8c\x6b\xc3\x13\x18\xb5\x36\x91\xd8\xf1\xc3\x96\xe1\xcf\x2a\xf5\x9d\x7d\xf0\xc6\xe4\x71\x01\x30\xee\x32\x36\x04\xc0\x93\x36\x6d\xfb\xd7\xa5\x9c\x8e\x62\x62\x9c\xdf\x4c\x39\x8f\x9e\x5f\x96\xb6\x44\xbc\x54\x28\x76\x63\x64\xa0\xfe\xec\x91\x85\x11\x5f\x1f\xb0\x2f\xae\xd9\x46\x2a\x16\x6f\x60\xac\x0d\x86\x24\x2d\xe1\x26\x52\x01\xb1\xcf\x5e\x57\x94\x4d\xd3\x5f\x30\xc6\xc2\x3e\xba\x4c\x76\x5e\x47\x17\x4c\xeb\x73\x30\x25\x96\x05\xca\xe8\x60\xb6\x2c\x15\x5b\xd8\x3d\xb3\x1c\x76\xb4\x88\x89\x13\xb4\x9b\x61\x02\x5f\x67\x26\xc1\x10\x13\x6f\x0b\x75\x96\x14\x0f\x8c\x23\x13\x64\x68\x54\x45\xf5\x8e\x41\x5e\x19\x7b\xe0\xc6\x95\xac\x51\x8c\x6a\x89\xed\x37\x3c\x70\x80\x9e\x6b\x68\xec\x05\x86\x90\x10\x27\xa9\x17\x86\xc3\x5d\xcb\xf4\xec\x4c\xb7\x86\xda\x2a\x9a\x30\xab\x81\x73\x99\x12\x48\x48\x48\xe5\x7d\xc8\xb5\xb5\x66\x5b\x2e\xb4\x3f\x5b\x2c\xbe\x83\x48\x60\xa9\x39\x03\x0b\x93\xcf\x7f\x5f\x91\x8f\x55\xb2\xdd\xb8\xa5\x56\x96\x26\x91\x35\x91\x70\x2b\x3f\x36\x2c\x43\xd8\x0a\x1c\x7d\x49\xb3\xa0\xf1\xa7\x42\x27\x1f\xf3\x63\xc6\x41\xe0\x2c\xcc\x81\x51\x1b\x08\x38\xd5\xc2\x1c\x02\x81\x6a\x7c\x35\x78\x3e\xdc\xea\xc8\x34\xd9\xb5\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\xc0\xa8\xb3\xb1\xba\xf7\xfd\xdf\x03\xe5\x9c\x8d\xd5\xa1\x8f\xbf\x30\x63\xf5\xc8\x0b\xde\xea\x7b\x6d\x65\xdc\x98\x48\xec\x6b\xb0\xb1\xf1\xc4\x99\x87\xe5\xa6\x15\xd5\x8b\x83\x35\x4a\x4c\x0f\x2c\xbc\xce\x07\xf4\x31\xad\xce\x08\x5c\x1b\x9d\x7b\x63\x82\xc1\x9e\x37\x30\x66\x7c\x74\xb5\x0f\x81\xd7\xe7\x85\xc4\xff\x57\x5b\xf2\x1a\x26\x3c\x94\xfb\xfb\x2f\xfd\x38\x11\x0b\xdb\xee\x1e\x65\xb7\x6b\x5b\xe6\x02\xc8\xf3\x04\x9b\x5d\x1c\x75\x8e\xb2\xd5\x3d\xc2\x4e\x17\x67\xab\x8a\xb5\xd1\x1d\x5b\xe0\x46\x86\x8d\xb6\xcf\x35\xad\x6f\x23\x63\xc6\xd9\xe6\x86\x2c\x6f\x63\x22\xda\x80\x5d\x6e\xd4\xea\x36\x32\x6e\xbf\x4d\x2e\x68\x71\x1b\x5b\x69\xaf\x3d\x2e\x68\x6d\x1b\x07\x6c\xa4\x2d\x2e\xca\xa0\x10\xcd\x0e\x63\x74\xb7\x08\xca\xed\xdc\x6a\xb7\x3b\xc5\xf4\x4e\x66\x81\x9b\xd4\xba\x45\xef\xb9\xe0\x79\x99\x43\x6b\x77\x7b\x61\xf8\xbe\xf2\xd0\xe9\x0a\xe3\x91\x86\x06\xad\x5b\x6b\x86\xdd\xe1\x53\x06\xd5\x64\x28\xcf\xec\x69\x40\xa2\xc3\x8e\xee\x81\xe2\x94\x49\xc2\x18\xd4\x30\x7f\x13\x65\x30\xfb\xe3\xaa\x5a\x5d\x55\x10\xf1\xe5\xf0\xc9\x60\x75\x17\x90\x58\xfe\xf8\xed\x08\x24\xc3\x52\xcd\xa8\x09\xf3\x73\x98\x2f\xe3\xc8\xe4\xb8\x00\x3b\xd9\x64\x19\x51\x0c\xe7\xb3\x98\x2b\xa3\x4c\x95\x91\xb7\x28\xda\x44\x39\xdd\x3c\x09\xe7\x3b\xa6\xbc\x3c\xc6\x34\x19\x45\x45\x26\x9b\x24\x63\x6c\xd0\x8f\x32\x47\x4e\x31\x45\x3e\xaa\xce\xcb\x63\x4d\x90\x93\xf4\x8e\x68\xd3\xe3\x69\xcc\x8e\x9f\xa5\xa6\x52\x04\x5c\xe2\xcc\x8c\xd1\x26\xc6\x38\xf3\xe2\xb8\x69\xf1\x94\x66\xc5\x48\xd0\x8e\x2b\xc5\x11\x0a\xf1\x14\x65\x78\x82\x22\x3c\xd9\x7c\xe8\x80\x34\x72\xac\xb1\x0a\xf0\x91\x7a\x3b\x32\xea\xe3\x94\xdf\x27\x28\xbe\x31\xe6\xc2\xcf\x62\x2a\x9c\x66\x26\x8c\x3a\xed\xf1\xcb\x3d\xa2\xbe\x47\x5c\x55\x2e\xb8\xe1\x34\x7b\xc3\x32\x7a\xb8\x61\x89\x14\x69\x80\x52\x1f\x95\x3a\xa8\x70\x4e\xe3\x87\x4e\x72\x6b\x47\xd9\xec\xa8\xab\x96\x13\xf4\x7b\xbb\x00\x25\xaf\xb9\x3b\xe6\x02\xb5\x11\x71\x85\x8f\xc9\x5e\x3e\x81\x7e\x4d\x4e\x2a\x22\x62\x60\xd0\x34\x30\xff\x4d\xde\x13\xb9\x31\x4c\x90\xe7\x5c\x78\x48\xbf\x68\x08\x87\xb5\xac\x1d\x42\x39\x87\x9e\xf6\xbb\x97\xdf\xf8\x61\x7e\x2d\x51\x19\x84\x7a\x68\x37\xf8\x64\xad\xc3\x0d\xf5\x14\xb5\xc3\x0d\xb1\x29\xb3\xb6\xea\x81\xea\x48\xac\xde\xf1\xb2\x2e\x89\xf2\x12\xd6\x52\xe1\xb2\xd5\x26\x5d\x30\x63\x17\xe0\xc1\x11\x7f\x81\xa3\x88\x70\x09\x3c\xca\x1d\x80\x06\xff\x11\x16\x3b\xc9\x15\xd0\x34\xf6\x07\xc6\x9d\xe2\x06\xf8\x2c\xda\xd3\x09\x4d\xff\x53\xcc\xfe\xbf\x39\xc9\x26\xc2\xbc\xff\x3b\x92\x6c\x7e\x09\x59\xc0\xf0\x9c\xc9\xd2\x9c\x48\x0c\xc0\x2e\xa0\x0d\x8a\xcc\xc3\xf5\x8a\x64\x79\xd4\xa0\xe3\xa5\x1b\xb0\x97\x4b\x9d\x2e\xa2\xf6\x0b\x93\x12\x46\xce\x69\x58\x49\x1e\x6c\x02\x54\xcb\x62\x75\x8d\x72\xaa\x09\x25\x6f\xae\x6e\x7e\x7a\x77\xf1\xd7\xb7\xef\x56\xe4\x2d\x4d\x86\x4a\x85\x37\xaa\x84\x08\x6c\x88\x88\xb8\xbf\xa3\x7b\x46\x28\x29\x05\xff\x47\xe9\x9a\x6c\x3e\xaf\x46\x7c\xe1\xbd\x26\x03\x83\x8e\xd5\x57\x19\xa1\x19\xd0\x38\x60\x42\xa5\x4a\x6c\x34\x80\x66\x64\x69\xc5\x7c\x25\xf3\x63\xb7\xdf\x5b\xfb\xd3\x30\x89\xa2\x48\x7b\xa0\x3f\xe9\x96\xef\x9d\xc1\xce\x95\xa0\x69\xf4\x71\xb5\x28\x69\x31\xc1\x72\x43\xba\x06\x33\xf5\x20\x85\x12\xcc\x58\xec\xab\x34\x0e\x29\x74\x33\xff\xc2\x6a\x24\x7a\x41\xd6\x25\x98\xea\x0b\xc5\x73\xaa\x78\x76\x68\x4e\x41\xb3\x21\x7a\x73\x25\x3d\x87\x3e\x20\x3b\xae\x97\xff\xe6\xc3\xdb\x1b\x72\xf5\xe1\x16\x7a\x22\x59\xce\x0a\x56\x74\xf8\x1d\x00\xb3\x66\xc3\x60\x70\xb5\xad\x57\xe4\x42\x1c\xf0\x13\xbc\xe7\x5c\x43\x27\x61\x06\x9d\xef\x9d\x56\xee\x4b\x41\x3d\xfb\x66\x05\xff\x37\x54\xf6\x9a\xa6\xa9\xb2\xd4\xbc\x72\x42\x1c\xe5\x0f\x58\x2a\x0b\xf4\x9e\xaf\xb3\xc6\xd9\x39\xe8\xfd\x62\x9d\xc1\x2a\x67\xe2\xb5\xdd\x76\xb3\x41\x58\x75\x90\x00\x10\xac\x57\x0a\x4d\x48\x07\xe9\xc0\x68\x5f\xb3\xc8\x7a\x95\xf5\x82\xa2\xeb\xe5\xd5\xf4\xda\x33\x53\x77\x29\x64\xa3\xa4\x35\xb9\xbc\xf6\xc7\x12\x66\x68\x50\x46\xac\xe2\x85\xae\x18\x34\x0c\x8c\x26\x89\x05\xf9\x86\xfc\x85\x3c\x90\xbf\x00\x6b\xfd\x73\x68\xb0\x38\x0a\x1a\x27\xd6\xa2\xd4\x76\x79\x1d\x0d\x95\x1f\xed\x15\xb0\xdf\xd8\x9d\x1b\x49\xd6\x5c\xa4\xd8\xa1\xe9\xc1\x30\x65\x2f\xb6\x83\xd6\x93\x2b\x1c\xda\x49\x4e\x7a\x60\x60\x9d\x20\x97\x9b\x46\xad\xb0\xb0\xa4\x38\xf1\xc8\xec\xd0\x56\x92\xbd\x42\x24\x0f\x9b\xa7\x5b\x15\xcb\xea\x99\x72\x6a\x92\x5d\xfb\x06\x59\x16\xae\x1b\x4d\x94\xc3\xc2\x70\x2a\x41\x43\x40\x77\xe0\x8e\x07\xb1\xf2\xb4\x88\x34\xa9\xf9\x5e\xeb\x14\x8e\x20\x7d\x24\x28\x8e\x08\xe1\xa9\xe7\xac\x8d\x74\xa8\x42\xa6\xc8\xaa\x61\x51\x69\x83\xdc\x78\xae\x1c\x1c\xb4\xcb\xb1\x5d\x88\x4a\xa5\x3a\x03\x7e\xd9\x9b\xe0\xba\x71\x42\x05\x4b\x35\x92\xb1\x60\x6f\x4b\xd5\x03\x2f\x78\x30\x51\xf7\xa3\x50\xd2\xc8\x44\x06\x6b\x46\xb6\x4d\xc2\xee\x03\xd8\x06\xaa\x95\x5e\x13\xff\xe1\xcd\xf5\xc2\x6a\x84\x50\x3c\xef\xe6\xf5\x98\x55\xae\xd5\x1e\xee\xf6\xf5\x75\xb0\x4d\x4d\xc4\x66\xc6\xcb\x79\xb7\x48\xf8\x90\x58\xfe\xb4\xda\x93\x8a\xd1\x94\x9f\x2c\xb6\xc6\xb7\x3a\xac\x46\x9d\x12\x64\x93\xcb\x3d\x4b\x91\x81\xd7\x2d\x13\x53\x68\xc8\xab\x03\x91\x37\xe3\x32\xe4\xaf\x60\x19\x9c\x23\x6f\xe6\xc8\x9b\x39\xf2\x66\x8e\xbc\x09\xbc\x33\x47\xde\xcc\x91\x37\x73\xe4\x4d\x2f\x58\xe6\xc8\x9b\x39\xf2\x66\x8e\xbc\x69\xbc\x34\x47\xde\xb8\x45\xfd\xcb\xf8\xa7\xe6\xc8\x9b\xf6\x33\x47\xde\x74\x66\x99\x23\x6f\xbe\x0c\x9f\xda\x1c\x79\xe3\x9f\x39\xf2\x66\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\xa3\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\xf0\x39\x55\xdd\xbc\x63\x5c\x28\xaf\x65\x5e\x94\x86\x91\x8f\x55\xbb\xfa\xaa\x67\xfa\xfa\x80\x7e\xc1\xc6\xe5\xf8\x5c\x6e\x0e\x6c\xdb\x55\x2a\x08\x15\x39\xc7\x5a\x88\xcb\x04\x97\xb6\xac\xf6\xb3\xac\x56\x72\xfe\x58\x57\x07\xf6\xce\x1f\xc6\x87\x3a\x3e\xe6\x3a\x8a\xf0\x47\x11\xae\x36\xc4\xdf\xc1\x12\x1a\x86\x16\x6c\x16\xf5\x00\xe8\x4b\x73\x59\x62\x09\x48\xb7\xfb\xc0\xdc\x15\x5c\xd0\x4c\xf4\xeb\x81\x9d\xc4\xf7\x0c\x66\xfa\x57\x86\xfe\x47\xb7\x88\x63\xf8\x3b\xf2\xf1\x38\xf8\xfb\x2b\x03\x11\x08\xd5\x0c\x5c\x13\x99\x73\x63\xe5\x14\x2b\xec\x35\xa2\x85\x42\x5e\x0d\x6e\x5a\x36\x54\x87\x2d\xe0\x73\xa4\x06\xab\xa0\x56\x6e\x8e\x66\xcf\x35\xdf\x4d\x2d\x04\x2e\xa8\x7c\x5b\x49\x4b\x70\xea\x4b\xdf\x7c\x17\x08\xe7\x17\x8d\x41\x23\x2f\x58\x79\x5f\x71\x73\x78\x2d\x85\x61\x0f\x03\x12\x4c\x1b\x19\x6e\xdc\x27\xae\xab\xa0\xae\x44\x29\xe7\xc4\x54\xa5\x80\xa8\x86\x08\x56\x12\x03\x2c\xec\x36\x76\xee\x17\x0a\x50\x61\x0f\xe6\x7c\x60\xc8\xb8\xa3\x30\x54\xdf\xd5\xe7\xc0\x96\x96\x39\xd5\xe0\xee\xcc\xf5\x58\xc2\x09\x24\xe6\x5a\xf1\x3d\xcf\xd8\x96\xbd\xd5\x09\xcd\xe0\xcc\x63\x45\x80\x8b\x81\xef\x7d\x57\x45\x5d\x75\xd1\x1c\xea\x98\xed\xd6\x09\x42\x5d\x42\x05\xd9\x52\x2e\x48\x6e\x61\x54\xf8\x61\xa1\xfb\x9e\x80\x0e\x6f\x05\x55\x56\x21\x70\x1f\x84\x24\x2e\x08\x0c\x5b\x4b\x99\x39\x8f\x6c\x76\xa8\xd7\xe4\x5c\xfd\x42\xfe\x24\xd8\xfd\x4f\x76\x1e\x4d\x36\x19\xdd\x86\x7a\x51\x13\x57\x11\x96\x99\x4e\xc9\x96\x6a\x39\x64\x08\x1c\x21\xc2\xa0\x41\xfc\x23\x14\x3b\x30\xf6\xb6\xfb\x7e\x45\x5e\xbe\x00\xac\xa5\x9a\x54\xa3\x87\x8c\x2a\xdf\xbe\x00\xeb\xcb\xeb\x8b\xeb\x9f\x6e\xfe\x7e\xf3\xd3\xc5\x9b\xf7\x97\x57\x63\x57\x34\xdc\xa7\x34\xa1\x05\x5d\xf3\x8c\x87\x69\x77\xc7\x0a\xde\xfc\x0c\x08\x55\x9a\x9e\xa7\x4a\x16\xb8\x4f\x55\x0a\x88\xd7\xac\x63\xb0\x22\x0c\x19\xde\x07\x55\x85\x77\x62\x6b\xee\xf6\x54\x5b\x45\x85\xf1\xc2\xce\x58\x7d\x6e\x04\xb3\x2a\x85\x15\x54\x9f\xea\x71\xa3\xe9\x94\xa0\x84\x8b\x34\x65\x69\x6b\xe9\x27\xf6\x01\xbd\xf6\x43\x1f\xea\x88\x51\x72\xfd\xe1\xe6\xf2\x7f\xc7\xcf\x4a\x1c\x8e\x44\xb9\x07\x4e\xe4\xc1\x26\xc4\xa2\xc9\x04\x48\x7e\x74\xd1\x3d\x33\x2c\x07\xde\x19\xa9\xe4\xef\xa9\x4a\xe4\xe5\xfe\x58\x8a\x76\x64\x7e\x3d\x02\xc9\x65\xca\x56\xe4\x1a\x89\x22\x74\xdb\x0d\xd2\xfe\xea\xbb\x9a\x0c\x80\xf9\xd7\x7e\x2c\x0c\xa7\x59\x76\x20\x56\x12\xdb\xd3\x8c\xa1\x0b\x59\xc9\x41\x6d\x85\xd4\x25\xb5\x30\x2e\xb5\x49\x35\x36\x34\xd3\x81\x0b\x1e\x43\x07\x2d\xa9\x7f\x6f\x85\xc9\x48\x38\x55\xef\x93\x94\x09\x69\x9c\x5c\x6a\x67\x82\x80\x5a\x25\x13\x82\xb2\x29\xba\x21\x02\xbb\xaa\xc3\x89\x2a\x62\x09\x24\xd6\x93\x41\xae\xfd\x5e\xaf\xab\x39\x41\x13\x0f\x8c\x59\x6a\xa6\x8f\xb8\x8d\x23\x83\xb5\xb4\x6a\xe7\x55\x8c\xa6\x10\x1b\x56\x50\xb3\x03\xbb\x66\x60\xd0\x9c\xea\x3b\x96\xe2\xab\x2b\xe4\xc3\x4e\x92\xd6\xae\x03\x80\x5b\xde\xad\x85\xc2\x86\x51\x53\x2a\x06\xfc\x37\x2c\xe4\xae\x19\x61\x82\xae\xb3\x50\xe4\x59\x54\x50\x24\x4d\x3f\x88\xec\xf0\x51\x4a\xf3\x5d\x15\x52\x15\x79\x9c\x3f\x56\x3d\xc1\x9b\x1a\x34\x30\x5b\x30\x52\xa6\x4b\x00\x13\x04\x72\xc5\x55\x32\x7f\x53\x1f\xdf\x09\xd0\x53\x95\xe2\x42\x7f\xaf\x64\x19\xdb\x94\xc3\x62\xd0\xf7\x97\x6f\xe0\x56\x95\x78\x6f\x98\x30\xea\x00\x41\x91\x9d\x0c\x9e\x71\x19\x6e\x45\x7e\xb0\x38\x75\x84\x45\x56\xe2\x2a\x85\x66\x66\x45\xde\xd3\x03\xa1\x99\x96\x4e\x98\x0a\x49\x46\x82\x5c\x83\xcf\xa4\x29\xff\xaf\x08\xc4\x38\x63\xdc\xc5\x5a\x9a\x1d\x39\x7a\x61\x04\x39\xbb\x23\x62\xf8\x1e\x1a\x98\xea\x04\x25\x2e\x8e\x07\x0e\x21\x27\xbd\x63\x9a\x14\x8a\x25\x2c\x65\x22\x09\x9c\x61\xc3\x56\xf4\xe7\x3f\x3d\xc9\x7c\x0f\x27\x7d\x25\x85\x45\xe3\xc8\xb3\xbe\x14\x29\x4f\x28\xd2\x20\xd7\xcd\xba\x46\x61\xb0\x6a\x3a\x19\x93\x42\x0c\xdc\x08\x95\x2d\x35\x53\xd8\xdd\x59\x95\x0c\x81\xf8\x1f\xe5\x9a\x65\xcc\x60\xc4\x2d\xc4\xf5\x53\x83\xad\x04\xb0\xa1\x3c\x35\x1e\x31\xc2\x37\x9d\x09\x5d\x42\xbb\x10\xab\x1a\x1b\x92\x4a\x56\xc7\x2b\x52\x4d\x7e\xb8\x7c\x43\xbe\x21\xcf\xed\xfa\x5e\x80\x8f\x65\x43\x79\x48\x6c\x37\x12\xbd\x30\xc7\x72\xf5\xc6\x0f\x0e\xdb\x00\xfc\x24\x52\xe1\x35\x5c\x10\x11\xf2\xf9\x40\xb7\x18\xb7\x43\xab\xee\xf8\x18\x63\xe7\x99\x03\xa3\x4d\x1b\xd1\x03\xe8\x1c\x9a\x27\x8c\xe8\x43\xe8\x1c\x18\x71\x1c\xd1\x27\xa0\x73\x34\x49\xfa\x41\x33\x35\x81\x22\xfd\x70\x52\x8a\xd4\x14\x01\x2c\xd6\xb6\x77\x8f\xa8\x99\x33\x43\x53\x6a\x28\xe1\xa1\xe3\x28\x45\xa3\x23\xc8\xef\xe1\x80\x4f\x47\xaf\x34\x7b\xc7\x45\xf9\x80\x2e\xb2\x29\x2a\xe4\xcd\x5b\xf8\x90\x24\x7e\xf1\x00\x70\x5a\x14\x19\xc7\x00\xe1\x76\x1e\x65\x00\x32\x78\xc9\x9b\xe9\x31\x7d\x82\x0f\x5c\x65\x9a\x65\xd2\x92\x4a\xcb\xd5\xa9\x48\x65\x1e\x18\xf6\x78\x81\x56\x60\x62\x34\xd9\x35\x2d\xec\x3d\xc8\x32\x89\x49\xfd\x8b\xb3\xbd\x38\xd5\x39\x63\x7b\x16\x4c\xbb\x39\xce\xae\xb5\xef\x5b\xc1\xc9\x9f\x00\x0c\x40\x32\xba\x66\x19\x32\x0f\xc4\x92\x48\x67\x6b\x14\x0e\x45\xab\x66\x4a\x66\x53\x82\x91\x3e\xca\x0c\xfc\x5b\xb4\xda\x8c\x1d\xe0\x0b\xd9\x0b\xbc\x16\xbf\x17\x90\xeb\x5b\x7b\x01\x7d\xe7\xcb\xd8\x4b\x19\xe4\x44\x9d\xbd\x58\xc6\xd5\xde\x0b\x70\x90\x2f\x61\x2f\x11\x6a\xfd\x3d\x17\xa9\xbc\xd7\xd3\x89\xee\x8f\xf8\xa1\xa7\x0c\x89\x25\x3d\x86\x8b\xad\x6e\x12\x5e\x1a\x34\x96\x36\xf5\xd4\x3e\xca\xeb\x8d\xf3\x55\x3e\x75\x97\x46\x05\x46\xf7\x02\x57\xa9\x9d\x7f\xe6\x11\x8c\x34\x84\xf1\x51\xb4\xf1\xe4\x14\x70\x9b\x6b\xfa\x5a\xd9\xb1\x0c\xa7\xd9\x4d\x31\xa9\xed\xd9\xf7\xef\x6f\x2e\xda\x1f\x5b\xc4\xbd\x87\x94\x7b\xbb\x1f\xfb\x3b\xa1\x69\xce\xb5\x0e\x9b\xa4\x01\xbe\x6c\x0d\xed\xe8\x9e\x7b\x1f\xc5\x96\x9b\x5d\xb9\x5e\x25\x32\x6f\xb8\x2b\x96\x9a\x6f\xf5\xb9\xc3\xb2\xa5\x5d\xfd\x8b\x91\x71\xb9\xc8\xb8\x68\x18\x1d\x20\x81\xdd\x09\x75\xb0\xc0\xa4\xda\x01\x80\x1e\x33\x4d\x47\x06\x45\x2b\x6f\x0f\x00\x30\xbb\x94\xb3\x2c\x75\x86\x08\x0c\xc7\xb6\xf7\x39\x2b\x76\x74\x09\x0c\x63\x64\x70\x97\x33\x06\x7a\xfd\x4e\x0a\xe9\x7c\xe8\x18\x73\xec\x54\x29\xb4\x4b\xc0\x22\xdc\xcd\xb1\x6b\x19\x19\xb8\x69\xf9\x38\x09\x69\xeb\x62\xcf\xd5\x68\x60\xfd\x08\x06\x01\x00\x5d\xc6\x5c\x23\x1a\x67\x64\x67\xbd\x07\x89\xc2\xf7\xef\xe1\x1c\x2a\x8d\x67\x22\xf8\x41\xf3\x71\x9f\x59\x6a\xe3\x89\x70\xaf\x26\x34\xb2\xa9\x4e\xed\x95\x5e\x6d\xc8\xbe\xd2\xd6\x88\x46\xaf\x6f\x57\x5f\x1a\xd3\x8a\x46\x86\xec\x13\x76\x9f\x24\xeb\xf6\x0f\x7a\x02\x79\x97\xf4\xc9\xbc\x47\xf8\xbc\x66\xc6\xa1\x33\x20\x6c\x4e\x0f\x64\x3d\x76\x5d\x52\xae\xc1\xac\x09\x4e\xe9\x26\xf2\x7e\x6c\x22\xd2\xa9\xf1\xf4\xc9\x8e\x79\x0c\x6c\x8d\xce\xea\xbe\x69\xbc\x4f\x78\xd7\x14\x75\x2d\x53\x0c\x19\xaf\x82\x72\x07\xfb\x1f\xba\xd0\x75\xfe\x4f\xcf\xfb\x6b\xc9\x42\x48\x8c\x99\x68\xc6\x91\xfb\x06\xb3\xd8\x34\x75\x60\x4c\x67\xd1\x75\xcd\x57\x5b\xab\x40\x2b\xd7\x8e\xeb\x66\x72\xf8\xa2\x5a\x74\xc0\x69\xdc\x6c\xed\xb0\x20\xff\xa7\xd4\x86\xd0\xca\xfd\xdc\xea\x39\x51\xc5\x1c\x03\x3a\x25\x83\xd6\x14\x9f\x8b\x65\xa4\x5d\xcc\x9e\xa7\x8c\xa4\x7c\xb3\x61\xde\x2d\xbe\x66\xa4\xa0\x8a\xe6\xcc\x80\x1b\x05\x41\x0b\x5d\x78\xc5\x30\x32\xc8\x0d\xa1\xbe\xd7\x6d\x15\x01\xb7\x40\x1f\x2d\x37\x24\xe7\xdb\x1d\xca\x3a\x84\x92\x4c\x8a\x2d\x44\xf4\xd9\x25\x64\x92\x0e\xdd\x44\x20\x0e\x52\x91\x7b\xaa\x72\x42\x49\x42\x93\x1d\x58\x09\xa9\x20\x69\xa9\x20\xc1\xd3\x30\x9a\x1e\x96\xda\x58\x3d\xdb\x4a\x47\x60\x4a\x43\x08\x0c\x7a\xa1\x3b\x9d\x30\x00\x5e\x1c\x23\x91\x2d\x2f\xa9\xae\x89\xf3\x15\x78\xe1\xa0\x89\x7e\x03\xa3\xb7\x2e\xd8\x9c\xd2\x7f\xf4\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\xb5\xcd\x29\xfd\x73\x4a\xff\x9c\xd2\xdf\x78\xe6\x94\xfe\xce\x2c\x73\x4a\xff\x97\x91\xac\x37\xa7\xf4\xfb\x67\x4e\xe9\x9f\x53\xfa\xe7\x94\xfe\x39\xa5\xff\xe8\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\xcb\xcd\xc6\x6a\xa8\x72\x90\x59\xdb\x19\x3b\x96\xe8\x2a\xf7\xad\x72\x74\x39\x6b\xb2\x66\x66\x01\x69\x0d\x18\xa6\x33\x6d\x50\x17\x48\x09\x69\x8d\x8a\x69\x48\x03\x10\xe4\xed\x87\xef\x56\x8d\xa4\x87\x41\x53\xe6\x60\x2a\xc4\x58\xcc\x31\xac\xe6\x83\x48\x62\x9c\x92\x35\x60\xfb\x22\x41\x1d\x7c\x93\x4c\x6a\x8c\x29\x80\xa1\x87\x5c\x53\x3b\x2a\x04\xf3\x52\x07\x37\x20\x2b\xaf\x19\x13\x44\x16\x4c\xa0\x1f\xca\xb7\x65\x20\xd4\x18\x9a\xec\x56\x76\x7e\x11\x1c\xd5\x67\x87\x56\xb3\x5b\xd2\xcb\x68\x8e\xc0\x55\x2c\xa7\x1c\x27\x20\x34\x51\x52\x6b\x92\x97\x99\xe1\x45\x35\xc5\xd0\x89\x31\x88\x01\xc2\xc8\xac\x0a\x60\xe0\x58\x60\x68\x8a\x87\x98\x7e\x77\xb0\xda\x6f\x41\x8a\xd1\xc0\x6b\x90\x8d\x16\x90\xd0\x9e\x17\xe6\x80\x2e\x57\x74\x3c\x71\xa5\x0d\x49\x32\x0e\xec\x1f\x56\x87\x39\xa1\x30\xcb\x22\xe0\xd4\x37\x90\x2b\x0a\x7b\xd5\x6e\xb3\x22\x05\xae\x51\x18\x8d\x8e\xc6\x7a\x1a\x37\x41\xca\xb5\xe3\xd1\x7a\xc8\x33\x41\x7d\xef\x10\x3c\x6c\xbf\x57\x38\xee\x14\xa6\xf0\x73\xba\x3f\x35\x26\x19\x81\x02\xa4\x3c\x39\x45\xa9\xbe\x54\x90\x62\xec\xf3\x7c\x16\xad\x3e\x23\x45\x95\x2c\x67\x76\x74\xb8\xd2\x82\xbf\x88\x6e\xb5\x80\x04\x82\xed\x2d\xce\xb2\x84\x59\x11\x9a\x76\x6e\x18\x4e\xf7\xa8\xab\x64\x98\xca\xb9\x00\xb7\xec\x7b\xa6\x35\xdd\xb2\xeb\x41\x03\xcf\x90\xd8\x04\x36\x9e\x1a\xd4\x80\x08\x19\xc8\x50\xf5\x5f\x6a\x97\xd8\xd9\x10\x41\x68\x2c\x85\xe4\xb8\x96\x2a\x06\xf0\x5e\x71\x63\x75\x2a\xae\x31\x97\x0e\xec\x9a\xc7\x01\x97\xc3\x43\x37\x9d\x70\xef\xfd\xd0\xf5\x90\x96\xbe\x8b\x14\x1d\x57\x6b\x46\xd6\x8a\xb3\x0d\xd9\x70\x41\x33\xe7\x81\x1a\xc2\x2f\xc8\x11\xa1\x28\x50\x6b\x6d\x45\x53\x29\xbc\x63\xc5\xef\x61\x45\x7e\x74\x9b\x30\xaa\x14\x09\x1d\xcd\x59\x16\x32\x65\x84\x6f\xc8\x16\xbc\x5d\x0a\x1d\xea\x7f\xfa\xe6\xbf\xfd\x99\xac\x0f\x96\x23\x82\xa1\xd2\x48\x43\xb3\x0a\x4c\x19\x13\x5b\x7b\x06\x40\x20\x86\xee\x42\x96\x35\xd3\x2f\x3d\x64\xa1\xae\x0a\x6e\xfd\xe5\xb7\x77\xeb\x36\x4b\x3f\x4f\xd9\xfe\xbc\x71\x2e\xcb\x4c\x0e\xc6\xa5\x74\x9b\xe1\xf4\x33\xdf\x11\xf1\xb2\x07\x21\xa1\xf8\x42\x04\x4a\xfa\xe4\x27\xb2\x93\xf7\x98\x83\xd9\x83\x51\xb5\x4b\xbc\x90\x45\x99\x0d\x77\xed\x21\xe4\x3b\x8b\xc5\x00\xa7\xd2\x71\x87\x56\x38\x63\xef\xcd\x01\x45\xdf\x0d\x3c\x4c\xeb\x9a\x1c\x1e\x5d\x9c\x7e\x79\xd2\xc5\x43\x39\x25\xb7\xca\x7d\x2a\x15\x5b\x91\xef\x68\x96\xad\x69\x72\x77\x2b\xdf\xc9\xad\xfe\x20\xde\x2a\x35\x28\x06\xb4\xd6\x9d\x51\x4b\x97\x77\xa5\xb8\x6b\xb7\x5a\xc8\xe4\xd6\xca\x71\x45\x69\x7c\xc4\x4a\x63\x57\x03\x03\xfb\x95\xc2\x1d\xaf\x98\x00\x75\xbd\x6c\xea\xb1\xd9\x03\xe0\x15\x04\x3c\x51\x41\x98\x5d\xeb\x10\xa4\x2d\x46\x37\xd7\xa2\x9b\x68\xf9\xed\x37\x7f\xfa\x37\x44\x7d\xab\x5d\xfc\xdb\x37\xe0\xfc\xd7\x0b\x24\x2e\x96\x32\x0e\x53\x68\x9d\xd3\x2c\xb3\x8a\x44\x13\xa9\xed\xb1\xae\x62\x7b\x37\x8d\x61\xab\x89\x41\xcc\x68\xe1\xee\xf6\xf6\xef\x01\xc9\x8e\x1b\xcd\xb2\xcd\x02\x63\xef\xaa\x7c\xdb\x33\x60\x14\x67\x8e\x76\x59\xae\xde\x65\x0d\x8f\x13\xb3\xf6\x32\x2b\x73\xf6\x86\x41\xd3\x95\x88\x6d\xb6\xde\xf7\x11\x1b\x99\xeb\x8f\xb6\xce\x64\x72\x47\x52\xf7\x23\x2c\x76\x60\x9b\xe0\xb5\x72\x21\x3d\x0d\x5d\xb0\x8a\x02\x82\x00\x3c\x1f\xc9\xf3\xd4\x8e\x5b\xcd\x35\xb7\xfc\x6d\x39\x2d\x0a\x68\x34\xb6\x81\x04\xa1\x7b\xdc\x40\x40\xc7\x82\x11\x5c\x27\x1d\x7a\x9a\xee\x5b\x38\xe8\x30\x43\xee\xd9\x4f\xfd\x89\x3f\x80\x02\xfe\x1b\xe3\x45\x26\xa4\xd6\x91\x3a\x6c\xaf\xda\x1b\x72\x0c\x0b\x19\xb8\x99\x4f\xee\xc3\x33\xa9\xef\x11\x98\x15\x1a\x9d\x9e\x9a\xf1\xca\x94\x14\x4c\x69\x68\x0e\x67\x3e\xc1\x89\xbe\xce\x28\x0f\x65\x74\x11\x52\x37\x3c\x7a\xda\x36\xc6\x3b\xf0\xd4\x67\x32\xf8\x4a\xc0\xdb\xf7\xc4\xde\x3c\x88\xe0\x90\x8c\x1f\x73\x87\xaf\x65\xea\x3e\x81\x4b\x8a\x85\x0b\x7a\x44\x2d\x1d\x91\xfb\x7e\xf2\xf6\x78\x9f\xea\xbd\xb4\xef\xaa\xfd\x4b\x75\x59\xf1\x2d\x77\x15\x07\xcf\xf6\x44\x57\x14\xa6\x9e\x74\x43\xe1\x6e\x36\x3a\x6e\xd5\xfc\xa0\x25\x42\xe3\x21\x04\x31\xb8\x16\x65\x9c\x4c\xbc\x22\x68\xd3\xb6\x50\x77\xc3\x92\xb3\x57\x67\x4f\xbe\xa7\xb8\x49\x25\x0b\xba\x1d\x29\x1d\x75\xb4\xd7\xe3\x0f\x49\xca\x50\xc0\x60\x1a\x84\x34\xf8\x1d\xdc\x46\xc1\x8d\x16\x6e\x04\xdf\xd9\xc9\xfb\xf8\x9c\x99\xd6\x83\xcf\x89\x20\x18\x1c\x7c\x1f\xf4\x62\x13\x42\x95\x2c\x45\xea\xf4\xf3\xca\x10\xf2\xfe\x68\xc1\x57\x52\x80\x90\x83\x39\x48\x81\xb0\x55\x7c\x5a\x31\xe2\x96\xc2\xbc\x5c\xbd\xfc\xe6\x97\x25\x93\xb7\x47\x0d\xf1\x2c\x44\xae\x2a\x32\x89\x77\xe3\xc9\x2b\xf2\x05\x36\xa2\x57\xf5\xde\x29\x6d\x75\xfd\x0c\xee\xab\x0a\xc0\x9f\xac\x32\xc6\xa2\x4a\xe1\x11\xf2\x1c\x44\x1a\x2b\x0b\x36\xb2\x12\x5e\x4c\x2a\x03\x13\x97\xd6\x6e\xf5\xbb\xf5\x93\xee\x36\x5e\x62\x44\xda\x3e\x5d\x38\x8c\x4d\xee\xeb\x9e\x6b\xde\xea\x22\xf7\x8c\x3c\xc7\x37\xcf\x34\xc4\xa2\xbe\x78\xf2\xf1\xba\x6d\xbf\x7d\x28\x82\x79\x94\xad\xad\xbf\x7d\x28\x28\xe8\xd0\xc5\x18\x0c\x46\x84\x8e\x36\x97\x19\x86\xc1\x5f\xd9\x8e\xee\x19\xc4\xc9\xf2\x8c\xaa\xc1\x4c\x02\x37\xae\x24\x37\xb8\x2b\x68\x76\xcb\xc4\x9e\x2b\x29\xc0\x4f\xb5\xa7\x8a\x43\x4e\x11\xb4\x22\x64\xc2\xca\xa7\x7f\x78\xfe\xe9\xe2\x23\xf8\x07\xc2\xd9\x6e\x98\x7b\xe0\x76\x5e\x6a\x88\x41\x38\xda\x41\x63\xaa\xfa\xe0\xc6\xd6\xda\x73\xa8\x7e\xfd\xf6\x54\x80\xd6\xf9\xfd\xd8\x35\xe4\xa5\x29\xe9\x70\x36\x05\x3e\xec\x21\xc9\x4a\xcd\xf7\x4f\xbd\xff\xe3\x12\x4f\xc5\x15\x7f\x05\x81\xc7\x85\x74\xbf\xe1\x03\xb8\xdb\xdf\x70\xf7\x4c\x77\x63\xc1\xc1\xac\x27\xa4\x19\xef\x7a\xda\x6b\x5c\x3e\xd3\x55\x6d\x9c\x66\x2a\xab\x53\x5c\x5d\xca\xc5\xa0\x16\x54\xd5\x85\x4c\xbb\x66\x77\xc8\xcf\x3a\x8d\x0a\x3b\x7c\x96\x03\x67\x14\x38\x9d\xa1\x73\x71\xc9\x4f\xaf\x65\x5e\xa0\xdb\xf9\x78\xb2\xd6\x91\xbc\xc1\xb7\x2d\xd3\xcf\xad\xda\x5c\x62\xce\x0e\x7e\x79\xbc\xc3\x61\x32\x8e\xb9\x21\x17\x69\xce\xc5\xc5\xf5\x65\x70\xc6\xb3\xb7\x98\x53\xe8\x9c\x94\x98\x77\xe3\xe7\xbe\x67\x6b\xc8\xa8\x15\xe4\xe2\xfa\x32\x1c\x5c\x50\x67\x9f\xc9\x0d\xf9\x19\x58\xd0\xcf\x2b\xf2\xe3\xc5\xc7\xab\xcb\xab\xef\x5f\x11\x98\xc5\x53\x88\x6a\x48\xed\x56\x6a\x99\xb6\xa1\xa6\xef\x8c\xaa\x06\x96\x0b\xbb\xb6\x94\x65\xcc\x30\xb0\x89\x2f\x88\xde\x95\x26\x95\xf7\x82\x5c\x57\x2b\x5e\x60\x56\x9a\x54\x6c\x55\x4d\xd9\xb3\x54\xae\x1b\x44\x35\xb5\x62\x0e\x58\x6a\x12\x4b\x4d\xbc\x24\x55\xfa\xcc\xf8\x74\xcf\x5d\x46\x12\x4d\xd3\x46\xb1\xdf\xce\xb8\xb4\x34\x3b\x26\x0c\x4f\x5c\x77\xf2\xd2\xec\xa4\xe2\xff\xc4\x7f\xed\x39\xb5\x9a\x9a\x92\x0f\x87\x46\x09\x20\x90\x06\xd0\xa4\xaf\xab\x0f\x7a\x82\x8f\xda\x11\x34\xda\xa7\xa6\x60\x49\xd1\x54\x12\x2d\x57\xe4\x3b\xa9\xb0\xb0\x68\xb3\x45\xba\x66\xac\x72\x2c\xd6\x07\x5b\x39\x16\xeb\x3f\x9d\x67\xd4\x30\x6d\xce\xff\x51\x32\x75\xe0\x62\x7b\x4e\x0b\x7e\xfe\xb5\xd1\xe9\x7a\x09\xc7\xb5\xa4\x05\xef\x78\x14\x43\x18\xb8\x91\x2a\x61\xa9\x95\xbe\x74\x41\x13\xf6\x8e\xae\xbb\xc5\x2f\xda\x4c\xb4\xf7\x13\x3f\x92\x06\xc8\x43\xac\x86\xf0\x2f\x60\x99\x82\x0e\xb0\xe4\x86\x48\xc5\xb7\x5c\xd4\xa5\x4a\x68\xc6\x14\xe6\xc9\xe7\xcc\x28\x9e\x54\x65\x89\xe1\x94\x13\x4c\xad\x40\xe3\x72\xff\x98\x88\xda\x4d\x97\xdf\x9a\x55\x5a\x38\x2e\xc6\xd9\x17\x90\x3a\x54\x13\x40\xb3\xf7\x6a\x86\x5e\xf8\xf5\x50\x27\x66\xe7\x83\x13\xbc\x14\x86\xa9\x3d\x0d\x83\xce\xbf\x64\x45\xef\x7b\xc6\x44\x2b\xea\xa8\x1e\xab\x13\xae\x3d\x3c\xbf\xeb\xca\x0d\x47\xd0\xd1\x00\xe3\x0a\x5e\x07\x48\x6f\x27\xf4\x18\x80\xee\x2b\xa8\x62\xc5\xe7\x83\xf3\x5b\x31\xc5\xd1\xf8\x09\x67\xe8\x2a\xc8\x26\x32\xcf\x4b\x01\x37\xad\xe7\x82\xc3\x65\xae\x1a\x8b\xa3\x9e\xae\xc9\xf3\x0d\x4b\x5d\x12\xde\x02\x9a\xe5\x1a\x46\xb4\x91\x8a\x6e\xd9\x82\x5c\xd8\xc1\xb1\x10\xb4\xea\xc8\x90\x83\x64\xdf\xcf\xf1\x83\x0a\x9f\xcf\x6d\xb3\xd1\xf9\x0f\x1f\xdf\xf9\x3a\x81\x9e\xce\x72\xa1\x0d\x05\xd9\xab\x6a\xc8\xbf\xa7\x3c\xb3\xa4\xb1\xb3\xb9\x52\xa4\x4d\x8b\xa0\x60\x96\x6e\x53\x05\x54\x65\xcb\x84\xdd\xa1\x65\x97\xca\xf2\x71\x3b\x97\xee\x79\xb7\x33\x28\xdf\xb4\x96\xe3\xbd\xe3\xaa\xea\x27\x0c\x79\x5e\xa0\x45\xbd\xb9\xba\xc1\xde\xd6\xb1\xb8\xc4\xb7\x42\x2a\x56\xdd\xea\x1b\x96\x81\x84\xd1\xc1\x98\x36\x46\x0f\x7c\x64\x57\xda\xf0\xe1\x22\xbc\x70\x06\xd2\x79\xbb\xb3\xcd\xaa\xca\x47\xa5\x49\x17\x32\xcd\xa5\xe0\x46\xa2\x58\xe9\xda\x26\xfb\x3f\xa1\x1c\xe2\xb8\x8a\xd9\xb1\x2e\xe0\x60\x7e\xa0\xe2\xe0\x91\xdd\x33\xd5\x68\xb9\x5c\x2b\x02\x5c\x91\xa4\x54\x90\xc4\x5a\x11\x8c\x15\x19\x96\x88\x87\xb4\xb8\x61\x82\x0b\x62\x51\x18\xa4\x90\xd8\xce\x1b\xe9\xc4\xe0\xc3\xaf\x73\xbd\x09\x2c\x7f\x4d\x35\x83\x57\x17\xc4\xd0\x6d\xaf\xdb\x5a\xef\xa8\xbd\x81\x6b\xe7\x2b\xd1\x2b\x72\x03\x43\x1e\x3c\x83\xdf\x33\xa5\x21\xc2\x4e\x13\x6d\xd0\x89\xdb\xc0\x52\xe4\x7d\xbd\x12\x44\x03\x09\x3f\x40\xc6\xac\x54\xe4\x4e\xc8\x7b\x7b\xed\xa9\xa9\xc6\x95\xc7\xe8\x0a\x54\xb6\x33\x62\x2d\x46\xc6\x23\xab\xdd\xf9\x75\x99\x65\x37\x2c\x51\xac\x6b\x35\x6c\x57\x37\x16\xae\xca\x0b\xcd\x2a\x53\x7f\x43\x8f\x82\x6c\x1b\x18\xc5\x4b\xb1\x9a\xe6\x0d\x8e\xd1\x77\xea\x3e\xae\xbb\x28\x33\x10\x97\x1a\xc2\x18\x04\x05\x34\xc8\x14\xae\xd5\xe1\xb2\x62\x5b\x6e\xb7\xd3\x13\xb5\xe4\x45\x80\xfe\xd0\x22\xcb\x00\x97\xdb\x92\xa7\xec\x1c\xc7\xfb\x5a\x57\x67\xb9\x84\xbf\xd8\xa5\xb8\x7d\x2c\xa5\x58\xd2\x65\xd7\x6a\x3c\x60\xc5\x6c\x57\xb3\x92\x09\xcd\x3e\x00\x0d\xfd\xe8\x61\xe4\xc5\x7a\x2b\x07\xca\x72\xbb\x6b\x89\x2e\x46\x92\xac\xb7\x80\xe6\x41\x96\xc4\x79\x8d\x30\x8d\xc9\x8d\x96\x7a\xde\xeb\x0c\xfe\x5d\x88\x77\x75\x84\xb0\x99\x73\xd8\xf8\x74\x14\x56\xd6\x88\xfa\x73\xcb\x31\x93\x23\xc0\xed\xed\xdb\x73\x76\x7f\xee\x74\xb1\xa5\x25\x1f\x4b\xdc\x92\x3e\x87\x3d\x9c\x7f\x0d\xff\x33\xa0\x35\x61\x0c\xea\x45\x9a\x3a\x2b\x60\xa9\xd9\xa6\xcc\xd0\x2e\xa7\x57\x84\x16\xfc\x13\xde\x9f\x05\xb9\xe3\x22\x5d\x90\x92\xa7\xff\xfe\x08\x3f\xf5\x23\xb4\x20\x2e\xb8\xa9\xd4\xcd\xf0\xa5\x3a\xbb\x6c\xbd\xeb\x33\xcf\x9c\xf4\xd7\x1e\xa8\x11\x74\xda\x83\x7c\x1b\x88\xc6\xc7\x94\x7b\xa9\x19\xc8\xca\x8d\xfa\x02\x6c\xb5\x5d\x91\x0d\x33\xc9\xae\xba\xa6\xf6\xe6\x71\x61\xf7\xd5\xe7\x02\xae\x3c\x01\xd7\x4d\xed\xac\xd1\x49\x02\xaf\x62\x2d\x78\x60\x1b\x89\x15\xb9\x10\x07\x74\x01\x77\x4f\xce\xd5\x0a\x80\xda\x27\x90\xce\xed\xc8\x1b\x15\xed\xad\x22\xa3\xc9\x18\x45\xe9\xc8\x87\xdf\x10\xd9\x2d\xbe\xe8\xea\x36\x3c\x35\x03\xc1\x4e\x5f\xb7\x64\xd0\xdd\x76\x0f\x3f\xe8\x9e\x03\x81\x96\x21\xe2\x00\x74\x2c\xa1\xda\x1b\xa4\x21\xc4\x09\xa1\x8c\x20\x87\x4f\xbb\xe0\xb0\xea\x93\x62\xd9\x81\xc8\xd2\xd4\x77\x38\x91\x58\x4e\xfa\xde\x3b\xe5\x72\xca\xdb\xb1\x1c\x2e\x10\xbb\x97\x5b\xad\x0f\x24\x95\x90\x9e\x2b\x17\x40\x3b\x30\xb2\xca\xbb\xf8\x80\x7b\xec\xe8\x9e\xcb\x52\x61\x3d\x13\xc5\xe8\x1d\xa1\xa6\x92\x41\x7b\xe5\x4b\x59\x82\xab\x81\x27\xac\x13\xea\x11\x43\x0d\x2f\xaa\x50\xb9\xa2\xc8\xbc\xc6\x58\x1b\x39\x60\x6d\x76\xad\x3e\x05\xd5\xf7\xf4\xe8\x75\xea\x50\x7b\x01\xa6\xd2\x36\xaa\xb6\x51\xad\x96\x2e\xd4\xb6\xcc\x41\x3f\x75\xd8\x5f\xd7\xe8\x71\x05\xba\x65\x72\xe7\xb9\xd1\x70\x14\xd2\xeb\xf7\x6f\xbc\x2f\x01\xc3\x2d\xea\x28\x4c\x57\xe8\x23\x5d\x91\x4f\x8f\xb2\x46\x8e\xda\x21\x8f\x0d\x91\x97\x56\x8e\xf5\x96\xcf\x21\x13\x54\x65\x5f\x52\x4c\xcb\x6c\xef\xcb\xba\x55\x2b\xf3\x3c\x9d\x8b\xa2\x34\x8e\x54\x7a\xf1\x7d\x60\xcc\x52\x24\x3b\x2a\xb6\x5e\xd3\x6c\xec\x8c\xe8\x83\x30\xf4\xc1\x93\x28\xa6\x13\x5a\x54\xf1\x23\x24\x95\xe5\xf0\x42\xff\xf0\x87\x05\xe1\xec\x15\xf9\x43\x63\xb8\x15\x79\xeb\x46\x68\x00\xb2\x11\x4d\xb7\xae\x01\x36\x64\xd5\x53\x6c\x4b\x55\x9a\x41\xe0\xfa\xa6\xea\x72\x82\x56\x1e\x77\x48\xec\x81\x6b\x03\xaa\x99\x90\xa6\x61\x91\x1b\xda\xfd\xb4\x2e\x5b\xd8\x21\x06\xa9\xf1\x32\xa5\x86\x2e\x1b\x57\xe5\x1c\xfb\xff\x2c\x5d\x41\x89\x25\x75\x48\xda\xe8\x21\xf3\xb5\xeb\xbe\xb1\xa4\xd5\x5b\xdc\x4a\x2f\x50\x80\xa1\x9f\xeb\x05\x9d\xb1\xa3\xb6\xe1\xb0\x65\x36\x58\xfd\xe3\xd8\x22\x57\x95\x03\x86\xd1\x56\xe4\x4a\x9a\xba\xca\x4f\x15\x66\xe1\x4a\x49\xdc\x0e\x06\xd3\x1d\xdd\x4c\xf2\xf6\xea\xf6\xe3\xdf\xaf\x3f\x5c\x5e\xdd\x8e\x5e\xc5\x81\x11\x47\x2e\x68\xcc\x55\x1c\x18\x79\xf8\x82\x8e\x5f\xc5\x81\x21\x03\x17\x74\xfc\x2a\x0e\x93\x85\xc1\x0b\x1a\x7d\x15\x07\xc6\x1e\xb8\xa0\xf1\x57\x71\x60\xdc\xce\x05\xfd\x9d\x5f\x45\x26\xf6\x11\xd7\xf0\x9d\x53\xe8\xfa\xbc\x65\xc7\x95\x14\x46\xa3\x29\x4e\x1e\x0d\xf2\x56\xec\x3f\x51\x55\xf7\x69\x81\x30\xdc\x5e\xc7\x9e\x7b\x61\xd0\xeb\x05\xa4\xe4\xf5\x29\xc2\x41\x26\xb9\xea\x9b\x2a\x53\xdf\xba\xeb\x0c\xc5\x50\x67\x2d\x42\x5e\xff\x74\xf9\xe6\xed\xd5\xed\xe5\x77\x97\x6f\x3f\x3e\xd9\xf7\x3b\x5a\x3b\xa1\x4d\xa8\xa7\x50\xc3\xe0\x26\x6a\x4a\x59\x28\x66\x25\x51\x4d\x7c\x83\xbb\x7e\xf4\xe3\xe3\xb9\x64\xed\xd8\x10\x2b\xcb\x3a\xe3\x56\xff\x90\x48\x74\x83\x23\xc6\x13\xe4\x16\xe9\x0d\x8e\x39\x95\x2c\x3b\x02\x1c\x76\xf5\x7e\x0e\xe2\x8c\xcf\xe3\x49\x74\x78\xc5\x6d\x49\xaa\x1d\xe1\x10\xcc\xa5\x8c\x47\xeb\xef\x94\x0c\x74\x81\x39\x2e\x34\x00\xaa\x6b\x95\xa6\xdc\x87\x31\x67\xda\x35\x5f\x0c\x5f\xcf\x9a\xf0\x39\x71\xa3\xca\x8b\xb3\x7f\x87\xf8\xe9\xd0\x08\xb1\x35\x59\x50\x0f\x7f\x4f\x8b\xff\x60\x87\x8f\x6c\x24\x25\xf4\x78\xb3\x60\x2e\xd6\x84\x92\x3b\x76\x40\x23\xf7\x6b\x3f\xdc\x58\x25\x85\x29\x35\x63\xee\x58\x30\x66\xa8\x77\x6d\xf6\x16\xd8\x55\x01\xbf\xb1\xcb\x1c\x5b\x10\x99\x5a\x2f\xe6\x51\x95\x6c\xbe\x10\x8b\x57\xfb\x99\x6a\xff\x8a\x1a\x74\xd8\x46\xd6\x7e\x26\xc1\xdc\x5b\x8d\x27\xc3\xdd\xd9\xd9\x5b\x14\xa6\xc2\x55\x4b\x3f\xf8\x68\x9e\x36\x3e\x16\xa7\x7c\x56\xb0\x63\x35\xd1\x9b\x1c\x0b\x1c\xc3\x27\xbe\xda\xcf\x5d\x8f\x5f\xa5\x6f\xde\x88\x32\x3e\x70\xd6\x53\xef\xff\x59\x4d\x00\x30\x86\xb1\xca\xdf\x4e\x5f\x79\xcb\x92\xae\x2a\x02\xaf\x2c\x42\x8e\xe3\x4e\xeb\x75\x30\x3e\x2f\xea\xbf\xa1\xbb\xb3\xf1\x07\xa0\x92\xe8\x4c\x19\x1f\x5a\x17\x2c\x59\x09\x99\x82\x7b\x6c\x81\xff\x74\xbc\xfd\x22\x49\x64\x29\x8c\xfb\x01\xb2\x6b\x56\x3b\xa9\xcd\xe5\x75\xc4\xb0\xf8\x7a\x21\xd3\xcb\xeb\x45\xeb\x5f\x7a\x24\x9d\x7f\x1a\x19\xac\xef\xe1\x64\xf4\xff\x54\xfb\x7f\xd0\x30\xb8\x63\x39\x85\xff\xfc\xce\x1e\x5c\x20\xe8\xaa\xfd\x70\x5d\x67\xc0\x09\x48\xfb\xb1\x7c\xbb\x5d\x33\xee\xd9\xfe\xe5\xb3\x93\x13\xdb\x8d\x5f\xe6\xe4\xad\x43\xb4\x9b\xaf\x71\x0a\x58\x5a\xb1\x84\x18\x69\xd0\x3f\xb5\xef\xef\xe2\xfa\xd2\xfb\xd3\x4e\xbc\xcd\xf8\x9b\xbf\x89\x3c\xb5\xe8\xfb\xef\x7b\x37\x7f\xf7\x44\x3a\xe0\xc7\xe9\x24\x8d\xbc\x02\x67\xef\x28\xbc\xea\x26\xdb\xd8\xba\xdd\xa5\xdb\xba\x16\xdb\xcf\xf1\x8f\xab\xa4\x28\x17\xee\x85\x55\xce\x72\xa9\x0e\xe3\xb7\xd4\xbd\xce\x8a\x1d\xcb\x99\xa2\xd9\xb2\x0a\x61\xf0\xc3\xe3\xb0\xd5\xbf\x70\xe0\xf1\x5b\xd9\x58\x60\x77\x74\xd4\x65\x9c\x0b\x3b\x3b\xd4\x85\x4f\x4e\x4a\x19\x2a\x28\x8f\x17\x96\xc7\xa7\x7d\x7c\xb5\xb3\x04\x64\x9a\x0a\x0f\x41\x8c\x75\x79\x1d\x71\x4c\xbf\xf2\xea\x42\x00\x91\xd8\x5b\xa1\x37\x50\x4e\xa1\x7e\x26\x11\x83\x94\xef\xb9\x96\x23\xdd\x5a\x7a\x36\x7a\xd3\x2a\xc3\xe9\xd2\x06\xd1\x6f\x1a\xd7\xbf\x00\x1f\xf6\x50\x40\xda\x77\x85\xab\x47\xf4\xef\xe5\xb3\x53\x6f\xd8\xcf\x34\xfd\x68\x3f\x7a\x92\x52\xdf\xcc\x8a\xfc\x9d\xf8\x5c\xe2\xa9\x97\x5f\xca\xa9\x88\x17\xfa\xc7\x4e\xa3\xc0\x38\x5f\x5b\x9d\xe7\x35\x12\x6e\x4f\x9c\x26\xd0\x1f\x98\xd0\x7e\x7e\x29\x9d\xc7\x73\x79\xdc\x4a\xcd\xee\x36\x4a\xe6\x2e\xdb\x27\x0a\xd1\xd7\x0c\xac\xc9\x19\x4f\xfd\x58\x77\x6c\xa4\xfe\x31\x3e\xb3\x1e\xf5\x7b\xd2\xa3\x30\xe2\xc7\x29\x51\x11\x4a\x09\x3e\xbf\x39\x25\x2a\xe2\xb5\xf1\x1c\x88\xcf\x97\xe1\xc0\xc4\x7e\xd8\x92\xd5\x6b\xc0\xf7\x92\x58\xa3\x38\x41\xbf\x09\x34\xec\x46\x6a\x65\x63\x03\x81\xaa\x8d\xb4\xb5\x4b\x0e\x79\x53\x3e\x62\xba\x6e\x19\xad\xc9\x05\x14\xa4\x47\x02\x05\xc3\x7a\x6b\xa8\x62\xae\xba\x1c\x56\xd9\x60\xfb\x61\x3b\x3e\x44\xc5\x1e\x25\x4a\xb8\x5a\x96\x5c\x6c\x5d\xa6\x1f\xf2\x07\x67\x6c\xe4\xa2\x2a\xa6\x33\x30\x66\x25\x16\xd4\xb1\xfd\x54\x6b\x99\x40\x81\xcb\xba\x99\x0b\xd4\x57\x70\x1b\x87\x95\x1b\x7a\x37\x34\x64\xb3\xb1\xcc\x27\x3b\x62\x0d\xc3\xf5\x01\x8a\xbb\x88\x7d\x65\xb7\x2d\xd1\xc7\x84\xcc\x20\xd0\x85\x04\x3a\x77\x34\x47\xfe\x1c\xde\x16\x8b\x74\xce\x2a\xda\x70\xba\x00\x7f\xaa\x34\x05\x0a\x3e\xa1\x9e\x90\x1c\xff\x54\xa6\x9a\x21\x5c\x8b\x61\xad\x95\xa9\x73\x44\x4c\xe8\xf0\xd4\xda\x50\xd4\xe6\xa5\x27\x30\xbf\xc6\x30\xbf\x2f\x9b\xf1\x9d\x30\x78\xae\x7e\xa2\x99\x59\x2c\x23\x9b\x60\x0c\x9c\xc6\x98\x62\x99\x52\x14\x13\x29\x14\xdb\xf0\x87\x68\xdc\x6c\x86\xd1\x72\xe8\xa9\xb6\xe1\x50\xe6\xdd\x0e\x54\x30\x81\xd1\x7a\x34\xd9\x8d\x32\x39\x47\xaa\x6b\xeb\x7d\xed\x44\x3c\xad\xa3\x10\xe5\xc8\xa9\x17\xf0\xa6\x4f\x92\x9d\x6f\xdf\x6f\xe7\xf6\xb9\x03\xfe\xd5\xae\xde\x13\x65\xab\xde\x1c\x82\x9e\xad\x9f\xbd\x69\x04\x16\x61\x32\xc8\x54\xdc\x69\x04\x96\x62\xd8\xf9\xc0\x8e\xda\xdd\xe7\x2a\x32\x81\xdd\x59\xe5\x3d\xd9\xf1\xad\x05\x3e\x76\xa4\x43\xce\x48\x30\x3e\x3e\x1f\x16\x96\x20\x91\x10\x93\x53\xa5\x82\xac\x07\xc5\xd3\x4e\x8e\x29\x88\x48\x3e\x28\x16\x7e\x54\x32\xcb\x86\xbb\x7e\x64\xfc\x8e\x91\x37\xac\xc8\xe4\x21\x77\x11\x19\x29\xb9\x31\xd4\x58\x54\xbe\x61\x66\xc8\x8a\x3e\x82\xa6\x55\x46\x42\x74\x29\xb0\x33\xcc\xf4\x28\xca\x2c\x23\x05\x7c\xb4\x82\x76\x59\x72\x43\x2e\x20\x77\x6d\x41\xae\xd8\x9e\xa9\x05\xb9\xdc\x5c\x49\x73\x8d\xc2\xcc\x10\x4d\x6c\x3a\xa3\xf1\x73\xc2\x37\xe4\x15\xa6\x0b\x42\x8a\x08\xd7\xcd\x0e\x75\x52\xb5\x86\x1d\x18\xb5\xaa\x76\xf0\x84\xb0\xa4\x61\x64\xfa\x1a\x46\xaa\x32\x18\x06\x4c\x77\x23\x80\xaf\x0a\xab\x46\x80\xfc\xc2\xa5\x63\x9a\x3a\x42\xd9\xe3\xa0\xcb\x3f\xf3\x09\xa7\x20\xac\x0e\x96\x66\x51\x4c\x17\x52\x68\xd6\x2e\xee\x51\x97\x88\x06\x15\x40\x47\x4b\xb8\xe3\x0c\xa4\x90\xda\x40\xeb\xb8\xd8\x0a\xba\xd7\xfe\x03\xa8\x25\x49\xb3\x8c\xa5\x84\xe7\x39\x4b\xad\x56\x90\x1d\x5c\x7d\x50\x1a\x55\x66\xc9\x8e\xe0\x53\x2f\x2f\x91\x19\xed\xa8\x48\x33\xa6\x9a\x3d\x08\x5b\x1a\x8d\x2f\xd1\x16\xa4\xaa\x68\xcb\x76\xf5\x29\x09\x4d\x12\xa9\x52\xd7\x21\xc1\xaa\xf6\x3e\x76\xbe\xba\x1b\x40\xbf\x47\xa9\x06\xe9\x6b\x3b\x0a\x85\xb1\x74\xa3\x74\x26\x74\x15\xae\xfa\x2c\x9e\xb0\xf4\x6f\x03\xc9\xeb\x42\xbf\x15\x66\x2c\xa1\x30\xf9\x79\xa3\x06\x30\xfc\xe1\xa9\xe5\xc4\xc3\x0d\xf9\xc8\x63\x9b\xf2\x8d\x70\xc4\x56\xcb\xbe\xa7\x34\xe6\x8b\xdf\x28\x89\x6d\xd0\xd7\xd9\x73\x5c\x93\xbe\x08\xbb\x50\x23\x6b\x29\xa6\x51\x5f\x8c\xa5\xa9\xdd\xca\x2f\xbe\x59\x5f\xc4\xd8\x8d\x76\x7e\x91\x0d\xfb\x22\x06\x1d\x68\xe9\x37\xd8\xb4\x2f\x62\xc8\xb1\xb6\x7e\x03\x8d\xfb\x22\x46\x0e\xb5\xf6\x1b\x68\xde\x17\x03\x82\x40\x7b\xbf\x09\x0d\xfc\x48\x6c\xfb\x2d\x32\xd5\xe6\x1a\xd7\x29\x29\xda\xdc\x38\xda\x89\x8e\x7c\xa6\x6e\x74\x64\x12\x6d\x18\xef\xab\xd0\x5d\x67\x44\x67\xba\xc8\x4b\xfc\x59\xba\xd3\x91\xd8\x0e\x75\x64\x1a\x8a\x44\x77\xaa\x23\x8f\xea\x56\x17\xb1\x2b\xe8\xb0\xf5\xa8\x8e\x75\x64\xca\xb5\x99\xdc\xb9\x2e\xca\xa1\x80\xa5\x4c\xa7\x77\xaf\x23\x13\x3d\x73\x64\x82\xcf\x8a\x9c\xaa\x93\x1d\x99\x4a\x6d\xc8\x94\x8e\x76\xe3\xcb\x8c\xed\x6a\xf7\x88\x75\xc6\xba\x6a\x48\x6c\x87\x3b\x12\xdd\xe5\x8e\x4c\xf1\x32\x93\x09\x34\x3c\xa6\xe3\x1d\x39\x71\xd7\x3b\x32\x0d\xf4\xe3\x3d\x62\x48\x5c\x9f\x18\x32\xb1\x57\x0c\x99\xd6\x2f\x86\x3c\xa6\x1b\x5e\xc4\xb9\xcb\x8e\x77\x2a\xd8\x37\x26\x06\x93\x5a\x9d\x65\x1e\xd9\x3b\x86\x3c\xad\x33\x1e\x89\xec\x8e\x47\x3e\x57\x87\x3c\x32\xb9\x4b\x1e\x99\x82\xb7\x71\xc4\x62\xa4\x4b\x0e\x99\xe0\xd4\x1d\xef\x9c\x45\x1e\xdb\x3d\x6b\x04\x2a\xd0\x5b\x6b\x7a\x07\xad\xd1\x51\xab\xfe\x5a\x93\xba\x68\x91\xcf\x2d\xf5\x9d\xb0\xa3\x16\x99\xd8\x55\x8b\xfc\x5e\x28\x67\x44\xb7\xad\xdf\x31\xe5\xfc\x65\x69\x4b\xc4\x4b\x85\x62\x37\x46\x16\xd1\x16\x46\x7c\x7d\xc0\xbe\xe8\x9a\x6f\x46\x1b\x18\x6b\x83\x21\x49\x4b\x86\xa5\xc5\x20\xf6\xd9\xeb\x8a\xb2\x69\xfa\x0b\xc6\x58\x90\x46\xd3\x13\xdf\x30\xf1\xdc\x35\x4b\x74\x7d\xc3\x5c\xb7\x8a\x85\xdd\x33\xcb\x0b\x5f\x6b\x6c\x34\x4e\xd0\xf5\xd6\x80\xd7\x99\x49\x30\xc4\xc4\xdb\x42\x9d\x25\xc5\x03\x23\xbe\x8c\x7d\xa2\xa8\xde\x61\xf1\x34\xf6\xc0\x8d\xeb\x9e\xa2\x18\xd5\x12\x6b\xe3\x35\x7b\x84\x70\x4d\x0a\xaa\xb1\x36\x4a\x88\x93\xd4\x0b\xc3\xe1\xae\x65\x7a\x76\xa6\x5b\x43\x6d\x15\x4d\x98\x6b\x20\x4a\x20\x21\x21\x95\xf7\x21\xd7\xd6\x9a\x6d\xb9\xd0\xfe\x6c\xb1\xc4\x0a\x22\x81\xa5\xe6\x0c\x2c\x4c\x3e\xff\x7d\x45\x3e\x56\xc9\x76\xe3\x96\x5a\x59\x9a\x44\xd6\x44\xc2\xad\xfc\xd8\xb0\x0c\x61\x2b\x70\xf4\x63\x85\x64\x2b\x74\x6a\x56\xf9\x1d\x01\x81\xb3\x30\x07\x46\x6d\x20\xe0\x54\x0b\x73\x08\x04\xaa\xf1\xd5\xe0\xf9\x40\x2f\x27\x9a\xec\xda\x7e\x97\xd9\x58\x3d\x1b\xab\x43\xcf\x6c\xac\x9e\x8d\xd5\xb3\xb1\xba\xf7\x99\x8d\xd5\xb3\xb1\x7a\x36\x56\x8f\x7f\x3b\x1b\xab\x67\x63\xf5\x6c\xac\xee\x79\xbe\x44\x93\xcb\x6c\xac\x0e\x7f\x3e\x1b\xab\x67\x63\x75\x60\xd4\xd9\x58\xdd\xfb\xfe\xef\x81\x72\xce\xc6\xea\xd0\xc7\x5f\x98\xb1\x7a\xe4\x05\x6f\xf5\xbd\xb6\x32\x6e\x4c\x24\xf6\x35\xd8\xd8\x78\xe2\xcc\xc3\xed\xfe\xc3\x6e\xb0\x55\x5d\x7d\x6f\x60\xe1\x75\x3e\xa0\x8f\x69\x75\x46\xe0\xda\xe8\xdc\x1b\x13\x0c\xf6\xbc\x81\x31\x1f\x5d\x17\xba\x90\x69\x6d\xc9\x6b\x98\xf0\x50\xee\xef\xbf\xf4\xe3\x44\x2c\x6c\xbb\x7b\x94\xdd\xae\x6d\x99\x0b\x20\xcf\x13\x6c\x76\x71\xd4\x39\xca\x56\xf7\x08\x3b\x5d\x9c\xad\x2a\xd6\x46\x77\x6c\x81\x1b\x19\x36\xda\x3e\xd7\xb4\xbe\x8d\x8c\x19\x67\x9b\x1b\xb2\xbc\x8d\x89\x68\x03\x76\xb9\x51\xab\xdb\xc8\xb8\xfd\x36\xb9\xa0\xc5\x6d\x6c\xa5\xbd\xf6\xb8\xa0\xb5\x6d\x1c\xb0\x91\xb6\xb8\x28\x83\x42\x34\x3b\x8c\xd1\xdd\x22\x28\xb7\x73\xab\xdd\xee\x14\xd3\x3b\x99\x05\x6e\x52\xbb\xf1\x26\x17\x3c\x2f\xf3\x56\x37\x24\x37\x94\xae\x30\x1e\x69\x68\xd0\xba\xb5\x06\xdc\xb6\xa8\x07\xd5\x64\x28\xcf\xec\x69\x40\xa2\xc3\x8e\xee\x81\xe2\x94\x49\xc2\x58\x7a\xd4\x9e\x32\x30\xe4\x1f\x57\xd5\xea\xaa\x82\x88\x2f\x87\x4f\x06\xab\xbb\x80\xc4\xf2\xc7\x6f\x47\x20\x19\x96\x6a\x46\x4d\x98\x9f\xc3\x7c\x19\x47\x26\xc7\x05\xd8\xc9\x26\xcb\x88\x62\x38\x9f\xc5\x5c\x19\x65\xaa\x8c\xbc\x45\xd1\x26\xca\xe9\xe6\x49\x38\xdf\x31\xe5\xe5\x31\xa6\xc9\x28\x2a\x32\xd9\x24\x19\x63\x83\x7e\x94\x39\x72\x8a\x29\xf2\x51\x75\x5e\x1e\x6b\x82\x9c\xa4\x77\x44\x9b\x1e\x4f\x63\x76\xfc\x2c\x35\x95\x22\xe0\x12\x67\x66\x8c\x36\x31\xc6\x99\x17\xc7\x4d\x8b\xa7\x34\x2b\x46\x82\x76\x5c\x29\x8e\x50\x88\xa7\x28\xc3\x13\x14\xe1\xc9\xe6\x43\x07\xa4\x91\x63\x8d\x55\x80\x8f\xd4\xdb\x91\x51\x1f\xa7\xfc\x3e\x41\xf1\x8d\x31\x17\x7e\x16\x53\xe1\x34\x33\x61\x64\x3f\xf4\xb1\xcb\x3d\xa2\xbe\x47\x5c\x55\xe8\xe4\x44\xb3\x37\x2c\xa3\x87\x1b\x96\x48\x91\x06\x28\xf5\x51\xa9\x83\x0a\xe7\x34\x7e\xe8\x24\xb7\x76\x94\xcd\x8e\xba\x6a\x39\x41\xbf\xb7\x0b\x50\xf2\x9a\xbb\x63\x2e\x50\x1b\x11\x57\xf8\x98\xec\xe5\x13\xe8\xd7\xe4\xa4\x22\x22\x06\x06\x4d\x03\xf3\xdf\xe4\x3d\x91\x1b\xc3\x04\x79\xce\x85\x87\xf4\x8b\xa3\xbe\xb5\x08\xaf\x10\xca\x39\xf4\xb4\xdf\xbd\xfc\xc6\x0f\xf3\x6b\x89\xca\x20\xd4\x6b\x7d\x0a\xad\xc3\x0d\xf5\x14\xb5\xc3\x0d\xb1\x29\xb3\xb6\xea\x81\xea\x48\xac\xde\xf1\xb2\x2e\x89\xf2\x12\xd6\x52\xe1\x32\xb4\xbf\xc4\x60\xc6\x2e\xc0\x83\x23\xfe\x02\x47\x11\xe1\x12\x78\x94\x3b\x00\x0d\xfe\x23\x2c\x76\x92\x2b\xa0\x69\xec\x0f\x8c\x3b\xc5\x0d\xf0\x59\xb4\xa7\x13\x9a\xfe\xa7\x98\xfd\x7f\x73\x92\x4d\x84\x79\xff\x77\x24\xd9\xfc\x12\xb2\x80\xe1\x39\x93\xa5\x39\x91\x18\x70\xbf\xe3\xc9\xae\x49\x91\x79\xb8\x5e\x91\x2c\x8f\x1a\x74\xbc\x74\x03\xf6\x72\xa9\xd3\x45\xd4\x7e\x61\x52\xc2\xc8\x39\x45\x36\x4e\x6d\x96\xa1\xaa\x65\xb1\xba\x46\x39\xd5\xd8\x70\xfa\xa7\x77\x17\x7f\x7d\xfb\x6e\x45\xde\xd2\x64\xa8\x54\x78\xa3\x4a\x88\xc0\x86\x88\x88\xfb\x3b\xba\x67\x84\x92\x52\xf0\x7f\x94\x58\xab\x88\x3c\xaf\x46\x7c\xe1\xbd\x26\x03\x83\x8e\xd5\x57\x19\xa1\x19\xd0\x38\x60\x42\xa5\x4a\x6c\x34\x80\x66\x64\x69\xc5\x7c\xdf\xa5\xba\x41\x1b\xde\xda\x9f\x86\x49\x14\x45\xda\xb3\x63\x8a\x91\x2d\xdf\x3b\x83\x9d\x2b\x41\x53\xf7\x6d\x6f\x35\xda\xa5\x6b\x30\x53\x0f\x52\x28\xc1\x8c\xc5\xbe\x4a\xe3\x90\x42\x37\xf3\x2f\xac\x46\xa2\x17\x64\x5d\x82\xa9\xbe\x50\x3c\xa7\x8a\x67\x87\xe6\x14\x34\x1b\xa2\x37\x57\xd2\x73\xe8\x03\xb2\xe3\x7a\xf9\x6f\x3e\xbc\xbd\x21\x57\x1f\x6e\xa1\x27\x92\xe5\xac\x60\x45\x87\xdf\x01\x30\xfd\x3d\x9f\xf1\x71\xb5\xad\xb1\xf5\x2a\x7c\x82\xf7\x9c\x6b\x68\xd4\xcc\x84\x9d\xcc\x69\xe5\xbe\x14\xd4\xb3\x6f\x56\xf0\x7f\x43\x65\xaf\x69\x9a\x2a\x4b\xcd\x2b\x27\xc4\x51\xfe\x80\xa5\xb2\x40\xef\xf9\x3a\x6b\x9c\x9d\x83\xde\x2f\xd6\x19\xac\x72\x26\x5e\xdb\x6d\x37\x1b\x84\x55\x07\x09\x00\xc1\x7a\xa5\xd0\x84\x74\x90\x0e\x8c\xf6\x35\x8b\xac\x57\x59\x2f\x28\xba\x5e\x5e\x4d\xaf\x3d\x33\x75\x97\x42\x36\x4a\x5a\x93\xcb\x6b\x7f\x2c\x61\x86\x06\x65\xc4\x2a\x5e\xe8\x8a\x41\xc3\xc0\x68\x92\x58\x90\x6f\xc8\x5f\xc8\x03\xf9\x0b\xb0\xd6\x3f\x87\x06\x8b\xa3\xa0\x71\x62\x2d\x4a\x6d\x97\xd7\xd1\x50\xf9\xd1\x5e\x01\xfb\x8d\xdd\xb9\x91\x64\xcd\xb1\x31\x7d\xdd\x74\xd8\x41\xeb\xc9\x15\x0e\xed\x24\x27\x3d\x30\xb0\x4e\x90\xcb\x46\xfb\xf9\xb0\x63\xcd\x4c\x3c\x32\x3b\xb4\x95\x64\xaf\x10\xc9\xc3\xe6\xe9\x56\xc5\xb2\x7a\xa6\x9c\x9a\x64\xd7\xbe\x41\x96\x85\x6b\x53\x23\x71\x58\x18\x4e\x25\x68\x08\xe8\x0e\xdc\xf1\x20\x56\x9e\x16\x91\x26\x35\xdf\x6b\x9d\xc2\x11\xa4\x8f\x04\xc5\x11\x21\x3c\xf5\x9c\xb5\x91\x0e\x55\xc8\x14\x59\x35\x2c\x2a\x6d\x90\x1b\xcf\x95\x83\x83\x76\x39\xb6\x0b\x51\xa9\x54\x67\xc0\x2f\x7b\x13\x5c\x37\x4e\xa8\x60\xa9\x46\x32\x16\xec\x6d\xa9\x7a\xe0\x05\x0f\x26\xea\x7e\x14\x4a\x1a\x99\xc8\x60\xcd\xc8\xb6\x49\xd8\x7d\x80\xed\xfd\x11\xb3\x1c\xcc\x7f\x78\x73\xbd\xb0\x1a\x21\x14\xcf\xbb\x79\x3d\x66\x95\x6b\xb5\x87\xbb\x7d\x7d\x1d\x6c\x53\x13\xb1\x99\xf1\x72\xde\x2d\x12\x3e\x24\x96\x3f\xad\xf6\xa4\x62\x34\xe5\x27\x8b\xad\xf1\xad\x0e\xab\x51\xa7\x04\xd9\xe4\x72\xcf\x52\x64\xe0\x75\xcb\xc4\x14\x1a\xf2\xea\x40\xe4\xcd\xb8\x0c\xf9\x2b\x58\x06\xe7\xc8\x9b\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x02\xef\xcc\x91\x37\x73\xe4\xcd\x1c\x79\xd3\x0b\x96\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x1a\x2f\xcd\x91\x37\x6e\x51\xff\x32\xfe\xa9\x39\xf2\xa6\xfd\xcc\x91\x37\x9d\x59\xe6\xc8\x9b\x2f\xc3\xa7\x36\x47\xde\xf8\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\xe6\xe8\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\x26\x7c\x4e\x55\x37\xef\x18\x17\xca\x6b\x99\x17\xa5\x61\xe4\x63\xd5\xae\xbe\xea\x99\xbe\x3e\xa0\x5f\xb0\x71\x39\x3e\x97\x9b\x03\xdb\x76\x95\x0a\x42\x45\xce\xb1\x16\xe2\x32\xc1\xa5\x2d\xab\xfd\x2c\xab\x95\x9c\x3f\xd6\xd5\x81\xbd\xf3\x87\xf1\xa1\x8e\x8f\xb9\x8e\x22\xfc\x51\x84\xab\x0d\xf1\x77\xb0\x84\x86\xa1\x05\x9b\x45\x3d\x00\xfa\xd2\x5c\x96\x58\x02\xd2\xed\x3e\x30\x77\x05\x17\x34\x13\xfd\x7a\x60\x27\xf1\x3d\x83\x99\xfe\x95\xa1\xff\xd1\x2d\xe2\x18\xfe\x8e\x7c\x3c\x0e\xfe\xfe\xca\x40\x04\x42\x35\x03\xd7\x44\xe6\xdc\x58\x39\xc5\x0a\x7b\x8d\x68\xa1\x90\x57\x83\x9b\x96\x0d\xd5\x61\x0b\xf8\x1c\xa9\xc1\x2a\xa8\x95\x9b\xa3\xd9\x73\xcd\x77\x53\x0b\x81\x0b\x2a\xdf\x56\xd2\x12\x9c\xfa\xd2\x37\xdf\x05\xc2\xf9\x45\x63\xd0\xc8\x0b\x56\xde\x57\xdc\x1c\x5e\x4b\x61\xd8\xc3\x80\x04\xd3\x46\x86\x1b\xf7\x89\xeb\x2a\xa8\x2b\x51\xca\x39\x31\x55\x29\x20\xaa\x21\x82\x95\xc4\x00\x0b\xbb\x8d\x9d\xfb\x85\x02\x54\xd8\x83\x39\x1f\x18\x32\xee\x28\x0c\xd5\x77\xf5\x39\xb0\xa5\x65\x4e\x35\xb8\x3b\x73\x3d\x96\x70\x02\x89\xb9\x56\x7c\xcf\x33\xb6\x65\x6f\x75\x42\x33\x38\xf3\x58\x11\xe0\x62\xe0\x7b\xdf\x55\x51\x57\x5d\x34\x87\x3a\x66\xbb\x75\x82\x50\x97\x50\x41\xb6\x94\x0b\x92\x5b\x18\x15\x7e\x58\xe8\xbe\x27\xa0\xc3\x5b\x41\x95\x55\x08\xdc\x07\x21\x89\x0b\x02\xc3\xd6\x52\x66\xce\x23\x9b\x1d\xea\x35\x39\x57\xbf\x90\x3f\x09\x76\xff\x93\x9d\x47\x93\x4d\x46\xb7\xa1\x5e\xd4\xc4\x55\x84\x65\xa6\x53\xb2\xa5\x5a\x0e\x19\x02\x47\x88\x30\x68\x10\xff\x08\xc5\x0e\x8c\xbd\xed\xbe\x5f\x91\x97\x2f\x00\x6b\xa9\x26\xd5\xe8\x21\xa3\xca\xb7\x2f\xc0\xfa\xf2\xfa\xe2\xfa\xa7\x9b\xbf\xdf\xfc\x74\xf1\xe6\xfd\xe5\xd5\xd8\x15\x0d\xf7\x29\x4d\x68\x41\xd7\x3c\xe3\x61\xda\xdd\xb1\x82\x37\x3f\x03\x42\x95\xa6\xe7\xa9\x92\x05\xee\x53\x95\x02\xe2\x35\xeb\x18\xac\x08\x43\x86\xf7\x41\x55\xe1\x9d\xd8\x9a\xbb\x3d\xd5\x56\x51\x61\xbc\xb0\x33\x56\x9f\x1b\xc1\xac\x4a\x61\x05\xd5\xa7\x7a\xdc\x68\x3a\x25\x28\xe1\x22\x4d\x59\xda\x5a\xfa\x89\x7d\x40\xaf\xfd\xd0\x87\x3a\x62\x94\x5c\x7f\xb8\xb9\xfc\xdf\xf1\xb3\x12\x87\x23\x51\xee\x81\x13\x79\xb0\x09\xb1\x68\x32\x01\x92\x1f\x5d\x74\xcf\x0c\xcb\x81\x77\x46\x2a\xf9\x7b\xaa\x12\x79\xb9\x3f\x96\xa2\x1d\x99\x5f\x8f\x40\x72\x99\xb2\x15\xb9\x46\xa2\x08\xdd\x76\x83\xb4\xbf\xfa\xae\x26\x03\x60\xfe\xb5\x1f\x0b\xc3\x69\x96\x1d\x88\x95\xc4\xf6\x34\x63\xe8\x42\x56\x72\x50\x5b\x21\x75\x49\x2d\x8c\x4b\x6d\x52\x8d\x0d\xcd\x74\xe0\x82\xc7\xd0\x41\x4b\xea\xdf\x5b\x61\x32\x12\x4e\xd5\xfb\x24\x65\x42\x1a\x27\x97\xda\x99\x20\xa0\x56\xc9\x84\xa0\x6c\x8a\x6e\x88\xc0\xae\xea\x70\xa2\x8a\x58\x02\x89\xf5\x64\x90\x6b\xbf\xd7\xeb\x6a\x4e\xd0\xc4\x03\x63\x96\x9a\xe9\x23\x6e\xe3\xc8\x60\x2d\xad\xda\x79\x15\xa3\x29\xc4\x86\x15\xd4\xec\xc0\xae\x19\x18\x34\xa7\xfa\x8e\xa5\xf8\xea\x0a\xf9\xb0\x93\xa4\xb5\xeb\x00\xe0\x96\x77\x6b\xa1\xb0\x61\xd4\x94\x8a\x01\xff\x0d\x0b\xb9\x6b\x46\x98\xa0\xeb\x2c\x14\x79\x16\x15\x14\x49\xd3\x0f\x22\x3b\x7c\x94\xd2\x7c\x57\x85\x54\x45\x1e\xe7\x8f\x55\x4f\xf0\xa6\x06\x0d\xcc\x16\x8c\x94\xe9\x12\xc0\x04\x81\x5c\x71\x95\xcc\xdf\xd4\xc7\x77\x02\xf4\x54\xa5\xb8\xd0\xdf\x2b\x59\xc6\x36\xe5\xb0\x18\xf4\xfd\xe5\x1b\xb8\x55\x25\xde\x1b\x26\x8c\x3a\x40\x50\x64\x27\x83\x67\x5c\x86\x5b\x91\x1f\x2c\x4e\x1d\x61\x91\x95\xb8\x4a\xa1\x99\x59\x91\xf7\xf4\x40\x68\xa6\xa5\x13\xa6\x42\x92\x91\x20\xd7\xe0\x33\x69\xca\xff\x2b\x02\x31\xce\x18\x77\xb1\x96\x66\x47\x8e\x5e\x18\x41\xce\xee\x88\x18\xbe\x87\x06\xa6\x3a\x41\x89\x8b\xe3\x81\x43\xc8\x49\xef\x98\x26\x85\x62\x09\x4b\x99\x48\x02\x67\xd8\xb0\x15\xfd\xf9\x4f\x4f\x32\xdf\xc3\x49\x5f\x49\x61\xd1\x38\xf2\xac\x2f\x45\xca\x13\x8a\x34\xc8\x75\xb3\xae\x51\x18\xac\x9a\x4e\xc6\xa4\x10\x03\x37\x42\x65\x4b\xcd\x14\x76\x77\x56\x25\x43\x20\xfe\x47\xb9\x66\x19\x33\x18\x71\x0b\x71\xfd\xd4\x60\x2b\x01\x6c\x28\x4f\x8d\x47\x8c\xf0\x4d\x67\x42\x97\xd0\x2e\xc4\xaa\xc6\x86\xa4\x92\xd5\xf1\x8a\x54\x93\x1f\x2e\xdf\x90\x6f\xc8\x73\xbb\xbe\x17\xe0\x63\xd9\x50\x1e\x12\xdb\x8d\x44\x2f\xcc\xb1\x5c\xbd\xf1\x83\xc3\x36\x00\x3f\x89\x54\x78\x0d\x17\x44\x84\x7c\x3e\xd0\x2d\xc6\xed\xd0\xaa\x3b\x3e\xc6\xd8\x79\xe6\xc0\x68\xd3\x46\xf4\x00\x3a\x87\xe6\x09\x23\xfa\x10\x3a\x07\x46\x1c\x47\xf4\x09\xe8\x1c\x4d\x92\x7e\xd0\x4c\x4d\xa0\x48\x3f\x9c\x94\x22\x35\x45\x00\x8b\xb5\xed\xdd\x23\x6a\xe6\xcc\xd0\x94\x1a\x4a\x78\xe8\x38\x4a\xd1\xe8\x08\xf2\x7b\x38\xe0\xd3\xd1\x2b\xcd\xde\x71\x51\x3e\xa0\x8b\x6c\x8a\x0a\x79\xf3\x16\x3e\x24\x89\x5f\x3c\x00\x9c\x16\x45\xc6\x31\x40\xb8\x9d\x47\x19\x80\x0c\x5e\xf2\x66\x7a\x4c\x9f\xe0\x03\x57\x99\x66\x99\xb4\xa4\xd2\x72\x75\x2a\x52\x99\x07\x86\x3d\x5e\xa0\x15\x98\x18\x4d\x76\x4d\x0b\x7b\x0f\xb2\x4c\x62\x52\xff\xe2\x6c\x2f\x4e\x75\xce\xd8\x9e\x05\xd3\x6e\x8e\xb3\x6b\xed\xfb\x56\x70\xf2\x27\x00\x03\x90\x8c\xae\x59\x86\xcc\x03\xb1\x24\xd2\xd9\x1a\x85\x43\xd1\xaa\x99\x92\xd9\x94\x60\xa4\x8f\x32\x03\xff\x16\xad\x36\x63\x07\xf8\x42\xf6\x02\xaf\xc5\xef\x05\xe4\xfa\xd6\x5e\x40\xdf\xf9\x32\xf6\x52\x06\x39\x51\x67\x2f\x96\x71\xb5\xf7\x02\x1c\xe4\x4b\xd8\x4b\x84\x5a\x7f\xcf\x45\x2a\xef\xf5\x74\xa2\xfb\x23\x7e\xe8\x29\x43\x62\x49\x8f\xe1\x62\xab\x9b\x84\x97\x06\x8d\xa5\x4d\x3d\xb5\x8f\xf2\x7a\xe3\x7c\x95\x4f\xdd\xa5\x51\x81\xd1\xbd\xc0\x55\x6a\xe7\x9f\x79\x04\x23\x0d\x61\x7c\x14\x6d\x3c\x39\x05\xdc\xe6\x9a\xbe\x56\x76\x2c\xc3\x69\x76\x53\x4c\x6a\x7b\xf6\xfd\xfb\x9b\x8b\xf6\xc7\x16\x71\xef\x21\xe5\xde\xee\xc7\xfe\x4e\x68\x9a\x73\xad\xc3\x26\x69\x80\x2f\x5b\x43\x3b\xba\xe7\xde\x47\xb1\xe5\x66\x57\xae\x57\x89\xcc\x1b\xee\x8a\xa5\xe6\x5b\x7d\xee\xb0\x6c\x69\x57\xff\x62\x64\x5c\x2e\x32\x2e\x1a\x46\x07\x48\x60\x77\x42\x1d\x2c\x30\xa9\x76\x00\xa0\xc7\x4c\xd3\x91\x41\xd1\xca\xdb\x03\x00\xcc\x2e\xe5\x2c\x4b\x9d\x21\x02\xc3\xb1\xed\x7d\xce\x8a\x1d\x5d\x02\xc3\x18\x19\xdc\xe5\x8c\x81\x5e\xbf\x93\x42\x3a\x1f\x3a\xc6\x1c\x3b\x55\x0a\xed\x12\xb0\x08\x77\x73\xec\x5a\x46\x06\x6e\x5a\x3e\x4e\x42\xda\xba\xd8\x73\x35\x1a\x58\x3f\x82\x41\x00\x40\x97\x31\xd7\x88\xc6\x19\xd9\x59\xef\x41\xa2\xf0\xfd\x7b\x38\x87\x4a\xe3\x99\x08\x7e\xd0\x7c\xdc\x67\x96\xda\x78\x22\xdc\xab\x09\x8d\x6c\xaa\x53\x7b\xa5\x57\x1b\xb2\xaf\xb4\x35\xa2\xd1\xeb\xdb\xd5\x97\xc6\xb4\xa2\x91\x21\xfb\x84\xdd\x27\xc9\xba\xfd\x83\x9e\x40\xde\x25\x7d\x32\xef\x11\x3e\xaf\x99\x71\xe8\x0c\x08\x9b\xd3\x03\x59\x8f\x5d\x97\x94\x6b\x30\x6b\x82\x53\xba\x89\xbc\x1f\x9b\x88\x74\x6a\x3c\x7d\xb2\x63\x1e\x03\x5b\xa3\xb3\xba\x6f\x1a\xef\x13\xde\x35\x45\x5d\xcb\x14\x43\xc6\xab\xa0\xdc\xc1\xfe\x87\x2e\x74\x9d\xff\xd3\xf3\xfe\x5a\xb2\x10\x12\x63\x26\x9a\x71\xe4\xbe\xc1\x2c\x36\x4d\x1d\x18\xd3\x59\x74\x5d\xf3\xd5\xd6\x2a\xd0\xca\xb5\xe3\xba\x99\x1c\xbe\xa8\x16\x1d\x70\x1a\x37\x5b\x3b\x2c\xc8\xff\x29\xb5\x21\xb4\x72\x3f\xb7\x7a\x4e\x54\x31\xc7\x80\x4e\xc9\xa0\x35\xc5\xe7\x62\x19\x69\x17\xb3\xe7\x29\x23\x29\xdf\x6c\x98\x77\x8b\xaf\x19\x29\xa8\xa2\x39\x33\xe0\x46\x41\xd0\x42\x17\x5e\x31\x8c\x0c\x72\x43\xa8\xef\x75\x5b\x45\xc0\x2d\xd0\x47\xcb\x0d\xc9\xf9\x76\x87\xb2\x0e\xa1\x24\x93\x62\x0b\x11\x7d\x76\x09\x99\xa4\x43\x37\x11\x88\x83\x54\xe4\x9e\xaa\x9c\x50\x92\xd0\x64\x07\x56\x42\x2a\x48\x5a\x2a\x48\xf0\x34\x8c\xa6\x87\xa5\x36\x56\xcf\xb6\xd2\x11\x98\xd2\x10\x02\x83\x5e\xe8\x4e\x27\x0c\x80\x17\xc7\x48\x64\xcb\x4b\xaa\x6b\xe2\x7c\x05\x5e\x38\x68\xa2\xdf\xc0\xe8\xad\x0b\x36\xa7\xf4\x1f\x3d\x73\x4a\xff\x9c\xd2\x3f\xa7\xf4\xfb\x37\xe7\x94\xfe\xce\x33\xa7\xf4\xcf\x29\xfd\x73\x4a\xff\x9c\xd2\x0f\xcf\x9c\xd2\x3f\x7d\x6d\x73\x4a\xff\x9c\xd2\x3f\xa7\xf4\x37\x9e\x39\xa5\xbf\x33\xcb\x9c\xd2\xff\x65\x24\xeb\xcd\x29\xfd\xfe\x99\x53\xfa\xe7\x94\xfe\x39\xa5\x7f\x4e\xe9\x3f\x7a\xe6\x94\xfe\x39\xa5\x7f\x4e\xe9\x1f\x73\xa1\xa5\x7c\x20\xd5\x32\x26\xeb\xc0\x19\xf0\x1b\xb1\x8a\xeb\x72\xb3\xb1\x1a\xaa\x1c\x64\xd6\x76\xc6\x8e\x25\xba\xca\x7d\xab\x1c\x5d\xce\x9a\xac\x99\x59\x40\x5a\x03\x86\xe9\x4c\x1b\xd4\x05\x52\x42\x5a\xa3\x62\x1a\xd2\x00\x04\x79\xfb\xe1\xbb\x55\x23\xe9\x61\xd0\x94\x39\x98\x0a\x31\x16\x73\x0c\xab\xf9\x20\x92\x18\xa7\x64\x0d\xd8\xbe\x48\x50\x07\xdf\x24\x93\x1a\x63\x0a\x60\xe8\x21\xd7\xd4\x8e\x0a\xc1\xbc\xd4\xc1\x0d\xc8\xca\x6b\xc6\x04\x91\x05\x13\xe8\x87\xf2\x6d\x19\x08\x35\x86\x26\xbb\x95\x9d\x5f\x04\x47\xf5\xd9\xa1\xd5\xec\x96\xf4\x32\x9a\x23\x70\x15\xcb\x29\xc7\x09\x08\x4d\x94\xd4\x9a\xe4\x65\x66\x78\x51\x4d\x31\x74\x62\x0c\x62\x80\x30\x32\xab\x02\x18\x38\x16\x18\x9a\xe2\x21\xa6\xdf\x1d\xac\xf6\x5b\x90\x62\x34\xf0\x1a\x64\xa3\x05\x24\xb4\xe7\x85\x39\xa0\xcb\x15\x1d\x4f\x5c\x69\x43\x92\x8c\x03\xfb\x87\xd5\x61\x4e\x28\xcc\xb2\x08\x38\xf5\x0d\xe4\x8a\xc2\x5e\xb5\xdb\xac\x48\x81\x6b\x14\x46\xa3\xa3\xb1\x9e\xc6\x4d\x90\x72\xed\x78\xb4\x1e\xf2\x4c\x50\xdf\x3b\x04\x0f\xdb\xef\x15\x8e\x3b\x85\x29\xfc\x9c\xee\x4f\x8d\x49\x46\xa0\x00\x29\x4f\x4e\x51\xaa\x2f\x15\xa4\x18\xfb\x3c\x9f\x45\xab\xcf\x48\x51\x25\xcb\x99\x1d\x1d\xae\xb4\xe0\x2f\xa2\x5b\x2d\x20\x81\x60\x7b\x8b\xb3\x2c\x61\x56\x84\xa6\x9d\x1b\x86\xd3\x3d\xea\x2a\x19\xa6\x72\x2e\xc0\x2d\xfb\x9e\x69\x4d\xb7\xec\x7a\xd0\xc0\x33\x24\x36\x81\x8d\xa7\x06\x35\x20\x42\x06\x32\x54\xfd\x97\xda\x25\x76\x36\x44\x10\x1a\x4b\x21\x39\xae\xa5\x8a\x01\xbc\x57\xdc\x58\x9d\x8a\x6b\xcc\xa5\x03\xbb\xe6\x71\xc0\xe5\xf0\xd0\x4d\x27\xdc\x7b\x3f\x74\x3d\xa4\xa5\xef\x22\x45\xc7\xd5\x9a\x91\xb5\xe2\x6c\x43\x36\x5c\xd0\xcc\x79\xa0\x86\xf0\x0b\x72\x44\x28\x0a\xd4\x5a\x5b\xd1\x54\x0a\xef\x58\xf1\x7b\x58\x91\x1f\xdd\x26\x8c\x2a\x45\x42\x47\x73\x96\x85\x4c\x19\xe1\x1b\xb2\x05\x6f\x97\x42\x87\xfa\x9f\xbe\xf9\x6f\x7f\x26\xeb\x83\xe5\x88\x60\xa8\x34\xd2\xd0\xac\x02\x53\xc6\xc4\xd6\x9e\x01\x10\x88\xa1\xbb\x90\x65\xcd\xf4\x4b\x0f\x59\xa8\xab\x82\x5b\x7f\xf9\xed\xdd\xba\xcd\xd2\xcf\x53\xb6\x3f\x6f\x9c\xcb\x32\x93\x83\x71\x29\xdd\x66\x38\xfd\xcc\x77\x44\xbc\xec\x41\x48\x28\xbe\x10\x81\x92\x3e\xf9\x89\xec\xe4\x3d\xe6\x60\xf6\x60\x54\xed\x12\x2f\x64\x51\x66\xc3\x5d\x7b\x08\xf9\xce\x62\x31\xc0\xa9\x74\xdc\xa1\x15\xce\xd8\x7b\x73\x40\xd1\x77\x03\x0f\xd3\xba\x26\x87\x47\x17\xa7\x5f\x9e\x74\xf1\x50\x4e\xc9\xad\x72\x9f\x4a\xc5\x56\xe4\x3b\x9a\x65\x6b\x9a\xdc\xdd\xca\x77\x72\xab\x3f\x88\xb7\x4a\x0d\x8a\x01\xad\x75\x67\xd4\xd2\xe5\x5d\x29\xee\xda\xad\x16\x32\xb9\xb5\x72\x5c\x51\x1a\x1f\xb1\xd2\xd8\xd5\xc0\xc0\x7e\xa5\x70\xc7\x2b\x26\x40\x5d\x2f\x9b\x7a\x6c\xf6\x00\x78\x05\x01\x4f\x54\x10\x66\xd7\x3a\x04\x69\x8b\xd1\xcd\xb5\xe8\x26\x5a\x7e\xfb\xcd\x9f\xfe\x0d\x51\xdf\x6a\x17\xff\xf6\x0d\x38\xff\xf5\x02\x89\x8b\xa5\x8c\xc3\x14\x5a\xe7\x34\xcb\xac\x22\xd1\x44\x6a\x7b\xac\xab\xd8\xde\x4d\x63\xd8\x6a\x62\x10\x33\x5a\xb8\xbb\xbd\xfd\x7b\x40\xb2\xe3\x46\xb3\x6c\xb3\xc0\xd8\xbb\x2a\xdf\xf6\x0c\x18\xc5\x99\xa3\x5d\x96\xab\x77\x59\xc3\xe3\xc4\xac\xbd\xcc\xca\x9c\xbd\x61\xd0\x74\x25\x62\x9b\xad\xf7\x7d\xc4\x46\xe6\xfa\xa3\xad\x33\x99\xdc\x91\xd4\xfd\x08\x8b\x1d\xd8\x26\x78\xad\x5c\x48\x4f\x43\x17\xac\xa2\x80\x20\x00\xcf\x47\xf2\x3c\xb5\xe3\x56\x73\xcd\x2d\x7f\x5b\x4e\x8b\x02\x1a\x8d\x6d\x20\x41\xe8\x1e\x37\x10\xd0\xb1\x60\x04\xd7\x49\x87\x9e\xa6\xfb\x16\x0e\x3a\xcc\x90\x7b\xf6\x53\x7f\xe2\x0f\xa0\x80\xff\xc6\x78\x91\x09\xa9\x75\xa4\x0e\xdb\xab\xf6\x86\x1c\xc3\x42\x06\x6e\xe6\x93\xfb\xf0\x4c\xea\x7b\x04\x66\x85\x46\xa7\xa7\x66\xbc\x32\x25\x05\x53\x1a\x9a\xc3\x99\x4f\x70\xa2\xaf\x33\xca\x43\x19\x5d\x84\xd4\x0d\x8f\x9e\xb6\x8d\xf1\x0e\x3c\xf5\x99\x0c\xbe\x12\xf0\xf6\x3d\xb1\x37\x0f\x22\x38\x24\xe3\xc7\xdc\xe1\x6b\x99\xba\x4f\xe0\x92\x62\xe1\x82\x1e\x51\x4b\x47\xe4\xbe\x9f\xbc\x3d\xde\xa7\x7a\x2f\xed\xbb\x6a\xff\x52\x5d\x56\x7c\xcb\x5d\xc5\xc1\xb3\x3d\xd1\x15\x85\xa9\x27\xdd\x50\xb8\x9b\x8d\x8e\x5b\x35\x3f\x68\x89\xd0\x78\x08\x41\x0c\xae\x45\x19\x27\x13\xaf\x08\xda\xb4\x2d\xd4\xdd\xb0\xe4\xec\xd5\xd9\x93\xef\x29\x6e\x52\xc9\x82\x6e\x47\x4a\x47\x1d\xed\xf5\xf8\x43\x92\x32\x14\x30\x98\x06\x21\x0d\x7e\x07\xb7\x51\x70\xa3\x85\x1b\xc1\x77\x76\xf2\x3e\x3e\x67\xa6\xf5\xe0\x73\x22\x08\x06\x07\xdf\x07\xbd\xd8\x84\x50\x25\x4b\x91\x3a\xfd\xbc\x32\x84\xbc\x3f\x5a\xf0\x95\x14\x20\xe4\x60\x0e\x52\x20\x6c\x15\x9f\x56\x8c\xb8\xa5\x30\x2f\x57\x2f\xbf\xf9\x65\xc9\xe4\xed\x51\x43\x3c\x0b\x91\xab\x8a\x4c\xe2\xdd\x78\xf2\x8a\x7c\x81\x8d\xe8\x55\xbd\x77\x4a\x5b\x5d\x3f\x83\xfb\xaa\x02\xf0\x27\xab\x8c\xb1\xa8\x52\x78\x84\x3c\x07\x91\xc6\xca\x82\x8d\xac\x84\x17\x93\xca\xc0\xc4\xa5\xb5\x5b\xfd\x6e\xfd\xa4\xbb\x8d\x97\x18\x91\xb6\x4f\x17\x0e\x63\x93\xfb\xba\xe7\x9a\xb7\xba\xc8\x3d\x23\xcf\xf1\xcd\x33\x0d\xb1\xa8\x2f\x9e\x7c\xbc\x6e\xdb\x6f\x1f\x8a\x60\x1e\x65\x6b\xeb\x6f\x1f\x0a\x0a\x3a\x74\x31\x06\x83\x11\xa1\xa3\xcd\x65\x86\x61\xf0\x57\xb6\xa3\x7b\x06\x71\xb2\x3c\xa3\x6a\x30\x93\xc0\x8d\x2b\xc9\x0d\xee\x0a\x9a\xdd\x32\xb1\xe7\x4a\x0a\xf0\x53\xed\xa9\xe2\x90\x53\x04\xad\x08\x99\xb0\xf2\xe9\x1f\x9e\x7f\xba\xf8\x08\xfe\x81\x70\xb6\x1b\xe6\x1e\xb8\x9d\x97\x1a\x62\x10\x8e\x76\xd0\x98\xaa\x3e\xb8\xb1\xb5\xf6\x1c\xaa\x5f\xbf\x3d\x15\xa0\x75\x7e\x3f\x76\x0d\x79\x69\x4a\x3a\x9c\x4d\x81\x0f\x7b\x48\xb2\x52\xf3\xfd\x53\xef\xff\xb8\xc4\x53\x71\xc5\x5f\x41\xe0\x71\x21\xdd\x6f\xf8\x00\xee\xf6\x37\xdc\x3d\xd3\xdd\x58\x70\x30\xeb\x09\x69\xc6\xbb\x9e\xf6\x1a\x97\xcf\x74\x55\x1b\xa7\x99\xca\xea\x14\x57\x97\x72\x31\xa8\x05\x55\x75\x21\xd3\xae\xd9\x1d\xf2\xb3\x4e\xa3\xc2\x0e\x9f\xe5\xc0\x19\x05\x4e\x67\xe8\x5c\xb0\x6b\xf3\x3b\x99\xd0\x4e\xea\x7f\xa7\x95\xb6\x7b\x8f\xe4\x90\x84\xe5\x6a\x49\xe5\x56\x7d\x2e\xb5\x8b\x18\x73\xe3\x11\x29\x48\x26\x65\xb1\xa6\xc9\x5d\xf7\x5c\xb4\xec\xd6\x96\x81\x86\xbb\x74\x4b\xb9\xd0\x75\x3e\xd2\x65\x27\xf2\x67\x98\x35\x64\x72\xfb\x1d\xba\x8d\x82\xdb\x90\x5b\xe7\x5d\x82\xb8\x82\xc6\xfa\x51\x45\x6f\x9c\x2c\x94\x28\xed\x9d\xbe\xe7\xb8\x32\xb9\x7d\xd7\x57\x3e\xa1\x33\x39\xe6\xa6\x9d\x74\x6e\x21\x53\x76\xc3\x32\xb8\x17\xc7\xf3\xc7\xd5\xfe\x0d\x60\x61\x6b\x03\x6f\xa0\xaa\xad\xbb\x23\x57\x32\xf5\x58\x20\x53\x0c\x2f\xd2\xc9\x8e\xa5\x65\x06\xae\x8a\xfe\xe5\xf7\xe0\xa6\xdc\x33\xa5\x78\xca\xfe\x26\x85\x54\xef\xe8\x9a\x65\x9d\x15\xb6\x33\x6b\xba\xef\x5b\x81\xa5\xe1\x39\xa9\x86\x84\x1a\xce\x98\x61\x59\x03\xb7\xb3\x7b\xc8\x66\xfd\x09\x4a\x0a\x68\xd7\xed\xb8\x31\xb2\xf6\x21\xc9\x37\xd8\xb2\xf4\xbd\x14\xdc\x48\x70\xa6\x5f\xcb\xd4\xfd\xab\x0b\x51\x59\xd5\x65\xe2\xba\xb1\x9e\xe6\x5c\x83\xb2\xd0\x30\x92\xb7\x60\x75\xcb\x73\xa6\x0d\xcd\x8b\x09\xf0\xaa\xbf\xf1\x21\xd3\x46\x92\x6d\x26\xd7\x58\xe6\x4f\x6c\xa4\x4a\x18\xae\xb2\x8f\x22\x99\xfa\x73\x2e\x00\xb8\x3a\x51\xb4\xf0\xb8\xdb\x89\xb7\x1e\xde\x49\x41\x2d\xbd\x0d\x2e\x1c\xa4\x7f\xda\xbc\x27\x29\x2b\x32\x79\x00\xc1\x80\x6b\x37\x04\xe4\x1c\x52\x97\x2a\xc3\x1e\x12\x56\x74\x19\x93\xbd\x6e\x29\xcb\x58\x7f\xad\x28\x1f\xf8\x5a\x8a\x94\xa9\x0c\xda\xe5\x23\x9a\x4e\xd9\x8e\x4c\xdf\xbb\x94\xdc\xe0\x9e\xae\xeb\xf7\x6a\x94\xd4\xc4\x21\x9b\x95\x1c\x2e\x2c\xdf\xa0\xb8\x1d\xbc\x68\x7d\x1a\x58\x43\xeb\xf2\x81\x2d\x35\x98\x0a\x99\x76\x96\x1e\xd2\x97\x69\x3d\x65\x1f\x5b\x8e\xaf\x1f\x3e\x22\x9f\x1c\xd5\x2e\x6e\x6c\x14\x13\x08\x4b\x97\xf5\x04\x24\xf0\x8e\x1d\x5c\x8c\x42\x4e\x0b\xa2\x8d\x1c\xea\x43\x8d\x46\xec\xaa\x6e\x38\xb2\x16\x4c\xfc\x85\xab\xbb\x3e\xd4\x4d\xdc\x8d\x94\x99\x73\x7a\x4a\xc5\x06\x7d\x9e\x8a\x19\xc5\xd9\x9e\x11\xaa\xd6\xdc\x28\xaa\x0e\x55\xc2\x35\x78\x78\x0e\x40\xed\x2c\xdb\xfa\x47\xc9\xd4\x01\x04\x54\x88\x4c\x03\x49\xb8\x77\x48\x8b\x70\x8a\x01\x93\x4c\x31\xb3\x33\x97\x29\xdf\xb4\xb0\xed\x38\x26\xb3\x3f\xd8\xc2\x92\xb3\xe5\xb6\xe4\x29\x3b\x6f\x1c\x5c\x9f\x3f\x27\x28\xac\x65\xbd\x94\xf6\x33\x9e\xf7\x7b\x5a\x40\x60\x0b\xbc\x6d\x8f\x17\xf1\x1d\xce\x58\xb7\xda\x8e\xbb\x0c\xdb\xde\x29\xa5\xda\x52\xc1\xff\x89\xf0\x4e\xa8\x61\x5b\xa9\xec\x3f\x9f\xeb\x44\x16\xee\x14\x80\x17\xbe\x68\x80\x95\x1e\x50\xe1\xee\x1d\x51\x3b\xd6\x09\x8e\x23\xc5\x8a\x8c\x27\xad\x1a\xda\x19\x64\xf2\xc2\xb8\xae\xc5\xf9\x58\xbc\x4c\xd4\xd9\x21\xfc\x27\x1f\xdb\x90\xbd\xe1\x28\x8e\xa8\xb2\xc7\x5a\x70\xb6\x1a\xc9\x53\x18\x42\x17\x34\x61\x2b\x72\x59\x57\xd9\xef\xbf\x5b\x16\x51\x13\xc5\x28\x58\xf0\xaa\xca\xf3\x0b\x42\x33\xb3\x93\xe5\x76\x47\xb4\xcc\x59\xa3\x66\x7f\x0e\xe5\x07\x32\x79\x4f\xa8\x0b\x05\xe8\x47\x1c\x59\x67\x66\xed\x18\xd9\x32\xe1\xd2\x8f\xc1\x12\x22\x08\x2d\x2c\xbd\x52\x9c\x1a\x67\x47\xa6\xa5\x91\x39\x35\x3c\xb1\x7c\xaa\x5f\x94\xf6\xb5\x32\x0a\xc5\x73\xaa\x78\x76\xa8\x5d\xc7\x10\x89\x0e\xbb\x90\x82\xf0\x94\xe5\x85\x34\x56\x97\x44\x24\x6a\x16\xdb\x1f\xd0\x4a\x36\x10\x38\x2d\x45\x9f\x5c\x3f\xf9\xd6\x72\xa8\xcb\xb1\xe1\x4c\xe9\xaf\xe1\x2c\x86\x91\xa0\xf7\x6a\x0d\xe2\x47\x51\xc9\x23\x57\xfe\x88\x87\xe4\xc2\x4e\xe2\x03\xbc\xed\x25\x51\xbc\x12\x0e\x70\xb5\x94\x83\x51\x1d\x7b\x86\xda\x57\x17\x35\x79\xb6\xc0\x7c\xe7\x64\xc7\x92\x3b\x22\xef\x45\x03\xd7\x26\xf0\x23\xb8\xab\x56\x95\x76\x61\x32\xa3\xf8\x7e\xfc\x01\xba\xa2\xbc\x77\x0b\x8b\x45\xf9\x6b\xee\x11\xde\x4a\x11\x03\xf9\x61\xb7\x2e\xf9\xcc\xbf\x05\xd4\xfe\xe2\xea\x4d\xbf\x12\x17\x30\x91\xb7\x6b\x8d\x07\x16\x82\x0b\xae\x7e\x41\x62\x88\x2a\xe5\x90\x39\x02\xe9\xe6\x82\x50\x4b\x4a\x17\x18\x92\x23\x5c\x1e\xbf\x1f\x42\xb1\x8c\xfa\x9a\xc7\x96\x9f\xd6\xf4\xb6\x7f\xe3\xe3\x46\xf5\x3b\x16\xb0\x2b\xb6\xb6\x6b\xe7\xf3\x6e\x46\xd8\xb7\xfd\x43\xe5\xb6\xaa\xb6\x3a\x5e\xbe\x2b\xe4\xcb\x8a\x30\x88\x78\x88\x44\x2e\xbb\x02\x60\x55\x62\x5c\x23\x88\xcf\x34\x82\xd3\xe2\xd7\x8e\x17\x10\x38\x1b\x58\xb5\xab\x8a\xef\xa0\x4d\x3e\xd1\x8c\xa7\xd5\xe0\x88\x51\x97\x62\x41\xae\xa4\xb1\xff\xf3\xf6\x81\x6b\x33\x56\xd8\xf9\x8d\x64\xfa\x4a\x1a\x78\xf7\x49\x20\xc1\x45\x45\x02\xc4\xf1\x67\x57\xe2\x41\x29\x7a\x68\x70\x71\xbf\xbd\xcb\x8d\xab\x29\x86\xfb\x0b\x6c\x82\x6b\x72\x29\xac\xf2\xe4\x76\x5e\x55\x85\xd1\x6e\x70\xcf\xb5\x84\x14\x4b\x08\x5f\xf0\xa3\x07\x06\xad\x0e\x8d\x6b\x0f\x4a\xa9\x5a\xf0\x1a\x98\x28\x30\xe6\x9a\x11\x37\x3d\x58\xed\xf1\x1b\x08\x2c\x2b\x32\x9a\xb0\xd4\x97\xd1\xa0\x16\x16\x56\x0e\xe1\x09\xc9\x99\xda\x86\xd6\x59\x58\x3a\x35\x7c\x74\xa3\xf9\xa8\x13\x0a\xcb\x0c\xa7\x0a\x86\x2d\x84\x4b\x8b\xeb\x03\xbf\x04\x8f\x77\xc4\x32\x18\x5a\x15\x90\xef\x7e\xcd\x9f\x7c\x36\x79\xb4\x31\x29\x52\xdf\x1c\xe5\xd3\xff\x6b\xc9\x29\x20\xca\x7f\x92\x82\x72\xa5\x57\xe4\xc2\xc5\x8d\xf6\xce\xd9\x7c\xdf\x19\x03\x9b\x43\xdb\x51\xb9\x3e\x2a\xa0\x4f\x05\x61\x98\x88\xd1\x2f\xe3\x6e\x3a\x1c\x6d\x41\xee\x77\x52\x23\x15\xaf\x1c\x59\xcf\xee\xd8\xe1\xd9\xa2\x75\xf3\x86\x42\x7a\x9f\x5d\x8a\x67\x8b\xca\x0b\xd7\xba\x07\x9e\xcf\x20\xeb\x7e\x06\xbf\x3d\x5b\x75\x98\x60\xef\xb0\x41\xc6\x38\x6a\x8d\x0c\x8a\x30\x51\x92\xcb\xd9\x7f\x79\xfb\x50\x30\xc5\xa1\xf1\x52\xf6\x5f\x1a\xb2\x4a\xaf\x28\x63\xa8\xda\x32\xd3\x10\x63\x8e\x25\xaf\x59\x2a\x99\xa5\x92\x59\x2a\x99\xa5\x92\x59\x2a\x69\xc0\x66\x96\x4a\x66\xa9\xe4\xf7\x2e\x95\x28\xd3\x57\x4c\xf4\xc8\xb4\xaf\x5c\x82\x2a\xd8\x2f\xab\x14\x6a\x70\x8e\x89\x94\x6c\xad\xc8\x01\xfd\xd6\x9c\x21\x71\x20\x66\xa9\x59\x18\xe8\x9e\xad\x7b\xd7\xd8\x83\x4c\x85\xe2\x12\xea\x68\x66\x54\xeb\xf1\xc5\xba\xb7\x49\x62\x5f\x27\x54\x6b\xbe\x15\xb5\x33\xe1\x5a\xa6\xc7\x0b\x0b\x4c\xec\x1d\x0f\x6f\x9d\x99\x1d\x90\x6c\x74\x09\x3e\xf0\xa9\xe1\xdf\xa9\xec\xf4\xc8\x9b\x7d\xa5\x45\x6c\xdd\xd4\x78\xb1\x03\x33\x2e\xb4\xa1\x22\x41\x63\x61\xb7\xc6\x2a\xfa\x11\xe4\x86\xfc\x5c\x2f\xf6\xe7\x15\x79\xdb\x9a\xae\x33\x28\x38\x8a\x7e\x12\xd2\xfc\x04\xb9\xa9\xd0\x2a\x0e\x0c\xa2\x55\xea\xa4\xf3\x39\x62\x94\xbd\x63\x3e\xcf\x7f\x7e\xf6\xec\xe7\x4e\x98\xcf\x20\xf4\xc0\x81\x10\x84\xd3\xff\xb2\x6f\x40\x39\x69\x6c\x2a\x8a\xd2\x0b\x7c\xd7\x2e\xb9\xb7\xc9\xe8\xd6\x75\x30\x84\xdc\xa7\x3e\x72\x53\xc3\x70\x8a\x41\x2e\x93\xf2\x6e\x4d\x93\xbb\x37\x2c\xeb\xfa\xb7\x3a\x0b\xc6\xae\x58\x99\xa1\x55\x69\xcc\x84\xf9\x66\xba\xae\x9d\x15\xb8\x57\x2c\xb4\x72\xfb\x9f\x49\xff\x35\x76\xac\x8c\x55\xf4\x86\x30\x0b\x79\x14\x76\x86\xaf\xf6\x00\xa1\xcd\xe9\xc3\x6b\x29\x92\x52\xd9\xf5\xf4\x8a\x8b\xbd\x29\xd3\x90\x91\x81\x5f\xa1\xb7\x87\x1f\x39\x2b\xa0\x29\x8e\x21\x72\xa0\xfc\xf8\x58\x2a\x6b\x38\x89\x35\xa7\x0f\x37\x34\x2f\xb2\x7e\xd6\xd2\x8e\xe2\x73\xbd\x8e\xeb\xea\x35\x1a\xbf\xac\xd3\x1e\x1d\xce\x50\x01\x85\x43\x21\x72\xb8\x17\xf0\x39\xcb\x21\xc2\xe6\x4a\x1a\xe7\x4e\xf3\x1b\x87\x2b\xb1\xa1\x3c\x73\x29\x29\x07\x72\x0f\xb1\x5f\x30\x1e\x74\x0d\x75\x93\xf6\x33\xc2\x1d\x15\x2e\xbf\x55\x18\xe9\xa6\xc1\xfa\x88\x20\xcc\x64\x5a\xba\x56\xd2\x18\x40\x7e\xbc\x93\x7e\x62\xdf\xd8\x96\x62\xa6\x54\x9d\xc8\x83\xa7\x1f\x83\x4b\xe6\x8e\x3e\x03\xc8\x68\xf4\x0b\xcb\xe9\x01\x8b\xb7\xba\xba\x2c\x6b\x06\x02\xda\x1a\x0a\x33\x4c\x44\xe3\x41\x0e\xa5\x58\x2e\x0d\xfb\xc8\x68\xd8\xa5\xde\x2e\xd6\x8b\x45\xd6\xec\x87\x3f\x29\x46\x53\xf8\xa9\x55\xd1\x95\x35\x94\xeb\xce\x42\x5d\x92\x07\x54\xbf\xb4\x7b\x4c\x76\x90\xfa\xcf\x05\xa1\xe2\x40\xca\x22\x91\x39\x3a\x8d\x32\x46\x35\xfe\x9d\xac\x15\xa3\x10\xc7\x75\x4f\x3b\x5e\x9c\x01\x39\xb3\xd3\x65\x12\xb7\xd9\x21\x88\xcd\x8d\x8c\xb9\x74\x2c\x11\x2a\x06\x29\xe1\x98\xc6\xb9\xa6\x9a\x27\x17\x65\x54\x26\xe6\x5f\xfd\xbb\x95\x3c\xf0\xc3\xc7\x77\x8f\x55\x73\x0b\xaa\xf5\xbd\x54\xb1\x25\x5e\x6e\x41\xa3\x4d\x54\x5d\x51\xcf\x09\x1e\x24\x77\xfe\x9c\xca\x3b\x13\x4a\x7b\x25\x75\xd9\x07\x9f\xb4\x82\xcb\xc0\xfe\xdb\xa5\xd9\x31\x61\x9c\xcf\xf4\xa9\xc5\x15\x83\x8a\x7c\xef\x06\xad\xe8\xe9\x32\x67\xdc\x5e\xa1\x88\xa0\xd5\xe3\x21\xac\xd5\x85\xdd\x07\x07\x05\xb5\x8a\x62\x3f\x31\x3f\xca\x1d\x1b\x29\x41\x1a\x59\x89\x63\xbc\x10\x5f\x8f\xe7\xd6\x6d\xc8\xc5\xbc\x9a\xc9\xc5\x9a\xac\xa4\xb9\xe7\xec\xfe\xdc\x85\x4d\x2e\xef\xb9\xd9\x2d\x9d\x3f\xfc\x1c\x4e\xfd\x1c\x5d\x8f\x23\x70\xc1\xb2\x31\x17\x69\xea\x02\xf7\x4b\xcd\x36\x65\x86\xb2\xbe\x5e\x11\x5a\xf0\x4f\x4c\x59\xd6\xbc\x20\x77\x5c\xa4\x0b\x52\xf2\xf4\xdf\x4f\x52\x5b\x45\xfa\x0c\xe6\x78\xd8\xdd\x00\x65\x3b\x54\x2d\xaf\xa1\xec\x34\x9e\xa6\x55\x41\x8c\x06\x64\x19\x51\xb0\x09\x62\x83\xeb\xdf\x1e\xb1\x93\xb1\x30\xf5\x98\x62\x23\x43\xca\x2d\x89\xab\x35\x52\x6a\x2b\xc6\x86\xf0\xec\x17\xa1\x0b\x7e\x19\x33\x5d\x98\xe9\xc2\x4c\x17\x7e\x75\xba\x30\xf2\xc2\x9a\x51\xc5\xd4\xad\xbc\x63\x31\x25\x70\xf0\x6d\x62\xec\xeb\x4e\x87\xb3\xe2\x16\x24\x08\x3d\x2a\x39\xbb\x31\xfd\x77\x7c\xa8\x55\x5b\x6b\x09\xdf\xb9\xba\x15\x20\xe1\x9d\x7c\x3d\x85\x92\x0f\x87\x1f\xd4\x00\x5e\xb5\x03\x6a\x1d\x0a\x5a\x65\xfa\xe1\xf0\xc3\xc7\x77\x8f\x99\xcf\x2e\xf4\x23\x4b\xd8\x50\x27\xeb\xde\x1c\x75\xac\x40\xd2\xc8\xb7\xa1\x29\x52\x5b\xaf\x9f\x81\x90\x39\xdc\xdf\x15\x8a\x73\x35\x7a\x7e\x64\x10\xce\xaf\x8d\x54\x8d\xea\x0b\x3b\xba\x67\x55\x27\x0e\x2c\xef\xb2\x19\xaa\x0e\x30\x86\xea\x78\x2a\xb7\xc3\xea\xd3\x31\xe5\xc6\x37\xdd\x89\x42\x80\x58\x65\xc4\x69\x9c\x30\x61\x22\x85\x2e\x3c\x8f\x3a\x6a\x7f\xf3\xde\x53\x93\xec\x06\xeb\x55\xc7\xdb\x77\x23\x68\x57\xdb\xe5\x26\x2a\x2a\x56\x79\x03\xd9\x3f\x4a\x0a\x9d\xed\x73\xb7\x28\x17\xfb\x6b\x0f\x63\x68\x52\x59\x05\x95\x42\x1a\x70\xcb\x55\x27\x9d\xf2\xf9\x18\xc0\x0d\x5b\xcb\x33\xfd\x1a\x34\xab\x98\x93\x7c\x77\x43\xf0\xe5\x66\x39\xd8\xd1\x5b\x3a\x2e\x0e\x24\xbd\x06\xa8\x9e\x15\xdc\x98\x32\xa9\xfc\x95\x3e\xf9\xeb\xf5\x05\x49\x98\x32\xcd\x35\x41\x65\x0d\x70\x0c\x07\xca\x85\xc7\xb6\xd0\xb0\x1b\x7e\x4f\x03\xdd\xbf\x3b\xcb\x7c\xed\xbf\x69\x2e\x15\x6e\x5d\x7b\x8d\x23\xbc\x69\x74\x07\xf1\xbb\x20\x31\x02\x57\x67\x1f\x5e\xe8\xaa\xc4\xac\xb1\x22\xbf\x93\x6a\x73\xc7\xd5\x33\xff\x92\x45\x26\xf2\x08\xb1\x29\x62\xc8\x71\xc1\x8a\x4c\x83\x74\x9c\x80\x45\x62\x84\xac\x1a\xb5\x51\xce\x8a\xd8\x8e\x97\xc4\x62\x65\x2d\x12\x2d\x6f\x91\xe8\x0a\xef\x61\xb9\x8b\xc4\x97\x6d\x47\x95\x61\x8a\xa4\x8a\x52\x69\x98\x10\x7c\x39\x57\xfd\xe9\xfa\x15\x79\x9c\x8e\x45\x66\xe2\xf1\x9b\x27\x1e\x1d\x0d\x2d\x62\x3f\xbf\x11\xca\x11\xf1\x52\x42\x87\xb5\x26\x32\xd4\xe7\xa1\x29\x00\x39\xcb\x4f\xc3\xf9\x1a\x53\x78\x68\x2a\x25\x8a\x40\x1d\xbb\x9a\x68\x89\x4e\xf5\x88\x74\xae\xe2\x24\xec\x0a\xea\x9e\x8d\x0b\x4c\xb3\xb8\x77\xf4\xcc\xe2\xde\x4c\xb1\xc7\x06\x9d\xc5\xbd\x59\xdc\x9b\xc5\xbd\x99\x78\x34\x9e\x59\xdc\xfb\xa5\xc4\x3d\xa6\xcc\x23\x05\xbe\x8e\x78\xd4\x91\xfc\xc2\x12\x8e\x2b\x6b\x73\x4a\x91\x8f\x43\xcb\x19\xc5\x6e\xee\x78\xf1\x89\x29\xbe\x89\x8d\xde\x7f\x83\x9d\xba\x7d\x1e\x87\xdd\x13\xdf\x60\x59\x61\xa0\x28\x23\xbe\xc6\x98\xf3\xbf\x63\x87\xa7\x01\x1a\x63\x61\xbf\x08\x38\xdf\xb1\xc3\xcd\x08\x4f\x1a\xe1\x47\x7d\xfb\xfa\xc5\xc4\xeb\xd9\xe9\xfb\x65\x71\xa5\xd9\xe9\x3b\xba\x93\x5f\xdd\xe9\x4b\x5c\x1d\xae\xbe\xe8\xeb\xfa\x69\x41\xea\x07\x17\x65\xbd\x07\x4a\x5c\xd5\xef\xac\x22\x39\x4e\x43\x8d\x46\x56\x5e\x46\x79\x5e\x6f\x31\x7e\xce\x5f\x09\xef\xcc\xc2\x5b\x2e\xd2\x2a\xe2\x75\x28\x39\xeb\xd1\xd5\xd6\x4a\xd5\x8d\x7f\x7c\x44\xb1\x35\x74\x7f\xfd\xa8\xb8\x09\x87\xc6\x0f\x86\x69\x62\x29\xce\x7f\x95\x38\x4d\xd8\xe8\x50\xa0\x26\x6e\x65\x8e\xd4\x9c\x23\x35\x67\xe6\x3c\x33\xe7\xdf\x09\x73\x9e\x23\x35\x67\xba\x30\xd3\x85\x41\xd8\xfd\x4e\xe9\xc2\x49\x23\x35\xa3\xc2\x24\x41\xf8\xfa\x92\xe2\x36\x1f\xbf\xa0\x5f\x3a\x70\xf3\x1f\x25\x2b\x59\x74\x18\xdc\xff\xaa\xdf\xae\x0a\xae\x96\xc2\xb5\xc3\x68\x04\xe7\xa1\x34\x0c\x63\x0f\x8a\x94\x8a\xe6\xcc\x30\xf5\xe8\x2a\x19\x6b\x6a\x92\xdd\x0d\x13\xe9\x1b\x46\xd3\x8c\x8b\x58\x2e\xf4\xd7\xe3\xef\x7c\x05\x8d\xbc\x9d\xee\x86\xda\x57\xe0\xc2\x41\xf6\xe0\x3d\xe5\xc0\xcd\xb0\x57\xe6\xd3\x5c\xc7\xb4\xa0\x09\x1f\xea\xf2\xd4\xd9\xc7\x6b\xf7\xba\x5f\x7e\x37\x53\xd2\x48\xdf\xc2\xb3\x08\xba\xc1\xf5\x8e\xaa\xd4\xe7\xf3\xdd\x33\x4c\xb7\x25\xa9\x92\xd8\x96\xc8\xec\x86\xfb\xae\xc4\x75\x92\xce\xe9\xc3\x5f\x69\x72\x27\x37\x81\xe6\xc1\xc7\x99\x87\xee\x83\xe3\xc3\x51\xcc\xa8\x03\x49\x59\xd6\xd5\xe4\x8e\xd7\x14\x04\x76\x4e\x1f\x3e\x42\xde\x6e\x6c\x89\x8e\xf7\xd5\x07\xc7\x4b\xaa\x01\x0f\xf5\x84\xc3\xbd\xc0\x71\xfd\x14\xb1\x97\x48\x41\x14\x83\xe2\x3d\x60\x08\x86\xc6\x65\xa3\x66\x89\x51\x58\xbb\x1c\xdb\x6b\xa6\x2c\x9a\xc7\xef\xaf\xfd\xdd\xf0\x36\x43\xf9\xab\xf8\x14\x4c\x81\x09\xe3\xe9\x5b\xb1\xa8\x39\xe1\x88\xf0\xfd\xc0\xd2\xe1\xf7\x05\xe1\xab\x60\x67\x02\x8a\xcd\x88\x9a\xe9\xd2\xc9\x28\xbe\x8d\x6c\x86\x8b\x89\x77\xa0\xfa\xc0\x6f\x07\xaa\x76\xd2\xac\x75\x07\xc8\xf7\xcc\x68\x92\xca\x72\x9d\x05\xa5\x03\xcb\x9c\xd8\x9e\xa9\x03\x7e\xfd\xb4\xbb\xc3\xc5\xb4\x73\xf1\xef\x57\xe7\xe2\x9a\x36\xff\xfa\xe7\x32\x22\xab\x7c\x86\x80\x7f\x64\x8d\x4f\x8a\xf8\x3f\x59\xe0\x7a\x40\x4c\x99\x23\xd7\xe7\x50\xa6\xbe\x67\x8e\x46\x18\x78\xbe\xe4\x68\x84\x39\x94\x69\x0e\x65\x1a\x1b\x78\x0e\x65\x9a\x89\xc7\x1c\xca\x34\xf9\xa5\x39\x72\x7d\x8e\x5c\xff\x22\x78\xc0\x2c\xee\x0d\x3f\xbf\x33\x8a\x3d\x8b\x7b\xb3\xb8\x37\x36\xf0\x2c\xee\xcd\xc4\x63\x16\xf7\x26\xbf\x34\x47\xae\xcf\x91\xeb\xbd\x9b\x99\x23\xd7\xe7\x20\x98\x39\x08\xa6\x07\x76\xbf\xd3\x20\x98\x39\x72\xfd\xd1\x91\xeb\x04\xfd\x52\x1f\x19\xd4\x31\x47\x65\x26\xa6\xf7\x8b\x5d\x94\x2f\x40\xd5\x72\xb6\x29\x1c\xa9\x1d\x9d\x3d\x00\xc3\x60\x7b\x88\x36\x51\x68\x2d\xd0\x87\xc3\xa4\x07\x41\x73\x9e\x10\xc5\xec\xdc\x75\x64\xcc\xe0\x81\xf9\x7e\x35\x66\xe1\x4b\x29\x43\xb3\x16\xc0\x04\x0f\x46\x17\x9a\xc1\xc5\x96\x69\xe0\xac\xe4\xd2\xf8\x20\xf4\xc1\x81\x7f\xfe\x0b\x56\x23\xff\xc9\x6d\xff\x27\xd7\xd4\xf8\x7f\xfc\xbc\xd4\x0c\x1a\x0c\x1f\x95\xab\x6f\x81\x67\x18\xc3\x7a\xa8\x5e\x23\xa4\xdd\x53\xbd\xfa\x4f\xe7\xd0\x1e\xc7\x9c\xb7\x86\x3f\xfa\xd7\xd7\xfd\x4b\x1d\xa2\x59\x31\x6c\x0b\x7b\x28\x87\x08\x55\xbb\x8a\x19\x42\xc4\x48\xdf\x48\x99\xac\xa9\xc6\x66\xca\x8a\x6d\xd9\x03\x56\x32\xe3\x62\x1b\xe6\x3f\xae\x54\x3f\xe1\x9a\x9c\xb9\x26\x26\x21\xc2\x1b\x45\x76\x73\x99\x96\x59\x19\xe4\xd0\x6d\x77\x3b\xbe\x0f\xe2\x10\xbd\xab\xf8\xd6\x8e\xea\x5d\xc5\x94\xb1\xb7\x70\x7f\xa3\x80\xe6\x13\x6a\x64\x84\x4f\xa3\x14\xf9\x9f\xff\x34\xba\xd5\x70\x8c\x04\x41\x58\x47\xef\xf4\x23\xdb\x96\x19\x55\xcd\x9a\xfa\xbe\xe7\x3e\xd6\x9b\x03\xe2\xf4\x60\x14\x4d\xcc\x08\xdb\xa8\x9a\x20\x60\xc5\xba\x74\xd5\x3a\xca\xe7\xab\xff\xf2\xe2\xc9\xe7\xe8\xf0\x21\x1f\x2c\x92\xd8\xbb\xc3\xea\x1b\xb7\xc4\xf6\x06\xa9\xc3\x4e\x37\x76\x70\x8b\x5c\x37\x9a\x84\x73\x2f\xcc\x74\x20\x88\x00\xd0\x2b\x0b\x5d\xf6\x10\x1c\x31\xa1\x85\x29\x15\x23\x5b\x25\xcb\x02\xfb\x2d\xd1\x3d\xe5\x99\xd5\x0d\xda\x00\xfc\xc3\xcb\x27\x83\x4f\xb3\x82\x8e\x34\x99\xea\x88\xd1\xee\x0b\xe2\xba\x09\xad\x99\xb9\x67\x0c\x5a\x21\x5b\x5d\x45\x40\xc3\x71\xbc\x0b\xc1\x7d\x22\x8d\xf6\x7d\x98\xd2\xc6\xbe\xfe\xfb\x59\xe8\x6e\xc4\xed\x0b\xe6\x1f\xee\xcc\xd3\xbb\xb5\xdb\xa3\x4b\xac\xbd\x74\xed\xba\xce\x58\x21\x9b\xb0\x07\xae\x7b\xdb\x66\x74\xf6\xa6\xa1\x15\x0d\x57\xa0\x72\xb8\x56\x69\x2d\x20\x95\xba\xd2\x42\x7c\x9b\xf7\xf0\x7d\xaa\x4e\x0b\x9a\xc5\xb8\x4b\x55\x21\x6f\x7b\xa0\x1e\x2c\x0c\x8e\xed\x85\x21\x87\xf4\x0b\x72\xc7\x58\x81\x8d\x77\x52\x25\x0b\xdf\x3e\x3f\x74\x32\xa3\x5d\xa0\xa2\x45\xe2\xb1\x4e\x50\xa4\xd2\xc3\xe0\x88\xa3\x4f\x18\xde\x86\xa6\x39\x15\x25\x53\x4c\x97\x99\xa9\x5a\x82\xd9\x43\xb2\x42\x86\x61\x61\x70\x41\x0a\x9c\x83\x95\x83\x0d\x08\x10\x40\xec\x44\x6a\x0f\xe9\xe0\xa2\x82\x9a\xef\x8c\x18\x3a\x81\x3a\x84\x29\xc0\xd3\x6e\x46\x64\x9c\x79\x3f\xe4\x7f\x91\xec\x47\xe8\xad\xfe\x99\xbb\x04\xb9\x59\x3a\x0b\x8e\xef\x0c\xf4\x93\x1b\xe2\x0b\xe9\x10\xe4\x56\xd3\xb9\x7c\x03\xed\x6a\x7c\x2b\x24\x8d\x30\x29\x32\x89\xb8\x4a\x9b\x20\xc4\xbf\x5b\x26\x79\xbc\x8c\x50\xa3\x94\x61\x89\xa4\x6a\x00\x1f\x5c\xe4\x1b\x10\xc0\x1b\xdd\xe2\xab\x88\x3f\xec\x61\x04\x9d\x5f\xec\x5a\x5d\xbf\x9a\x6b\x99\x4e\x6b\x53\x04\x23\xf4\x11\x8c\xcf\xd3\xac\xed\xec\x1d\x2e\x19\xff\xb8\x66\xed\x18\xda\x66\xe8\x65\x5e\x94\xa6\xb1\xf1\xde\x99\x5d\x87\xa4\xc9\x56\x92\xb6\x62\x90\x53\x41\xb7\x6c\xe9\xa6\x5c\x56\x53\x2e\x2b\x43\xdd\xf9\x70\xbb\xf9\x01\xda\xe1\x8f\xe9\x17\x84\xec\x47\x8f\x19\x47\xb0\x75\x71\xb0\x53\x61\xeb\xa9\x1b\x74\x6d\xac\xc6\xe6\x9a\xc8\xdc\xb2\x03\x97\x20\x5b\x1b\x33\x21\x59\xda\x37\x62\xeb\xdf\x8d\x24\xee\xf4\x41\x30\xa4\xc0\x1d\xd8\x83\xbd\xaa\xdc\x64\x87\x66\xfe\x36\xd8\x9c\xee\xb9\x66\xae\xc9\x1e\xb7\x3a\x2a\x24\x6b\xdb\xcd\x2e\x43\x36\x1a\xa0\x23\x5f\x1c\x46\x04\xba\x10\x59\x59\xa8\x47\x8b\xec\xc4\xfc\x92\xd4\x2d\xaf\x49\x95\xf4\x8e\x66\x10\xac\x4d\xb9\xa8\x0b\x8f\x7b\x9a\xdd\x59\xa3\x15\x27\xbf\xfd\xd3\xee\x0c\x05\x19\x70\xa9\x80\xd8\x34\x24\xa7\xff\xfc\xff\xff\x66\xf9\xdf\xfe\x9f\xff\xdf\xff\xc7\xde\xd7\x36\x37\x8e\x5b\x6b\x7e\xbf\xbf\x02\xd5\xd9\x2a\xbb\x53\x96\xdc\x93\x3b\x95\x9b\xea\xcd\x66\xcb\x63\xf7\x4c\x5c\x99\xee\xf6\xb5\xdc\x33\x55\xbb\x77\xeb\x06\x22\x21\x09\x31\x49\x70\x08\xd0\x6e\x4d\xe5\xc7\x6f\xe1\x1c\x80\x04\x25\x12\x00\x25\xd9\xee\xce\x08\x5f\xa6\x47\x26\x41\xbc\x9e\xf7\xf3\x9c\xd3\x5c\xfe\x53\xfe\x33\xff\xe7\xea\x9f\xe9\x3f\x1f\xff\xb9\x7e\xfd\xf7\xad\x8e\x4f\x73\x9e\x65\x5c\xb2\x44\x14\xa9\x26\xe1\xf8\xdf\x9c\x17\xb5\x62\x92\xac\x44\x5d\x49\x92\xd2\xb5\x24\x8f\x8c\xdd\x4b\xb2\x66\xb4\x92\x63\xe8\xb9\x59\xa4\x19\xff\xd5\xcf\xfb\xde\x6f\x51\x92\x94\xcb\x7b\x82\xf9\x9e\xc0\xf6\xe6\x6b\x32\xcf\x44\x72\xbf\x45\x26\x87\xbf\x2e\x6a\xc5\x6e\x2a\xb6\xe0\x5b\x5a\xe3\x96\xbc\x0c\xcf\x92\x12\x1e\x76\xf7\xa9\x62\x4b\x2e\x15\xab\x24\xf9\xeb\xdd\xdd\x0d\x59\xd1\x22\xcd\xf4\xff\xf5\xc2\xc4\x5b\x98\x02\xb4\xb9\x9e\xe9\xeb\x82\xb2\xb1\xe5\xad\x9f\x6e\x7f\xc4\x3a\xc1\x98\xca\x85\xd5\x4c\xad\x2d\x48\x7f\x60\x9b\x1e\x09\xd8\x08\xb1\x00\x31\x0d\x2e\x73\x5b\x45\x92\x26\xaa\xa6\x59\xa7\x77\xcd\x87\x95\x66\xd5\xaa\xaa\xd9\x19\x99\xd7\xdb\x67\xc9\xe6\xd6\x42\x1a\x46\xf5\xe0\xf2\xa6\xba\x48\x99\x26\x0e\xb6\x98\x9d\xea\xac\xcb\x94\x7c\x2f\xf4\x29\xeb\xcf\x7d\xd2\x64\xa5\x96\x8c\x3c\x72\xb5\x22\x7f\xd7\x77\x36\x51\x19\xce\xf3\xef\xf1\x5b\x56\x67\xec\x83\xcd\xf3\x8d\x2a\x8b\xdd\x3c\xdd\x5b\x05\xbb\xdd\xc9\xdb\x3a\x63\xd2\x29\x87\xbd\x35\xfe\xeb\x05\xa9\x0b\x97\x94\x15\x19\xda\x59\xa5\x16\xcb\xda\xe4\x63\x2a\x37\x63\xb2\x90\x3a\xf4\x15\xfe\xe4\x85\x39\x0e\x5b\xc9\x2e\xc7\xea\xdb\xc7\xea\xdb\xc7\xea\xdb\xc7\xea\xdb\x5b\xc5\x80\x8f\xd5\xb7\x87\xdf\x8f\xb2\xba\x84\x6c\x2e\xc7\xea\xdb\x2d\xcf\x38\x56\xdf\xfe\xc2\xaa\x6f\x6b\xf9\x27\x4a\xec\xb9\xe8\x14\xc0\x31\xf6\x5d\xb4\x06\x6e\xca\x3c\x4a\x10\x14\xaa\x17\x3d\x47\x37\x13\x34\x85\x6b\x9c\x31\xa8\xa2\x0c\x23\x90\x26\x0e\xe3\x53\xa1\x78\x46\x4e\xd9\xe7\x24\xab\xf5\x53\xaf\x5d\xa9\xe7\xe3\xd0\x6d\x78\x78\x33\xfd\xc3\xb7\xd3\x37\x7d\xcf\xa2\x15\x29\xe7\x4b\x4d\x31\x00\x93\x2b\x63\x4b\x9a\xac\xe1\xab\x6d\x68\xea\xf6\x62\x2b\xb1\x31\x2d\x92\xd4\x52\x89\xdc\x31\xb0\x34\x72\xdf\x7c\x4d\x6e\x9d\x65\x9c\x92\xf7\xf4\x7e\xfb\xec\xca\x5a\xeb\x99\x8a\xa4\x82\x49\x52\x08\xab\x4f\xe9\x31\xa1\x4e\xa9\x8f\xae\xa9\x1f\xb5\x16\x35\x49\x05\x3c\xf5\x48\xf1\x08\xcf\xb7\x7b\x34\xd3\x3a\x8a\x7a\x47\x51\xef\x28\xea\x1d\x45\xbd\xa3\xa8\x77\x14\xf5\x8e\xa2\xde\x51\xd4\xf3\x89\x7a\x7e\x1f\xd2\xf9\x64\x02\x0f\x4d\x7f\x7f\x4e\x12\x91\xe7\xb4\x48\x27\x80\x49\x44\xab\x65\xdd\xcb\xd4\x7d\x5c\x0d\x24\xbc\xa0\x7c\xd1\x7c\x13\x1e\x1f\xfe\x72\x4f\x3f\x21\x96\xba\x10\xd5\x0f\x15\x4d\xd8\x0d\xab\xb8\x18\x0c\xae\xdc\x04\x07\x01\xab\x70\x63\x41\xb7\x41\x1a\x30\x3a\xd8\xe4\x8a\x49\x25\x2a\x96\x92\x93\x85\xa8\x86\xe3\x48\xa4\xa2\x8a\xb5\x40\xb2\x39\xe5\xe8\x10\x48\xf1\x2c\x80\x4f\x44\xf7\x29\xd1\x7e\x19\x11\xc8\x00\xdf\x43\x3c\xa8\x65\xc5\xa8\x82\xf0\x55\x5a\x90\xa5\x9e\x23\x29\x61\x92\x43\x04\x30\x48\xdd\x16\xa2\xfa\x58\x2b\xba\x64\x77\x22\x63\x15\x2d\x92\xc1\x38\xd1\x4d\x2b\x3a\x8e\x48\x09\xa2\xe0\x4d\x30\xde\xb6\x96\x4a\xe8\xd3\xf8\xf3\xf5\xba\xf9\xa8\x2b\x4e\x10\x16\x0e\xec\xcf\x70\x20\x76\x9d\x10\x08\x18\xe9\x15\xcb\xe8\xa0\x54\xd5\xbb\xf3\xad\x3f\xc0\xce\x0b\x40\xb5\x4c\xd0\x23\xf6\xea\x9b\x04\xb5\x67\x45\x09\x72\xa1\xff\x81\x2e\xa2\x41\x30\xae\x10\xba\xca\x0e\x17\x5d\x26\x15\x2d\xd9\x75\xa1\x58\xf5\xb0\x1d\x1d\xdd\x05\x43\x36\x0f\xb9\xc1\x48\x92\x25\xb5\xe2\x0f\xcc\xf4\x13\xef\xfe\xc0\xb0\x78\x3f\x89\xc1\x60\xeb\x0d\x2d\xa2\xf9\xb1\x18\xb6\x7f\x6f\xad\xcd\x96\x3d\xfc\xcc\xa8\xa3\xe8\xe9\x9a\x33\x54\x42\x59\x4a\x78\x61\x02\x12\x9c\x57\xfa\xdc\xdf\xa8\x9d\xd8\xc1\x68\xfa\xdb\xe9\xe1\x9c\xa9\xc4\x8d\x24\x35\xd3\x3d\xff\x33\xfe\x63\xa2\x47\xfc\x97\x48\x40\x67\xcf\xae\x0f\x71\x73\x48\x8e\xe1\x6a\x7d\x29\x0a\xc5\x3e\x6f\x11\xd6\xcd\x55\x76\x9f\x25\x2b\x91\xa5\x92\x94\x22\x9d\x64\xec\x01\xf4\x24\xfc\x3b\xa1\x4a\x55\x7c\x0e\x1e\x9f\x3e\x01\x59\x93\x62\x51\x38\x79\x28\x92\x29\xad\xb4\x4b\x43\xd8\xd2\x8d\x88\x0f\x1b\x8c\x76\x23\xd2\x8d\x21\x8c\x61\x1c\x0b\xf9\x43\x25\xea\xde\xf4\xe9\xce\x2c\x5f\x5d\xa0\x27\x98\x66\x44\xd6\xa5\xf5\xfb\x66\x18\xfe\x83\xfa\x90\x51\x81\x40\x30\xc8\xb2\x76\x22\xfd\x2c\x17\x62\x93\x4a\x91\x4e\xc9\x4c\xe4\x8c\x3c\x88\xac\xd6\x24\x60\x5d\xea\xe5\xc9\x32\xf1\x08\x93\xfc\x5b\x3d\x67\x19\x86\x9e\x18\xb8\x6f\x90\x12\x1e\x75\xb7\x2b\x5e\x0e\x89\x1d\x30\x1e\xdb\x25\x38\x8e\xf4\x2b\x60\x3d\x00\x38\x69\x91\xbe\x25\xff\x55\x90\x6f\x50\x3c\x10\x8f\x90\x69\xf3\xc3\xf5\x15\x98\x30\x7a\x3b\x9d\xe3\x97\xbf\x9f\xc1\x72\x91\x3f\x4c\x0d\xa6\xad\x5a\xf2\x94\xcc\xb9\xb2\x31\x32\xa7\x05\x7b\x84\x24\x1d\x49\x12\x60\x1c\xfa\x40\xf7\x0b\x79\xab\x66\xd6\x60\x38\x71\x07\x69\x3e\xf3\x9a\xfc\x3b\x7e\xa7\x64\x55\xce\xd1\xf9\x3b\xe7\x78\x5f\x7a\xfb\xfc\x78\x7b\x92\x22\x8f\xab\x1e\x27\xd5\xe3\x64\x32\x99\xe8\x79\xa2\xf7\x8b\x19\xed\xc1\xae\x29\x7c\x15\x8c\x23\x22\x35\x69\x07\xfd\xeb\x69\x57\x1b\x58\x72\x3b\x14\x74\x5c\x16\x6b\x33\x8b\xe9\xab\x9e\xb7\x43\x31\xc2\xfe\xd8\xe0\xaa\x2e\x2e\x22\xcf\xa7\x5e\x25\xbd\x81\x4a\xe8\xb7\x4c\x6e\x82\xaa\xd6\x98\x9d\x60\x82\x9f\xdb\xbb\x55\x56\x22\x61\x72\xc0\x7c\xf0\x49\x32\xa9\x7b\x01\xa6\xd4\xc4\x7c\x9a\x35\x9c\x92\xf7\x74\x4d\x68\x26\x8d\x3f\x12\x70\x1c\x36\x2f\x20\x21\xd7\x8b\xde\xae\xcd\xf3\x73\xa1\x56\x5b\x84\x43\xaf\xee\xf6\x65\x76\x34\xbe\xfe\x1e\xad\x53\xb3\x67\x1c\x10\x05\x2e\x49\x59\xb1\x84\xa5\xac\x48\x6c\x36\x49\x6b\x95\xe9\xe7\x95\x07\xd8\xb5\x0f\xa2\xb8\x15\x22\x2c\x92\x5e\x17\x29\x64\x0f\x3a\xc5\xdc\xdb\x5d\x02\x1d\x5a\x6f\x27\xd5\x1c\x4c\x6b\xd2\x95\x10\xfd\xba\x46\x2d\x59\x85\x1a\x36\xb8\xc6\xb7\xce\xb9\x49\x4e\xc4\x5b\xcc\x73\x2d\x28\x51\x65\x37\xb9\xff\x7e\x0a\xc2\x0a\x30\x24\x62\x54\x8c\x63\x4d\x34\x43\xfa\x74\x7d\x45\xde\x90\x53\x3d\xa6\xd7\xb0\x7b\x0b\xca\x21\x70\x13\x60\x34\x07\x2f\x7d\x3b\x3f\xbe\xb0\xdd\x4e\x9b\x3b\xaa\x35\xfe\x05\xcd\x24\x3b\x23\x85\x20\xb2\x4e\x56\x4e\x62\x65\x6f\x9f\x96\x7a\x34\x21\xde\xd1\x47\x54\xff\x6d\x88\x38\xef\x76\x44\xdb\xe3\x38\xd4\x6f\xe8\x88\x0e\x6b\x60\x43\x99\x5d\x70\xde\x3e\x49\xd6\x6b\x1a\xdb\x4e\x5e\x3a\x10\x91\x70\x03\x30\xf5\xe1\xeb\x5e\x44\x3c\x61\x39\x53\x14\xc2\x7f\x78\x27\xfc\x00\xf6\xa7\x5f\x0f\x8d\xdb\xb3\xa1\xfd\xe9\xef\x33\x7e\xcf\x7a\xbe\xd9\x7f\x8a\x5f\x82\xac\x48\xf6\x23\x2f\xea\xcf\x88\x7d\x1c\xb6\xa5\x83\x78\xf9\x0e\x5e\xc1\xd8\xf6\xcf\xc6\xb4\xef\xa6\x59\x75\xe5\x94\xfe\x8d\xde\x0c\x1d\xe9\x9e\x11\xcb\x26\xe0\x12\x6a\xb9\x05\x52\xa1\x29\xa9\x68\x91\x8a\xdc\x8e\xa0\xb7\x63\x3b\x2a\x00\xe8\xa4\xc9\xca\x59\x3c\xf2\x1b\x60\x32\x21\x8b\x02\x48\xcf\x51\xea\xe4\x8f\x20\x67\x73\xd9\xec\x37\x0a\xde\x68\xae\xdf\x14\x4d\x7d\x16\x58\xef\x78\x49\x94\x26\x2c\x86\x13\xd7\xbb\xe9\x3d\x22\x63\xa8\x98\xd9\x41\xeb\x57\x5f\x64\xcc\xf0\x40\xcc\x98\xef\xd6\xe5\xc6\x98\xf5\xab\x2f\x32\xe6\x7a\x80\xdc\x6f\x8d\x59\xf3\x85\xee\x98\x81\x58\x3f\xff\x98\xbd\x76\x65\x57\xa5\x02\x79\x37\x4c\xdf\x2e\x1a\x8d\xde\x66\x60\xb4\x64\x4d\x5f\xe6\x05\xaf\xa4\xb2\x2c\x0c\xd8\xdd\x80\x1e\xd2\x25\x3d\x67\xa0\x98\x19\x4b\x75\x83\xab\x60\xff\x7a\xa2\xef\x39\xcf\x69\xb5\xd6\xc2\xf6\x30\x05\xea\x10\xcc\x42\xd8\x21\x5a\x49\x05\x13\x0c\xc0\x80\xbc\xf6\x2f\xac\xc7\x95\x10\x4e\x3f\x0c\x25\x1e\xfa\x6c\xf9\x72\x2d\x13\xd5\x6f\xc7\xef\x6a\xff\xf8\x1c\x68\xfd\x8e\x95\xa5\xb1\xa8\xa4\xb6\x27\x8c\x73\xed\xf3\xd2\x13\x23\x17\x82\x32\x7c\x23\x52\x63\xa5\xac\x0b\x7d\x2a\x44\xa5\x9c\x3e\x4e\x8d\x02\xbb\xc5\x7f\x5e\xf7\xf6\x9a\xf3\xe5\x4a\x35\x52\x69\x46\xeb\xa2\xdf\x6d\x13\xeb\xfa\xc5\xc9\x36\x45\xb0\x28\xb9\x67\x55\xc1\xb2\x16\xd2\xbf\x89\xd2\xec\x97\x1b\xc2\x7e\xd9\x11\x35\x65\x6c\x42\x0d\xb5\xdd\x1a\x24\xb4\x10\xca\x4b\xd8\xa5\x18\x39\x80\x9f\x6c\xca\xcd\x01\x47\x10\x72\x6a\xe9\xf5\x19\xf8\xd3\x30\xf7\xde\xc3\xa5\xf5\xc8\x8b\x54\x3c\xca\x31\x42\xd7\xcf\xf8\x8a\x95\x19\x92\xc6\x8e\x75\x08\xc1\x0b\x61\x28\xf0\x86\x80\x05\xc9\x25\x4d\x31\xa2\xab\x25\x41\x10\xb6\x1b\x10\xa7\x87\x84\xa5\x61\x73\x4e\x50\x9c\x8e\x52\x77\x42\xd7\x64\x99\x4b\x7a\x59\xe9\xf7\x15\xa7\xd9\xac\x64\x49\x14\x2b\xfc\xe1\xfd\xec\xa2\xfb\x1a\xe4\x11\xae\x58\x85\x5a\xb1\xfe\x3b\xa1\xa9\xb1\xee\x0c\x9e\xe1\x47\x36\x5f\x09\x71\x4f\x4e\x6d\x06\xc7\x92\xab\x55\x3d\x9f\x26\x22\x77\x92\x39\x26\x92\x2f\xe5\xb9\x39\x3e\x13\x3d\xe2\x7e\x12\x45\x40\x2b\xcc\x9a\xa2\x7a\x26\x0d\x55\x5a\x6d\x0c\x06\x95\x34\xa3\x86\xc5\x85\x5b\x90\x92\xb9\x27\xed\xd2\xbc\xd9\x9d\x2e\x50\x0c\xf0\x3a\x1a\x93\x6a\xe3\x81\xa4\x59\xb9\xa2\x68\xaf\xf5\x38\x1b\xe0\x51\xf0\x28\xad\x44\x01\x6e\xa9\xf9\xda\x04\xdb\x1b\xf3\x05\x2b\x10\x1c\xa9\xbd\x06\x7a\x14\x83\x5d\x9a\x8a\x86\x64\x91\xd1\x41\x74\x81\x20\xc9\xd8\x3e\x0d\x3e\xe4\x91\xc0\x89\x80\x25\xb2\x65\x45\x1c\xe8\x1b\xef\x34\x36\xb7\x07\x35\x62\xcf\x1a\xbb\x6b\x39\xd8\xeb\xb8\x35\x3e\xcc\x5a\x36\xa6\x84\xe8\x25\x04\x93\x82\x79\x41\xdf\x77\x4b\xfd\x86\x4c\x0c\xde\x23\xbb\x6d\x7a\xd8\xca\xf3\x1c\x30\x35\x0c\x76\xeb\x33\x41\x6c\x2a\x98\x61\x4f\x42\xdb\x76\xa3\x9c\x5e\x09\x7b\x17\xea\x09\x67\x6c\xf8\x7e\xd9\xb3\x37\x67\xca\x3d\x7a\x39\x5d\x03\xa8\x10\x62\x99\x19\x8b\xb9\x73\xa0\x6e\xdd\x63\xf0\x94\xb7\x77\x27\x8f\x23\x56\xce\xbb\x48\x12\x51\x17\x2a\x98\x77\x3c\xdb\x7a\xbc\xef\x7e\x77\x9f\xea\x2b\x64\x53\x63\xda\x9f\x3d\xd4\x01\xf7\x9e\xc7\x6f\x09\x1f\x7a\x8f\x65\xff\x0e\x99\x0d\x34\xeb\xf4\x1c\x48\x06\x2a\x78\x66\x92\x80\x92\x15\x4b\xee\x89\x78\x2c\x5a\x99\xfd\x18\xe3\x79\x8c\xf1\x3c\xc6\x78\x1e\x63\x3c\x8f\x31\x9e\xc7\x18\xcf\xcd\xbf\x1d\x63\x3c\xbb\xed\x37\x1c\xe3\xd9\x15\x65\xa2\x24\x98\xae\x8c\xd2\x2b\xc6\x18\x60\xdd\x56\x7c\x21\xbf\xbf\xd2\xe4\x3d\xa1\x8a\xa5\x6f\x7f\xbf\x35\x76\xbe\x20\x05\xe3\x06\x60\x93\x4b\x52\x88\x8a\x94\x22\xdd\x18\x15\xcc\xde\xb1\xa5\xf8\xcb\xd5\x73\x49\xea\x02\x63\xe9\x8e\x09\x2f\x47\x61\xe8\x28\x0c\x1d\x85\xa1\xa3\x30\x74\x14\x86\x8e\xc2\xd0\x51\x18\x1a\x14\x86\x56\x5b\x45\x41\xbb\x92\xcf\x5f\x2f\xb6\x41\x87\x6d\x18\x1c\x04\x4b\xa1\x2c\x84\x80\x6e\x0e\x0a\x6b\x6f\xba\x70\x17\xf1\xee\x01\x31\xcf\xff\x3e\x25\x33\x9e\xf3\x8c\x82\x1b\x92\x12\x45\x97\x80\x91\x83\x06\xae\xbf\x5e\x38\xa8\x56\x5b\x7d\xe2\x67\x25\xa2\x5a\xe5\xb5\x02\x13\xf3\xc6\x08\xa7\xc4\x80\xab\xc3\x76\xdc\xd1\x25\xac\x22\x5f\x82\x99\xba\x4f\x2e\xd3\xdf\xc4\xb0\xe0\x78\xf3\x98\x12\x15\x5d\x06\x2c\x7a\xf8\x4c\x63\x6b\x97\x06\x67\x7d\x25\x1e\xed\xfb\x6d\x5c\xfe\x58\x78\x1a\x20\x9d\x57\x3c\x1c\x4b\x77\xf2\xce\x3c\xf9\x13\x44\xff\xce\x10\x92\x14\x37\xd1\x42\x3a\x45\x14\x5f\x98\x29\xaa\xd8\xa2\xce\x66\x4c\x21\x3b\x72\x84\x54\xe8\x86\x17\x88\xe1\xda\x0d\x36\xbe\xcc\x28\xcf\xef\x58\x5e\x6a\x39\xa9\x9f\x30\x8f\xc4\x1a\x33\x2b\x77\x8e\xfd\xcb\xf3\xdf\xc1\x4a\xa4\xbc\x37\xed\x28\x24\x6f\xe5\x2c\xe5\x75\x1e\x07\x26\xfe\x33\x88\x56\xeb\x92\x21\x7b\xc6\xfd\xc3\x0e\x88\x5c\x89\x3a\x4b\xc9\x9c\x26\xf7\x28\xdd\xa7\xbc\x02\xf1\xcb\x53\x0c\xe1\xce\xc9\x0d\xd0\xb4\xe6\x95\x49\xd5\xc8\x19\x2d\x6c\xb4\x22\xda\x7f\x45\xca\x4e\x4e\x9a\xc4\x02\xf3\x4d\x0f\xfc\xb7\x61\xf0\x9a\x08\x76\x60\x20\x4d\x07\xaf\x35\xef\x7e\xcf\x72\x3d\xba\x3d\x57\xdf\xbb\xf8\x24\x86\xa1\x4a\xfe\x2b\x03\x5c\xbb\xb8\x4d\xb8\x13\x8a\x66\x4e\x3e\x52\x26\x12\x9a\x35\xbb\x61\x39\xaf\x89\x6c\xf3\x78\x1c\xec\xa5\xb0\x31\xf1\x98\x25\xc0\x7f\x65\x88\xe9\x88\x7e\x30\x29\x50\x7a\x4e\x80\xca\xe8\x3e\x73\x58\x35\x8f\x13\x07\x76\x06\x3a\xb3\xa8\x8c\xb5\xd4\x23\x13\x85\x79\xd7\x9e\x98\x66\x00\x8f\xfa\xe4\x0c\xf6\x68\xd2\x19\x2c\x0c\x21\xd2\x52\x9b\x97\x04\xf4\xd2\xae\x9f\xe3\x90\x59\xb1\x81\xb4\x03\x62\xdc\xa3\xa0\x20\xd4\x39\xf0\x41\x1c\x95\xc1\xc2\x84\x0c\x33\xd7\xe3\xef\xa4\x7f\xdc\x79\x24\x44\xe7\x1c\x17\x3c\xeb\x1e\x64\xab\x91\x34\x0b\x5b\x17\x06\x81\x10\x4f\xdf\xb0\xb4\xd6\x9c\xca\xfe\x43\x59\x4b\x56\x4d\x96\x35\x4f\x0f\x76\x1c\xbd\x22\x56\x0f\x41\x8b\x08\xfe\xba\xf9\xe9\xb2\x61\x00\x83\x14\xb7\x4b\x5d\x77\xa0\x63\x6d\x41\x91\xb8\x6b\x74\x71\x73\x6d\x79\xa4\x0d\x12\x02\x56\x8d\xbf\xb1\x94\xc8\x64\xc5\x72\x8a\x5e\x27\xcf\x35\x6a\x74\x38\x6a\xab\x15\x68\x15\x19\xd6\x6f\x0a\x46\x14\x7d\x84\x0c\x71\x4c\x44\xf1\xc0\x2a\xad\x33\x27\x62\x59\xf0\x5f\x3d\x59\x9d\xf8\xf5\xc6\x97\x8a\xe5\x09\x20\x40\x0c\xb0\x71\xe1\x16\x9c\x35\x1e\xc2\x8a\x01\xf2\x5b\x5d\x44\xf4\x6c\xf5\xa9\x1e\xb2\xb7\xe4\x6a\x7a\xff\x27\x38\x5e\x89\xc8\xf3\xba\xe0\x6a\xad\x09\x1f\x26\x83\x89\x4a\x9e\xa7\xec\x81\x65\xe7\x92\x2f\x27\xb4\x4a\x56\x5c\xb1\x44\xd5\x15\x3b\xa7\x25\x9f\xc0\xe4\x0a\x04\x65\xce\xd3\xdf\x35\x80\x28\x3b\xd3\xc5\x7b\x5e\xc4\x65\xe7\x9e\xfc\x8d\xa3\x93\x9e\x76\x74\xc6\x76\x6b\x2c\x2c\xf8\xed\xbb\xd9\x5d\x83\xd4\x32\xac\xdc\x68\xee\x65\xb0\xf4\x5a\x0d\xbd\xdd\x4c\xbd\xe0\xbc\x58\x58\x2b\x16\xa0\x98\xbb\x05\x46\x3c\x1d\x37\xf5\x91\x64\x3d\x07\x6a\xe3\xd4\xdf\x9f\x92\x4b\x5a\x14\x02\xf8\x56\x5d\xa6\x80\xe0\xa2\xf5\xd8\x4b\x9a\xb3\xec\x92\x4a\x0f\x54\xf5\x13\x6f\x25\x64\xba\x4d\xf4\x76\xec\xbe\x99\xd6\xb9\x1f\xb5\xa1\xef\xf2\x39\x4b\x53\x96\xbe\xb7\x11\x01\x8d\xfe\xd0\xc4\x08\x54\x2c\x63\x0f\xb4\xdf\xff\x6b\x1b\x2d\x9a\x9e\x6e\xcd\xa6\x0f\xad\x61\x54\xb1\x0e\xbd\x3b\x74\x30\xba\xac\x79\x2c\x5a\x95\xb4\x2d\x12\xc4\x7d\x83\x7e\xb5\xa3\x31\x86\x93\xba\x90\x50\xf2\x16\xd0\xea\xb5\x12\x87\xb7\x20\xa7\xfd\xb9\x87\xb6\x99\xb4\x75\x08\x2c\xa0\xcd\xed\x40\xa6\x65\xa2\x0f\x24\x53\x9a\x62\x37\x20\xe0\x4a\x88\xcc\x5f\xff\x09\x32\x8b\xf4\xa9\xc4\xd4\x78\x55\x71\xf6\xc0\x08\xad\xe6\x5c\x55\x14\x44\x00\xdc\x47\xe0\xa9\x6b\xd0\x4e\x8a\x81\x74\x29\xdb\x7e\xa9\x59\xb5\x06\x31\x44\xf7\x69\xc5\x4d\xc0\x04\x85\xa0\x1b\x03\x03\x8e\x19\x82\x50\xd3\x06\x8b\x56\xf9\x11\xe2\x37\xae\x4e\x90\xcd\x3a\x87\x20\x5c\x2c\x22\x50\xca\x2f\x0b\x96\x53\x78\xa6\xb3\xf4\x1e\xcd\x12\x86\x78\xde\xb3\xb5\x74\xcc\xb8\xc6\x52\x4c\x8b\x3e\xac\x29\xb7\x59\x50\x78\x51\x2d\xa9\x66\x41\xd0\x47\x42\x15\x5b\x8a\x4a\xff\xef\xa9\x4c\x44\x69\x76\x0f\x4c\xb3\xaf\x23\xb7\x88\xae\x0d\x28\x96\xb5\xe8\x4a\xac\x9e\x04\x72\x29\x70\x5d\x20\x6c\x22\x03\x44\x5c\xec\x1f\x9c\x17\x07\xde\x7b\xdc\xaf\xbd\xb7\x3d\x54\xd7\xad\xa7\xaa\x9b\x35\x58\xd6\x05\xff\xa5\x66\x6d\x48\x69\x1b\x07\x42\xae\xfd\x17\xb2\xd1\x0b\xe0\x92\x40\xbe\x2f\xa0\xac\x59\x2e\x7d\x46\x68\xa6\x56\xa2\x5e\xae\x88\x14\x79\x08\xdb\xdb\xb6\x1c\x22\xb3\x32\xf1\x48\xa8\xe5\x6c\x4a\x58\xa6\x06\xfc\x6e\xc9\x0a\x56\xb9\xa2\x11\x2d\x35\xad\xad\x38\x55\xfe\xd3\x04\x21\x3f\xb4\x56\x22\xa7\x8a\x27\x34\xcb\xd6\x53\x62\x43\x82\x30\xb0\x9f\x67\x6b\x10\x88\x8a\xd4\xa8\x3b\x38\xab\x40\x5d\x0e\x9e\xb2\xbc\x14\x0a\xb2\x7f\xe0\x80\xba\xee\x25\x14\x05\x39\x56\x9f\xd8\x66\xc7\x07\x3d\x4d\x1c\x02\x11\x17\x9c\x55\x12\x0b\xea\xed\x59\x7c\x26\x78\xf6\x64\x6c\xf4\xed\x09\x04\xdc\xba\x52\x71\xca\x24\x1c\x9e\x64\x45\xa1\x4c\x51\xc5\xa5\xe2\x09\x2a\x4b\xc3\x82\x26\x66\x8c\x9b\xd3\x80\x42\x3f\x28\x52\x7a\x5b\x57\x00\x88\xb7\x9b\xe6\x5d\x6a\x19\x5d\x2a\x56\xa8\x89\xd5\x7a\xda\x9f\xf0\x97\x44\xeb\x28\x7b\x96\xe6\x4a\x98\x94\xef\x45\xea\xa7\xb8\x1b\x4c\xb9\x7d\xa9\x95\x59\xdc\x05\xc4\x5e\x35\x93\x0a\xdc\x2c\x27\xe5\xde\xb0\xba\x15\x7d\x18\x0f\x4b\xef\x59\x32\x1c\xca\x04\x86\x32\xf1\x56\x3e\x7a\xde\x3a\x34\x5a\x2c\x40\x13\xdd\x88\x42\x43\x4d\xf4\xae\xa1\x73\xb8\xea\xc6\xde\x57\xd0\x52\xae\x84\xba\x6a\x3a\xf6\x4e\x05\x82\x7f\x9b\x88\xc9\x25\x24\x62\x83\xe2\x8a\xd1\xbc\x29\x52\x8d\xba\xaa\x58\xa1\xb2\xf5\xc6\x37\xfc\xa4\x07\x47\x05\x36\xf0\x36\x61\x06\xc4\x59\x23\x9d\x5a\x27\x57\x59\x89\x07\x0e\x7a\xa8\xcf\xcf\x45\x80\x2b\x9b\x9e\x36\x06\xe2\x76\x0b\x95\x15\x20\x9b\x00\x71\x1e\xfc\xd3\x27\x05\x7b\xb4\x47\x0f\xaa\x15\xe9\x8e\x6c\x2e\x42\x83\x72\x64\x2d\xdb\xe6\x39\xff\xc4\x1b\xf4\x16\xc5\xf3\xde\x49\xb6\xf9\xea\xfd\xb3\xf1\xf6\xde\x99\xa9\x0b\x53\x61\xa8\xb7\x05\xb7\xb0\x66\x9f\x05\xe5\x59\xed\x31\xba\x10\x27\xf7\xa2\x62\x66\x97\x28\x88\xd8\xec\x01\x6a\xaa\x5e\xa3\xe1\x69\x51\xeb\x23\x72\x46\x1e\x19\x29\x33\x5a\xf8\x54\x11\x62\x32\xe7\xf4\xd4\x72\x7d\x85\x9d\x41\x5b\x24\x11\x33\xbc\x39\x5b\xd1\x07\x2e\xaa\x50\x4d\x46\x82\x84\xac\x59\x42\xcd\x8b\x11\x78\xc4\xc7\xa7\x62\x4b\xbf\xd3\x92\x0f\xa2\x59\xb8\xad\x6b\xeb\xb9\xb9\x46\xcc\x11\x73\xd2\x11\x71\xa5\xad\x84\x15\x51\xc5\x8c\x80\xc5\x0f\x45\x13\x80\xfe\x4f\x4c\xf2\x8b\xdb\x37\x1c\x94\x4e\xb6\x4d\xb0\xcf\xd6\x34\x08\xc6\x02\x2b\x50\x19\x6f\x5a\xa2\xb7\xe4\xe2\xe6\x1a\x47\x0c\xf5\x05\x82\x3d\xd2\x62\x6d\x4a\xdb\xaa\x15\xaf\xd2\x49\x49\x21\xab\x4a\xef\xe5\x59\x67\xb4\x4d\x21\x94\x40\x97\xd1\xa5\xd4\x7d\x86\x11\xdb\x3a\xfb\x62\xed\x23\x50\x9c\xd5\x98\xef\x1b\x45\x6f\x73\xb5\x0f\x35\xca\x98\xc2\xfa\xdb\x59\x72\x1b\x01\xdf\x4f\x3c\xca\x98\xca\xed\x13\x58\x6f\xef\x03\x83\xa9\x6e\xee\x60\x02\x5a\xc1\x60\x39\x27\xb7\x6d\x16\xec\x69\x8b\x3a\x35\x81\x24\xae\xad\x3c\x4e\x88\x7f\x7a\x51\x23\x68\x0b\x24\x23\x28\xd3\x70\xc5\x29\xb7\x8d\xd7\x9c\xc9\x98\xc3\xbd\x5b\x55\xaa\xe0\xf7\xb7\x2a\x2b\xbd\x6c\x85\xaa\xed\xa5\x09\x1c\x62\x12\xa8\x5c\xe5\xb6\x67\xde\xa1\xa8\xea\x56\xc1\xcf\xf7\x55\xbf\x0a\x56\xba\x0a\xf6\xea\xab\x84\xd5\x5b\xf5\x2a\xd8\xe3\xc1\xab\x62\xb9\xed\x05\x2b\x64\xb9\x2d\xf2\x44\x46\x3d\x26\x07\x42\x62\xdd\xd6\x1b\x69\x09\x56\x49\x22\x1e\x98\xf5\xa3\xc2\x86\x25\xa2\x90\x3c\x65\xd5\x60\x12\xbd\x6d\x73\x0e\xb0\x91\x87\x90\xd8\x62\x22\x5a\x07\xa7\x33\x26\xba\x35\x78\x3e\x3a\xd1\xaf\x23\x23\x5d\xdd\x16\xa1\x77\x6e\x4d\x24\x3e\x02\x36\xd8\x2f\xe9\xc6\xc8\xc6\x44\xc3\x46\xf4\x39\x36\x5e\xd6\x6d\xb1\x47\x01\x9b\x37\x8e\xd6\x6d\x3b\xc4\xd4\x46\xf5\x4b\x1c\xc0\x92\xf0\xe4\xc8\x38\xea\x4e\xa2\xe2\x6e\xdd\xb6\x53\x0c\x6e\xe4\x44\x21\x8a\x2b\x2e\x1e\x37\xb2\xc7\xad\xa8\xdd\xc8\xd8\xdc\xce\xa8\xc6\x2d\x67\x28\x66\xd7\x6d\xa3\xe3\x77\x23\xa7\xbd\x11\xe5\x1b\x8c\xe5\x8d\xec\x76\x30\xe2\xb7\x27\xae\x37\xb2\xcb\xb8\xe8\xdf\x36\xc6\x37\xb2\xdb\xc3\x45\x02\xbb\x2d\x10\x15\xec\xb6\x48\xaa\x8b\x6d\xe4\x09\x8b\xb3\x00\xda\x16\xa3\x9d\x61\x1b\x8e\x28\xee\x3e\x15\x11\x3c\xee\x0e\x33\x42\xda\x8d\x9f\x51\x20\x02\xd9\x6d\xcf\x2b\x1a\xc7\x47\x29\x07\x87\x60\xa3\x98\x47\x47\x2c\x87\x27\xe7\x46\x34\x47\x45\x2f\x07\xbb\x1c\x8c\x6e\xf6\x44\x32\x47\x68\x70\x51\x91\xce\xf1\x42\xd0\x41\xa5\x5c\x54\xd1\x2f\x33\x2a\xa5\x0f\x36\x82\xf4\x7b\x21\x6d\x02\xbe\xd3\x4b\xeb\x57\xb4\x70\x4f\x19\xe5\x9e\xc0\x4c\xb2\x7b\xb4\x6b\x8f\x5d\x21\xd1\x43\xf0\xfb\x2e\xa2\x2e\x05\xf6\xf7\x5e\xa4\xf1\x2b\xd2\xbe\xd2\x38\xca\x1e\xdd\xe8\x58\x63\x50\x71\xcc\x7f\x7e\x3d\xc0\x5d\xbd\x16\xae\xe9\x7b\x9e\x31\xb9\x96\x8a\xe5\xba\x27\xad\xae\x71\xeb\xc2\x0d\x85\x4b\xf0\x22\xc9\xea\x14\xa3\x92\xa1\x5b\x50\x04\xdb\xca\x03\x14\x90\x26\xac\x9f\x63\xcf\x32\xf8\x76\x09\x47\x1d\xaa\x9f\x9a\x57\xac\xc0\x69\xb4\xa1\xd6\xcc\x17\x42\xba\xd3\xed\xa6\x39\x17\xd8\x21\x84\x20\x63\xc4\x17\x97\xe1\xf3\x78\x10\xcf\xaa\xa2\xaa\x1e\xa4\xd0\x1b\xbe\x55\x78\x76\xd3\x62\x67\xfc\x49\x70\x2d\xaa\x1c\x55\x64\xec\x75\x70\xe8\x88\xe6\xd5\x4c\xde\x9e\x38\x73\x84\x6e\x19\x4d\x27\x9a\x06\xfd\x96\xbc\xac\xa6\x0e\xf1\x2e\x4e\xd6\xf6\xd0\x30\x08\x58\x5d\xd1\xfe\x10\xc9\x7f\x31\x67\x6b\x42\x4b\x9a\x70\xe5\x55\x14\x9f\x27\x08\xe9\xb6\x7b\x21\xcc\x56\xb6\x46\x36\xc3\x7c\xa0\x32\x74\xb6\x0e\x89\x38\x26\xa6\x7d\x5f\x86\x99\x88\x02\xe7\x1e\x7f\x3a\x2f\xcd\x4d\xbe\xb4\xaf\xea\x91\x0f\x5d\x53\xef\x1c\x00\x54\xce\xce\xb6\xa7\x0b\x00\x0b\x32\x41\x3c\xfc\x57\x06\xc2\x8a\x3f\xf6\x45\x2f\x60\x3b\x2e\xeb\xe3\x94\x58\xb4\xe0\xe4\x16\xba\x99\x29\x5a\x29\x96\x9e\xf8\xc6\x16\x71\x46\x3b\x6b\xb2\x49\xa2\x21\x82\xbc\x1d\x08\xde\xe1\x4c\x92\x94\xc1\x7f\x43\xd2\xf1\x5c\xd4\xaa\xad\x07\x53\x3e\x24\x21\x1f\x69\xa4\x08\x9d\x51\xa9\x6e\x2a\x31\x67\x77\x3c\xec\xba\xda\x04\xf6\xa5\x52\x61\x69\x98\x47\xf0\x6c\xcf\x71\x3f\xda\x13\x14\x16\x9e\x2d\x4a\x68\x4a\x15\x9b\x0c\x62\xbd\xbb\x6d\x84\xc4\xaf\xe7\x76\x57\xd1\x42\xc2\x60\xf6\x9a\x60\x67\x5a\x44\x35\x9d\x46\x58\x8e\x09\x46\x4b\x8b\x82\x19\x9e\x89\x72\x3d\xd8\xa5\x5f\x78\x81\x72\x26\x65\x4f\x3a\xdb\x76\xeb\xac\xca\x5f\xeb\x9c\x16\x93\x8a\xd1\x14\x22\x53\x4d\x27\x84\x63\xa9\x00\x7d\x39\xe3\xce\x34\x69\xce\x75\x06\xeb\xdc\x2c\x6a\x78\x55\x46\xcc\xb1\x62\x54\x0e\xe7\x47\x0c\x4c\xf1\x13\xc4\x1c\x9e\xa1\x38\xd5\x86\xdd\x52\xfd\xef\x4a\x9d\x91\x9c\x26\x2b\x5e\xc4\x18\x22\x80\x9a\x49\x45\x0b\x5c\x2c\x63\x1f\x02\xdb\xe2\x92\x3f\x18\x9b\x28\x8e\x31\x68\x38\xc7\xd6\x1c\xc3\x13\xb9\xb5\x70\x9a\x7e\x72\x65\x22\x38\x24\x79\xd5\x21\x6f\x7d\x05\x40\x36\x1b\x46\x40\x9b\x0c\x1e\x16\x47\x8b\xa3\x0c\xc0\x40\xad\x0f\xba\xb1\x7e\x01\x74\xa7\x2e\x7d\x50\xdb\x6d\x1b\x41\xe6\x0d\x24\x77\xcc\x45\xc0\x32\x12\x6d\xda\xac\xbf\xe3\xa9\xee\xf9\x70\x53\x8f\xb3\x3a\x4d\x48\x40\x3c\xc7\x87\x54\x68\x68\xa3\xd4\x7b\xbf\x2c\x57\xae\xa8\x8c\xd7\xbe\x6e\xf4\xd3\x43\x6a\x08\x74\x35\xb8\xf2\x4f\xab\x4e\xed\x92\xd2\xad\xe8\xd2\x9b\x87\x7c\x47\x97\xcf\x90\xd2\x6d\xf3\xc9\xb4\x82\x8d\xa9\xd6\x84\x2f\xe0\xdb\x23\x53\xab\xd5\x8a\x16\xc2\x5f\x30\xed\xd5\x1d\x3c\xb3\x11\xbe\x0c\xd1\x02\xed\x8f\x68\x7e\xaf\xb8\xa8\x25\xa1\x5a\xfd\xef\x99\x0f\xa8\x91\xce\xc2\x20\x80\x29\x26\x3d\x9a\x6f\xb0\xe2\x81\x57\xa2\xc8\x21\xf6\xed\xbf\x0a\x34\x21\x48\x96\x28\x9c\xec\x56\x97\xec\x73\xc9\x2a\x8e\x10\xf1\xe0\xcb\x6e\x43\xd3\x88\xe4\xcb\x82\x2f\x78\x42\x21\x78\xf2\x91\xab\x95\x66\x7a\xa9\x81\x0d\xd2\x1d\x16\x42\xf1\x9e\x20\x31\x3d\xa0\x62\x0d\x79\x3f\x54\xb2\x76\x1c\x5c\x76\xbe\xd7\xa4\xc4\xf5\x7d\x6f\xab\x53\xfb\x7d\xad\xfd\x3d\xd2\x2a\x05\xe7\x3e\x55\x7c\xce\x33\xae\xd6\x9b\xdf\xdc\x64\x1a\x3e\xc9\x72\x4e\x25\xbb\xce\x07\x04\x8a\x8d\xe0\x55\x58\x64\xfd\x82\x39\x8b\x7c\xd1\x04\x96\xd1\xc2\x06\x02\x0c\xa3\x1f\x0c\x5c\xb6\x65\x55\x26\x98\xb2\x76\x97\x49\x2c\x69\x1e\xce\x94\xff\xe1\xf6\xe6\xd2\xbc\xf4\xe3\x0c\x5f\x6a\x6b\x50\x9a\xa0\xbe\xdb\x9b\x4b\x7b\x4a\xb4\x34\xd7\x7b\xcb\x31\xfd\xd5\x4c\xed\x3f\x6b\x56\x71\x56\x69\xd6\x9e\x4a\x48\x7e\xac\x52\x96\x62\xad\x75\x4c\x02\xfa\x20\x14\x6b\x54\xa7\x01\xa0\x5d\x30\xa8\x82\x06\x73\xf1\x3d\xcf\xd8\x19\xb9\x64\x95\xc2\x7f\xe9\x3d\xff\x1b\x5b\xeb\xff\x41\xdb\x2f\xda\x57\x9b\x18\xdb\x29\xe9\x2d\xe6\x4e\xda\xeb\x7c\x72\x32\x99\xe8\x05\x9b\xe0\xc4\x26\x2a\x93\x93\xdf\x9f\x9c\x90\xcb\x1f\xaf\x09\xad\x96\x72\xba\x4b\x6a\x7d\x12\x97\xed\x36\x53\x75\xd2\xb8\x99\xad\x0d\xe2\xf2\x82\x24\xa6\x5c\x64\x2d\x59\x13\x43\x89\x90\x5b\x83\x96\xf8\x18\x5d\x27\xb1\xd5\xed\xe3\x55\x5a\xfb\x86\x3b\x48\x08\x60\x1d\x37\xba\xd8\x11\x92\x38\xe7\xf5\x16\xb8\x31\x78\xaa\x85\xf1\x51\x1f\x2c\xda\x72\x74\x1c\x63\xc7\x58\x6e\x4c\x99\x6a\xb4\x31\x49\x3c\xb0\xea\x81\xb3\xc7\xf3\x47\x51\xdd\xf3\x62\x39\xd1\xb4\x6a\x62\x12\xa6\xce\x21\x61\xe4\x1c\xf3\x46\x82\xa2\xcf\xdd\xc7\xab\x8f\x6f\xc9\x45\x9a\x1a\xb2\x52\x4b\xb6\xa8\x33\x73\x53\xa6\x4e\xe6\xf4\x19\x84\x3a\x9e\x91\x9a\xa7\xff\x3b\x2e\xfa\x26\x62\xfd\x10\x07\x7f\xbb\xe0\xa8\x77\x0d\x67\x06\x28\xe4\x71\xc5\x0c\x25\x64\xce\x31\x14\x15\xe1\x4a\x46\xf9\xfc\xac\x0f\x36\x2e\xb6\xc9\x5f\xbd\xab\x6d\x91\x71\xa3\xde\xf1\x45\xc6\x25\x25\x15\x1b\x04\x86\x20\xfd\x65\x54\xbf\x82\x6b\x6a\x6e\x07\x4e\xaf\xbd\xb4\xc0\x50\xa6\x88\xdf\x11\xdc\x5a\x50\x42\x51\x53\x30\xfd\xdc\xb3\xa0\x9b\xfd\x78\xed\xbf\xb6\x6b\x6f\xce\x74\x7b\xe7\x43\xa8\x6a\xd8\xbe\xd6\x3b\x1f\x7c\x24\xa1\x5a\xce\x89\x92\x2c\x6e\xa8\x5a\x59\x09\xc7\x0a\x14\x7c\x0b\x14\xbd\x51\x85\x06\x07\x3e\x8e\x7e\x04\x8f\x48\x32\x50\x00\x7e\x6b\xfc\x33\xc8\x67\xdf\x14\x8d\x4c\xa2\x29\xcc\x66\xc1\xb3\x66\x5c\xc3\xc3\x3f\x0a\x4d\xfd\x63\x3c\x0a\x4d\xc3\xed\x5f\x84\x7a\x1e\x85\xa6\xbe\x76\x14\x9a\x8e\x42\x53\x7f\xfb\x17\xb9\xf6\x47\xa1\xa9\xdb\x12\x63\x2b\x1a\x2d\x36\x6d\x09\x1b\x5b\xf2\x93\x4f\x66\x30\x26\xe6\x43\x09\x4e\xbc\x90\x2c\xa9\x2b\x36\xbb\xe7\xe5\x4f\xac\xe2\x8b\x41\x3a\xd2\x99\xcf\x15\x16\x0f\xb2\x78\xed\x7a\x2e\x60\x12\x55\xcc\xa9\xd7\xed\x1f\x94\x6f\xa7\xef\xd1\xf2\xb6\xeb\xd2\x62\xc0\x66\xdf\xca\x46\x48\xa6\x87\x5a\xd9\x7b\xb6\x9e\x79\xb9\x46\x80\x63\xf4\xcd\xe7\x80\x36\xbb\x00\xc7\x78\x12\x6e\x31\x9a\x53\x44\x51\xb9\x1d\xc0\x6f\xbe\x10\xee\x70\x70\xce\x10\xb5\x5e\x31\x1c\xe1\x29\xb8\x41\x14\x27\x88\xe1\x02\x21\x0e\xe0\xa3\xfe\xe1\xc0\x4b\xb0\xd6\x47\x57\xc0\xfb\x64\x10\xaa\x1e\x80\x76\xc2\xd2\xac\x84\x54\x90\x6c\x7e\x18\x4a\xe2\x1d\x31\x8f\xf2\x07\x5d\x5b\x1f\x90\x83\x66\x4a\x3b\x45\xcb\x21\xdb\xb0\x71\x30\x9d\x11\x45\xfb\xcf\x0f\xe2\xa4\x51\x92\x88\x7c\xce\x0b\x4c\x69\x9a\xda\x03\x62\xa9\xd6\x43\xeb\xb4\x94\x0a\x50\x33\x58\xc2\xa4\xa4\x03\x18\xaf\x4a\x10\x56\xc8\xda\xd4\xe1\x74\x68\xf5\x47\x1b\x3f\x7f\x5f\x88\x47\x13\x0c\x6d\xfb\x16\x0b\xe3\x0a\xea\xe7\x6a\x36\x8e\xad\x71\x34\x79\xa0\xbe\x07\x56\x3e\x03\x27\xf5\x8f\x22\xe9\xbf\x29\xdd\x48\xa6\xf6\x59\x92\x43\x95\x3e\x3d\x15\xe3\xab\x92\x3c\x65\x09\xad\x4c\x87\x44\x14\x24\x13\xa2\x9c\xd3\xe4\xbe\x3f\x71\x4b\x0a\x93\x93\xab\x5a\x0c\x93\x39\x2f\x52\x42\x97\x94\x17\x06\x04\xeb\x46\xa4\xe4\xfa\x66\x78\x52\x43\x37\x08\xcf\x91\x8d\xb7\x8f\x73\xe1\x7d\xdc\x7e\xc7\xf5\xe0\x19\x5c\x4b\x0b\x17\xcc\x0b\x33\xf1\x5d\x20\x57\x3d\x5c\x69\x57\x8e\xe4\xc3\x98\x8b\xe7\x46\x41\xca\xea\xe3\x42\x5f\x26\x07\x3a\x28\xf7\x09\xae\x4f\x88\xeb\xec\xc8\x71\xc2\x5c\x25\xc4\x51\x7c\xdc\x64\x88\x93\x78\x69\xb2\x17\x76\x63\x23\x40\xd9\x86\x22\xbb\xc8\x68\x0d\x40\x49\x27\xbb\xc7\x67\x91\xec\x12\x1a\x08\x53\xd3\x44\x03\xa0\x7c\x52\x53\x84\xde\x62\x28\x9c\x1b\x50\x6a\x27\x54\x77\x87\x7b\xea\x47\xcc\x18\x17\xde\x1d\x21\xb4\xec\x82\x8c\x61\x51\x15\x06\xbf\xfb\x05\x21\x62\x04\xa5\x92\x10\x02\xc6\x13\xaf\x78\x14\xd2\xc5\xb8\x35\x0f\x21\x5c\x6c\x21\x58\x0c\xf6\x19\x42\xb6\x08\x21\x57\xf8\x7c\x14\x83\x88\x16\x2f\x8d\x58\xb1\x7b\xc4\x5b\x6f\xb5\x92\xad\x2d\x37\x15\x4b\xda\x90\xb0\xdd\x42\xdb\xc8\x13\x55\x2c\x21\x4f\x52\xb5\x84\x84\x2a\x97\x90\xd0\xe5\xe9\x89\x1a\xdc\x5a\x5a\x13\x39\xb8\x21\x1d\x06\x96\xb8\x77\xac\x9b\xe5\xb1\x47\x45\x10\x0e\x09\xce\x3b\x4d\xbb\xa2\x09\x2f\x96\x91\xf2\xe4\x9d\xfb\x74\x27\x16\x0c\xff\xe0\x88\x90\x36\x20\x6f\x40\x19\xe9\xc6\xe9\x99\xc4\xc3\xcd\xf8\x40\x13\x72\x57\x97\x89\xc8\x31\xb7\x05\x62\xef\x06\xcc\x61\x84\x92\x79\xc5\x28\x64\x6e\x3d\xd2\x5e\x79\xf0\x28\xc4\x1e\x85\xd8\x88\x35\xfa\xaa\x85\xd8\x87\xe1\xc2\x17\xdd\x8c\xdb\xa6\xe0\x85\x2b\x18\x6c\x69\xe9\xc6\xf5\x35\x92\xb0\x0c\x07\x67\x8b\xcc\x40\x40\xfb\x43\x9a\xbb\x15\x95\x00\x21\x54\xa4\x27\xd2\x7d\x7f\x73\x48\x03\x89\x68\x5b\x17\xb7\x14\x29\xe6\xaf\xdc\x35\x7d\x41\x0e\xb4\x52\x34\x59\x19\x34\x53\xfc\x0b\x00\x71\xf6\x6e\x00\xe5\x85\xb2\xa8\xf8\x2a\x59\x99\xc5\x53\x15\x2f\x33\x46\xfe\xdc\xe0\x1d\x9c\xb1\xc5\x82\x25\xea\x2f\xa4\x96\xd6\xc4\x02\xcf\xf7\x9f\xd2\x06\x75\xe0\xcf\xf6\x5f\x7f\xd9\x5e\x76\x3f\x09\xc3\xef\xf5\x1f\xf2\x6e\x55\x05\x78\xd0\xe6\x26\xd9\xf1\xc3\xb4\xb0\x0f\xbd\x0c\x30\xd6\x29\xd6\xe6\x19\x38\xde\x98\x12\x83\x88\xec\x34\xcb\x3a\x5d\xc8\x29\xf9\x79\xc5\x0a\x77\x23\x8d\xbc\x6e\x60\x14\x86\x44\xe2\x8a\x91\x0f\x62\xa6\x37\xa3\xce\xd8\x19\xb9\x01\x32\xd5\xfe\x02\x12\xc1\x07\xf1\xee\x33\x4b\xea\xa1\x2a\x5a\x01\x82\x30\x48\xe8\xbb\x50\x99\x2d\xfc\x11\xce\xab\x03\x7f\xd4\x1e\xc5\x40\x51\x51\x25\xcc\x1a\x0e\xac\xd6\x3d\x5b\xb7\x25\x2d\x0d\xe4\x12\xc0\xc4\x9c\x85\x30\x4a\x2c\x09\x42\xac\x9a\xff\x69\xb2\xdc\x5b\x0b\x5f\x5b\x3c\xab\xfd\xa6\x45\xb0\x18\x84\xb1\xd4\x0f\xc1\x90\x76\x59\x58\x3f\x0a\x53\xd7\x38\x35\xa2\xf2\x69\x23\x23\x0d\x31\xc8\x3e\x7c\x25\x07\x2e\xe9\xdd\x2f\x35\xcd\xa6\x1d\xb1\xcb\xfc\xe4\x85\xf9\xd9\x2a\xa4\xf8\xc8\xb3\x34\xa1\x15\xea\x38\xa6\xee\x8e\xb5\xfa\x21\x9c\x79\x02\xd8\xbf\x48\x3e\x3c\x0b\x0c\x3b\x2f\x4d\xde\x3e\xad\x14\x4f\x6a\x2d\x4e\x9b\x0a\x09\x03\x72\x40\xc8\xde\xdc\x1c\xc8\x19\x4b\x44\x91\xc6\x14\x09\xbe\xdb\x7c\x67\x33\x0b\x48\x4b\x69\x22\x05\x81\xc1\xe4\x7b\x0e\x9e\xf2\xe6\x3a\x9c\x9a\x82\x57\xe6\x74\x8a\x85\xa5\x29\xcd\xa5\xed\xc0\x0f\x0e\x57\x54\x6a\x2a\x4f\x1a\x01\xf8\xb5\x43\x99\x9b\x5b\x39\x25\xdf\xad\xad\x1e\x09\x12\x24\x82\x02\x0f\x74\x29\x99\x3a\xdb\xa8\x2c\x87\x3d\x3a\xd7\x7c\x21\x2a\xf6\xc0\x2a\x72\x9a\x0a\x30\xc7\xb0\x07\x9e\xa8\xd7\x43\x47\xef\xff\xb0\x4a\xc0\x21\x2b\xd8\x92\x2a\xfe\xd0\x80\xc4\x58\x43\x8d\xb2\x98\xd3\x92\xbc\x21\xa7\xd0\x99\xd6\x7b\x58\xca\xa9\x62\xd9\xfa\xf5\x40\xbf\x06\x06\x04\x21\x3f\xfa\x3f\x6e\x93\x60\x79\xa1\xfe\xf8\xad\xe7\xc8\xf0\x42\xb1\x65\xaf\xe7\x14\x86\x1a\x71\x4e\x10\x85\xa4\x43\x0c\x51\x67\xd9\xa0\x84\x0d\x3b\x1c\x04\x79\x1b\x84\xda\x72\x40\xb3\x9c\xd4\x52\x4b\x08\x03\x3a\xff\x3f\xf4\x59\xa3\xa4\x62\x4b\xb8\x47\x78\x47\x76\xb8\x45\xc1\x84\xb3\xed\xb4\xbb\x01\x81\xab\x57\xd8\xea\xe6\x9d\xf9\x35\xc5\xc1\x71\x5a\xb8\x99\xba\xd8\x36\x2b\xf5\x80\xaa\xe0\x83\x9b\xe9\x60\x6d\x19\x8e\xc6\x00\xd5\x79\x7e\xdb\xff\x80\x1e\x79\x51\xab\xb2\x56\x6e\x85\xb6\x4e\x9d\x8c\xce\x27\x5b\xa7\x95\xbe\x0a\x5b\x3d\xce\x99\x66\x9c\x58\xb2\x43\x09\xa3\x06\x74\x3a\x30\x51\x00\x65\x4f\x14\xc0\x59\x3f\xc6\xa2\xa6\xfb\xa6\xcc\x88\x01\x6a\x27\x15\x93\x75\x06\x36\x2e\xe3\x08\x81\x8a\x16\x03\xd5\x66\x62\x84\x48\x67\x88\x8e\xf4\x4c\x09\xd8\xd2\xa0\xd8\x90\xa6\xea\x3f\x59\xf0\x79\x2c\xcf\xd2\x73\x14\x9b\xb9\x8c\x95\xf2\xe0\x43\x37\x54\xad\x22\x2e\x2e\x04\x59\x98\x41\x98\x64\x7d\x63\xad\xa0\xca\xd0\xc1\x2d\xcc\xe7\x21\x82\xc4\xf0\xcb\x2c\xb5\xba\xad\x26\x8e\xa6\x43\x72\xf2\x76\x00\x26\x22\xc0\xb5\x70\x32\x95\x28\xe9\x12\xce\x64\xc4\x9c\x36\x5f\x21\x29\x53\xac\xca\xc1\x0e\xbf\x12\x8f\xf8\x77\x94\x01\x4a\xf3\xd4\xa0\x7e\xd6\x54\x6c\x5b\x09\xa9\x0c\x5c\xab\x5d\x20\x83\xf9\x85\x07\xf3\x91\xae\x09\xad\x44\x5d\xa4\x46\xac\x0d\xf0\x98\xf7\x1b\x83\xfc\x20\x0a\x20\xa0\x50\xd9\xd6\xad\x52\x01\x2e\x4f\x45\xf5\x61\xff\x66\xfa\xcd\x9b\x9d\x16\x71\x58\xfd\xdf\xae\x8d\x01\x6c\x19\xe5\x41\x3d\x3b\x6b\x0f\xb0\x27\x76\xa7\xef\x57\x8c\xa6\x1f\x8b\x2c\x46\xa8\x7e\x8f\x47\x08\x5e\x01\x50\x22\x30\xf8\x56\x5a\x92\x82\x9f\x1e\x2b\xae\x98\x23\x1e\x9c\x2e\x68\x36\x48\xf6\x45\x45\xea\xa2\x21\x33\xaf\xbb\x12\x1e\xbc\xe8\x9b\xce\xb0\x56\x2e\xeb\xf9\x8e\xf7\xcb\x5c\x24\x38\x56\xed\xf5\x6a\x0e\xd5\xc9\x90\xa8\xd3\x05\x5d\x77\xaf\x9a\x3b\xa5\x57\xaf\xc8\x29\x3e\xa9\x85\x64\x21\x86\xa4\x92\xc0\x76\x99\xe9\xbd\xfb\x5c\xc6\x08\xea\xef\x3e\x97\x14\x88\x74\xf9\xe4\x73\xfd\x8e\xad\xe8\x03\x93\x44\xa2\x79\x39\x83\x70\xf4\x19\x8e\x16\x2c\xcc\x4e\xfa\xf1\x50\xe7\xb4\xe2\x60\x50\x6e\x80\xc3\x24\xf9\x1f\xa7\x3f\x5d\xdc\xfe\xf7\x87\x8b\xf7\xef\x5e\x03\x55\x60\x76\x46\xad\x5e\x1e\x1e\x75\x27\xf3\x39\xb0\x29\x76\xcc\x7a\x85\x3d\xaa\x96\x9d\x99\x1e\x53\x5e\xab\x9a\x66\xd9\x9a\xb0\xcf\x49\x56\x4b\xfe\xb0\xcb\x4d\x1c\xb6\x26\x4d\x5a\xae\xd1\xf3\xb7\xde\xa2\x05\xbb\xc8\x42\x08\x71\x15\x21\x95\x44\x09\x24\x16\x45\x1b\x65\x8f\x6d\x91\x24\x46\x16\xd9\x14\x43\x5c\xb1\x63\x7b\xca\x56\x0c\x69\xf0\xbb\x41\xb3\x7b\x36\xa1\xa2\xab\x0b\xeb\x5d\x49\x1b\x54\x11\x53\x79\xd8\x2d\xc6\xd8\x73\x40\x10\x5c\xcc\x14\xd8\x2a\xd6\xae\x77\xa2\xb0\x76\xb4\xb1\xf2\x06\x7d\x94\xef\x32\x2a\x15\x4f\xbe\xcb\x44\x72\xaf\x67\x1c\xc3\x6d\x4e\x2e\x7e\x9e\x6d\xbd\xd7\x99\x61\x41\x2e\x7e\x9e\x91\x2b\x2e\xef\x43\x05\x61\xac\x47\xd0\xb5\xd2\x51\x72\x5f\xcf\x59\xc6\xd4\xc9\x89\x44\xf6\x6d\xe0\x67\x2c\xe7\x06\x2f\x83\x90\xc3\xb6\x59\xd1\xac\xc8\xbe\x85\xbf\xe9\xa3\x64\x38\xd5\xb9\x9e\x2a\x14\x46\xea\x37\x56\x87\x43\x3c\x17\xf2\xce\x8b\xb7\xd2\x5d\x64\x07\x16\xd2\xe2\x4d\x3a\xb4\x19\xd6\x6d\x2d\x6a\xf2\x48\xbd\xc0\xaa\x4a\x20\x7d\x98\x92\x3b\x5e\xbe\x25\xef\x6c\x58\x97\xb1\x75\x2d\x36\x3e\xc2\x65\x9b\x50\xef\xe9\x75\xde\xc6\xd5\x19\x85\x4f\x93\x5b\xa3\xd1\x92\x77\x9f\x69\x5e\x66\x4c\xbe\x25\xaf\xd8\x67\xf5\xed\xab\x33\xf2\xea\xf3\x42\xea\xff\x14\x6a\x21\x5f\xf9\xc2\x4b\xaf\xf3\xc6\x31\x0c\xd5\x77\x4d\x15\xaa\x39\x33\x5d\x69\x99\xc2\x11\x0c\xdc\xed\xf5\xf4\x7a\xa8\x8d\xf7\x7c\x02\xbd\x1e\x5a\x48\x4d\x05\xa2\x83\x41\x19\x29\xc2\xaa\x4a\x54\x8d\xc2\xe3\x2c\x37\x30\xd7\x44\xe4\x5a\x07\xe2\x32\x00\xf2\x07\xf6\x65\xb8\x02\xc3\xb1\xa6\x11\x21\x04\x60\x90\x1a\x96\xc5\xc9\x76\x19\x7a\x7d\x8b\xec\x4b\xa4\x2b\x1d\x74\x4e\xa0\xbf\x2c\x96\x39\x81\xd7\x0b\x1b\x4a\x80\x26\x01\xa7\x9a\xba\x3d\xa6\xfa\x64\x99\xfe\x35\x91\xf4\x1d\x95\xf6\x94\x7d\x2f\x2c\x5d\x27\xe7\x29\x7b\x38\x97\x29\xfd\xe6\x0c\x86\x26\x8d\xc3\x47\xb9\xf3\xf0\xf4\x49\x25\x79\xf5\xcd\xab\xc6\x0b\x9e\xad\xcf\xdc\x19\xb7\x2b\xb1\x10\x55\xf3\x29\x3f\xdc\xd1\xab\x37\xaf\xc8\xa9\xa8\x60\x34\x09\x2d\x48\xc6\xe8\x03\xb3\xca\xaf\xa6\x17\x6b\xb4\x84\xbc\xee\x05\x9f\xc0\xe6\x58\x83\xfe\xfd\x0f\x81\xfd\x1f\xb6\x08\x91\xa0\x38\x4f\x7a\x6b\x44\xea\xf5\x7b\xa5\xe5\xf8\x57\x20\x7b\x8b\x2a\xb1\xe5\x5d\x91\x84\xdc\x9a\x3e\x3d\x8b\xd0\x4c\x95\x17\x5d\x3b\x80\x16\xb2\xa0\xeb\xc1\xc3\xe1\xe9\x95\x4b\xf2\x0a\x54\x81\x57\xcf\x48\xe5\x49\x64\x44\x34\xf6\x7c\x7d\x15\xbb\xd2\x08\xc0\x46\xae\xaf\x2c\x9d\x77\xe0\xc7\x52\x97\x8f\x12\xee\x3b\xc0\x9a\xed\x9e\x5e\xe4\xf4\x57\x51\x90\x77\xdf\xcd\xcc\x30\x5e\xbf\xc8\x02\x79\x48\x91\x3f\x5e\x7c\xd2\xac\x9e\x47\x50\x1e\x0c\xb4\xa1\xbf\xd6\x15\xd3\xa2\x47\x84\x24\x73\x61\x9f\xdd\x94\x5e\xf4\xef\xe4\x8a\x2a\x8a\x42\x8c\x89\xa6\x1a\x5a\xf9\x86\x17\xea\x7b\x01\x81\xc1\xf8\x82\x23\x87\xec\x28\x32\x24\x40\xf5\x97\x7e\xd4\xea\xee\x49\xfa\xab\x1e\xc8\x25\xbe\x07\xf0\xb8\x6f\xc9\x07\x51\xb0\x33\xb8\xa8\x44\xdf\x54\xf3\xcf\x9f\xb5\x42\xee\x21\x3b\x31\x31\x69\x5c\xde\xfb\xe1\xa0\xb7\xbc\xb4\x6e\x98\x02\xa4\x60\xc2\xe9\x36\xac\x65\x9e\x89\xb9\x0d\x5b\xde\x77\x5c\x9f\x6e\xaf\x47\x0c\xeb\xd3\xed\xf5\xd3\x0e\x69\x94\xf0\xb7\x29\xfb\xb5\x52\x9c\x09\x3d\x21\xd4\x91\x25\x7c\x92\x83\x7e\xbb\x2d\x43\x1a\x92\xdb\xa6\x56\x62\xf3\x71\xb4\x8e\x2c\x37\x5a\x62\xdb\x67\x0d\xfd\x35\x11\xbb\xd7\xe0\xdd\xe7\x92\x25\xaa\x71\x49\x93\xd9\x8a\x6a\x82\x43\xf2\x3a\x53\xe0\xcd\x87\x8d\xd5\x3b\xed\x63\xdf\x25\xab\x9a\x30\x7a\x9a\x24\x70\xab\xc9\x15\x43\xe7\x7a\xfa\xd6\x56\x42\x68\xfa\x72\x5f\xf0\xc9\x19\xb6\xab\xf7\x10\x6f\x98\xbe\x45\xaa\x45\x30\xfc\x30\x75\x4e\xe1\x29\x5a\xd2\x0a\xfb\x27\x5f\xa7\x0f\x94\x67\xd4\xa0\x9a\x49\xa6\x5e\x4f\x3b\x51\x98\x12\x16\x60\xaf\xeb\x3e\x52\x7c\xd8\xb2\xd9\x91\x53\xdd\xc3\x39\x58\x02\x5f\x4f\x1b\xc9\x81\xac\x98\x57\xb6\x06\xed\x1e\x05\x0f\x57\xe0\xd0\x73\x54\x26\x38\xcd\x95\x2a\x42\x47\xcc\xc7\xb8\x43\x8c\xc9\x12\x3c\xcf\x9f\x3f\xdd\x5e\xef\xcc\xb6\x86\x53\x2c\xb7\xd9\x16\x00\xa1\xf5\xb1\x2d\xf8\xc3\x0c\x8b\xe3\x13\x5f\xc5\x3b\xe3\xf9\x79\x1a\xce\xf5\xaf\x7f\x56\x2c\x06\xc1\x08\x06\xa8\x9c\xaa\xa7\x36\xb8\xb0\x53\x7e\x0c\x77\x70\x16\x24\x20\x17\x86\x80\x00\x37\x35\xc8\x78\xfb\xdc\x6c\x20\x0e\x23\x26\x02\xd4\x94\x0c\xde\x84\xa8\xaf\x86\xee\x5a\xbb\xba\x43\x0f\xd8\x41\xef\x72\xdf\x12\x56\xae\x16\x31\x91\x14\x97\xac\x5c\x7d\x3f\xeb\x1a\xf0\xf4\x6f\xe4\xfb\x59\x23\x17\x3a\x8e\xa6\xe1\x02\x71\x30\x5c\x89\xc6\xbe\x13\x49\x32\xbe\x60\x83\xf8\xd6\xe1\xfb\x95\x8b\x82\x2b\x51\x79\x72\x0a\xb6\x13\x06\x60\xb5\xc9\x7b\xf3\x26\x16\x08\x49\x44\x96\x19\x94\x4f\xb1\xc0\x89\xd9\xae\x3d\xe7\xaf\x47\x9d\x60\x46\x1f\x9f\xde\xff\x09\x14\x0a\xa3\x3a\x9c\xe3\x42\x9f\xdf\xbe\xbb\xb8\x7a\xff\x6e\x9a\xa7\xbf\x5b\x89\xc7\x89\x12\x93\x5a\xb2\x09\x57\xc3\xfc\x28\x88\x3f\x1f\x95\x5a\x1b\xc6\xd4\x2d\x07\xfd\x41\xdb\x8b\xf8\xd1\x46\x9b\x62\x96\x29\x35\x49\x17\xd6\xf3\x25\x84\x3a\x23\x15\x6d\x60\x3d\x03\x26\x9d\x45\x9d\x65\xb8\xe2\xaa\x62\xec\xcc\xb5\x87\x78\xea\x62\x1e\x9e\x4f\x3b\xd3\x8a\x25\xc3\x3e\x63\x1b\xab\xd8\x68\x32\x0c\x07\xca\xa7\xeb\x3f\xe9\x51\x8b\xa7\xf5\x3e\x0c\x84\xe1\x55\x9d\x35\xef\xda\x48\x9b\xd2\x40\x24\xdc\xb3\x35\x09\x00\x86\x2c\x44\xa5\x4f\x5b\xd5\x3d\x1f\x4c\x25\x30\xdd\xf3\x5a\xb2\x6a\x6a\x78\xc9\x33\xdc\xca\x18\x5e\x02\x83\xb9\x65\x8b\x5d\x17\xea\x96\x2d\xb0\xa6\x52\xb7\x40\x10\xa1\xb5\x5a\xb1\x42\x71\xc4\x10\xf6\x2c\x99\x59\x8e\xde\x95\x33\x85\x01\x9f\x61\xa9\xe2\x90\x82\xc2\x68\x3a\x5f\x66\x98\x3f\xb6\x27\x40\xd2\x19\x41\xd6\xbd\x70\x31\xfa\x62\xec\x44\xd7\x2b\x7b\x49\x2b\x9a\x0a\x88\xeb\xa8\x60\x97\xce\xe2\x6c\x92\x34\xcd\x79\xf1\x45\x5c\xc5\x90\x80\xe5\xe5\xf3\x21\xf1\x89\x17\xe9\xd0\xfa\x76\xd7\xf6\x12\x9e\xec\xca\x4f\xf8\xb6\xb5\xab\x37\xbe\x3f\x6a\xf5\x8f\x41\x3d\x57\x14\xd6\x37\xd8\xf5\x0c\x46\x5d\xe8\x7c\x2d\x7f\xc9\x26\xf8\xed\x49\x99\xb6\x2b\xfe\x32\x0e\xbd\xe7\x32\xea\x6c\x38\xe3\x5e\xc0\xb4\x13\x25\x2f\x8e\xdc\x1d\x72\x14\x85\x0e\xba\x8a\x31\xd2\xcf\x4e\x3c\xbd\x14\xdc\xb8\x7a\xa8\x65\xcc\x06\x9f\xa2\x85\x56\xf2\x59\xe0\x68\x45\x73\xa6\x58\x85\x11\x76\x26\x92\xaf\x30\x99\x2c\x1f\x4b\x56\xcc\x14\x4d\xee\x3d\x76\xec\x23\x1f\x7e\x51\x3e\x3c\xd6\x13\x66\xc3\x62\xd2\x66\xbf\x79\xaa\xa5\x3e\xe3\xc6\x6d\xa3\x66\xf0\x90\x7f\x81\x54\xe7\x29\xbd\x5b\x01\x8c\xda\x01\x74\xda\x2e\xf3\x6d\x7e\x06\xdb\x93\x89\xd6\x2b\x45\x59\x67\xc3\xb9\x2d\x90\x81\x84\x03\xdf\x91\x59\x1a\xe1\x69\x8c\x2b\xab\x25\x22\xb9\x48\x19\x99\x73\x65\xd3\x16\xb5\x20\x90\x98\xf4\x0b\xe0\x99\x9e\x53\x30\x6f\xb2\x48\x5c\x4e\x8b\xf9\x08\x73\xa6\x1e\x19\x2b\xc8\x1b\x90\x3d\xde\xfc\xc7\x7f\xfc\x47\x20\x75\xde\xac\x86\x20\x6f\xfe\xf8\xed\xb7\x53\x72\xc5\x2b\x28\x95\xcf\x21\x2d\xa4\x09\xa0\x2c\x6d\xf0\x5f\x21\x14\xa1\x90\x23\x03\x8c\xda\x6b\x10\xc0\x4c\x6f\xcd\x13\x4c\x18\x71\xce\x97\x2b\x18\x2d\x87\xf2\x79\x8b\x8c\x27\x0a\xbe\x62\x2e\x39\xe6\xbe\x7a\xc7\x09\x51\x6e\x26\xef\xcf\xc4\x9f\xc0\x5a\x9e\x91\x8c\xdf\x33\xb2\x90\x3f\x54\xa2\x2e\xdb\x32\xc8\x18\xfe\xe6\xe9\x31\xa1\x05\xa4\xfe\xc0\x00\xda\x5d\x91\x4c\x3d\x4b\x00\x43\xc0\x28\xb4\x99\x6a\xea\x48\x27\x67\x84\xd1\x64\xa5\x15\xee\x09\x6e\x7d\x49\x79\x13\x3b\x77\x45\x55\x5f\x20\x7f\x33\x7e\x88\xe7\xee\x12\xfb\x84\xa5\xce\x05\xb3\x01\x88\x65\x25\xfe\x81\x9b\xcd\x0b\x6f\x48\x8c\x43\xca\x20\xee\x10\x76\x06\x8b\x5b\x17\x4e\xb1\xdc\x7b\xb6\x86\xbd\xd1\xac\x12\x4a\xc7\xfa\x77\xdb\x26\xd3\xf5\xa4\xd9\x02\xd6\x55\x0a\x09\x80\xdb\xa3\xf5\x8a\x1b\x46\xfb\x6e\xa3\x2d\xf5\xe9\x96\x78\x66\xea\x62\xab\x5f\x00\xc7\xf2\x09\x30\x86\x14\xc1\x20\xa9\xcd\x8b\x74\x62\x39\x21\xe0\x18\x73\xbd\xec\xb3\x66\x9f\x3c\x9d\x36\x5b\xd1\x89\xd8\x91\x4c\xd5\x66\x73\x20\x10\x4b\x8f\x97\x49\x69\x92\xc9\x72\x5a\xdd\x7b\xe7\x6e\x93\xcb\xa7\x10\x0d\x2e\x9b\xc4\x37\xcc\x62\x7c\x60\x4d\x1d\x22\x37\x5f\xc2\x3f\xce\x93\xe9\xf4\x04\xc9\x83\xa8\x88\x54\xb4\x32\x37\x5a\xff\x3e\xcc\xca\x82\xb6\xd0\x6e\x24\x3e\x2d\xf5\x91\x32\xa5\xf7\x0c\xf6\x37\xed\x44\x79\xd3\x88\xe2\xa9\xcf\x00\x48\x6e\x0e\xe0\xc1\xa0\x89\xf3\x40\x75\xef\xad\xb1\x04\x58\x8c\xc2\x6c\x8e\x8c\xf9\xb4\x26\xf3\xe9\x08\xce\x62\x50\xa0\xda\x9b\x19\xec\xd5\x39\xcb\x0e\xff\x6c\x2e\xb0\x93\x73\x62\x99\x45\xb0\x4b\x3f\x33\xe9\x65\x19\xe1\xc9\x07\x59\xca\x36\xe3\x08\x76\x1a\xc1\x58\xb0\xc5\xb1\x17\x6c\x31\x4c\x06\x9b\xdf\x2f\x80\x6d\xeb\x5c\x37\x94\x01\xaf\xf8\xa2\xe5\xba\x90\xab\x5d\x06\xa8\x03\x36\xbc\x1c\x53\xf2\xde\x50\x16\x7d\xaa\x0a\x42\xe7\x52\x64\xb5\xc2\xae\xdb\x3f\x1a\xb2\x13\x75\x92\x60\x50\x0c\xb1\x93\x90\xe2\x34\xdd\x38\xa4\x08\x88\x7d\x4c\xf5\x48\x12\xa0\x5a\xe6\xc3\x71\x97\xf7\x10\x20\xd2\x13\x98\x61\xd0\x65\x14\x40\x96\x0f\xbb\x8c\xfc\xba\xe2\x97\xaa\x27\x1e\x58\x47\x8c\xd8\xd7\x30\xae\xed\x4e\xa5\x0d\x64\x08\xd9\x36\x02\xd7\x36\x6c\xf4\x08\x29\x62\x92\xc7\xa8\x60\xb3\x6b\x72\x7a\xd9\xa4\x6a\x18\xc7\x3e\xb9\x2e\x14\xab\x16\x34\x61\xaf\x5d\xd5\xcc\x1f\x37\x64\x33\x25\x56\xb4\x48\x33\x9b\x07\x42\xd8\x67\xc5\xaa\x82\x66\xf0\xa5\xb4\xe2\x90\xde\x7e\x91\x95\x2b\x6a\xc1\x97\x06\x32\xc9\x22\x14\x36\xe8\x2d\x36\x7e\x03\x3f\x6d\xc4\xd6\xc2\x39\xf4\xce\xc0\x60\x0a\x38\x7e\xbf\x1c\xdb\xe8\x9a\x53\x7d\x00\x80\x7f\x00\x69\x5a\x8b\xba\x32\x06\x76\x0b\xe5\x9b\x88\x4a\xab\x60\xfd\x99\x4e\x6d\xa3\x92\x54\x6c\xa9\x65\x55\xc0\xdb\x32\x39\xb3\x59\xad\x7f\xd8\x2b\x26\xed\x40\x71\x7d\x4e\xec\x9d\x31\xc3\xfa\xec\xb4\xd6\x40\xbb\x89\x2a\xa9\x27\x05\x0e\x2e\x23\x84\x70\x49\x4a\x2a\x8d\x19\xc5\xcf\x7a\xa8\x94\x22\xe1\xa0\x50\x3b\x3b\x86\xc2\x38\x88\x1b\x4d\x2e\x6e\x27\x76\x3f\xce\x60\x2d\x00\x49\xc5\x03\x2c\x1e\xb1\xd0\x85\x48\xd9\x4d\x3d\xcf\xb8\x5c\xcd\x46\x5a\x23\x3f\xf4\xbc\x8a\xd1\x0f\x5b\x3e\x46\xb4\x50\xfa\x74\x82\x4d\xdb\x25\x91\x0c\xaa\x51\x3f\x20\x41\xd7\xa2\x08\x94\x4c\x17\xb0\xf4\x4d\x65\xa6\x59\x7f\x54\x98\x19\xad\xb9\x1f\x02\x32\x42\x32\x66\x50\x2b\xf4\x46\x38\x63\x37\xa9\x64\x88\x92\x93\xb2\x4f\x45\xe9\xfe\xee\x55\xda\xb3\x4c\x6e\xe6\x26\x5b\xe2\x8c\x92\x9a\x49\x3c\x33\xa7\x87\xeb\x83\x15\x5e\x0b\xbe\x01\x1a\xe9\x60\xa6\x75\x97\x49\x92\x5c\x60\xda\x51\x41\x84\xb7\x8c\x38\xbe\x0e\x80\x42\xb6\x2b\x27\xdf\x13\x32\xbf\xe1\x40\x0f\x1f\xa5\xa3\xb9\xf7\x45\xcd\xbd\x23\x1d\x2e\x33\xa3\x0b\xe1\x65\xb4\x99\xe3\xdd\xdc\x51\x4b\xea\xc3\x2a\x6b\xc0\x67\xb3\x97\x0b\x04\xbf\x7e\xa1\x54\xc5\xe7\xb5\xf2\x9d\xae\x71\xd0\xaf\x91\x4b\xdf\x93\x54\xda\x8e\x05\x44\x07\x26\x0d\x1d\x99\x18\x05\x33\x71\xee\x42\xd0\x48\xd8\xdc\x2c\x87\x62\x99\xfe\x5a\x26\x0c\xfc\x17\x7f\x1c\x4c\xa7\x86\xc1\x8a\xa4\x6e\x00\x5a\x61\xff\x5a\x77\x25\xc6\x63\x87\xf6\x22\x80\xbc\xeb\x8d\xd1\x85\xf1\xed\x22\xd3\xa5\xe2\xb1\x78\xa4\x55\x7a\x71\x33\x90\x3a\xd0\x15\x79\xda\xa7\x5d\x29\xce\x76\x42\xf4\xef\x74\x2e\x0c\x7c\x6a\x29\x06\xb3\x55\x7b\xac\xf0\x47\x7b\x7b\x77\x89\x8e\xf6\xf6\xaf\xc0\xde\xae\x9f\x45\xb1\x2a\xe3\x12\x72\xe8\x3b\x77\xc1\xa2\x4a\xf8\x0c\x4a\xe3\x0c\x9d\xce\x0d\x44\x8a\xb8\x19\x13\xef\x08\x64\x7e\xe6\x27\xcc\xe9\x6e\x77\x6d\xa3\xee\x4f\x29\x52\x64\xaf\x07\x30\x98\x42\x3f\x5e\xe9\xb5\x67\xae\x4e\x00\xef\x0c\xc0\x68\xd1\x6b\xe0\x38\x26\x4a\xe1\x35\x9e\x60\x03\xf6\x4a\x8b\x42\x20\x6d\x96\x67\x24\xa3\x73\x96\xc9\x33\xd4\xd9\x00\xee\x4c\x0b\x20\x25\x4d\xd8\x46\x7d\xf5\x90\x19\x2e\x76\xfa\xba\xb5\x12\x4a\xf8\xd9\x61\xc8\x2d\x90\x37\x93\x15\xcb\x29\xfc\xf3\x7b\xbd\x1a\xbd\x40\x18\x7d\x8d\x4b\xa2\xc5\x02\xc5\x30\xb1\x99\x55\xb9\x24\x62\x71\xd6\xc9\x99\x79\xf5\xf0\x8d\x37\x5d\xdd\xb6\x68\x03\x35\xb1\xdb\x3f\x8c\x42\xe3\x99\xfa\x4d\xc7\xa8\xa8\xb7\xbe\x85\x26\x0e\x7a\x1e\xda\xd6\xfa\x5a\xe0\x5a\xe2\x7a\x1e\x78\x9a\x31\xe6\x3c\x02\xec\x7a\x11\xb9\x6b\x51\xb6\x3b\x72\x74\x02\x1c\x9d\x00\x2f\xe9\x04\x70\xc8\x34\xdc\x56\x2e\x89\x59\x00\xd7\x31\x10\x30\x56\x61\xdb\xf0\x1e\xcc\x99\x95\xc0\xa6\x2d\x48\x9b\x3e\x6b\xd6\x2f\x30\x88\x26\xdb\x36\xc7\x47\x49\x4e\x4e\xa6\xd3\x93\x13\xeb\x4d\x30\x07\xb7\x56\x8b\xc9\x9f\x08\x2b\x12\x91\xe2\xa1\x0a\x0f\x73\xc1\x2b\xa9\x80\x71\xb7\xfa\xb1\x3b\xd7\xdc\x8e\xb5\x75\x31\x84\xfd\x0a\x30\xb6\x83\x55\xdc\xb4\xb9\xf3\xdf\xef\xc4\x78\x5b\x76\xdb\xe4\xe0\x9b\x89\x36\x18\x3c\x6f\x81\xaf\x06\xa7\xd5\xd6\xda\x30\x25\x5f\xf4\xf5\xb0\x85\x44\xc8\x29\xfe\x38\x4d\xca\xfa\xcc\x3c\x30\xcd\x59\x2e\xaa\x75\x98\x44\xd8\x4e\xf4\xcb\x9d\x5e\x4d\x0f\x08\x8f\x95\xd4\x55\xc5\x0a\xa8\xba\xf1\x24\x5c\xbd\x59\x0f\x7f\x26\x59\xdb\x36\x22\x85\x1b\x3b\x39\x58\x67\x1a\x1e\x82\xa0\xbc\x18\x2d\x1d\x5e\x0a\xe2\x38\x1e\xe0\x4d\x56\x3c\x90\x07\x5a\xc9\xd0\x4c\xc9\x58\x46\x9e\xf2\x07\x2e\x87\x20\x91\x3d\x13\x6d\x6d\x1e\x0e\xf0\x26\xd2\x2f\x73\xb2\xa2\x26\x69\x30\x90\xda\x53\xb5\x21\xbb\x7c\xf3\xea\xd0\x13\xb6\x5f\x1a\xbf\xb5\x2d\x55\x6c\xee\x50\x23\xba\x1c\x78\x5f\xe2\x25\x8f\x00\x34\x55\xf7\xdb\x41\xc1\x23\xce\x81\xf9\x1c\x0e\xca\x40\x27\x60\xe2\xbd\xe2\x51\xc1\xfb\xef\xcc\xb3\xdd\x08\x42\xc5\xf2\x52\x54\xb4\x5a\x93\xd4\xe8\xe3\x6b\x6b\xc5\xa0\xd5\x30\xfc\x3b\x24\x3e\x3a\x99\x8f\x7b\xa3\x92\xc0\x4c\x52\x5e\xed\x1a\xbf\x9f\xb3\x94\xd7\x79\xac\x75\xe4\x67\x00\xcd\x32\x50\x5c\x16\x14\x00\xbb\x68\x20\x0f\x69\x72\xef\xc3\xbd\x86\x4e\xed\x92\x01\x7b\x75\x53\x93\x5e\xbd\xda\x00\xb0\x06\x09\x14\xfc\x69\x22\x65\x27\x7e\x8b\x9b\xe9\x06\xc7\xe3\x18\x5e\x0a\x63\xd2\x37\xd1\x40\xa7\xe6\xc1\xd7\x44\x54\xe4\x3d\xf0\x86\x91\x11\xb4\x87\xdb\x20\x12\x99\x4f\xc6\x7f\x65\x50\x42\x2a\x1a\xb5\x4a\x28\x9a\x39\x25\xb0\x32\xa8\x02\x69\x77\xac\xc3\x55\x02\x7b\xd5\x1c\x7f\xeb\x8d\xd4\x3b\xa6\xc7\x83\xfc\x19\x8c\x1d\x99\x44\xef\x16\x4f\x00\x9d\x52\xf7\x8a\x3c\xd7\xd3\xaf\xdd\xa5\x3b\xa7\x4c\x5a\x2d\xf5\xe8\x00\xdb\x5f\xbf\x6d\x4f\x56\x33\x84\x47\x0f\x82\x2f\x41\xa7\xb7\x5b\x01\xac\xab\x80\x40\xa5\x13\xbb\x8e\x6e\xd1\x51\x7f\x36\xbd\x15\xdf\x65\x0d\xc2\x9d\x19\x99\x11\x5e\xc4\x02\xbc\x34\x0d\xd3\x97\x0d\x94\xa1\xef\x44\x6d\x9c\xf9\x82\x67\xdd\x43\x6f\x91\xe9\x9a\x05\xae\x0b\xe3\xcb\x1f\x71\x4e\xfb\x8f\x69\x2d\x59\x35\x59\xd6\x3c\x3d\xe8\x01\x0d\x50\xdb\x45\x12\x41\x67\xbf\xbf\xec\x12\xd8\xef\xf9\xbc\x62\xe4\x72\x45\x8b\x82\x65\x0e\xcb\xdc\x00\x4b\x1c\x32\x28\xbb\x10\x8a\x01\x04\xc5\x03\x20\x3d\x7c\x1d\x59\x50\x2f\x09\x6d\xf3\x95\xc0\x03\x66\x75\x34\x30\x60\x6b\x31\xf9\xfe\xd2\x96\x9c\xcf\xea\x82\x14\x75\x3e\x67\x9e\xdb\xf4\x72\x50\x76\x2f\x9f\xd8\xb5\x5f\x06\x16\x2e\xf2\xcf\x3f\x7f\x88\x46\x7c\xe8\xdb\xa3\x47\x51\x65\xe9\x23\x4f\x31\x44\x47\x92\x53\xdd\xe1\xeb\x97\x07\x61\x78\x7c\xe4\x43\x65\x4d\x02\x13\x33\x86\x31\x98\x18\x81\x99\x99\x74\x21\xae\x39\xd2\x29\x74\x3c\x54\x89\x43\xb7\x77\x1c\x51\xe0\xf5\x73\x5a\x26\x72\xab\xec\x68\x65\xac\x59\x76\x20\x9d\xfa\x8c\xe7\x81\xea\x6f\x06\x27\x7e\x5e\x1b\x13\x8d\x50\x2b\x22\x79\x5e\x67\x8a\x16\x4c\xd4\x32\x5b\x7b\x8e\xc2\xf3\x2c\x78\x88\x67\x65\xec\x33\x1e\xdd\x18\xde\xd5\x3c\xdc\xe5\x61\x00\xac\xcc\x13\xbb\x41\x1d\x26\x36\xe4\x6d\x92\x18\xcb\x24\xb9\x28\x58\x7a\xde\xe4\x05\x23\x9a\x37\x44\xbb\xb1\x04\x8a\xa2\xa7\xa4\xcc\xea\x25\x1f\xb0\x5a\x3f\x5b\x6c\x5b\x1b\xb7\xa3\x25\xf5\x08\x81\x32\x14\xc2\xf0\x1b\x06\x92\xbb\xeb\x8d\x2a\x23\x29\x2b\x59\x91\x02\x54\x78\x7b\xd2\x7c\x77\x0f\x26\xbf\xd7\x0a\x1b\x2b\xf8\x4b\x06\x78\x38\x34\xee\xdd\x67\x55\x41\x79\xff\x5c\x13\x20\x6b\xa1\xe7\x0b\x42\x0b\x1f\x21\x39\x7c\xa8\xce\x57\xcf\x42\x9f\x0c\x98\xe4\xa9\x82\x06\x91\xc6\x05\x0f\xbb\x0d\xed\x1b\x0c\xe1\xb3\xdf\x77\xf3\xac\xbc\x28\xdc\xf1\xa1\x7c\x6e\xc0\x9e\x97\x23\xea\xa7\x64\x4f\x98\x11\xce\xb1\x99\xc9\x31\x8d\xfb\x8b\x8c\xeb\x7b\xba\x98\xab\x45\x26\x92\xfb\x28\x24\x91\xef\xf1\xc9\x0d\x4d\xd9\xfc\xb8\x09\x25\xa2\x75\xe0\x81\xe9\xf6\x6b\xc6\xe6\x0e\x39\xec\x06\x42\x0a\x4c\xf7\xfa\xf0\x57\x62\xe8\x84\x4b\x03\xb6\x38\x67\x50\xcd\xb8\x2e\x06\x31\x0d\x22\x24\x13\xaa\xa8\x1c\x05\x2a\xb8\x89\xa8\x2b\x99\xc2\x78\x40\x00\x28\xcb\x99\xa2\x00\x27\x3a\xf9\x4b\xc8\xed\x68\xe6\x6c\xfb\xd0\xe2\x8c\x9d\x7f\x5b\xd2\x25\x11\x85\xe4\x29\x33\xbd\xa7\x7a\x2f\x12\x4f\x19\xa6\x38\xb8\x5e\xfc\xe2\xa7\x4f\xd1\x28\x01\xfa\xd1\x8d\x39\x37\x95\xa9\x49\x8d\x58\xda\xad\x1e\xe0\x9b\xf3\xc2\x39\x44\xa6\xa7\x27\xb3\x05\x2d\x13\x76\xd3\xc0\x7a\x47\x42\x54\x9f\xfc\x70\xf9\xae\xfb\x52\xf7\x02\xfc\x70\xf9\xee\x5f\xa2\xd0\xc6\x32\x61\x2d\xe4\x79\xca\xe5\xfd\xb1\xca\xc6\x6f\xa0\xca\xc6\xd6\xae\x7f\xed\x36\xb4\x63\x89\x8d\x2f\xb8\xc4\xc6\x33\xd1\x28\x72\x50\x43\x67\x99\x8e\x90\x05\x6c\x1d\x09\xd7\x48\x71\x73\xe5\x16\x8f\xd0\x0c\x63\x0a\xf0\xa5\x7e\x7a\xd6\x01\xdd\xb1\x80\xf8\xf0\xee\xf3\x2d\xe2\x13\xe0\x7b\x75\x70\xa4\x43\xfa\xa7\x67\x85\xb6\x50\xbb\xb6\x0b\x14\x3e\xfb\x42\xed\x03\x6c\x8e\xa7\x6c\x27\xa1\x86\xab\x5b\x56\x0e\x70\x86\x0d\x51\x06\x1f\xdd\xb0\x13\x72\xa5\x7f\x10\x92\x43\x1c\x01\x16\xdc\x6e\x2a\x67\x0f\x6e\x3b\x5a\x09\xa7\xe4\xea\xdd\xcd\xed\xbb\xcb\x8b\xbb\x77\x57\x6f\x89\xed\x9f\xbb\x82\xe9\x94\xdc\x89\xd6\xac\x38\xa8\x15\xb4\xf5\xd4\x20\x1e\xb2\x1d\xd7\x99\x21\x9b\xb4\x68\x7d\xb1\x00\x8a\x42\x0b\x72\x5d\x70\xd5\x44\x2d\xf9\x04\xaf\x24\x13\x85\x89\xf7\xd1\x7d\x1a\x8b\xe6\x92\xab\x33\x14\xb3\x0c\xea\xfa\x8a\x75\xbf\x31\xd8\x25\x23\x37\x18\x4b\xd1\xd6\x9a\xdd\x55\x5e\x6a\xe2\x11\x62\xab\x65\xa0\x27\xa1\x8d\xfc\x00\x2e\xb2\x5d\x37\xd6\xe2\x9b\x78\x2e\x51\x8b\x7c\x02\x36\x87\x93\xe9\x89\x15\x8d\xb2\x06\xb7\xc6\x06\xbe\x36\x9f\xeb\x2d\x39\xdc\x36\xe3\x06\xef\x9e\xaa\x29\x21\x1f\x6d\xe1\xd1\x33\x2d\xdd\x6c\x80\xe3\x78\x12\x6d\xec\x48\x5b\x4f\x77\x4f\xff\x96\x6f\xcb\x7a\xee\x0e\xd4\x1f\xea\x03\xbd\x3c\xb0\x22\xc0\x86\xa3\x88\xa0\x1d\x48\xe4\x1e\xde\xb6\x23\xff\x74\xfb\xe3\x7e\x9f\xc6\x7b\x15\xf9\xe1\x4b\x91\xe7\x5c\x91\x15\x95\xab\x26\xad\xaf\x8d\x46\x68\x6e\xf5\xee\x23\x0a\xd1\xb9\x76\xa9\x76\xa2\x75\x98\x30\x1e\x85\x1b\x7f\xf2\x83\x7d\x78\x43\x61\x6b\x7e\xde\x42\x8f\xf7\x51\x90\x0e\x7a\x7c\x28\x88\x6a\x08\x6a\xb6\x19\xff\xfe\xd8\xa7\xac\x48\x11\xd9\x31\xba\x20\x8b\x7d\xe1\x83\x83\x6f\x65\x7b\x41\x81\x05\x26\x9a\x32\x45\x79\xe6\x13\xf8\xda\x15\x54\xa2\x14\x99\x58\x8e\xc3\x73\xee\x59\x84\xdf\x61\x64\xf5\x84\x4e\xf4\xea\xee\x27\xff\xc7\xa3\xc9\xdb\x00\x71\xbd\x10\xed\x9c\x1a\x49\x18\xe2\xb2\xc7\x28\x5e\x2f\x32\xe1\x83\x0a\x60\x9b\xab\xe0\x17\x51\xdb\x02\xc3\xc8\x49\xda\xfc\xe1\x92\x55\x39\x97\x9a\x94\xf4\x4a\x66\x9e\x6e\x9f\xf1\x1c\xed\x23\xae\x35\xb7\x6f\x48\x9c\x1b\x0a\x33\x0d\x10\x38\x4d\x85\x22\x0b\x64\x43\xa1\x31\x38\xc2\x1d\xf2\x56\x56\x6c\xc2\x3e\x73\x09\xb6\x0a\xc8\x5d\x10\x55\xcb\xbd\x87\x3c\x6e\x4e\x05\x0d\x6b\x82\xb2\x06\x2b\x7c\x17\xea\x27\x77\x22\x96\x3c\x55\xf6\xb1\x59\x73\x20\x56\xf8\xcd\xb2\x35\x02\x8a\x42\x36\x32\x1a\x08\xe8\x12\x06\x2d\x2a\x63\x6e\x2f\x2b\xfe\xc0\x33\x36\x5c\x66\x49\xad\x78\xb1\x74\x8a\x07\x43\xa9\x63\x66\xd2\xb0\xd8\xd6\x1c\xf4\xfd\x95\xca\x89\x90\x1b\xe8\x16\x6e\xc1\x87\x8f\x77\xa4\x60\xba\xb3\x15\x97\x7b\x2b\x0f\x7a\x18\x9e\x58\xe3\xc9\x64\x02\xf6\x94\xd3\x7f\x68\xb9\x34\xcd\x5e\x93\x9f\x99\xf9\xba\x16\xcf\xf5\x8d\x4f\x14\x79\x5c\x09\xd0\xa8\x6b\x69\xe6\x15\xda\x47\x5b\xa0\xbf\x48\xed\xbb\xe7\xfa\x7d\x2d\x16\x22\xb3\xeb\xf4\x02\x59\xff\x92\xb4\x9e\xc3\x9d\x65\xd8\xd1\x54\xd7\x9a\x8e\x1b\x61\xcd\x39\x81\x0d\x94\x45\x20\x56\x1b\x32\x5d\xe5\x3a\xcf\x78\x71\x7f\x46\xb8\xb2\xc4\x4c\x9f\x09\x13\xc2\x58\xdc\xdb\xd3\x5a\x31\x9a\x21\x4d\x1f\x47\x7c\x76\xd9\xf3\xbd\xe8\xb9\x1a\x61\x3c\xbd\x5b\x97\x18\xf5\xd0\x90\x02\x13\x08\xb2\x51\x45\x7d\x14\xa2\xf5\x33\xcf\x38\xa8\x18\xef\x48\x49\xb9\x8c\x43\x88\x3a\xb9\x9e\x5d\xce\xae\x37\x0a\x79\xe1\x6f\x1d\xb3\xbe\xa5\x87\x03\x33\xdd\xcd\xac\xef\x87\x05\x1a\x32\xeb\x0f\x31\x44\x98\xf2\xfe\x92\x65\xb2\xa2\xe5\x45\xad\x56\x57\x5c\x26\xe2\x81\x45\x2b\x35\x16\x36\xcc\x98\xd6\x09\xb7\x8b\x88\xbd\x90\xcb\xbf\x5e\xdc\xc4\xd6\x10\x89\x09\x27\xb0\xe3\x9c\x31\x39\x42\x03\xea\x1f\xa5\xe9\xe3\xe0\x63\x3c\x3a\x43\xbe\x22\x67\x08\xdc\x9f\xaf\xdd\x01\xc2\x0b\xae\x38\x55\x22\x90\x03\xd8\xb5\x0a\xd4\x52\x89\xdc\x5c\x85\x6b\xdb\x01\x38\xb6\x81\x19\x77\xfa\xf4\x73\x64\x07\x47\x98\x83\x76\x95\x48\xde\xa0\xed\x6d\x84\x61\x9e\x91\x82\x3d\xe2\x57\xbd\xdc\xc9\xbe\xfd\x67\x13\x44\xab\xcf\x2a\xcd\xfe\xf2\xf6\xcf\x8e\x1b\xe5\x2f\x4d\x3a\xb6\x49\xd2\xf5\xf4\xd8\x42\xd7\x41\x1d\x83\xfd\x0c\x1e\x84\xf0\x5f\x62\x69\x8f\x31\xdd\xe1\x3a\xff\x67\x4d\x33\x5c\xa9\x0f\xfb\xda\x9f\xba\xab\x1c\x39\x18\xbb\xdb\x76\x75\x3f\x34\x16\x80\x5a\x32\xe0\x82\xf8\x84\xaa\x68\x21\xf5\x92\xc7\x02\x3f\x9d\x18\xa7\xd7\x09\x39\x55\x49\x19\x44\x7d\x3a\x50\x48\x3c\x0e\xd6\xac\xf0\x8f\x4d\x28\xfc\xf0\xd7\x0f\xe8\x21\x82\xf3\x18\x6b\x88\xe9\x0c\xf4\x06\x5e\x25\x3f\x72\xa9\x30\x02\x13\xfb\x82\x42\x59\x10\x18\xed\xf3\xe4\x15\xe4\xfa\x06\x60\x39\xcb\xff\xa6\x69\x5a\xbd\x45\x7e\x66\xc1\x48\x2a\xd0\xde\x44\x53\x0c\x2f\xa2\x7a\xd2\xa9\x5a\x97\x3c\x01\x55\xed\xee\xf2\x06\xfa\x90\xe4\x4f\x7f\x44\xf4\x84\x7f\xff\xc3\x1f\xdf\x78\x36\xf3\xb9\x22\xd5\x47\xda\x3b\x9e\xd1\xdf\xb4\x97\xa0\x30\x36\x36\x12\x04\x95\x59\x5b\x67\xcd\xdc\x55\x3c\x55\x7a\xbb\x1a\x9a\x1d\x2b\xce\x1c\xe3\xfb\x5e\x14\xb7\x0f\xb7\x0e\xe9\xc1\xee\x94\x04\x89\xc8\xcd\x06\x11\x21\xde\x52\x98\xbb\x10\x11\x87\x54\xf8\x04\xa6\xb1\x44\x64\x6f\x6d\x91\xff\xd2\x3f\xd3\x89\xe6\x24\x03\x7f\x71\x57\x7e\x17\x4d\x73\xf8\x4a\x74\xaf\x02\xd2\x0f\xad\x13\x3a\x1e\x3b\xc8\x00\xb8\xfa\x30\xfb\xef\x1f\x2f\xbe\x7b\xf7\xa3\xa9\xe9\x00\x21\x04\x08\xaf\xe6\xf1\x40\xee\x12\xf5\x15\x7f\x93\xfa\x4f\x7d\x60\x83\x8a\x38\xcf\xcc\x87\x8d\x7a\xbe\x05\xf9\x30\x58\xcc\x77\x64\x4e\xfb\xbe\x36\x9c\x62\x31\x30\xf3\x27\x30\x82\x59\x0b\x2b\xfb\xdc\xcd\xea\xd0\x8b\x21\x59\x05\xc8\x8f\x4f\x66\xba\x19\x9c\x28\x79\x01\xbf\x83\x9e\x31\xae\x02\xaa\x7e\x9e\x19\xef\xe6\x71\x78\xd1\x75\x0c\x71\xfe\x2a\x3e\x15\xea\x64\x06\x4f\x5b\xaf\x95\xbe\x25\x18\x6a\x54\x69\x32\xae\x09\x38\x93\x32\x0c\x62\xb2\x79\xc2\x5e\xec\x1c\xed\x6c\xfd\x9b\x98\xf1\xef\x42\xb0\xdb\xa8\x1e\x24\xc9\x97\x19\xe5\x03\x28\x14\x1b\xb7\xb6\xef\x45\xfc\xe7\x0c\x8d\x84\x1d\x57\x4c\x93\xa7\x32\x44\xc4\x05\xa1\xa4\xb7\xcf\x26\x9e\x81\x1a\xf5\x16\xf0\x00\x23\x4c\x1f\x63\x76\xb0\x5d\x86\x89\xdd\xcc\xf6\x27\xfc\x25\xd1\x83\xd9\x99\x20\xc2\xdb\x63\x82\xe7\x2e\xed\x0b\x9b\xb9\x7e\x03\xcb\xe4\x97\xd7\xb7\x17\xd0\x16\x0c\x2f\x85\xcd\x69\xec\x40\xdd\x1f\x9c\x46\xec\xb9\xc2\xe4\x49\x28\xf1\xcf\x23\x73\xbe\xc2\x5a\xff\xfe\xfa\x4f\x88\x0c\x34\x27\x69\xa7\xeb\xbe\x12\x4a\x14\xa3\x03\xff\x6f\x7a\x5e\xeb\xde\x6f\x7c\xe2\x12\x53\x53\xb2\x61\xf3\x40\xd3\x05\xc6\x71\xf6\x95\xdb\x1d\x2c\xac\xbb\xe3\xd5\xfb\x57\x4d\x52\x3d\x18\x24\x44\x4c\x28\x49\x1a\x9d\x0e\x73\x7d\x65\x84\x39\x9b\xf2\x22\xcd\xe1\x20\xed\xe9\x70\xce\x81\x67\xbe\xde\x18\xfc\xfd\xd9\x69\xba\x5b\xd5\x4b\xbd\xa1\x8f\xa2\x8a\x4f\x4a\xbf\xe9\xbc\xb0\x11\xa1\x60\xfe\xb6\x99\x33\x36\x24\xe2\x7f\x29\xb7\x64\x06\xee\x56\x67\x2a\x7d\xde\x14\x7b\x77\x3c\x5b\xdc\x77\xa9\xa2\xae\x8e\xa7\xcf\x9e\x4b\x85\x57\x27\x7c\x65\x7c\x1c\xef\x70\x97\x69\x24\x93\x8a\x4d\x70\x0e\x01\x28\x8d\x4d\x70\xde\x4b\x92\x1f\x59\x69\xf7\x27\xf3\xb8\x51\xf8\xf5\xfe\xb4\xe4\x83\x36\x57\x28\x14\x8a\xf5\xa2\xe5\x70\x9b\x0a\x96\x11\x34\x01\xf1\xc9\x17\xa2\x02\xd8\x2a\x8e\xe9\xcb\x2d\x24\xa7\x49\x51\x3e\x33\xc5\x27\x72\x5a\x0e\x82\x4d\x6a\x92\xe0\x42\x9b\xef\x78\xfd\xc7\x23\xf4\xbf\x0f\xc1\xf2\xbb\xe0\xfb\x51\x24\xc0\x03\xcb\xdf\x0b\xb5\xef\xe9\x74\x08\x84\x3f\x00\xb5\xef\xe9\x71\x2c\x44\xb1\x03\x41\xec\xe9\x35\x1a\x9c\xb8\x05\x1f\x7e\x06\x27\x8e\x39\x86\x91\x07\xc1\x02\xec\xdb\x60\x51\xbc\x06\xde\xea\x04\xe3\xa0\xf5\x6f\x9a\x1e\x71\xa5\x0d\xb6\x40\x5b\xdf\x96\x66\xa2\x58\x86\xd1\x7c\x85\x1b\xec\xc0\xd2\x26\x96\x60\x5d\x7a\x8d\xe5\xb1\xa8\xb3\x81\x72\xd8\x03\x93\x73\x21\x17\xda\x0a\x1d\x6d\x5d\x6c\xc8\x97\xf6\xa6\xdb\x35\xa3\x0c\xa2\x91\x8f\x43\xd0\x0d\x6e\x52\xef\x7c\x22\x2a\x1d\x47\x74\x49\xdc\x6a\xc8\xe1\x9a\xc7\x51\x3d\xf6\xd7\x45\x76\xa3\x4a\x36\xaa\x1f\x47\xf5\xea\xaf\x90\x8c\xbd\xf7\xd4\x41\x8e\xea\x5b\x85\x6a\x25\xf7\x54\x44\x8e\xea\x38\xa6\x6a\x72\x53\x1b\x39\xaa\xc7\x51\xf5\x93\xa3\x27\x3f\xaa\x92\x72\xdc\xb1\x72\xaa\x2d\x07\x6b\x2a\x47\xf5\x38\x50\x77\x79\xa8\xba\x72\x54\x9f\x31\xb5\x4c\xc9\x98\x2b\x3a\xba\x2a\x73\x54\x9f\x24\xaa\x76\x73\xdb\xc6\x50\x1f\x6c\x11\xf5\x9c\xdb\xb6\x67\x65\xe7\xb6\x8d\x02\xa2\xc6\x16\x53\xe8\x61\x60\xa4\xfe\x92\x0f\xd1\x7d\x12\xa7\x38\x84\xbf\xf8\xc3\x88\x2e\x07\xca\x44\x0c\x94\x81\x18\xd1\xb1\xa7\x60\x84\x5b\x10\x62\x54\x8f\x87\x29\x1d\xd1\xb6\xe8\x22\x12\x23\xfa\x1c\x57\x3c\x69\xb3\x8d\x29\x2c\xd1\xb6\xf8\x12\x13\x6d\x8b\x29\x36\xd1\xb6\xf8\xda\xd3\x63\x8e\x73\x53\xa5\x3a\x50\x85\x7a\x44\x9f\xbd\xf5\xaa\xdb\xb2\x5d\x9d\x7a\xd4\x23\xba\xf5\x56\xae\x1e\xd9\xdb\x68\xe2\x13\x0b\x32\x8f\x2d\x54\xb7\xda\x7d\x32\x90\x74\xd0\xb6\xe8\x7a\x38\xee\xe3\xbe\xc8\xa6\xb6\x85\x83\x6c\xb0\x7d\xc9\xa1\x36\xd8\xc6\x06\xdc\x44\x75\x1a\x0e\xca\xc1\x36\xea\x54\x85\x6b\x65\xb7\x6d\x74\xd5\xec\xa8\x69\x35\x95\xb5\x63\xea\x67\x6f\xce\xd2\x6f\x99\xea\x3e\x1b\x71\x66\x83\x95\x18\x9d\x47\xc3\x9a\x9d\xd3\x1b\xe8\x76\xc1\x59\xb5\x02\xcc\xcb\xeb\x76\xdb\x55\xf5\xb6\xca\xde\x45\x6d\x6f\x24\x27\xd8\x55\xbc\x0d\xd5\xe2\x8b\xa4\xc5\x1b\x68\x88\xfe\xaa\x7c\xb1\x7c\x35\xa2\x76\x9f\xf3\xf4\x68\x81\x39\xb6\x9e\x5f\xdb\xe2\x2b\xfb\x8d\x12\x45\xb1\x06\x60\xa0\xc6\xdf\x88\x1e\xf7\xa9\x06\xd8\xb6\xf1\x0b\x4a\x46\x57\x08\x6c\x5b\x5c\xad\xc0\x51\x5d\x92\xb6\xb2\x60\xb0\x6a\xe0\xc8\x8e\x47\xd4\x18\x74\x5e\x1a\xaf\x2a\x91\xb1\x75\x07\xdb\x16\x5b\x81\x70\xe4\xcc\x6d\x80\xc4\xae\xb5\x08\xdb\xb6\xd3\x72\x8c\x13\xe0\xc8\xa8\x4a\x85\x9b\x43\x8b\x96\xd1\xc8\x51\xa9\x3d\x2a\xb5\x91\xed\x37\xa0\xd4\x86\x6a\x29\x8e\xd4\x41\x3b\xa0\x68\x43\x55\x15\x47\xf4\xb9\x5d\x7f\x71\xb0\xbe\xe2\x18\xb5\x76\xb0\x12\x63\xb7\xd2\xe2\x48\xc1\x20\x58\x93\x31\xb2\xe6\xa2\xd3\xeb\x78\xb2\x3b\xb6\x0e\x63\xdb\xc6\x57\x64\x1c\x73\x95\xb4\xbc\x14\x5f\x9b\x71\x44\xcf\xdd\x2a\x8e\xe1\x2a\x8d\x63\xe4\xa3\x1d\xeb\x39\xb6\x6d\x37\xb9\x6c\x74\x8d\xc7\xb6\xc5\x55\x7b\x1c\x29\x47\xb8\xb5\x21\x77\xaf\xfb\xd8\xb6\x1d\x85\xab\x11\xb5\x20\x9d\x97\x22\xab\x42\x8e\x5c\x12\x73\x17\xfc\xf5\x21\x47\xf6\x19\x57\x4d\xb2\x6d\x3b\x2e\xe3\x98\x0a\x93\x6d\x3b\x6c\xad\xc9\x3d\x27\xb1\x8b\x64\x19\x59\x89\x72\x73\x64\x23\x04\xcb\xb1\x06\xcb\x97\x37\x43\x46\x77\x8c\x81\x3b\x07\x30\x13\x99\x7a\x07\xc6\xfb\xff\xe5\x58\x80\x9e\xd1\xbb\x6f\x32\x3a\x03\x18\x8b\x6d\x1b\xe3\xda\x8f\xb7\x3e\x1c\x5d\xfb\x4f\xe3\xda\x9f\x99\x5a\x1d\x47\xbf\x7e\xef\x6c\x8e\x7e\xfd\xb6\x1d\xfd\xfa\x47\x13\xc8\xd1\x04\xb2\xdd\x8e\x7e\xfd\xce\xb4\x8e\x7e\xfd\xa3\x5f\xff\xe8\xd7\xf7\xb5\x83\xfa\xf5\x8d\x78\x8e\x4e\xfd\xe8\xc3\xf7\x85\xf8\xf4\x4d\x95\xac\x8b\x24\x11\x75\xa1\xee\xc4\x3d\x0b\xba\xf6\xa2\x94\xb6\xad\x5e\x83\x13\x7c\x3a\x0d\x8f\xd6\x29\xd7\x9a\xd4\xe8\xdd\xbe\x30\x2f\x5a\x25\x47\x73\x98\x22\x65\x69\xd3\x63\xac\xc9\x57\xbf\xac\xf4\x2a\x4c\xc9\x05\xa9\x58\xc2\x4b\xce\xb0\x0c\x3e\xc5\xdf\xf1\x38\xd8\xf2\x1e\x91\x82\xbe\x64\xd9\xc2\x14\x46\x28\x9c\xc2\x5a\x8e\x6e\x62\x48\xbf\x1d\x6e\x54\xbf\x86\xa8\xc0\xb0\x50\x1c\x10\x16\xa5\xdf\x56\x1c\xab\xd8\x3f\x8c\xc4\x11\x37\x7b\x9c\xf9\x9d\x33\x12\xd7\xe8\x85\x4b\x1b\x53\x17\x6c\x6b\x90\xb4\xe4\x06\xb1\xe0\xd0\x14\x82\x7d\x2e\x79\x05\xc7\x7a\xc6\x12\x51\xf8\xea\x20\xb7\xad\x73\x78\xde\x6d\xf6\x60\x4f\x91\xb1\x2f\x47\xaa\xb1\x69\x5d\x35\x75\x8f\x1f\x68\xc6\x53\xae\xd6\x8d\xeb\xdc\x94\xb8\xa3\x78\xcf\xcc\x42\x47\x75\x7b\x21\xdb\x5d\x26\xb4\x2c\x2b\x41\x93\x15\x93\xce\xbc\x51\x06\x36\x99\x95\x51\x7d\xda\xbc\x17\x2c\x1e\x09\x02\x30\xf4\xab\xe5\xa4\x6c\x4d\x2a\xa1\x6c\xd8\x88\x19\x78\x9c\xfa\xd9\x99\x1c\xaa\x3d\x38\x28\xfc\x04\x8a\x24\xaa\x5a\x43\xfc\x49\x9c\x09\xd5\x19\x0a\xae\x00\x5f\xb8\xff\x23\x89\xc8\x52\x0b\x6e\xf4\xa7\x37\x71\xaa\x1f\xab\x12\x73\xa7\x41\xbd\xe1\x39\x58\x38\x33\x2d\x23\x6a\xd6\xd0\xfd\x40\xdc\x21\x6f\x07\xf1\x87\x6f\xc9\x4a\xd4\x95\x9c\xba\x39\x90\xdf\xc0\x6f\xa8\x9f\xc7\x7a\xc9\xb4\x60\xa9\x48\xc6\xa8\x54\xe4\x9b\x37\x24\xe7\x45\xad\x45\x83\x88\x77\x1d\xd1\xfc\x8f\xdf\x46\x5f\xb7\x58\xa1\x3c\x56\x1c\xdf\x0e\x7c\x30\xb7\xaa\x44\xd0\x73\x23\x95\x1b\xaa\x12\xca\xba\x75\xbe\x0f\x05\x0f\x36\xfc\x90\x86\x15\xb9\x3b\x57\x28\x71\x60\x5a\x13\x2b\xdd\x46\x49\xab\x91\x7c\x3f\xea\xb1\x90\x10\x1b\x4a\x21\x35\x0e\x8e\xde\xbf\x06\x06\xf0\x4b\x2d\xe6\x6b\x15\x93\x53\xfe\x9f\xf8\x64\x37\x99\xdc\xfe\xd8\x0f\x1e\x35\x30\xe1\x4e\x2d\x8f\x16\x3b\xaa\xf7\xe9\xb0\xf4\xb1\xd4\xda\x74\x64\xde\x20\x68\xde\x56\x1b\xb4\x66\xda\x24\x61\x58\x73\xf8\xaa\xad\x16\x57\x08\xec\x37\xb0\x65\x87\xcc\xb9\xf6\x22\x34\xd9\x75\xb6\xf9\x83\x3e\xe2\x7b\xf8\xba\x10\x31\xf2\x70\xc5\x96\x5c\xaa\x11\x25\x78\xf0\xf1\xee\x71\x92\xbc\x58\x62\xc9\x84\xbc\xce\x14\x2f\xb3\x66\xe6\x9e\xf9\x36\x5d\x19\x5e\xe7\x9a\x8c\xa9\x63\x9b\xa4\x08\x5a\x80\x10\x7b\x01\xb7\xc1\x69\xf3\x7d\x56\x28\x44\xea\xaf\x34\x33\x2d\x69\x45\x9b\x85\x85\xa2\xe4\xf2\xb5\xb1\x4b\xd3\xc4\x1b\xfe\x66\xb0\x6f\x34\xe7\xaa\x68\xd6\x2c\x97\xeb\xc0\xdd\xe7\xb0\x29\x56\xd0\xc2\xe3\x05\xea\x9a\x55\xe0\x61\x22\x1e\x6d\x24\xa9\xa9\xc4\xb4\x71\xca\x82\x29\xcf\xdf\xd1\xe4\x9e\x15\x29\x94\xd3\xc3\x25\x49\xd7\x05\xcd\x0d\x86\x69\x53\x74\x8c\xa5\x1b\x3d\x0f\x66\x96\xeb\x86\x56\x46\x4c\x99\xb6\x40\x0c\x81\x4a\xe0\x11\xeb\x53\xcb\x68\x90\xaf\x4f\x52\xcb\x02\x7e\x1a\x21\xd1\xa7\x5a\xf1\x87\x84\x19\xb1\xc9\x33\x25\xfd\xf1\x7d\x06\xff\xe0\xc1\xfd\xd8\x1a\xbe\xc1\xfc\xe0\xce\xc9\x07\xe3\x65\xe3\xe6\x02\xc4\x3f\x9a\x69\xb2\xe0\xd3\x7f\x6c\x62\xfd\xc6\xa1\x98\xaf\xf7\x2d\xd8\x15\xae\x51\x85\x57\x63\xe0\xcf\x1e\x3c\x86\x00\xaf\xab\xe6\x31\x38\x09\x27\xb7\xdf\x5d\x75\xa9\xd2\x2d\x4d\x85\x24\xdf\x65\x22\xb9\x27\x57\x0c\xf4\x00\x97\xdf\x0d\xac\xc4\x26\x84\xe2\x9e\xb5\xab\xaa\x79\xba\x7f\x6d\x81\x23\x1e\xfe\x57\x84\x87\x5f\xcd\x7d\x0b\xf0\x75\xa0\xe1\xe7\x74\x19\x5f\x4e\x45\x6b\xec\x70\xd5\xe0\x35\x0b\xd3\xba\xe3\x15\xf9\xdd\x4a\x3c\x4e\x94\x98\xd4\x92\x4d\xb8\x27\xf0\x25\x62\x16\xf7\x6c\xad\xff\x1a\x3b\x8f\xbf\xe1\xe3\x1d\x75\x49\x09\x70\x3c\xc0\xef\x9a\xe3\xdf\x7e\x77\xa5\xd9\x4c\x0c\xba\x1b\x97\xe4\x9c\xa9\xe4\x3c\x61\xe5\xea\xdc\x0c\xe5\x8b\x58\x96\x5c\x14\x5c\x89\x2a\xba\x02\xde\x05\x49\x44\x96\x19\x54\x0d\xb1\x20\x97\xac\x5c\x35\x9d\x3c\xfd\x8c\x9e\x0b\x21\xbd\x14\x22\x16\x41\xda\x39\xf2\xfa\x2d\x73\xe2\x9d\x8d\xaf\xe6\x63\x09\xcc\x73\x1f\x82\xaf\xac\x00\xf1\x13\x2c\xcf\x61\x81\xe5\x4f\x66\xf6\x05\x50\x43\x1d\xdf\x53\x17\x47\xde\x74\xec\x59\x21\x97\xcc\x90\xeb\x05\x8a\xe3\x29\x4b\x89\x78\x60\x55\xc5\x53\x26\x49\x43\x4d\x5c\xcd\x97\x67\x07\x2a\x10\xb8\xd3\x9a\x1e\x61\xf0\x5f\x14\x06\x7f\x84\x9a\xe4\x10\x2f\xfd\xd6\x36\xf1\xa2\x69\xce\x8b\x91\xb0\xae\xcf\x4b\xbe\x82\x70\xf6\x5a\x0e\x19\xf8\x9b\x65\x5c\xbb\x28\x22\x32\xa1\x19\xbb\xfe\x18\xa1\x8c\xcc\xf0\xc9\xae\x3e\x62\x7f\x74\x90\x4d\x77\xc2\x72\xfc\x5b\x73\xd8\x49\x21\xd2\x21\xdb\xf4\x6f\x17\xed\xd4\x39\xcb\x08\xe6\xb8\x0f\xa3\x5c\x52\xc5\x1e\x69\x74\x95\x71\x3b\x95\x2e\xa6\x78\xb3\xf5\x17\x37\xd7\xe4\x07\xec\x71\x3f\x90\xd5\x4a\x28\x94\xc8\xae\x44\x4e\x79\x74\x25\x25\x07\x1c\xda\x1d\xd6\x4d\xd3\x1d\xc1\xfe\x34\x17\x0a\xe8\x19\x88\x3b\x56\x6b\x3d\xcb\x68\x40\x47\xa4\xcb\x03\x0b\x15\xad\x4c\xe1\x18\x81\x6c\xa8\x6f\x5b\xc4\xc6\xec\x62\xc0\x90\xd5\x3a\xaa\x89\x64\x85\xe4\xe0\x05\x72\x82\x13\x4c\xfd\x50\x2c\x3e\x8b\x91\xba\x28\x78\xf8\x6e\xde\x8f\x62\xc9\x0b\x7b\x6f\x85\x71\x69\x2e\xa8\x4f\x16\x39\x4a\x0a\x2f\x2a\x29\x48\x99\xbd\x2b\xe8\x3c\xf3\xb9\xd3\xba\x84\x3f\xa3\x4b\x7d\xe8\x18\xbc\x75\x9e\x72\xa9\xff\x4b\x66\xb3\x1f\xc1\x90\x5e\x17\x56\xb2\x0d\x84\x36\x1b\xb2\xd7\x64\xf3\xe0\xb5\xdd\xef\x3e\x21\xdd\x19\x81\x44\x7a\x5d\xa4\x7a\xb8\x4c\x76\xe2\x93\x4c\x3f\x08\xb2\xda\x84\x98\x43\x24\x87\xdf\x5f\x73\xb7\xe2\xc9\xfd\x8d\x63\x2f\x17\x95\xfe\xad\x70\x7e\xea\xb0\xa3\xcd\xbf\xed\x43\x30\xcd\xa0\x6f\xe2\xd5\xd6\x3b\x87\xe2\xcf\xcc\x94\xf5\xeb\x84\x4a\x29\x12\xde\x3a\x48\x02\x80\xa9\x2d\xb3\x48\x81\x59\xec\x37\x0d\xe0\xf4\x3b\xf2\x2f\xbb\x71\xb6\x30\xb6\x74\xb8\x92\x5f\x09\x35\xeb\xb0\xd7\xd0\xf1\xa0\x8c\xa8\xd4\x70\xd7\xa9\xcd\x60\x65\x3f\xb4\xe8\x37\x76\x7b\x63\x01\x0c\x13\x75\x2b\x8d\x99\x72\x38\xdb\x9b\xd8\xd4\x68\x30\x8e\xe6\x27\xb4\xfd\x1b\x29\x69\xe0\xaf\x0d\xdf\x1b\xfa\xfb\xb0\xcc\x18\x92\xc8\x3d\x49\x54\x7d\xfa\xf9\x86\xdb\x12\x7f\x33\xc6\x7e\x08\xdc\x2a\x45\x59\x67\x74\xd0\x6f\xb9\x55\xf8\x62\x8f\x12\x30\xf8\xf5\x5d\x5d\x02\xe3\x51\x98\xfd\x49\x06\x5d\x40\x66\xbf\x05\xdf\x42\x35\xc7\x01\x32\x87\x21\x46\x94\x20\x6f\xfe\xf8\xed\xb7\x43\xe0\xcd\x83\x10\xcd\x5e\x09\xd5\x07\xde\xec\x83\x68\xf6\x76\xea\x05\x6f\x1e\x4a\x11\xf0\x39\xeb\x86\xc1\x9b\x87\xc5\x81\xc3\xa1\x37\x07\x6c\xab\x63\xf3\xf9\xdc\x5c\x3d\x9f\x85\x2b\x9c\xc5\xd7\x9f\xdf\xe6\xe9\xd3\x93\xbb\xe7\xcf\xcb\xf3\xf5\xd9\x93\xb1\x17\x99\x8d\x17\xd0\x9d\xda\x40\x87\x43\xe5\xe0\x8d\xca\xbc\x73\xb3\xea\x02\x23\xf5\xe7\xdb\x0d\xe4\xd2\x79\xfa\xec\xcf\xb2\x0b\x67\xd0\x79\xba\xec\xe4\xd6\x05\x32\x2d\xc6\xa1\x89\x87\x73\xe4\xa2\xb2\xdf\x62\x23\xb1\x23\x32\xdd\xf6\xcc\x6f\x8b\x0e\xba\x8b\xc9\x65\x1b\xc3\x5c\xda\xbc\xb4\x40\xa7\xc4\x9f\xb7\x36\x94\x8d\x16\xec\xb5\x3f\x5b\xcd\x97\x83\x16\xec\xd2\xcf\x46\x76\xcb\x3c\x8b\xce\x37\x73\x58\x46\xb0\xd3\xe8\x2c\xb3\x31\xb9\x65\xf1\xc1\xab\x31\x81\xab\xf1\xd9\x63\x4e\x4e\x58\x70\xe2\xfe\x9c\xb1\xfe\x4c\xb0\xa8\x93\xb4\x9d\x29\xe6\xcf\xff\x0a\x76\x1a\x93\x1f\x16\x79\x79\x63\xa2\x65\x43\x19\x60\xc1\x48\xda\x83\x84\xc7\xc6\x64\x19\x8d\xcf\x2d\x6a\xb8\x8b\x97\xca\xfb\x53\x8a\xe2\x8d\x79\x63\xea\xf4\xb9\x36\x2a\xa3\x7a\x58\x01\x17\x03\x8c\x5a\xd0\x42\xaf\x04\x51\x0f\x38\x49\x0f\xa5\x7c\x90\x98\xc3\x16\x52\xcc\xf0\x7b\x22\xa6\xb0\xad\xb1\x45\x7c\x9c\x6d\xb8\x4b\x9a\x9f\x8f\x5e\x92\xaf\xbc\x26\xdc\xd1\xb8\xbf\x3d\xc9\xd6\xb8\x2f\x3b\x10\x4a\xd6\x28\x81\xb2\xd3\x42\x54\x44\xcc\x0d\x78\x6c\x40\x56\x6f\x2f\xcc\xc5\xcd\xb5\xd6\xe7\x21\x63\x8c\x66\x72\x4a\x7a\xf2\xf7\x8d\x18\x14\xd2\x7f\x5a\x0d\x87\x2a\xc5\xf2\x52\xf9\x8e\xc2\xd1\xb6\xff\xa2\xb6\xfd\xd1\x06\xc9\x9f\x9a\x17\x9a\xd2\xc8\x75\x4e\x8b\x89\xbe\x6d\x60\xe5\x77\x8c\xad\x9e\x19\x6c\x52\xea\x29\xb1\xd1\xcc\xb0\xa0\x60\xba\x81\x44\x86\x4e\x8d\x76\xe2\xb3\x11\xb4\xd5\x7b\x0f\x63\xa1\x85\xbe\x46\xaf\x0a\x32\xe3\x8d\xfb\x99\x88\xcd\x98\x5a\x2f\x09\x82\xa9\x36\x2b\x64\xaf\xa2\xc3\xeb\x3b\x1a\xbb\x5a\xb1\x50\xf4\xfe\x0d\x64\xdf\xb4\xef\x77\x75\x18\x54\x62\x68\x96\x89\x47\x1c\x6f\xcb\x07\x03\xcb\x0d\x33\xc3\x14\x41\xc8\x45\xe1\x5a\xd1\x37\xd6\x64\x77\x0a\x40\x93\x94\xd6\x92\xbc\x82\x3f\xa8\x06\x95\x71\x2d\xce\x98\x72\x0f\x9b\x56\xa3\x0b\x0c\x48\xd7\xff\xb6\x91\x4d\x81\x89\x5b\xc7\xd1\x9c\xad\xe8\x03\x17\x75\x85\xfd\x2a\x41\x5e\x99\x3f\x01\xd3\x5a\x8b\xba\x31\x16\xd6\x81\x80\xd9\x66\x15\x65\xcf\x4e\x7d\x68\xff\x08\xca\x5c\x2a\xac\x1d\x65\xc2\x3e\x73\x6f\x3a\xe1\xd6\x9a\xd9\x4d\xb2\xa8\x9d\x4f\x26\x78\x3d\xc8\x52\x73\xc5\xe8\x92\xa3\x3f\xb9\xcf\x77\x05\xb0\x87\x19\xfc\xe9\x6b\x2b\x38\x7a\x14\xc1\xfa\x5a\xe3\x2e\xcc\x78\xb2\x8e\x2e\xb6\xd9\xba\x09\xf5\x6b\xe4\x3b\x2a\x59\x4a\xde\xd3\x82\x2e\x51\xf7\x3d\x9d\xdd\x7c\xf7\xfe\xb5\xde\xc2\x80\x79\xe3\xfa\xaa\xcf\xcb\x68\xfb\xc7\xee\x3f\xec\x97\x9f\xb2\x31\xc7\x11\x6c\xf0\x60\xb3\xdc\x33\xc3\xc6\x32\x2c\x3f\xda\xf9\x76\x82\xef\x66\x11\xe5\x8d\x8b\xfb\x90\xa7\x4f\x58\x1c\xb9\x1d\xf2\x78\x72\x35\xdc\xf7\xa4\x1f\x76\xcf\xd3\xdb\x90\xb5\xe1\x91\x66\x97\x22\xd7\x64\xad\x0f\x95\xbf\x0b\x48\x00\x21\x0e\x98\x6c\x81\x8f\x5b\x3e\x0f\x9a\xc7\x84\xae\x18\x4d\x49\x26\x96\xa6\x0c\xfe\xac\xa0\x65\xd9\x13\xc8\x05\x2c\x78\x91\x51\xc8\x25\xc0\xb2\x06\x0f\x94\x67\xd0\x39\x2f\x2c\x5c\x3c\x04\x87\xdd\x54\x22\x67\x6a\xc5\x6a\x49\xfe\xf2\xbf\xc8\x1f\xa6\xdf\x7c\x33\x7d\xb3\xd9\xe1\x90\xf6\xd1\xbb\x18\x52\x51\x55\x77\x28\x69\x57\x98\x7e\xaf\xe9\x57\xc5\x30\x13\x7f\x0e\xd8\x10\xa9\x79\xc9\x4e\xd6\x19\x53\x92\xd5\x52\xb1\x0a\x55\x2e\x48\x46\xed\x0e\xee\x83\x50\x84\x17\x49\x56\xa7\xe0\x6d\x60\x85\xc5\x6e\x80\x84\x89\x4a\xe4\x5d\x10\x8a\x33\x5c\x8d\xe6\x0f\xed\x97\x3a\xbd\x7e\x04\xf2\x2a\x2a\xd0\x63\x10\xc5\xa3\x57\xde\x5f\x72\xb5\xaa\xe7\xd3\x44\xe4\x8e\xe8\x7f\x6e\xa2\x52\xd4\xfa\x7c\x9e\x89\xf9\x79\x4e\xf5\x0c\xb4\x22\xa0\x2a\x3e\xaf\x95\xa8\xe4\x79\xca\x1e\x58\x76\x2e\xf9\x72\x42\xab\x64\xc5\x15\x4b\x54\x5d\xb1\x73\x5a\xf2\x49\x22\x8a\x07\x7d\x91\x44\x21\xa7\x79\xfa\x3b\x4d\x7c\x27\xb4\x48\x27\xb8\x44\xae\x1c\x3f\xc4\xb7\x9a\xbd\xbe\x65\x9a\xbc\xd3\x2d\xb6\xd6\x35\x76\x0a\x45\x33\x52\xd4\xf9\x9c\x55\x10\x17\xd0\x9c\x94\x52\xa4\x12\x15\x5f\xcc\x36\x6d\x50\x09\x72\x5e\xe8\xed\x58\x1b\xd4\x8c\x6d\xf8\x65\x45\xab\x25\x73\xab\xd8\x3a\x3b\x9a\xb2\x32\x13\xeb\xbc\xc7\x9d\xe4\xb3\xfe\x0e\x5b\x7b\x4b\xaa\xe5\x4e\xef\x14\x6f\x5b\xa1\xc2\x5a\xee\xb4\xf4\x47\xb1\xf2\xab\xcd\x3e\xaf\x8b\x94\x55\x19\x05\x90\x8a\x1c\x68\xef\xb6\xa4\x61\xd4\x35\x10\xef\xe6\x4c\x3f\x59\xb2\x4a\x8f\x5b\x4b\xbe\xa0\xda\xa7\x5a\xe8\x60\x4d\xdf\x8d\x77\xae\x79\x2c\xf2\x6e\x69\xda\xb4\xc3\xee\x15\xa2\x98\x28\x56\xe5\xbc\x00\x3e\x07\x5b\xe8\xd9\x8d\xad\x09\xb6\xbb\x43\x4e\xd5\x8a\xf1\xca\xd4\x40\x21\x39\x55\x89\xb1\x28\x03\x22\xb0\xa8\x5e\x1f\x66\xff\xea\x62\xbf\xf3\xea\xbc\xbf\xcf\x74\x0f\x34\x99\x32\xd5\xeb\xbe\xd3\x44\x0e\xb8\x75\xc0\x8f\x57\xf4\x01\xcd\x4e\x29\x93\x9a\xc7\x59\xb2\x0f\xca\xde\x21\xa6\xdb\xc7\x3c\x27\xdb\xd4\xa7\xf3\x57\xbc\xad\x9d\x9f\xaa\xbe\xe7\x7a\x4e\x45\xf7\xef\xdd\x85\xf6\x33\xa5\xcd\x81\x4e\x60\x09\xfe\xad\xf7\x79\xb3\x48\x6f\xc9\xc3\x37\xed\xff\xc1\x46\x4e\x0c\xe0\x3a\xfc\x01\x61\xb9\x58\xfa\x96\xa8\xaa\x46\x31\xc1\x08\x7f\xe6\x97\x96\x0d\xd2\x24\x61\xa5\x62\x29\x68\x73\x38\x84\x7b\x5e\xa4\x6f\xc9\x2b\x84\x06\x2f\xb3\xba\xa2\x99\xf9\x5f\x4d\x50\x39\x90\x8e\xb7\xe4\xff\xfe\xbf\x7f\xc3\x5e\x59\xfa\x93\x1d\x87\xfe\xf1\xff\x07\x00\x00\xff\xff\xf5\x38\x0c\x17\x32\x52\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: 348722, 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\xfd\x7d\x73\xdc\xb8\xb5\x20\x0e\xff\x9f\x4f\x81\xf2\xa4\x4a\xf6\xf3\x74\xb7\xec\x24\x9b\xca\x7a\x53\xbb\xa5\x48\xf2\x5c\x55\x6c\x59\x2b\x69\x3c\x9b\xdf\x4b\xcd\xa0\x49\x74\x37\xae\x48\x80\x01\xc0\x96\x3a\x9b\xfd\xee\xbf\xc2\x01\xc0\x97\x26\x01\x82\xad\xd6\xd8\xc9\x90\xb7\xea\x66\xdc\x22\x0f\x80\x83\x83\x83\xf3\x7e\x7e\x33\x9f\xcf\x7f\x83\x0b\xfa\x85\x08\x49\x39\x7b\x8f\x70\x41\xc9\x93\x22\x4c\xff\x4b\x2e\x1e\xfe\x24\x17\x94\x9f\x6e\xdf\x2d\x89\xc2\xef\x7e\xf3\x40\x59\xfa\x1e\x9d\x97\x52\xf1\xfc\x96\x48\x5e\x8a\x84\x5c\x90\x15\x65\x54\x51\xce\x7e\x93\x13\x85\x53\xac\xf0\xfb\xdf\x20\x84\x19\xe3\x0a\xeb\x9f\xa5\xfe\x27\x42\x09\x67\x4a\xf0\x2c\x23\x62\xbe\x26\x6c\xf1\x50\x2e\xc9\xb2\xa4\x59\x4a\x04\x8c\xe0\xc6\xdf\xbe\x5d\xfc\x6e\xf1\x87\xdf\x20\x94\x08\x02\x9f\xdf\xd3\x9c\x48\x85\xf3\xe2\x3d\x62\x65\x96\xfd\x06\x21\x86\x73\xf2\x1e\xa9\x0d\x66\x5c\x8a\x32\x23\x42\x2e\x72\xce\xa8\xe2\x82\xb2\xf5\x22\xe1\x82\x70\xb9\x48\x78\xfe\x1b\x59\x90\x44\x0f\xbe\x16\xbc\x2c\xde\xa3\xfe\x97\x0c\x3c\x3b\x49\xb3\xc0\x7b\x00\x7d\xab\x41\xc3\xaf\x19\x95\xea\xaf\xfb\x7f\xf9\x48\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\x81\x3d\x30\xfe\xc8\x3e\x50\x92\xa5\xf2\x3d\x5a\xe1\x4c\x92\xdf\x20\x24\x13\x5e\x90\xf7\xe8\x5a\xcf\xaa\xc0\x09\x49\x7f\x83\xd0\x16\x67\x34\x05\x74\x98\x79\xf2\x82\xb0\xb3\x9b\xab\x2f\xbf\xbf\x4b\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\x92\x44\x2d\xd0\x9d\x46\x94\x90\x48\x6e\x78\x99\xa5\x9a\x88\xb6\x44\x28\x24\x48\xc2\xd7\x8c\xfe\xa3\x82\x2c\x91\xe2\x30\x64\x86\x15\xb1\x1b\xe3\x1e\xca\x14\x11\x0c\x67\x1a\x8b\x25\x99\x21\xcc\x52\x94\xe3\x1d\x12\x44\x8f\x81\x4a\xd6\x80\x06\xaf\xc8\x05\xfa\xc4\x05\x41\x94\xad\xf8\x7b\xb4\x51\xaa\x90\xef\x4f\x4f\xd7\x54\xb9\xf3\x90\xf0\x3c\x2f\x19\x55\xbb\x53\xa0\x6a\xba\x2c\x15\x17\xf2\x34\x25\x5b\x92\x9d\x4a\xba\x9e\x63\x91\x6c\xa8\x22\x89\x2a\x05\x39\xc5\x05\x9d\xc3\xc4\x19\x1c\x87\x45\x9e\x7e\x27\xec\xe1\x91\x27\x8d\x99\xaa\x9d\xde\x77\xa9\x34\x85\x56\x3f\x03\x45\x7a\xf1\xae\xa9\x12\x51\xbd\xaf\xe6\x33\x33\xff\x1a\xbd\xfa\x27\x8d\x95\xdb\xcb\xbb\x7b\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\x5e\x1c\xed\x1a\xc3\x72\xae\x51\x3a\x8c\xf8\x26\x33\x6b\xbf\x68\xb0\x55\xfd\xec\xb8\x4c\xff\x0e\xdd\x15\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\x55\xe0\xaf\xd6\x8c\x57\x3f\x5f\x3e\x91\xa4\x54\x7b\xdc\xd6\x3b\xf7\xfb\x0d\x71\xf3\x24\x02\x3d\xd2\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\x4f\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\x48\xd5\x26\xb0\x7a\x82\xd6\x5a\xe6\x20\x52\x21\x59\xe6\x7a\x12\x8f\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\x75\xc5\x94\x2d\xa3\x9c\xb9\xbf\x77\xa8\xc4\x3f\x4c\xcf\x36\xcd\x10\x51\xc9\xe2\xcd\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\x65\x90\xf4\xca\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\x5b\x90\x18\x34\xb0\xd7\xf2\x0d\x6c\x2e\x00\xdb\xd0\xf5\xc6\xed\x21\x16\x04\x7e\x6b\xd3\x44\xdf\xe1\x85\xe9\x29\x92\x7b\xce\x2e\xda\x3f\x78\x67\x0c\x91\xbc\x50\xbb\x06\xa5\x35\xf6\x58\x11\x91\x57\x2b\xc4\x20\xb5\xfa\x1e\x73\x9b\x48\x33\x7f\x9a\x17\x19\x4d\xa8\xb2\x94\x87\xde\xa2\xd7\x40\x7a\x54\x9d\x48\x38\x36\x73\x5e\xbc\x59\xa0\x33\x27\x0a\xfb\x9e\xe1\x49\x31\x5e\x8d\x6c\x87\xd0\x13\x95\x3c\x00\xb4\x1a\xdf\xfb\xce\x10\x07\x6c\x4e\x8e\xb0\x84\x84\xde\xda\xc7\xb7\xa1\x1a\x49\x32\x92\x28\xcd\x87\x89\xc8\x67\x08\x4b\xc9\x13\xaa\x25\x89\x6a\xff\x83\x20\xd1\x1e\xa9\x19\x34\xfb\x17\x14\xbf\x28\xfd\xec\x13\xee\xd0\xfb\x9d\x25\x6a\x45\x43\x9f\xb4\xf6\x52\x9b\x0c\x63\x10\x22\xd2\x67\x5c\x7f\x7f\x22\x51\x86\x97\x24\xeb\xdc\x9b\xdd\x67\x80\xee\xbd\xd3\xf5\x4e\xd3\x8a\xa4\xf6\x2f\x11\x80\xed\xe5\xa3\xe5\x13\x4c\x99\xb4\x62\xf8\x0c\x61\xf4\x40\x76\x46\x62\xd7\x4a\x41\xa1\x59\x17\x5c\xc2\x58\x45\x41\x15\xc4\x5c\x2e\x9a\x07\x3c\x90\x1d\x00\xb2\x22\x7e\xc4\xf7\xf1\x3b\x6f\x9e\x07\xd2\x2b\x6c\xf4\x3d\x9d\x4b\x1c\xf6\x0a\xe6\x08\x98\x00\x4e\x3a\x06\x7f\x08\x34\xb5\x22\xa3\x04\x44\xed\xc8\x6f\x7a\x25\xdf\xd0\xe3\xb6\xe0\xa0\x75\xde\x56\xfa\x85\xd9\xd8\x13\x69\x36\x48\x9f\x95\x0d\x2d\xa2\xd7\xa9\x38\x50\x17\x1c\x15\xa7\xb0\x7d\xd1\x1a\x72\x35\x3d\x09\x9c\xff\x8a\xf9\xa5\x92\xfd\xe7\x9a\xab\x2b\x36\x43\x97\x4f\x54\xea\x0b\xff\x82\x13\x79\xcd\x15\xfc\x73\x81\xbe\x57\x86\x06\x3f\x0e\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\x2b\x3d\xdc\xc7\xd6\x20\xf1\x07\xb2\x9e\xcc\x06\x6f\x41\x08\xa3\x6c\x9d\x55\x62\xd5\x0c\x3d\x6e\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\x2b\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\xbf\x90\xac\x11\x09\xd4\xd8\x53\x46\x98\x75\x7e\x34\x76\xae\x7d\x3b\x0e\x08\x36\xce\x79\xd5\x32\xd9\x0c\xac\x48\x8b\x09\x77\xf6\x2e\xbb\x07\x13\x11\x65\x00\x44\x60\xb6\x26\xe8\xdd\xfc\xdd\xdb\xb7\x61\xca\x5a\x71\x91\x63\xf5\x5e\x53\xf9\xef\x7f\x17\x81\x13\x7b\x1a\xbc\x6f\x0e\xd3\xc3\xbc\x61\x11\x0b\xbc\x64\x70\xeb\xb7\xd6\x0e\xef\xd0\xd0\x66\xfb\x2c\xcf\xcf\xf0\x4f\x58\x2e\x57\x99\xa8\x5b\xc6\xef\x8e\x2b\xc1\xbb\x38\x6b\x75\x16\x9a\xb9\x2b\x94\x13\x85\xb0\x6a\x99\x36\x69\x4e\x2a\x0f\x92\x71\x83\x18\x47\xa3\x17\xa2\xf3\x8d\xa4\x88\x33\x6b\xb9\xd6\xb4\xb3\x88\x9c\xb1\xdf\xdb\xd1\x74\x8a\xa0\x84\x60\x49\xb4\x0c\xb1\x24\xd5\xac\x79\xae\x67\x49\x99\x72\x0c\x50\x4f\x99\x38\xac\x7a\x01\xbf\x26\x8b\xf5\x02\xa5\x25\x80\xc3\xcc\x7a\x50\xdf\x98\x55\xcb\x9d\x54\x24\x07\x1f\x0b\x17\xf0\x3f\x7a\xf9\x4a\xec\x90\xf2\x5b\x74\xc9\x96\x30\x55\xe2\x2c\xdb\x21\xb2\xa5\x89\xaa\xf0\x07\x4e\x5e\xaa\x8c\x3f\xcc\x77\x5a\x62\x04\xd6\xfd\xd3\x18\xe4\xd3\x7b\xe2\x9b\x21\xc5\x85\x57\x53\x51\x1a\x1e\xb8\x7f\xc2\x87\x54\xbf\x06\x94\xf3\xf9\xd6\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\x9e\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\xfe\xc1\x19\x31\x91\xce\xfa\x98\x81\x65\x95\xab\x0d\x11\xfa\xf5\xd7\xf2\x4d\x6f\xa4\xea\x14\xa5\xdf\xfb\x4c\x51\xfa\x53\x94\xbe\x7d\x9a\x51\xfa\x1b\x2c\x0d\x5d\x9a\x8b\xd0\x1f\xb4\xdf\xe0\x0e\x9a\x01\xfd\xb7\xe0\x7c\xbf\x52\xcc\xbe\x26\x42\x4b\x2c\x90\x66\x58\x6f\xbc\x59\x57\x6a\xdd\x91\x24\xbd\x69\xaf\x26\xc0\xbd\x8d\x0e\x07\x93\xc6\x69\x4a\x52\x54\x10\x31\x37\xa4\xc7\xd1\x8a\xb2\xb4\x67\x2d\x6e\xfd\x5e\xb0\x91\x71\xf4\xed\x49\x8e\x70\x5d\x34\xbd\x2b\x2d\x06\xbd\x1f\x55\x3f\x70\x17\x56\xfb\xf7\x92\x51\xf5\xa0\x79\xb9\xcb\x6d\xbc\xca\x0e\x7a\xdb\xdf\x4b\x22\x76\x88\x6f\x89\xa8\x35\x93\x2a\x07\x33\x46\x09\x81\xbb\x87\x4a\x94\x60\x69\x18\xf5\xb0\xa8\x35\x4e\x3b\x1d\xef\x07\xe9\x2c\x76\x1f\x84\xd1\xf2\x9d\xcd\x02\x10\x11\x29\xbd\xf5\x9a\x36\x7a\x9c\x53\x58\xc4\x8a\xf0\xc6\x75\x15\xf5\xf2\x28\xe1\xb4\x77\xb7\x3d\x26\x8f\x78\xb5\xa0\xe1\xc6\x1b\x30\x7b\xc4\xc3\xdc\x33\x8f\x3c\xd3\xf4\x81\x0e\x30\x7f\xa0\x71\x26\x10\xb4\x8f\x5e\x3d\x4b\x7b\x4f\x77\xad\x21\x23\x80\x36\xe8\x6b\xbc\x45\x04\x1d\xa6\x8f\x8c\xb7\x8c\xa0\xfd\xe5\x57\xdb\x27\x3a\x66\x92\x51\x8b\x6f\x9a\x54\xfc\xa6\x92\x51\x20\x3b\x66\x95\xb6\xb9\x04\x68\xab\x65\x31\x79\x69\x64\x8f\xb3\x96\xa0\x7d\x54\x5b\x5b\x01\x05\xd5\x79\xcf\x76\x32\x0a\x31\x6d\x3b\x8b\xd7\x7e\x32\x0a\xa6\xcf\x98\xd1\xb6\xa1\x8c\x06\xd9\xb5\xb7\x74\xec\x28\xc7\x99\xa6\x9d\x62\x6d\x88\x18\x05\xd6\x14\x6f\x38\xa6\x31\x02\x8d\x37\x48\xa0\x43\xe9\x72\xac\x61\x02\x8d\x34\x4e\xa0\x11\x06\x0a\x34\xd6\x48\x81\xc6\x1a\x2a\xd0\xe8\xf5\x82\x08\xf1\x11\x42\x20\xe2\x96\xab\xd5\x0b\x7d\x66\x71\x76\x33\xfa\x36\x1a\xbd\x83\x5d\x69\xc7\x4c\xd5\x08\x3a\x39\x2e\x34\x97\xf8\xdf\xfa\x6a\x06\xc2\xff\x3f\xb1\xf7\x28\xa6\x42\x6a\x51\xd8\x1a\xff\x1a\x10\x9c\xcd\xa1\x31\x58\x24\x50\x3d\x1b\x2a\x91\xa6\x9d\x2d\xce\xb4\x00\x62\xc2\xb6\xac\xaa\xa6\x67\xba\x2f\xaf\xc5\x9e\xef\xc7\x8d\x56\xcf\xf5\xe5\x6b\xd4\x3c\x2a\xd1\xab\x07\xb2\x7b\x35\xeb\xf0\x91\x57\x57\xec\x55\x2c\x54\x6c\x55\x95\x16\xcf\xa8\x24\x1f\xce\xb2\x1d\x7a\x05\x7f\x7b\x15\x7b\xb0\xfb\xc4\xc5\x31\x82\xe0\x01\x46\xb9\xa8\x97\x99\xab\xac\x33\xd6\x01\x58\x7f\x58\xd9\x57\x9c\x62\x5c\xff\x29\xc6\xda\xe8\x24\xa8\xbb\xae\x1c\x84\x5e\x57\x69\xe3\x6b\x8d\x79\xf5\xc6\xaf\x4a\x37\x96\xd4\x8a\x44\x03\x91\x3f\x27\x98\x49\xf4\xca\x59\xcf\x4e\x64\x3d\xc7\x57\xc7\xf3\x38\x8e\x3a\xc3\xf1\xbc\x48\xd9\x00\xb6\xbf\xc6\x88\xab\x7b\x3a\xbe\xb5\x16\xda\x8a\x41\x4b\x52\x9b\x17\x53\xf4\xda\x69\xba\x7e\xdd\xbb\x7e\xb8\x80\x28\xca\xd6\xe7\x4c\xd1\x79\x05\xa3\xd6\x7f\xb5\x46\x18\xcb\x5e\x5d\x58\x73\x9b\x02\x9c\x71\xb3\xb2\xdb\xd5\x14\x15\x73\x82\x1f\x37\x44\xb4\x56\x4a\xa5\xad\xc4\x04\x1e\x08\x51\x32\xa6\xc7\xe5\xcc\x9a\xf5\xa2\x40\x6a\x36\x63\x0a\x0a\x59\x33\x89\x11\xfb\x61\xd5\x20\xfb\xd7\xbb\x14\x19\xea\x88\x9c\x01\x13\xaa\x3c\xd9\x98\x49\xce\xec\x21\xd2\xbf\x38\x4b\x1c\xe0\x85\xa4\xb1\x98\xa5\xd5\x1a\x17\xe8\x12\x0e\x41\x73\x72\x54\xc2\x4e\xe2\x2c\xe3\x8f\x31\xdc\x27\x9a\xaa\xe3\x64\x83\x79\x73\x32\xc7\x70\x19\x8c\x0e\xb3\x7f\x3c\x72\x98\xfd\x9e\xe9\xe9\x5f\x24\xca\x3e\xd2\xa8\x37\x85\xda\x4f\xa1\xf6\x8d\x50\x7b\xf8\xc8\x70\xbe\xe1\x98\x7b\x3f\xcd\x40\x2c\x7e\x6c\xcc\x3d\xfa\x71\x43\xe0\x44\x05\x0c\x6c\x7a\x8b\xf2\x32\x53\xb4\xa8\x1d\xd6\xd2\x4c\x2d\x33\xea\xa3\x09\x54\x92\x7b\xd6\xd9\x50\x46\x00\x4e\x36\xfb\xc7\x04\xc6\x01\x87\xb6\x04\x8e\x6c\xdd\x2c\x38\xcb\x6c\x6c\xbd\xd6\x2b\xfd\x7b\x44\xac\xaf\x8a\x1e\xc7\x84\x7f\x51\x15\x32\xb4\x46\x13\x70\x4e\xbc\xd6\x97\x65\xa6\xc9\x41\x5f\x59\x8e\xab\x85\x7c\xae\x9d\xfb\xd7\x58\x65\xb6\xc4\x39\x48\xd6\x74\x4b\x58\x7d\x09\xbf\x96\x6f\xde\x0c\x85\x35\xa9\x48\xd1\xa3\x2b\x58\x04\x80\xf6\x89\x1c\xb3\xc8\xeb\x3e\x00\xb6\x12\x04\x22\xae\xf9\x3f\x37\x6e\xaf\xff\x1e\x80\x59\x3b\x87\xbc\x17\x3c\xa0\xa7\xba\xe2\xab\x0d\x0c\x00\xa5\xc3\xab\x89\xb3\x83\x8e\x70\x23\x1c\xe0\x42\x40\xd4\xcf\x4e\xcc\x33\xc6\x7d\xf0\x8b\xa5\x4f\x44\xb8\x0c\xc6\x84\xb9\x0d\xbb\x0b\x62\xf5\xbf\x43\x43\x1e\x83\x0e\x80\x29\xe6\x31\xf8\xc4\x1b\xfb\xff\xfd\x42\x1f\x03\xc6\xfd\x6f\x34\x06\xf2\x60\xa3\xfe\x2f\x19\xfa\x18\x32\xe4\x8f\xf4\x76\xa1\x21\x23\xfe\x33\x03\x00\x87\x82\x20\xa3\x61\x7a\x8c\xf7\xfd\x06\xf9\x68\xa8\x7d\x86\xfb\x5e\x63\x7c\x34\xc4\x29\x82\x70\xf0\xbd\xaf\x1d\x41\x38\xd2\x20\x7f\xa8\x31\x7e\xd4\xee\x8c\x35\xc2\x5b\xf3\x7a\xc4\x34\x22\x0d\xf0\x5d\xd3\x7a\xcc\x12\x07\x8d\xef\xfb\x66\xf5\x38\xa3\x53\xc8\xf0\xde\x6b\x52\x8f\x00\xdb\x6f\x74\x7f\x96\x38\x15\x4d\x9d\x91\x2f\xc6\x9a\xd0\xc7\x9b\xcf\x23\x62\x09\x46\x98\xce\x9d\x61\x7c\x00\xe2\x31\xcc\xe6\x51\x1c\x31\xfa\xa4\xc5\x71\x88\x68\x33\xf9\x4b\x98\xc8\x47\x9a\xc7\x63\xd4\x72\xd4\xab\x9a\x87\x4c\xe3\x46\x13\x1e\x00\x19\x6f\x16\x6f\x6a\xc3\x43\xcb\x8f\x35\x89\x37\xf5\xe1\x21\xcf\x54\x94\x39\xbc\x6b\xec\x8e\xf7\xa6\x8c\x32\x85\x47\x51\x6b\x8c\xe5\x35\xc6\xfc\xfd\x6c\xa3\xea\x60\xf0\x3a\x53\xf4\xd0\x00\xf6\x26\x5d\x7b\xa2\xd8\x7b\xe7\x8c\xb7\x9c\xa6\xa8\x28\x95\x0d\xe5\x1d\x1d\xc9\xde\x0b\xf5\x57\x15\xdd\xde\x42\x7d\x30\xc4\x3d\x6c\xd2\x9e\x1d\x10\xe2\xee\x85\x68\x8f\xe5\x01\x21\xee\x7e\x90\x36\xf4\xfd\xa0\x10\x77\x2f\x54\x08\x7d\x3f\x2c\xc4\x7d\xf0\xc4\xef\x93\x90\x7f\xaf\x5c\x9c\xbb\x17\xe4\x70\xfc\x7b\x20\xce\xdd\x6f\x21\x0f\xc6\xbf\x07\xe2\xdc\xfd\xe8\x8c\x8e\x7f\xef\xc4\xb9\x07\x48\x7e\x8a\x7f\xdf\x7b\xa6\xf8\xf7\xc6\x33\xc5\xbf\x47\x2e\x76\x8a\x7f\x9f\xe2\xdf\x87\x9e\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\xa7\xf8\xf7\x29\xfe\x7d\x8a\x7f\xef\x79\xa6\xf8\xf7\x29\xfe\x7d\x8a\x7f\x6f\x3c\x53\xfc\xfb\xc0\x52\xa6\xf8\xf7\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\xa7\xf8\xf7\x9e\x57\xbe\x4a\xfc\x7b\xcb\x08\xed\x0d\x82\x0f\x98\x63\xeb\xfa\x29\x23\x83\xe0\xbd\x30\x97\x64\x38\x08\xde\x3b\x6d\x2f\x54\x4f\x8d\x9f\xa8\x48\x78\xbf\xe9\xb5\x19\x21\x3f\x2a\x12\x3e\x60\x34\xef\xa9\x4a\xff\xcc\xea\xf3\xa8\x11\x21\x7f\x68\x24\xbc\x9f\x04\xf8\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x6f\x9e\x29\x12\x7e\x8a\x84\x9f\x22\xe1\xa7\x48\xf8\x29\x12\xbe\xf3\x4c\x91\xf0\xbd\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\x99\x48\x78\xef\x9f\x70\x46\x84\xba\x10\xbc\xe8\xbf\x62\xdb\xca\x65\xfb\x5d\xcd\xa6\x57\x74\x5d\xda\xb8\x55\x43\x07\x40\x99\x76\xfb\xcc\xe9\xea\x4c\x74\x49\x50\x2a\x78\x51\x10\x08\x88\xbf\xdf\x60\xc6\xe5\x2d\xc4\x90\xc3\x64\x4c\xd8\xca\xcf\xa6\x21\xdf\xcf\xb5\xaf\x57\x6f\x5a\x21\xf8\x96\xa6\xa4\xa7\x9e\xf9\xcf\x0a\xe0\xfc\x24\x34\xa0\x9f\xb4\x4c\x48\x13\xfc\xb3\x31\xd1\xb6\x07\x34\x83\xa0\xe5\x4e\x9f\x03\x5c\x66\x1d\xb5\xc1\xc3\xc7\x02\xb4\xe0\xdb\x16\x18\xea\x7f\x96\x44\xec\x7e\x10\x59\x10\xb5\xf7\x10\x55\xae\x88\x60\x38\x43\xf0\x05\xfa\xe1\xf6\x23\xe0\xd5\x20\x08\xdd\xd6\x51\xf6\x5a\xa9\x32\x2c\xa1\x33\xc9\x93\x3b\x30\xc7\x9c\x58\xb4\xd9\x68\x5f\x87\xd7\x4f\xb8\x90\xce\xbc\x77\x32\x9f\xc3\xcf\x0b\x30\xeb\xcc\x4b\x91\x9d\xa0\xf3\x8f\x57\x1d\x88\x58\x74\x72\x1c\xbc\x98\x00\x80\x39\x66\x78\x4d\x84\x3c\x07\xea\x08\xae\xda\xd8\x32\x2b\x3a\x02\x1d\x13\xa2\xdc\x13\xce\x18\x49\x4c\x1c\x38\x6f\x81\x5d\x20\xf4\x99\x65\x5d\xea\xc7\x5b\x4c\x33\xbc\xcc\xaa\x60\x7a\x40\xda\xf6\xed\xe2\xdd\xdb\xc5\x5b\x90\x43\x20\xd6\x5a\x7f\xdf\xc4\xc2\xcf\xad\x29\x2f\xcc\x4c\x7e\x8e\x41\x42\xc8\x0c\xe1\x31\x39\x74\x76\x5c\xf3\xcb\x8a\xbf\x25\x82\x40\xb0\x84\xe1\x74\x60\x0e\xd7\x93\xb5\x9a\x19\xd6\x2c\xd9\x13\x1e\x67\xbf\x7d\x20\xbb\x3e\x6e\x16\xe4\x61\xfa\xb8\x0e\x4e\xf5\xe4\x1a\xe7\x95\x69\xd4\xb6\x2c\x56\x0b\xf4\x89\x83\x5d\x7c\xc5\xdf\xa3\x8d\x52\x85\x7c\x7f\x7a\xfa\x50\x2e\x89\x60\x44\x11\xb9\xa0\xfc\x34\xe5\x89\x3c\x4d\x38\x4b\x48\xa1\xe4\x29\xdf\x12\xb1\xa5\xe4\xf1\xf4\x91\x8b\x07\xca\xd6\x73\xbd\x51\x73\xdb\x01\xf5\x14\xf8\xc6\xe9\x77\xf0\x3f\xbd\x8b\xbc\xff\x7c\xf1\xf9\x3d\x3a\x4b\x53\xdb\xea\xa1\x94\x64\x55\x66\xae\x97\x16\xc2\x05\xfd\x42\x84\x16\x64\x67\xe8\x81\xb2\x74\x86\x4a\x9a\xfe\x8f\x93\xb1\xf8\xe0\x85\x51\x1f\x06\x71\x72\x07\x77\xf1\x4e\xdf\xbe\x30\x1d\x8d\x9a\x3b\xb3\x0f\xfa\xc2\x56\x12\x36\xd7\xe9\xd5\xf6\xc6\xf5\xce\x66\xc9\x79\x46\xf0\xbe\x01\xd5\x77\xb1\xf4\xa9\x6f\x61\x06\xef\x08\x7c\x88\x0d\x9d\xd8\x13\xf9\xc3\xed\x47\x69\x68\x91\xa5\x8e\x61\x2a\x6e\x2e\x80\xfa\x20\x7e\xe0\xc2\x72\xa7\xce\xc2\xba\x07\x6f\x66\xbe\xfe\xd4\xe2\x0e\x0d\x01\xac\x94\xc0\x9e\xa5\x22\x38\x5d\x80\xa5\xa7\x87\x30\x1b\xde\x2e\xc7\xd9\xa9\xf1\x1c\x22\xba\xea\x1d\x80\x36\xdc\x7f\x86\x01\x76\x81\xf6\xb2\x82\x52\x64\x3f\xc3\xb9\xdf\xa7\xa1\xe3\x5d\x0f\x56\xcd\x21\x22\x7c\xed\x9e\x9c\x57\xef\x19\xa9\x45\x22\xca\xfe\xd3\xb2\xc7\x5a\xe3\x6d\x80\x33\x79\x4c\x29\x5d\xed\xfa\x69\xdc\xaa\x69\x6b\xc2\xf4\x7f\x91\xb4\xf1\xa9\xb5\xae\x24\x98\x55\x9b\x02\x1c\x38\xe3\x8f\x2e\xa7\xa6\x43\xa7\x08\xe1\x52\x6d\x08\x53\x34\x31\x2c\xbc\x10\xfc\x69\x67\x0c\x80\xcd\xeb\x1d\x5c\x1f\x90\x1d\x96\x6c\xc0\x61\xae\xd1\xbe\x24\x1b\xbc\xa5\x3d\x0a\x0a\xc8\x8b\xc1\xc9\x2e\x50\x03\x33\xa9\xcd\xdc\x4b\x11\x78\x86\xcc\xf2\xbb\x13\x0d\x43\xb4\xb9\x41\x3b\x24\x37\x2e\x1d\xc7\x24\xeb\xe9\xff\xa7\x69\x19\xc0\xda\x65\x76\x29\x49\x7f\x93\x72\x46\xd0\x96\x62\x6f\x78\x28\x70\xfe\xa4\x14\x9a\x89\x36\x46\xee\xe7\x7c\x58\x90\xf7\x4e\xb6\x99\x83\x6c\xf3\x33\xcc\xe3\x67\xc8\x40\x9c\x9b\xfb\x2a\xc7\xc5\x5c\x90\x8c\xe3\x94\x88\x9f\x17\xe8\xf3\x96\x08\x41\x61\xab\xea\x7d\xed\x40\xa6\x12\xe9\x1d\x13\x24\xdb\x21\x5e\x2a\x49\x53\xbb\xde\x84\x17\xc0\xec\x1f\x9d\xa9\x3b\xc7\xb4\xc2\xb2\x91\x3f\xca\xa2\xe0\xa2\x2b\xa3\xea\x89\x69\xb1\x8a\xeb\xa1\x25\x9f\xa1\x1d\x2f\x11\x4e\x34\xfb\x77\x86\x73\x2a\xdd\x86\x97\xc6\x33\xbc\x14\x04\x3f\x20\xac\x40\xd6\x57\x34\xef\x8a\x34\xfa\x9a\xe0\xa5\xd2\xf2\x1f\x4d\x48\xec\x71\xdc\xf3\x8a\x58\xbb\x0a\xa8\xca\x96\x48\x6b\xd4\xc3\xdc\xf4\x5c\x1f\xb1\x89\x57\x14\x25\x83\x61\x7b\x5d\x5a\xe0\xc2\xeb\x5e\xb4\x61\xb7\x04\x16\x6b\x8f\x6a\xdc\x3e\xea\x67\x62\x5d\x1a\xdb\x86\xe5\x4a\x84\x29\xb1\x03\x0f\xbe\x21\x9c\x94\x27\x0f\x9a\x4e\x73\xbc\x26\x27\xde\x08\xfc\xf3\x4f\x17\x7a\x83\x0d\x4f\xb5\x39\x73\x7b\x22\xf4\x02\x7d\xc1\x82\x82\xc4\x64\xaf\xf4\x84\x48\xf4\xdb\xd7\x5f\xce\x6e\x7f\xba\x3e\xfb\x74\xe9\x53\x7e\x35\x8d\x93\xa7\x02\xb3\x94\xa4\xa8\x94\x75\x14\x8d\xc5\xe6\xc9\x89\x26\xac\x2d\x15\x9c\xe5\x20\x26\x5c\xad\x40\x78\x31\x63\x79\x80\x26\x98\x99\x62\x82\xe0\x50\xcc\xb6\x24\x9d\x35\x85\x8d\x84\x38\x15\x98\xb2\xa2\x54\xce\x7c\x6e\xaf\x00\x0f\xcc\x92\x19\x2e\x63\x3a\xa7\x37\x57\x86\xe4\x8e\x29\xfc\xe4\x98\x1c\x91\x09\x2e\x5c\x68\x10\x46\x29\x2f\xfd\x13\xfd\xed\x6f\x67\x88\x92\xf7\xe8\xb7\x0d\x70\x0b\x74\x69\x21\x34\x10\x69\x62\x43\xc8\x96\x08\x18\xc2\x22\xcc\xe7\xe9\x10\x64\x8d\x45\x9a\x11\x29\xcd\xc9\xab\x65\x0a\x87\x38\x44\x2a\xa3\x3a\xe3\x6a\x81\xce\x1d\xc6\x7c\xab\x87\x40\x8d\x34\x56\x4a\x53\x58\x3e\xc8\x53\x73\xad\xcc\x53\xac\xf0\xbc\x71\x54\x4e\x8d\xf8\x32\x4f\x78\x9e\x63\x96\xce\xb1\x25\xd2\x79\xb5\xe9\xa7\xdf\x59\x75\x7c\x8e\xab\xb7\x28\x9b\xe3\xb9\xdc\x90\x2c\xeb\x93\xc2\x06\xcc\x45\x83\x8a\x77\x58\x13\xb6\x73\x88\x39\x71\x97\xd5\x01\x33\xd0\x16\x5a\xf4\xb0\xa1\x30\x96\x28\xb4\xd2\x88\x60\x25\xa1\x26\xfc\x7b\x27\x13\x5d\x5e\xdf\xdf\xfe\xed\xe6\xf3\xd5\xf5\xfd\xe0\x51\xf4\x40\x1c\x38\xa0\x31\x47\xd1\x03\xd9\x7f\x40\x87\x8f\xa2\x07\x64\xe0\x80\x0e\x1f\x45\x3f\x5b\xf0\x1e\xd0\xe8\xa3\xe8\x81\xed\x39\xa0\xf1\x47\xd1\x03\xb7\x73\x40\x7f\xe5\x47\x91\xb0\x6d\xc4\x31\xfc\x68\x03\x2e\x1a\x84\x59\xe1\xdb\x6a\x22\xce\xe6\xd1\x90\xff\x7c\xb7\x5f\x07\xf5\xe3\x57\xdd\x9a\xdd\x25\xdb\x7e\xc1\x6d\xcf\x38\xeb\x9d\x2a\xb2\x2f\x78\x6d\x7c\xc0\x4a\xce\x87\x16\x10\x13\xe2\xe0\xd3\xdc\x7b\x17\xd0\x54\xe0\xfb\xe6\xbd\xa8\xed\x0c\x41\x7b\xe8\xf9\x4f\x57\x17\x97\xd7\xf7\x57\x1f\xae\x2e\x6f\x43\x96\xd3\x28\xbb\x29\xd8\x98\xa3\x97\x70\x32\x86\x1b\x06\x17\x51\x73\xca\x42\x10\x2d\x89\xd6\x16\xf1\x7e\xf2\xf3\xd8\xda\x9a\x4f\x2d\x4c\x9a\xa8\x98\x1d\x92\x44\x6c\x69\xd2\x8f\x6e\x63\xe2\x0c\xa3\x3a\x9e\x21\xb7\x58\x6f\x10\xe6\x58\xb6\x6c\x19\x70\x10\xe6\x8b\x30\x67\xf3\x1c\xce\xa2\xc3\x33\x6e\x4b\x52\x17\xc6\x0a\x0c\x5c\xe6\xd5\xab\x8e\x7e\xd1\x7c\xe2\xc9\xfa\x83\xe0\xc1\xc2\x04\x6d\x5b\x92\x29\xc0\xb1\xe2\xc2\x7b\x40\x4f\x6c\xf4\x55\xd8\x5d\xd1\x60\x7c\x56\xdc\x30\x51\x8d\x56\xde\x30\xe1\x13\x01\x08\xb1\xa1\x55\x46\xed\xfc\x84\x8b\xbf\x92\xdd\x2d\x59\x0d\xf9\xfc\xda\x8b\x05\xf3\xa6\x8d\x2d\x02\x25\x1f\x9d\x3b\x70\x43\x6e\xdc\x31\xa1\x5f\x91\x61\x5f\xbd\x36\xd9\xca\x0a\x1b\xe3\xb4\x1f\x15\x3b\x30\xc4\xb5\x7b\xa7\xf5\x4d\xd8\x5f\xf7\x9f\xb1\xf6\xd8\x28\xa0\x3e\x9b\xed\xfe\x33\x0a\xe7\x21\x9b\xee\xfe\x33\x68\xe3\xad\x68\xd5\x9a\x79\xa3\x96\x15\x67\x0a\xee\x5f\x64\xbf\x69\x78\xff\x89\x8d\xfe\x89\x89\xfc\x89\x0e\x95\x80\xbd\x1e\x7b\xfe\x4f\x6a\x06\x50\xf9\xa8\xac\x87\xfc\xbd\xb3\x2c\x49\x94\x13\x85\xb5\xec\xbb\xd0\x04\x39\x4c\x3b\xad\xd7\xc1\x31\x3e\xab\x7f\x33\x9e\xc4\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\x48\xe5\x18\xfe\xf3\x83\xde\xb8\x1b\x1c\x28\x6e\xd4\x7c\xa8\x44\x8f\x82\x2a\x45\x18\x48\x2a\x90\x32\xc1\x57\x33\xe7\x7e\x35\x17\xef\xf6\x5d\x54\x7e\xed\xa8\x83\xbf\x72\xd3\x1c\xbd\x74\xfd\x91\x5b\xb7\xa1\xd2\xda\x31\x17\x21\x0d\xba\xa7\x0e\xd8\x38\xbb\xb9\x42\x5b\x83\xcf\x23\x2f\x33\xfe\xe4\xaf\x22\x77\x2d\xfa\xfc\xbb\xe0\xff\x0f\xcf\xe4\x03\x55\x09\x32\x8b\xf1\x4a\x98\x7e\x0f\x01\x60\x83\xf8\xaa\x92\x10\x50\x46\x73\x6a\x03\x83\x6d\x39\x33\x89\x5e\x9b\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\x7d\x45\x87\x20\xc6\x6e\x79\x56\xe6\x71\x19\xbc\xf5\xfd\x6c\xea\xdb\xb1\xad\x16\x7a\xe5\xd1\xa5\x80\x94\x6e\xa9\x8c\x8b\x8d\xef\x11\x02\xa8\x4d\x57\xe0\xa5\x2a\x4a\x65\xd3\x38\x87\x3a\xe1\x37\x1f\xf2\x54\x70\x09\xaa\x4f\x95\x30\xd3\xe2\x7f\xef\x86\x93\xd3\x47\x2e\xd8\x8d\x34\x7e\x6b\x5d\x99\xb4\xf7\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\x34\x19\xa5\x09\x80\xa4\xf2\x8d\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\xb7\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\x6d\x0e\x7a\x33\x70\x44\x6a\x25\x4e\x28\x08\x49\x86\x1c\x75\x73\x3f\x58\x63\x23\x65\x55\xa6\xba\x07\x66\x25\x16\x54\xf9\x12\x9d\xb2\x15\x26\xca\x56\x2a\xb7\x70\x98\xb9\xc2\x0f\x3e\x90\x85\x20\x09\x49\x09\x4b\x08\x64\xde\x95\xa4\xc6\xe1\x72\xa7\xd7\x78\xc9\xb6\x95\xdd\xb6\x34\x3e\x26\x73\x19\x68\xc8\x3e\x8a\xc2\x0f\xa4\x05\xf9\x25\xbc\x2d\x9a\xe8\xee\x5c\x59\xe2\xca\xe9\x02\xf7\x53\xa5\x29\xb8\xe4\x42\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\xb6\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\x45\xd3\xe6\x19\xab\x15\x2e\x9a\x12\xa6\xb4\x72\x03\x41\x79\x85\x20\x05\x61\x69\x55\x06\x63\xe8\x92\xb3\xac\xba\xb6\xde\x37\x82\x95\x8f\xea\x28\x34\x72\xe4\xd8\x03\x78\xd7\x27\xc9\x4e\xa7\xef\xdf\xe7\xf4\xd9\x0d\xfe\x6a\x47\xef\x99\xb2\x15\x04\x0a\xc5\x44\x28\x5d\x34\x02\x8b\x80\xfa\x46\xd3\x4e\x1d\x06\x7a\x0a\x50\x7c\x24\x72\x5f\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\x07\x82\x2e\x48\x91\xf1\x9d\xcd\x05\x65\x29\xba\x53\x58\x69\x52\xbe\x23\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\xcc\xe0\xbc\x9f\x65\x8f\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\xcf\x4c\x57\x08\x85\xdb\x01\xed\x33\x8d\xd1\x26\x58\x0f\x54\x38\xe6\x8f\x54\xf6\x4a\x6b\xcf\x26\xa6\xef\x00\x92\x66\x49\xe6\xdf\x07\x21\x3e\xa3\x2b\x92\xec\x92\x2c\xe6\x44\x9c\x25\xe0\xbb\xa9\x8b\x71\xd4\x34\xe8\xba\x33\xdb\xbc\x02\x10\x56\xbd\x85\x69\x4c\x49\x28\x53\x33\xab\x26\xc7\x6a\x26\x46\x05\x90\xd1\x12\xee\xf0\x05\x52\x70\xa9\xee\xb4\x96\x10\x59\xeb\xe9\xe4\xc6\x7d\x80\x20\x26\x3f\xcb\x48\x8a\x68\x9e\x93\x54\x6b\x05\xd9\x0e\xe1\x95\x82\x6a\x3c\xd5\xec\x03\x1c\x4d\x43\x80\xf6\x22\x69\x55\xdc\x61\x83\x59\x9a\x11\x81\x56\x98\x66\x56\xf3\x68\x69\x34\x8a\x88\x9c\xb2\x81\xfa\x4c\xc6\x96\x0d\xca\x8f\x56\x9e\x92\x84\x0b\xdb\x6f\x1a\x54\x7b\xfb\xa7\xfa\x6c\x00\xff\x1e\xe4\x1a\xa8\x4e\x30\xad\xa7\xb4\xcc\x78\xf2\x20\x51\xc9\x14\xcd\xcc\x02\x38\x7f\x80\x26\x22\x19\xd0\x6a\x83\x94\x03\x60\x47\x12\x79\xf5\x9f\xf3\x8a\x32\xe6\x7a\x5c\x79\xfa\x5d\xfd\x27\xf8\xc1\x7f\x45\xc6\xc9\x16\xe4\x89\x24\x23\xb2\x98\x35\x97\xd1\xc8\x87\x24\x79\xce\x2a\x11\x63\xc5\x35\xb3\x86\x18\xfc\xfe\x04\xcc\xf6\xb3\x24\xcd\x0c\x99\xcb\x27\x92\x34\x92\xd3\xa1\x44\x1d\x1c\x37\x08\x48\xc7\x0f\x03\x11\x28\xf1\xd6\xca\x60\x88\xae\x77\xcd\xe7\xe6\x2b\x57\x98\xc7\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\xfb\x7a\x87\x56\x71\xf5\x2f\x1a\xf3\x81\x04\x65\xce\x15\x7a\x7d\x72\x7a\xf2\xa6\x63\xd4\x38\xd1\xb7\x6c\x46\x0c\xaf\x8a\xb1\x8d\xde\x37\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\xaf\x4f\xfe\x79\x12\x63\x79\x24\x2a\x79\x83\x1e\x39\x3b\x51\x80\xc6\x05\xba\xe7\x5a\xba\xac\x87\xda\xf1\x12\x31\x62\x92\x8a\xc8\x53\x91\xd1\x84\xaa\x08\x0f\x1f\x02\xe6\x87\x78\xa9\x4c\x5e\x04\x56\x2e\x1e\xfb\xf2\x89\x2a\xeb\x3e\xd7\xf4\xff\x16\x28\xc3\xb0\xb9\x18\x14\x48\x94\xd1\x2d\x39\xdd\x10\x9c\xa9\x8d\xa9\x44\xc5\x38\x9b\xff\x83\x08\x0e\x51\xdb\xcc\xfe\xe5\x88\xf5\xba\x5e\xa4\x74\x70\xa4\xb9\x51\xb3\xbe\xef\xc9\x98\x0a\xaa\xff\x71\x7f\x7f\xf3\x3d\x51\x7b\x2c\x41\xc3\x71\x0e\x4c\x50\x1d\x89\x58\x71\x31\x40\xca\xf1\xbc\x61\xc3\xe5\xc0\x1c\xbb\xf3\xe4\x52\x99\x34\x2d\x73\x99\x33\xad\xf1\x29\xde\xf2\xb2\x45\x1e\xe2\x82\xa7\xe8\xea\x66\x81\xfe\xc6\x4b\x3d\xe7\x25\x5e\x66\xbb\x2a\x35\x48\x12\x85\x5e\xe9\xc1\x5e\xe9\x53\xad\xf1\xf0\x1f\x04\xa7\x7e\x39\xb5\xf9\xb8\xec\xc6\xc8\x5d\x8f\x22\x91\xc6\x0c\xc6\xb2\xd2\x52\x2a\x9e\xa3\x8d\xf9\x78\x2f\xc6\xda\xee\x6d\x0c\x6f\xd2\x14\xe2\xf2\x12\x05\x29\xe0\xe8\x39\xa8\x2f\x55\xe6\x4e\x8f\x69\x56\x5d\xe5\xfd\x49\x2d\x06\x35\x97\x14\xe5\x50\x30\xd5\x52\x6d\xee\xa9\x59\x8a\xde\xf2\x28\xdf\xcd\xd8\x42\x74\xb1\x3e\x2b\xd4\x67\xcd\x30\x6b\xb2\xca\x59\xc0\xe0\xbf\xff\x1c\x56\xeb\xec\x38\xd3\x8c\x29\x22\x72\xe0\x3c\xc7\x55\xbb\x8a\xc4\xd7\x3c\x7a\xc6\x2f\x54\xeb\xaa\x88\x8a\x55\xea\x46\x2a\x69\x05\x3d\x49\x20\x1e\xda\x1c\x5f\x20\x64\x49\xc4\xd6\x9f\x63\xb0\x3f\xbf\x28\xd4\x17\x3c\xa4\xbb\xb8\x07\xb3\xdd\xe7\x41\x9f\x3a\x54\x45\x89\xaa\x71\xbd\xff\xfe\x21\x65\xba\x8c\x09\x4e\x20\x56\xe6\x4b\x22\xea\x98\x43\xa1\x6a\xe4\x45\xec\x3b\xef\x78\xa7\xae\x0d\x40\x67\x84\x6a\xd7\x03\x8f\xa1\x24\x8e\xfe\xf8\x5f\xfe\xcb\xef\xff\xcb\xc2\x4c\xb1\xf2\x65\x31\x74\x75\x76\x7d\xf6\xd3\xdd\x97\x73\x08\x9e\x1f\xde\xc5\xa7\x79\xad\xcf\xcc\x29\x53\x73\x2e\xe6\x06\x53\xef\x91\x12\x83\x54\x0d\xd1\x7d\x11\xe7\xbe\x6d\x95\x83\x8f\xf4\x1a\xb4\x90\xd7\x2d\xdc\x61\x54\xb4\xb8\x6b\xa4\x69\xf9\xd0\xe4\xfb\x15\xaa\xd5\xf7\x26\x35\x77\x47\x1c\x76\xea\x26\xc5\x1d\x4f\x1e\x46\xc9\x59\x27\xf7\xe7\x37\xe6\xa3\x86\xa8\x85\x99\x53\xbe\x28\xdb\xf2\x6c\x3b\x4c\xf6\x18\xdd\x9f\xdf\xc0\x42\x16\xf0\x5f\xa0\x97\x82\x6a\xb0\xd3\x90\x5d\x20\x99\x35\x01\x6b\x35\x62\x48\x09\x37\x50\x05\xc1\x19\x95\x8a\x26\x00\xb5\x36\x91\x68\xf8\x61\xcb\xf0\x8b\x4a\x7d\x27\x9f\x9d\x31\x79\x58\x00\x8c\x3b\x8c\x0d\x01\x70\x38\x80\xe2\x57\xc1\x39\x2d\xc7\x34\x71\x7e\x13\xe7\xdc\x7b\x7e\x59\xde\x12\xf1\x52\x21\xc8\x9d\xe2\x45\xb4\x85\xd1\xbc\xee\xb1\x2f\x2e\xc9\x8a\x0b\x12\x6f\x60\xac\x0d\x86\x55\xf3\x00\x06\xb1\xcf\x4e\x57\xe4\x4d\xd3\x5f\x30\xc6\x42\x3f\xb2\x4c\x36\x4e\x47\x67\x44\xca\x53\x30\x25\x96\x85\x91\xd1\xc1\x6c\x59\x0a\x32\xd3\x6b\x26\x39\xac\x68\x16\x13\x27\xa8\x17\x43\x98\x79\x1d\x5a\x6f\xdf\x37\x6c\xa1\xd6\x92\xe2\x90\xb1\x67\x82\x0c\x41\x15\x58\x6e\x08\xe4\x95\x91\x27\x5a\x97\xff\xc6\xd2\x16\xb5\x72\xc8\x01\x7e\x2e\x51\x81\xa5\xa9\xae\x12\xba\x49\xea\x89\x19\x70\x37\x3c\x3d\x39\x91\x2d\x50\x6b\x81\x13\xa2\x35\x70\xca\x53\x04\x09\x09\x29\x7f\x0c\xb9\xb6\x96\x64\x4d\x99\x74\x7b\xab\x87\x70\x44\xa0\xb9\xb9\x29\x11\xe8\xf2\xdf\x17\xe8\xb6\x4a\xb6\x1b\xb6\xd4\xf2\x52\x25\xbc\x66\x12\x76\xe6\xfb\x86\x65\x08\x5b\xa9\xdb\x40\x84\x96\xef\xc8\xc9\xc5\xfc\xa8\x61\x14\x58\x0b\x73\x00\x6a\x83\x00\xc7\x5a\x98\x43\x28\x10\x8d\xaf\xbc\xfb\x03\xf5\x8a\x71\xb2\x69\xfb\x5d\x26\x63\xf5\x64\xac\x0e\x3d\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xde\x67\x32\x56\x4f\xc6\xea\xc9\x58\x3d\xfc\xed\x64\xac\x9e\x8c\xd5\x93\xb1\xba\xe7\xf9\x16\x4d\x2e\x93\xb1\x3a\xfc\xf9\x64\xac\x9e\x8c\xd5\x01\xa8\x93\xb1\xba\xf7\xfd\x5f\x03\xe7\x9c\x8c\xd5\xa1\x8f\xbf\x31\x63\xf5\xc0\x0b\xce\xea\x7b\xa3\x65\xdc\x98\x48\xec\x1b\xb0\xb1\xd1\xc4\x9a\x87\xf9\xaa\x15\xd5\x6b\x80\x35\x6a\x46\x7b\x26\x5e\xe7\x03\xba\x98\x56\x6b\x04\xae\x8d\xce\xbd\x31\xc1\x60\xcf\xf3\xc0\x8c\x8f\xae\x76\x21\xf0\xf2\xb4\xe0\xe6\xff\xd5\x96\xbc\x86\x09\xcf\xc8\xfd\xfd\x87\x7e\x98\x89\x85\x6d\x77\x07\xd9\xed\xda\x96\xb9\x00\xf1\x3c\xc3\x66\x17\xc7\x9d\xa3\x6c\x75\x07\xd8\xe9\xe2\x6c\x55\xb1\x36\xba\x7d\x0b\xdc\x00\xd8\x68\xfb\x5c\xd3\xfa\x36\x00\x33\xce\x36\xe7\xb3\xbc\x0d\x89\x68\x1e\xbb\xdc\xa0\xd5\x6d\x00\x6e\xbf\x4d\x2e\x68\x71\x1b\x9a\x69\xaf\x3d\x2e\x68\x6d\x1b\x46\x6c\xa4\x2d\xee\x97\x6f\x99\x15\xc1\xb9\xad\x5b\xed\x7e\x23\x88\xdc\xf0\x2c\x70\x92\x5a\xa7\xe8\x13\x65\x34\x2f\x73\x4d\x98\x12\xfa\x88\x6f\x2b\x0f\x9d\xac\x28\xde\xf0\xd0\xa0\x75\x0b\x9a\x71\x01\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\x5f\x54\xb3\xab\x0a\x22\xbe\xf3\xef\x4c\x5c\x93\xfe\x18\xa9\x66\xd0\x84\xf9\x12\xe6\xcb\x38\x36\x39\x2c\xc0\x8e\x36\x59\x46\x14\xc3\x79\x11\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xc7\x9b\x27\x61\x7f\x87\x94\x97\x43\x4c\x93\x51\x5c\x64\xb4\x49\x32\xc6\x06\x7d\x90\x39\x72\x8c\x29\xf2\xa0\x3a\x2f\x87\x9a\x20\x47\xe9\x1d\xd1\xa6\xc7\xe3\x98\x1d\x5f\xa4\xa6\x52\x04\x5e\xe2\xcc\x8c\x23\xbb\x6b\x0e\x99\x17\x87\x4d\x8b\xc7\x34\x2b\x46\xa2\x76\x58\x29\x8e\x50\x88\xc7\x28\xc3\x23\x14\xe1\xd1\xe6\x43\x8b\xa4\x81\x6d\x8d\x55\x80\xf7\xd4\xdb\x01\xa8\x87\x29\xbf\xcf\x50\x7c\x63\xcc\x85\x2f\x62\x2a\x1c\x67\x26\x3c\x5a\xb3\xc9\xa0\xfa\x1e\x71\x54\x29\xa3\x8a\xe2\xec\x82\x64\x78\x77\x47\x12\xce\xd2\x00\xa7\xde\x2b\x75\x50\xd1\x9c\x34\x1f\x5a\xc9\xad\x1d\x65\xb3\xc1\xb6\x5a\x4e\xd0\xef\x6d\x03\x94\x9c\xe6\x6e\x2f\x17\xa8\x8d\x68\x66\x78\x48\xf6\xf2\x11\xf4\x6b\x74\x54\x11\xd1\x04\x06\x8d\x43\xf3\x7f\xf0\x47\xc4\x57\x8a\x30\xf4\x9a\x32\x87\xe9\x37\x0d\xe1\xb0\x96\xb5\x43\x24\x67\xc9\x53\x7f\xf7\xee\xad\x03\xf3\xb5\x44\x65\x10\xea\xa5\x3c\x86\xd6\x61\x41\x3d\x47\xed\xb0\x20\x56\x65\xd6\x56\x3d\x8c\x3a\x12\xab\x77\xbc\xab\x4b\xa2\xbc\x83\xb9\x54\xb4\xac\xb5\x49\x1b\xcc\xd8\x45\x78\x10\xe2\x2f\xb0\x15\x11\x2e\x81\x83\xdc\x01\xc6\xe0\x3f\x70\xc5\x8e\x72\x05\x34\x8d\xfd\x01\xb8\x63\xdc\x00\x2f\xa2\x3d\x1d\xd1\xf4\x3f\xc6\xec\xff\x6f\x27\xd9\x44\x98\xf7\x7f\x45\x92\xcd\x2f\x21\x0b\x28\x9a\x13\x5e\xaa\x23\x89\x01\xa6\x2f\x74\x83\x23\xd3\x70\xbd\x22\x5e\xee\x35\xe8\x78\x67\x01\xf6\xde\x52\xc7\x8b\xa8\xfd\xc6\xa4\x84\x81\x7d\xf2\x2b\xc9\xde\x26\x40\xb5\x2c\x56\xd7\x28\xc7\x12\x61\x74\x71\x7d\xf7\xd3\xc7\xb3\xbf\x5c\x7e\x5c\xa0\x4b\x9c\xf8\x4a\x85\x37\xaa\x84\x30\xd3\x10\xd1\xd0\xfe\x06\x6f\x09\xc2\xa8\x64\xf4\xef\xa5\xed\x9a\xf9\xba\x82\xf8\xc6\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\x40\xc3\xd1\x35\xdd\x5a\x83\x9d\x2d\x41\xd3\xe8\xcc\xaa\x49\x52\x53\x82\xbe\x0d\xf1\x12\xcc\xd4\x5e\x0e\xc5\x88\xd2\xd4\x57\x69\x1c\x9c\xc9\x66\xfe\x85\xd6\x48\xe4\x0c\x2d\x4b\x30\xd5\x17\x82\xe6\x58\xd0\x6c\xd7\x1c\x02\x67\x3e\x7e\x73\xcd\xdd\x0d\xbd\x33\xd7\x71\x3d\xfd\x8b\xcf\x97\x77\xe8\xfa\xf3\x3d\xf4\x44\xd2\x37\x2b\x58\xd1\xe1\xef\x80\x98\x25\xf1\xa3\xc1\xd6\xb6\x5e\xa0\x33\xb6\x33\x9f\x98\x73\x4e\x25\xd2\x57\x33\x61\x7a\x30\xab\x95\xbb\x52\x50\xaf\xde\x2e\xe0\xff\x7c\x65\xaf\x71\x9a\x0a\xcd\xcd\x2b\x27\xc4\x5e\xfe\x80\xe6\xb2\xc0\xef\xe9\x32\x6b\xec\x9d\xc5\xde\x2f\xd6\x19\xac\x72\x26\xde\xe8\x65\x37\x1b\x84\x55\x1b\x09\x08\x31\xf5\x4a\xa1\x09\xa9\x97\x0f\x0c\xf6\x35\x8b\xac\x57\x59\x4f\x28\xba\x5e\x5e\xcd\xaf\xdd\x65\x6a\x0f\x05\x6f\x94\xb4\x46\x57\x37\x6e\x5b\xc2\x17\x1a\x94\x11\xcb\xdb\x8d\xcb\x0d\x60\x63\x92\x98\xa1\xb7\xe8\xcf\xe8\x09\xfd\x19\xae\xd6\x3f\x86\x80\xc5\x71\xd0\x38\xb1\xd6\x48\x6d\x57\x37\xd1\x58\xf9\x51\x1f\x01\xfd\x8d\x5e\xb9\xe2\x68\x49\x59\x6a\x3a\x34\xb9\x4e\xfd\x16\x5b\xcf\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\x42\x6d\x8b\x5b\x18\xe1\xa0\x21\x18\x77\xe0\x86\x06\xa9\xf2\xb8\x84\x34\xaa\xf9\x5e\x6b\x17\xf6\x30\xbd\x27\x28\x0e\x08\xe1\xa9\xbb\x59\x1b\xe9\x50\x05\x4f\xcd\x55\x0d\x93\x4a\x1b\xec\xc6\xdd\xca\x41\xa0\xdd\x1b\xdb\x86\xa8\x54\xaa\x33\xd0\x97\x3e\x09\xb6\x1b\x27\x54\xb0\x14\x03\x19\x0b\xfa\xb4\x54\x3d\xf0\x82\x1b\x13\x75\x3e\x0a\xc1\x15\x4f\x78\xb0\x66\x64\xdb\x24\x6c\x3f\x80\x65\x18\xb5\xd2\x69\xe2\x3f\x5c\xdc\xcc\xb4\x46\x08\xc5\xf3\xee\xce\x87\xac\x72\xad\xf6\x70\xf7\xe7\x37\xc1\x36\x35\x11\x8b\x19\x2e\xe7\xdd\x62\xe1\x3e\xb1\xfc\x79\xb5\x27\x05\xc1\x29\x3d\x5a\x6c\x8d\x6b\x75\x58\x41\x1d\x13\x64\x93\xf3\x2d\x49\xcd\x05\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0c\x44\xde\x0c\xcb\x90\x5f\xc1\x32\x38\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\x78\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x5e\xb4\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x78\x69\x8a\xbc\xb1\x93\xfa\x97\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\xe9\x8c\x32\x45\xde\x7c\x1b\x3e\xb5\x29\xf2\xc6\x3d\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x7b\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\xce\x79\x5e\x94\x8a\xa0\xdb\xaa\x5d\x7d\xd5\x33\x7d\xb9\x33\x7e\xc1\xc6\xe1\x78\x29\x37\x87\x69\xdb\x55\x0a\x08\x15\x39\x35\xb5\x10\xe7\x89\x99\xda\xbc\x5a\xcf\xbc\x9a\xc9\xe9\xa1\xae\x0e\xd3\x3b\xdf\x4f\x0f\x75\x7c\xcc\x4d\x14\xe3\x8f\x62\x5c\x6d\x8c\x7f\x84\x29\x34\x0c\x2d\xa6\x59\xd4\x13\x90\x2f\xce\x79\x69\x4a\x40\xda\xd5\x07\xc6\xae\xf0\x62\xcc\x44\x5f\x0f\xed\x28\xbe\x67\x30\x91\x5f\x19\xfb\xb7\x76\x12\xfb\xf8\xb7\xec\xe3\x30\xfc\xbb\x23\x03\x11\x08\xd5\x08\x54\x22\x9e\x53\xa5\xe5\x14\x2d\xec\x35\xa2\x85\x42\x5e\x0d\xaa\x5a\x36\x54\x4b\x2d\xe0\x73\xc4\xca\x54\x41\xad\xdc\x1c\xcd\x9e\x6b\xae\x9b\x5a\x08\x5d\x50\xf9\xb6\x92\x96\x60\xd7\xe7\xae\xf9\x2e\x30\xce\x6f\x9a\x82\x06\x5e\xd0\xf2\xbe\xa0\x6a\x77\xce\x99\x22\x4f\x1e\x09\xa6\x4d\x0c\x77\xf6\x13\xdb\x55\x50\x56\xa2\x94\x75\x62\x8a\x92\x41\x54\x43\xc4\x55\x12\x83\x2c\xd3\x6d\xec\xd4\x4d\x14\xb0\x42\x9e\xd4\xa9\x07\x64\xdc\x56\x28\x2c\x1f\xea\x7d\x20\x73\x7d\x39\xd5\xe8\xee\x8c\x75\x28\xe3\x04\x16\x73\x23\xe8\x96\x66\x64\x4d\x2e\x65\x82\x33\xd8\xf3\x58\x11\xe0\xcc\xf3\xbd\xeb\xaa\x28\xab\x2e\x9a\xbe\x8e\xd9\x76\x9e\x20\xd4\x25\x98\xa1\x35\xa6\x0c\xe5\x1a\x47\x85\x03\x0b\xdd\xf7\x18\x74\x78\x2b\xb0\xd0\x0a\x81\xfd\x20\x24\x71\x41\x60\xd8\x92\xf3\xcc\x7a\x64\xb3\x5d\x3d\x27\xeb\xea\x67\xfc\x27\x46\x1e\x7f\xd2\xe3\x48\xb4\xca\xf0\x3a\xd4\x8b\x1a\xd9\x8a\xb0\x44\x75\x4a\xb6\x54\xd3\x41\x3e\x74\x84\x18\x83\x04\xf1\x0f\x61\xd3\x81\xb1\xb7\xdd\xf7\x7b\xf4\xee\x0d\x50\x2d\x96\xa8\x82\x1e\x32\xaa\xfc\xee\x0d\x58\x5f\xce\xcf\x6e\x7e\xba\xfb\xdb\xdd\x4f\x67\x17\x9f\xae\xae\x87\x8e\x68\xb8\x4f\x69\x82\x0b\xbc\xa4\x19\x0d\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4d\x05\x2f\xcc\x3a\x45\xc9\x20\x5e\xb3\x8e\xc1\x8a\x30\x64\x38\x1f\x54\x15\xde\x69\x5a\x73\xb7\x87\x5a\x0b\xcc\x94\x13\x76\x86\xea\x73\x1b\x34\x8b\x92\x69\x41\xf5\xb9\x1e\x37\x9c\x8e\x09\x4a\x38\x4b\x53\x92\xb6\xa6\x7e\x64\x1f\xd0\xb9\x03\xbd\xab\x23\x46\xd1\xcd\xe7\xbb\xab\xff\x15\x3f\x2a\xb2\x34\x12\xe5\x1e\x38\x92\x07\x1b\x21\x4d\x26\x23\x30\x79\x6b\xa3\x7b\x26\x5c\x7a\xde\x19\xa8\xe4\xef\xb8\x4a\xe4\xe1\xbe\x2d\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\xa4\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\x0f\x24\x35\xaf\x2e\xcc\x3d\x6c\x25\x69\x69\x3b\x00\xd8\xe9\xdd\x6b\x2c\xac\x08\x56\xa5\x20\x70\xff\x86\x85\xdc\x25\x41\x84\xe1\x65\x16\x8a\x3c\x8b\x0a\x8a\xc4\xe9\x67\x96\xed\x6e\x39\x57\x1f\xaa\x90\xaa\xc8\xed\xfc\xb1\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\x7b\xc1\xcb\xd8\xa6\x1c\x9a\x82\xbe\xbf\xba\x80\x53\x55\x9a\x73\x43\x98\x12\x3b\x08\x8a\xec\x64\xf0\x0c\xcb\x70\x0b\xf4\x83\xa6\xa9\x3d\x2a\xd2\x12\x57\xc9\x24\x51\x0b\xf4\x09\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\x07\x22\x51\x21\x48\x42\x52\xc2\x92\xc0\x1e\x36\x6c\x45\x7f\xfc\xc3\xb3\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\xfd\x70\x75\x81\xde\xa2\xd7\x7a\x7e\x6f\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\x7e\x90\x44\x8c\xe0\x48\x3f\x1c\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\x7c\xa4\xac\x7c\x32\x2e\xb2\x31\x2a\xe4\xdd\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\x2f\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\x2d\xcf\xc0\xbf\x85\xab\xc5\x68\x00\xdf\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5c\xdf\x5a\x0b\xe8\x3b\xdf\xc6\x5a\xca\xe0\x4d\xd4\x59\x8b\xbe\xb8\xda\x6b\x81\x1b\xe4\x5b\x58\x4b\x84\x5a\xff\x48\x59\xca\x1f\xe5\x78\xa6\xfb\xa3\xf9\xd0\x71\x86\x44\xb3\x1e\x45\xd9\x5a\x36\x19\x2f\x0e\x1a\x4b\x9b\x7a\x6a\x1f\xe7\x75\xc6\xf9\x2a\x9f\xba\xcb\xa3\x02\xd0\x9d\xc0\x55\x4a\xeb\x9f\x39\xe0\x22\x0d\x51\x7c\x14\x6f\x3c\x3a\x07\x5c\xe7\x12\x9f\x0b\x0d\x4b\x51\x9c\xdd\x15\xa3\xda\x9e\x7d\xff\xe9\xee\xac\xfd\xb1\x26\xdc\x47\x48\xb9\xd7\xeb\xd1\x7f\x47\x38\xcd\xa9\x94\x61\x93\x34\xe0\x97\x2c\xa1\x1d\xdd\x6b\xe7\xa3\x58\x53\xb5\x29\x97\x8b\x84\xe7\x0d\x77\xc5\x5c\xd2\xb5\x3c\xb5\x54\x36\xd7\xb3\x7f\x33\x00\x97\xb2\x8c\xb2\x86\xd1\x01\x12\xd8\xad\x50\x07\x13\x4c\xaa\x15\x00\xea\x4d\xa6\xe9\x00\x50\x63\xe5\xed\x41\x80\xc9\x2e\xa5\x24\x4b\xad\x21\xc2\x84\x63\xeb\xf3\x9c\x15\x1b\x3c\x87\x0b\x63\x00\xb8\xcd\x19\x03\xbd\x7e\xc3\x19\xb7\x3e\x74\x13\x73\x6c\x55\x29\x63\x97\x80\x49\xd8\x93\xa3\xe7\x32\x00\xb8\x69\xf9\x38\x0a\x6b\xeb\x52\xcf\xf5\x60\x60\xfd\x00\x05\x01\x02\x6d\xc6\x5c\x23\x1a\x67\x60\x65\xbd\x1b\x69\x84\xef\x5f\xc3\x3e\x54\x1a\xcf\x48\xf4\x83\xe6\x63\x3f\xd3\xdc\xc6\x31\xe1\x5e\x4d\x68\x60\x51\x9d\xda\x2b\xbd\xda\x90\x7e\xa5\xad\x11\x0d\x1e\xdf\xae\xbe\x34\xa4\x15\x0d\x80\xec\x13\x76\x9f\x25\xeb\xf6\x03\x3d\x82\xbc\x8b\xfa\x64\xde\x3d\x7a\x5e\x12\x65\xc9\x19\x08\x36\xc7\x3b\xb4\x1c\x3a\x2e\x29\x95\x60\xd6\x04\xa7\x74\x93\x78\x6f\x9b\x84\x74\x6c\x3a\x7d\xb6\x63\xde\x04\xb6\x46\x67\x75\xdf\x35\xde\x47\xb4\x6b\x8a\xba\xe1\xa9\x09\x19\xaf\x82\x72\xbd\xfd\x0f\x6d\xe8\x3a\xfd\x87\xbb\xfb\x6b\xc9\x82\x71\x13\x33\xd1\x8c\x23\x77\x0d\x66\x4d\xd3\x54\x0f\x4c\x6b\xd1\xb5\xcd\x57\x5b\xb3\x30\x56\xae\x0d\x95\xcd\xe4\xf0\x59\x35\xe9\x80\xd3\xb8\xd9\xda\x61\x86\xfe\xb3\x94\x0a\xe1\xca\xfd\xdc\xea\x39\x51\xc5\x1c\x03\x39\x25\x5e\x6b\x8a\xcb\xc5\x52\x5c\x4f\x66\x4b\x53\x82\x52\xba\x5a\x11\xe7\x16\x5f\x12\x54\x60\x81\x73\xa2\xc0\x8d\x62\x50\x0b\x5d\x78\x99\x9f\x18\xf8\x0a\x61\xd7\xeb\xb6\x8a\x80\x9b\x19\x1f\x2d\x55\x28\xa7\xeb\x8d\x91\x75\x10\x46\x19\x67\x6b\x88\xe8\xd3\x53\xc8\x38\xf6\x9d\x44\x60\x0e\x5c\xa0\x47\x2c\x72\x84\x51\x82\x93\x0d\x58\x09\x31\x43\x69\x29\x20\xc1\x53\x11\x9c\xee\xe6\x52\x69\x3d\x5b\x4b\x47\x60\x4a\x33\x18\xf0\x7a\xa1\x3b\x9d\x30\x00\x5f\xd4\x44\x22\xeb\xbb\xa4\x3a\x26\xd6\x57\xe0\x84\x83\x26\xf9\x79\xa0\xb7\x0e\xd8\x94\xd2\xbf\xf7\x4c\x29\xfd\x53\x4a\xff\x94\xd2\xef\xde\x9c\x52\xfa\x3b\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\xce\x28\x53\x4a\xff\xb7\x91\xac\x37\xa5\xf4\xbb\x67\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xc8\x85\x96\x52\x4f\xaa\x65\x4c\xd6\x81\x35\xe0\x37\x62\x15\x97\xe5\x6a\xa5\x35\x54\xee\xbd\xac\xf5\x88\x1d\x4b\x74\x95\xfb\x56\x39\xba\xac\x35\x59\x12\x35\x83\xb4\x06\x13\xa6\x33\x0e\xa8\x0d\xa4\x84\xb4\x46\x41\x24\xa4\x01\x30\x74\xf9\xf9\xc3\xa2\x91\xf4\xe0\x35\x65\x7a\x53\x21\x86\x62\x8e\x61\x36\x9f\x59\x12\xe3\x94\xac\x11\xdb\x17\x09\x6a\xf1\x9b\x64\x5c\x9a\x98\x02\x00\xed\x73\x4d\x6d\x30\x63\xc4\x49\x1d\x54\x81\xac\xbc\x24\x84\x21\x5e\x10\x66\xfc\x50\xae\x2d\x03\xc2\x4a\xe1\x64\xb3\xd0\xe3\xb3\x20\x54\x97\x1d\x5a\x8d\xae\x59\x2f\xc1\xb9\x41\xae\x20\x39\xa6\x66\x00\x84\x13\xc1\xa5\x44\x79\x99\x29\x5a\x54\x43\xf8\x76\x8c\x40\x0c\x90\x89\xcc\xaa\x10\x06\x8e\x05\x62\x4c\xf1\x10\xd3\x6f\x37\x56\xba\x25\x70\x36\x18\x78\x0d\xb2\xd1\x0c\x12\xda\xf3\x42\xed\x8c\xcb\xd5\x38\x9e\xa8\x90\x0a\x25\x19\x85\xeb\x1f\x66\x67\x72\x42\x61\x94\x59\xc0\xa9\xaf\x20\x57\x14\xd6\x2a\xed\x62\x59\x0a\xb7\x46\xa1\xa4\x71\x34\xd6\xc3\xd8\x01\x52\x2a\xed\x1d\x2d\x7d\x9e\x09\xec\x7a\x87\x98\xcd\x76\x6b\x85\xed\x4e\x61\x08\x37\xa6\xfd\xa9\x31\xc8\x00\x16\x20\xe5\xc9\x2a\x4a\xf5\xa1\x82\x14\x63\x97\xe7\x33\x6b\xf5\x19\x29\xaa\x64\x39\xb5\xc1\xfe\x4a\x0b\xee\x20\xda\xd9\x02\x11\x30\xb2\xd5\x34\x4b\x12\xa2\x45\x68\xdc\x39\x61\x66\xb8\x83\x8e\x92\x22\x22\xa7\x0c\xdc\xb2\x9f\x88\x94\x78\x4d\x6e\xbc\x06\x1e\x9f\xd8\x04\x36\x9e\x1a\xd5\x40\x08\x19\xc8\x50\xf5\x2f\xb5\x4b\xec\xc4\xc7\x10\x1a\x53\x41\xb9\x99\x4b\x15\x03\xf8\x28\xa8\xd2\x3a\x15\x95\x26\x97\x0e\xec\x9a\xfb\x01\x97\x7e\xd0\x4d\x27\xdc\x27\x07\xba\x06\xa9\xf9\x3b\x4b\x8d\xe3\x6a\x49\xd0\x52\x50\xb2\x42\x2b\xca\x70\x66\x3d\x50\x3e\xfa\x82\x1c\x11\x6c\x04\x6a\x29\xb5\x68\xca\x99\x73\xac\xb8\x35\x2c\xd0\x8f\x76\x11\x4a\x94\x2c\xc1\x83\x39\xcb\x8c\xa7\x04\xd1\x15\x5a\x83\xb7\x4b\x18\x87\xfa\x1f\xde\xfe\xd7\x3f\xa2\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\xf7\xbb\x87\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\x8f\x26\x07\xb3\x87\xa2\x6a\x97\x78\xc1\x8b\x32\xf3\x77\xed\x41\xe8\x83\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\x0f\x38\xcb\x96\x38\x79\xb8\xe7\x1f\xf9\x5a\x7e\x66\x97\x42\x78\xc5\x80\xd6\xbc\x33\xac\xf9\xf2\xa6\x64\x0f\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\x9e\x80\xae\x20\xe0\x09\x33\x44\xf4\x5c\x7d\x98\xd6\x14\xdd\x9c\x8b\x6c\x92\xe5\xef\xde\xfe\xe1\x4f\x86\xf4\xb5\x76\xf1\xa7\xb7\xe0\xfc\x97\x33\xc3\x5c\x34\x67\xf4\x73\x68\x99\xe3\x2c\xd3\x8a\x44\x93\xa8\xf5\xb6\x2e\x62\x7b\x37\x0d\x51\xab\x8a\x21\xcc\x68\xe1\xee\xfe\xfe\x6f\x01\xc9\x8e\x2a\x49\xb2\xd5\xcc\xc4\xde\x55\xf9\xb6\x27\x70\x51\x9c\x58\xde\xa5\x6f\xf5\xee\xd5\x70\x98\x98\xb5\xe5\x59\x99\x93\x0b\x02\x4d\x57\x22\x96\xd9\x7a\xdf\x45\x6c\x64\xb6\x3f\xda\x32\xe3\xc9\x03\x4a\xed\x1f\x61\xb2\x9e\x65\x82\xd7\xca\x86\xf4\x34\x74\xc1\x2a\x0a\x08\x02\xf0\x5c\x24\xcf\x73\x3b\x6e\x35\xe7\xdc\xf2\xb7\xe5\xb8\x28\xa0\xd1\xd8\x0a\x12\x84\x1e\xcd\x02\x02\x3a\x16\x40\xb0\x9d\x74\xf0\x71\xba\x6f\x19\xa0\xfe\x0b\xb9\x67\x3d\xf5\x27\x6e\x03\x0a\xf8\x6f\x13\x2f\x32\x22\xb5\x0e\xd5\x61\x7b\xd5\xda\xcc\x8d\xa1\x31\x03\x27\xf3\xd9\x7d\x78\x46\xf5\x3d\x02\xb3\x42\xa3\xd3\x53\x33\x5e\x19\xa3\x82\x08\x09\xcd\xe1\xd4\x17\xd8\xd1\xf3\x0c\xd3\x50\x46\x17\x42\x75\xc3\xa3\xe7\x2d\x63\xb8\x03\x4f\xbd\x27\xde\x57\x02\xde\xbe\x67\xf6\xe6\x31\x04\x0e\xc9\xf8\x31\x67\xf8\x86\xa7\xf6\x13\x38\xa4\xa6\x70\x41\x8f\xa8\x25\x23\x72\xdf\x8f\xde\x1e\xef\x4b\xbd\x96\xf6\x59\xd5\xbf\x54\x87\xd5\xbc\x65\x8f\xa2\x77\x6f\x8f\x74\x44\x61\xe8\x51\x27\x14\xce\x66\xa3\xe3\x56\x7d\x1f\xb4\x44\x68\xb3\x09\x41\x0a\xae\x45\x19\x2b\x13\x2f\x90\xb1\x69\x6b\xac\x5b\xb0\xe8\xe4\xfd\xc9\xb3\xcf\xa9\x59\xa4\xe0\x05\x5e\x0f\x94\x8e\xda\x5b\xeb\xfe\x87\x28\x25\x46\xc0\x20\x12\x84\x34\xf8\x3b\xb8\x8d\x82\x0b\x2d\x2c\x04\xd7\xd9\xc9\xf9\xf8\xac\x99\xd6\xa1\xcf\x8a\x20\x26\x38\xf8\x31\xe8\xc5\x46\x08\x0b\x5e\xb2\xd4\xea\xe7\x95\x21\xe4\xd3\xde\x84\xaf\x39\x03\x21\xc7\xe4\x20\x05\xc2\x56\xcd\xd3\x8a\x11\xd7\x1c\xe6\xdd\xe2\xdd\xdb\x5f\x96\x4d\xde\xef\x35\xc4\xd3\x18\xb9\xae\xd8\xa4\x39\x1b\xcf\x9e\x91\x2b\xb0\x11\x3d\xab\x4f\x56\x69\xab\xeb\x67\x50\x57\x55\x00\x7e\xd2\xca\x18\x89\x2a\x85\x87\xd0\x6b\x10\x69\xb4\x2c\xd8\xc8\x4a\x78\x33\xaa\x0c\x4c\x5c\x5a\xbb\xd6\xef\x96\xcf\x3a\xdb\xe6\x10\x1b\xa2\xed\xd3\x85\xc3\xd4\x64\xbf\xee\x39\xe6\xad\x2e\x72\xaf\xd0\x6b\xf3\xe6\x89\x84\x58\xd4\x37\xcf\xde\x5e\xbb\xec\xcb\xa7\x22\x98\x47\xd9\x5a\xfa\xe5\x53\x81\x41\x87\x2e\x86\x70\x30\x20\x74\xb4\x6f\x19\x3f\x0e\xfe\x42\x36\x78\x4b\x20\x4e\x96\x66\x58\x78\x33\x09\x2c\x5c\x8e\xee\xcc\xaa\xa0\xd9\x2d\x61\x5b\x2a\x38\x03\x3f\xd5\x16\x0b\x0a\x39\x45\xd0\x8a\x90\x30\x2d\x9f\xfe\xf6\xf5\x97\xb3\x5b\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\xa7\x24\x2b\x25\xdd\x3e\xf7\xfc\x0f\x4b\x3c\xd5\xad\xf8\x15\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\xc2\x56\x5c\x24\x24\xd5\xd7\x90\x2c\x70\x42\x3e\xe2\x65\xb7\x0a\x40\x9b\x9b\xf4\x7e\xe2\x20\x49\xa8\x37\x0b\x4e\x6b\xe6\x5e\x30\xf9\xda\x9d\xe9\xf2\x15\xe2\x82\xae\x29\xab\x6b\x36\xe0\x8c\x08\x93\x30\x9c\x13\x25\x68\x52\xd5\x67\x85\x34\xb9\xc4\xc4\x98\x1b\x2b\x5b\x3f\x4c\xe3\xd6\x6a\xfa\x3e\x96\xa4\x52\x47\xcc\x64\xac\xa2\x65\xd0\x54\x0d\x00\x5d\xaf\xab\x11\x7a\xb1\xd7\xb3\x4d\x44\x8f\x07\xd2\xc8\x15\x53\x44\x6c\x71\x18\x75\xee\x25\x2d\x83\x3c\x12\xc2\x5a\xe1\x17\x35\xac\x4e\xdc\xaa\x7f\x7c\xdb\x9e\xf8\x46\x90\x15\x7d\x0a\x8e\x7d\xdf\xec\x66\xfc\xc3\xed\x47\x40\xc2\xfd\x06\x33\x2e\xd1\x6d\x99\x41\x19\x39\xa9\x30\xb0\xd8\xaa\xef\xf6\x16\xd3\x4c\xf3\xdf\x0e\x9e\x4b\x96\x36\x15\x7f\x46\x12\x22\x25\x16\x3b\xcd\x20\xd7\x84\x11\x81\x95\x3e\x15\x42\x1f\x57\x3d\x9a\xec\x79\xb7\x03\x94\xae\xf6\x26\xe4\xdc\x60\xa2\x6a\x1c\x0a\x09\x1d\x20\x2e\x5d\x5c\xdf\x99\x26\xb6\xb1\xb8\x5a\x8b\x22\xb9\x83\xb8\xc6\xfb\x4c\x9e\xc3\x11\x0e\x22\xec\xe4\xfb\xdb\x9b\x73\xfb\xc1\xc7\x3b\xf3\x41\x7d\xf4\x8d\x02\xbf\xbe\xbd\x39\xb7\xc1\x92\xa1\x5b\xd4\xae\xea\x7f\x96\x44\x50\x22\xac\x27\x41\x90\x84\x0b\x7d\x37\x89\x32\x23\xe0\x47\x59\xa0\x6b\xae\xc8\x7b\x74\x5e\x0a\x41\x98\x82\xcc\xa1\xac\xdf\x1c\x7d\x7e\xf6\x81\x66\x64\x86\xce\x89\x50\xe6\xbf\xf4\xa1\xf9\x2b\xd9\x81\x61\x14\x64\x5d\x13\xf2\x55\xc5\x80\x2c\xd0\x27\x5c\x54\x69\xa7\x27\x27\xf3\xb9\x46\xc8\xdc\x4c\x7e\xae\x32\x39\xff\xff\x9d\x74\xad\xc2\xe7\x1f\xaf\x10\x16\x6b\xd9\x31\x18\x87\x14\xb0\x04\xf7\xb1\xf7\x76\xa8\xa0\x2a\x93\x4a\x11\x72\x57\xf3\xf9\x19\x4a\x88\x50\xcd\x00\x42\xb0\x7b\x62\xb1\x26\xaa\x37\x98\x7b\x48\x0d\x34\xdb\xf5\x09\x7b\xeb\xb1\xed\xdf\x38\xe6\xed\xe6\xc4\xc0\xc1\x15\x3f\xa3\x98\x59\xe9\xe7\x81\xc4\x4b\xe8\xfa\xe8\x3e\x90\x9d\x89\x8f\xcf\x48\x12\x0c\xa0\x3c\xbe\xda\x72\x72\xdd\x88\x1a\xb1\x82\x98\x1a\x1d\x41\xc8\xb7\x44\x6c\x29\x79\x3c\xb5\x77\xf9\x5c\xcb\xa1\x73\xc3\x85\xe5\x29\xb0\xe7\xd3\xef\xe0\x7f\x82\x82\x92\x89\x64\x3a\x4b\x53\xab\x4b\x96\x92\xac\xca\xcc\x52\xfc\x02\xe1\x82\x7e\x21\x42\x52\xce\x66\xe8\x81\xb2\x74\x86\x4a\x9a\xfe\x8f\x50\xb8\x4f\x14\xbe\xb8\x73\xa8\xc5\xe2\xec\x0e\xc4\x92\x5d\x55\x7f\x19\xc8\xbb\x22\x2f\x2e\xa0\x9c\xb2\xde\xd3\xc1\xb6\xdd\x4b\x28\xe3\x47\x59\x30\xe6\x33\xaa\x12\xd8\xa0\x68\xf8\x40\x7c\x42\xea\xa0\xdc\x27\x49\x22\xfc\x81\x6f\x6d\xd4\xc0\xab\xdf\xe8\x11\xb3\x54\x6e\x96\x53\x1f\x38\x60\xee\xd6\x84\x33\xb4\x5b\xae\xa7\xbe\x85\xf1\x40\x82\xc9\x6c\xd3\x71\xfd\x56\x8f\xab\xa5\xd3\x7f\xb7\xb3\x1a\xfc\x73\x82\xb5\xfc\x30\x78\x7b\x3b\x6f\x6a\xf3\xd2\xb6\x9a\xd0\x8d\xe0\xb9\xc6\x61\xd9\xf4\xa6\x79\xa2\x7d\x23\xcf\x7b\x70\xcb\xf5\xd8\x11\xd2\x86\xe8\x11\x37\x6c\xac\x0a\xcc\x1e\x3c\xa6\x93\xc0\x31\x09\x1c\x9d\xe7\x5f\x98\x83\x4d\x02\xc7\x24\x70\x74\x9e\xe9\xb8\x7e\xab\xc7\xf5\x57\x29\x70\x58\xfb\xc5\x28\x91\xa3\x73\x71\x07\x64\x8f\xde\x39\x3f\x57\xe8\xa0\x60\xb5\x13\xe4\xee\x81\x16\x5f\x88\xa0\xab\xde\x73\xdf\x9a\xff\x85\xa9\x32\x65\x87\x84\xb9\xd3\x95\x09\x89\xab\x0b\x59\xfb\x27\xe2\xdb\xbd\x07\x63\xf1\x39\x04\x7d\x9a\xc0\xbe\x0a\xf6\x1e\xc8\xee\xce\xcb\xbd\x07\x38\x77\xdf\xfc\x8f\x20\xb6\x05\x38\xf7\xa1\x5c\x3b\x54\x78\x2c\x9e\x63\x0f\x72\x9f\x10\xa7\xfe\x36\xb9\xf4\x51\x39\xf4\x20\x7e\x86\x38\xf3\x81\x5c\x79\x98\xf3\x0e\x71\xdd\x10\xc7\xf5\x71\xdb\x20\x2b\x35\x96\x5c\x5f\xd1\xc3\xfd\xb2\xba\x10\xbe\xb9\x05\xde\x55\xc5\x6c\x40\xc8\xd6\xf3\x4e\xb7\x77\x86\xe0\x17\x1b\x70\x50\x80\x91\x7c\xcf\x95\x86\x7e\xb8\xfd\x18\x6d\xe2\x87\x2f\x6e\xca\x2c\x33\x9b\xd6\x39\xec\xed\xe6\x4f\xac\x22\x8e\x2a\x12\xb2\xe1\x66\x86\x43\x0d\x50\x1c\x83\x94\x1a\x3d\x95\x1f\xa9\x83\x97\x86\x3c\x59\x94\x59\x66\xb8\x15\x2c\x09\xa6\x65\x53\x07\x04\x59\x53\x3d\x73\x22\x91\x24\xa6\x4a\x4d\xff\x91\x2b\x25\x11\xf3\x75\x49\x53\x72\x6a\xbe\xff\xce\xb8\x3a\x77\xfa\xd4\xc1\x2f\x7a\x14\x3b\xc5\x39\x67\x73\x3c\xef\xc6\xcb\x79\xe2\xb7\xda\x75\xbc\x79\x82\xb3\xcf\xb0\x63\xb7\x6e\xf9\x6e\x17\x24\x22\x8c\x97\xeb\x0d\x70\x08\x91\x63\x57\x70\x2c\xeb\x6d\x1d\xb2\xe3\x25\xb2\xf1\xb2\x0d\x26\x93\x90\xd4\x39\xdb\x6c\xa8\x63\x17\x99\x5d\x2a\x0b\x73\x6c\x3f\xd7\xfb\x16\x79\xde\x11\x39\x5e\x90\xdf\x1d\xe0\xff\xa5\x8c\xaa\xca\xd1\x1e\x3e\x2f\x27\x57\xad\x77\x5d\xcd\x1d\xeb\xee\x6d\x03\x6a\xa4\xdb\xf6\x10\xdf\x0a\xea\x10\x98\x62\x83\x5c\x12\x68\x3c\xd8\xa8\xac\x48\x16\xeb\x05\x5a\x11\x95\x6c\xaa\x13\xa8\x0f\x15\x65\x7a\x5d\x7d\xc1\xef\x55\x0c\xa4\x61\x21\xc6\x79\xd8\x6a\xa2\x69\xce\x5e\xe5\xfe\xb4\x1d\x34\x17\xe8\x8c\xed\x4c\xf4\x7b\x77\xeb\x6c\x99\x44\x28\xfb\x0a\x95\xec\x34\x18\xbe\x82\x66\x9f\xcd\xb5\x1a\x67\x69\x46\xb0\x29\xca\xed\x32\x8f\x10\xef\xf6\x9d\xb0\x25\x2b\x9f\x5b\x7c\x41\x0f\x5f\x77\xa3\x94\xdd\x4e\x97\x3f\xc8\x9e\x1d\x81\x6e\xa9\x6c\x07\x3c\x2a\xc1\xd2\xc5\xe2\x41\x76\x97\x95\x43\x00\xe7\xf0\x69\x17\x1d\x84\x29\x2a\x48\xb6\x43\xbc\x54\xf5\x21\x4e\xb8\xe9\xa4\xf5\xe8\xe2\x91\x73\x4c\xdb\x69\x2c\xd6\xff\xd8\x9b\x5f\xb6\xdc\xa1\x94\x43\x65\x32\x3e\x03\xe6\x61\x92\xca\x5c\x74\x33\x78\xe5\x37\x78\x4b\x79\x29\x4c\x29\x57\x41\xf0\x03\xc2\x0a\xd6\xd1\xdb\xc7\x46\x9f\x4c\x5e\x42\x94\x25\x4d\x48\xc7\x69\x19\xc3\x0e\xcf\xaa\x2c\xc1\xa2\xc8\xb4\x80\x4e\x9b\x79\x77\x66\x6e\x7a\xae\xae\xfa\x96\x6b\x67\xda\x1b\xcf\x8a\xf5\x09\x18\xcb\xdc\xb0\x58\x47\x75\x99\x3e\x13\xeb\x32\x87\x94\x17\x4b\xfe\x75\x79\x62\xdb\x9b\x8c\x27\x0f\xee\x1e\xf5\x27\x60\x9d\x7f\xba\x70\x61\x94\x26\xd3\xa4\x4e\x40\xb5\x35\x4e\xd3\x05\xfa\x72\x50\x20\xd6\x60\x08\xd6\x7e\x0c\xd6\xd5\x0a\x64\x63\x33\x96\x07\x68\x5d\x85\x54\x10\xc9\xb3\xad\xab\x68\x5f\xcd\xcc\xdd\xd7\x94\x15\xa5\xb2\xbc\xd2\x85\x34\x78\x60\x96\x2c\xd9\x60\xb6\x76\xb1\x25\x8d\x95\x21\xb9\x63\x0a\x3f\x39\x1e\x45\x64\x82\x8b\x2a\x75\x06\xa5\xbc\xf4\x4f\xf4\xb7\xbf\x9d\x21\x4a\xde\xa3\xdf\x36\xc0\x2d\xd0\xa5\x85\xd0\x40\x64\x23\x91\x70\x59\x23\xcc\x17\xd0\x24\xc8\x1a\x8b\x34\x83\x9c\xfd\x55\x4b\x54\xad\xa2\xe5\xc8\x13\x95\x0a\x52\x72\x18\x57\x8d\x60\x24\xdf\xea\xc7\x35\x18\x37\xcd\x71\x0d\x3b\x9e\xa7\x58\xe1\x79\xe3\xa8\x9c\x1a\xa9\x78\x6e\x6b\x69\xce\xb1\x25\xd2\x46\xfb\xdc\xef\x6c\xe3\xd1\x39\xae\xde\xa2\x5a\x7c\x81\xda\x93\xfd\xd7\x5e\x30\x0e\x7d\x50\x07\x08\x07\xa5\x05\x0b\x9f\xb6\x4f\xdc\x65\xdd\x09\x09\xa0\x41\xc0\x46\x5d\xe0\xb8\xca\x30\xb1\x55\x34\xef\xbd\x79\x84\x7b\x27\x13\x5d\x5e\xdf\xdf\xfe\xed\xe6\xf3\xd5\xf5\xfd\xe0\x51\xf4\x40\x1c\x38\xa0\x31\x47\xd1\x03\xd9\x7f\x40\x87\x8f\xa2\x07\x64\xe0\x80\x0e\x1f\x45\x3f\x5b\xf0\x1e\xd0\xe8\xa3\xe8\x81\xed\x39\xa0\xf1\x47\xd1\x03\xb7\x73\x40\x7f\xe5\x47\x91\xb0\x6d\xc4\x31\xfc\x68\x95\xb5\xbe\x40\xe1\xfd\x22\x92\x83\x89\x24\x47\x4f\x84\xb9\x64\xdb\x2f\x58\xd4\x2d\x6a\x21\x03\xb9\x37\xa6\xd9\xbe\xe0\x35\x94\x00\x2b\x39\x3f\x46\x26\xcc\x28\x73\x7e\x53\x67\xea\x9b\x77\x5d\x9c\x29\xd4\x54\x1c\xa1\xf3\x9f\xae\x2e\x2e\xaf\xef\xaf\x3e\x5c\x5d\xde\x3e\xdb\x21\x31\x58\x36\xb2\xcd\xa8\xc7\x70\xc3\xe0\x22\x6a\x4e\x59\x08\xa2\x25\x51\xe9\xcc\x3e\x1e\xf2\xa3\xc3\x65\x74\xda\x69\x31\x5a\x96\x95\x5a\xc1\x4c\xfa\xd1\x6d\xaa\x44\x84\x51\x1d\xcf\x90\x5b\xac\x37\x08\x73\x2c\x5b\xb6\x0c\x38\x08\xf3\x45\x98\xb3\x79\x0e\x67\xd1\xe1\x19\xb7\x25\xa9\x76\x72\x47\xb0\x8c\x54\x3c\x59\x7f\x10\x3c\xd0\x00\x77\xdf\x44\x09\xaa\x6b\x65\xa5\xeb\xa3\x98\x13\x69\xe0\x86\xcb\x27\x35\x18\x9f\x15\x37\xaa\x92\x40\xfa\x77\x48\x1d\x0f\x41\x88\x2d\x47\x5b\x45\x44\xfc\x95\xec\x6e\xc9\x40\x35\xac\x8e\xfd\x3f\x23\x89\xe6\xa0\xce\xe8\x8e\x6b\x9f\xf6\x50\x11\xc9\x31\xe5\x72\x07\x1c\xb7\xbd\x73\x1b\x15\x23\xe1\x9e\x51\xa5\x72\x0f\x2a\xe2\xfb\x8d\x98\xbc\xda\xcf\x58\x03\x58\x14\xd0\x21\xc7\xad\x7b\x46\xe1\x3c\xc6\x91\xeb\x9e\xd1\xf1\x17\x51\xcb\x8a\xf7\x30\x74\x17\x39\x94\x33\x67\x9e\xf8\x42\xc7\x7e\x9f\x6f\x7b\xdc\x88\x0a\xc6\xb0\xd7\x63\xcf\xff\x49\xcd\x00\x4c\xfa\x66\x55\xba\x2e\x7d\xef\x2c\x4b\xb2\x6a\x86\xb4\xd0\x04\x39\x4c\x3b\xad\xd7\xc1\xfa\x3c\xab\x7f\x83\xac\x12\xd9\xf8\x01\xb8\xa4\xc9\xca\x18\x06\x2d\x0b\x92\x2c\x18\x4f\x89\x3e\x84\x33\xf3\x4f\x7b\xb7\x9f\x25\x09\x2f\x99\xb2\x7f\x80\xc2\x22\x8b\x0d\x97\xea\xea\x26\x02\xac\x79\xbd\xe0\xe9\xd5\xcd\xac\xf5\xaf\x6e\x5c\xfe\xfe\x33\x86\x0d\xd6\xe7\x70\x34\xf9\xdb\xef\x2a\xc7\x68\xb2\x21\x39\x86\xff\xfc\xa0\x37\x2e\x90\x6f\xd6\x7e\xa8\xac\x8b\xff\x30\xa8\x78\xa2\xef\xed\x76\xb9\xfc\x57\xdb\x77\xaf\x8e\xce\x6c\x57\x6e\x9a\xa3\x97\x0e\xae\x75\xd7\xde\x05\xa8\xb4\xf6\x07\x47\x48\x83\xee\xa9\xbb\x62\x9d\xdd\x5c\xa1\xad\xc1\xe7\x91\x97\x19\x7f\xf2\x57\x91\xbb\x16\x7d\xfe\xb5\x3c\xaa\x25\x97\x0f\xcf\xe4\x03\x0e\x4e\xa7\x5e\xc6\x7b\x48\x96\x19\xc4\x97\xfb\xde\x96\xb1\x91\xb6\xd2\x18\xb4\x1a\x90\xe8\xb5\xf9\x71\x91\x14\xe5\xcc\xbe\xb0\xc8\x49\xce\xc5\x6e\xf8\x94\xda\xd7\x49\xb1\x21\x39\x11\x38\x9b\x4b\xc5\x05\x5e\x43\x1a\xb5\x01\x6f\xc0\x56\xff\x32\x80\x87\x4f\x65\x63\x82\x5d\xe8\x46\x97\x49\xaa\x8c\xa1\x3a\xdf\xe7\x98\x9c\xa1\xc2\xf2\x70\x4f\x3d\xf3\xb4\xb7\xaf\x76\x96\x80\x4c\x53\xd1\x21\x88\xb1\xb6\xa4\x45\xdc\xa5\x5f\x79\x6c\x21\x65\x90\x6d\xb5\xd0\x1b\xa8\x24\x59\x3f\xa3\x98\x41\x4a\xb7\x54\xf2\x81\x46\xb5\x3d\x0b\xbd\x6b\x75\x20\xb1\x15\x93\x8c\xe3\x34\xae\x75\xa3\x79\xc8\x53\x01\x15\xef\x2a\x5a\xdd\xe3\x7f\xef\x5e\x1d\x7b\xc1\x6e\xa4\xf1\x5b\x7b\xeb\x58\x4a\x7d\x32\x2b\xf6\x77\xe4\x7d\x89\xe7\x5e\x6e\x2a\xc7\x62\x5e\xc6\x3f\x76\x1c\x05\xc6\xfa\xda\xea\x12\x37\x03\x95\x06\x90\xd5\x04\xfa\x83\x0e\xda\xcf\x2f\xa5\xf3\x3c\x37\x68\xd5\x3d\xa3\x83\x57\xdd\x33\xe9\x51\xbf\x26\x3d\xaa\x13\x82\x15\xb5\xae\x7f\x3b\x25\x2a\xe2\xb5\xe1\x30\xde\x97\x2b\xee\x40\xd8\xd6\x6f\xc9\xea\x35\xe0\x3b\x49\xac\x51\x97\xb1\xdf\x04\x1a\x76\x23\xb5\x0a\xd1\x01\x83\xaa\x8d\xb4\xb5\x4b\xce\xdc\x4d\xf9\x80\xe9\xba\x65\xb4\x46\x67\xd0\x8b\xcf\x30\x28\x00\xeb\xac\xa1\x82\xd8\xc2\xfa\xa6\xc0\x28\xd9\xfa\xed\xf8\xd0\xc6\x73\xaf\x46\x84\x6d\xe3\x41\xd9\xda\x16\x39\x32\xf7\x83\x35\x36\x52\x56\xd5\x11\xf6\xc0\xac\xc4\x02\x55\x35\xd5\xc5\x52\xf2\x04\x7a\x7b\xd4\x7d\x6c\xa1\xb4\xa4\x5d\x38\xcc\x5c\xe1\x07\x1f\xc8\x66\x4f\xdd\x2f\x1a\x62\x8d\xc3\xe5\x0e\xea\xda\xb2\x6d\x65\xb7\x2d\x8d\x8f\xc9\x5c\x06\x81\x06\xac\xd0\xb4\xb4\x09\xf9\x25\xbc\x2d\x9a\xe8\xac\x55\xb4\xe1\x74\x81\xfb\xa9\xd2\x14\x30\xf8\x84\x7a\x42\x72\xdc\x53\x99\x6a\x7c\xb4\x16\x73\xb5\x56\xa6\xce\x01\x31\xa1\x73\xa7\xd6\x86\xa2\xf6\x5d\x7a\x04\xf3\x6b\xcc\xe5\xf7\x6d\x5f\x7c\x47\xcf\xe8\x40\x63\x2e\xb3\xd8\x8b\x6c\x84\x31\x70\xdc\xc5\x14\x7b\x29\x45\x5d\x22\x45\x6f\x9d\x10\xef\x3a\x9a\x21\xb2\x14\xda\xc9\xaf\x28\xa4\x73\x6a\x40\x05\x61\x26\x5c\x0f\x27\x9b\xc1\x4b\xce\xb2\xea\xda\x7a\x5f\x3b\x11\x8f\xeb\x28\x34\x72\xe4\xd8\x03\x78\xd7\x27\xc9\x4e\xa7\xef\xdf\xe7\xf4\xd9\x0d\xfe\x6a\x47\xef\x99\xb2\x55\x6f\xf4\x7c\xcf\xd2\x4f\x2e\x1a\x81\x45\xa6\x3c\xce\x58\xda\x69\x04\x96\x9a\xb8\x73\xcf\x8a\xda\x8d\xf7\x2b\x36\xa1\xb8\x09\x0c\x46\x1b\xba\xd6\xc8\x37\xcd\xf8\xcd\xcd\x88\x72\xcc\xf0\x1a\x3a\x10\xf9\xd0\xc4\xab\xba\x5c\x5c\x20\x4d\xc6\x82\xa6\x9d\xf2\x5a\x20\x22\xb9\xa0\x58\xf8\xa3\xe0\x59\xe6\x6f\x78\x9a\xd1\x07\x82\x2e\x48\x91\xf1\x5d\x6e\x23\x32\x52\x74\xa7\xb0\xd2\xa4\x7c\x47\x94\xcf\x8a\x3e\x40\xa6\x55\xb6\x41\x74\x15\xf4\x93\x2b\xd8\x97\xa2\xcc\x32\x54\xc0\x47\x0b\xe8\x14\xce\x57\xe8\x0c\xaa\x55\xcd\xd0\x35\xd9\x12\x31\x43\x57\xab\x6b\xae\x6e\x8c\x30\xe3\xe3\x89\x4d\x67\xb4\xf9\x1c\xd1\x15\x7a\xaf\xc5\x68\xa9\x90\x32\xdd\x0e\x1a\xcd\xf9\xb9\x68\x81\xf5\x40\xad\x0a\x3d\x3e\x23\x2c\xc9\x4f\x4c\xdf\x01\xa4\x2a\x85\xc1\x63\xba\x1b\x40\x7c\xd5\x53\x26\x02\xe5\x67\xb6\x8b\xb6\xaa\x23\x94\x1d\x0d\x22\x53\x22\xd7\x15\x30\x04\x61\xd5\x5b\x95\x56\x10\x59\x70\x26\x49\xbb\xae\x69\xdd\x1d\x0b\x54\x00\x19\x2d\xe1\x0e\x5f\x20\x05\x97\x0a\xba\xe6\xc7\x36\x0f\xba\x71\x1f\x40\x1b\x0d\x9c\x65\x24\x45\x34\xcf\x49\xaa\xb5\x82\x6c\x67\x5b\xa3\xe0\xa8\x0a\xd3\x1a\x82\x2b\xb6\x76\x65\x2e\xa3\x0d\x66\x69\x46\x04\x54\xbc\xb7\x9a\x47\x4b\xa3\x71\xd5\xe9\x83\x5c\xd5\xd8\xb2\x6d\x6b\x0e\x84\x93\x84\x8b\xd4\x36\x87\xd4\xaa\xbd\x8b\x9d\xaf\xce\x06\xf0\xef\x41\xae\x81\x4c\x31\xb9\xf6\x94\xa0\x26\xb8\x6c\x74\x0d\xd9\x70\xfe\x80\x12\x9e\x17\x19\xd0\xea\xf1\xba\x1e\x35\x88\xbc\xee\x71\x54\x51\xc6\x1c\x7a\xb2\x9d\x36\xda\x1f\xc1\x0f\xcf\xed\xa4\x46\x9e\x48\x12\xbe\x15\x5b\xd4\xa1\xb9\x8c\x46\x3e\x14\x14\xe3\xac\x12\x31\x56\x5c\x33\x6b\x88\xc1\x87\x53\x30\x70\x23\x2e\x49\xcd\x50\x16\xe8\xf2\x89\x24\x7b\x5d\xb7\x6d\xef\x3a\xc5\xe1\x38\x85\x4d\x79\xf1\xd6\xca\x60\x88\xae\x77\xcd\xe7\xe6\x2b\x57\x6c\xdd\x02\x81\x16\x05\xa6\x0d\x3e\x84\xed\x46\xd8\x85\x1a\x69\x4b\xd5\x2e\x9a\x13\xd0\xa9\x4b\x19\x68\x11\xd0\x7c\x9a\xf3\x81\x76\x35\x9c\x2b\xf4\xfa\xe4\xf4\xe4\x4d\xc7\xa8\x11\x55\xce\xbb\xf9\xdc\x37\x60\x53\xa8\xc1\x5a\x64\x3b\x58\xed\x49\x3a\x43\x54\xb9\x08\x1f\x51\x32\xbb\xb2\x08\xa0\x36\xa6\x79\x86\x24\x47\x4a\xe0\x94\xda\xeb\x1e\x7e\x85\xca\x81\xa2\xb4\x9c\xf6\xf5\xc9\x3f\x4f\x62\x2c\x8f\x44\x25\x6f\xd0\x23\x67\x27\x0a\xd0\xb8\x40\xf7\x26\x81\xae\x1a\x6a\xc7\x4b\xc4\x88\xcd\x09\x7a\x2a\x32\x9a\x50\x15\xe1\xe1\x43\xc0\xfc\x10\x2f\x4d\x2b\x25\xcd\xf7\x6d\x3c\xf6\xe5\x13\x55\xae\xa9\x07\x5f\xa1\xb7\xa6\xbf\x13\x19\xe0\x59\x15\x0a\x24\xf4\xa1\x3c\xdd\x10\x9c\xa9\x8d\x69\xab\xc1\x38\x9b\xff\x83\x08\x0e\x51\xdb\xcc\xfe\x65\x78\x93\xa2\x3a\x8f\xa3\xb1\x36\xd7\xb8\x26\xd1\xd1\xe6\xc6\xc1\x26\xfc\xe8\x85\x1a\xf1\xa3\x51\xbc\x61\xb8\xa5\x64\x77\x9e\x11\x4d\xf9\x23\x0f\xf1\x8b\x34\xe6\x47\xb1\xcd\xf9\xd1\x38\x12\x89\x6e\xd2\x8f\x0e\x6a\xd4\x1f\xb1\x2a\x68\x2e\x7e\x50\xb3\x7e\x34\xe6\xd8\x8c\x6e\xda\x1f\xe5\x50\x30\x5d\x5c\xc6\x37\xee\x47\x23\x3d\x73\x68\x84\xcf\x0a\x1d\xab\x89\x3f\x1a\xcb\x6d\xd0\x98\x66\xfe\xc3\xd3\x8c\x6d\xe8\x7f\xc0\x3c\x63\x5d\x35\x28\xb6\xb9\x3f\x8a\x6e\xf0\x8f\xc6\x78\x99\xd1\x08\x1e\x1e\xd3\xec\x1f\x1d\xb9\xe1\x3f\x1a\x87\xfa\xe1\xf6\xb8\x28\xae\x45\x2e\x1a\xd9\x26\x17\x8d\x6b\x95\x8b\xfa\x13\x20\x04\x62\x55\x37\x56\xd5\x69\x97\x1b\xb1\xef\xbc\xe3\x9d\x0a\xb6\xcc\x8d\xa1\xa4\x56\x53\xdd\x03\xdb\xe6\xa2\xe7\xb4\xce\x35\x0f\x44\xf7\x45\x9c\xfb\xb6\x55\x0e\x3e\x6a\x56\x49\xb0\x37\xaf\xd5\xff\x5c\x11\x8a\x98\x6b\xa4\x69\xf9\xd0\xe4\x7b\x44\xba\x8d\x63\x16\x03\x0d\x82\xd1\x08\xa7\xee\x70\xd3\x70\x74\x68\xe3\xf0\x01\xac\x40\x5b\xf1\xf1\xcd\xc3\x07\xa1\x56\xad\xc5\x47\x35\x10\x47\x2f\x2d\xf5\x1d\xb1\x99\x38\x1a\xd9\x50\x1c\xfd\x5a\x38\x67\x44\xa3\xf1\x5f\x31\xe7\xfc\x65\x79\x4b\xc4\x4b\x85\x20\x77\x8a\x7b\x6b\x95\x76\x2c\x8c\xe6\x75\x8f\x7d\x71\x49\x56\x5c\x90\x78\x03\x63\x6d\x30\x44\x69\x09\x27\x11\x33\x88\x7d\x76\xba\x22\x6f\x9a\xfe\x82\x31\x16\xa8\xd1\xef\x55\xeb\xe8\x8c\x48\x79\x0a\xa6\xc4\xb2\xb0\x2d\xd3\x6d\xa3\xce\x99\x5e\x33\xc9\x61\x45\xb3\x98\x38\x41\xdb\x56\x14\x5e\x27\x2a\x31\x21\x26\xce\x16\x6a\x2d\x29\x0e\x19\xf1\x1d\xfc\x12\x81\xe5\xc6\x34\xcd\x24\x4f\x54\xd9\xc6\xb1\x82\x60\xc9\x4d\x37\x8c\x66\x7b\x54\x2a\x51\x81\xa5\x29\x8e\x12\xba\x49\xea\x89\x19\x70\x37\x3c\x3d\x39\x91\x2d\x50\x6b\x81\x13\xa2\x35\x70\xca\x53\x04\x09\x09\x29\x7f\x0c\xb9\xb6\x96\x64\x4d\x99\x74\x7b\x6b\xca\xc4\x19\x22\xd0\xdc\x9c\x80\x85\xc9\xe5\xbf\x2f\xd0\x6d\x95\x6c\x37\x6c\xa9\xe5\xa5\x4a\x78\xcd\x24\xec\xcc\xf7\x0d\xcb\x10\xb6\x02\x5b\x3f\xd4\x43\xa7\x22\xa7\x66\x83\xa3\x01\x14\x58\x0b\x73\x00\x6a\x83\x00\xc7\x5a\x98\x43\x28\x10\x8d\xaf\xbc\xfb\x03\x6d\xac\x71\xb2\x69\xfb\x5d\x26\x63\xf5\x64\xac\x0e\x3d\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xde\x67\x32\x56\x4f\xc6\xea\xc9\x58\x3d\xfc\xed\x64\xac\x9e\x8c\xd5\x93\xb1\xba\xe7\xf9\x16\x4d\x2e\x93\xb1\x3a\xfc\xf9\x64\xac\x9e\x8c\xd5\x01\xa8\x93\xb1\xba\xf7\xfd\x5f\x03\xe7\x9c\x8c\xd5\xa1\x8f\xbf\x31\x63\xf5\xc0\x0b\xce\xea\x7b\xa3\x65\xdc\x98\x48\xec\x1b\xb0\xb1\xd1\xc4\x9a\x87\xf9\xaa\x15\xd5\x6b\x80\x2d\xea\xea\x7b\x9e\x89\xd7\xf9\x80\x2e\xa6\xd5\x1a\x81\x6b\xa3\x73\x6f\x4c\x30\xd8\xf3\x3c\x30\x0f\xae\x0b\x5d\xf0\xb4\xb6\xe4\x35\x4c\x78\x46\xee\xef\x3f\xf4\xc3\x4c\x2c\x6c\xbb\x3b\xc8\x6e\xd7\xb6\xcc\x05\x88\xe7\x19\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\x51\x06\x85\xe8\xeb\x30\x46\x77\x8b\xe0\xdc\xd6\xad\x76\xbf\x11\x44\x6e\x78\x16\x38\x49\xad\x53\xf4\x89\x32\x9a\x97\x79\xab\xff\xb9\x05\x25\x2b\x8a\x37\x3c\x34\x68\xdd\x5a\x02\x6d\x6b\xd2\x83\x6a\x32\x98\x66\x7a\x37\x20\xd1\x61\x83\xb7\xc0\x71\xca\x24\x21\x04\x6a\x98\x5f\x44\x19\xcc\x7e\xbf\xa8\x66\x57\x15\x44\x7c\xe7\xdf\x19\x53\xdd\x05\x24\x96\xdf\xff\x6e\x00\x93\x61\xa9\x66\xd0\x84\xf9\x12\xe6\xcb\x38\x36\x39\x2c\xc0\x8e\x36\x59\x46\x14\xc3\x79\x11\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xc7\x9b\x27\x61\x7f\x87\x94\x97\x43\x4c\x93\x51\x5c\x64\xb4\x49\x32\xc6\x06\x7d\x90\x39\x72\x8c\x29\xf2\xa0\x3a\x2f\x87\x9a\x20\x47\xe9\x1d\xd1\xa6\xc7\xe3\x98\x1d\x5f\xa4\xa6\x52\x04\x5e\xe2\xcc\x8c\xd1\x26\xc6\x38\xf3\xe2\xb0\x69\xf1\x98\x66\xc5\x48\xd4\x0e\x2b\xc5\x11\x0a\xf1\x18\x65\x78\x84\x22\x3c\xda\x7c\x68\x91\x34\xb0\xad\xb1\x0a\xf0\x9e\x7a\x3b\x00\xf5\x30\xe5\xf7\x19\x8a\x6f\x8c\xb9\xf0\x45\x4c\x85\xe3\xcc\x84\x51\xbb\x3d\x7c\xb8\x07\xd4\xf7\x88\xa3\x0a\xad\x9c\x70\x76\x41\x32\xbc\xbb\x23\x09\x67\x69\x80\x53\xef\x95\x3a\xa8\x68\x4e\x9a\x0f\xad\xe4\xd6\x8e\xb2\xd9\x60\x5b\x2d\x27\xe8\xf7\xb6\x01\x4a\x4e\x73\xb7\x97\x0b\xd4\x46\x34\x33\x3c\x24\x7b\xf9\x08\xfa\x35\x3a\xaa\x88\x68\x02\x83\xc6\xa1\xf9\x3f\xf8\x23\xe2\x2b\x45\x18\x7a\x4d\x99\xc3\xf4\x9b\x86\x70\x58\xcb\xda\x21\x92\xb3\xe4\xa9\xbf\x7b\xf7\xd6\x81\xf9\x5a\xa2\x32\x08\xf5\x52\x1e\x43\xeb\xb0\xa0\x9e\xa3\x76\x58\x10\xab\x32\x6b\xab\x1e\x46\x1d\x89\xd5\x3b\xde\xd5\x25\x51\xde\xc1\x5c\x2a\x5a\xd6\xda\xa4\x0d\x66\xec\x22\x3c\x08\xf1\x17\xd8\x8a\x08\x97\xc0\x41\xee\x00\x63\xf0\x1f\xb8\x62\x47\xb9\x02\x9a\xc6\xfe\x00\xdc\x31\x6e\x80\x17\xd1\x9e\x8e\x68\xfa\x1f\x63\xf6\xff\xb7\x93\x6c\x22\xcc\xfb\xbf\x22\xc9\xe6\x97\x90\x05\x14\xcd\x09\x2f\xd5\x91\xc4\x80\xc7\x0d\x4d\x36\x4d\x8e\x4c\xc3\xf5\x8a\x78\xb9\xd7\xa0\xe3\x9d\x05\xd8\x7b\x4b\x1d\x2f\xa2\xf6\x1b\x93\x12\x06\xf6\x29\xb2\x73\x6a\xb3\x0c\x55\x2d\x8b\xd5\x35\xca\xb1\x44\x18\x5d\x5c\xdf\xfd\xf4\xf1\xec\x2f\x97\x1f\x17\xe8\x12\x27\xbe\x52\xe1\x8d\x2a\x21\xcc\x34\x44\x34\xb4\xbf\xc1\x5b\x82\x30\x2a\x19\xfd\x7b\x69\x6a\x15\xa1\xd7\x15\xc4\x37\xce\x6b\xe2\x01\x3a\x54\x5f\x65\x80\x67\x40\xe3\x80\x11\x95\x2a\x4d\xa3\x01\x63\x46\xe6\x5a\xcc\x17\x3c\xdf\x77\xfb\x5d\xea\x3f\xf9\x59\x14\x36\xbc\x67\x43\x04\x41\x6b\xba\xb5\x06\x3b\x5b\x82\x06\xa7\x55\x90\x6a\xb3\xd3\x2e\x5e\x82\x99\xda\xcb\xa1\x18\x51\x9a\xfa\x2a\x8d\x83\x33\xd9\xcc\xbf\xd0\x1a\x89\x9c\xa1\x65\x09\xa6\xfa\x42\xd0\x1c\x0b\x9a\xed\x9a\x43\xe0\xcc\xc7\x6f\xae\xb9\xbb\xa1\x77\xe6\x3a\xae\xa7\x7f\xf1\xf9\xf2\x0e\x5d\x7f\xbe\x87\x9e\x48\xfa\x66\x05\x2b\x3a\xfc\x1d\x10\xb3\x24\x7e\x34\xd8\xda\xd6\xa6\xf5\x2a\x7c\x62\xce\x39\x95\xd0\x84\x99\x40\x97\x77\xab\x95\xbb\x52\x50\xaf\xde\x2e\xe0\xff\x7c\x65\xaf\x71\x9a\x0a\xcd\xcd\x2b\x27\xc4\x5e\xfe\x80\xe6\xb2\xc0\xef\xe9\x32\x6b\xec\x9d\xc5\xde\x2f\xd6\x19\xac\x72\x26\xde\xe8\x65\x37\x1b\x84\x55\x1b\x09\x08\x31\xf5\x4a\xa1\x09\xa9\x97\x0f\x0c\xf6\x35\x8b\xac\x57\x59\x4f\x28\xba\x5e\x5e\xcd\xaf\xdd\x65\x6a\x0f\x05\x6f\x94\xb4\x46\x57\x37\x6e\x5b\xc2\x17\x1a\x94\x11\xab\xee\x42\x5b\x0c\x1a\x00\x1b\x93\xc4\x0c\xbd\x45\x7f\x46\x4f\xe8\xcf\x70\xb5\xfe\x31\x04\x2c\x8e\x83\xc6\x89\xb5\x46\x6a\xbb\xba\x89\xc6\xca\x8f\xfa\x08\xe8\x6f\xf4\xca\x15\x47\x4b\xca\x52\xd3\xa1\xc9\x35\x1d\xb6\xd8\x7a\x76\x85\x43\x3d\xc8\x51\x37\x0c\xac\x13\xe8\x6a\xd5\xa8\x15\x16\x96\x14\x47\x6e\x99\x06\xad\x25\xd9\x6b\x43\xe4\x61\xf3\x74\xab\x62\x59\x3d\x52\x8e\x55\xb2\x69\x9f\x20\x7d\x85\x4b\x55\x13\x71\x58\x18\x4e\x39\x68\x08\xc6\x1d\xb8\xa1\x41\xaa\x3c\x2e\x21\x8d\x6a\xbe\xd7\xda\x85\x3d\x4c\xef\x09\x8a\x03\x42\x78\xea\x6e\xd6\x46\x3a\x54\xc1\x53\x73\x55\xc3\xa4\xd2\x06\xbb\x71\xb7\x72\x10\x68\xf7\xc6\xb6\x21\x2a\x95\xea\x0c\xf4\xa5\x4f\x82\xed\xc6\x09\x15\x2c\xc5\x40\xc6\x82\x3e\x2d\x55\x0f\xbc\xe0\xc6\x44\x9d\x8f\x42\x70\xc5\x13\x1e\xac\x19\xd9\x36\x09\xdb\x0f\x4c\xeb\x7e\x43\x59\x16\xe7\x3f\x5c\xdc\xcc\xb4\x46\x08\xc5\xf3\xee\xce\x87\xac\x72\xad\xf6\x70\xf7\xe7\x37\xc1\x36\x35\x11\x8b\x19\x2e\xe7\xdd\x62\xe1\x3e\xb1\xfc\x79\xb5\x27\x05\xc1\x29\x3d\x5a\x6c\x8d\x6b\x75\x58\x41\x1d\x13\x64\x93\xf3\x2d\x49\xcd\x05\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0c\x44\xde\x0c\xcb\x90\x5f\xc1\x32\x38\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\x78\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x5e\xb4\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x78\x69\x8a\xbc\xb1\x93\xfa\x97\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\xe9\x8c\x32\x45\xde\x7c\x1b\x3e\xb5\x29\xf2\xc6\x3d\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x7b\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\xce\x79\x5e\x94\x8a\xa0\xdb\xaa\x5d\x7d\xd5\x33\x7d\xb9\x33\x7e\xc1\xc6\xe1\x78\x29\x37\x87\x69\xdb\x55\x0a\x08\x15\x39\x35\xb5\x10\xe7\x89\x99\xda\xbc\x5a\xcf\xbc\x9a\xc9\xe9\xa1\xae\x0e\xd3\x3b\xdf\x4f\x0f\x75\x7c\xcc\x4d\x14\xe3\x8f\x62\x5c\x6d\x8c\x7f\x84\x29\x34\x0c\x2d\xa6\x59\xd4\x13\x90\x2f\xce\x79\x69\x4a\x40\xda\xd5\x07\xc6\xae\xf0\x62\xcc\x44\x5f\x0f\xed\x28\xbe\x67\x30\x91\x5f\x19\xfb\xb7\x76\x12\xfb\xf8\xb7\xec\xe3\x30\xfc\xbb\x23\x03\x11\x08\xd5\x08\x54\x22\x9e\x53\xa5\xe5\x14\x2d\xec\x35\xa2\x85\x42\x5e\x0d\xaa\x5a\x36\x54\x4b\x2d\xe0\x73\xc4\xca\x54\x41\xad\xdc\x1c\xcd\x9e\x6b\xae\x9b\x5a\x08\x5d\x50\xf9\xb6\x92\x96\x60\xd7\xe7\xae\xf9\x2e\x30\xce\x6f\x9a\x82\x06\x5e\xd0\xf2\xbe\xa0\x6a\x77\xce\x99\x22\x4f\x1e\x09\xa6\x4d\x0c\x77\xf6\x13\xdb\x55\x50\x56\xa2\x94\x75\x62\x8a\x92\x41\x54\x43\xc4\x55\x12\x83\x2c\xd3\x6d\xec\xd4\x4d\x14\xb0\x42\x9e\xd4\xa9\x07\x64\xdc\x56\x28\x2c\x1f\xea\x7d\x20\x73\x7d\x39\xd5\xe8\xee\x8c\x75\x28\xe3\x04\x16\x73\x23\xe8\x96\x66\x64\x4d\x2e\x65\x82\x33\xd8\xf3\x58\x11\xe0\xcc\xf3\xbd\xeb\xaa\x28\xab\x2e\x9a\xbe\x8e\xd9\x76\x9e\x20\xd4\x25\x98\xa1\x35\xa6\x0c\xe5\x1a\x47\x85\x03\x0b\xdd\xf7\x18\x74\x78\x2b\xb0\xd0\x0a\x81\xfd\x20\x24\x71\x41\x60\xd8\x92\xf3\xcc\x7a\x64\xb3\x5d\x3d\x27\xeb\xea\x67\xfc\x27\x46\x1e\x7f\xd2\xe3\x48\xb4\xca\xf0\x3a\xd4\x8b\x1a\xd9\x8a\xb0\x44\x75\x4a\xb6\x54\xd3\x41\x3e\x74\x84\x18\x83\x04\xf1\x0f\x61\xd3\x81\xb1\xb7\xdd\xf7\x7b\xf4\xee\x0d\x50\x2d\x96\xa8\x82\x1e\x32\xaa\xfc\xee\x0d\x58\x5f\xce\xcf\x6e\x7e\xba\xfb\xdb\xdd\x4f\x67\x17\x9f\xae\xae\x87\x8e\x68\xb8\x4f\x69\x82\x0b\xbc\xa4\x19\x0d\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4d\x05\x2f\xcc\x3a\x45\xc9\x20\x5e\xb3\x8e\xc1\x8a\x30\x64\x38\x1f\x54\x15\xde\x69\x5a\x73\xb7\x87\x5a\x0b\xcc\x94\x13\x76\x86\xea\x73\x1b\x34\x8b\x92\x69\x41\xf5\xb9\x1e\x37\x9c\x8e\x09\x4a\x38\x4b\x53\x92\xb6\xa6\x7e\x64\x1f\xd0\xb9\x03\xbd\xab\x23\x46\xd1\xcd\xe7\xbb\xab\xff\x15\x3f\x2a\xb2\x34\x12\xe5\x1e\x38\x92\x07\x1b\x21\x4d\x26\x23\x30\x79\x6b\xa3\x7b\x26\x5c\x7a\xde\x19\xa8\xe4\xef\xb8\x4a\xe4\xe1\xbe\x2d\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\xa4\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\x0f\x24\x35\xaf\x2e\xcc\x3d\x6c\x25\x69\x69\x3b\x00\xd8\xe9\xdd\x6b\x2c\xac\x08\x56\xa5\x20\x70\xff\x86\x85\xdc\x25\x41\x84\xe1\x65\x16\x8a\x3c\x8b\x0a\x8a\xc4\xe9\x67\x96\xed\x6e\x39\x57\x1f\xaa\x90\xaa\xc8\xed\xfc\xb1\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\x7b\xc1\xcb\xd8\xa6\x1c\x9a\x82\xbe\xbf\xba\x80\x53\x55\x9a\x73\x43\x98\x12\x3b\x08\x8a\xec\x64\xf0\x0c\xcb\x70\x0b\xf4\x83\xa6\xa9\x3d\x2a\xd2\x12\x57\xc9\x24\x51\x0b\xf4\x09\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\x07\x22\x51\x21\x48\x42\x52\xc2\x92\xc0\x1e\x36\x6c\x45\x7f\xfc\xc3\xb3\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\xfd\x70\x75\x81\xde\xa2\xd7\x7a\x7e\x6f\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\x7e\x90\x44\x8c\xe0\x48\x3f\x1c\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\x7c\xa4\xac\x7c\x32\x2e\xb2\x31\x2a\xe4\xdd\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\x2f\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\x2d\xcf\xc0\xbf\x85\xab\xc5\x68\x00\xdf\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5c\xdf\x5a\x0b\xe8\x3b\xdf\xc6\x5a\xca\xe0\x4d\xd4\x59\x8b\xbe\xb8\xda\x6b\x81\x1b\xe4\x5b\x58\x4b\x84\x5a\xff\x48\x59\xca\x1f\xe5\x78\xa6\xfb\xa3\xf9\xd0\x71\x86\x44\xb3\x1e\x45\xd9\x5a\x36\x19\x2f\x0e\x1a\x4b\x9b\x7a\x6a\x1f\xe7\x75\xc6\xf9\x2a\x9f\xba\xcb\xa3\x02\xd0\x9d\xc0\x55\x4a\xeb\x9f\x39\xe0\x22\x0d\x51\x7c\x14\x6f\x3c\x3a\x07\x5c\xe7\x12\x9f\x0b\x0d\x4b\x51\x9c\xdd\x15\xa3\xda\x9e\x7d\xff\xe9\xee\xac\xfd\xb1\x26\xdc\x47\x48\xb9\xd7\xeb\xd1\x7f\x47\x38\xcd\xa9\x94\x61\x93\x34\xe0\x97\x2c\xa1\x1d\xdd\x6b\xe7\xa3\x58\x53\xb5\x29\x97\x8b\x84\xe7\x0d\x77\xc5\x5c\xd2\xb5\x3c\xb5\x54\x36\xd7\xb3\x7f\x33\x00\x97\xb2\x8c\xb2\x86\xd1\x01\x12\xd8\xad\x50\x07\x13\x4c\xaa\x15\x00\xea\x4d\xa6\xe9\x00\x50\x63\xe5\xed\x41\x80\xc9\x2e\xa5\x24\x4b\xad\x21\xc2\x84\x63\xeb\xf3\x9c\x15\x1b\x3c\x87\x0b\x63\x00\xb8\xcd\x19\x03\xbd\x7e\xc3\x19\xb7\x3e\x74\x13\x73\x6c\x55\x29\x63\x97\x80\x49\xd8\x93\xa3\xe7\x32\x00\xb8\x69\xf9\x38\x0a\x6b\xeb\x52\xcf\xf5\x60\x60\xfd\x00\x05\x01\x02\x6d\xc6\x5c\x23\x1a\x67\x60\x65\xbd\x1b\x69\x84\xef\x5f\xc3\x3e\x54\x1a\xcf\x48\xf4\x83\xe6\x63\x3f\xd3\xdc\xc6\x31\xe1\x5e\x4d\x68\x60\x51\x9d\xda\x2b\xbd\xda\x90\x7e\xa5\xad\x11\x0d\x1e\xdf\xae\xbe\x34\xa4\x15\x0d\x80\xec\x13\x76\x9f\x25\xeb\xf6\x03\x3d\x82\xbc\x8b\xfa\x64\xde\x3d\x7a\x5e\x12\x65\xc9\x19\x08\x36\xc7\x3b\xb4\x1c\x3a\x2e\x29\x95\x60\xd6\x04\xa7\x74\x93\x78\x6f\x9b\x84\x74\x6c\x3a\x7d\xb6\x63\xde\x04\xb6\x46\x67\x75\xdf\x35\xde\x47\xb4\x6b\x8a\xba\xe1\xa9\x09\x19\xaf\x82\x72\xbd\xfd\x0f\x6d\xe8\x3a\xfd\x87\xbb\xfb\x6b\xc9\x82\x71\x13\x33\xd1\x8c\x23\x77\x0d\x66\x4d\xd3\x54\x0f\x4c\x6b\xd1\xb5\xcd\x57\x5b\xb3\x30\x56\xae\x0d\x95\xcd\xe4\xf0\x59\x35\xe9\x80\xd3\xb8\xd9\xda\x61\x86\xfe\xb3\x94\x0a\xe1\xca\xfd\xdc\xea\x39\x51\xc5\x1c\x03\x39\x25\x5e\x6b\x8a\xcb\xc5\x52\x5c\x4f\x66\x4b\x53\x82\x52\xba\x5a\x11\xe7\x16\x5f\x12\x54\x60\x81\x73\xa2\xc0\x8d\x62\x50\x0b\x5d\x78\x99\x9f\x18\xf8\x0a\x61\xd7\xeb\xb6\x8a\x80\x9b\x19\x1f\x2d\x55\x28\xa7\xeb\x8d\x91\x75\x10\x46\x19\x67\x6b\x88\xe8\xd3\x53\xc8\x38\xf6\x9d\x44\x60\x0e\x5c\xa0\x47\x2c\x72\x84\x51\x82\x93\x0d\x58\x09\x31\x43\x69\x29\x20\xc1\x53\x11\x9c\xee\xe6\x52\x69\x3d\x5b\x4b\x47\x60\x4a\x33\x18\xf0\x7a\xa1\x3b\x9d\x30\x00\x5f\xd4\x44\x22\xeb\xbb\xa4\x3a\x26\xd6\x57\xe0\x84\x83\x26\xf9\x79\xa0\xb7\x0e\xd8\x94\xd2\xbf\xf7\x4c\x29\xfd\x53\x4a\xff\x94\xd2\xef\xde\x9c\x52\xfa\x3b\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\xce\x28\x53\x4a\xff\xb7\x91\xac\x37\xa5\xf4\xbb\x67\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xc8\x85\x96\x52\x4f\xaa\x65\x4c\xd6\x81\x35\xe0\x37\x62\x15\x97\xe5\x6a\xa5\x35\x54\xee\xbd\xac\xf5\x88\x1d\x4b\x74\x95\xfb\x56\x39\xba\xac\x35\x59\x12\x35\x83\xb4\x06\x13\xa6\x33\x0e\xa8\x0d\xa4\x84\xb4\x46\x41\x24\xa4\x01\x30\x74\xf9\xf9\xc3\xa2\x91\xf4\xe0\x35\x65\x7a\x53\x21\x86\x62\x8e\x61\x36\x9f\x59\x12\xe3\x94\xac\x11\xdb\x17\x09\x6a\xf1\x9b\x64\x5c\x9a\x98\x02\x00\xed\x73\x4d\x6d\x30\x63\xc4\x49\x1d\x54\x81\xac\xbc\x24\x84\x21\x5e\x10\x66\xfc\x50\xae\x2d\x03\xc2\x4a\xe1\x64\xb3\xd0\xe3\xb3\x20\x54\x97\x1d\x5a\x8d\xae\x59\x2f\xc1\xb9\x41\xae\x20\x39\xa6\x66\x00\x84\x13\xc1\xa5\x44\x79\x99\x29\x5a\x54\x43\xf8\x76\x8c\x40\x0c\x90\x89\xcc\xaa\x10\x06\x8e\x05\x62\x4c\xf1\x10\xd3\x6f\x37\x56\xba\x25\x70\x36\x18\x78\x0d\xb2\xd1\x0c\x12\xda\xf3\x42\xed\x8c\xcb\xd5\x38\x9e\xa8\x90\x0a\x25\x19\x85\xeb\x1f\x66\x67\x72\x42\x61\x94\x59\xc0\xa9\xaf\x20\x57\x14\xd6\x2a\xed\x62\x59\x0a\xb7\x46\xa1\xa4\x71\x34\xd6\xc3\xd8\x01\x52\x2a\xed\x1d\x2d\x7d\x9e\x09\xec\x7a\x87\x98\xcd\x76\x6b\x85\xed\x4e\x61\x08\x37\xa6\xfd\xa9\x31\xc8\x00\x16\x20\xe5\xc9\x2a\x4a\xf5\xa1\x82\x14\x63\x97\xe7\x33\x6b\xf5\x19\x29\xaa\x64\x39\xb5\xc1\xfe\x4a\x0b\xee\x20\xda\xd9\x02\x11\x30\xb2\xd5\x34\x4b\x12\xa2\x45\x68\xdc\x39\x61\x66\xb8\x83\x8e\x92\x22\x22\xa7\x0c\xdc\xb2\x9f\x88\x94\x78\x4d\x6e\xbc\x06\x1e\x9f\xd8\x04\x36\x9e\x1a\xd5\x40\x08\x19\xc8\x50\xf5\x2f\xb5\x4b\xec\xc4\xc7\x10\x1a\x53\x41\xb9\x99\x4b\x15\x03\xf8\x28\xa8\xd2\x3a\x15\x95\x26\x97\x0e\xec\x9a\xfb\x01\x97\x7e\xd0\x4d\x27\xdc\x27\x07\xba\x06\xa9\xf9\x3b\x4b\x8d\xe3\x6a\x49\xd0\x52\x50\xb2\x42\x2b\xca\x70\x66\x3d\x50\x3e\xfa\x82\x1c\x11\x6c\x04\x6a\x29\xb5\x68\xca\x99\x73\xac\xb8\x35\x2c\xd0\x8f\x76\x11\x4a\x94\x2c\xc1\x83\x39\xcb\x8c\xa7\x04\xd1\x15\x5a\x83\xb7\x4b\x18\x87\xfa\x1f\xde\xfe\xd7\x3f\xa2\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\xf7\xbb\x87\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\x8f\x26\x07\xb3\x87\xa2\x6a\x97\x78\xc1\x8b\x32\xf3\x77\xed\x41\xe8\x83\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\x0f\x38\xcb\x96\x38\x79\xb8\xe7\x1f\xf9\x5a\x7e\x66\x97\x42\x78\xc5\x80\xd6\xbc\x33\xac\xf9\xf2\xa6\x64\x0f\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\x9e\x80\xae\x20\xe0\x09\x33\x44\xf4\x5c\x7d\x98\xd6\x14\xdd\x9c\x8b\x6c\x92\xe5\xef\xde\xfe\xe1\x4f\x86\xf4\xb5\x76\xf1\xa7\xb7\xe0\xfc\x97\x33\xc3\x5c\x34\x67\xf4\x73\x68\x99\xe3\x2c\xd3\x8a\x44\x93\xa8\xf5\xb6\x2e\x62\x7b\x37\x0d\x51\xab\x8a\x21\xcc\x68\xe1\xee\xfe\xfe\x6f\x01\xc9\x8e\x2a\x49\xb2\xd5\xcc\xc4\xde\x55\xf9\xb6\x27\x70\x51\x9c\x58\xde\xa5\x6f\xf5\xee\xd5\x70\x98\x98\xb5\xe5\x59\x99\x93\x0b\x02\x4d\x57\x22\x96\xd9\x7a\xdf\x45\x6c\x64\xb6\x3f\xda\x32\xe3\xc9\x03\x4a\xed\x1f\x61\xb2\x9e\x65\x82\xd7\xca\x86\xf4\x34\x74\xc1\x2a\x0a\x08\x02\xf0\x5c\x24\xcf\x73\x3b\x6e\x35\xe7\xdc\xf2\xb7\xe5\xb8\x28\xa0\xd1\xd8\x0a\x12\x84\x1e\xcd\x02\x02\x3a\x16\x40\xb0\x9d\x74\xf0\x71\xba\x6f\x19\xa0\xfe\x0b\xb9\x67\x3d\xf5\x27\x6e\x03\x0a\xf8\x6f\x13\x2f\x32\x22\xb5\x0e\xd5\x61\x7b\xd5\xda\xcc\x8d\xa1\x31\x03\x27\xf3\xd9\x7d\x78\x46\xf5\x3d\x02\xb3\x42\xa3\xd3\x53\x33\x5e\x19\xa3\x82\x08\x09\xcd\xe1\xd4\x17\xd8\xd1\xf3\x0c\xd3\x50\x46\x17\x42\x75\xc3\xa3\xe7\x2d\x63\xb8\x03\x4f\xbd\x27\xde\x57\x02\xde\xbe\x67\xf6\xe6\x31\x04\x0e\xc9\xf8\x31\x67\xf8\x86\xa7\xf6\x13\x38\xa4\xa6\x70\x41\x8f\xa8\x25\x23\x72\xdf\x8f\xde\x1e\xef\x4b\xbd\x96\xf6\x59\xd5\xbf\x54\x87\xd5\xbc\x65\x8f\xa2\x77\x6f\x8f\x74\x44\x61\xe8\x51\x27\x14\xce\x66\xa3\xe3\x56\x7d\x1f\xb4\x44\x68\xb3\x09\x41\x0a\xae\x45\x19\x2b\x13\x2f\x90\xb1\x69\x6b\xac\x5b\xb0\xe8\xe4\xfd\xc9\xb3\xcf\xa9\x59\xa4\xe0\x05\x5e\x0f\x94\x8e\xda\x5b\xeb\xfe\x87\x28\x25\x46\xc0\x20\x12\x84\x34\xf8\x3b\xb8\x8d\x82\x0b\x2d\x2c\x04\xd7\xd9\xc9\xf9\xf8\xac\x99\xd6\xa1\xcf\x8a\x20\x26\x38\xf8\x31\xe8\xc5\x46\x08\x0b\x5e\xb2\xd4\xea\xe7\x95\x21\xe4\xd3\xde\x84\xaf\x39\x03\x21\xc7\xe4\x20\x05\xc2\x56\xcd\xd3\x8a\x11\xd7\x1c\xe6\xdd\xe2\xdd\xdb\x5f\x96\x4d\xde\xef\x35\xc4\xd3\x18\xb9\xae\xd8\xa4\x39\x1b\xcf\x9e\x91\x2b\xb0\x11\x3d\xab\x4f\x56\x69\xab\xeb\x67\x50\x57\x55\x00\x7e\xd2\xca\x18\x89\x2a\x85\x87\xd0\x6b\x10\x69\xb4\x2c\xd8\xc8\x4a\x78\x33\xaa\x0c\x4c\x5c\x5a\xbb\xd6\xef\x96\xcf\x3a\xdb\xe6\x10\x1b\xa2\xed\xd3\x85\xc3\xd4\x64\xbf\xee\x39\xe6\xad\x2e\x72\xaf\xd0\x6b\xf3\xe6\x89\x84\x58\xd4\x37\xcf\xde\x5e\xbb\xec\xcb\xa7\x22\x98\x47\xd9\x5a\xfa\xe5\x53\x81\x41\x87\x2e\x86\x70\x30\x20\x74\xb4\x6f\x19\x3f\x0e\xfe\x42\x36\x78\x4b\x20\x4e\x96\x66\x58\x78\x33\x09\x2c\x5c\x8e\xee\xcc\xaa\xa0\xd9\x2d\x61\x5b\x2a\x38\x03\x3f\xd5\x16\x0b\x0a\x39\x45\xd0\x8a\x90\x30\x2d\x9f\xfe\xf6\xf5\x97\xb3\x5b\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\xa7\x24\x2b\x25\xdd\x3e\xf7\xfc\x0f\x4b\x3c\xd5\xad\xf8\x15\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\xfb\x0d\x66\x5c\xde\x96\x59\x9f\xec\x67\xf7\xdc\xa6\xde\xa4\x95\xf3\x17\x09\x52\x64\x34\xc1\x16\xd8\xcf\x0a\x80\xfc\x24\x34\x94\x9f\xec\xdf\x7e\xee\xcf\x14\x5a\x12\xbd\x5a\xd7\x13\xdd\x7c\xaf\x4f\xf0\x92\x40\x09\xbc\xc2\xec\x31\xce\x88\x50\x9d\x70\x52\x2f\xbe\x4d\x2f\xec\x8f\x3c\xc1\x9d\x82\x0a\x9d\x06\xe5\xf6\x3d\x94\x43\x6a\x9b\x46\x8d\x41\x01\x82\xd9\x5b\x50\x88\x33\x94\x71\x5e\x2c\x71\xf2\xd0\x25\x74\xc9\xbb\xc5\x7a\xa0\x83\x31\x5e\x63\xca\x64\x9d\xe0\x75\xd5\x09\xa5\xf2\xdf\xb5\x19\x5f\x7f\x30\x7e\xb8\xe0\x0a\xf8\xda\xba\xeb\x20\x50\xa3\xb1\x7b\xd6\xe8\xd1\x38\x2b\x50\xf4\xb5\x77\xfc\x1e\x1a\xca\xf8\xfa\x63\x5f\x41\x8a\xce\xe8\x26\xdb\xef\xb8\x83\x33\x9e\x92\x3b\x92\x01\xab\x79\xd9\xb3\x71\x01\x85\x82\x2d\xdb\xb9\xe6\xa9\x2b\xd2\xc6\x53\x13\xb1\x25\x93\x0d\x49\xcb\x0c\xbc\x3f\xd1\xe4\x67\x7e\xba\x53\x5c\xe0\x35\x39\x07\x1c\x04\xd1\xf8\xb9\xfb\x7e\x8d\x3a\x69\xc1\x21\x69\xfe\xae\x8f\x83\xc1\xf4\xfe\x7c\x42\x3a\xd9\x03\xe9\x15\x48\x3b\x41\xbe\x0f\x64\xe7\x2c\x21\x92\x24\x82\xd8\x00\x77\xbd\x15\x20\xa6\x38\x35\xaa\xee\x5d\xdd\xcb\x57\xed\xb7\x0f\xa4\x37\x91\x24\xc8\x75\x7d\x12\xfd\x9e\xa7\xbe\x11\x48\x61\x65\x13\x35\x3a\xa8\x8e\x6f\x89\xd8\x52\xf2\x78\x6a\xaf\xb7\xb9\x26\xd2\xb9\x41\xb7\x3c\xd5\x13\x91\xa7\xdf\xc1\xff\xf4\x2e\xd2\x04\xf5\x9c\xa5\xa9\x55\xab\x4a\x49\x56\x65\x66\x14\x1d\xb9\x40\xb8\xa0\x5f\x88\x90\x94\xb3\x19\x7a\xa0\x2c\x9d\xa1\x92\xa6\xff\xa3\xcf\xf0\x1f\xc4\x07\x77\xbe\xa4\x21\x9c\xdc\xc1\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\x93\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\xd9\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\x17\xdc\xef\x4f\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\x87\xc1\x77\x82\x15\x59\x73\xa1\xff\xf9\x5a\x26\xbc\xb0\xbb\x00\xb7\xd4\x9b\x06\x5a\xf1\xce\x18\x7a\x3c\x57\x94\x91\x2f\xc0\x61\x69\x65\xd4\x66\xed\xf6\x0c\x32\xc8\x01\xae\x6d\xad\x3f\x14\xa7\x15\xb5\x77\x06\xff\xa3\xb7\x6d\xc4\xad\xe8\x38\x7c\xc9\xe8\xdf\xcb\x86\xdb\x05\x2e\xb2\x02\x27\x64\x81\xae\xea\xee\x0e\xfd\x67\x4b\x13\x6a\x22\x08\x06\xcb\x71\xd5\xf1\x60\x86\x70\xa6\x36\xbc\x5c\x6f\x90\xe4\x39\x69\xf4\x8a\xc8\xa1\xec\x45\xc6\x1f\x11\xb6\x21\x28\xfd\x84\xc3\xeb\x8c\xc0\x0d\x41\x6b\xc2\x6c\xda\x3b\x58\xe0\x18\xc2\x85\xe6\x57\x82\x62\x65\xfd\x17\xb8\x54\x3c\xc7\x8a\x26\x5a\x81\xef\x57\xe1\x5c\x8d\x96\x42\xd0\x1c\x0b\x9a\xed\xea\x90\x05\xc8\x80\x80\x55\x70\x86\x68\x4a\xf2\x82\x2b\xc2\x12\x4b\x44\xcd\x26\x0f\x1e\x6d\x78\x05\x01\xfb\x9c\xf5\xe9\x93\xa3\x4f\x2d\x85\x7a\x30\x2b\x4a\x84\x34\x42\xc5\x48\x51\xc0\x7f\x9f\x72\xa1\xfa\x6a\xad\xec\x5d\x3e\xc2\xc6\xef\xc2\x31\xab\x22\xcc\x41\xd0\x65\x29\x5a\x6b\x61\x08\xca\xd1\x5b\x7a\xf7\x98\x74\x9b\x79\x93\x8f\x64\x19\x2b\xd1\x17\x82\x72\x28\x33\x92\x61\x29\x87\x27\x6b\xdf\x46\x89\x7e\x1d\x61\x29\xe9\x9a\xd5\xe5\x0e\xb5\x74\x1e\x3b\x30\x70\xea\x08\x19\xdc\x2a\x02\x2d\xaa\xe8\x4d\xa1\x81\x0b\x17\xa0\x42\x02\x27\x66\x9a\x35\xf4\x69\xca\x2e\x92\xd0\x4a\x5a\x26\xa9\xfe\x7f\xea\x0f\x2f\x59\x0a\x45\x6c\x5c\xe1\x14\x27\x95\xd0\x35\xd4\xf5\xd1\x9c\xab\xe8\x62\xde\x2e\xfe\x67\x18\x7b\x61\x26\xfa\x33\x3a\xff\x78\x85\xb0\x58\x97\xc6\x86\xf6\x99\x65\x3b\x84\xb7\x98\x66\x70\x39\xd9\x8a\x2a\x30\xe5\xed\xdb\xc5\xbb\x77\x8b\xb7\x3d\x52\x40\x8a\x36\x74\xbd\xe9\xea\xfb\x93\x3e\x31\xe9\x13\xff\x0a\xfa\xc4\xdf\x5b\x67\x2a\x78\xca\xf7\x8e\x9f\x99\xb4\x74\x16\x1f\x0d\x88\x12\x81\x48\x7d\x3e\xfd\x96\x79\xc5\x2d\x17\xc8\xb5\xd4\x98\x48\x73\x6a\xdd\x29\x9d\xcf\xcd\x1f\x21\xe8\x11\xe8\xaa\x16\xd4\xf7\x49\xd8\xe3\xe4\x1d\xbc\x0a\xba\xd6\x44\x2b\xc6\x84\x71\x70\xdd\xc8\xaf\x6c\x68\x0f\x15\x33\xd3\x4b\x30\xca\xd6\xfe\x44\x43\x71\xe1\xfe\x68\x70\x6f\xe7\xb6\xbd\x06\x16\x4e\x96\x70\x9b\x62\x8e\xa2\x95\xee\x2d\xa1\xe4\x10\x61\xa6\xd9\xb2\x09\x25\xee\x20\x4d\x5f\x0d\x8b\xae\x9d\x92\x55\x82\x87\x3c\x35\xdd\xd2\x2a\xa6\xdb\xad\xc2\x1e\xe2\x7b\xfe\x56\x6b\x2f\x24\x3e\x8f\x6b\xac\x56\x23\xbb\x77\xe4\xaf\xda\x52\x2d\x28\xdf\x86\xda\xa8\xbd\x10\x66\xc7\x36\x4d\x1b\xc0\xed\xe8\x76\x69\xcd\xa6\x68\x3e\x69\x79\x74\xa3\xb4\x60\x3b\xb4\xde\x51\xbe\x62\x8b\xb4\x41\x7f\x49\xcf\x9f\x04\x51\x5a\x8c\xee\x06\x5a\xb4\x45\x0f\xe8\xbe\xe0\xc4\xb8\xa6\x19\x49\x6e\x30\xa4\x0e\x40\x00\x08\x98\x62\x56\xbc\x0e\x82\xec\x4c\x92\x4a\x74\xf2\xbb\x3f\x6c\x4e\x66\xa6\x9e\x5d\x3b\x76\x40\x90\x75\x99\x61\xa1\xf7\x44\x98\x94\x02\xf4\xf3\xff\xfd\x76\xfe\x5f\xff\xdf\xff\xff\xeb\x5c\xfe\x53\xfe\x33\xff\xe7\xe6\x9f\xe9\x3f\x1f\xff\xb9\x7b\xf3\x73\x07\xf0\xeb\x9c\x66\x19\x75\x69\x46\xee\x7f\x73\xca\x4a\x05\x01\x20\xa5\x90\x28\x85\x96\x58\x84\x3c\x48\xb4\x23\x58\xc8\x8e\xf7\xda\x4b\xef\x82\x97\x8a\xdc\x08\xb2\xa2\x4f\x61\x3c\xe9\x55\xe8\x77\x51\x01\x2f\xb7\x50\x25\xc8\x9a\x4a\x28\xa4\x06\x35\x09\x36\x98\xa5\xa0\x14\xaf\xfa\x82\x55\x21\xb6\xc2\x96\x01\xb1\xf7\xca\x0f\x57\xd6\x0d\x60\xcd\x1f\x5c\x6b\xa1\xb2\x5c\xce\x0b\x3c\xc2\x17\xa0\x6f\xa7\x6b\xa7\xba\xfa\x9c\x02\x9d\x42\x02\xf0\xb6\xac\xc6\xd7\x5f\xd9\x23\xa8\xd7\x26\x4d\x82\xc4\x96\x58\x47\x66\xb3\x3a\x6f\x57\x60\xd2\x32\x35\x08\xb0\x5a\x46\xac\xb4\x68\x84\x9b\xde\x22\x83\x31\x6b\xa9\x87\xb0\xf9\x2a\x34\x66\xc4\xed\x02\xa4\x75\x59\x51\x53\x2f\x97\x6b\x07\x11\xed\x7d\x60\x82\x40\x5d\x5c\xa9\xf1\xa6\x39\x43\x47\xeb\x0e\xed\xd7\xa5\xef\x37\x7b\x37\x2d\x16\x04\x9d\x5d\x5f\xf4\xbb\x4f\x03\xc1\x69\xed\x2e\x5f\x81\x89\x98\x09\x57\x7f\x31\xe6\x20\x6b\x1b\xed\x85\x6c\x19\x96\x9c\x21\xac\x65\x44\x73\x2e\x31\xb3\x15\xf4\x1c\x08\x41\x32\xec\xba\x0d\x69\x29\xb5\xb6\x38\xf5\x2f\x7c\x38\x9c\xcd\xa3\xf0\xf4\x2c\x57\x8f\xe7\x02\x7c\x61\xdd\xfa\x87\x2a\x60\xb4\x5a\xea\x70\xe1\xec\x50\x14\x69\x44\x28\x82\xc3\x48\xe4\xb4\x2b\x04\x56\xcd\xbd\xa4\x41\xf1\x89\x34\xe8\xd4\xf4\xb5\xa1\x05\xdc\x30\x81\x59\xdb\x7e\x74\x16\xdb\xe8\x8b\xd6\xe9\x2a\xe0\x86\xa2\xae\xd8\x0c\x5d\x73\xa5\xff\xe7\xf2\x89\xea\x6b\x32\x5c\xf5\xed\x82\x13\x79\xcd\x15\xbc\xfb\x2c\x94\x98\x49\x45\x22\xc4\x5a\x28\x6d\x71\x45\x2d\x6b\x37\xec\x98\x6e\x79\x57\x2b\x5b\xcd\xdb\xac\x2f\xb0\x08\x2a\xd1\x15\xd3\x9a\x93\x5d\x79\x55\x8f\x55\x5a\xe0\x4e\x93\x62\x9c\xcd\x21\x71\xc0\x41\x0f\x00\xad\x36\x8d\x4a\x87\x4a\x2e\x5a\xf8\xf2\x0c\x14\x80\xb9\x24\xc8\x0e\x6f\x78\x3a\x7c\x03\x29\x5d\x45\x86\x13\x92\xba\x02\x96\x58\xe3\x02\x2b\xb2\xa6\x09\xca\x89\x58\x87\xe6\x59\x68\x3e\xe5\xdf\xba\xc1\x4a\x50\x23\x4a\xba\xfa\x8b\xf4\x84\x63\x73\xfa\x54\x4e\xf7\x97\xe0\xf6\x0e\xc4\xe4\x84\x66\x05\xec\xfb\xe3\x2f\x6c\x91\x6f\x0c\x6a\xb8\x6f\x6e\x2c\xf4\xff\x5b\xb3\x53\x20\x94\xff\x63\xc2\x41\x16\xe8\xcc\xa7\x66\xe9\xa7\xf9\xbe\x0d\xc3\x69\x82\xd6\x50\xb5\xbc\xda\x6a\x5d\x87\x19\x22\x46\x30\xed\xb7\xf2\xaf\x3a\x37\xda\x0c\x3d\x6e\xb8\x34\x5c\xbc\x0a\x21\x7d\xf5\x40\x76\xaf\x66\xad\x93\xe7\x4b\xa6\x7d\x75\xc5\x5e\xcd\xaa\xf8\xd7\xd6\x39\xa8\x7c\x70\x70\xc3\xbf\x82\xbf\xbd\x5a\x74\x2e\xc1\x7e\x4d\x2a\x74\x31\x1e\x24\xd7\x96\x59\x9c\x74\xd3\xb9\x4d\x6b\x83\x9a\x89\x62\xb8\x11\x3c\x27\x6a\x43\x4a\x69\x44\x1d\x17\xaa\xde\x99\x28\x28\x24\x99\x26\x2b\x7d\x9a\x21\xe1\x33\xe1\x22\xa5\xac\x93\xc7\x36\xc9\x2c\x93\xcc\x32\xc9\x2c\x93\xcc\x32\xc9\x2c\x0d\xdc\x4c\x32\xcb\x24\xb3\xfc\xba\x65\x16\xd9\xee\x1d\x11\x14\x5b\xf6\x9b\x58\x6c\x78\x96\x4a\x04\x15\x6a\x20\x80\xd4\xc1\x42\x58\x29\x41\x97\x60\x05\xeb\xe3\xb0\x09\xcf\xf3\x66\x21\x8e\xaa\x35\x93\x3d\xfa\xa9\xa7\x4d\x7a\x4f\x9f\x8d\x11\x42\xce\xca\xdf\x55\xb6\xb5\xca\x57\x67\xc6\x2a\x8b\x33\x28\xfe\x65\x6d\xb0\x19\x5a\xeb\xaf\x5b\x0d\xb3\x6c\x07\xa9\x46\xd9\x81\xde\x3d\x83\xc8\x8d\x82\xa7\x0b\x74\xc7\xf3\x2a\x61\x44\xef\x88\xb5\xb6\xc1\x22\x5d\xe7\x51\xc5\xa1\x10\xcb\xda\x84\x78\xf3\x47\x0d\x76\x43\x0b\x1f\xdd\xc2\x7c\x1c\x48\xb0\x94\xe9\x4f\xaa\x04\xe3\x82\xa7\xef\xd1\xff\xc3\xd0\x3b\x43\x5f\xfc\x11\xc2\x03\xbe\xbf\xba\xf0\xf7\x7c\x58\x9a\x91\x3f\xdc\x01\xba\xd0\xef\xcc\x97\x92\xa8\x35\x4d\xd1\xd2\xd4\x69\xd7\x97\xed\x6b\x46\x1e\x4d\x96\xa4\x09\xd0\x80\x28\xef\x7e\x2e\x51\xa7\xc9\x38\x8f\x4d\x35\x49\x3b\xcc\x1b\xf4\x7b\x33\x4e\x41\x84\x6d\xef\xa4\xc7\xf2\xe7\xce\x7d\xbe\x3d\xb1\xc9\xf7\xe2\x71\x2e\x1e\xe7\xf3\xf9\x5c\xaf\xd3\x75\x41\xed\xe9\xe6\xca\xb8\xb2\x81\x5b\xde\xcb\xad\xc2\x36\x1c\xdc\x7a\x2a\xd2\xc4\xb6\xec\xec\x2a\x16\xaf\x7a\xbe\x1e\xea\x33\x19\x2e\xb5\x14\xee\x7a\xfc\x8c\x7e\xc7\x55\xd7\x9c\xde\x05\x8f\xeb\x74\xdc\xd3\x6b\xc6\xdf\x1c\xf4\xc0\xb6\xa0\x81\x9a\xbf\xa3\xfa\x98\xd9\xe8\x98\x5a\xac\xef\xcf\x83\x3d\xc2\xae\x05\x3a\x18\xbf\x48\xef\xe2\xe3\x77\x2d\x3e\xb0\x5f\x71\xd5\x95\xd8\x7b\xe8\x47\x74\x2a\xde\xef\x47\xdc\x0b\x33\xae\x47\xb1\xaf\xf1\xa8\x8f\x39\x1f\x46\xa2\x03\x0d\xa7\x0e\x6c\xb5\x17\xce\xdb\x0c\x36\x22\x7e\x46\x0b\xe2\x30\x93\x18\xd9\x7c\xb8\xd3\x4c\xab\x5f\x90\x89\xdb\x33\xdf\xfe\xf4\xc3\x8c\xdf\xb3\xd8\xb6\x59\x5f\x85\xad\x0c\x37\x1a\x1e\xdf\x62\xb8\x2d\xa7\xf4\x6f\xf4\x73\xba\x0b\xbb\x19\xf4\x02\x1e\xd9\x57\xf8\xdf\xed\x92\x19\xb2\xf2\x04\xbb\x06\x1f\xd6\x2f\x78\xa8\x25\xc6\x60\x71\x88\x41\xcd\x37\xd4\x1d\xf8\xb0\xbe\xc0\x2f\x3f\xe7\x50\x17\xe0\xc3\xfa\xff\xbe\xfc\x9c\x43\xdd\x7e\x0f\xeb\xf3\xfb\xd2\x73\x0e\x1a\x26\x9a\x2a\x15\xc8\xbb\xc3\xfc\xed\xac\x32\x2c\x83\x0a\x26\xf7\x3b\xa7\x9b\xb2\x8c\xf6\x0a\xb3\xed\xa3\x7a\x67\xde\x66\x3d\x33\x50\xcc\xac\xa9\xa3\xd3\xdd\xf8\xc4\x45\xa3\xef\xb4\xb0\xed\xe7\x40\x2d\x86\xc9\xb8\x9b\xa2\x93\x54\x4c\x5e\x2c\x58\x20\x76\x61\xc4\x06\x6c\x51\xc3\x2d\xec\x87\xea\xb8\x86\x8c\x41\x72\x27\x13\xd5\x6f\x08\x6a\x6b\xff\xe6\x3d\xd0\xfa\x1b\xc6\xfe\x2a\x98\x22\x75\x90\xaa\xe8\x74\xaf\x5c\x08\xca\x30\xe4\x67\x82\x06\x57\xb2\xba\xca\xb6\x83\xf1\x7a\xbf\x42\x96\xbb\x7f\xfa\x0b\x16\x98\x6c\x73\x27\x95\x66\xb8\x64\xfd\x76\xbf\x58\xdf\x81\x59\x6c\x15\xc7\x88\xd1\x03\x11\x0c\x72\xac\x6d\x67\xc2\x2a\x2c\xa5\x5f\x6e\x18\x36\xec\x87\xab\x9e\xf4\x74\xd5\x80\x32\x50\x06\xec\xce\xb6\xf9\x79\xb6\x4d\x3a\x72\x02\x5f\x40\x78\x3a\xee\x0c\x86\xac\xa2\xde\x0a\x0a\xa1\xb6\x30\xcf\xb0\x89\x0e\x37\x1a\x3f\xb8\xc5\xf8\x41\x82\x97\x6b\x2e\xde\x2d\xb9\x76\x22\xa3\x44\xd7\x17\xeb\x2f\x1e\x27\x4e\x47\xa9\x3b\x43\xc7\x24\xbe\x9b\xf8\x4b\xf4\x11\x3f\x7e\x07\xf1\xc3\x7a\x87\xa3\x65\xa0\xa9\xde\x0b\x74\x0d\x7f\x81\x3e\xd5\x31\x9d\x7f\x07\x59\xc6\xb8\xee\xe0\x87\xf5\x05\x47\xc1\x65\x8c\xee\x08\xde\xc4\xa5\x17\xea\x38\x1c\x1f\x07\x97\x51\x1d\xbe\x0f\xef\xed\x8d\x78\xbf\xb8\x84\x3a\x96\xa1\xc8\xae\xde\x95\xa9\xc1\x0b\x76\x44\x3f\xef\x08\x4f\x42\xfd\x1c\xc6\x39\x83\x12\xf6\x21\xdc\x33\x5c\x9d\x2d\xdc\xbd\x3b\xb2\x3f\xf7\x4b\x9e\xde\xc3\x7c\x53\x90\xc5\x78\x96\x24\xbc\x64\xc3\xe9\x91\x77\x9d\xd7\xfb\xce\x77\xfb\xad\xbe\x5c\xe5\xd2\x84\xe0\x3b\xa2\xb6\x89\x45\x26\x3a\xf8\xa6\x27\x3f\xdf\xbb\x72\x5b\xed\x23\x3c\x69\x5b\x11\xc4\xb1\x13\x69\x33\xb6\x36\xfc\xb1\xaa\x16\x62\xe2\xdd\xdd\x55\x3e\xc2\xe5\x05\xfe\x74\x4f\xa5\xa8\x76\x22\xc5\xa5\x7d\xd3\x14\xd0\xbb\xb3\xe9\xf8\xbc\x4a\xe9\xb6\xd2\x78\x1d\x97\xd4\x4b\x05\x77\x0a\x2b\xb2\x2a\xb3\x3b\xa2\xe4\x7e\x5b\x73\xd7\xac\x11\x9c\xf9\x6d\x7f\x0a\x14\x33\xbd\x27\x79\x91\x61\xe5\x29\xde\x35\x32\xb5\xc1\x62\xee\xd4\x96\xfa\x3c\xfd\x0e\x30\x91\x52\xd1\x97\xc2\x30\x24\x84\xe4\x24\xa5\x65\x1e\xc5\x23\x4f\x7e\x04\xd3\xfe\xae\x20\x26\x66\xc3\xec\x9f\x01\x50\x15\x79\xc3\xc9\x83\x49\x2c\xad\x2b\x71\x79\x4f\xde\x7d\xc3\xfd\x49\x25\x7a\xf5\xca\x55\xd7\x22\x98\x39\x83\xac\x21\x71\x9e\x92\x93\x46\x49\x2e\x33\xa6\x1f\xf0\xa7\xba\x5f\x8c\xa9\x70\x6d\x03\x4c\x5e\x5b\x00\x6f\x10\x17\xe8\x13\xc9\xa1\x4e\xd8\xf3\xb0\x1f\x44\x3e\x8a\xb9\xac\x24\xfd\x07\x81\x34\x9a\xb8\x4d\xb8\x87\xe2\xf1\x75\xf2\x4f\x06\xc5\xa1\xdc\x6e\x38\xc5\xc3\x1a\xef\x02\x4c\xd5\x1d\x0a\xe7\xf6\x33\x8e\x50\xfa\x0f\x5b\x55\xde\x5c\xf5\x92\x1b\x69\x3f\x81\xbb\x5a\xc3\xcc\x01\x6b\x81\x7b\x0a\x76\x06\x80\xb9\x24\xb0\xd2\x15\x47\x37\xdf\x3a\x8a\xa9\x26\xf0\xe8\x2d\x4e\x81\x6a\x8f\x6d\xde\x6a\x4b\xb3\x24\xea\x91\x10\xc3\xc2\xee\x1c\xfe\x1a\x77\x8e\x16\x86\x83\x12\x20\x44\x8d\x95\x39\x04\x47\x98\x59\xd9\xac\x3b\x7d\x76\xdb\xc5\xf6\x6b\x0f\xf7\x7d\xe0\xd6\x6b\xd0\x31\xa3\x59\x9b\x90\x9d\x47\xac\x42\x6c\xc9\x6c\xc2\x93\xa1\xbe\x80\x44\x1d\x9d\xbc\x7f\x24\x72\x0c\xea\x98\x3d\x0c\x2d\xc2\xbe\x75\xf3\xe5\xbc\xba\x00\xbc\x1c\xb7\xcd\x5d\x0f\xe0\x63\x75\xf2\x71\xdc\x31\x3a\xbb\xb9\xb2\xef\xb7\xf2\x39\xb7\xe6\x37\x92\x9a\xe6\x96\xd8\x5c\xac\x81\x63\x54\x05\xf6\x35\xcb\x44\x18\xfc\x2d\xe0\x3a\xd6\x24\xe4\x3a\xd5\x70\xb6\x25\x42\x41\x18\xeb\x9a\xd1\x7f\x04\xba\x34\x9a\xd1\x2b\x71\x11\x02\x2f\xa1\x96\xb3\xa9\x17\x03\xa7\x60\x56\x09\x41\x82\x40\x5a\x4f\xc9\x22\x20\xbb\x20\xbb\x1e\xb6\xb7\xa6\x6a\xf1\xf0\x27\x20\xaf\x84\xe7\x79\xc9\xa8\xda\x9d\x42\xb5\x11\xba\x2c\x15\x17\xf2\x34\xd5\xb2\xd7\xa9\xa4\xeb\x39\x16\xc9\x86\x2a\x02\x45\x71\x4e\x71\x41\xe7\xb0\x38\x48\x7c\x93\x8b\x3c\xfd\xae\x4a\xb1\x3b\x98\x2f\x3e\x50\xe6\xad\x52\xd9\xde\xcb\xbf\x52\xa3\x87\xe0\x56\x20\x61\xbd\x35\xae\xb2\xe7\xed\xe5\xdd\x7d\x95\x24\x19\x90\xe0\x69\x55\xd2\xac\x0e\xdb\xac\x37\x53\x23\x9c\xb2\x95\x6b\x09\x50\x15\x35\x76\x49\xd9\x61\xd5\xc0\xb4\xbf\x91\xe5\x12\xb8\x8d\xcb\x2a\x45\x8a\xf7\x96\xf0\xb8\x62\xe8\x1c\xe7\x24\x3b\xc7\xa1\x8a\xb8\x2f\xbc\x95\x10\xcc\x33\xd7\xdb\x71\xf8\x66\xe6\x9e\xfa\x53\xbd\x1b\x7a\x99\x2f\x49\x9a\x92\x9e\x62\x54\x95\x1a\x24\x48\x46\xb6\xb8\x5f\xc4\x75\x0f\x66\x15\x24\x97\xbc\xfd\x9c\x6a\xe1\x03\xd5\xa8\xaa\xd7\xa2\xe3\x0b\xdd\x13\xd9\xb3\xef\xf0\x2a\x55\xc1\xd1\x4d\x05\xab\xf1\xd5\xaa\xc2\x4b\x6a\x54\xb2\x8a\xaf\x5a\x15\x04\xd9\x57\xd1\x2a\xaa\x7a\x55\x10\xea\x91\x2b\x5b\x55\xeb\x8f\xe9\xdb\xed\xaf\x74\xe5\x9e\x5f\x88\x96\xa2\x2b\x60\x05\x87\xb6\xd5\xb1\x0e\xa9\x84\x15\xde\x22\x57\x25\xeb\x80\x8a\x58\x47\xdd\x7b\x7f\x65\xac\x36\xf6\x07\xb6\x7d\x54\x45\xf8\x11\x15\xb3\x82\x6b\xad\xf4\x82\xb1\x95\xb3\x82\x50\xbb\x55\xb5\xc6\x54\xd0\x0a\x82\xee\xa9\xae\x15\x5b\x49\x2b\x08\x37\x58\x65\x6b\xa0\xa2\xd6\x51\xa9\x29\xaa\xda\x96\x7b\x22\x8e\xf5\x20\xed\xc9\x58\x07\xc3\x09\xf8\x14\x9a\x52\x71\x4a\x24\x10\x4f\xb2\xc1\x02\x27\x8a\x08\x68\x0c\x6c\x94\x25\xbf\xa0\x69\x82\x62\x2d\x35\xb8\x0e\x8b\x05\x4f\xf5\xb6\x6e\xb8\x38\x58\xf3\xae\xdb\xc5\xcc\x9d\xd6\x53\xff\x64\x7e\x49\xb4\x8e\xe2\xc5\x68\xd4\x6d\x0f\x2d\xbc\x3e\xf1\x34\xcc\x71\xf7\x2e\xe5\xfa\xa3\x5a\x66\x69\x22\xd0\xb6\xd2\xcd\xf5\x1b\x61\x3e\x5e\x47\x15\xdb\xab\x6e\x83\xb7\xe3\xab\x60\x04\x50\x66\xa6\x32\x87\xa9\xcc\xdf\x85\x88\x6f\x30\x91\x24\xfa\xda\x19\x4a\x26\x01\x8c\x62\x85\x8d\x89\x6e\x5c\xdb\x0c\x63\x24\xae\x3a\x6b\x69\x04\x5a\x7b\x1f\xc3\x85\xdc\x70\x75\x51\x01\x0e\x2e\x05\xfc\x1b\x95\x51\x78\x0d\xb1\xa6\xa0\xb8\x1a\x87\x85\xe9\x3c\x99\x94\x42\x10\xa6\xb2\xdd\xde\x18\x61\xd6\x63\x66\x05\x9e\xa7\x3a\x26\x00\xc4\x59\x2b\x9d\xba\xcc\x27\xa8\x0b\x04\x7a\x68\xb8\xcb\x93\xbe\x95\x2d\xa4\xbd\x89\x34\xc1\x42\x21\x17\x70\x98\x9a\x50\xf6\xf0\xf2\x11\x23\x8f\x8e\xf4\xf4\x52\x01\x90\x73\xb7\x0a\x62\xc5\x45\xab\x97\xba\xf7\xc2\x0b\xaf\x6a\x53\x34\x9a\xd8\xb6\x16\x59\x87\xe4\xf6\xaf\x26\x08\xbd\xb5\xd2\x66\x24\xbe\xe5\xde\x2e\x7e\xdf\x99\x7d\x6c\x47\xbe\x20\xcc\x7a\xbd\x76\x97\x4c\x9f\x48\xb2\x85\xaa\x6b\x57\xc6\xf0\xb4\x2a\x35\x89\xcc\xd0\x23\x41\x45\x86\x59\xb8\x65\x3d\xaa\x96\x96\xeb\x23\xdc\x98\xb4\x4b\x96\xb0\xd3\x5b\x92\x0d\xde\x52\x6e\xeb\x5f\x0d\xf6\xd6\xa9\x50\xa8\xef\x62\x93\x5b\x11\xba\xa7\xe2\xba\xb0\x83\x39\xc5\x1b\xb0\xdf\x7c\xda\xb6\x9e\x9b\x2b\x93\x56\x61\x29\xdd\x24\x95\xb8\x4a\x8e\x83\x8a\xb7\x7b\x96\xc4\x88\x26\xb6\xa1\x87\xf1\xef\x37\x61\xb7\xdb\x3a\x0c\x62\x09\xb5\x22\x1f\xc1\x58\xb0\xd7\x94\x3c\xd1\x5b\x72\x76\x73\x65\x66\xbc\x40\x1f\x82\x49\x87\x16\x43\x6c\x67\xcb\xe0\xa9\x0d\x15\xe9\xbc\xc0\x10\x38\xa2\xf7\x72\xd6\x9a\x6d\x55\x77\x69\x00\x64\x74\xeb\xf6\x90\x61\xc4\x3d\xad\x7d\x71\xf6\x11\x28\xc8\x6c\xcd\xf7\x95\xa2\xb7\x8f\xed\x63\xcd\x72\x48\xcc\xed\xcc\xb2\xcf\xa7\xf5\xc2\xb3\x1c\x6e\xf4\x0e\x29\x8c\x34\x98\x48\x1b\xec\x87\x82\x62\xb5\x02\x6f\x11\xba\xe6\xb3\x5f\x1f\xcc\x55\xa4\x6b\x64\x17\x37\x6d\xe5\x71\x42\xfc\xcb\x8b\x1a\x83\xb6\x40\x34\x82\x33\xf9\x0b\xdc\x35\x9f\xf1\x9a\x33\x1a\x43\xdc\x87\x15\xc1\x1b\x1c\xbf\x53\xc8\xed\xeb\x16\xc4\xeb\xa2\x66\x80\x88\xd1\x40\xa1\xbc\xe6\xf3\x0b\xef\x50\x54\x31\xbd\xc1\xe1\xfb\x8a\xed\x0d\x16\xd6\x1b\x84\x1a\x2a\xbc\xd7\x5b\x64\x6f\x10\xe2\xd1\x8b\xf0\x35\x9f\xaf\x58\x90\xaf\xf9\x44\x52\x64\xd4\x6b\xd2\x53\xd8\xa4\xf9\xf4\x96\xdf\x30\x45\x54\xf9\x96\x88\x66\xe7\xcd\x84\x43\xcb\x56\x11\xe8\x07\x6c\x9e\x25\x65\x7d\xe5\x4c\x9a\x4f\x2c\x5f\x8c\x29\x73\xe2\x5d\xce\x98\x92\x27\x83\xf4\xd1\x2a\x89\x32\xb2\xfc\x49\xf3\x89\xd0\x3b\x3b\x0b\x89\x2f\x8b\x32\x08\x17\xb5\x0b\xa7\xc4\x94\x48\x89\x80\x39\xb6\x88\x4a\xf3\x89\x25\x05\xf3\x04\x8b\xab\x34\x9f\x03\x0a\xad\x44\xc1\x45\x8d\x9c\x8c\xe1\xc5\xa1\x71\xdc\x1d\x45\x15\x63\x69\x3e\x07\x15\x66\x89\x5c\xa8\xe6\xa7\x91\x45\x5a\x22\x21\x76\x4a\xb9\x44\x16\x6c\x69\xcd\x6a\x1c\x3a\x87\x0a\xb9\x34\x9f\xd1\x45\x5d\x22\x97\xbd\x57\xfa\x65\xb0\xc0\x4b\x24\x58\x6f\x19\x98\x9e\x62\x2f\x91\x20\xe3\x4a\xc2\xd4\x85\x5f\x22\xc1\x1e\xaf\x3c\x4c\xf3\x19\x28\x15\xd3\x7c\x22\xb9\xae\x79\x46\x52\x58\x9c\x05\xd0\x3d\x31\xda\x99\x79\xfc\x65\x66\xda\x6f\x45\x54\x14\x6a\x4e\x33\x42\xda\x8d\x5f\xd1\x40\x59\x9a\xe6\xf3\xcb\x8a\xc6\xf1\xa5\x6b\x06\xa7\xe0\x4a\xdb\x8c\x2e\x63\x33\xbc\xb8\x66\x99\x9b\xa8\x92\x36\x83\x20\xbd\x25\x6f\x02\xe5\x6d\x22\x34\xb8\xa8\xf2\x37\xf1\x42\xd0\x51\xa5\x5c\xdb\xc0\xcf\xd7\xe2\xa4\xf9\xf8\xbb\x4f\xdc\x35\xa0\xd4\x7e\x45\x97\xd1\x96\x61\x1a\x08\xcc\x44\x87\x47\xbb\xf6\xd8\x15\xa0\xf9\x4a\xd8\x77\x11\x75\x28\x5c\x9b\xfd\x34\x1e\x23\xf5\x27\x95\xa3\xec\xb1\x19\x1d\x6b\x0d\x2a\x74\xa0\x8f\x91\x7b\x5a\xd8\xab\x33\xd2\x3e\x54\x6d\xfa\xa1\x64\x73\x6e\xf2\xae\x1e\x6d\xd7\xf3\xb0\xb3\x81\x25\x59\x99\x9a\xa8\x64\x00\x0b\x8a\xa0\x4d\xe6\x80\x63\x0e\x6d\xce\xad\x9f\xe3\xd9\x5d\xa7\xcd\x7a\x47\x11\xd5\x97\xea\x13\x27\x70\x5a\x6d\xa8\x36\xf3\x0d\x25\xf3\xea\xe7\xa6\xa2\x0b\x03\x10\x42\x90\x4d\xc4\x17\x95\xc3\xf4\x78\x14\xcf\xaa\xc2\xaa\xf4\x72\xe8\x3d\xdf\x2a\xbc\xbb\x6f\xb1\xb3\xfe\x24\x38\x16\x22\x37\x2a\xb2\x81\xea\x9d\xba\x49\x58\xac\x16\xef\x28\xce\x92\xd0\xad\xeb\xd5\xfe\x6b\xf2\xb2\xe2\x44\x95\x38\x3b\xc8\xc9\x5a\x13\x0d\x81\x80\xd5\x0d\xee\x0f\x91\xfc\x37\x73\xb6\x26\xb8\xc0\x09\x55\x41\x45\xf1\x97\x09\x42\xba\x6d\x1f\x08\xbb\x95\xb5\x91\xcd\x5e\x3e\x75\x1b\xcc\xe0\x0c\x6c\x4c\xfb\x73\x2f\xcc\x84\x33\xb3\xf6\x78\xea\x3c\xb7\x27\xf9\xdc\x7d\xaa\x67\xee\x3b\xa6\xc1\x35\x40\xde\x6c\xd5\xf4\xb3\x0b\x02\xf2\xa1\x6c\x10\x0f\xfd\x07\x01\x61\x25\x1c\xfb\xa2\x11\x58\xcf\xab\xd1\x5f\x46\xf3\xd9\x93\x5b\x00\x73\xa7\xb0\x50\x24\x3d\x09\xcd\x2d\x82\x46\xdb\xdd\xd2\xf6\x58\x34\x44\x90\xd7\x13\x31\x67\x38\x93\x28\x25\xf0\xbf\x43\xd2\xf1\x92\x97\x0a\x78\x2e\xdc\x91\xc5\x36\x19\xf2\x91\x46\x8a\xd0\x19\x96\xea\x46\xf0\x25\xb9\xa7\xc3\xae\xab\x4e\x0b\x73\xa9\x90\xa9\x20\x03\x9e\xed\xa5\xd9\x8f\x9a\x82\x86\x85\x67\x57\x08\x21\xc5\x8a\xcc\xbd\xe5\xac\x9a\xcf\x08\x89\x5f\xaf\xed\x5e\x60\x26\x61\x32\xcf\x5a\x60\x6b\x59\x48\x55\x40\x23\x2c\xc7\xc8\x44\x4b\x73\x46\xec\x9d\x69\xe4\x7a\xb0\x4b\x7f\x65\x04\xe5\x44\xca\x9e\x74\xb6\xee\xd3\xc2\xca\x7f\x94\x39\x66\x73\x41\x70\x0a\x91\xa9\x16\x08\xa2\xa6\x1a\x9a\x3e\x9c\x71\x34\x8d\x2a\xba\xce\x00\xcf\x15\x52\x87\xb1\x32\x62\x8d\x82\x60\xe9\xcf\x8f\xf0\x2c\xf1\x07\x88\x39\x9c\x19\x71\xaa\x0e\xbb\xc5\xfa\xbf\x85\x9a\xa1\x1c\x27\x1b\xca\x62\x0c\x11\xc0\xcd\xa4\xc2\xcc\x20\xcb\xda\x87\xc0\xb6\xb8\xa6\xdb\xaa\xa1\x96\x9e\xe3\xa0\xe1\xdc\x3c\x15\x19\x9e\xc8\x0e\xe2\x34\xff\xa4\xca\x46\x70\x48\xf4\xaa\xc5\xde\xfa\x6a\x1c\xee\x3f\x26\x02\xda\x66\xf0\x90\x38\x5e\x1c\x65\x00\x06\x6e\x7d\xd4\x8d\x0d\x0b\xa0\x07\x81\x0c\x55\x13\xaa\x9f\x11\x6c\xde\x56\x1d\x8a\x39\x08\xa6\x52\x9e\x8d\x5f\xe7\xab\x01\xc0\x0b\x0d\xf9\x78\x4b\x8f\xb3\x3a\xcd\xd1\x80\x78\x6e\x5e\x52\x43\x53\x1b\xa5\xde\x87\x65\xb9\x62\x83\x65\xbc\xf6\x75\xa3\xdf\xf6\xa9\x21\x00\xca\x8b\xf9\x97\x55\xa7\x0e\xc9\xa5\x56\x3c\xb3\x51\xc6\xe1\x1e\x7e\xed\xa4\x5d\x5b\xac\xe7\x44\x36\xbf\x8f\xec\x7d\xd8\x29\x1e\x50\xf0\xd4\xb0\xc8\xfb\x0a\x16\xa8\xd9\x4a\xe1\x64\x63\x03\xe6\xcc\x5f\x20\xd6\xab\x6f\x1b\xb5\x22\xa3\x5c\xe2\x85\x4a\x36\x96\x23\x2a\x41\x8b\x8c\xa0\x3f\x57\x26\xb5\x19\x59\xad\x48\xa2\xfe\x3b\x2a\xa5\x53\x59\xe0\xfd\x7e\x94\x57\x86\xad\x3f\xbb\xff\xfa\xef\xdd\x0d\x0c\x0b\x49\x66\xbc\x88\xc2\x42\x97\xf0\xa2\xbb\xfe\xdc\xfc\x61\x59\x06\x06\xf4\x7a\x00\x5b\xb4\x49\xff\xf4\x90\x88\xe1\xba\x26\xe8\x1f\x67\x59\x0b\x84\x5c\x98\xe6\xfb\x8d\x8d\xb4\x41\x12\xd6\x52\xe7\x81\x89\x05\x41\xd7\xfc\x4e\x6f\x46\x99\x91\x19\xba\x01\x2b\x43\xfd\x0b\xd8\xfb\xae\xf9\xe5\x13\x49\x4a\x5f\xa2\xf6\x00\x75\x7b\x3d\x6e\xed\x68\xac\xda\xc3\x66\xd6\xd5\xf2\xb0\xd5\xa4\x38\xd0\xcc\x40\x71\x8b\x43\x0f\xb6\x1e\xc8\xae\x2e\xa5\x6f\xbd\x7a\xe0\x89\x98\x0d\x99\xc1\x9d\xdf\xc2\xb8\x43\xfe\x9b\x35\xa4\xf0\x7c\x49\x99\x99\x58\x95\x9f\x5d\x8f\xe9\x8c\xa4\xde\x48\x29\xfd\x12\x4c\xe9\x10\xc4\x86\x1d\x7d\x2d\xec\x7e\x1e\xd1\x71\xa1\xb2\xee\xfa\x38\x5a\x9f\x0b\xaf\xe1\x91\xbb\xfc\x7b\x89\xb3\x76\x6d\x0f\xfb\x53\xd0\x93\xd4\x29\xe0\xfe\x48\xb3\x34\xc1\xc2\x64\x31\xd8\xd4\x4e\xc9\x6d\x59\x3b\xe0\x2c\x09\x84\x97\x1a\xf6\x11\x40\x30\xec\xbc\xb4\xa6\x21\x2c\x14\x4d\xa0\xfd\x9f\x4d\xc2\xf1\xf8\xa0\x86\x32\x82\x2b\x82\xbc\x33\x3d\x00\x23\x36\xe1\x7e\xff\x9b\xfd\x8b\xa6\x20\x82\xf2\x14\x94\x7a\xab\x52\x78\xa9\xbc\x3a\x0e\xaf\x6d\x4e\xb5\xa5\x4e\xbe\x72\x3c\xa5\x3a\xb4\xad\x08\x17\x7f\xd2\x6e\x55\x4e\xc4\xb6\xb3\x7e\xd3\xe0\xcc\xd5\xa9\x5c\xa0\xbf\xec\x5c\x10\x0e\x04\xe4\x98\xb8\x53\x0f\x48\x28\xca\xdd\x2e\x5e\x60\x20\x36\x8e\xf9\x8a\x0b\xb2\x25\x02\xbd\x4e\x39\x44\xb0\x92\x2d\x4d\x54\xa7\x63\xa2\x7b\xfe\x2f\x22\x38\x10\x19\x23\x6b\xac\xe8\xb6\xf2\x43\x38\xb5\x5d\xb9\xb0\x66\x89\xde\xa2\xd7\x00\x0c\xd1\x3c\x27\x29\xc5\x8a\x64\x3b\x5f\x99\x26\x6b\x69\x36\x56\xe5\xfe\xc1\x9f\x5f\x91\x2f\x50\x7e\xad\xa7\xf4\x5a\x8b\x19\x1a\xa1\x6f\x8f\x13\x56\xd7\xa1\x37\x8e\xc0\xeb\xcd\x6d\x15\xc8\xad\xb4\x17\xc7\x08\x1d\xb9\x78\xa0\xfe\xa7\xa6\x35\x5c\xb5\xd1\x34\x67\xe4\x80\x53\x34\x28\xd3\x74\x25\x3b\x25\x70\x42\xd9\x3a\xa2\x31\xfc\x7d\xf3\xcd\x2a\x9f\x49\x63\xcb\xfc\x01\x51\xd7\x60\xb4\x61\xfd\xef\x1a\x8a\xc8\x93\x3e\x94\xb6\x1d\x80\x75\x0b\x00\xe1\xd7\x81\xe5\x50\x0a\x81\xed\x50\x59\x24\x3c\x37\x96\xa7\x8c\x68\x49\x11\x92\xd1\x96\x82\xe0\x87\xbe\xd5\x3f\xe2\x0e\xe7\x99\x3a\xb7\x4f\x9d\xdb\xff\x15\x3a\xb7\x5b\xfb\x7d\xf0\xfc\x7d\xb1\x71\x7f\xb6\xb7\x6c\x3b\xa1\x50\x5f\xc5\x95\xfd\xbc\x0a\x11\xe4\xac\xf7\xca\xe3\xa5\x2a\x4a\xd5\x2c\x85\xd1\x4a\x48\x74\x03\xd5\xb9\x0c\x55\x21\xd6\xa2\x80\x34\xc8\x2e\xe3\xe1\x76\xc3\xab\xe0\x44\x90\x29\x44\x95\x98\x69\x53\x5b\x90\x20\xb2\xcc\xc0\xb1\x6e\xdd\xbb\x90\x03\xe8\xc9\xcf\x8d\xd1\x89\xbe\xb8\xec\xbf\x86\x14\x66\xea\xfd\x39\x93\x89\x2d\xab\xd2\xcc\x34\xef\xd9\x62\xe3\x39\xb1\xd9\x83\xcd\x32\xb3\x2e\xae\xa0\xe0\x3d\xb6\x94\xb0\x3e\x83\x1f\xe5\x65\x86\xa5\xa2\xc9\x5f\x32\x9e\x3c\xe8\x15\xc7\xdc\x56\x27\x67\x3f\xde\x75\xbe\x6b\xad\x90\xa1\xb3\x1f\xef\xd0\x05\x95\x0f\x43\xd9\x2e\xae\x5b\x76\x53\x3f\xc4\xe8\xc1\xb4\x3a\x38\x39\x91\x68\xc3\xa1\x93\x33\xd8\xd6\x5c\x28\x02\xd3\x4c\x9a\x4b\xaf\xa1\xd5\x8a\xb4\x50\xab\xe6\x99\x55\x8d\xf0\xa3\x24\x66\xa9\x4b\xbd\x54\xc8\xfa\xea\x77\x5b\x0d\xdb\xd7\x57\xf2\x3e\x68\x4c\x6a\x23\xb9\xe1\xf3\x76\xce\xf4\x86\x9f\x0e\xf0\xb6\xe3\x25\x7a\xc4\xc1\xa8\x11\xd7\x53\x70\x81\xee\x69\xf1\x1e\x5d\x36\x3a\x40\x98\xaa\xca\xed\x41\xa8\xac\x33\xf2\x02\x50\xad\xf0\x04\x7b\x63\x44\x0d\x7d\x0b\x5a\x59\x0a\x5d\x3e\xe1\xbc\xc8\x88\x7c\x8f\x5e\x91\x27\xf5\x87\x57\x33\xf4\xea\x69\x25\xf5\xff\x30\xb5\x92\xaf\x42\x66\x93\xab\xbc\x8a\xd7\x86\xd2\x22\x36\xc5\x6e\x49\x2c\xa8\x6e\xd9\xbf\x6a\x7b\x03\x50\x8f\xb5\xf1\x81\x21\xcc\xc5\xb2\xe1\x8f\x28\xe5\xc6\xf5\x01\x39\x72\x88\x08\xc1\x4d\xed\xa4\x3d\x74\x83\x03\x20\xe1\x79\x21\x78\x4e\xe5\x80\x07\x13\x2c\x1b\x70\x04\xfc\x2e\xd3\x08\x8b\x13\xa8\x42\x2a\x50\x1a\xa8\x53\x63\x4b\x9f\x22\xf7\x91\x5b\x44\x1f\x05\x86\x73\xfe\x2c\x05\x5e\xad\x5c\x26\xc0\x0c\xa9\x76\xc9\x33\x47\xa6\x9a\xb2\x2c\x7c\xcd\x24\x43\xa4\x52\x53\xd9\x07\xee\xf8\x3a\x3a\x4d\xc9\xf6\x54\xa6\xf8\xdd\x0c\xa6\xe6\xea\xec\xa9\xe6\x3a\x02\x30\xb1\x44\xaf\xde\xfd\x7f\xec\x7d\x5b\x6f\x1b\x47\xd2\xf6\xfd\xfb\x2b\x1a\xce\x85\x64\x40\x94\x9d\x7d\x83\xec\xc2\x58\x2c\x20\x4b\x76\x56\xd8\xd8\xd6\x8a\x76\x72\xf1\xe1\xc3\xa2\x39\xd3\x14\x7b\x35\x9c\x9e\xcc\x41\x8a\xf6\xd7\xbf\xe8\xaa\x3e\xcd\x70\xa6\x0f\x24\x25\xd9\x1b\xce\x4d\x1c\x8a\x53\xec\x63\x55\x75\x75\xd5\xf3\xbc\x38\x25\x73\xbe\xe6\x05\xad\x8b\x87\x13\xb7\xc7\x76\x24\xe4\xf9\x54\xff\x94\x3f\x96\xfb\xe2\xf5\x0b\x72\x2c\x6a\x68\x8d\x3c\xbc\x16\x8c\xde\x31\x5d\xf6\x89\x18\xcb\xe0\x83\xbf\x3c\x9d\x9e\x59\xe7\x1c\xf2\xbf\x7f\x0a\xcc\xff\xf4\x59\x84\xe0\xc5\x47\xfe\xa9\x2c\x62\xc9\x26\x8f\xb4\x7f\xf2\xa2\xad\x3b\xf6\x42\xce\xd2\x52\xd4\x99\xc6\xae\x40\x15\x72\xad\x64\x7a\x06\xc1\x74\x95\x97\xca\x1e\x7e\x90\x93\x0d\xd3\x8e\xa2\x27\x17\x87\x47\x2a\x6f\xc8\x0b\x60\x96\x79\xf1\x84\x5a\x9e\x04\xe9\x5b\xf0\x41\xc9\x97\x17\xb1\x23\x8d\xb7\x4b\xe4\xf2\x42\xeb\x79\xe7\x6e\x25\x77\xed\xe8\x14\xec\x3d\x3e\xd2\xec\x1e\x9f\xad\xe9\x7f\x44\x49\xde\xbd\x9d\xab\x66\xbc\x7c\x96\x01\xda\x01\x16\x5c\x8f\x9e\xe7\x84\x39\x19\x37\xa7\xff\xe9\x6a\x26\x5d\x8f\x18\xf2\x58\xfd\xdd\xa1\xf7\x22\x3f\x27\x17\xb4\xa5\xe8\xc4\xa8\xc2\xb5\xa9\x91\x37\xb6\x50\xee\x8b\x05\xd4\xd5\x2a\xd8\xd1\x69\xcf\x8c\x44\xb9\x0c\x19\x68\xfd\x1b\x7f\x4a\x5e\x7f\x25\xfd\x5d\x36\xe4\x1c\xdf\x83\xdc\x9f\x37\xe4\xa3\x28\xd9\x09\x6c\x54\x22\x77\xaa\xfa\xe7\xaf\x35\x6f\x99\x47\xed\x44\x18\x14\xb9\x32\xfd\xb9\x6e\x1b\xa7\x55\xf7\x14\x08\xc5\xdf\xb0\xba\x95\x69\x59\x14\x62\xa1\xb3\x33\x77\x6d\xd7\x97\xeb\xcb\x84\x66\x7d\xb9\xbe\x7c\xdc\x26\x25\x39\x7f\x43\xdf\xcf\x7a\x71\xf6\x24\x6f\x7d\x89\xc0\x35\x94\x83\xb1\x10\xf2\xdb\x4e\xb5\xc7\xe6\xb3\x68\x3d\x5f\x2e\xd9\x63\xdb\x65\x0c\xfd\x05\xdf\x03\xac\xdb\xdf\x2b\x96\xb5\xe6\x32\x84\xcc\x57\x54\x2a\x1c\xb2\xee\x8a\x16\xee\x91\x60\x62\xe5\x4c\xfb\xcc\x77\xc5\x6a\x03\x29\x4a\x15\x98\x30\xb9\x60\x78\xad\x93\xbf\xd1\x69\xde\x46\x96\xfb\x82\xcf\xcf\xd0\xa2\x3e\x40\xf9\x5f\xfe\x06\xb5\x16\xc1\x6a\xc0\xdc\x59\x85\xc7\x90\x3f\xcd\x4b\xfd\x27\x9f\xd0\x3b\xca\x0b\xba\xe0\x05\x6f\x1f\xa4\x75\x7e\x79\xda\x2b\x9e\x6c\x60\x00\x76\xda\xee\x89\xee\x83\x7b\x1f\x00\x86\x9a\x1c\x4b\x09\xaf\xee\xa5\xe2\x79\x79\x6a\x3c\x07\x3f\x4a\xa9\x02\xa1\x40\xc7\xc3\x75\x38\x34\x11\xc3\xd0\xab\x08\x2d\x31\x9f\xe1\x0e\x19\x26\xad\xf0\x3c\x7f\xfe\x72\x7d\xb9\xb5\xd9\x92\xfb\x3e\xd6\x6c\xc9\xef\x8e\x9a\x2d\xf8\x83\x02\xc0\x9e\x20\x94\xc7\x07\xa3\x2f\x8f\x64\xb9\xfe\xfb\xd7\x8a\x0e\x99\x26\x18\x40\x17\xd2\x41\xc7\x6a\x7b\xb5\x95\x38\x83\xf3\xa0\x02\xd1\xc0\xe6\x60\x4d\xe5\xdc\xfd\xc3\x53\xf7\x13\xb1\xb3\x41\x39\x24\x74\x04\xb4\x29\xf1\xc2\xc9\xef\xec\x04\xda\xd1\x9d\xfa\x82\x6e\xf4\x36\xfb\x2d\x63\xd5\x6a\x19\x73\x87\x77\xce\xaa\xd5\xfb\x79\x3f\x80\x27\x3f\x23\xef\xe7\xc6\x2f\xb4\xfb\xc8\x53\xfd\x0a\xcd\x6d\x30\xd8\x77\xd4\x90\x82\x2f\xd9\x64\xf2\x5e\x78\x7f\xad\x45\xc9\x5b\x51\xc7\xf2\xcd\x43\xdd\x3f\x8c\x36\xf9\xa0\xde\xc4\xea\x87\x4c\x14\x05\xcb\x74\x8c\x16\x3a\xa6\x45\x7b\xd6\xdf\xc8\x71\x82\xa9\xf3\xb8\x86\x5b\xd5\xa8\xec\x38\xd0\xaf\xae\xdf\x9d\x5d\x7c\x78\x77\xba\xce\xbf\x5b\x89\xfb\x59\x2b\x66\x5d\xc3\x66\xbc\x9d\xb6\x47\x4f\x43\xdb\x0e\x25\x81\xab\xd8\x41\xfc\xa4\x03\xfb\xe4\x4b\x83\x11\x63\x08\xcd\xc8\x55\xc0\x72\x52\x0b\xd1\x9e\x90\x9a\xaa\x50\xfe\xa4\xda\x20\xea\xc8\xb0\xec\x8a\x02\x47\xbc\xad\x19\x3b\x71\xe3\x21\x9e\xa2\xff\xfd\xdb\x69\xa7\x5b\xb1\x6a\xd8\x17\x6c\x63\x35\x4b\x56\xc3\x7e\xf8\x6f\xf2\xc8\x4b\x2d\x5e\xd7\x4f\x1b\x68\xdf\xa8\xce\xcd\xbb\xfa\x8e\x57\x2e\x3a\x39\xc6\xb7\xec\x81\x04\x32\xf1\x96\xa2\x06\x46\x96\xfe\xfa\x60\x6d\x06\xdd\x05\x24\xc5\x53\x65\x4b\x9e\x60\x57\xc6\xd8\x12\x68\xcc\x35\x5b\x6e\x3b\x50\xd7\x6c\x89\x05\x63\xfd\xea\x27\x80\x4b\x64\x65\xab\xc0\x4e\x3d\x43\xa6\x86\x63\x74\xe4\x54\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\x4a\x4d\xaf\x5e\xaf\xf5\x26\xad\x69\x2e\x1a\x64\x28\x92\x63\x71\x12\x17\x93\xa4\xf9\x9a\x97\x5f\xc5\x56\x0c\x39\x58\x5e\x3b\x1f\x72\x9f\x78\x99\x4f\x8d\x6f\x7f\x6c\xcf\xe1\x9b\x7d\xff\x09\xdf\xb6\xa8\x89\xea\xee\x8f\xea\xf3\xc7\xe4\x39\x57\x94\xfa\x6e\xb0\x7f\x33\x18\xb5\xa1\xd7\x0f\xcd\x6f\xc5\x0c\x7f\x7b\x56\xe5\x76\xc4\x9f\xe7\x42\xef\xa9\x82\x3a\x83\xcb\xb8\x67\x08\xed\x44\xf9\x8b\x89\xb3\x43\x0e\xae\xd0\x5e\x47\x31\xc6\xfb\xd9\xca\xa6\x03\x17\x44\xa3\x91\x61\x30\xb7\x05\x49\x25\xd4\xa9\xd7\xef\xfe\x18\x2e\xd6\xc6\x00\xab\x67\xa2\x2c\x55\x0e\xf5\xa7\x8a\x95\xf3\x96\x66\xb7\x9e\x38\xf6\xc1\x0e\x3f\xab\x1d\x4e\xbd\x09\xd3\x69\x31\xb9\x99\x6f\x85\x10\xfe\xe0\xde\xc5\xf2\x52\x19\x91\xaf\x50\xeb\x3c\xe6\xed\x16\x66\x55\x7d\xa0\x13\x80\xb4\xfd\xc8\x85\xfe\xee\xc0\xf8\x9a\x8f\x21\xf6\xa4\x92\x41\x2b\x51\x75\xc5\x74\x56\x35\xe4\xbe\x63\xc3\xb7\x34\x96\xca\x79\x4a\xb9\xca\xb2\x4a\x64\x2d\x72\x46\x16\xbc\x35\x6c\x68\xa2\x34\x78\xc6\x60\x33\x3d\xab\x60\x61\xf2\x97\x4f\xfb\x89\x90\x0e\x7f\xd6\x6b\xf0\x3d\x5e\xff\xf9\xcf\x7f\xb6\x69\xec\x3e\x0b\x2c\xc8\xeb\x1f\x7f\xf8\xe1\x94\x5c\x28\x72\x37\xce\x0c\x87\xaf\x39\xde\x29\x32\x0f\x42\x21\x3b\xdb\x4f\xf0\xaa\x06\x58\xd9\x04\x95\x9f\x8a\x74\xd7\x88\xce\x2b\x27\xad\xe0\x59\x8b\xfc\x24\xb8\xc9\x15\x79\xb0\x57\x28\xd5\xbf\x6f\xf2\x4f\x60\x2c\x4f\x48\xc1\x6f\x19\x59\x36\x80\xce\x6b\x31\x5e\x30\xfd\xcd\x23\x11\xf9\x2f\x54\x03\xec\xac\x34\xac\x7d\x92\x04\x86\x40\x50\x68\x58\xe4\xd4\xe3\x5b\x06\x62\xf8\x5b\xf6\x30\xc3\xa9\xaf\x28\x37\xb9\x73\x17\xb4\x9d\xc6\xef\xd7\x89\xf2\x7d\x65\x9f\xb1\xdc\xd9\x60\x3a\x01\xb1\xaa\xc5\xbf\x71\xb2\x79\xe9\x4d\x89\x71\x41\xc3\x1b\xe5\xf8\x29\xe4\x9e\xd2\x41\x02\xd1\xc8\x78\x8a\x46\xd8\x9f\x6b\x62\xcb\x38\x46\x0a\xbc\x0a\x0e\xdc\x03\x40\x6a\xb2\xd1\x5a\xaf\xbb\xa1\x4e\xdf\x36\xdb\x52\xae\xee\x06\xd7\x4c\x57\x6e\xc8\x45\xb4\x71\x9f\x45\x47\x55\x04\x8d\xa4\xba\x22\xc7\xc9\xe5\x84\xea\x01\x85\x6e\xad\xbe\xab\xe6\xc9\x23\xd4\x4c\x45\x2f\x63\xa7\x61\x6d\xa7\x26\x07\x12\xb1\x64\x7b\x59\xd3\xa8\x32\x86\x35\xad\x6f\xbd\x7d\xd7\x79\xbc\xa7\xe4\x4a\x76\xd9\x24\xe2\x62\xfd\xcc\x1d\x33\xbc\x63\xb2\xa9\xca\x9b\x09\xb4\xf3\xe8\xf4\xf4\x08\xd5\x83\xa8\x49\xd3\xd2\x5a\xed\x68\xf9\xf9\xb4\x29\x0b\xc6\x42\x7b\x0b\xff\x03\xad\x1c\x0e\x30\xa8\xaa\x12\x50\x08\xd3\xae\x2c\x65\x4a\x18\x19\x22\x16\x30\x20\x02\x5f\x71\x34\x67\xbd\x15\x7a\x01\xee\x0d\x11\x7c\x1d\x80\x2e\xda\x68\x4b\xc0\xc4\x20\xb1\x19\x2f\x58\x18\xad\x70\x1d\x61\x59\x2e\x97\x03\xc8\xf6\xa0\x54\x67\x2d\x3b\xf6\x73\xc0\xfa\xde\x33\x16\x41\x91\x7e\x63\x32\x6a\x32\xc2\x9d\x0f\x9a\x94\x4d\xc3\x11\x14\x1a\x61\x58\xf0\x89\x33\x2f\xf8\xc4\x18\x19\x7c\xfc\xf7\x02\xf8\x6c\xac\x6b\xa3\x19\x70\x8b\x2f\xad\xd5\x85\x2a\xc1\x2a\x0a\xa3\x1f\x37\x07\x52\x5a\x2b\xee\x06\x5a\x12\xba\x68\x44\xd1\xb5\x28\xda\xfe\x51\xa9\x9d\xa8\x95\x04\x8d\xd2\xd8\x71\xa0\x71\x8c\x18\x47\x15\x81\xb2\x8f\x43\x32\xf4\x6b\x2d\xf5\xc3\x7b\x85\xa0\xf7\xc2\x1b\xce\xa0\x87\xc1\x2b\xa3\x40\x95\x79\xf8\xca\xc8\x7f\x56\xfc\x5a\xcf\x89\x7b\x3e\x23\x46\xcc\xab\xaf\x0e\x66\x64\xac\xc6\xaa\x61\xac\x8b\x65\x0b\x62\xd0\x10\xfb\x3c\x7e\x5f\xad\x8c\xdb\x7a\x5f\xd0\x23\x74\x10\x6b\x78\xcc\x11\x6c\x7e\x49\x8e\xcf\x4d\xa9\x86\xe6\x01\xbf\x2c\x5b\x56\x2f\x69\xc6\x5e\xba\x47\x33\x7f\xde\x90\xae\x94\x58\xd1\x32\x2f\x74\x1d\x88\xe5\x22\x94\xbf\x94\xd7\x1c\x0a\x2b\xcf\x5c\xea\x9e\x89\xca\xca\x88\x03\x1b\x48\x8b\xcd\xdf\xc0\x9f\x1e\xa1\x62\x77\x1a\x06\x5d\xc0\xf6\xfb\xfd\x58\x73\xd6\x3c\x95\x0b\x00\xec\x07\xa8\xa6\x07\xd1\xd5\x2a\xc0\xae\xd9\x54\x32\x51\xcb\x23\x58\x88\x7b\x82\x36\xa4\x66\x37\xd2\x57\xad\x11\x0b\x10\x61\x06\x3b\xf9\xc1\x4e\x39\x69\x7b\xca\xeb\x73\x72\xef\x54\x18\xd6\x17\xa7\xd5\x01\xda\xa5\x72\x92\xc5\x1d\xcf\xb5\xa3\x8f\x44\xdf\x77\xba\xa2\xb4\xa2\x4d\x63\x78\x8a\xbc\x03\xd4\x88\x8c\xc3\x81\xda\x99\x31\x74\xc6\xc1\xdd\xc8\x59\xcb\xea\x35\x2f\x59\x2f\x77\x3f\x2e\x60\x8d\xec\xd9\x1e\xec\xdf\x88\x81\x2e\x45\xce\xae\xba\x45\xc1\x9b\xd5\x3c\x31\x1a\xf9\x71\xe4\x55\xcc\x7e\xd8\xb8\x63\xc4\x08\xa5\xef\x4c\x30\x8c\x5d\x92\x86\x01\xd4\xce\x1d\x73\x51\x0b\xc1\xbb\xa5\x8d\x21\x2e\x3e\x9f\x8f\x67\x85\xa9\xd6\xaa\xfd\x21\xa0\x22\xa4\x60\xaa\x5e\x5a\x4e\x84\xd3\xf6\x5f\x2c\x19\x95\xfc\xf4\x4b\x59\xb9\x9f\x7b\x0f\xed\x45\xa1\x8b\x5e\x4d\xd1\xb7\x56\xce\xe8\xa9\x69\x8a\x53\x5c\x3d\x5c\x2e\xac\xf0\x58\xf0\x01\xe7\x83\x53\x82\xda\x1f\xa6\x06\xc9\x9e\xda\x15\x2d\x89\xf0\x62\x24\xe1\xeb\x00\x65\xa1\x45\x99\x39\x42\xdc\x01\x5c\xd0\xd3\x4b\xe9\x10\xee\x7d\xd6\x70\x6f\xe2\x85\xcb\x5c\x9d\x85\x70\x33\x2a\xac\xce\x41\xed\xa8\x56\xf5\xe1\x23\x6b\xe0\xce\x66\xa7\x2b\x10\xfc\xf5\xb3\x16\x99\xa3\xbd\x60\x9e\x89\x40\x91\x51\x43\x3f\x52\x54\x6a\xdb\x82\x24\xc3\x8d\xd2\x23\x33\x75\xc0\xcc\x9c\xbd\x10\x0c\x12\x9a\x9d\xe5\x68\x2c\x25\xcf\x1a\x61\xb0\xbf\xf8\xe1\x91\x4f\x64\x2e\xb2\xce\xf0\xa9\xc0\xfc\xd9\xeb\xca\x10\x0e\x7e\x70\x8d\x05\x73\x74\xa1\x7d\xdb\xf8\x74\xb9\xb8\x2f\xef\x69\x9d\x9f\x5d\x4d\x94\x0e\xf4\x5d\x1e\xfb\x6d\xd7\x8b\xd3\x42\x80\x47\x0d\xb1\xec\x54\x2a\xad\xcf\xb1\x1b\x44\xe1\x0f\xf1\xf6\xfe\x10\x1d\xe2\xed\xdf\x40\xbc\x5d\x7e\xb7\x4f\x98\xd3\xdb\x0b\x2a\x8e\xe5\x0d\x28\xa5\x05\x3a\x9d\x1d\x88\x1a\x71\x98\x13\xef\x38\x64\x7e\xe3\x27\xd4\xea\xb6\xb3\xe6\x38\x78\x6a\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\xea\x90\xb7\x9f\x28\xf6\xf5\x13\x45\x34\x5d\xe6\x96\x4c\x1b\x76\x94\x51\xdc\xc1\x30\x5c\x0a\x2b\x8f\xf5\x50\x62\x18\x36\xfa\xb6\x0f\xdf\x33\x90\x27\xd9\x8a\xad\x29\xfc\xf3\xbd\x1c\x8d\x2b\x7f\x04\xc8\x3e\xbc\x21\xd2\x2d\x68\x19\x16\x36\xb3\x7a\xdd\x10\xb1\x3c\xe9\xd5\xcc\xbc\xb8\xfb\xde\x5b\xae\xae\x9f\x24\xfa\x8f\xa5\x6e\x66\x72\xd7\xaf\x7a\x41\x45\x39\xf5\x16\xe9\x25\x78\xf3\x60\x1f\x7b\xd7\x02\xdb\x12\xc7\x73\xcf\xdd\x8c\xe5\x2c\x99\xd9\xe1\x88\x8a\x23\x46\x50\x91\x1c\x2e\x01\x0e\x97\x00\xfe\xef\x3e\xe2\x25\x80\xa3\xa6\x61\xb7\xf2\x86\xa8\x01\x70\x2f\x06\x02\xc1\x2a\x7c\x06\xb7\x07\x96\xc1\x59\xb9\x55\xfa\x6a\x40\xdf\x0b\x44\x20\x05\x3b\x77\x94\xe4\xe8\xe8\xf4\xf4\xe8\x48\xdf\x26\xa8\x85\xdb\xb5\xcb\xd9\x5f\x08\x2b\x33\x91\xe3\xa2\x0a\x37\x73\xc9\xeb\xa6\x05\xc3\x6d\xcf\xc7\x6e\x5f\xd7\xba\xad\xf6\x8a\x21\x7c\xaf\x00\x6d\x8b\x23\x3e\x8c\x82\xb2\xc5\xda\xf9\xf7\x5b\x19\x5e\x6b\x6e\x4d\x0d\xbe\xea\xa8\xc1\xe0\x79\x03\x76\x35\xd8\x2d\x8b\xe2\x8f\xe4\xad\xb0\x3d\x34\x4f\x28\x39\xc6\x0f\x4f\xb3\xaa\x3b\x51\x5f\x38\x5d\xb3\xb5\xa8\x1f\xc2\x2a\x42\x0b\x91\x2f\xf7\xa4\x2a\x09\x2f\xc1\x96\x5b\xb6\xf6\xc7\xb1\xea\x66\x3c\x42\xfc\x27\xfa\x19\x64\x0a\x9b\x38\x39\x44\x67\x2c\xa7\xce\xd2\x00\x7c\x34\x71\xb4\x71\x3a\xb6\x05\x6f\xb2\xf2\x8e\xdc\xd1\xda\x4b\xba\xab\x9f\x24\x43\x9e\xf3\x3b\xde\xc4\xb1\xee\x4d\xc4\x3c\x00\xaa\x0f\xc1\xae\x50\x7f\xc5\x90\x9d\xeb\x47\x61\x20\xd9\x55\x35\xf0\x5d\xbe\x8f\x02\xf7\x4e\xe9\xb0\xfe\xa5\xf4\xa9\xb5\x5a\xd1\xec\x21\xe3\xba\xec\x79\x5e\xe2\x3d\x8f\x48\x22\xf6\x48\xc7\x23\xee\x02\xf3\x29\x2e\x28\x03\x42\x20\xc4\x7b\xc1\xa3\x92\xf7\xdf\xa9\xef\xf6\x33\x08\x5b\xb6\xae\x44\x4d\xeb\x07\x92\xab\xf3\xf8\x83\x8e\x62\xd0\x7a\x1a\x78\x18\x0a\x1f\x9d\xca\xc7\x9d\x51\x49\xa0\x27\x39\xaf\xb7\xcd\xdf\x5f\xb3\x9c\x77\xeb\xd8\xe8\xc8\xaf\x2e\xaf\x95\x06\x05\x40\x11\x06\x51\x93\x66\xb7\x3e\xc4\x55\x10\xaa\x87\x0c\xd9\xd0\x9c\xd2\xa4\x17\x2f\x06\xd0\xa9\xe0\x81\xc2\x7d\x9a\xc8\xd9\x91\x3f\xe2\xa6\xc4\x60\x7b\x9c\xc0\x4b\xa9\x42\xfa\x2a\x1b\xe8\x58\x7d\xf1\x25\x11\x35\xf9\x00\xb6\x21\x31\x83\x76\x7f\x13\x44\x22\xeb\xc9\xf8\x7f\x18\x30\x3f\x47\xa3\x56\x89\x96\x16\x96\x6d\x9c\x14\x22\xa3\x85\x99\xb1\x9e\x55\x09\xcc\x95\x59\xfe\xfa\x36\x52\xce\x98\x6c\x0f\xda\x67\x08\x76\x14\x0d\xde\x6e\xf1\x0c\xd8\x1c\xa4\x54\xb4\xb9\x1e\xb9\x7a\x96\x3e\x3b\xec\xe8\x1d\x30\x66\x00\xaa\xb4\x7c\x5b\xaf\x2c\xd3\x84\x7b\xb9\xc2\x7c\x61\x37\x5c\x2a\x9a\xc8\xbb\x7f\x00\x01\x60\x49\x3d\x8e\xce\x01\x30\x50\x4d\xaf\xdd\xf7\xa6\x03\xe7\x4e\xb5\x4c\x39\x2f\x62\x09\xb7\x34\xc6\xe8\x37\x06\xca\xd0\xb7\xa2\x06\x6b\xbe\xe4\x45\x7f\xd1\x6b\x64\x3a\x33\xc0\x5d\xa9\xee\xf2\x13\xd6\xe9\xf8\x32\xed\x1a\x56\xcf\x6e\x3a\x9e\xef\x75\x81\x06\xb4\xed\x32\x8b\xd0\xb3\xef\xcf\xfb\x0a\xf6\x3d\x5f\xd4\x8c\x9c\xaf\x68\x59\xb2\xc2\x31\x99\x03\xb0\xc4\xa9\x80\xb2\x0b\xa1\x18\x40\x50\xdc\x03\xd2\xc3\xb7\x51\x05\xf5\x9c\xd0\x36\xdf\x08\x3c\x60\xd1\x45\x03\x03\xda\x88\xc9\xfb\x73\xd2\xd2\xfa\x86\xb5\xf2\x75\x52\x76\xeb\x05\xf3\xec\xa6\xe7\x83\xb2\x7b\xfe\xc2\xae\xdd\x2a\xb0\x70\x90\x7f\xfd\xf5\x63\x34\xe2\xc3\xd8\x1c\xdd\x8b\xba\xc8\xef\x79\x8e\x29\x3a\x0d\x39\x96\x02\x5f\x3e\x3f\x08\xc3\xfd\x3d\x9f\x02\xd4\x0f\x74\x4c\x05\xc6\xa0\x63\x04\x7a\xa6\xca\x85\xb8\xb4\x48\xc7\x20\x78\x0a\x03\x5e\x3e\xef\x38\x04\xa3\xe0\x7b\xd2\x27\x72\xf9\x1d\xe4\x61\xcc\x0c\x3b\xa8\x4e\xb9\xc6\x55\x90\xcf\x23\x13\x50\xf0\x17\x9d\x0a\xd1\x88\x76\x45\x1a\xbe\xee\x8a\x96\x96\x4c\x74\x4d\xf1\xe0\x59\x0a\x4f\x33\xe0\x21\x9b\x55\xb0\xdf\x71\xe9\xc6\xd8\x2e\xf3\xe5\xbe\x0d\x03\x60\x65\x9e\xe9\x09\xea\x19\xb1\xa9\xdb\xa6\x06\x73\x99\x1a\x60\x51\x7b\x65\xea\x82\x91\xdf\x05\xb2\xdd\x58\x46\x16\x54\xda\xad\xaa\xe8\x6e\xf8\x44\xd4\xfa\xc9\x72\xdb\x6c\xde\x8e\xf4\xd4\x23\x1c\xca\x50\x0a\xc3\x1f\x18\x48\xee\xf3\x68\x56\x19\xc9\x59\xc5\xca\x1c\xa0\xc2\xed\x4a\xf3\xed\x3d\xe8\xfc\x4e\x23\xac\xa2\xe0\xcf\x99\xe0\xe1\xe8\xb8\x77\xbf\xb7\x35\x95\x6a\x69\x2d\x15\x90\x8e\xd0\xf3\x25\xa1\xa5\x4f\x91\xec\x3f\x55\xe7\x9b\x37\xa1\x8f\x06\x4c\xf2\x58\x49\x83\xa8\xe3\x82\x8b\x5d\xa7\xf6\x4d\xa6\xf0\xe9\xdf\x77\xeb\xac\xbc\x28\xdc\xf1\xa9\x7c\x6e\xc2\x9e\xd7\x22\xca\x6f\x35\x23\x69\x46\xd8\x47\xd3\x93\x43\x19\xf7\x57\x99\xd7\xf7\x78\x39\x57\xcb\x42\x64\xb7\x51\x48\x22\xef\xf1\x9b\x83\x93\xb2\xfa\x70\x08\x25\x22\xcf\xc0\x13\xdd\x1d\x3f\x19\xab\x3d\xe4\x98\x1b\x48\x29\x50\xe2\xe5\xe2\xaf\xc5\xd4\x0a\x6f\x14\xd8\xa2\xa2\x21\xee\xca\x49\x4c\x83\x08\xcf\x84\xb6\xb4\x49\x02\x15\x1c\x22\xea\x36\xac\xc5\x7c\x40\x00\x28\x5b\xb3\x96\x02\x9c\xe8\xec\x6f\xa1\x6b\x47\xd5\x67\x2d\x43\xba\x33\xba\xff\x96\x31\x28\x13\x65\xc3\x73\xa6\xa4\xe7\x72\x2e\x00\x0b\x75\x17\x83\xab\x7e\xf1\xcb\x97\x68\x94\x00\xf9\xd5\x41\x9f\x2d\xa9\x4f\x87\x58\xda\xf6\x1c\xe0\xeb\xf3\xd2\x59\x44\x4a\xd2\xa3\xc5\x82\x6e\x32\x66\x89\x24\x23\x21\xaa\x8f\x7e\x3a\x7f\xd7\x7f\xa9\xbf\x01\x7e\x3a\x7f\xf7\x5f\x41\xb4\x71\x93\x31\x0b\x79\x9e\xf3\xe6\xf6\xc0\xb2\xf1\x07\x60\xd9\xd8\x98\xf5\x6f\x3d\x86\x76\xa0\xd8\xf8\x8a\x29\x36\x9e\x48\x47\x91\xbd\x06\x3a\xab\x3c\xc1\x17\xd0\x3c\x12\x6e\x90\xe2\xea\xc2\x25\x8f\x90\x06\xe3\x14\xe0\x4b\xfd\xfa\xac\x07\xba\xa3\x01\xf1\xe1\xdd\xa7\x1b\xc4\x47\xc0\xf7\xea\xe1\x48\x87\xce\x9f\x9e\x11\xda\x40\xed\xda\x38\x12\x3f\xfd\x40\xed\x02\x6c\x8e\xab\x6c\x2b\xa7\x86\xb7\xd7\xac\x9a\xb0\x0c\x03\x57\x06\xbf\x3a\x88\x13\x2a\x72\xfa\x86\x43\x1e\x01\x52\xbd\x1a\xce\xd6\xc9\x69\xc7\x28\xe1\x29\xb9\x78\x77\x75\xfd\xee\xfc\xec\xf3\xbb\x8b\x37\x44\xcb\xe7\xae\x63\x7a\x4a\x3e\x0b\x1b\x56\x9c\x3c\x15\x58\x3e\x35\xc8\x87\xb4\xed\x3a\x51\x6a\x93\x96\xf6\x2e\x16\x40\x51\x68\x49\x2e\x4b\xde\x9a\xac\x25\x9f\xe3\x95\x15\xa2\x34\xc4\xfe\x95\x50\x11\xcd\x1b\xde\x9e\xa0\x9b\xa5\x50\xd7\x57\xac\xff\x1b\x93\x22\x19\xb9\xc2\x5c\x0a\xd3\xec\x89\x93\x73\xc4\x81\x43\xe7\x23\xc4\xb2\x65\xe0\x4d\x82\xcd\xfc\x00\x2b\x62\x53\x12\x75\x8e\xa1\xc6\x37\xf1\x6c\x22\x8b\x7c\x02\x31\x87\xa3\xd3\x23\xed\x1a\x15\x06\xb7\x46\x27\xbe\x9a\x9f\x93\x7b\xd6\xe7\x34\xe1\x56\xee\xaf\xaa\x53\x42\x3e\x69\x8a\xd3\x13\xe9\xdd\x0c\xc0\x71\x3c\x85\x36\xba\xa5\xf6\xa6\x7b\x44\xbe\xb6\xdb\x4d\xb7\x70\x1b\xea\x4f\xf5\x01\x29\x77\xac\x0c\x98\xe1\x28\x25\xa8\x1b\x12\x39\x87\xd7\xb6\xe5\x5f\xae\x7f\xde\xed\xa7\x71\x5f\x45\xfe\xf0\xb9\x58\xaf\x79\x4b\x56\xb4\x59\x99\xb2\x3e\x9b\x8d\x60\x76\xf5\xf6\x2d\x0a\xe9\x39\x3b\x54\x5b\xe9\x3a\x2c\x18\x8f\xc2\x8d\x3f\xfa\x49\x7f\x79\x70\x60\x33\x1f\x6f\xa0\xc7\xfb\x34\x48\x0f\x3d\x3e\x94\x44\x35\x05\x35\x6b\xda\xbf\x3b\xf6\x29\x2b\x73\x44\x76\x8c\x26\x64\xd1\x2f\x7c\x74\xf0\xad\xb4\x14\x74\x58\xa0\xa3\x39\x6b\x29\x2f\x7c\x0e\x9f\x1d\xc1\x56\x54\xa2\x10\x37\x69\x78\xce\x23\x83\xf0\x1d\x66\x56\xcf\xe8\x4c\x8e\xee\x6e\xfe\x7f\x3c\x9a\xbc\x4e\x10\x97\x03\x61\xfb\x64\x3c\x61\xc8\xcb\x4e\x39\x78\x3d\x4b\x87\xf7\xea\x80\x0d\x47\xc1\xef\xa2\x2e\x2c\xf4\x3e\x58\x12\x5b\x3f\x5c\xb1\x7a\xcd\x1b\xa9\x4a\x46\x3d\x33\x8f\xd8\x27\x5c\x47\xbb\xb8\x6b\x66\xf7\x4d\xb9\x73\x53\x69\xa6\x01\x05\x27\xb5\xd0\x74\x69\xd2\x26\xd1\x18\x2c\xe1\x9e\x7a\xab\x6a\x36\x63\xbf\xf3\x06\x62\x15\x50\xbb\x20\x6a\x6b\xbd\xa7\x6e\xdc\x1c\x06\x0d\x1d\x82\xd2\x01\x2b\x7c\xb7\x78\x18\x66\x2c\x59\xcf\x67\x42\xa8\x0e\x07\x22\xc3\x6f\x51\x3c\x20\xa0\x28\x54\x23\x63\x80\x80\xde\x40\xa3\x45\xad\xc2\xed\x55\xcd\xef\x78\xc1\xa6\x69\x96\xda\x15\x2f\x6f\x1c\xf2\x60\xa0\x3a\x66\xaa\x0c\x8b\x6d\xf4\x41\xee\xdf\xa6\x75\x32\xe4\x26\xc4\xc2\x2e\xf8\xf8\xe9\x33\x29\x99\x14\xb6\xe2\xcd\xce\x87\x07\xd9\x0c\x4f\xae\xf1\x6c\x36\x83\x78\xca\xf1\xbf\xa5\x5f\x9a\x17\x2f\xc9\xaf\x4c\xfd\xba\x74\xcf\xe5\x8e\xcf\x5a\x72\xbf\x12\x70\xa2\xee\x1a\xd5\xaf\xd0\x3c\xae\x91\xd6\x91\x96\xb9\x7e\xf7\x95\x7c\x5f\xba\x85\x68\xec\x7a\x52\xa0\xea\xbf\x21\xf6\xe6\x70\x6b\x1f\x36\x59\xeb\xea\xd0\xb1\x71\xd6\x9c\x15\x68\xa0\x2c\x02\xb9\xda\x50\xe9\xda\x3c\xac\x0b\x5e\xde\x02\x41\xbc\x52\x66\x72\x4d\xa8\x14\xc6\xf2\x56\xaf\xd6\x9a\xd1\x02\x75\x7a\x9a\xf2\xd9\x66\xce\x77\xd2\xe7\x6d\x42\xf0\xf4\xf3\x43\x85\x59\x0f\x46\x15\xa8\x44\x10\x57\xe5\xbe\x78\x91\x86\x68\xfd\xc4\x3d\x0e\x1e\x8c\xb7\xd4\xa4\xbc\x89\x43\x88\x3a\xba\x9c\x9f\xcf\x2f\x07\x44\x5e\xf8\x59\x2f\xac\xaf\xf5\xe1\x44\x4f\xb7\x0b\xeb\xfb\x61\x81\xa6\xc2\xfa\x53\x06\x11\xba\xbc\xbb\x67\x99\xad\x68\x75\xd6\xb5\xab\x0b\xde\x64\xe2\x8e\x45\x1f\x6a\x34\x6c\x98\x0a\xad\x13\xae\x07\x11\xa5\x90\xf3\xbf\x9f\x5d\xc5\x72\x88\xc4\xa4\x13\xe8\x76\xce\x59\x93\x70\x02\x1a\x6f\xa5\x92\xb1\xf7\x36\x1e\x2e\x43\xbe\xa1\xcb\x10\xd8\x3f\xdf\xfa\x05\x08\x2f\x79\xcb\x69\x2b\x02\x35\x80\xfd\xa8\x40\xd7\xb4\x62\xad\xb6\xc2\xa5\x16\x00\x17\xdb\x60\x8c\x7b\x32\xfd\x16\xd9\xc1\x11\xe6\x70\xba\xca\x1a\x6e\xd0\xf6\x06\x69\x98\x27\xa4\x64\xf7\xf8\xab\x5e\xeb\xa4\xdf\xfe\xab\x4a\xa2\x95\x6b\x95\x16\x7f\x7b\xf3\x57\xe7\x1a\xe5\x6f\xa6\x1c\x5b\x15\xe9\x7a\x24\x5a\xe8\x3a\xe0\x31\xd8\x2d\xe0\x41\x08\xff\x2d\x56\xf7\xa8\xd0\x1d\x8e\xf3\x3f\x3b\x5a\xe0\x48\x7d\xdc\x35\xfe\xd4\x1f\xe5\xc8\xc6\xe8\xd9\xd6\xa3\xfb\xd1\x44\x00\xba\x86\x81\x15\xc4\x6f\xb4\x35\x2d\x1b\x39\xe4\xb1\xc0\x4f\x47\xea\xd2\xeb\x88\x1c\xb7\x59\x15\x44\x7d\xda\x53\x4a\x3c\x36\x56\x8d\xf0\xcf\x26\x15\x7e\xfa\xd7\xf7\x78\x43\x04\xeb\x31\x36\x10\xd3\x6b\xe8\x15\xbc\x4a\x7e\xe6\x4d\x8b\x19\x98\x28\x0b\x88\xb2\x20\x31\xda\x77\x93\x57\x92\xcb\x2b\x80\xe5\xac\xfe\x45\xf3\xbc\x7e\x83\xf6\x4c\x83\x91\xd4\x70\x7a\x13\x86\x0c\x2f\x82\x3d\xe9\xb8\x7d\xa8\x78\x06\x47\xb5\xcf\xe7\x57\x20\xa3\x21\x7f\xf9\x11\xd1\x13\xfe\xf7\x4f\x3f\xbe\xf6\x4c\xe6\x53\x65\xaa\x27\xc6\x3b\x9e\xf0\xbe\x69\x27\x47\x21\x35\x37\x12\x1c\x95\xb9\xe5\x59\x53\x7b\x15\x57\x95\x9c\x2e\xa3\xb3\x63\xdd\x99\x43\x7e\xdf\xb3\xe2\xf6\xe1\xd4\xa1\x3e\xd8\x5e\x93\xa0\x12\xb9\x1a\x28\x11\xe2\xa5\xc2\xdc\x46\x89\x38\xaa\xc2\xe7\x30\xa5\x2a\x91\x9d\x4f\x8b\xfc\xb7\xf1\x9e\xce\xa4\x25\x99\xf8\x8b\x3b\xf2\xdb\x9c\x34\xa7\xb7\x44\x7f\x2b\xa0\xfe\x90\x67\x42\xe7\xc6\x0e\x2a\x00\x2e\x3e\xce\xff\xf5\xf3\xd9\xdb\x77\x3f\x2b\x4e\x07\x48\x21\x40\x78\x35\xcf\x0d\xe4\x36\x59\x5f\xf1\x3b\x69\x7c\xd5\x07\x26\xa8\x8c\xbb\x99\xf9\x38\xe0\xf3\x2d\xc9\xc7\x49\x32\xdf\xc4\x9a\xf6\x5d\x63\x38\xe5\x72\xa2\xe7\x8f\x10\x04\xd3\x11\x56\xf6\x7b\xbf\xaa\x43\x0e\x46\xc3\x6a\x40\x7e\x7c\xb4\xd0\xcd\x64\x47\xc9\x33\xdc\x3b\xc8\x1e\xe3\x28\xe0\xd1\xcf\xd3\xe3\xed\x6e\x1c\x9e\x75\x1c\x43\x96\xbf\x8e\x2f\x85\x3a\x9a\xc3\xb7\xf5\xad\x95\xdc\x25\x98\x6a\x54\x4b\x35\x2e\x15\x38\x6b\x9a\x30\x88\xc9\x70\x85\x3d\xdb\x3a\xda\x3a\xfa\x37\x53\xed\xdf\x46\x61\xdb\xac\x1e\x54\xc9\xe7\x05\xe5\x13\x28\x14\x83\x5d\x3b\xf6\x22\xfe\x73\x8e\x41\xc2\xde\x55\x8c\xa9\x53\x99\x52\xe2\x82\x50\x32\x2a\xd3\xe4\x33\x50\x75\xbc\x05\x3c\xc0\x88\xd0\x47\xca\x0c\xda\x61\x98\xe9\xc9\xb4\x1f\xe1\x27\x99\x6c\xcc\xd6\x0a\x11\xde\x4e\x49\x9e\x3b\xd7\x2f\x0c\x6b\xfd\x26\x86\xc9\xef\xaf\x6f\x0e\xa0\x26\x0c\xaf\x84\xae\x69\xec\x41\xdd\xef\x5d\x47\xec\x38\xc2\xe4\x51\x34\xf1\xaf\x89\x35\x5f\xe1\x53\xff\xee\xe7\x9f\x90\x1a\x30\x2b\x69\xab\xed\xbe\x12\xad\x28\x93\x13\xff\xaf\x46\x5e\xeb\xef\x6f\xfc\xc6\x39\x96\xa6\x14\xd3\xe1\x01\x23\x02\xf3\x38\xc7\xe8\x76\x27\x89\x75\xb7\xdc\x7a\xff\xad\x45\xaa\x7b\x83\x84\x88\x49\x25\xc9\xa3\xcb\x61\x2e\x2f\x94\x33\xa7\x4b\x5e\x1a\xb5\x38\x88\x5d\x1d\xce\x3a\xf0\xf4\xd7\x9b\x83\xbf\xbb\x39\xcd\xb7\x63\xbd\x94\x13\x7a\x2f\xea\xf8\xa2\xf4\xab\xde\x0b\x83\x0c\x05\xf5\xb7\x61\xcd\xd8\x94\x8b\xff\xb5\xec\x92\x39\x5c\xb7\x3a\x5d\x19\xbb\x4d\xd1\x7b\xc7\x33\xc5\x63\x9b\x2a\x6a\xeb\x78\x64\x8e\x6c\x2a\xdc\x3a\xe1\x2d\xe3\xb3\x78\xfb\xdb\x4c\x89\x46\x2a\xb6\xc0\x39\x04\xa0\x94\x5a\xe0\xbc\x93\x27\x9f\xc8\xb4\xfb\x8b\xfa\xba\x3a\xf0\xcb\xf9\xb1\xea\x83\x9a\x2d\x14\x4a\xc5\x7a\x56\x3a\x5c\xc3\x60\x19\xa1\x13\x10\x9f\x7c\x29\x6a\x80\xad\xe2\x58\xbe\x6c\x21\x39\x55\x89\xf2\x89\x22\x9f\x58\xd3\x6a\x12\x6c\x52\xaa\x04\x17\xda\x7c\xcb\xed\x9f\x8e\xd0\xff\x21\x04\xcb\xef\x82\xef\x47\xa9\x00\x0f\x2c\xff\x28\xd4\xbe\x47\xe8\x14\x08\x7f\x00\x6a\xdf\x23\x31\x15\xa2\xd8\x81\x20\xf6\x48\x8d\x06\x27\xb6\xe0\xc3\x4f\x70\x89\xa3\x96\x61\xe4\x42\xd0\x00\xfb\x3a\x59\x14\xb7\x81\x97\x9d\x20\x0d\x5a\xff\xca\x48\xc4\x91\x56\xd8\x02\x96\xdf\x96\x16\xa2\xbc\x09\xa3\xf9\x0a\x37\xd9\x81\xe5\x26\x97\xe0\xa1\xf2\x06\xcb\x63\x51\x67\x03\x74\xd8\x13\x9d\x73\x21\x17\x2c\x43\x87\xe5\xc5\x86\x7a\x69\x6f\xb9\x9d\x69\x65\x10\x8d\x3c\x0d\x41\x37\x38\x49\xa3\xfd\x89\x60\x3a\x8e\x10\x49\x5c\x36\xe4\x30\xe7\x71\x94\xc4\x71\x5e\x64\x37\xab\x64\xc0\x7e\x1c\x25\xd5\xcf\x90\x8c\xd2\x47\x78\x90\xa3\x64\xb7\x21\xae\xe4\x11\x46\xe4\x28\xc1\x31\xac\xc9\x86\x1b\x39\x4a\x62\x12\x7f\x72\x74\xe7\x93\x98\x94\xe3\x96\x95\xc3\xb6\x1c\xe4\x54\x8e\x92\x38\xc1\xbb\x3c\xc5\xae\x1c\x25\x33\x86\xcb\x94\xa4\x6c\xd1\x64\x56\xe6\x28\x99\x24\x8a\xbb\xd9\x3e\x29\xda\x07\x9f\x08\x3e\x67\xfb\xec\xc8\xec\x6c\x9f\x24\x20\x6a\x7c\x62\x88\x1e\x26\x5a\xea\xa7\x7c\x88\x96\x49\x1c\x72\x08\x3f\xf9\x43\x82\xc8\x09\x9a\x88\x09\x1a\x88\x04\xc1\x1e\xc2\x08\x97\x10\x22\x49\xe2\x7e\xa8\x23\xec\x13\x4d\x22\x91\x20\x33\x8d\x3c\x69\xf8\xa4\x10\x4b\xd8\x27\x9e\x62\xc2\x3e\x31\x64\x13\xf6\x89\xe7\x9e\x4e\x59\xce\x86\xa5\x3a\xc0\x42\x9d\x20\x73\x94\xaf\xda\xd2\x76\xf5\xf8\xa8\x13\xc4\x7a\x99\xab\x13\xa5\x25\x2b\x9f\x58\x90\x79\x7c\x42\xbc\xd5\xee\x37\x03\x45\x07\xf6\x89\xe6\xc3\x71\xbf\xee\xcb\x6c\xb2\x4f\x38\xc9\x06\x9f\xaf\x39\xd5\x06\x9f\xd4\x84\x9b\x28\xa1\xe1\xa4\x1c\x7c\x92\x56\x55\x98\x2b\xdb\x3e\xc9\xac\xd9\x51\xdd\x32\xcc\xda\x31\xfc\xd9\xc3\x5e\xfa\x23\x53\xfd\xef\x46\xac\xd9\x20\x13\xa3\xf3\xd5\xf0\xc9\xce\x91\x06\x67\xbb\x60\xaf\xac\x03\xf3\xfc\x67\xbb\x4d\x56\xbd\x0d\xda\xbb\xa8\xe9\x8d\xb4\x04\xdb\xba\xb7\x21\x2e\xbe\x48\x5d\x3c\x40\x43\xf4\xb3\xf2\xc5\xda\xd5\x08\xee\x3e\xe7\xdb\xc9\x0e\x73\x2c\x9f\x9f\x7d\xe2\x99\xfd\x92\x5c\x51\xe4\x00\x0c\x70\xfc\x25\x48\xdc\x85\x0d\xd0\x3e\xe9\x03\x4a\x92\x19\x02\xed\x13\xc7\x15\x98\x24\x92\x58\x66\xc1\x20\x6b\x60\xa2\xe0\x04\x8e\x41\xe7\xa5\xf4\xa3\x12\x49\xe5\x1d\xb4\x4f\x2c\x03\x61\x62\xcf\x75\x82\xc4\xb6\x5c\x84\xf6\xd9\x6a\x38\xd2\x1c\x38\x92\xc4\x54\x38\x6c\x5a\xb4\x8f\x46\x0e\x87\xda\xc3\xa1\x36\xf2\xf9\x03\x1c\x6a\x43\x5c\x8a\x89\x67\xd0\x1e\x28\xda\x14\xab\x62\x82\xcc\x4d\xfe\xc5\x49\x7e\xc5\x94\x63\xed\x24\x13\x63\x9f\x69\x31\xd1\x31\x08\x72\x32\x46\x72\x2e\x3a\x52\xd3\xd5\x6e\x2a\x0f\xa3\x7d\xd2\x19\x19\x53\xb6\x92\xf4\x97\xe2\xb9\x19\x13\x24\xf7\x59\x1c\xc3\x2c\x8d\x29\xfe\xd1\x96\x7c\x8e\xf6\xd9\xce\x2f\x4b\xe6\x78\xb4\x4f\x1c\xdb\x63\xa2\x1f\xe1\x72\x43\x6e\xcf\xfb\x68\x9f\x2d\x9d\xab\x04\x2e\x48\xe7\xa5\x48\x56\xc8\xc4\x21\x51\x7b\xc1\xcf\x0f\x99\x28\x33\x8e\x4d\xd2\x3e\x5b\x0e\x63\x0a\xc3\xa4\x7d\xf6\xcb\x35\xb9\x63\x27\xb6\xf1\x2c\x23\x99\x28\x87\x2d\x4b\x70\x2c\x53\x03\x96\xcf\x1f\x86\x8c\x16\x8c\x89\x3b\x7b\x08\x13\x29\xbe\x03\x75\xfb\xff\xf5\x44\x80\x9e\xf0\x76\x5f\x55\x74\x06\x30\x16\xed\x93\x72\xb5\x1f\x1f\x7d\x38\x5c\xed\x3f\xce\xd5\xfe\x5c\x71\x75\x1c\xee\xf5\x47\x7b\x73\xb8\xd7\xb7\xcf\xe1\x5e\xff\x10\x02\x39\x84\x40\x36\x9f\xc3\xbd\x7e\xaf\x5b\x87\x7b\xfd\xc3\xbd\xfe\xe1\x5e\xdf\xf7\xec\xf5\x5e\x5f\xb9\xe7\x78\xa9\x1f\xbd\xf8\xbe\x92\x3b\x7d\xc5\x92\x75\x96\x65\xa2\x2b\xdb\xcf\xe2\x96\x05\xaf\xf6\xa2\x0e\x6d\x1b\x52\x83\x1d\x7c\xbc\x13\x1e\xed\x72\x2e\x4f\x52\xc9\xb3\x7d\xa6\x5e\xd4\x87\x1c\x69\x61\xca\x9c\xe5\x46\x62\x6c\xc8\x57\xbe\xdc\xca\x51\x38\x25\x67\xa4\x66\x19\xaf\x38\x43\x1a\x7c\x8a\x9f\xe3\x72\xd0\xf4\x1e\x91\x8e\x7e\xc3\x8a\xa5\x22\x46\x28\x1d\x62\x2d\xe7\x6c\xa2\x54\xbf\x6e\x6e\x94\x5c\xa5\x54\xa0\x59\xe8\x0e\x08\x8d\xd2\xaf\x19\xc7\x6a\xf6\x6f\xe5\x71\xc4\xf5\x1e\x7b\xfe\xd9\x69\x89\x1b\xf4\xc2\xa1\x8d\xe1\x05\xdb\x68\x24\xad\xb8\x42\x2c\xd8\xb7\x86\x60\xbf\x57\xbc\x86\x65\x3d\x67\x99\x28\x7d\x3c\xc8\xf6\xe9\x2d\x9e\x77\x43\x09\x7a\x15\xa9\xf8\x72\xe4\x31\x36\xef\x6a\xc3\x7b\x7c\x47\x0b\x9e\xf3\xf6\xc1\x5c\x9d\x2b\x8a\x3b\x8a\xfb\x4c\x0d\x74\x94\xd8\xb3\xc6\xce\x32\xa1\x55\x55\x0b\x9a\xad\x58\xe3\xf4\x1b\x7d\x60\x55\x59\x19\x25\x53\xd7\xbd\x20\x79\x24\x38\xc0\x20\x57\xfa\x49\xc5\x03\xa9\x45\xab\xd3\x46\x54\xc3\xe3\x8e\x9f\xbd\xce\xe1\xb1\x07\x1b\x85\x3f\x81\x2e\x49\x5b\x3f\x40\xfe\x49\x5c\x08\xd5\x69\x0a\x8e\x00\x5f\xba\xff\xd3\x10\x51\xe4\x1a\xdc\xe8\x2f\xaf\xe3\x8e\x7e\xac\xce\xd4\x9e\x86\xe3\x0d\x5f\x43\x84\xb3\x90\x3e\xa2\x34\x0d\xfd\x1f\x88\x5b\xe4\xb6\x11\x7f\xfa\x81\xac\x44\x57\x37\xa7\x6e\x0d\xe4\xf7\xf0\x19\x9e\xcf\x63\x6f\xc9\xa4\x63\xd9\x92\x82\xd1\xa6\x25\xdf\xbf\x26\x6b\x5e\x76\xd2\x35\x88\x78\xd7\x71\xcd\x7f\xfc\x21\x7a\xbb\xc5\x3a\xe5\xb1\xee\xf8\x66\xe2\x83\xda\x55\x15\x82\x9e\x2b\xaf\x5c\x69\x95\x50\xd5\xad\xf3\xfb\x40\x78\x30\xb8\x87\x54\xa6\xc8\x9d\xb9\xb2\x15\x7b\xd6\x35\xb1\xde\x6d\x94\xb7\x1a\x69\xf7\xa3\xbe\x16\x72\x62\x43\x25\xa4\xea\x82\x63\xf4\xaf\x81\x06\xfc\xd6\x89\xc5\x43\x1b\x53\x53\xfe\x4f\xfc\x66\xbf\x98\x5c\x7f\x38\x0e\x1e\x35\xd1\xe1\x1e\x97\x87\xc5\x8e\x1a\xfd\x76\xd8\xfb\xb8\x91\xa7\xe9\xc8\xba\x41\x38\x79\xeb\xd3\xa0\x0e\xd3\x66\x19\x43\xce\xe1\x0b\xcb\x16\x57\x0a\x94\x1b\x98\xb2\x7d\xd6\x5c\x7b\x11\x9a\xf4\x38\xeb\xfa\x41\x9f\xf2\xdd\x3f\x2f\x44\x8c\x3f\x5c\xb3\x1b\xde\xb4\x09\x14\x3c\xf8\xf5\xfe\x72\x6a\x78\x79\x83\x94\x09\xeb\xae\x68\x79\x55\x98\x9e\x7b\xfa\x6b\x44\x29\x5b\xe7\x86\x8c\xa9\x13\x9b\xa4\x08\x5a\x80\x10\x7b\x81\x6b\x83\x63\xf3\xfb\xac\x6c\x11\xa9\xbf\x96\xc6\xb4\xa2\x35\x35\x03\x0b\xa4\xe4\xcd\x4b\x15\x97\xa6\x99\x37\xfd\x4d\x61\xdf\x48\xcb\x55\xd3\xc2\x0c\x97\x7b\x81\xbb\xcb\x62\x6b\x59\x49\x4b\xcf\x2d\x50\x3f\xac\x02\x5f\x26\xe2\x5e\x67\x92\x2a\x26\xa6\xc1\x2a\x0b\x96\x3c\xbf\xa5\xd9\x2d\x2b\x73\xa0\xd3\xc3\x21\xc9\x1f\x4a\xba\x56\x18\xa6\x86\x74\x8c\xe5\x03\xc9\x93\x95\xe5\xf2\xc1\x28\x23\x96\x4c\x6b\x20\x86\x00\x13\x78\xc4\xf8\x74\x4d\x34\xc8\xd7\x97\x46\xfa\x02\x7e\x1d\xd1\xe0\x9d\x6a\xcd\xef\x32\xa6\xdc\x26\x4f\x97\xe4\x8f\xef\xd2\xf8\x3b\x0f\xee\xc7\x46\xf3\x15\xe6\x07\x77\x56\x3e\x04\x2f\xcd\x35\x17\x20\xfe\xd1\x42\xaa\x05\xdf\xf9\x47\x17\xd6\x0f\x16\xc5\xe2\x61\x57\xc2\xae\x30\x47\x15\x6e\x8d\x89\x3f\x7b\xf0\x18\x02\xb6\xae\x5e\xc4\xe0\x24\x1c\x5d\xbf\xbd\xe8\x6b\xa5\x6b\x9a\x8b\x86\xbc\x2d\x44\x76\x4b\x2e\x18\x9c\x03\x5c\x7b\x37\x31\x12\x43\x08\xc5\x1d\xb9\xab\xea\x45\xbe\x3b\xb7\xc0\x01\x0f\xff\x1b\xc2\xc3\xaf\x17\xbe\x01\xf8\x36\xd0\xf0\xd7\xf4\x26\x9e\x4e\x45\x9e\xd8\x61\xab\xc1\x6b\x1a\xa6\x75\xcb\x2d\xf2\xdd\x4a\xdc\xcf\x5a\x31\xeb\x1a\x36\xe3\x9e\xc4\x97\x88\x5e\xdc\xb2\x07\xf9\xd7\xd8\x7e\xfc\x03\xbf\xde\x3b\x2e\xb5\x02\x2e\x1e\xe0\x73\x69\xf1\xaf\xdf\x5e\x48\x33\x13\x83\xee\xc6\x1b\xf2\x8a\xb5\xd9\xab\x8c\x55\xab\x57\xaa\x29\x5f\xc5\xb0\xac\x45\xc9\x5b\x51\x47\x33\xe0\x9d\x91\x4c\x14\x85\x42\xd5\x10\x4b\x72\xce\xaa\x95\x11\xf2\xf8\x3d\x7a\x2a\x84\xf4\x4a\x88\x58\x04\x69\x67\xc9\xcb\xb7\xd4\x8a\x77\x26\xbe\x5e\xa4\x2a\x98\xa7\x5e\x04\xdf\x18\x01\xf1\x23\x0c\xcf\x7e\x81\xe5\x8f\xe6\xfa\x05\x38\x86\x3a\x77\x4f\x7d\x1c\x79\x25\xd8\x33\x42\xae\x9a\x21\x97\x4b\x74\xc7\x73\x96\x13\x71\xc7\xea\x9a\xe7\xac\x21\x46\x9b\xb8\x27\x5f\x5e\xec\x89\x20\x70\xab\x31\x3d\xc0\xe0\x3f\x2b\x0c\x7e\xc2\x31\xc9\x51\x5e\xf2\xad\x4d\xe5\x45\xf3\x35\x2f\x13\x61\x5d\x9f\x56\x7d\x05\xe1\xec\xa5\x1f\x32\xf1\x37\x6d\xb8\xb6\x39\x88\x34\x19\x2d\xd8\xe5\xa7\x88\xc3\xc8\x1c\xbf\xd9\x3f\x8f\xe8\x0f\x1d\x64\xd3\xad\xb0\x1c\xff\x61\x16\x3b\x29\x45\x3e\x15\x9b\xfe\xe3\xa2\x9d\x3a\x6b\x19\xc1\x1c\x77\x31\x94\x37\xb4\x65\xf7\x34\x9a\x65\x5c\x77\xa5\x8f\x29\x6e\xa6\xfe\xec\xea\x92\xfc\x84\x12\x77\x03\x59\xad\x45\x8b\x1e\xd9\x85\x58\x53\x1e\xcd\xa4\xe4\x80\x43\xbb\xcd\xba\x32\xe2\x08\xca\x93\x56\x28\x70\xce\x40\xdc\xb1\x4e\x9e\xb3\xd4\x09\xe8\x80\x74\xb9\x67\xa7\xc2\xfa\x14\x4e\x10\x48\xa7\xfa\x5a\x12\x1b\x35\x8b\x81\x40\x96\xbd\xa8\x26\x0d\x2b\x1b\x0e\xb7\x40\x4e\x72\x82\xe2\x0f\x45\xf2\x59\xcc\xd4\x45\xc7\xc3\xb7\xf3\x7e\x16\x37\xbc\xd4\xfb\x56\xa8\x2b\xcd\x25\xf5\xf9\x22\x07\x4f\xe1\x59\x3d\x85\xa6\x29\xde\x95\x74\x51\xf8\xae\xd3\xfa\x8a\xbf\xa0\x37\x72\xd1\x31\x78\xeb\x55\xce\x1b\xf9\x5f\x32\x9f\xff\x0c\x81\xf4\xae\xd4\x9e\x6d\x20\xb5\x59\xa9\x3d\x53\xcd\x83\xdb\x76\xb7\xfd\x84\x7a\x27\x01\x89\xf4\xb2\xcc\x65\x73\x59\xd3\xcb\x4f\x52\x72\x10\x64\xd5\xa4\x98\x43\x26\x87\xff\xbe\xe6\xf3\x8a\x67\xb7\x57\x4e\xbc\x5c\xd4\xf2\xb3\xd2\xf9\xa8\x67\x8e\x86\x7f\xdb\x45\x61\xaa\x46\x5f\xc5\x1f\x5b\x3f\x3b\x1a\x7f\xae\xba\x2c\x5f\x27\xb4\x69\x44\xc6\xed\x05\x49\x00\x30\xd5\x1a\x8b\x1c\x8c\xc5\x6e\xdd\x00\x4b\xbf\xa5\xfd\xd2\x13\xa7\x89\xb1\x1b\xc7\x2a\xf9\x0f\xa1\x6a\x1c\x76\x6a\x3a\x2e\x94\x04\xa6\x86\xcf\x3d\x6e\x06\xed\xfb\x61\x44\xdf\xc4\xed\x55\x04\x30\xac\xd4\xb5\x37\xa6\xe8\x70\x36\x27\xd1\x70\x34\xa8\x8b\xe6\x47\x8c\xfd\x2b\x2f\x69\xe2\xaf\xc6\xee\x4d\xfd\x7d\xda\x67\x0c\x79\xe4\x9e\x22\xaa\xb1\xf3\xf9\xe0\xda\x12\x3f\x53\xc1\x7e\x48\xdc\xaa\x44\xd5\x15\x74\xf2\xde\x72\x83\xf8\x62\x07\x0a\x18\xfc\xf5\x6d\xaf\x04\xd2\x51\x98\xfd\x45\x06\x7d\x40\x66\x7f\x04\x5f\x43\x35\xc7\x01\x32\x87\x21\x46\x5a\x41\x5e\xff\xf8\xc3\x0f\x53\xe0\xcd\x93\x10\xcd\x5e\x0f\xd5\x07\xde\xec\x83\x68\xf6\x0a\xf5\x82\x37\x4f\x95\x08\xf8\x2e\xeb\xa6\xc1\x9b\xa7\xdd\x81\xfd\xa1\x37\x07\x62\xab\xa9\xf5\x7c\x6e\xad\x9e\x2f\xc2\x15\xae\xe2\x1b\xaf\x6f\xf3\xc8\xf4\xd4\xee\xf9\xeb\xf2\x7c\x32\x47\x2a\xf6\x22\xab\xf1\x02\x67\x27\x9b\xe8\xb0\xaf\x1a\xbc\xa4\xca\x3b\xb7\xaa\x2e\xd0\x52\x7f\xbd\xdd\x44\x2d\x9d\x47\xe6\x78\x95\x5d\xb8\x82\xce\x23\xb2\x57\x5b\x17\xa8\xb4\x48\x43\x13\x0f\xd7\xc8\x45\x55\xbf\xc5\x66\x62\x47\x54\xba\xed\x58\xdf\x16\x9d\x74\x17\x53\xcb\x96\x62\x5c\x6c\x5d\x5a\x40\x28\xf1\xd7\xad\x4d\x55\xa3\x05\xa5\x8e\x57\xab\xf9\x6a\xd0\x82\x22\xfd\x66\x64\xbb\xca\xb3\xe8\x7a\x33\xc7\x64\x04\x85\x46\x57\x99\xa5\xd4\x96\xc5\x27\xaf\xc6\x24\xae\xc6\x57\x8f\x39\x35\x61\xc1\x8e\xfb\x6b\xc6\xc6\x2b\xc1\xa2\x56\xd2\x66\xa5\x98\xbf\xfe\x2b\x28\x34\xa6\x3e\x2c\x72\xf3\xc6\x64\xcb\x86\x2a\xc0\x82\x99\xb4\x7b\x49\x8f\x8d\xa9\x32\x4a\xaf\x2d\x32\xd6\xc5\xab\xe5\xfd\x25\x45\xf1\xc1\xbc\x14\x9e\x3e\x37\x46\xa5\x8e\x1e\xda\xc1\xc5\x04\x23\x0b\x5a\xe8\xf5\x20\xba\x89\x4b\xd2\x7d\x1d\x3e\x48\xcc\x62\x0b\x1d\xcc\xf0\xf7\x44\x0c\xb1\xad\x8a\x45\x7c\x9a\x0f\xae\x4b\xcc\xc7\x87\x5b\x92\x6f\x9c\x13\xee\x10\xdc\xdf\xec\xa4\x0d\xee\x37\x3d\x08\x25\x1d\x94\x40\xdf\x69\x29\x6a\x22\x16\x0a\x3c\x36\xe0\xab\xdb\x0d\x73\x76\x75\x29\xcf\xf3\x50\x31\x46\x8b\xe6\x94\x8c\xd4\xef\x2b\x37\x28\x74\xfe\xb1\x27\x1c\xda\xb6\x6c\x5d\xb5\xbe\xa5\x70\x88\xed\x3f\x6b\x6c\x3f\x39\x20\xf9\x8b\x79\xc1\x50\x23\x77\x6b\x5a\xce\xe4\x6e\x83\x28\xbf\x13\x6c\xf5\xf4\x60\xa8\xa9\x4f\x89\xce\x66\x86\x01\x85\xd0\x0d\x14\x32\xf4\x38\xda\x89\x2f\x46\x60\xd9\x7b\xf7\x13\xa1\x05\x59\xc9\xa3\x82\xc6\x78\xb0\x3f\x33\x31\xcc\xa9\xf5\xaa\x20\xe8\xaa\x19\x21\xbd\x15\x1d\x5b\xdf\x3b\xb1\xb7\x2b\x16\xca\xde\xbf\x82\xea\x1b\xfb\x7e\xff\x0c\x83\x87\x18\x5a\x14\xe2\x1e\xdb\x6b\xed\x60\x60\xb8\xa1\x67\x58\x22\x08\xb5\x28\x5c\x1e\xf4\x55\x34\xd9\xed\x02\xe8\xa4\x56\x9e\x92\xbc\x8e\x3f\x1c\x0d\x6a\x75\xb5\x38\x67\xad\xbb\xd8\xe4\x31\xba\xc4\x84\x74\xf9\x6f\x9d\xd9\x14\xe8\xb8\xbe\x38\x5a\xb0\x15\xbd\xe3\xa2\xab\x51\x6e\x2b\xc8\x0b\xf5\x27\x30\x5a\x0f\xa2\x33\xc1\xc2\x2e\x90\x30\x6b\x46\xb1\x19\x99\xa9\x8f\xf6\x8f\x70\x98\xcb\x85\x8e\xa3\xcc\xd8\xef\xdc\x5b\x4e\xb8\x31\x66\x7a\x92\x34\x6a\xe7\xa3\x39\x5e\x77\x4d\x25\xad\x62\x34\xe5\xe8\x2f\xee\xf7\xfb\x0e\xd8\xdd\x1c\xfe\xf4\xad\x11\x8e\x1e\x5c\xb0\xb1\xc7\x5c\x17\x16\x3c\x7b\x88\x26\xdb\xb4\xd7\x84\xf2\x35\xf2\x96\x36\x2c\x27\x1f\x68\x49\x6f\xf0\xec\x7b\x3c\xbf\x7a\xfb\xe1\xa5\x9c\xc2\x40\x78\xe3\xf2\x62\xec\x96\x51\xcb\x47\xf1\x1f\x77\xab\x4f\x19\xf4\x31\xc1\x0c\xee\xad\x97\x3b\x56\xd8\x68\x83\xe5\x47\x3b\xdf\x2c\xf0\x1d\x92\x28\x0f\x36\xee\xdd\x3a\x7f\x44\x72\x64\xdb\xe4\x74\x75\x35\x2d\x7b\x36\x0e\xbb\xe7\x91\x36\x1e\x6d\x18\x7d\xa1\x69\x69\xdb\xf5\xb4\x4d\xdf\xe1\xfc\x20\xf7\x78\xcd\xb0\x5a\x7d\x01\xf8\x09\xb9\x7a\x49\x1b\xfe\xcf\x2b\x5a\x8a\xe6\xba\x2b\x58\x4d\xb2\xa2\x6b\x5a\x56\xe3\xb9\x04\x2a\x36\xfb\x6b\xe0\xa3\x90\x07\xfd\xac\xe8\x72\x08\xc9\xb3\x52\x03\x1c\x40\x55\x41\x2d\xd6\x7d\xa4\x86\x13\xf4\x95\xcc\x1f\x9c\x9f\xea\x89\xfd\x04\x4a\x48\xd4\xe0\xed\x23\xd6\xc5\xa8\x57\x7c\xc3\xdb\x55\xb7\x38\xcd\xc4\xda\x71\x90\x5f\xa9\xdc\x8d\xf6\xe1\xd5\xa2\x10\x8b\x57\x6b\x2a\xbb\x20\xdd\xe5\xb6\xe6\x8b\xae\x15\x75\xf3\x2a\x67\x77\xac\x78\xd5\xf0\x9b\x19\xad\xb3\x15\x6f\x59\xd6\x76\x35\x7b\x45\x2b\x3e\xcb\x44\x79\x27\x97\x9b\x28\x9b\xd3\x75\xfe\x9d\x54\x51\x33\x5a\xe6\x33\x1c\x24\xd7\xdb\x9d\xd2\xee\xf4\x8e\xf2\x42\xfa\x98\xd7\x4c\x2a\x41\xba\xa1\xfc\xfb\x21\x41\xd1\xd2\x82\x94\xdd\x7a\xc1\x6a\xb8\x3d\xd7\x6f\x93\x4a\xe4\x0d\x1e\x0f\xb1\x26\xd3\xd4\xee\xaf\x79\x29\xe7\xe3\x41\x61\x4b\x6c\x82\x14\xb7\xb4\xbe\x61\x2e\xd7\xab\x3b\xa7\x39\xab\x0a\xf1\xb0\x1e\xb9\x75\xf1\x05\x49\xa7\x83\xa2\x15\x95\xee\x99\xb7\x8f\xd7\xd6\xf6\xea\x00\x97\x74\x92\x28\x12\xa4\xea\x22\xed\xae\xcc\x59\x5d\x00\x94\xc3\x1a\x34\xd4\xa6\x3d\x56\x87\x1a\x70\x82\x16\x4c\x7e\xb3\x62\xb5\x6c\xb6\xf4\x0f\xe1\x00\x9c\x4b\xd3\xcc\x8c\x68\x73\x87\x65\xbe\x36\xda\xaf\xb1\xf3\x6f\xbd\xcd\xec\x95\xa2\x9c\xb5\xac\x5e\xf3\x12\xac\x01\x4c\xa1\x6f\x36\x36\x7a\x68\x67\x87\x1c\xb7\x2b\xc6\x6b\x45\x15\x42\xd6\xb4\xcd\x54\xe0\x15\x80\x73\x45\xfd\x72\x3f\xf3\xd7\x95\xbb\x2d\x58\xe7\xfd\x9d\xfa\xbb\xa7\xde\x54\xb9\x1c\xf9\xad\x7a\xb2\xcf\xc9\x03\xc3\xb5\xa2\x77\x18\x9f\xc9\x59\x23\x8d\x81\xa6\xd3\x80\x53\xd1\x3e\xfa\x3b\x66\x65\x66\x9b\x0a\xa8\xf7\x57\xdc\xaf\xbd\x8f\xea\xb1\xef\x8d\xac\x8b\xfe\xdf\xfb\x23\xed\xb7\x4c\xc3\x86\xce\x60\x08\xfe\x67\xf4\xfb\x6a\x90\xde\x90\xbb\xef\xed\xff\xc1\x4c\xce\x14\x32\x39\xfc\x01\xf1\xab\x58\xfe\x86\xb4\x75\x87\xf6\x54\x79\x49\xea\x13\x6b\x0b\x69\x96\xb1\xaa\x65\x39\x1c\x7b\xb0\x09\xb7\xbc\xcc\xdf\x90\x17\x88\xa1\x5d\x15\x5d\x4d\x0b\xf5\xbf\x52\xa7\x72\xd0\x1e\x6f\xc8\xff\xfb\xff\xff\x83\x52\x59\xfe\x8b\x6e\x87\xfc\xf0\xff\x02\x00\x00\xff\xff\xd7\x38\xde\xad\xdc\x44\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: 279772, 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": {nil, map[string]*bintree{ - "prometheus-operator-crd": {nil, map[string]*bintree{ - "monitoring.coreos.com_alertmanagers.yaml": {examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml, map[string]*bintree{}}, - "monitoring.coreos.com_podmonitors.yaml": {examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml, map[string]*bintree{}}, - "monitoring.coreos.com_prometheuses.yaml": {examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml, map[string]*bintree{}}, - "monitoring.coreos.com_prometheusrules.yaml": {examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusrulesYaml, map[string]*bintree{}}, - "monitoring.coreos.com_servicemonitors.yaml": {examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml, map[string]*bintree{}}, - "monitoring.coreos.com_thanosrulers.yaml": {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 8e0aecd0..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go +++ /dev/null @@ -1,1142 +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" -) - -// 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 *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` - // ServiceMonitors to be selected for target discovery. *Deprecated:* if - // neither this nor podMonitorSelector are specified, configuration is - // unmanaged. - 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 EmbeddedPersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` -} - -// EmbeddedPersistentVolumeClaim is an embedded version of k8s.io/api/core/v1.PersistentVolumeClaim. -// It contains TypeMeta and a reduced ObjectMeta. -type EmbeddedPersistentVolumeClaim struct { - metav1.TypeMeta `json:",inline"` - - // EmbeddedMetadata contains metadata relevant to an EmbeddedResource. - EmbeddedObjectMetadata `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // Spec defines the desired characteristics of a volume requested by a pod author. - // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - // +optional - Spec v1.PersistentVolumeClaimSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - - // Status represents the current information/status of a persistent volume claim. - // Read-only. - // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims - // +optional - Status v1.PersistentVolumeClaimStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` -} - -// EmbeddedObjectMetadata contains a subset of the fields included in k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta -// Only fields which are relevant to embedded resources are included. -type EmbeddedObjectMetadata struct { - // Name must be unique within a namespace. Is required when creating resources, although - // some resources may allow a client to request the generation of an appropriate name - // automatically. Name is primarily intended for creation idempotence and configuration - // definition. - // Cannot be updated. - // More info: http://kubernetes.io/docs/user-guide/identifiers#names - // +optional - Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` - - // 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"` -} - -// 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 *EmbeddedObjectMetadata `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 352a62a1..00000000 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go +++ /dev/null @@ -1,1620 +0,0 @@ -//go:build !ignore_autogenerated -// +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(EmbeddedObjectMetadata) - (*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 *EmbeddedObjectMetadata) DeepCopyInto(out *EmbeddedObjectMetadata) { - *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 EmbeddedObjectMetadata. -func (in *EmbeddedObjectMetadata) DeepCopy() *EmbeddedObjectMetadata { - if in == nil { - return nil - } - out := new(EmbeddedObjectMetadata) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EmbeddedPersistentVolumeClaim) DeepCopyInto(out *EmbeddedPersistentVolumeClaim) { - *out = *in - out.TypeMeta = in.TypeMeta - in.EmbeddedObjectMetadata.DeepCopyInto(&out.EmbeddedObjectMetadata) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmbeddedPersistentVolumeClaim. -func (in *EmbeddedPersistentVolumeClaim) DeepCopy() *EmbeddedPersistentVolumeClaim { - if in == nil { - return nil - } - out := new(EmbeddedPersistentVolumeClaim) - 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 *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(EmbeddedObjectMetadata) - (*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(EmbeddedObjectMetadata) - (*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/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go index 70ddeaad..79299478 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypass.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -18,7 +18,6 @@ // tag is deprecated and thus should not be used. // Go versions prior to 1.4 are disabled because they use a different layout // for interfaces which make the implementation of unsafeReflectValue more complex. -//go:build !js && !appengine && !safe && !disableunsafe && go1.4 // +build !js,!appengine,!safe,!disableunsafe,go1.4 package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go index 5e2d890d..205c28d6 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -16,7 +16,6 @@ // when the code is running on Google App Engine, compiled by GopherJS, or // "-tags safe" is added to the go build command line. The "disableunsafe" // tag is deprecated and thus should not be used. -//go:build js || appengine || safe || disableunsafe || !go1.4 // +build js appengine safe disableunsafe !go1.4 package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/davecgh/go-spew/spew/config.go index 161895fc..2e3d22f3 100644 --- a/vendor/github.com/davecgh/go-spew/spew/config.go +++ b/vendor/github.com/davecgh/go-spew/spew/config.go @@ -254,15 +254,15 @@ pointer addresses used to indirect to the final value. It provides the following features over the built-in printing facilities provided by the fmt package: - - Pointers are dereferenced and followed - - Circular data structures are detected and handled properly - - Custom Stringer/error interfaces are optionally invoked, including - on unexported types - - Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - - Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output The configuration options are controlled by modifying the public members of c. See ConfigState for options documentation. @@ -295,12 +295,12 @@ func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) // NewDefaultConfig returns a ConfigState with the following default settings. // -// Indent: " " -// MaxDepth: 0 -// DisableMethods: false -// DisablePointerMethods: false -// ContinueOnMethod: false -// SortKeys: false +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false func NewDefaultConfig() *ConfigState { return &ConfigState{Indent: " "} } diff --git a/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/davecgh/go-spew/spew/doc.go index 722e9aa7..aacaac6f 100644 --- a/vendor/github.com/davecgh/go-spew/spew/doc.go +++ b/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -21,36 +21,35 @@ debugging. A quick overview of the additional features spew provides over the built-in printing facilities for Go data types are as follows: - - Pointers are dereferenced and followed - - Circular data structures are detected and handled properly - - Custom Stringer/error interfaces are optionally invoked, including - on unexported types - - Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - - Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output (only when using - Dump style) + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) There are two different approaches spew allows for dumping Go data structures: - - Dump style which prints with newlines, customizable indentation, - and additional debug information such as types and all pointer addresses - used to indirect to the final value - - A custom Formatter interface that integrates cleanly with the standard fmt - package and replaces %v, %+v, %#v, and %#+v to provide inline printing - similar to the default %v while providing the additional functionality - outlined above and passing unsupported format verbs such as %x and %q - along to fmt + * Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + * A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt -# Quick Start +Quick Start This section demonstrates how to quickly get started with spew. See the sections below for further details on formatting and configuration options. To dump a variable with full newlines, indentation, type, and pointer information use Dump, Fdump, or Sdump: - spew.Dump(myVar1, myVar2, ...) spew.Fdump(someWriter, myVar1, myVar2, ...) str := spew.Sdump(myVar1, myVar2, ...) @@ -59,13 +58,12 @@ Alternatively, if you would prefer to use format strings with a compacted inline printing style, use the convenience wrappers Printf, Fprintf, etc with %v (most compact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types and pointer addresses): - spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) -# Configuration Options +Configuration Options Configuration of spew is handled by fields in the ConfigState type. For convenience, all of the top-level functions use a global state available @@ -76,52 +74,51 @@ equivalent to the top-level functions. This allows concurrent configuration options. See the ConfigState documentation for more details. The following configuration options are available: - - - Indent - String to use for each indentation level for Dump functions. - It is a single space by default. A popular alternative is "\t". - - - MaxDepth - Maximum number of levels to descend into nested data structures. - There is no limit by default. - - - DisableMethods - Disables invocation of error and Stringer interface methods. - Method invocation is enabled by default. - - - DisablePointerMethods - Disables invocation of error and Stringer interface methods on types - which only accept pointer receivers from non-pointer variables. - Pointer method invocation is enabled by default. - - - DisablePointerAddresses - DisablePointerAddresses specifies whether to disable the printing of - pointer addresses. This is useful when diffing data structures in tests. - - - DisableCapacities - DisableCapacities specifies whether to disable the printing of - capacities for arrays, slices, maps and channels. This is useful when - diffing data structures in tests. - - - ContinueOnMethod - Enables recursion into types after invoking error and Stringer interface - methods. Recursion after method invocation is disabled by default. - - - SortKeys - Specifies map keys should be sorted before being printed. Use - this to have a more deterministic, diffable output. Note that - only native types (bool, int, uint, floats, uintptr and string) - and types which implement error or Stringer interfaces are - supported with other types sorted according to the - reflect.Value.String() output which guarantees display - stability. Natural map order is used by default. - - - SpewKeys - Specifies that, as a last resort attempt, map keys should be - spewed to strings and sorted by those strings. This is only - considered if SortKeys is true. - -# Dump Usage + * Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + + * MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + + * DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + + * DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. + + * DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + + * DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. + + * ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + + * SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. + + * SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. + +Dump Usage Simply call spew.Dump with a list of variables you want to dump: @@ -136,7 +133,7 @@ A third option is to call spew.Sdump to get the formatted output as a string: str := spew.Sdump(myVar1, myVar2, ...) -# Sample Dump Output +Sample Dump Output See the Dump example for details on the setup of the types and variables being shown here. @@ -153,14 +150,13 @@ shown here. Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C command as shown. - ([]uint8) (len=32 cap=32) { 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| 00000020 31 32 |12| } -# Custom Formatter +Custom Formatter Spew provides a custom formatter that implements the fmt.Formatter interface so that it integrates cleanly with standard fmt package printing functions. The @@ -174,7 +170,7 @@ standard fmt package for formatting. In addition, the custom formatter ignores the width and precision arguments (however they will still work on the format specifiers not handled by the custom formatter). -# Custom Formatter Usage +Custom Formatter Usage The simplest way to make use of the spew custom formatter is to call one of the convenience functions such as spew.Printf, spew.Println, or spew.Printf. The @@ -188,17 +184,15 @@ functions have syntax you are most likely already familiar with: See the Index for the full list convenience functions. -# Sample Formatter Output +Sample Formatter Output Double pointer to a uint8: - %v: <**>5 %+v: <**>(0xf8400420d0->0xf8400420c8)5 %#v: (**uint8)5 %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 Pointer to circular struct with a uint8 field and a pointer to itself: - %v: <*>{1 <*>} %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} @@ -207,7 +201,7 @@ Pointer to circular struct with a uint8 field and a pointer to itself: See the Printf example for details on the setup of variables being shown here. -# Errors +Errors Since it is possible for custom Stringer/error interfaces to panic, spew detects them and handles them internally by printing the panic information diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go index 8323041a..f78d89fc 100644 --- a/vendor/github.com/davecgh/go-spew/spew/dump.go +++ b/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -488,15 +488,15 @@ pointer addresses used to indirect to the final value. It provides the following features over the built-in printing facilities provided by the fmt package: - - Pointers are dereferenced and followed - - Circular data structures are detected and handled properly - - Custom Stringer/error interfaces are optionally invoked, including - on unexported types - - Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - - Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output The configuration options are controlled by an exported package global, spew.Config. See ConfigState for options documentation. diff --git a/vendor/github.com/docker/cli/AUTHORS b/vendor/github.com/docker/cli/AUTHORS index 483743c9..d6d23b3d 100644 --- a/vendor/github.com/docker/cli/AUTHORS +++ b/vendor/github.com/docker/cli/AUTHORS @@ -2,6 +2,7 @@ # This file lists all contributors to the repository. # See scripts/docs/generate-authors.sh to make modifications. +A. Lester Buck III Aanand Prasad Aaron L. Xu Aaron Lehmann @@ -16,6 +17,7 @@ Adolfo Ochagavía Adrian Plata Adrien Duermael Adrien Folie +Adyanth Hosavalike Ahmet Alp Balkan Aidan Feldman Aidan Hobson Sayers @@ -26,7 +28,7 @@ Akim Demaille Alan Thompson Albert Callarisa Alberto Roura -Albin Kerouanton +Albin Kerouanton Aleksa Sarai Aleksander Piotrowski Alessandro Boch @@ -34,6 +36,7 @@ Alex Couture-Beil Alex Mavrogiannis Alex Mayer Alexander Boyd +Alexander Chneerov Alexander Larsson Alexander Morozov Alexander Ryabov @@ -41,6 +44,7 @@ Alexandre González Alexey Igrychev Alexis Couvreur Alfred Landrum +Ali Rostami Alicia Lauerman Allen Sun Alvin Deng @@ -79,7 +83,9 @@ Arko Dasgupta Arnaud Porterie Arnaud Rebillout Arthur Peka +Ashly Mathew Ashwini Oruganti +Aslam Ahemad Azat Khuyiyakhmetov Bardia Keyoumarsi Barnaby Gray @@ -98,7 +104,9 @@ Bill Wang Bin Liu Bingshen Wang Bishal Das +Bjorn Neergaard Boaz Shuster +Boban Acimovic Bogdan Anton Boris Pruessmann Brad Baker @@ -109,6 +117,7 @@ Brent Salisbury Bret Fisher Brian (bex) Exelbierd Brian Goff +Brian Tracy Brian Wieder Bruno Sousa Bryan Bess @@ -136,6 +145,7 @@ Chen Chuanliang Chen Hanxiao Chen Mingjie Chen Qiu +Chris Chinchilla Chris Couzens Chris Gavin Chris Gibson @@ -163,6 +173,8 @@ Conner Crosby Corey Farrell Corey Quon Cory Bennet +Cory Snider +Craig Osterhout Craig Wilhite Cristian Staretu Daehyeok Mun @@ -171,6 +183,7 @@ Daisuke Ito dalanlan Damien Nadé Dan Cotora +Danial Gharib Daniel Artine Daniel Cassidy Daniel Dao @@ -210,6 +223,7 @@ Denis Defreyne Denis Gladkikh Denis Ollier Dennis Docter +dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Derek McGowan Des Preston Deshi Xiao @@ -232,11 +246,13 @@ DongGeon Lee Doug Davis Drew Erny Ed Costello +Ed Morley <501702+edmorley@users.noreply.github.com> Elango Sivanandam Eli Uriegas Eli Uriegas Elias Faxö Elliot Luo <956941328@qq.com> +Eric Bode Eric Curtin Eric Engestrom Eric G. Noriega @@ -254,6 +270,7 @@ Eugene Yakubovich Evan Allrich Evan Hazlett Evan Krall +Evan Lezar Evelyn Xu Everett Toews Fabio Falci @@ -275,6 +292,7 @@ Frederik Nordahl Jul Sabroe Frieder Bluemle Gabriel Gore Gabriel Nicolas Avellaneda +Gabriela Georgieva Gaetan de Villele Gang Qiao Gary Schaetz @@ -288,6 +306,7 @@ Gleb Stsenov Goksu Toprak Gou Rao Govind Rai +Graeme Wiebe Grant Reaber Greg Pflaum Gsealy @@ -311,6 +330,7 @@ Hernan Garcia Hongbin Lu Hu Keping Huayi Zhang +Hugo Chastel Hugo Gabriel Eyherabide huqun Huu Nguyen @@ -329,9 +349,12 @@ Ivan Grund Ivan Markin Jacob Atzen Jacob Tomlinson +Jacopo Rigoli Jaivish Kothari Jake Lambert Jake Sanders +Jake Stokes +Jakub Panek James Nesbitt James Turnbull Jamie Hannaford @@ -408,10 +431,12 @@ Josh Chorlton Josh Hawn Josh Horwitz Josh Soref +Julian Julien Barbier Julien Kassar Julien Maitrehenry Justas Brazauskas +Justin Chadwell Justin Cormack Justin Simonelis Justyn Temme @@ -434,7 +459,7 @@ Kelton Bassingthwaite Ken Cochrane Ken ICHIKAWA Kenfe-Mickaël Laventure -Kevin Alvarez +Kevin Alvarez Kevin Burke Kevin Feyrer Kevin Kern @@ -454,6 +479,7 @@ Kyle Mitofsky Lachlan Cooper Lai Jiangshan Lars Kellogg-Stedman +Laura Brehm Laura Frank Laurent Erignoux Lee Gaines @@ -462,10 +488,10 @@ Lennie Leo Gallucci Leonid Skorospelov Lewis Daly +Li Fu Bang Li Yi Li Yi Liang-Chi Hsieh -Lifubang Lihua Tang Lily Guo Lin Lu @@ -480,6 +506,7 @@ Louis Opter Luca Favatella Luca Marturana Lucas Chan +Luis Henrique Mulinari Luka Hartwig Lukas Heeren Lukasz Zajaczkowski @@ -498,6 +525,7 @@ mapk0y Marc Bihlmaier Marc Cornellà Marco Mariani +Marco Spiess Marco Vedovati Marcus Martins Marianna Tessel @@ -522,6 +550,7 @@ Max Shytikov Maxime Petazzoni Maximillian Fan Xavier Mei ChunTao +Melroy van den Berg Metal <2466052+tedhexaflow@users.noreply.github.com> Micah Zoltu Michael A. Smith @@ -593,6 +622,7 @@ Nishant Totla NIWA Hideyuki Noah Treuhaft O.S. Tezer +Oded Arbel Odin Ugedal ohmystack OKA Naoya @@ -604,19 +634,21 @@ Otto Kekäläinen Ovidio Mallo Pascal Borreli Patrick Böänziger +Patrick Daigle <114765035+pdaig@users.noreply.github.com> Patrick Hemmer Patrick Lang Paul Paul Kehrer Paul Lietar Paul Mulders +Paul Seyfert Paul Weaver Pavel Pospisil PaweÅ‚ Gronowski PaweÅ‚ Pokrywka PaweÅ‚ Szczekutowicz Peeyush Gupta -Per Lundberg +Per Lundberg Peter Dave Hello Peter Edge Peter Hsu @@ -639,6 +671,7 @@ Preston Cowley Pure White Qiang Huang Qinglan Peng +QQå–µ qudongfang Raghavendra K T Rahul Kadyan @@ -657,6 +690,7 @@ Rick Wieman Ritesh H Shukla Riyaz Faizullabhoy Rob Gulewich +Rob Murray Robert Wallis Robin Naundorf Robin Speekenbrink @@ -689,6 +723,7 @@ Sandro Jäckel Santhosh Manohar Sargun Dhillon Saswat Bhattacharya +Saurabh Kumar Scott Brenner Scott Collier Sean Christopherson @@ -788,6 +823,7 @@ uhayate Ulrich Bareth Ulysses Souza Umesh Yadav +Vaclav Struhar Valentin Lorentz Vardan Pogosian Venkateswara Reddy Bukkasamudram @@ -795,6 +831,7 @@ Veres Lajos Victor Vieux Victoria Bialas Viktor Stanchev +Ville Skyttä Vimal Raghubir Vincent Batts Vincent Bernat @@ -831,6 +868,7 @@ Yong Tang Yosef Fertel Yu Peng Yuan Sun +Yucheng Wu Yue Zhang Yunxiang Huang Zachary Romero diff --git a/vendor/github.com/docker/cli/cli/config/config.go b/vendor/github.com/docker/cli/cli/config/config.go index b7c05c3f..952f6e71 100644 --- a/vendor/github.com/docker/cli/cli/config/config.go +++ b/vendor/github.com/docker/cli/cli/config/config.go @@ -16,32 +16,25 @@ import ( ) const ( - // ConfigFileName is the name of config file + // EnvOverrideConfigDir is the name of the environment variable that can be + // used to override the location of the client configuration files (~/.docker). + // + // It takes priority over the default, but can be overridden by the "--config" + // command line option. + EnvOverrideConfigDir = "DOCKER_CONFIG" + + // ConfigFileName is the name of the client configuration file inside the + // config-directory. ConfigFileName = "config.json" configFileDir = ".docker" - oldConfigfile = ".dockercfg" // Deprecated: remove once we stop printing deprecation warning contextsDir = "contexts" ) var ( initConfigDir = new(sync.Once) configDir string - homeDir string ) -// resetHomeDir is used in testing to reset the "homeDir" package variable to -// force re-lookup of the home directory between tests. -func resetHomeDir() { - homeDir = "" -} - -func getHomeDir() string { - if homeDir == "" { - homeDir = homedir.Get() - } - return homeDir -} - // resetConfigDir is used in testing to reset the "configDir" package variable // and its sync.Once to force re-lookup between tests. func resetConfigDir() { @@ -49,19 +42,14 @@ func resetConfigDir() { initConfigDir = new(sync.Once) } -func setConfigDir() { - if configDir != "" { - return - } - configDir = os.Getenv("DOCKER_CONFIG") - if configDir == "" { - configDir = filepath.Join(getHomeDir(), configFileDir) - } -} - // Dir returns the directory the configuration file is stored in func Dir() string { - initConfigDir.Do(setConfigDir) + initConfigDir.Do(func() { + configDir = os.Getenv(EnvOverrideConfigDir) + if configDir == "" { + configDir = filepath.Join(homedir.Get(), configFileDir) + } + }) return configDir } @@ -72,6 +60,8 @@ func ContextStoreDir() string { // SetDir sets the directory the configuration file is stored in func SetDir(dir string) { + // trigger the sync.Once to synchronise with Dir() + initConfigDir.Do(func() {}) configDir = filepath.Clean(dir) } @@ -96,55 +86,43 @@ func LoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) { // Load reads the configuration files in the given directory, and sets up // the auth config information and returns values. -// FIXME: use the internal golang config parser func Load(configDir string) (*configfile.ConfigFile, error) { - cfg, _, err := load(configDir) - return cfg, err -} - -// TODO remove this temporary hack, which is used to warn about the deprecated ~/.dockercfg file -// so we can remove the bool return value and collapse this back into `Load` -func load(configDir string) (*configfile.ConfigFile, bool, error) { - printLegacyFileWarning := false - if configDir == "" { configDir = Dir() } + return load(configDir) +} +func load(configDir string) (*configfile.ConfigFile, error) { filename := filepath.Join(configDir, ConfigFileName) configFile := configfile.New(filename) - // Try happy path first - latest config file - if file, err := os.Open(filename); err == nil { - defer file.Close() - err = configFile.LoadFromReader(file) - if err != nil { - err = errors.Wrap(err, filename) + file, err := os.Open(filename) + if err != nil { + if os.IsNotExist(err) { + // + // if file is there but we can't stat it for any reason other + // than it doesn't exist then stop + return configFile, nil } - return configFile, printLegacyFileWarning, err - } else if !os.IsNotExist(err) { // if file is there but we can't stat it for any reason other // than it doesn't exist then stop - return configFile, printLegacyFileWarning, errors.Wrap(err, filename) + return configFile, nil } - - // Can't find latest config file so check for the old one - filename = filepath.Join(getHomeDir(), oldConfigfile) - if _, err := os.Stat(filename); err == nil { - printLegacyFileWarning = true + defer file.Close() + err = configFile.LoadFromReader(file) + if err != nil { + err = errors.Wrap(err, filename) } - return configFile, printLegacyFileWarning, nil + return configFile, err } // LoadDefaultConfigFile attempts to load the default config file and returns // an initialized ConfigFile struct if none is found. func LoadDefaultConfigFile(stderr io.Writer) *configfile.ConfigFile { - configFile, printLegacyFileWarning, err := load(Dir()) + configFile, err := load(Dir()) if err != nil { - fmt.Fprintf(stderr, "WARNING: Error loading config file: %v\n", err) - } - if printLegacyFileWarning { - _, _ = fmt.Fprintln(stderr, "WARNING: Support for the legacy ~/.dockercfg configuration file and file-format has been removed and the configuration file will be ignored") + _, _ = fmt.Fprintf(stderr, "WARNING: Error loading config file: %v\n", err) } if !configFile.ContainsAuth() { configFile.CredentialsStore = credentials.DetectDefaultStore(configFile.CredentialsStore) diff --git a/vendor/github.com/docker/cli/cli/config/configfile/file_unix.go b/vendor/github.com/docker/cli/cli/config/configfile/file_unix.go index 35388754..06b811e7 100644 --- a/vendor/github.com/docker/cli/cli/config/configfile/file_unix.go +++ b/vendor/github.com/docker/cli/cli/config/configfile/file_unix.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows package configfile diff --git a/vendor/github.com/docker/cli/cli/config/credentials/default_store.go b/vendor/github.com/docker/cli/cli/config/credentials/default_store.go index 402235bf..a36afc41 100644 --- a/vendor/github.com/docker/cli/cli/config/credentials/default_store.go +++ b/vendor/github.com/docker/cli/cli/config/credentials/default_store.go @@ -1,21 +1,22 @@ package credentials -import ( - exec "golang.org/x/sys/execabs" -) +import "os/exec" // DetectDefaultStore return the default credentials store for the platform if -// the store executable is available. +// no user-defined store is passed, and the store executable is available. func DetectDefaultStore(store string) string { - platformDefault := defaultCredentialsStore() - - // user defined or no default for platform - if store != "" || platformDefault == "" { + if store != "" { + // use user-defined return store } - if _, err := exec.LookPath(remoteCredentialsPrefix + platformDefault); err == nil { - return platformDefault + platformDefault := defaultCredentialsStore() + if platformDefault == "" { + return "" + } + + if _, err := exec.LookPath(remoteCredentialsPrefix + platformDefault); err != nil { + return "" } - return "" + return platformDefault } diff --git a/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.go b/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.go index c9630ea5..40c16eb8 100644 --- a/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.go +++ b/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.go @@ -1,5 +1,4 @@ //go:build !windows && !darwin && !linux -// +build !windows,!darwin,!linux package credentials diff --git a/vendor/github.com/docker/cli/cli/config/credentials/native_store.go b/vendor/github.com/docker/cli/cli/config/credentials/native_store.go index f9619b03..b9af145b 100644 --- a/vendor/github.com/docker/cli/cli/config/credentials/native_store.go +++ b/vendor/github.com/docker/cli/cli/config/credentials/native_store.go @@ -51,6 +51,7 @@ func (c *nativeStore) Get(serverAddress string) (types.AuthConfig, error) { auth.Username = creds.Username auth.IdentityToken = creds.IdentityToken auth.Password = creds.Password + auth.ServerAddress = creds.ServerAddress return auth, nil } @@ -76,6 +77,9 @@ func (c *nativeStore) GetAll() (map[string]types.AuthConfig, error) { ac.Username = creds.Username ac.Password = creds.Password ac.IdentityToken = creds.IdentityToken + if ac.ServerAddress == "" { + ac.ServerAddress = creds.ServerAddress + } authConfigs[registry] = ac } diff --git a/vendor/github.com/docker/distribution/reference/helpers_deprecated.go b/vendor/github.com/docker/distribution/reference/helpers_deprecated.go deleted file mode 100644 index cbd11925..00000000 --- a/vendor/github.com/docker/distribution/reference/helpers_deprecated.go +++ /dev/null @@ -1,34 +0,0 @@ -package reference - -import "github.com/distribution/reference" - -// IsNameOnly returns true if reference only contains a repo name. -// -// Deprecated: use [reference.IsNameOnly]. -func IsNameOnly(ref reference.Named) bool { - return reference.IsNameOnly(ref) -} - -// FamiliarName returns the familiar name string -// for the given named, familiarizing if needed. -// -// Deprecated: use [reference.FamiliarName]. -func FamiliarName(ref reference.Named) string { - return reference.FamiliarName(ref) -} - -// FamiliarString returns the familiar string representation -// for the given reference, familiarizing if needed. -// -// Deprecated: use [reference.FamiliarString]. -func FamiliarString(ref reference.Reference) string { - return reference.FamiliarString(ref) -} - -// FamiliarMatch reports whether ref matches the specified pattern. -// See [path.Match] for supported patterns. -// -// Deprecated: use [reference.FamiliarMatch]. -func FamiliarMatch(pattern string, ref reference.Reference) (bool, error) { - return reference.FamiliarMatch(pattern, ref) -} diff --git a/vendor/github.com/docker/distribution/reference/normalize_deprecated.go b/vendor/github.com/docker/distribution/reference/normalize_deprecated.go deleted file mode 100644 index 1b4a459d..00000000 --- a/vendor/github.com/docker/distribution/reference/normalize_deprecated.go +++ /dev/null @@ -1,92 +0,0 @@ -package reference - -import ( - "regexp" - - "github.com/distribution/reference" - "github.com/opencontainers/go-digest" - "github.com/opencontainers/go-digest/digestset" -) - -// ParseNormalizedNamed parses a string into a named reference -// transforming a familiar name from Docker UI to a fully -// qualified reference. If the value may be an identifier -// use ParseAnyReference. -// -// Deprecated: use [reference.ParseNormalizedNamed]. -func ParseNormalizedNamed(s string) (reference.Named, error) { - return reference.ParseNormalizedNamed(s) -} - -// ParseDockerRef normalizes the image reference following the docker convention, -// which allows for references to contain both a tag and a digest. -// -// Deprecated: use [reference.ParseDockerRef]. -func ParseDockerRef(ref string) (reference.Named, error) { - return reference.ParseDockerRef(ref) -} - -// TagNameOnly adds the default tag "latest" to a reference if it only has -// a repo name. -// -// Deprecated: use [reference.TagNameOnly]. -func TagNameOnly(ref reference.Named) reference.Named { - return reference.TagNameOnly(ref) -} - -// ParseAnyReference parses a reference string as a possible identifier, -// full digest, or familiar name. -// -// Deprecated: use [reference.ParseAnyReference]. -func ParseAnyReference(ref string) (reference.Reference, error) { - return reference.ParseAnyReference(ref) -} - -// Functions and types below have been removed in distribution v3 and -// have not been ported to github.com/distribution/reference. See -// https://github.com/distribution/distribution/pull/3774 - -var ( - // ShortIdentifierRegexp is the format used to represent a prefix - // of an identifier. A prefix may be used to match a sha256 identifier - // within a list of trusted identifiers. - // - // Deprecated: support for short-identifiers is deprecated, and will be removed in v3. - ShortIdentifierRegexp = regexp.MustCompile(shortIdentifier) - - shortIdentifier = `([a-f0-9]{6,64})` - - // anchoredShortIdentifierRegexp is used to check if a value - // is a possible identifier prefix, anchored at start and end - // of string. - anchoredShortIdentifierRegexp = regexp.MustCompile(`^` + shortIdentifier + `$`) -) - -type digestReference digest.Digest - -func (d digestReference) String() string { - return digest.Digest(d).String() -} - -func (d digestReference) Digest() digest.Digest { - return digest.Digest(d) -} - -// ParseAnyReferenceWithSet parses a reference string as a possible short -// identifier to be matched in a digest set, a full digest, or familiar name. -// -// Deprecated: support for short-identifiers is deprecated, and will be removed in v3. -func ParseAnyReferenceWithSet(ref string, ds *digestset.Set) (Reference, error) { - if ok := anchoredShortIdentifierRegexp.MatchString(ref); ok { - dgst, err := ds.Lookup(ref) - if err == nil { - return digestReference(dgst), nil - } - } else { - if dgst, err := digest.Parse(ref); err == nil { - return digestReference(dgst), nil - } - } - - return reference.ParseNormalizedNamed(ref) -} diff --git a/vendor/github.com/docker/distribution/reference/reference_deprecated.go b/vendor/github.com/docker/distribution/reference/reference_deprecated.go deleted file mode 100644 index 5b732498..00000000 --- a/vendor/github.com/docker/distribution/reference/reference_deprecated.go +++ /dev/null @@ -1,172 +0,0 @@ -// Package reference is deprecated, and has moved to github.com/distribution/reference. -// -// Deprecated: use github.com/distribution/reference instead. -package reference - -import ( - "github.com/distribution/reference" - "github.com/opencontainers/go-digest" -) - -const ( - // NameTotalLengthMax is the maximum total number of characters in a repository name. - // - // Deprecated: use [reference.NameTotalLengthMax]. - NameTotalLengthMax = reference.NameTotalLengthMax -) - -var ( - // ErrReferenceInvalidFormat represents an error while trying to parse a string as a reference. - // - // Deprecated: use [reference.ErrReferenceInvalidFormat]. - ErrReferenceInvalidFormat = reference.ErrReferenceInvalidFormat - - // ErrTagInvalidFormat represents an error while trying to parse a string as a tag. - // - // Deprecated: use [reference.ErrTagInvalidFormat]. - ErrTagInvalidFormat = reference.ErrTagInvalidFormat - - // ErrDigestInvalidFormat represents an error while trying to parse a string as a tag. - // - // Deprecated: use [reference.ErrDigestInvalidFormat]. - ErrDigestInvalidFormat = reference.ErrDigestInvalidFormat - - // ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters. - // - // Deprecated: use [reference.ErrNameContainsUppercase]. - ErrNameContainsUppercase = reference.ErrNameContainsUppercase - - // ErrNameEmpty is returned for empty, invalid repository names. - // - // Deprecated: use [reference.ErrNameEmpty]. - ErrNameEmpty = reference.ErrNameEmpty - - // ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax. - // - // Deprecated: use [reference.ErrNameTooLong]. - ErrNameTooLong = reference.ErrNameTooLong - - // ErrNameNotCanonical is returned when a name is not canonical. - // - // Deprecated: use [reference.ErrNameNotCanonical]. - ErrNameNotCanonical = reference.ErrNameNotCanonical -) - -// Reference is an opaque object reference identifier that may include -// modifiers such as a hostname, name, tag, and digest. -// -// Deprecated: use [reference.Reference]. -type Reference = reference.Reference - -// Field provides a wrapper type for resolving correct reference types when -// working with encoding. -// -// Deprecated: use [reference.Field]. -type Field = reference.Field - -// AsField wraps a reference in a Field for encoding. -// -// Deprecated: use [reference.AsField]. -func AsField(ref reference.Reference) reference.Field { - return reference.AsField(ref) -} - -// Named is an object with a full name -// -// Deprecated: use [reference.Named]. -type Named = reference.Named - -// Tagged is an object which has a tag -// -// Deprecated: use [reference.Tagged]. -type Tagged = reference.Tagged - -// NamedTagged is an object including a name and tag. -// -// Deprecated: use [reference.NamedTagged]. -type NamedTagged reference.NamedTagged - -// Digested is an object which has a digest -// in which it can be referenced by -// -// Deprecated: use [reference.Digested]. -type Digested reference.Digested - -// Canonical reference is an object with a fully unique -// name including a name with domain and digest -// -// Deprecated: use [reference.Canonical]. -type Canonical reference.Canonical - -// Domain returns the domain part of the [Named] reference. -// -// Deprecated: use [reference.Domain]. -func Domain(named reference.Named) string { - return reference.Domain(named) -} - -// Path returns the name without the domain part of the [Named] reference. -// -// Deprecated: use [reference.Path]. -func Path(named reference.Named) (name string) { - return reference.Path(named) -} - -// SplitHostname splits a named reference into a -// hostname and name string. If no valid hostname is -// found, the hostname is empty and the full value -// is returned as name -// -// Deprecated: Use [reference.Domain] or [reference.Path]. -func SplitHostname(named reference.Named) (string, string) { - return reference.SplitHostname(named) -} - -// Parse parses s and returns a syntactically valid Reference. -// If an error was encountered it is returned, along with a nil Reference. -// -// Deprecated: use [reference.Parse]. -func Parse(s string) (reference.Reference, error) { - return reference.Parse(s) -} - -// ParseNamed parses s and returns a syntactically valid reference implementing -// the Named interface. The reference must have a name and be in the canonical -// form, otherwise an error is returned. -// If an error was encountered it is returned, along with a nil Reference. -// -// Deprecated: use [reference.ParseNamed]. -func ParseNamed(s string) (reference.Named, error) { - return reference.ParseNamed(s) -} - -// WithName returns a named object representing the given string. If the input -// is invalid ErrReferenceInvalidFormat will be returned. -// -// Deprecated: use [reference.WithName]. -func WithName(name string) (reference.Named, error) { - return reference.WithName(name) -} - -// WithTag combines the name from "name" and the tag from "tag" to form a -// reference incorporating both the name and the tag. -// -// Deprecated: use [reference.WithTag]. -func WithTag(name reference.Named, tag string) (reference.NamedTagged, error) { - return reference.WithTag(name, tag) -} - -// WithDigest combines the name from "name" and the digest from "digest" to form -// a reference incorporating both the name and the digest. -// -// Deprecated: use [reference.WithDigest]. -func WithDigest(name reference.Named, digest digest.Digest) (reference.Canonical, error) { - return reference.WithDigest(name, digest) -} - -// TrimNamed removes any tag or digest from the named reference. -// -// Deprecated: use [reference.TrimNamed]. -func TrimNamed(ref reference.Named) reference.Named { - return reference.TrimNamed(ref) -} diff --git a/vendor/github.com/docker/distribution/reference/regexp_deprecated.go b/vendor/github.com/docker/distribution/reference/regexp_deprecated.go deleted file mode 100644 index 4b9c1b58..00000000 --- a/vendor/github.com/docker/distribution/reference/regexp_deprecated.go +++ /dev/null @@ -1,50 +0,0 @@ -package reference - -import ( - "github.com/distribution/reference" -) - -// DigestRegexp matches well-formed digests, including algorithm (e.g. "sha256:"). -// -// Deprecated: use [reference.DigestRegexp]. -var DigestRegexp = reference.DigestRegexp - -// DomainRegexp matches hostname or IP-addresses, optionally including a port -// number. It defines the structure of potential domain components that may be -// part of image names. This is purposely a subset of what is allowed by DNS to -// ensure backwards compatibility with Docker image names. It may be a subset of -// DNS domain name, an IPv4 address in decimal format, or an IPv6 address between -// square brackets (excluding zone identifiers as defined by [RFC 6874] or special -// addresses such as IPv4-Mapped). -// -// Deprecated: use [reference.DomainRegexp]. -// -// [RFC 6874]: https://www.rfc-editor.org/rfc/rfc6874. -var DomainRegexp = reference.DigestRegexp - -// IdentifierRegexp is the format for string identifier used as a -// content addressable identifier using sha256. These identifiers -// are like digests without the algorithm, since sha256 is used. -// -// Deprecated: use [reference.IdentifierRegexp]. -var IdentifierRegexp = reference.IdentifierRegexp - -// NameRegexp is the format for the name component of references, including -// an optional domain and port, but without tag or digest suffix. -// -// Deprecated: use [reference.NameRegexp]. -var NameRegexp = reference.NameRegexp - -// ReferenceRegexp is the full supported format of a reference. The regexp -// is anchored and has capturing groups for name, tag, and digest -// components. -// -// Deprecated: use [reference.ReferenceRegexp]. -var ReferenceRegexp = reference.ReferenceRegexp - -// TagRegexp matches valid tag names. From [docker/docker:graph/tags.go]. -// -// Deprecated: use [reference.TagRegexp]. -// -// [docker/docker:graph/tags.go]: https://github.com/moby/moby/blob/v1.6.0/graph/tags.go#L26-L28 -var TagRegexp = reference.TagRegexp diff --git a/vendor/github.com/docker/distribution/reference/sort_deprecated.go b/vendor/github.com/docker/distribution/reference/sort_deprecated.go deleted file mode 100644 index a73251b6..00000000 --- a/vendor/github.com/docker/distribution/reference/sort_deprecated.go +++ /dev/null @@ -1,10 +0,0 @@ -package reference - -import "github.com/distribution/reference" - -// Sort sorts string references preferring higher information references. -// -// Deprecated: use [reference.Sort]. -func Sort(references []string) []string { - return reference.Sort(references) -} diff --git a/vendor/github.com/docker/docker-credential-helpers/client/client.go b/vendor/github.com/docker/docker-credential-helpers/client/client.go index 678153cf..7ca5ab72 100644 --- a/vendor/github.com/docker/docker-credential-helpers/client/client.go +++ b/vendor/github.com/docker/docker-credential-helpers/client/client.go @@ -16,11 +16,9 @@ func isValidCredsMessage(msg string) error { if credentials.IsCredentialsMissingServerURLMessage(msg) { return credentials.NewErrCredentialsMissingServerURL() } - if credentials.IsCredentialsMissingUsernameMessage(msg) { return credentials.NewErrCredentialsMissingUsername() } - return nil } @@ -36,13 +34,10 @@ func Store(program ProgramFunc, creds *credentials.Credentials) error { out, err := cmd.Output() if err != nil { - t := strings.TrimSpace(string(out)) - - if isValidErr := isValidCredsMessage(t); isValidErr != nil { + if isValidErr := isValidCredsMessage(string(out)); isValidErr != nil { err = isValidErr } - - return fmt.Errorf("error storing credentials - err: %v, out: `%s`", err, t) + return fmt.Errorf("error storing credentials - err: %v, out: `%s`", err, strings.TrimSpace(string(out))) } return nil @@ -55,17 +50,15 @@ func Get(program ProgramFunc, serverURL string) (*credentials.Credentials, error out, err := cmd.Output() if err != nil { - t := strings.TrimSpace(string(out)) - - if credentials.IsErrCredentialsNotFoundMessage(t) { + if credentials.IsErrCredentialsNotFoundMessage(string(out)) { return nil, credentials.NewErrCredentialsNotFound() } - if isValidErr := isValidCredsMessage(t); isValidErr != nil { + if isValidErr := isValidCredsMessage(string(out)); isValidErr != nil { err = isValidErr } - return nil, fmt.Errorf("error getting credentials - err: %v, out: `%s`", err, t) + return nil, fmt.Errorf("error getting credentials - err: %v, out: `%s`", err, strings.TrimSpace(string(out))) } resp := &credentials.Credentials{ diff --git a/vendor/github.com/docker/docker-credential-helpers/credentials/error.go b/vendor/github.com/docker/docker-credential-helpers/credentials/error.go index 8fa4d5d2..2283d5a4 100644 --- a/vendor/github.com/docker/docker-credential-helpers/credentials/error.go +++ b/vendor/github.com/docker/docker-credential-helpers/credentials/error.go @@ -1,6 +1,9 @@ package credentials -import "errors" +import ( + "errors" + "strings" +) const ( // ErrCredentialsNotFound standardizes the not found error, so every helper returns @@ -47,7 +50,7 @@ func IsErrCredentialsNotFound(err error) bool { // This function helps to check messages returned by an // external program via its standard output. func IsErrCredentialsNotFoundMessage(err string) bool { - return err == errCredentialsNotFoundMessage + return strings.TrimSpace(err) == errCredentialsNotFoundMessage } // errCredentialsMissingServerURL represents an error raised @@ -104,7 +107,7 @@ func IsCredentialsMissingServerURL(err error) bool { // IsCredentialsMissingServerURLMessage checks for an // errCredentialsMissingServerURL in the error message. func IsCredentialsMissingServerURLMessage(err string) bool { - return err == errCredentialsMissingServerURLMessage + return strings.TrimSpace(err) == errCredentialsMissingServerURLMessage } // IsCredentialsMissingUsername returns true if the error @@ -117,5 +120,5 @@ func IsCredentialsMissingUsername(err error) bool { // IsCredentialsMissingUsernameMessage checks for an // errCredentialsMissingUsername in the error message. func IsCredentialsMissingUsernameMessage(err string) bool { - return err == errCredentialsMissingUsernameMessage + return strings.TrimSpace(err) == errCredentialsMissingUsernameMessage } diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS index b3141819..48d04f9a 100644 --- a/vendor/github.com/docker/docker/AUTHORS +++ b/vendor/github.com/docker/docker/AUTHORS @@ -27,6 +27,7 @@ Adam Miller Adam Mills Adam Pointer Adam Singer +Adam Thornton Adam Walz Adam Williams AdamKorcz @@ -173,6 +174,7 @@ Andy Rothfusz Andy Smith Andy Wilson Andy Zhang +Aneesh Kulkarni Anes Hasicic Angel Velazquez Anil Belur @@ -236,6 +238,7 @@ Ben Golub Ben Gould Ben Hall Ben Langfeld +Ben Lovy Ben Sargent Ben Severson Ben Toews @@ -262,7 +265,7 @@ Billy Ridgway Bily Zhang Bin Liu Bingshen Wang -Bjorn Neergaard +Bjorn Neergaard Blake Geno Boaz Shuster bobby abbott @@ -279,6 +282,7 @@ Brandon Liu Brandon Philips Brandon Rhodes Brendan Dixon +Brennan Kinney <5098581+polarathene@users.noreply.github.com> Brent Salisbury Brett Higgins Brett Kochendorfer @@ -363,6 +367,7 @@ chenyuzhu Chetan Birajdar Chewey Chia-liang Kao +Chiranjeevi Tirunagari chli Cholerae Hu Chris Alfonso @@ -433,8 +438,8 @@ Cristian Staretu cristiano balducci Cristina Yenyxe Gonzalez Garcia Cruceru Calin-Cristian +cui fliter CUI Wei -cuishuang Cuong Manh Le Cyprian Gracz Cyril F @@ -513,6 +518,7 @@ David Dooling David Gageot David Gebler David Glasser +David Karlsson <35727626+dvdksn@users.noreply.github.com> David Lawrence David Lechner David M. Karr @@ -602,6 +608,7 @@ Donald Huang Dong Chen Donghwa Kim Donovan Jones +Dorin Geman Doron Podoleanu Doug Davis Doug MacEachern @@ -636,6 +643,7 @@ Emily Rose Emir Ozer Eng Zer Jun Enguerran +Enrico Weigelt, metux IT consult Eohyung Lee epeterso er0k @@ -676,6 +684,7 @@ Evan Allrich Evan Carmi Evan Hazlett Evan Krall +Evan Lezar Evan Phoenix Evan Wies Evelyn Xu @@ -744,6 +753,7 @@ Frank Groeneveld Frank Herrmann Frank Macreery Frank Rosquin +Frank Villaro-Dixon Frank Yang Fred Lifton Frederick F. Kautz IV @@ -983,6 +993,7 @@ Jean Rouge Jean-Baptiste Barth Jean-Baptiste Dalido Jean-Christophe Berthon +Jean-Michel Rouet Jean-Paul Calderone Jean-Pierre Huynh Jean-Tiare Le Bigot @@ -1013,6 +1024,7 @@ Jeroen Jacobs Jesse Dearing Jesse Dubay Jessica Frazelle +Jeyanthinath Muthuram Jezeniel Zapanta Jhon Honce Ji.Zhilong @@ -1141,6 +1153,7 @@ junxu Jussi Nummelin Justas Brazauskas Justen Martin +Justin Chadwell Justin Cormack Justin Force Justin Keller <85903732+jk-vb@users.noreply.github.com> @@ -1183,6 +1196,7 @@ Ke Xu Kei Ohmura Keith Hudgins Keli Hu +Ken Bannister Ken Cochrane Ken Herner Ken ICHIKAWA @@ -1192,7 +1206,7 @@ Kenjiro Nakayama Kent Johnson Kenta Tada Kevin "qwazerty" Houdebert -Kevin Alvarez +Kevin Alvarez Kevin Burke Kevin Clark Kevin Feyrer @@ -1225,6 +1239,7 @@ Konstantin Gribov Konstantin L Konstantin Pelykh Kostadin Plachkov +kpcyrd Krasi Georgiev Krasimir Georgiev Kris-Mikael Krister @@ -1306,6 +1321,7 @@ Lorenzo Fontana Lotus Fenn Louis Delossantos Louis Opter +Luboslav Pivarc Luca Favatella Luca Marturana Luca Orlandi @@ -1344,6 +1360,7 @@ Manuel Meurer Manuel Rüger Manuel Woelker mapk0y +Marat Radchenko Marc Abramowitz Marc Kuo Marc Tamsky @@ -1383,6 +1400,7 @@ Martijn van Oosterhout Martin Braun Martin Dojcak Martin Honermeyer +Martin Jirku Martin Kelly Martin Mosegaard Amdisen Martin Muzatko @@ -1461,6 +1479,7 @@ Michael Holzheu Michael Hudson-Doyle Michael Huettermann Michael Irwin +Michael Kebe Michael Kuehn Michael Käufl Michael Neale @@ -1509,10 +1528,11 @@ Mike Lundy Mike MacCana Mike Naberezny Mike Snitzer +Mike Sul mikelinjie <294893458@qq.com> Mikhail Sobolev Miklos Szegedi -Milas Bowman +Milas Bowman Milind Chawre Miloslav TrmaÄ mingqing @@ -1524,6 +1544,7 @@ mlarcher Mohammad Banikazemi Mohammad Nasirifar Mohammed Aaqib Ansari +Mohd Sadiq Mohit Soni Moorthy RS Morgan Bauer @@ -1606,6 +1627,7 @@ Noah Treuhaft NobodyOnSE noducks Nolan Darilek +Nolan Miles Noriki Nakamura nponeccop Nurahmadie @@ -1661,6 +1683,7 @@ Paul Lietar Paul Liljenberg Paul Morie Paul Nasrat +Paul Seiffert Paul Weaver Paulo Gomes Paulo Ribeiro @@ -1674,6 +1697,7 @@ Pavlos Ratis Pavol Vargovcik Pawel Konczalski PaweÅ‚ Gronowski +payall4u Peeyush Gupta Peggy Li Pei Su @@ -1703,7 +1727,9 @@ Phil Estes Phil Sphicas Phil Spitler Philip Alexander Etling +Philip K. Warren Philip Monroe +Philipp Fruck Philipp Gillé Philipp Wahala Philipp Weissensteiner @@ -1741,6 +1767,7 @@ Quentin Brossard Quentin Perez Quentin Tayssier r0n22 +Rachit Sharma Radostin Stoyanov Rafal Jeczalik Rafe Colton @@ -1773,6 +1800,7 @@ Rich Horwood Rich Moyse Rich Seymour Richard Burnison +Richard Hansen Richard Harvey Richard Mathie Richard Metzler @@ -1788,6 +1816,7 @@ Ritesh H Shukla Riyaz Faizullabhoy Rob Cowsill <42620235+rcowsill@users.noreply.github.com> Rob Gulewich +Rob Murray Rob Vesse Robert Bachmann Robert Bittle @@ -1869,6 +1898,7 @@ ryancooper7 RyanDeng Ryo Nakao Ryoga Saito +Régis Behmo Rémy Greinhofer s. rannou Sabin Basyal @@ -1885,6 +1915,7 @@ Sam J Sharpe Sam Neirinck Sam Reis Sam Rijs +Sam Thibault Sam Whited Sambuddha Basu Sami Wagiaalla @@ -1908,6 +1939,7 @@ Satoshi Tagomori Scott Bessler Scott Collier Scott Johnston +Scott Moser Scott Percival Scott Stamp Scott Walls @@ -1923,6 +1955,7 @@ Sebastiaan van Steenis Sebastiaan van Stijn Sebastian Höffner Sebastian Radloff +Sebastian Thomschke Sebastien Goasguen Senthil Kumar Selvaraj Senthil Kumaran @@ -1996,6 +2029,7 @@ Stanislav Bondarenko Stanislav Levin Steeve Morin Stefan Berger +Stefan Gehrig Stefan J. Wernli Stefan Praszalowicz Stefan S. @@ -2003,6 +2037,7 @@ Stefan Scherer Stefan Staudenmeyer Stefan Weil Steffen Butzer +Stephan Henningsen Stephan Spindler Stephen Benjamin Stephen Crosby @@ -2204,6 +2239,7 @@ Vinod Kulkarni Vishal Doshi Vishnu Kannan Vitaly Ostrosablin +Vitor Anjos Vitor Monteiro Vivek Agarwal Vivek Dasgupta @@ -2250,6 +2286,7 @@ Wenxuan Zhao Wenyu You <21551128@zju.edu.cn> Wenzhi Liang Wes Morgan +Wesley Pettit Wewang Xiaorenfine Wiktor Kwapisiewicz Will Dietz @@ -2289,7 +2326,7 @@ xiekeyang Ximo Guanter Gonzálbez xin.li Xinbo Weng -Xinfeng Liu +Xinfeng Liu Xinzi Zhou Xiuming Chen Xuecong Liao @@ -2355,6 +2392,7 @@ Zen Lin(Zhinan Lin) Zhang Kun Zhang Wei Zhang Wentao +zhangguanzhang ZhangHang zhangxianwei Zhenan Ye <21551168@zju.edu.cn> @@ -2381,6 +2419,7 @@ Zuhayr Elahi Zunayed Ali Ãlvaro Lázaro Ãtila Camurça Alves +å´å°ç™½ <296015668@qq.com> å°¹å‰å³° å±ˆéª å¾ä¿Šæ° diff --git a/vendor/github.com/docker/docker/api/README.md b/vendor/github.com/docker/docker/api/README.md index f136c343..381f1988 100644 --- a/vendor/github.com/docker/docker/api/README.md +++ b/vendor/github.com/docker/docker/api/README.md @@ -37,6 +37,6 @@ There is hopefully enough example material in the file for you to copy a similar When you make edits to `swagger.yaml`, you may want to check the generated API documentation to ensure it renders correctly. -Run `make swagger-docs` and a preview will be running at `http://localhost`. Some of the styling may be incorrect, but you'll be able to ensure that it is generating the correct documentation. +Run `make swagger-docs` and a preview will be running at `http://localhost:9000`. Some of the styling may be incorrect, but you'll be able to ensure that it is generating the correct documentation. The production documentation is generated by vendoring `swagger.yaml` into [docker/docker.github.io](https://github.com/docker/docker.github.io). diff --git a/vendor/github.com/docker/docker/api/common.go b/vendor/github.com/docker/docker/api/common.go index cba66bc4..b11c2fe0 100644 --- a/vendor/github.com/docker/docker/api/common.go +++ b/vendor/github.com/docker/docker/api/common.go @@ -2,8 +2,17 @@ package api // import "github.com/docker/docker/api" // Common constants for daemon and client. const ( - // DefaultVersion of Current REST API - DefaultVersion = "1.43" + // DefaultVersion of the current REST API. + DefaultVersion = "1.45" + + // MinSupportedAPIVersion is the minimum API version that can be supported + // by the API server, specified as "major.minor". Note that the daemon + // may be configured with a different minimum API version, as returned + // in [github.com/docker/docker/api/types.Version.MinAPIVersion]. + // + // API requests for API versions lower than the configured version produce + // an error. + MinSupportedAPIVersion = "1.24" // NoBaseImageSpecifier is the symbol used by the FROM // command to specify that no base image is to be used. diff --git a/vendor/github.com/docker/docker/api/common_unix.go b/vendor/github.com/docker/docker/api/common_unix.go deleted file mode 100644 index 19fc63d6..00000000 --- a/vendor/github.com/docker/docker/api/common_unix.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build !windows -// +build !windows - -package api // import "github.com/docker/docker/api" - -// MinVersion represents Minimum REST API version supported -const MinVersion = "1.12" diff --git a/vendor/github.com/docker/docker/api/common_windows.go b/vendor/github.com/docker/docker/api/common_windows.go deleted file mode 100644 index 590ba547..00000000 --- a/vendor/github.com/docker/docker/api/common_windows.go +++ /dev/null @@ -1,8 +0,0 @@ -package api // import "github.com/docker/docker/api" - -// MinVersion represents Minimum REST API version supported -// Technically the first daemon API version released on Windows is v1.25 in -// engine version 1.13. However, some clients are explicitly using downlevel -// APIs (e.g. docker-compose v2.1 file format) and that is just too restrictive. -// Hence also allowing 1.24 on Windows. -const MinVersion string = "1.24" diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml index 7635b9f6..5677340d 100644 --- a/vendor/github.com/docker/docker/api/swagger.yaml +++ b/vendor/github.com/docker/docker/api/swagger.yaml @@ -19,10 +19,10 @@ produces: consumes: - "application/json" - "text/plain" -basePath: "/v1.43" +basePath: "/v1.45" info: title: "Docker Engine API" - version: "1.43" + version: "1.45" x-logo: url: "https://docs.docker.com/assets/images/logo-docker-main.png" description: | @@ -55,8 +55,8 @@ info: the URL is not supported by the daemon, a HTTP `400 Bad Request` error message is returned. - If you omit the version-prefix, the current version of the API (v1.43) is used. - For example, calling `/info` is the same as calling `/v1.43/info`. Using the + If you omit the version-prefix, the current version of the API (v1.45) is used. + For example, calling `/info` is the same as calling `/v1.45/info`. Using the API without a version-prefix is deprecated and will be removed in a future release. Engine releases in the near future should support this version of the API, @@ -388,6 +388,20 @@ definitions: description: "Create mount point on host if missing" type: "boolean" default: false + ReadOnlyNonRecursive: + description: | + Make the mount non-recursively read-only, but still leave the mount recursive + (unless NonRecursive is set to `true` in conjunction). + + Addded in v1.44, before that version all read-only mounts were + non-recursive by default. To match the previous behaviour this + will default to `true` for clients on versions prior to v1.44. + type: "boolean" + default: false + ReadOnlyForceRecursive: + description: "Raise an error if the mount cannot be made recursively read-only." + type: "boolean" + default: false VolumeOptions: description: "Optional configuration for the `volume` type." type: "object" @@ -413,6 +427,10 @@ definitions: type: "object" additionalProperties: type: "string" + Subpath: + description: "Source path inside the volume. Must be relative without any back traversals." + type: "string" + example: "dir-inside-volume/subdirectory" TmpfsOptions: description: "Optional configuration for the `tmpfs` type." type: "object" @@ -794,6 +812,12 @@ definitions: 1000000 (1 ms). 0 means inherit. type: "integer" format: "int64" + StartInterval: + description: | + The time to wait between checks in nanoseconds during the start period. + It should be 0 or at least 1000000 (1 ms). 0 means inherit. + type: "integer" + format: "int64" Health: description: | @@ -1297,7 +1321,10 @@ definitions: type: "boolean" x-nullable: true MacAddress: - description: "MAC address of the container." + description: | + MAC address of the container. + + Deprecated: this field is deprecated in API v1.44 and up. Use EndpointSettings.MacAddress instead. type: "string" x-nullable: true OnBuild: @@ -1347,16 +1374,16 @@ definitions: EndpointsConfig: description: | A mapping of network name to endpoint configuration for that network. + The endpoint configuration can be left empty to connect to that + network with no particular endpoint configuration. type: "object" additionalProperties: $ref: "#/definitions/EndpointSettings" example: # putting an example here, instead of using the example values from - # /definitions/EndpointSettings, because containers/create currently - # does not support attaching to multiple networks, so the example request - # would be confusing if it showed that multiple networks can be contained - # in the EndpointsConfig. - # TODO remove once we support multiple networks on container create (see https://github.com/moby/moby/blob/07e6b843594e061f82baa5fa23c2ff7d536c2a05/daemon/create.go#L323) + # /definitions/EndpointSettings, because EndpointSettings contains + # operational data returned when inspecting a container that we don't + # accept here. EndpointsConfig: isolated_nw: IPAMConfig: @@ -1365,19 +1392,22 @@ definitions: LinkLocalIPs: - "169.254.34.68" - "fe80::3468" + MacAddress: "02:42:ac:12:05:02" Links: - "container_1" - "container_2" Aliases: - "server_x" - "server_y" + database_nw: {} NetworkSettings: description: "NetworkSettings exposes the network settings in the API" type: "object" properties: Bridge: - description: Name of the network's bridge (for example, `docker0`). + description: | + Name of the default bridge interface when dockerd's --bridge flag is set. type: "string" example: "docker0" SandboxID: @@ -1387,34 +1417,40 @@ definitions: HairpinMode: description: | Indicates if hairpin NAT should be enabled on the virtual interface. + + Deprecated: This field is never set and will be removed in a future release. type: "boolean" example: false LinkLocalIPv6Address: - description: IPv6 unicast address using the link-local prefix. + description: | + IPv6 unicast address using the link-local prefix. + + Deprecated: This field is never set and will be removed in a future release. type: "string" - example: "fe80::42:acff:fe11:1" + example: "" LinkLocalIPv6PrefixLen: - description: Prefix length of the IPv6 unicast address. + description: | + Prefix length of the IPv6 unicast address. + + Deprecated: This field is never set and will be removed in a future release. type: "integer" - example: "64" + example: "" Ports: $ref: "#/definitions/PortMap" SandboxKey: - description: SandboxKey identifies the sandbox + description: SandboxKey is the full path of the netns handle type: "string" example: "/var/run/docker/netns/8ab54b426c38" - # TODO is SecondaryIPAddresses actually used? SecondaryIPAddresses: - description: "" + description: "Deprecated: This field is never set and will be removed in a future release." type: "array" items: $ref: "#/definitions/Address" x-nullable: true - # TODO is SecondaryIPv6Addresses actually used? SecondaryIPv6Addresses: - description: "" + description: "Deprecated: This field is never set and will be removed in a future release." type: "array" items: $ref: "#/definitions/Address" @@ -1715,18 +1751,27 @@ definitions: description: | Date and time at which the image was created, formatted in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. + + This information is only available if present in the image, + and omitted otherwise. type: "string" - x-nullable: false + format: "dateTime" + x-nullable: true example: "2022-02-04T21:20:12.497794809Z" Container: description: | The ID of the container that was used to create the image. Depending on how the image was created, this field may be empty. + + **Deprecated**: this field is kept for backward compatibility, but + will be removed in API v1.45. type: "string" - x-nullable: false example: "65974bc86f1770ae4bff79f651ebdbce166ae9aada632ee3fa9af3a264911735" ContainerConfig: + description: | + **Deprecated**: this field is kept for backward compatibility, but + will be removed in API v1.45. $ref: "#/definitions/ContainerConfig" DockerVersion: description: | @@ -1781,13 +1826,7 @@ definitions: description: | Total size of the image including all layers it is composed of. - In versions of Docker before v1.10, this field was calculated from - the image itself and all of its parent images. Images are now stored - self-contained, and no longer use a parent-chain, making this field - an equivalent of the Size field. - - > **Deprecated**: this field is kept for backward compatibility, but - > will be removed in API v1.44. + Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead. type: "integer" format: "int64" example: 1239828 @@ -1829,6 +1868,7 @@ definitions: x-nullable: true ImageSummary: type: "object" + x-go-name: "Summary" required: - Id - ParentId @@ -1925,12 +1965,7 @@ definitions: description: |- Total size of the image including all layers it is composed of. - In versions of Docker before v1.10, this field was calculated from - the image itself and all of its parent images. Images are now stored - self-contained, and no longer use a parent-chain, making this field - an equivalent of the Size field. - - Deprecated: this field is kept for backward compatibility, and will be removed in API v1.44. + Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead. type: "integer" format: "int64" example: 172064416 @@ -2448,6 +2483,11 @@ definitions: example: - "container_1" - "container_2" + MacAddress: + description: | + MAC address for the endpoint on this network. The network driver might ignore this parameter. + type: "string" + example: "02:42:ac:11:00:04" Aliases: type: "array" items: @@ -2498,11 +2538,6 @@ definitions: type: "integer" format: "int64" example: 64 - MacAddress: - description: | - MAC address for the endpoint on this network. - type: "string" - example: "02:42:ac:11:00:04" DriverOpts: description: | DriverOpts is a mapping of driver options and values. These options @@ -2514,6 +2549,21 @@ definitions: example: com.example.some-label: "some-value" com.example.some-other-label: "some-other-value" + DNSNames: + description: | + List of all DNS names an endpoint has on a specific network. This + list is based on the container name, network aliases, container short + ID, and hostname. + + These DNS names are non-fully qualified but can contain several dots. + You can get fully qualified DNS names by appending `.`. + For instance, if container name is `my.ctr` and the network is named + `testnet`, `DNSNames` will contain `my.ctr` and the FQDN will be + `my.ctr.testnet`. + type: array + items: + type: string + example: ["foobar", "server_x", "server_y", "my.ctr"] EndpointIPAMConfig: description: | @@ -3011,8 +3061,6 @@ definitions: Name: "journald" - Type: "Log" Name: "json-file" - - Type: "Log" - Name: "logentries" - Type: "Log" Name: "splunk" - Type: "Log" @@ -3547,6 +3595,32 @@ definitions: Level: type: "string" description: "SELinux level label" + Seccomp: + type: "object" + description: "Options for configuring seccomp on the container" + properties: + Mode: + type: "string" + enum: + - "default" + - "unconfined" + - "custom" + Profile: + description: "The custom seccomp profile as a json object" + type: "string" + AppArmor: + type: "object" + description: "Options for configuring AppArmor on the container" + properties: + Mode: + type: "string" + enum: + - "default" + - "disabled" + NoNewPrivileges: + type: "boolean" + description: "Configuration of the no_new_privs bit in the container" + TTY: description: "Whether a pseudo-TTY should be allocated." type: "boolean" @@ -3941,6 +4015,44 @@ definitions: - "remove" - "orphaned" + ContainerStatus: + type: "object" + description: "represents the status of a container." + properties: + ContainerID: + type: "string" + PID: + type: "integer" + ExitCode: + type: "integer" + + PortStatus: + type: "object" + description: "represents the port status of a task's host ports whose service has published host ports" + properties: + Ports: + type: "array" + items: + $ref: "#/definitions/EndpointPortConfig" + + TaskStatus: + type: "object" + description: "represents the status of a task." + properties: + Timestamp: + type: "string" + format: "dateTime" + State: + $ref: "#/definitions/TaskState" + Message: + type: "string" + Err: + type: "string" + ContainerStatus: + $ref: "#/definitions/ContainerStatus" + PortStatus: + $ref: "#/definitions/PortStatus" + Task: type: "object" properties: @@ -3976,26 +4088,7 @@ definitions: AssignedGenericResources: $ref: "#/definitions/GenericResources" Status: - type: "object" - properties: - Timestamp: - type: "string" - format: "dateTime" - State: - $ref: "#/definitions/TaskState" - Message: - type: "string" - Err: - type: "string" - ContainerStatus: - type: "object" - properties: - ContainerID: - type: "string" - PID: - type: "integer" - ExitCode: - type: "integer" + $ref: "#/definitions/TaskStatus" DesiredState: $ref: "#/definitions/TaskState" JobIteration: @@ -4211,7 +4304,10 @@ definitions: - "stop-first" - "start-first" Networks: - description: "Specifies which networks the service should attach to." + description: | + Specifies which networks the service should attach to. + + Deprecated: This field is deprecated since v1.44. The Networks field in TaskSpec should be used instead. type: "array" items: $ref: "#/definitions/NetworkAttachmentConfig" @@ -4445,6 +4541,7 @@ definitions: ImageDeleteResponseItem: type: "object" + x-go-name: "DeleteResponse" properties: Untagged: description: "The image ID of an image that was untagged" @@ -4453,6 +4550,29 @@ definitions: description: "The image ID of an image that was deleted" type: "string" + ServiceCreateResponse: + type: "object" + description: | + contains the information returned to a client on the + creation of a new service. + properties: + ID: + description: "The ID of the created service." + type: "string" + x-nullable: false + example: "ak7w3gjqoa3kuz8xcpnyy0pvl" + Warnings: + description: | + Optional warning message. + + FIXME(thaJeztah): this should have "omitempty" in the generated type. + type: "array" + x-nullable: true + items: + type: "string" + example: + - "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" + ServiceUpdateResponse: type: "object" properties: @@ -4462,7 +4582,8 @@ definitions: items: type: "string" example: - Warning: "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" + Warnings: + - "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" ContainerSummary: type: "object" @@ -5296,7 +5417,25 @@ definitions: - "WARNING: No memory limit support" - "WARNING: bridge-nf-call-iptables is disabled" - "WARNING: bridge-nf-call-ip6tables is disabled" + CDISpecDirs: + description: | + List of directories where (Container Device Interface) CDI + specifications are located. + + These specifications define vendor-specific modifications to an OCI + runtime specification for a container being created. + An empty list indicates that CDI device injection is disabled. + + Note that since using CDI device injection requires the daemon to have + experimental enabled. For non-experimental daemons an empty list will + always be returned. + type: "array" + items: + type: "string" + example: + - "/etc/cdi" + - "/var/run/cdi" # PluginsInfo is a temp struct holding Plugins name # registered with docker daemon. It is used by Info struct @@ -5334,7 +5473,7 @@ definitions: type: "array" items: type: "string" - example: ["awslogs", "fluentd", "gcplogs", "gelf", "journald", "json-file", "logentries", "splunk", "syslog"] + example: ["awslogs", "fluentd", "gcplogs", "gelf", "journald", "json-file", "splunk", "syslog"] RegistryServiceConfig: @@ -5532,6 +5671,28 @@ definitions: items: type: "string" example: ["--debug", "--systemd-cgroup=false"] + status: + description: | + Information specific to the runtime. + + While this API specification does not define data provided by runtimes, + the following well-known properties may be provided by runtimes: + + `org.opencontainers.runtime-spec.features`: features structure as defined + in the [OCI Runtime Specification](https://github.com/opencontainers/runtime-spec/blob/main/features.md), + in a JSON string representation. + +


+ + > **Note**: The information returned in this field, including the + > formatting of values and labels, should not be considered stable, + > and may change without notice. + type: "object" + x-nullable: true + additionalProperties: + type: "string" + example: + "org.opencontainers.runtime-spec.features": "{\"ociVersionMin\":\"1.0.0\",\"ociVersionMax\":\"1.1.0\",\"...\":\"...\"}" Commit: description: | @@ -6416,6 +6577,7 @@ paths: Aliases: - "server_x" - "server_y" + database_nw: {} required: true responses: @@ -6563,7 +6725,7 @@ paths: StopSignal: "SIGTERM" StopTimeout: 10 Created: "2015-01-06T15:47:31.485331387Z" - Driver: "devicemapper" + Driver: "overlay2" ExecIDs: - "b35395de42bc8abd327f9dd65d913b9ba28c74d2f0734eeeae84fa1c616a0fca" - "3fc1232e5cd20c8de182ed81178503dc6437f4e7ef12b52cc5e8de020652f1c4" @@ -7994,6 +8156,7 @@ paths: - `label=key` or `label="key=value"` of an image label - `reference`=(`[:]`) - `since`=(`[:]`, `` or ``) + - `until=` type: "string" - name: "shared-size" in: "query" @@ -8176,6 +8339,16 @@ paths: description: "BuildKit output configuration" type: "string" default: "" + - name: "version" + in: "query" + type: "string" + default: "1" + enum: ["1", "2"] + description: | + Version of the builder backend to use. + + - `1` is the first generation classic (deprecated) builder in the Docker daemon (default) + - `2` is [BuildKit](https://github.com/moby/buildkit) responses: 200: description: "no error" @@ -8245,7 +8418,7 @@ paths: /images/create: post: summary: "Create an image" - description: "Create an image by either pulling it from a registry or importing it." + description: "Pull or import an image." operationId: "ImageCreate" consumes: - "text/plain" @@ -8596,28 +8769,35 @@ paths: is_official: type: "boolean" is_automated: + description: | + Whether this repository has automated builds enabled. + +


+ + > **Deprecated**: This field is deprecated and will always be "false". type: "boolean" + example: false name: type: "string" star_count: type: "integer" examples: application/json: - - description: "" - is_official: false + - description: "A minimal Docker image based on Alpine Linux with a complete package index and only 5 MB in size!" + is_official: true is_automated: false - name: "wma55/u1210sshd" - star_count: 0 - - description: "" - is_official: false + name: "alpine" + star_count: 10093 + - description: "Busybox base image." + is_official: true is_automated: false - name: "jdswinbank/sshd" - star_count: 0 - - description: "" - is_official: false + name: "Busybox base image." + star_count: 3037 + - description: "The PostgreSQL object-relational database system provides reliability and data integrity." + is_official: true is_automated: false - name: "vgauthier/sshd" - star_count: 0 + name: "postgres" + star_count: 12408 500: description: "Server error" schema: @@ -8637,7 +8817,6 @@ paths: description: | A JSON encoded value of the filters (a `map[string][]string`) to process on the images list. Available filters: - - `is-automated=(true|false)` - `is-official=(true|false)` - `stars=` Matches images that has at least 'number' stars. type: "string" @@ -9032,7 +9211,6 @@ paths: Created: 1466724217 Size: 1092588 SharedSize: 0 - VirtualSize: 1092588 Labels: {} Containers: 1 Containers: @@ -9895,6 +10073,10 @@ paths: example: Id: "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30" Warning: "" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" 403: description: | Forbidden operation. This happens when trying to create a network named after a pre-defined network, @@ -9924,13 +10106,7 @@ paths: type: "string" CheckDuplicate: description: | - Check for networks with duplicate names. Since Network is - primarily keyed based on a random ID and not on the name, and - network name is strictly a user-friendly alias to the network - which is uniquely identified using ID, there is no guaranteed - way to check for duplicates. CheckDuplicate is there to provide - a best effort checking of any networks which has the same name - but it is not guaranteed to catch all name collisions. + Deprecated: CheckDuplicate is now always enabled. type: "boolean" Driver: description: "Name of the network driver plugin to use." @@ -9998,14 +10174,19 @@ paths: /networks/{id}/connect: post: summary: "Connect a container to a network" + description: "The network must be either a local-scoped network or a swarm-scoped network with the `attachable` option set. A network cannot be re-attached to a running container" operationId: "NetworkConnect" consumes: - "application/json" responses: 200: description: "No error" + 400: + description: "bad parameter" + schema: + $ref: "#/definitions/ErrorResponse" 403: - description: "Operation not supported for swarm scoped networks" + description: "Operation forbidden" schema: $ref: "#/definitions/ErrorResponse" 404: @@ -10040,6 +10221,7 @@ paths: IPAMConfig: IPv4Address: "172.24.56.89" IPv6Address: "2001:db8::5689" + MacAddress: "02:42:ac:12:05:02" tags: ["Network"] /networks/{id}/disconnect: @@ -11033,18 +11215,7 @@ paths: 201: description: "no error" schema: - type: "object" - title: "ServiceCreateResponse" - properties: - ID: - description: "The ID of the created service." - type: "string" - Warning: - description: "Optional warning message" - type: "string" - example: - ID: "ak7w3gjqoa3kuz8xcpnyy0pvl" - Warning: "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" + $ref: "#/definitions/ServiceCreateResponse" 400: description: "bad parameter" schema: diff --git a/vendor/github.com/docker/docker/api/types/auth.go b/vendor/github.com/docker/docker/api/types/auth.go deleted file mode 100644 index 9ee329a2..00000000 --- a/vendor/github.com/docker/docker/api/types/auth.go +++ /dev/null @@ -1,7 +0,0 @@ -package types // import "github.com/docker/docker/api/types" -import "github.com/docker/docker/api/types/registry" - -// AuthConfig contains authorization information for connecting to a Registry. -// -// Deprecated: use github.com/docker/docker/api/types/registry.AuthConfig -type AuthConfig = registry.AuthConfig diff --git a/vendor/github.com/docker/docker/api/types/checkpoint/list.go b/vendor/github.com/docker/docker/api/types/checkpoint/list.go new file mode 100644 index 00000000..94a9c0a4 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/checkpoint/list.go @@ -0,0 +1,7 @@ +package checkpoint + +// Summary represents the details of a checkpoint when listing endpoints. +type Summary struct { + // Name is the name of the checkpoint. + Name string +} diff --git a/vendor/github.com/docker/docker/api/types/checkpoint/options.go b/vendor/github.com/docker/docker/api/types/checkpoint/options.go new file mode 100644 index 00000000..9477458c --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/checkpoint/options.go @@ -0,0 +1,19 @@ +package checkpoint + +// CreateOptions holds parameters to create a checkpoint from a container. +type CreateOptions struct { + CheckpointID string + CheckpointDir string + Exit bool +} + +// ListOptions holds parameters to list checkpoints for a container. +type ListOptions struct { + CheckpointDir string +} + +// DeleteOptions holds parameters to delete a checkpoint from a container. +type DeleteOptions struct { + CheckpointID string + CheckpointDir string +} diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go index d8cd3061..882201f0 100644 --- a/vendor/github.com/docker/docker/api/types/client.go +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -11,44 +11,6 @@ import ( units "github.com/docker/go-units" ) -// CheckpointCreateOptions holds parameters to create a checkpoint from a container -type CheckpointCreateOptions struct { - CheckpointID string - CheckpointDir string - Exit bool -} - -// CheckpointListOptions holds parameters to list checkpoints for a container -type CheckpointListOptions struct { - CheckpointDir string -} - -// CheckpointDeleteOptions holds parameters to delete a checkpoint from a container -type CheckpointDeleteOptions struct { - CheckpointID string - CheckpointDir string -} - -// ContainerAttachOptions holds parameters to attach to a container. -type ContainerAttachOptions struct { - Stream bool - Stdin bool - Stdout bool - Stderr bool - DetachKeys string - Logs bool -} - -// ContainerCommitOptions holds parameters to commit changes into a container. -type ContainerCommitOptions struct { - Reference string - Comment string - Author string - Changes []string - Pause bool - Config *container.Config -} - // ContainerExecInspect holds information returned by exec inspect. type ContainerExecInspect struct { ExecID string `json:"ID"` @@ -58,42 +20,6 @@ type ContainerExecInspect struct { Pid int } -// ContainerListOptions holds parameters to list containers with. -type ContainerListOptions struct { - Size bool - All bool - Latest bool - Since string - Before string - Limit int - Filters filters.Args -} - -// ContainerLogsOptions holds parameters to filter logs with. -type ContainerLogsOptions struct { - ShowStdout bool - ShowStderr bool - Since string - Until string - Timestamps bool - Follow bool - Tail string - Details bool -} - -// ContainerRemoveOptions holds parameters to remove containers. -type ContainerRemoveOptions struct { - RemoveVolumes bool - RemoveLinks bool - Force bool -} - -// ContainerStartOptions holds parameters to start containers. -type ContainerStartOptions struct { - CheckpointID string - CheckpointDir string -} - // CopyToContainerOptions holds information // about files to copy into a container type CopyToContainerOptions struct { @@ -231,42 +157,12 @@ type ImageBuildResponse struct { OSType string } -// ImageCreateOptions holds information to create images. -type ImageCreateOptions struct { - RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry. - Platform string // Platform is the target platform of the image if it needs to be pulled from the registry. -} - // ImageImportSource holds source information for ImageImport type ImageImportSource struct { Source io.Reader // Source is the data to send to the server to create this image from. You must set SourceName to "-" to leverage this. SourceName string // SourceName is the name of the image to pull. Set to "-" to leverage the Source attribute. } -// ImageImportOptions holds information to import images from the client host. -type ImageImportOptions struct { - Tag string // Tag is the name to tag this image with. This attribute is deprecated. - Message string // Message is the message to tag the image with - Changes []string // Changes are the raw changes to apply to this image - Platform string // Platform is the target platform of the image -} - -// ImageListOptions holds parameters to list images with. -type ImageListOptions struct { - // All controls whether all images in the graph are filtered, or just - // the heads. - All bool - - // Filters is a JSON-encoded set of filter arguments. - Filters filters.Args - - // SharedSize indicates whether the shared size of images should be computed. - SharedSize bool - - // ContainerCount indicates whether container count should be computed. - ContainerCount bool -} - // ImageLoadResponse returns information to the client about a load process. type ImageLoadResponse struct { // Body must be closed to avoid a resource leak @@ -274,14 +170,6 @@ type ImageLoadResponse struct { JSON bool } -// ImagePullOptions holds information to pull images. -type ImagePullOptions struct { - All bool - RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry - PrivilegeFunc RequestPrivilegeFunc - Platform string -} - // RequestPrivilegeFunc is a function interface that // clients can supply to retry operations after // getting an authorization error. @@ -290,15 +178,6 @@ type ImagePullOptions struct { // if the privilege request fails. type RequestPrivilegeFunc func() (string, error) -// ImagePushOptions holds information to push images. -type ImagePushOptions ImagePullOptions - -// ImageRemoveOptions holds parameters to remove images. -type ImageRemoveOptions struct { - Force bool - PruneChildren bool -} - // ImageSearchOptions holds parameters to search images with. type ImageSearchOptions struct { RegistryAuth string @@ -307,14 +186,6 @@ type ImageSearchOptions struct { Limit int } -// ResizeOptions holds parameters to resize a tty. -// It can be used to resize container ttys and -// exec process ttys too. -type ResizeOptions struct { - Height uint - Width uint -} - // NodeListOptions holds parameters to list nodes with. type NodeListOptions struct { Filters filters.Args @@ -340,15 +211,6 @@ type ServiceCreateOptions struct { QueryRegistry bool } -// ServiceCreateResponse contains the information returned to a client -// on the creation of a new service. -type ServiceCreateResponse struct { - // ID is the ID of the created service. - ID string - // Warnings is a set of non-fatal warning messages to pass on to the user. - Warnings []string `json:",omitempty"` -} - // Values for RegistryAuthFrom in ServiceUpdateOptions const ( RegistryAuthFromSpec = "spec" diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go index 7d5930bb..945b6efa 100644 --- a/vendor/github.com/docker/docker/api/types/configs.go +++ b/vendor/github.com/docker/docker/api/types/configs.go @@ -1,32 +1,5 @@ package types // import "github.com/docker/docker/api/types" -import ( - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/network" - ocispec "github.com/opencontainers/image-spec/specs-go/v1" -) - -// configs holds structs used for internal communication between the -// frontend (such as an http server) and the backend (such as the -// docker daemon). - -// ContainerCreateConfig is the parameter set to ContainerCreate() -type ContainerCreateConfig struct { - Name string - Config *container.Config - HostConfig *container.HostConfig - NetworkingConfig *network.NetworkingConfig - Platform *ocispec.Platform - AdjustCPUShares bool -} - -// ContainerRmConfig holds arguments for the container remove -// operation. This struct is used to tell the backend what operations -// to perform. -type ContainerRmConfig struct { - ForceRemove, RemoveVolume, RemoveLink bool -} - // ExecConfig is a small subset of the Config struct that holds the configuration // for the exec feature of docker. type ExecConfig struct { @@ -43,25 +16,3 @@ type ExecConfig struct { WorkingDir string // Working directory Cmd []string // Execution commands and args } - -// PluginRmConfig holds arguments for plugin remove. -type PluginRmConfig struct { - ForceRemove bool -} - -// PluginEnableConfig holds arguments for plugin enable -type PluginEnableConfig struct { - Timeout int -} - -// PluginDisableConfig holds arguments for plugin disable. -type PluginDisableConfig struct { - ForceDisable bool -} - -// NetworkListConfig stores the options available for listing networks -type NetworkListConfig struct { - // TODO(@cpuguy83): naming is hard, this is pulled from what was being used in the router before moving here - Detailed bool - Verbose bool -} diff --git a/vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go b/vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go deleted file mode 100644 index 6b4b4739..00000000 --- a/vendor/github.com/docker/docker/api/types/container/change_response_deprecated.go +++ /dev/null @@ -1,6 +0,0 @@ -package container - -// ContainerChangeResponseItem change item in response to ContainerChanges operation -// -// Deprecated: use [FilesystemChange]. -type ContainerChangeResponseItem = FilesystemChange diff --git a/vendor/github.com/docker/docker/api/types/container/config.go b/vendor/github.com/docker/docker/api/types/container/config.go index 077583e6..86f46b74 100644 --- a/vendor/github.com/docker/docker/api/types/container/config.go +++ b/vendor/github.com/docker/docker/api/types/container/config.go @@ -6,6 +6,7 @@ import ( "github.com/docker/docker/api/types/strslice" "github.com/docker/go-connections/nat" + dockerspec "github.com/moby/docker-image-spec/specs-go/v1" ) // MinimumDuration puts a minimum on user configured duration. @@ -33,25 +34,7 @@ type StopOptions struct { } // HealthConfig holds configuration settings for the HEALTHCHECK feature. -type HealthConfig struct { - // Test is the test to perform to check that the container is healthy. - // An empty slice means to inherit the default. - // The options are: - // {} : inherit healthcheck - // {"NONE"} : disable healthcheck - // {"CMD", args...} : exec arguments directly - // {"CMD-SHELL", command} : run command with system's default shell - Test []string `json:",omitempty"` - - // Zero means to inherit. Durations are expressed as integer nanoseconds. - Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks. - Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung. - StartPeriod time.Duration `json:",omitempty"` // The start period for the container to initialize before the retries starts to count down. - - // Retries is the number of consecutive failures needed to consider a container as unhealthy. - // Zero means inherit. - Retries int `json:",omitempty"` -} +type HealthConfig = dockerspec.HealthcheckConfig // ExecStartOptions holds the options to start container's exec. type ExecStartOptions struct { @@ -87,10 +70,13 @@ type Config struct { WorkingDir string // Current directory (PWD) in the command will be launched Entrypoint strslice.StrSlice // Entrypoint to run when starting the container NetworkDisabled bool `json:",omitempty"` // Is network disabled - MacAddress string `json:",omitempty"` // Mac Address of the container - OnBuild []string // ONBUILD metadata that were defined on the image Dockerfile - Labels map[string]string // List of labels set to this container - StopSignal string `json:",omitempty"` // Signal to stop a container - StopTimeout *int `json:",omitempty"` // Timeout (in seconds) to stop a container - Shell strslice.StrSlice `json:",omitempty"` // Shell for shell-form of RUN, CMD, ENTRYPOINT + // Mac Address of the container. + // + // Deprecated: this field is deprecated since API v1.44. Use EndpointSettings.MacAddress instead. + MacAddress string `json:",omitempty"` + OnBuild []string // ONBUILD metadata that were defined on the image Dockerfile + Labels map[string]string // List of labels set to this container + StopSignal string `json:",omitempty"` // Signal to stop a container + StopTimeout *int `json:",omitempty"` // Timeout (in seconds) to stop a container + Shell strslice.StrSlice `json:",omitempty"` // Shell for shell-form of RUN, CMD, ENTRYPOINT } diff --git a/vendor/github.com/docker/docker/api/types/container/errors.go b/vendor/github.com/docker/docker/api/types/container/errors.go new file mode 100644 index 00000000..32c97803 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/errors.go @@ -0,0 +1,9 @@ +package container + +type errInvalidParameter struct{ error } + +func (e *errInvalidParameter) InvalidParameter() {} + +func (e *errInvalidParameter) Unwrap() error { + return e.error +} diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig.go b/vendor/github.com/docker/docker/api/types/container/hostconfig.go index d4e6f553..efb96266 100644 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig.go +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig.go @@ -1,10 +1,12 @@ package container // import "github.com/docker/docker/api/types/container" import ( + "fmt" "strings" "github.com/docker/docker/api/types/blkiodev" "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/strslice" "github.com/docker/go-connections/nat" units "github.com/docker/go-units" @@ -132,12 +134,12 @@ type NetworkMode string // IsNone indicates whether container isn't using a network stack. func (n NetworkMode) IsNone() bool { - return n == "none" + return n == network.NetworkNone } // IsDefault indicates whether container uses the default network stack. func (n NetworkMode) IsDefault() bool { - return n == "default" + return n == network.NetworkDefault } // IsPrivate indicates whether container uses its private network stack. @@ -271,33 +273,42 @@ type DeviceMapping struct { // RestartPolicy represents the restart policies of the container. type RestartPolicy struct { - Name string + Name RestartPolicyMode MaximumRetryCount int } +type RestartPolicyMode string + +const ( + RestartPolicyDisabled RestartPolicyMode = "no" + RestartPolicyAlways RestartPolicyMode = "always" + RestartPolicyOnFailure RestartPolicyMode = "on-failure" + RestartPolicyUnlessStopped RestartPolicyMode = "unless-stopped" +) + // IsNone indicates whether the container has the "no" restart policy. // This means the container will not automatically restart when exiting. func (rp *RestartPolicy) IsNone() bool { - return rp.Name == "no" || rp.Name == "" + return rp.Name == RestartPolicyDisabled || rp.Name == "" } // IsAlways indicates whether the container has the "always" restart policy. // This means the container will automatically restart regardless of the exit status. func (rp *RestartPolicy) IsAlways() bool { - return rp.Name == "always" + return rp.Name == RestartPolicyAlways } // IsOnFailure indicates whether the container has the "on-failure" restart policy. // This means the container will automatically restart of exiting with a non-zero exit status. func (rp *RestartPolicy) IsOnFailure() bool { - return rp.Name == "on-failure" + return rp.Name == RestartPolicyOnFailure } // IsUnlessStopped indicates whether the container has the // "unless-stopped" restart policy. This means the container will // automatically restart unless user has put it to stopped state. func (rp *RestartPolicy) IsUnlessStopped() bool { - return rp.Name == "unless-stopped" + return rp.Name == RestartPolicyUnlessStopped } // IsSame compares two RestartPolicy to see if they are the same @@ -305,6 +316,33 @@ func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool { return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount } +// ValidateRestartPolicy validates the given RestartPolicy. +func ValidateRestartPolicy(policy RestartPolicy) error { + switch policy.Name { + case RestartPolicyAlways, RestartPolicyUnlessStopped, RestartPolicyDisabled: + if policy.MaximumRetryCount != 0 { + msg := "invalid restart policy: maximum retry count can only be used with 'on-failure'" + if policy.MaximumRetryCount < 0 { + msg += " and cannot be negative" + } + return &errInvalidParameter{fmt.Errorf(msg)} + } + return nil + case RestartPolicyOnFailure: + if policy.MaximumRetryCount < 0 { + return &errInvalidParameter{fmt.Errorf("invalid restart policy: maximum retry count cannot be negative")} + } + return nil + case "": + // Versions before v25.0.0 created an empty restart-policy "name" as + // default. Allow an empty name with "any" MaximumRetryCount for + // backward-compatibility. + return nil + default: + return &errInvalidParameter{fmt.Errorf("invalid restart policy: unknown policy '%s'; use one of '%s', '%s', '%s', or '%s'", policy.Name, RestartPolicyDisabled, RestartPolicyAlways, RestartPolicyOnFailure, RestartPolicyUnlessStopped)} + } +} + // LogMode is a type to define the available modes for logging // These modes affect how logs are handled when log messages start piling up. type LogMode string diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go index 24c4fa8d..42132923 100644 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go @@ -1,8 +1,9 @@ //go:build !windows -// +build !windows package container // import "github.com/docker/docker/api/types/container" +import "github.com/docker/docker/api/types/network" + // IsValid indicates if an isolation technology is valid func (i Isolation) IsValid() bool { return i.IsDefault() @@ -11,15 +12,15 @@ func (i Isolation) IsValid() bool { // NetworkName returns the name of the network stack. func (n NetworkMode) NetworkName() string { if n.IsBridge() { - return "bridge" + return network.NetworkBridge } else if n.IsHost() { - return "host" + return network.NetworkHost } else if n.IsContainer() { return "container" } else if n.IsNone() { - return "none" + return network.NetworkNone } else if n.IsDefault() { - return "default" + return network.NetworkDefault } else if n.IsUserDefined() { return n.UserDefined() } @@ -28,12 +29,12 @@ func (n NetworkMode) NetworkName() string { // IsBridge indicates whether container uses the bridge network stack func (n NetworkMode) IsBridge() bool { - return n == "bridge" + return n == network.NetworkBridge } // IsHost indicates whether container uses the host network stack. func (n NetworkMode) IsHost() bool { - return n == "host" + return n == network.NetworkHost } // IsUserDefined indicates user-created network diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go index 99f803a5..154667f4 100644 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go @@ -1,9 +1,11 @@ package container // import "github.com/docker/docker/api/types/container" +import "github.com/docker/docker/api/types/network" + // IsBridge indicates whether container uses the bridge network stack // in windows it is given the name NAT func (n NetworkMode) IsBridge() bool { - return n == "nat" + return n == network.NetworkNat } // IsHost indicates whether container uses the host network stack. @@ -25,11 +27,11 @@ func (i Isolation) IsValid() bool { // NetworkName returns the name of the network stack. func (n NetworkMode) NetworkName() string { if n.IsDefault() { - return "default" + return network.NetworkDefault } else if n.IsBridge() { - return "nat" + return network.NetworkNat } else if n.IsNone() { - return "none" + return network.NetworkNone } else if n.IsContainer() { return "container" } else if n.IsUserDefined() { diff --git a/vendor/github.com/docker/docker/api/types/container/options.go b/vendor/github.com/docker/docker/api/types/container/options.go new file mode 100644 index 00000000..7a230057 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/container/options.go @@ -0,0 +1,67 @@ +package container + +import "github.com/docker/docker/api/types/filters" + +// ResizeOptions holds parameters to resize a TTY. +// It can be used to resize container TTYs and +// exec process TTYs too. +type ResizeOptions struct { + Height uint + Width uint +} + +// AttachOptions holds parameters to attach to a container. +type AttachOptions struct { + Stream bool + Stdin bool + Stdout bool + Stderr bool + DetachKeys string + Logs bool +} + +// CommitOptions holds parameters to commit changes into a container. +type CommitOptions struct { + Reference string + Comment string + Author string + Changes []string + Pause bool + Config *Config +} + +// RemoveOptions holds parameters to remove containers. +type RemoveOptions struct { + RemoveVolumes bool + RemoveLinks bool + Force bool +} + +// StartOptions holds parameters to start containers. +type StartOptions struct { + CheckpointID string + CheckpointDir string +} + +// ListOptions holds parameters to list containers with. +type ListOptions struct { + Size bool + All bool + Latest bool + Since string + Before string + Limit int + Filters filters.Args +} + +// LogsOptions holds parameters to filter logs with. +type LogsOptions struct { + ShowStdout bool + ShowStderr bool + Since string + Until string + Timestamps bool + Follow bool + Tail string + Details bool +} diff --git a/vendor/github.com/docker/docker/api/types/events/events.go b/vendor/github.com/docker/docker/api/types/events/events.go index 9fe07e26..6dbcd922 100644 --- a/vendor/github.com/docker/docker/api/types/events/events.go +++ b/vendor/github.com/docker/docker/api/types/events/events.go @@ -1,7 +1,7 @@ package events // import "github.com/docker/docker/api/types/events" // Type is used for event-types. -type Type = string +type Type string // List of known event types. const ( @@ -18,6 +18,86 @@ const ( VolumeEventType Type = "volume" // VolumeEventType is the event type that volumes generate. ) +// Action is used for event-actions. +type Action string + +const ( + ActionCreate Action = "create" + ActionStart Action = "start" + ActionRestart Action = "restart" + ActionStop Action = "stop" + ActionCheckpoint Action = "checkpoint" + ActionPause Action = "pause" + ActionUnPause Action = "unpause" + ActionAttach Action = "attach" + ActionDetach Action = "detach" + ActionResize Action = "resize" + ActionUpdate Action = "update" + ActionRename Action = "rename" + ActionKill Action = "kill" + ActionDie Action = "die" + ActionOOM Action = "oom" + ActionDestroy Action = "destroy" + ActionRemove Action = "remove" + ActionCommit Action = "commit" + ActionTop Action = "top" + ActionCopy Action = "copy" + ActionArchivePath Action = "archive-path" + ActionExtractToDir Action = "extract-to-dir" + ActionExport Action = "export" + ActionImport Action = "import" + ActionSave Action = "save" + ActionLoad Action = "load" + ActionTag Action = "tag" + ActionUnTag Action = "untag" + ActionPush Action = "push" + ActionPull Action = "pull" + ActionPrune Action = "prune" + ActionDelete Action = "delete" + ActionEnable Action = "enable" + ActionDisable Action = "disable" + ActionConnect Action = "connect" + ActionDisconnect Action = "disconnect" + ActionReload Action = "reload" + ActionMount Action = "mount" + ActionUnmount Action = "unmount" + + // ActionExecCreate is the prefix used for exec_create events. These + // event-actions are commonly followed by a colon and space (": "), + // and the command that's defined for the exec, for example: + // + // exec_create: /bin/sh -c 'echo hello' + // + // This is far from ideal; it's a compromise to allow filtering and + // to preserve backward-compatibility. + ActionExecCreate Action = "exec_create" + // ActionExecStart is the prefix used for exec_create events. These + // event-actions are commonly followed by a colon and space (": "), + // and the command that's defined for the exec, for example: + // + // exec_start: /bin/sh -c 'echo hello' + // + // This is far from ideal; it's a compromise to allow filtering and + // to preserve backward-compatibility. + ActionExecStart Action = "exec_start" + ActionExecDie Action = "exec_die" + ActionExecDetach Action = "exec_detach" + + // ActionHealthStatus is the prefix to use for health_status events. + // + // Health-status events can either have a pre-defined status, in which + // case the "health_status" action is followed by a colon, or can be + // "free-form", in which case they're followed by the output of the + // health-check output. + // + // This is far form ideal, and a compromise to allow filtering, and + // to preserve backward-compatibility. + ActionHealthStatus Action = "health_status" + ActionHealthStatusRunning Action = "health_status: running" + ActionHealthStatusHealthy Action = "health_status: healthy" + ActionHealthStatusUnhealthy Action = "health_status: unhealthy" +) + // Actor describes something that generates events, // like a container, or a network, or a volume. // It has a defined name and a set of attributes. @@ -37,7 +117,7 @@ type Message struct { From string `json:"from,omitempty"` // Deprecated: use Actor.Attributes["image"] instead. Type Type - Action string + Action Action Actor Actor // Engine events are local scope. Cluster events are swarm scope. Scope string `json:"scope,omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/image_delete_response_item.go b/vendor/github.com/docker/docker/api/types/image/delete_response.go similarity index 68% rename from vendor/github.com/docker/docker/api/types/image_delete_response_item.go rename to vendor/github.com/docker/docker/api/types/image/delete_response.go index b9a65a0d..998620dc 100644 --- a/vendor/github.com/docker/docker/api/types/image_delete_response_item.go +++ b/vendor/github.com/docker/docker/api/types/image/delete_response.go @@ -1,11 +1,11 @@ -package types +package image // This file was generated by the swagger tool. // Editing this file might prove futile when you re-run the swagger generate command -// ImageDeleteResponseItem image delete response item -// swagger:model ImageDeleteResponseItem -type ImageDeleteResponseItem struct { +// DeleteResponse delete response +// swagger:model DeleteResponse +type DeleteResponse struct { // The image ID of an image that was deleted Deleted string `json:"Deleted,omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/image/image.go b/vendor/github.com/docker/docker/api/types/image/image.go new file mode 100644 index 00000000..167df28c --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/image/image.go @@ -0,0 +1,9 @@ +package image + +import "time" + +// Metadata contains engine-local data about the image. +type Metadata struct { + // LastTagTime is the date and time at which the image was last tagged. + LastTagTime time.Time `json:",omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/image/opts.go b/vendor/github.com/docker/docker/api/types/image/opts.go index 3cefecb0..c6b1f351 100644 --- a/vendor/github.com/docker/docker/api/types/image/opts.go +++ b/vendor/github.com/docker/docker/api/types/image/opts.go @@ -1,9 +1,57 @@ package image -import ocispec "github.com/opencontainers/image-spec/specs-go/v1" +import "github.com/docker/docker/api/types/filters" -// GetImageOpts holds parameters to inspect an image. -type GetImageOpts struct { - Platform *ocispec.Platform - Details bool +// ImportOptions holds information to import images from the client host. +type ImportOptions struct { + Tag string // Tag is the name to tag this image with. This attribute is deprecated. + Message string // Message is the message to tag the image with + Changes []string // Changes are the raw changes to apply to this image + Platform string // Platform is the target platform of the image +} + +// CreateOptions holds information to create images. +type CreateOptions struct { + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry. + Platform string // Platform is the target platform of the image if it needs to be pulled from the registry. +} + +// PullOptions holds information to pull images. +type PullOptions struct { + All bool + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + + // PrivilegeFunc is a function that clients can supply to retry operations + // after getting an authorization error. This function returns the registry + // authentication header value in base64 encoded format, or an error if the + // privilege request fails. + // + // Also see [github.com/docker/docker/api/types.RequestPrivilegeFunc]. + PrivilegeFunc func() (string, error) + Platform string +} + +// PushOptions holds information to push images. +type PushOptions PullOptions + +// ListOptions holds parameters to list images with. +type ListOptions struct { + // All controls whether all images in the graph are filtered, or just + // the heads. + All bool + + // Filters is a JSON-encoded set of filter arguments. + Filters filters.Args + + // SharedSize indicates whether the shared size of images should be computed. + SharedSize bool + + // ContainerCount indicates whether container count should be computed. + ContainerCount bool +} + +// RemoveOptions holds parameters to remove images. +type RemoveOptions struct { + Force bool + PruneChildren bool } diff --git a/vendor/github.com/docker/docker/api/types/image_summary.go b/vendor/github.com/docker/docker/api/types/image/summary.go similarity index 85% rename from vendor/github.com/docker/docker/api/types/image_summary.go rename to vendor/github.com/docker/docker/api/types/image/summary.go index 0f6f1448..f1e3e2ef 100644 --- a/vendor/github.com/docker/docker/api/types/image_summary.go +++ b/vendor/github.com/docker/docker/api/types/image/summary.go @@ -1,11 +1,11 @@ -package types +package image // This file was generated by the swagger tool. // Editing this file might prove futile when you re-run the swagger generate command -// ImageSummary image summary -// swagger:model ImageSummary -type ImageSummary struct { +// Summary summary +// swagger:model Summary +type Summary struct { // Number of containers using this image. Includes both stopped and running // containers. @@ -84,11 +84,6 @@ type ImageSummary struct { // Total size of the image including all layers it is composed of. // - // In versions of Docker before v1.10, this field was calculated from - // the image itself and all of its parent images. Images are now stored - // self-contained, and no longer use a parent-chain, making this field - // an equivalent of the Size field. - // - // Deprecated: this field is kept for backward compatibility, and will be removed in API v1.44. + // Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead. VirtualSize int64 `json:"VirtualSize,omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go index ac4ce622..6fe04da2 100644 --- a/vendor/github.com/docker/docker/api/types/mount/mount.go +++ b/vendor/github.com/docker/docker/api/types/mount/mount.go @@ -29,7 +29,7 @@ type Mount struct { // Source is not supported for tmpfs (must be an empty value) Source string `json:",omitempty"` Target string `json:",omitempty"` - ReadOnly bool `json:",omitempty"` + ReadOnly bool `json:",omitempty"` // attempts recursive read-only if possible Consistency Consistency `json:",omitempty"` BindOptions *BindOptions `json:",omitempty"` @@ -85,12 +85,18 @@ type BindOptions struct { Propagation Propagation `json:",omitempty"` NonRecursive bool `json:",omitempty"` CreateMountpoint bool `json:",omitempty"` + // ReadOnlyNonRecursive makes the mount non-recursively read-only, but still leaves the mount recursive + // (unless NonRecursive is set to true in conjunction). + ReadOnlyNonRecursive bool `json:",omitempty"` + // ReadOnlyForceRecursive raises an error if the mount cannot be made recursively read-only. + ReadOnlyForceRecursive bool `json:",omitempty"` } // VolumeOptions represents the options for a mount of type volume. type VolumeOptions struct { NoCopy bool `json:",omitempty"` Labels map[string]string `json:",omitempty"` + Subpath string `json:",omitempty"` DriverConfig *Driver `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/network/endpoint.go b/vendor/github.com/docker/docker/api/types/network/endpoint.go new file mode 100644 index 00000000..9edd1c38 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/network/endpoint.go @@ -0,0 +1,147 @@ +package network + +import ( + "errors" + "fmt" + "net" + + "github.com/docker/docker/internal/multierror" +) + +// EndpointSettings stores the network endpoint details +type EndpointSettings struct { + // Configurations + IPAMConfig *EndpointIPAMConfig + Links []string + Aliases []string // Aliases holds the list of extra, user-specified DNS names for this endpoint. + // MacAddress may be used to specify a MAC address when the container is created. + // Once the container is running, it becomes operational data (it may contain a + // generated address). + MacAddress string + // Operational data + NetworkID string + EndpointID string + Gateway string + IPAddress string + IPPrefixLen int + IPv6Gateway string + GlobalIPv6Address string + GlobalIPv6PrefixLen int + DriverOpts map[string]string + // DNSNames holds all the (non fully qualified) DNS names associated to this endpoint. First entry is used to + // generate PTR records. + DNSNames []string +} + +// Copy makes a deep copy of `EndpointSettings` +func (es *EndpointSettings) Copy() *EndpointSettings { + epCopy := *es + if es.IPAMConfig != nil { + epCopy.IPAMConfig = es.IPAMConfig.Copy() + } + + if es.Links != nil { + links := make([]string, 0, len(es.Links)) + epCopy.Links = append(links, es.Links...) + } + + if es.Aliases != nil { + aliases := make([]string, 0, len(es.Aliases)) + epCopy.Aliases = append(aliases, es.Aliases...) + } + + if len(es.DNSNames) > 0 { + epCopy.DNSNames = make([]string, len(es.DNSNames)) + copy(epCopy.DNSNames, es.DNSNames) + } + + return &epCopy +} + +// EndpointIPAMConfig represents IPAM configurations for the endpoint +type EndpointIPAMConfig struct { + IPv4Address string `json:",omitempty"` + IPv6Address string `json:",omitempty"` + LinkLocalIPs []string `json:",omitempty"` +} + +// Copy makes a copy of the endpoint ipam config +func (cfg *EndpointIPAMConfig) Copy() *EndpointIPAMConfig { + cfgCopy := *cfg + cfgCopy.LinkLocalIPs = make([]string, 0, len(cfg.LinkLocalIPs)) + cfgCopy.LinkLocalIPs = append(cfgCopy.LinkLocalIPs, cfg.LinkLocalIPs...) + return &cfgCopy +} + +// NetworkSubnet describes a user-defined subnet for a specific network. It's only used to validate if an +// EndpointIPAMConfig is valid for a specific network. +type NetworkSubnet interface { + // Contains checks whether the NetworkSubnet contains [addr]. + Contains(addr net.IP) bool + // IsStatic checks whether the subnet was statically allocated (ie. user-defined). + IsStatic() bool +} + +// IsInRange checks whether static IP addresses are valid in a specific network. +func (cfg *EndpointIPAMConfig) IsInRange(v4Subnets []NetworkSubnet, v6Subnets []NetworkSubnet) error { + var errs []error + + if err := validateEndpointIPAddress(cfg.IPv4Address, v4Subnets); err != nil { + errs = append(errs, err) + } + if err := validateEndpointIPAddress(cfg.IPv6Address, v6Subnets); err != nil { + errs = append(errs, err) + } + + return multierror.Join(errs...) +} + +func validateEndpointIPAddress(epAddr string, ipamSubnets []NetworkSubnet) error { + if epAddr == "" { + return nil + } + + var staticSubnet bool + parsedAddr := net.ParseIP(epAddr) + for _, subnet := range ipamSubnets { + if subnet.IsStatic() { + staticSubnet = true + if subnet.Contains(parsedAddr) { + return nil + } + } + } + + if staticSubnet { + return fmt.Errorf("no configured subnet or ip-range contain the IP address %s", epAddr) + } + + return errors.New("user specified IP address is supported only when connecting to networks with user configured subnets") +} + +// Validate checks whether cfg is valid. +func (cfg *EndpointIPAMConfig) Validate() error { + if cfg == nil { + return nil + } + + var errs []error + + if cfg.IPv4Address != "" { + if addr := net.ParseIP(cfg.IPv4Address); addr == nil || addr.To4() == nil || addr.IsUnspecified() { + errs = append(errs, fmt.Errorf("invalid IPv4 address: %s", cfg.IPv4Address)) + } + } + if cfg.IPv6Address != "" { + if addr := net.ParseIP(cfg.IPv6Address); addr == nil || addr.To4() != nil || addr.IsUnspecified() { + errs = append(errs, fmt.Errorf("invalid IPv6 address: %s", cfg.IPv6Address)) + } + } + for _, addr := range cfg.LinkLocalIPs { + if parsed := net.ParseIP(addr); parsed == nil || parsed.IsUnspecified() { + errs = append(errs, fmt.Errorf("invalid link-local IP address: %s", addr)) + } + } + + return multierror.Join(errs...) +} diff --git a/vendor/github.com/docker/docker/api/types/network/ipam.go b/vendor/github.com/docker/docker/api/types/network/ipam.go new file mode 100644 index 00000000..f319e140 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/network/ipam.go @@ -0,0 +1,134 @@ +package network + +import ( + "errors" + "fmt" + "net/netip" + + "github.com/docker/docker/internal/multierror" +) + +// IPAM represents IP Address Management +type IPAM struct { + Driver string + Options map[string]string // Per network IPAM driver options + Config []IPAMConfig +} + +// IPAMConfig represents IPAM configurations +type IPAMConfig struct { + Subnet string `json:",omitempty"` + IPRange string `json:",omitempty"` + Gateway string `json:",omitempty"` + AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"` +} + +type ipFamily string + +const ( + ip4 ipFamily = "IPv4" + ip6 ipFamily = "IPv6" +) + +// ValidateIPAM checks whether the network's IPAM passed as argument is valid. It returns a joinError of the list of +// errors found. +func ValidateIPAM(ipam *IPAM, enableIPv6 bool) error { + if ipam == nil { + return nil + } + + var errs []error + for _, cfg := range ipam.Config { + subnet, err := netip.ParsePrefix(cfg.Subnet) + if err != nil { + errs = append(errs, fmt.Errorf("invalid subnet %s: invalid CIDR block notation", cfg.Subnet)) + continue + } + subnetFamily := ip4 + if subnet.Addr().Is6() { + subnetFamily = ip6 + } + + if !enableIPv6 && subnetFamily == ip6 { + continue + } + + if subnet != subnet.Masked() { + errs = append(errs, fmt.Errorf("invalid subnet %s: it should be %s", subnet, subnet.Masked())) + } + + if ipRangeErrs := validateIPRange(cfg.IPRange, subnet, subnetFamily); len(ipRangeErrs) > 0 { + errs = append(errs, ipRangeErrs...) + } + + if err := validateAddress(cfg.Gateway, subnet, subnetFamily); err != nil { + errs = append(errs, fmt.Errorf("invalid gateway %s: %w", cfg.Gateway, err)) + } + + for auxName, aux := range cfg.AuxAddress { + if err := validateAddress(aux, subnet, subnetFamily); err != nil { + errs = append(errs, fmt.Errorf("invalid auxiliary address %s: %w", auxName, err)) + } + } + } + + if err := multierror.Join(errs...); err != nil { + return fmt.Errorf("invalid network config:\n%w", err) + } + + return nil +} + +func validateIPRange(ipRange string, subnet netip.Prefix, subnetFamily ipFamily) []error { + if ipRange == "" { + return nil + } + prefix, err := netip.ParsePrefix(ipRange) + if err != nil { + return []error{fmt.Errorf("invalid ip-range %s: invalid CIDR block notation", ipRange)} + } + family := ip4 + if prefix.Addr().Is6() { + family = ip6 + } + + if family != subnetFamily { + return []error{fmt.Errorf("invalid ip-range %s: parent subnet is an %s block", ipRange, subnetFamily)} + } + + var errs []error + if prefix.Bits() < subnet.Bits() { + errs = append(errs, fmt.Errorf("invalid ip-range %s: CIDR block is bigger than its parent subnet %s", ipRange, subnet)) + } + if prefix != prefix.Masked() { + errs = append(errs, fmt.Errorf("invalid ip-range %s: it should be %s", prefix, prefix.Masked())) + } + if !subnet.Overlaps(prefix) { + errs = append(errs, fmt.Errorf("invalid ip-range %s: parent subnet %s doesn't contain ip-range", ipRange, subnet)) + } + + return errs +} + +func validateAddress(address string, subnet netip.Prefix, subnetFamily ipFamily) error { + if address == "" { + return nil + } + addr, err := netip.ParseAddr(address) + if err != nil { + return errors.New("invalid address") + } + family := ip4 + if addr.Is6() { + family = ip6 + } + + if family != subnetFamily { + return fmt.Errorf("parent subnet is an %s block", subnetFamily) + } + if !subnet.Contains(addr) { + return fmt.Errorf("parent subnet %s doesn't contain this address", subnet) + } + + return nil +} diff --git a/vendor/github.com/docker/docker/api/types/network/network.go b/vendor/github.com/docker/docker/api/types/network/network.go index 437b184c..f1f300f3 100644 --- a/vendor/github.com/docker/docker/api/types/network/network.go +++ b/vendor/github.com/docker/docker/api/types/network/network.go @@ -1,69 +1,34 @@ package network // import "github.com/docker/docker/api/types/network" + import ( "github.com/docker/docker/api/types/filters" ) +const ( + // NetworkDefault is a platform-independent alias to choose the platform-specific default network stack. + NetworkDefault = "default" + // NetworkHost is the name of the predefined network used when the NetworkMode host is selected (only available on Linux) + NetworkHost = "host" + // NetworkNone is the name of the predefined network used when the NetworkMode none is selected (available on both Linux and Windows) + NetworkNone = "none" + // NetworkBridge is the name of the default network on Linux + NetworkBridge = "bridge" + // NetworkNat is the name of the default network on Windows + NetworkNat = "nat" +) + // Address represents an IP address type Address struct { Addr string PrefixLen int } -// IPAM represents IP Address Management -type IPAM struct { - Driver string - Options map[string]string // Per network IPAM driver options - Config []IPAMConfig -} - -// IPAMConfig represents IPAM configurations -type IPAMConfig struct { - Subnet string `json:",omitempty"` - IPRange string `json:",omitempty"` - Gateway string `json:",omitempty"` - AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"` -} - -// EndpointIPAMConfig represents IPAM configurations for the endpoint -type EndpointIPAMConfig struct { - IPv4Address string `json:",omitempty"` - IPv6Address string `json:",omitempty"` - LinkLocalIPs []string `json:",omitempty"` -} - -// Copy makes a copy of the endpoint ipam config -func (cfg *EndpointIPAMConfig) Copy() *EndpointIPAMConfig { - cfgCopy := *cfg - cfgCopy.LinkLocalIPs = make([]string, 0, len(cfg.LinkLocalIPs)) - cfgCopy.LinkLocalIPs = append(cfgCopy.LinkLocalIPs, cfg.LinkLocalIPs...) - return &cfgCopy -} - // PeerInfo represents one peer of an overlay network type PeerInfo struct { Name string IP string } -// EndpointSettings stores the network endpoint details -type EndpointSettings struct { - // Configurations - IPAMConfig *EndpointIPAMConfig - Links []string - Aliases []string - // Operational data - NetworkID string - EndpointID string - Gateway string - IPAddress string - IPPrefixLen int - IPv6Gateway string - GlobalIPv6Address string - GlobalIPv6PrefixLen int - MacAddress string - DriverOpts map[string]string -} - // Task carries the information about one backend task type Task struct { Name string @@ -80,25 +45,6 @@ type ServiceInfo struct { Tasks []Task } -// Copy makes a deep copy of `EndpointSettings` -func (es *EndpointSettings) Copy() *EndpointSettings { - epCopy := *es - if es.IPAMConfig != nil { - epCopy.IPAMConfig = es.IPAMConfig.Copy() - } - - if es.Links != nil { - links := make([]string, 0, len(es.Links)) - epCopy.Links = append(links, es.Links...) - } - - if es.Aliases != nil { - aliases := make([]string, 0, len(es.Aliases)) - epCopy.Aliases = append(aliases, es.Aliases...) - } - return &epCopy -} - // NetworkingConfig represents the container's networking configuration for each of its interfaces // Carries the networking configs specified in the `docker run` and `docker network connect` commands type NetworkingConfig struct { diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go index b83f5d7b..6bbae93e 100644 --- a/vendor/github.com/docker/docker/api/types/registry/registry.go +++ b/vendor/github.com/docker/docker/api/types/registry/registry.go @@ -92,7 +92,9 @@ type SearchResult struct { IsOfficial bool `json:"is_official"` // Name is the name of the repository Name string `json:"name"` - // IsAutomated indicates whether the result is automated + // IsAutomated indicates whether the result is automated. + // + // Deprecated: the "is_automated" field is deprecated and will always be "false". IsAutomated bool `json:"is_automated"` // Description is a textual description of the repository Description string `json:"description"` diff --git a/vendor/github.com/docker/docker/api/types/swarm/container.go b/vendor/github.com/docker/docker/api/types/swarm/container.go index af5e1c0b..65f61d2d 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/container.go +++ b/vendor/github.com/docker/docker/api/types/swarm/container.go @@ -32,6 +32,42 @@ type SELinuxContext struct { Level string } +// SeccompMode is the type used for the enumeration of possible seccomp modes +// in SeccompOpts +type SeccompMode string + +const ( + SeccompModeDefault SeccompMode = "default" + SeccompModeUnconfined SeccompMode = "unconfined" + SeccompModeCustom SeccompMode = "custom" +) + +// SeccompOpts defines the options for configuring seccomp on a swarm-managed +// container. +type SeccompOpts struct { + // Mode is the SeccompMode used for the container. + Mode SeccompMode `json:",omitempty"` + // Profile is the custom seccomp profile as a json object to be used with + // the container. Mode should be set to SeccompModeCustom when using a + // custom profile in this manner. + Profile []byte `json:",omitempty"` +} + +// AppArmorMode is type used for the enumeration of possible AppArmor modes in +// AppArmorOpts +type AppArmorMode string + +const ( + AppArmorModeDefault AppArmorMode = "default" + AppArmorModeDisabled AppArmorMode = "disabled" +) + +// AppArmorOpts defines the options for configuring AppArmor on a swarm-managed +// container. Currently, custom AppArmor profiles are not supported. +type AppArmorOpts struct { + Mode AppArmorMode `json:",omitempty"` +} + // CredentialSpec for managed service account (Windows only) type CredentialSpec struct { Config string @@ -41,8 +77,11 @@ type CredentialSpec struct { // Privileges defines the security options for the container. type Privileges struct { - CredentialSpec *CredentialSpec - SELinuxContext *SELinuxContext + CredentialSpec *CredentialSpec + SELinuxContext *SELinuxContext + Seccomp *SeccompOpts `json:",omitempty"` + AppArmor *AppArmorOpts `json:",omitempty"` + NoNewPrivileges bool } // ContainerSpec represents the spec of a container. diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go b/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go index 98c2806c..292bd7af 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime/gen.go @@ -1,3 +1,3 @@ -//go:generate protoc -I . --gogofast_out=import_path=github.com/docker/docker/api/types/swarm/runtime:. plugin.proto +//go:generate protoc --gogofaster_out=import_path=github.com/docker/docker/api/types/swarm/runtime:. plugin.proto package runtime // import "github.com/docker/docker/api/types/swarm/runtime" diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go index adba5d44..32aaf0d5 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.pb.go @@ -1,25 +1,15 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. // source: plugin.proto -/* -Package runtime is a generated protocol buffer package. - -It is generated from these files: - - plugin.proto - -It has these top-level messages: - - PluginSpec - PluginPrivilege -*/ package runtime -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" - -import io "io" +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -30,22 +20,50 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // PluginSpec defines the base payload which clients can specify for creating // a service with the plugin runtime. type PluginSpec struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Remote string `protobuf:"bytes,2,opt,name=remote,proto3" json:"remote,omitempty"` - Privileges []*PluginPrivilege `protobuf:"bytes,3,rep,name=privileges" json:"privileges,omitempty"` + Privileges []*PluginPrivilege `protobuf:"bytes,3,rep,name=privileges,proto3" json:"privileges,omitempty"` Disabled bool `protobuf:"varint,4,opt,name=disabled,proto3" json:"disabled,omitempty"` - Env []string `protobuf:"bytes,5,rep,name=env" json:"env,omitempty"` + Env []string `protobuf:"bytes,5,rep,name=env,proto3" json:"env,omitempty"` +} + +func (m *PluginSpec) Reset() { *m = PluginSpec{} } +func (m *PluginSpec) String() string { return proto.CompactTextString(m) } +func (*PluginSpec) ProtoMessage() {} +func (*PluginSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_22a625af4bc1cc87, []int{0} +} +func (m *PluginSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PluginSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PluginSpec.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PluginSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginSpec.Merge(m, src) +} +func (m *PluginSpec) XXX_Size() int { + return m.Size() +} +func (m *PluginSpec) XXX_DiscardUnknown() { + xxx_messageInfo_PluginSpec.DiscardUnknown(m) } -func (m *PluginSpec) Reset() { *m = PluginSpec{} } -func (m *PluginSpec) String() string { return proto.CompactTextString(m) } -func (*PluginSpec) ProtoMessage() {} -func (*PluginSpec) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{0} } +var xxx_messageInfo_PluginSpec proto.InternalMessageInfo func (m *PluginSpec) GetName() string { if m != nil { @@ -87,13 +105,41 @@ func (m *PluginSpec) GetEnv() []string { type PluginPrivilege struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Value []string `protobuf:"bytes,3,rep,name=value" json:"value,omitempty"` + Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"` +} + +func (m *PluginPrivilege) Reset() { *m = PluginPrivilege{} } +func (m *PluginPrivilege) String() string { return proto.CompactTextString(m) } +func (*PluginPrivilege) ProtoMessage() {} +func (*PluginPrivilege) Descriptor() ([]byte, []int) { + return fileDescriptor_22a625af4bc1cc87, []int{1} +} +func (m *PluginPrivilege) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PluginPrivilege) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PluginPrivilege.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PluginPrivilege) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginPrivilege.Merge(m, src) +} +func (m *PluginPrivilege) XXX_Size() int { + return m.Size() +} +func (m *PluginPrivilege) XXX_DiscardUnknown() { + xxx_messageInfo_PluginPrivilege.DiscardUnknown(m) } -func (m *PluginPrivilege) Reset() { *m = PluginPrivilege{} } -func (m *PluginPrivilege) String() string { return proto.CompactTextString(m) } -func (*PluginPrivilege) ProtoMessage() {} -func (*PluginPrivilege) Descriptor() ([]byte, []int) { return fileDescriptorPlugin, []int{1} } +var xxx_messageInfo_PluginPrivilege proto.InternalMessageInfo func (m *PluginPrivilege) GetName() string { if m != nil { @@ -120,10 +166,32 @@ func init() { proto.RegisterType((*PluginSpec)(nil), "PluginSpec") proto.RegisterType((*PluginPrivilege)(nil), "PluginPrivilege") } + +func init() { proto.RegisterFile("plugin.proto", fileDescriptor_22a625af4bc1cc87) } + +var fileDescriptor_22a625af4bc1cc87 = []byte{ + // 225 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x29, 0xc8, 0x29, 0x4d, + 0xcf, 0xcc, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x9a, 0xc1, 0xc8, 0xc5, 0x15, 0x00, 0x16, + 0x08, 0x2e, 0x48, 0x4d, 0x16, 0x12, 0xe2, 0x62, 0xc9, 0x4b, 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60, + 0xd4, 0xe0, 0x0c, 0x02, 0xb3, 0x85, 0xc4, 0xb8, 0xd8, 0x8a, 0x52, 0x73, 0xf3, 0x4b, 0x52, 0x25, + 0x98, 0xc0, 0xa2, 0x50, 0x9e, 0x90, 0x01, 0x17, 0x57, 0x41, 0x51, 0x66, 0x59, 0x66, 0x4e, 0x6a, + 0x7a, 0x6a, 0xb1, 0x04, 0xb3, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x80, 0x1e, 0xc4, 0xb0, 0x00, 0x98, + 0x44, 0x10, 0x92, 0x1a, 0x21, 0x29, 0x2e, 0x8e, 0x94, 0xcc, 0xe2, 0xc4, 0xa4, 0x9c, 0xd4, 0x14, + 0x09, 0x16, 0x05, 0x46, 0x0d, 0x8e, 0x20, 0x38, 0x5f, 0x48, 0x80, 0x8b, 0x39, 0x35, 0xaf, 0x4c, + 0x82, 0x55, 0x81, 0x59, 0x83, 0x33, 0x08, 0xc4, 0x54, 0x8a, 0xe5, 0xe2, 0x47, 0x33, 0x0c, 0xab, + 0xf3, 0x14, 0xb8, 0xb8, 0x53, 0x52, 0x8b, 0x93, 0x8b, 0x32, 0x0b, 0x4a, 0x32, 0xf3, 0xf3, 0xa0, + 0x6e, 0x44, 0x16, 0x12, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x05, 0xbb, 0x91, 0x33, + 0x08, 0xc2, 0x71, 0x92, 0x38, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, + 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x24, 0x36, + 0x70, 0xd0, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x37, 0xea, 0xe2, 0xca, 0x2a, 0x01, 0x00, + 0x00, +} + func (m *PluginSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -131,66 +199,69 @@ func (m *PluginSpec) Marshal() (dAtA []byte, err error) { } func (m *PluginSpec) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Remote) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintPlugin(dAtA, i, uint64(len(m.Remote))) - i += copy(dAtA[i:], m.Remote) - } - if len(m.Privileges) > 0 { - for _, msg := range m.Privileges { - dAtA[i] = 0x1a - i++ - i = encodeVarintPlugin(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintPlugin(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0x2a } } if m.Disabled { - dAtA[i] = 0x20 - i++ + i-- if m.Disabled { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Privileges) > 0 { + for iNdEx := len(m.Privileges) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Privileges[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPlugin(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - return i, nil + if len(m.Remote) > 0 { + i -= len(m.Remote) + copy(dAtA[i:], m.Remote) + i = encodeVarintPlugin(dAtA, i, uint64(len(m.Remote))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *PluginPrivilege) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -198,50 +269,56 @@ func (m *PluginPrivilege) Marshal() (dAtA []byte, err error) { } func (m *PluginPrivilege) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginPrivilege) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if len(m.Value) > 0 { + for iNdEx := len(m.Value) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Value[iNdEx]) + copy(dAtA[i:], m.Value[iNdEx]) + i = encodeVarintPlugin(dAtA, i, uint64(len(m.Value[iNdEx]))) + i-- + dAtA[i] = 0x1a + } } if len(m.Description) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Description) + copy(dAtA[i:], m.Description) i = encodeVarintPlugin(dAtA, i, uint64(len(m.Description))) - i += copy(dAtA[i:], m.Description) + i-- + dAtA[i] = 0x12 } - if len(m.Value) > 0 { - for _, s := range m.Value { - dAtA[i] = 0x1a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintPlugin(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func encodeVarintPlugin(dAtA []byte, offset int, v uint64) int { + offset -= sovPlugin(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *PluginSpec) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Name) @@ -271,6 +348,9 @@ func (m *PluginSpec) Size() (n int) { } func (m *PluginPrivilege) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Name) @@ -291,14 +371,7 @@ func (m *PluginPrivilege) Size() (n int) { } func sovPlugin(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozPlugin(x uint64) (n int) { return sovPlugin(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -318,7 +391,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -346,7 +419,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -356,6 +429,9 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -375,7 +451,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -385,6 +461,9 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -404,7 +483,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } @@ -413,6 +492,9 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -435,7 +517,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -455,7 +537,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -465,6 +547,9 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -476,7 +561,7 @@ func (m *PluginSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthPlugin } if (iNdEx + skippy) > l { @@ -506,7 +591,7 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -534,7 +619,7 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -544,6 +629,9 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -563,7 +651,7 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -573,6 +661,9 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -592,7 +683,7 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -602,6 +693,9 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { return ErrInvalidLengthPlugin } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPlugin + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -613,7 +707,7 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthPlugin } if (iNdEx + skippy) > l { @@ -631,6 +725,7 @@ func (m *PluginPrivilege) Unmarshal(dAtA []byte) error { func skipPlugin(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -662,10 +757,8 @@ func skipPlugin(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -682,75 +775,34 @@ func skipPlugin(dAtA []byte) (n int, err error) { break } } - iNdEx += length if length < 0 { return 0, ErrInvalidLengthPlugin } - return iNdEx, nil + iNdEx += length case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowPlugin - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipPlugin(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupPlugin + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthPlugin + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthPlugin = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowPlugin = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthPlugin = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPlugin = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupPlugin = fmt.Errorf("proto: unexpected end of group") ) - -func init() { proto.RegisterFile("plugin.proto", fileDescriptorPlugin) } - -var fileDescriptorPlugin = []byte{ - // 256 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x4d, 0x4b, 0xc3, 0x30, - 0x18, 0xc7, 0x89, 0xdd, 0xc6, 0xfa, 0x4c, 0x70, 0x04, 0x91, 0xe2, 0xa1, 0x94, 0x9d, 0x7a, 0x6a, - 0x45, 0x2f, 0x82, 0x37, 0x0f, 0x9e, 0x47, 0xbc, 0x09, 0x1e, 0xd2, 0xf6, 0xa1, 0x06, 0x9b, 0x17, - 0x92, 0xb4, 0xe2, 0x37, 0xf1, 0x23, 0x79, 0xf4, 0x23, 0x48, 0x3f, 0x89, 0x98, 0x75, 0x32, 0x64, - 0xa7, 0xff, 0x4b, 0xc2, 0x9f, 0x1f, 0x0f, 0x9c, 0x9a, 0xae, 0x6f, 0x85, 0x2a, 0x8c, 0xd5, 0x5e, - 0x6f, 0x3e, 0x08, 0xc0, 0x36, 0x14, 0x8f, 0x06, 0x6b, 0x4a, 0x61, 0xa6, 0xb8, 0xc4, 0x84, 0x64, - 0x24, 0x8f, 0x59, 0xf0, 0xf4, 0x02, 0x16, 0x16, 0xa5, 0xf6, 0x98, 0x9c, 0x84, 0x76, 0x4a, 0xf4, - 0x0a, 0xc0, 0x58, 0x31, 0x88, 0x0e, 0x5b, 0x74, 0x49, 0x94, 0x45, 0xf9, 0xea, 0x7a, 0x5d, 0xec, - 0xc6, 0xb6, 0xfb, 0x07, 0x76, 0xf0, 0x87, 0x5e, 0xc2, 0xb2, 0x11, 0x8e, 0x57, 0x1d, 0x36, 0xc9, - 0x2c, 0x23, 0xf9, 0x92, 0xfd, 0x65, 0xba, 0x86, 0x08, 0xd5, 0x90, 0xcc, 0xb3, 0x28, 0x8f, 0xd9, - 0xaf, 0xdd, 0x3c, 0xc3, 0xd9, 0xbf, 0xb1, 0xa3, 0x78, 0x19, 0xac, 0x1a, 0x74, 0xb5, 0x15, 0xc6, - 0x0b, 0xad, 0x26, 0xc6, 0xc3, 0x8a, 0x9e, 0xc3, 0x7c, 0xe0, 0x5d, 0x8f, 0x81, 0x31, 0x66, 0xbb, - 0x70, 0xff, 0xf0, 0x39, 0xa6, 0xe4, 0x6b, 0x4c, 0xc9, 0xf7, 0x98, 0x92, 0xa7, 0xdb, 0x56, 0xf8, - 0x97, 0xbe, 0x2a, 0x6a, 0x2d, 0xcb, 0x46, 0xd7, 0xaf, 0x68, 0xf7, 0xc2, 0x8d, 0x28, 0xfd, 0xbb, - 0x41, 0x57, 0xba, 0x37, 0x6e, 0x65, 0x69, 0x7b, 0xe5, 0x85, 0xc4, 0xbb, 0x49, 0xab, 0x45, 0x38, - 0xe4, 0xcd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x99, 0xa8, 0xd9, 0x9b, 0x58, 0x01, 0x00, 0x00, -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto index 9ef16904..e311b36b 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto @@ -1,7 +1,5 @@ syntax = "proto3"; -option go_package = "github.com/docker/docker/api/types/swarm/runtime;runtime"; - // PluginSpec defines the base payload which clients can specify for creating // a service with the plugin runtime. message PluginSpec { diff --git a/vendor/github.com/docker/docker/api/types/swarm/service.go b/vendor/github.com/docker/docker/api/types/swarm/service.go index 6eb452d2..5b6d5ec1 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/service.go +++ b/vendor/github.com/docker/docker/api/types/swarm/service.go @@ -34,9 +34,9 @@ type ServiceSpec struct { UpdateConfig *UpdateConfig `json:",omitempty"` RollbackConfig *UpdateConfig `json:",omitempty"` - // Networks field in ServiceSpec is deprecated. The - // same field in TaskSpec should be used instead. - // This field will be removed in a future release. + // Networks specifies which networks the service should attach to. + // + // Deprecated: This field is deprecated since v1.44. The Networks field in TaskSpec should be used instead. Networks []NetworkAttachmentConfig `json:",omitempty"` EndpointSpec *EndpointSpec `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/swarm/service_create_response.go b/vendor/github.com/docker/docker/api/types/swarm/service_create_response.go new file mode 100644 index 00000000..9a268ff1 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/swarm/service_create_response.go @@ -0,0 +1,20 @@ +package swarm + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +// ServiceCreateResponse contains the information returned to a client on the +// creation of a new service. +// +// swagger:model ServiceCreateResponse +type ServiceCreateResponse struct { + + // The ID of the created service. + ID string `json:"ID,omitempty"` + + // Optional warning message. + // + // FIXME(thaJeztah): this should have "omitempty" in the generated type. + // + Warnings []string `json:"Warnings"` +} diff --git a/vendor/github.com/docker/docker/api/types/service_update_response.go b/vendor/github.com/docker/docker/api/types/swarm/service_update_response.go similarity index 95% rename from vendor/github.com/docker/docker/api/types/service_update_response.go rename to vendor/github.com/docker/docker/api/types/swarm/service_update_response.go index 74ea64b1..0417467d 100644 --- a/vendor/github.com/docker/docker/api/types/service_update_response.go +++ b/vendor/github.com/docker/docker/api/types/swarm/service_update_response.go @@ -1,4 +1,4 @@ -package types +package swarm // This file was generated by the swagger tool. // Editing this file might prove futile when you re-run the swagger generate command diff --git a/vendor/github.com/docker/docker/api/types/system/info.go b/vendor/github.com/docker/docker/api/types/system/info.go new file mode 100644 index 00000000..89d4a009 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/system/info.go @@ -0,0 +1,116 @@ +package system + +import ( + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/registry" + "github.com/docker/docker/api/types/swarm" +) + +// Info contains response of Engine API: +// GET "/info" +type Info struct { + ID string + Containers int + ContainersRunning int + ContainersPaused int + ContainersStopped int + Images int + Driver string + DriverStatus [][2]string + SystemStatus [][2]string `json:",omitempty"` // SystemStatus is only propagated by the Swarm standalone API + Plugins PluginsInfo + MemoryLimit bool + SwapLimit bool + KernelMemory bool `json:",omitempty"` // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes + KernelMemoryTCP bool `json:",omitempty"` // KernelMemoryTCP is not supported on cgroups v2. + CPUCfsPeriod bool `json:"CpuCfsPeriod"` + CPUCfsQuota bool `json:"CpuCfsQuota"` + CPUShares bool + CPUSet bool + PidsLimit bool + IPv4Forwarding bool + BridgeNfIptables bool + BridgeNfIP6tables bool `json:"BridgeNfIp6tables"` + Debug bool + NFd int + OomKillDisable bool + NGoroutines int + SystemTime string + LoggingDriver string + CgroupDriver string + CgroupVersion string `json:",omitempty"` + NEventsListener int + KernelVersion string + OperatingSystem string + OSVersion string + OSType string + Architecture string + IndexServerAddress string + RegistryConfig *registry.ServiceConfig + NCPU int + MemTotal int64 + GenericResources []swarm.GenericResource + DockerRootDir string + HTTPProxy string `json:"HttpProxy"` + HTTPSProxy string `json:"HttpsProxy"` + NoProxy string + Name string + Labels []string + ExperimentalBuild bool + ServerVersion string + Runtimes map[string]RuntimeWithStatus + DefaultRuntime string + Swarm swarm.Info + // LiveRestoreEnabled determines whether containers should be kept + // running when the daemon is shutdown or upon daemon start if + // running containers are detected + LiveRestoreEnabled bool + Isolation container.Isolation + InitBinary string + ContainerdCommit Commit + RuncCommit Commit + InitCommit Commit + SecurityOptions []string + ProductLicense string `json:",omitempty"` + DefaultAddressPools []NetworkAddressPool `json:",omitempty"` + CDISpecDirs []string + + // Legacy API fields for older API versions. + legacyFields + + // Warnings contains a slice of warnings that occurred while collecting + // system information. These warnings are intended to be informational + // messages for the user, and are not intended to be parsed / used for + // other purposes, as they do not have a fixed format. + Warnings []string +} + +type legacyFields struct { + ExecutionDriver string `json:",omitempty"` // Deprecated: deprecated since API v1.25, but returned for older versions. +} + +// PluginsInfo is a temp struct holding Plugins name +// registered with docker daemon. It is used by [Info] struct +type PluginsInfo struct { + // List of Volume plugins registered + Volume []string + // List of Network plugins registered + Network []string + // List of Authorization plugins registered + Authorization []string + // List of Log plugins registered + Log []string +} + +// Commit holds the Git-commit (SHA1) that a binary was built from, as reported +// in the version-string of external tools, such as containerd, or runC. +type Commit struct { + ID string // ID is the actual commit ID of external tool. + Expected string // Expected is the commit ID of external tool expected by dockerd as set at build time. +} + +// NetworkAddressPool is a temp struct used by [Info] struct. +type NetworkAddressPool struct { + Base string + Size int +} diff --git a/vendor/github.com/docker/docker/api/types/system/runtime.go b/vendor/github.com/docker/docker/api/types/system/runtime.go new file mode 100644 index 00000000..d077295a --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/system/runtime.go @@ -0,0 +1,20 @@ +package system + +// Runtime describes an OCI runtime +type Runtime struct { + // "Legacy" runtime configuration for runc-compatible runtimes. + + Path string `json:"path,omitempty"` + Args []string `json:"runtimeArgs,omitempty"` + + // Shimv2 runtime configuration. Mutually exclusive with the legacy config above. + + Type string `json:"runtimeType,omitempty"` + Options map[string]interface{} `json:"options,omitempty"` +} + +// RuntimeWithStatus extends [Runtime] to hold [RuntimeStatus]. +type RuntimeWithStatus struct { + Runtime + Status map[string]string `json:"status,omitempty"` +} diff --git a/vendor/github.com/docker/docker/api/types/system/security_opts.go b/vendor/github.com/docker/docker/api/types/system/security_opts.go new file mode 100644 index 00000000..edff3eb1 --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/system/security_opts.go @@ -0,0 +1,48 @@ +package system + +import ( + "errors" + "fmt" + "strings" +) + +// SecurityOpt contains the name and options of a security option +type SecurityOpt struct { + Name string + Options []KeyValue +} + +// DecodeSecurityOptions decodes a security options string slice to a +// type-safe [SecurityOpt]. +func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) { + so := []SecurityOpt{} + for _, opt := range opts { + // support output from a < 1.13 docker daemon + if !strings.Contains(opt, "=") { + so = append(so, SecurityOpt{Name: opt}) + continue + } + secopt := SecurityOpt{} + for _, s := range strings.Split(opt, ",") { + k, v, ok := strings.Cut(s, "=") + if !ok { + return nil, fmt.Errorf("invalid security option %q", s) + } + if k == "" || v == "" { + return nil, errors.New("invalid empty security option") + } + if k == "name" { + secopt.Name = v + continue + } + secopt.Options = append(secopt.Options, KeyValue{Key: k, Value: v}) + } + so = append(so, secopt) + } + return so, nil +} + +// KeyValue holds a key/value pair. +type KeyValue struct { + Key, Value string +} diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index b413e020..ca07162a 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -1,18 +1,15 @@ package types // import "github.com/docker/docker/api/types" import ( - "errors" - "fmt" "io" "os" - "strings" "time" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/network" - "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/api/types/volume" "github.com/docker/go-connections/nat" @@ -75,19 +72,26 @@ type ImageInspect struct { // Created is the date and time at which the image was created, formatted in // RFC 3339 nano-seconds (time.RFC3339Nano). - Created string + // + // This information is only available if present in the image, + // and omitted otherwise. + Created string `json:",omitempty"` // Container is the ID of the container that was used to create the image. // // Depending on how the image was created, this field may be empty. - Container string + // + // Deprecated: this field is omitted in API v1.45, but kept for backward compatibility. + Container string `json:",omitempty"` // ContainerConfig is an optional field containing the configuration of the // container that was last committed when creating the image. // // Previous versions of Docker builder used this field to store build cache, // and it is not in active use anymore. - ContainerConfig *container.Config + // + // Deprecated: this field is omitted in API v1.45, but kept for backward compatibility. + ContainerConfig *container.Config `json:",omitempty"` // DockerVersion is the version of Docker that was used to build the image. // @@ -118,12 +122,7 @@ type ImageInspect struct { // VirtualSize is the total size of the image including all layers it is // composed of. // - // In versions of Docker before v1.10, this field was calculated from - // the image itself and all of its parent images. Docker v1.10 and up - // store images self-contained, and no longer use a parent-chain, making - // this field an equivalent of the Size field. - // - // Deprecated: Unused in API 1.43 and up, but kept for backward compatibility with older API versions. + // Deprecated: this field is omitted in API v1.44, but kept for backward compatibility. Use Size instead. VirtualSize int64 `json:"VirtualSize,omitempty"` // GraphDriver holds information about the storage driver used to store the @@ -137,13 +136,7 @@ type ImageInspect struct { // Metadata of the image in the local cache. // // This information is local to the daemon, and not part of the image itself. - Metadata ImageMetadata -} - -// ImageMetadata contains engine-local data about the image -type ImageMetadata struct { - // LastTagTime is the date and time at which the image was last tagged. - LastTagTime time.Time `json:",omitempty"` + Metadata image.Metadata } // Container contains response of Engine API: @@ -237,148 +230,6 @@ type Version struct { BuildTime string `json:",omitempty"` } -// Commit holds the Git-commit (SHA1) that a binary was built from, as reported -// in the version-string of external tools, such as containerd, or runC. -type Commit struct { - ID string // ID is the actual commit ID of external tool. - Expected string // Expected is the commit ID of external tool expected by dockerd as set at build time. -} - -// Info contains response of Engine API: -// GET "/info" -type Info struct { - ID string - Containers int - ContainersRunning int - ContainersPaused int - ContainersStopped int - Images int - Driver string - DriverStatus [][2]string - SystemStatus [][2]string `json:",omitempty"` // SystemStatus is only propagated by the Swarm standalone API - Plugins PluginsInfo - MemoryLimit bool - SwapLimit bool - KernelMemory bool `json:",omitempty"` // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes - KernelMemoryTCP bool `json:",omitempty"` // KernelMemoryTCP is not supported on cgroups v2. - CPUCfsPeriod bool `json:"CpuCfsPeriod"` - CPUCfsQuota bool `json:"CpuCfsQuota"` - CPUShares bool - CPUSet bool - PidsLimit bool - IPv4Forwarding bool - BridgeNfIptables bool - BridgeNfIP6tables bool `json:"BridgeNfIp6tables"` - Debug bool - NFd int - OomKillDisable bool - NGoroutines int - SystemTime string - LoggingDriver string - CgroupDriver string - CgroupVersion string `json:",omitempty"` - NEventsListener int - KernelVersion string - OperatingSystem string - OSVersion string - OSType string - Architecture string - IndexServerAddress string - RegistryConfig *registry.ServiceConfig - NCPU int - MemTotal int64 - GenericResources []swarm.GenericResource - DockerRootDir string - HTTPProxy string `json:"HttpProxy"` - HTTPSProxy string `json:"HttpsProxy"` - NoProxy string - Name string - Labels []string - ExperimentalBuild bool - ServerVersion string - Runtimes map[string]Runtime - DefaultRuntime string - Swarm swarm.Info - // LiveRestoreEnabled determines whether containers should be kept - // running when the daemon is shutdown or upon daemon start if - // running containers are detected - LiveRestoreEnabled bool - Isolation container.Isolation - InitBinary string - ContainerdCommit Commit - RuncCommit Commit - InitCommit Commit - SecurityOptions []string - ProductLicense string `json:",omitempty"` - DefaultAddressPools []NetworkAddressPool `json:",omitempty"` - - // Warnings contains a slice of warnings that occurred while collecting - // system information. These warnings are intended to be informational - // messages for the user, and are not intended to be parsed / used for - // other purposes, as they do not have a fixed format. - Warnings []string -} - -// KeyValue holds a key/value pair -type KeyValue struct { - Key, Value string -} - -// NetworkAddressPool is a temp struct used by Info struct -type NetworkAddressPool struct { - Base string - Size int -} - -// SecurityOpt contains the name and options of a security option -type SecurityOpt struct { - Name string - Options []KeyValue -} - -// DecodeSecurityOptions decodes a security options string slice to a type safe -// SecurityOpt -func DecodeSecurityOptions(opts []string) ([]SecurityOpt, error) { - so := []SecurityOpt{} - for _, opt := range opts { - // support output from a < 1.13 docker daemon - if !strings.Contains(opt, "=") { - so = append(so, SecurityOpt{Name: opt}) - continue - } - secopt := SecurityOpt{} - for _, s := range strings.Split(opt, ",") { - k, v, ok := strings.Cut(s, "=") - if !ok { - return nil, fmt.Errorf("invalid security option %q", s) - } - if k == "" || v == "" { - return nil, errors.New("invalid empty security option") - } - if k == "name" { - secopt.Name = v - continue - } - secopt.Options = append(secopt.Options, KeyValue{Key: k, Value: v}) - } - so = append(so, secopt) - } - return so, nil -} - -// PluginsInfo is a temp struct holding Plugins name -// registered with docker daemon. It is used by Info struct -type PluginsInfo struct { - // List of Volume plugins registered - Volume []string - // List of Network plugins registered - Network []string - // List of Authorization plugins registered - Authorization []string - // List of Log plugins registered - Log []string -} - // ExecStartCheck is a temp struct used by execStart // Config fields is part of ExecConfig in runconfig package type ExecStartCheck struct { @@ -491,17 +342,27 @@ type SummaryNetworkSettings struct { Networks map[string]*network.EndpointSettings } -// NetworkSettingsBase holds basic information about networks +// NetworkSettingsBase holds networking state for a container when inspecting it. type NetworkSettingsBase struct { - Bridge string // Bridge is the Bridge name the network uses(e.g. `docker0`) - SandboxID string // SandboxID uniquely represents a container's network stack - HairpinMode bool // HairpinMode specifies if hairpin NAT should be enabled on the virtual interface - LinkLocalIPv6Address string // LinkLocalIPv6Address is an IPv6 unicast address using the link-local prefix - LinkLocalIPv6PrefixLen int // LinkLocalIPv6PrefixLen is the prefix length of an IPv6 unicast address - Ports nat.PortMap // Ports is a collection of PortBinding indexed by Port - SandboxKey string // SandboxKey identifies the sandbox - SecondaryIPAddresses []network.Address - SecondaryIPv6Addresses []network.Address + Bridge string // Bridge contains the name of the default bridge interface iff it was set through the daemon --bridge flag. + SandboxID string // SandboxID uniquely represents a container's network stack + SandboxKey string // SandboxKey identifies the sandbox + Ports nat.PortMap // Ports is a collection of PortBinding indexed by Port + + // HairpinMode specifies if hairpin NAT should be enabled on the virtual interface + // + // Deprecated: This field is never set and will be removed in a future release. + HairpinMode bool + // LinkLocalIPv6Address is an IPv6 unicast address using the link-local prefix + // + // Deprecated: This field is never set and will be removed in a future release. + LinkLocalIPv6Address string + // LinkLocalIPv6PrefixLen is the prefix length of an IPv6 unicast address + // + // Deprecated: This field is never set and will be removed in a future release. + LinkLocalIPv6PrefixLen int + SecondaryIPAddresses []network.Address // Deprecated: This field is never set and will be removed in a future release. + SecondaryIPv6Addresses []network.Address // Deprecated: This field is never set and will be removed in a future release. } // DefaultNetworkSettings holds network information @@ -594,14 +455,9 @@ type EndpointResource struct { // NetworkCreate is the expected body of the "create network" http request message type NetworkCreate struct { - // Check for networks with duplicate names. - // Network is primarily keyed based on a random ID and not on the name. - // Network name is strictly a user-friendly alias to the network - // which is uniquely identified using ID. - // And there is no guaranteed way to check for duplicates. - // Option CheckDuplicate is there to provide a best effort checking of any networks - // which has the same name but it is not guaranteed to catch all name collisions. - CheckDuplicate bool + // Deprecated: CheckDuplicate is deprecated since API v1.44, but it defaults to true when sent by the client + // package to older daemons. + CheckDuplicate bool `json:",omitempty"` Driver string Scope string EnableIPv6 bool @@ -645,33 +501,6 @@ type NetworkInspectOptions struct { Verbose bool } -// Checkpoint represents the details of a checkpoint -type Checkpoint struct { - Name string // Name is the name of the checkpoint -} - -// Runtime describes an OCI runtime -type Runtime struct { - // "Legacy" runtime configuration for runc-compatible runtimes. - - Path string `json:"path,omitempty"` - Args []string `json:"runtimeArgs,omitempty"` - - // Shimv2 runtime configuration. Mutually exclusive with the legacy config above. - - Type string `json:"runtimeType,omitempty"` - Options map[string]interface{} `json:"options,omitempty"` - - // This is exposed here only for internal use - ShimConfig *ShimConfig `json:"-"` -} - -// ShimConfig is used by runtime to configure containerd shims -type ShimConfig struct { - Binary string - Opts interface{} -} - // DiskUsageObject represents an object type used for disk usage query filtering. type DiskUsageObject string @@ -697,7 +526,7 @@ type DiskUsageOptions struct { // GET "/system/df" type DiskUsage struct { LayersSize int64 - Images []*ImageSummary + Images []*image.Summary Containers []*Container Volumes []*volume.Volume BuildCache []*BuildCache @@ -721,7 +550,7 @@ type VolumesPruneReport struct { // ImagesPruneReport contains the response for Engine API: // POST "/images/prune" type ImagesPruneReport struct { - ImagesDeleted []ImageDeleteResponseItem + ImagesDeleted []image.DeleteResponse SpaceReclaimed uint64 } diff --git a/vendor/github.com/docker/docker/api/types/types_deprecated.go b/vendor/github.com/docker/docker/api/types/types_deprecated.go new file mode 100644 index 00000000..231a5cca --- /dev/null +++ b/vendor/github.com/docker/docker/api/types/types_deprecated.go @@ -0,0 +1,35 @@ +package types + +import ( + "github.com/docker/docker/api/types/image" +) + +// ImageImportOptions holds information to import images from the client host. +// +// Deprecated: use [image.ImportOptions]. +type ImageImportOptions = image.ImportOptions + +// ImageCreateOptions holds information to create images. +// +// Deprecated: use [image.CreateOptions]. +type ImageCreateOptions = image.CreateOptions + +// ImagePullOptions holds information to pull images. +// +// Deprecated: use [image.PullOptions]. +type ImagePullOptions = image.PullOptions + +// ImagePushOptions holds information to push images. +// +// Deprecated: use [image.PushOptions]. +type ImagePushOptions = image.PushOptions + +// ImageListOptions holds parameters to list images with. +// +// Deprecated: use [image.ListOptions]. +type ImageListOptions = image.ListOptions + +// ImageRemoveOptions holds parameters to remove images. +// +// Deprecated: use [image.RemoveOptions]. +type ImageRemoveOptions = image.RemoveOptions diff --git a/vendor/github.com/docker/docker/api/types/versions/README.md b/vendor/github.com/docker/docker/api/types/versions/README.md deleted file mode 100644 index 1ef911ed..00000000 --- a/vendor/github.com/docker/docker/api/types/versions/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Legacy API type versions - -This package includes types for legacy API versions. The stable version of the API types live in `api/types/*.go`. - -Consider moving a type here when you need to keep backwards compatibility in the API. This legacy types are organized by the latest API version they appear in. For instance, types in the `v1p19` package are valid for API versions below or equal `1.19`. Types in the `v1p20` package are valid for the API version `1.20`, since the versions below that will use the legacy types in `v1p19`. - -## Package name conventions - -The package name convention is to use `v` as a prefix for the version number and `p`(patch) as a separator. We use this nomenclature due to a few restrictions in the Go package name convention: - -1. We cannot use `.` because it's interpreted by the language, think of `v1.20.CallFunction`. -2. We cannot use `_` because golint complains about it. The code is actually valid, but it looks probably more weird: `v1_20.CallFunction`. - -For instance, if you want to modify a type that was available in the version `1.21` of the API but it will have different fields in the version `1.22`, you want to create a new package under `api/types/versions/v1p21`. diff --git a/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go b/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go index 55fc5d38..bbd9ff0b 100644 --- a/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go +++ b/vendor/github.com/docker/docker/api/types/volume/cluster_volume.go @@ -238,13 +238,13 @@ type TopologyRequirement struct { // If requisite is specified, all topologies in preferred list MUST // also be present in the list of requisite topologies. // - // If the SP is unable to to make the provisioned volume available + // If the SP is unable to make the provisioned volume available // from any of the preferred topologies, the SP MAY choose a topology // from the list of requisite topologies. // If the list of requisite topologies is not specified, then the SP // MAY choose from the list of all possible topologies. // If the list of requisite topologies is specified and the SP is - // unable to to make the provisioned volume available from any of the + // unable to make the provisioned volume available from any of the // requisite topologies it MUST fail the CreateVolume call. // // Example 1: @@ -254,7 +254,7 @@ type TopologyRequirement struct { // {"region": "R1", "zone": "Z3"} // preferred = // {"region": "R1", "zone": "Z3"} - // then the the SP SHOULD first attempt to make the provisioned volume + // then the SP SHOULD first attempt to make the provisioned volume // available from "zone" "Z3" in the "region" "R1" and fall back to // "zone" "Z2" in the "region" "R1" if that is not possible. // @@ -268,7 +268,7 @@ type TopologyRequirement struct { // preferred = // {"region": "R1", "zone": "Z4"}, // {"region": "R1", "zone": "Z2"} - // then the the SP SHOULD first attempt to make the provisioned volume + // then the SP SHOULD first attempt to make the provisioned volume // accessible from "zone" "Z4" in the "region" "R1" and fall back to // "zone" "Z2" in the "region" "R1" if that is not possible. If that // is not possible, the SP may choose between either the "zone" @@ -287,7 +287,7 @@ type TopologyRequirement struct { // preferred = // {"region": "R1", "zone": "Z5"}, // {"region": "R1", "zone": "Z3"} - // then the the SP SHOULD first attempt to make the provisioned volume + // then the SP SHOULD first attempt to make the provisioned volume // accessible from the combination of the two "zones" "Z5" and "Z3" in // the "region" "R1". If that's not possible, it should fall back to // a combination of "Z5" and other possibilities from the list of diff --git a/vendor/github.com/docker/docker/client/README.md b/vendor/github.com/docker/docker/client/README.md index 992f1811..f8af3ab9 100644 --- a/vendor/github.com/docker/docker/client/README.md +++ b/vendor/github.com/docker/docker/client/README.md @@ -1,8 +1,10 @@ # Go client for the Docker Engine API -The `docker` command uses this package to communicate with the daemon. It can also be used by your own Go applications to do anything the command-line interface does – running containers, pulling images, managing swarms, etc. +The `docker` command uses this package to communicate with the daemon. It can +also be used by your own Go applications to do anything the command-line +interface does – running containers, pulling images, managing swarms, etc. -For example, to list running containers (the equivalent of `docker ps`): +For example, to list all containers (the equivalent of `docker ps --all`): ```go package main @@ -11,25 +13,26 @@ import ( "context" "fmt" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" ) func main() { - cli, err := client.NewClientWithOpts(client.FromEnv) + apiClient, err := client.NewClientWithOpts(client.FromEnv) if err != nil { panic(err) } + defer apiClient.Close() - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) + containers, err := apiClient.ContainerList(context.Background(), container.ListOptions{All: true}) if err != nil { panic(err) } - for _, container := range containers { - fmt.Printf("%s %s\n", container.ID[:10], container.Image) + for _, ctr := range containers { + fmt.Printf("%s %s (status: %s)\n", ctr.ID, ctr.Image, ctr.Status) } } ``` -[Full documentation is available on GoDoc.](https://godoc.org/github.com/docker/docker/client) +[Full documentation is available on pkg.go.dev.](https://pkg.go.dev/github.com/docker/docker/client) diff --git a/vendor/github.com/docker/docker/client/build_prune.go b/vendor/github.com/docker/docker/client/build_prune.go index 2b660623..1a830f41 100644 --- a/vendor/github.com/docker/docker/client/build_prune.go +++ b/vendor/github.com/docker/docker/client/build_prune.go @@ -13,7 +13,7 @@ import ( // BuildCachePrune requests the daemon to delete unused cache data func (cli *Client) BuildCachePrune(ctx context.Context, opts types.BuildCachePruneOptions) (*types.BuildCachePruneReport, error) { - if err := cli.NewVersionError("1.31", "build prune"); err != nil { + if err := cli.NewVersionError(ctx, "1.31", "build prune"); err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/checkpoint_create.go b/vendor/github.com/docker/docker/client/checkpoint_create.go index 921024fe..9746d288 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_create.go +++ b/vendor/github.com/docker/docker/client/checkpoint_create.go @@ -3,11 +3,11 @@ package client // import "github.com/docker/docker/client" import ( "context" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/checkpoint" ) // CheckpointCreate creates a checkpoint from the given container with the given name -func (cli *Client) CheckpointCreate(ctx context.Context, container string, options types.CheckpointCreateOptions) error { +func (cli *Client) CheckpointCreate(ctx context.Context, container string, options checkpoint.CreateOptions) error { resp, err := cli.post(ctx, "/containers/"+container+"/checkpoints", nil, options, nil) ensureReaderClosed(resp) return err diff --git a/vendor/github.com/docker/docker/client/checkpoint_delete.go b/vendor/github.com/docker/docker/client/checkpoint_delete.go index 54f55fa7..b968c2b2 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_delete.go +++ b/vendor/github.com/docker/docker/client/checkpoint_delete.go @@ -4,11 +4,11 @@ import ( "context" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/checkpoint" ) // CheckpointDelete deletes the checkpoint with the given name from the given container -func (cli *Client) CheckpointDelete(ctx context.Context, containerID string, options types.CheckpointDeleteOptions) error { +func (cli *Client) CheckpointDelete(ctx context.Context, containerID string, options checkpoint.DeleteOptions) error { query := url.Values{} if options.CheckpointDir != "" { query.Set("dir", options.CheckpointDir) diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go index 39cfb959..8feb1f3f 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_list.go +++ b/vendor/github.com/docker/docker/client/checkpoint_list.go @@ -5,12 +5,12 @@ import ( "encoding/json" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/checkpoint" ) // CheckpointList returns the checkpoints of the given container in the docker host -func (cli *Client) CheckpointList(ctx context.Context, container string, options types.CheckpointListOptions) ([]types.Checkpoint, error) { - var checkpoints []types.Checkpoint +func (cli *Client) CheckpointList(ctx context.Context, container string, options checkpoint.ListOptions) ([]checkpoint.Summary, error) { + var checkpoints []checkpoint.Summary query := url.Values{} if options.CheckpointDir != "" { diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go index 54fa36cc..f2eeb6c5 100644 --- a/vendor/github.com/docker/docker/client/client.go +++ b/vendor/github.com/docker/docker/client/client.go @@ -19,7 +19,7 @@ For example, to list running containers (the equivalent of "docker ps"): "context" "fmt" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" ) @@ -29,13 +29,13 @@ For example, to list running containers (the equivalent of "docker ps"): panic(err) } - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) + containers, err := cli.ContainerList(context.Background(), container.ListOptions{}) if err != nil { panic(err) } - for _, container := range containers { - fmt.Printf("%s %s\n", container.ID[:10], container.Image) + for _, ctr := range containers { + fmt.Printf("%s %s\n", ctr.ID, ctr.Image) } } */ @@ -43,17 +43,21 @@ package client // import "github.com/docker/docker/client" import ( "context" + "crypto/tls" "net" "net/http" "net/url" "path" "strings" + "time" "github.com/docker/docker/api" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" "github.com/docker/go-connections/sockets" "github.com/pkg/errors" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" + "go.opentelemetry.io/otel/trace" ) // DummyHost is a hostname used for local communication. @@ -86,8 +90,12 @@ import ( // [Go stdlib]: https://github.com/golang/go/blob/6244b1946bc2101b01955468f1be502dbadd6807/src/net/http/transport.go#L558-L569 const DummyHost = "api.moby.localhost" -// ErrRedirect is the error returned by checkRedirect when the request is non-GET. -var ErrRedirect = errors.New("unexpected redirect in response") +// fallbackAPIVersion is the version to fallback to if API-version negotiation +// fails. This version is the highest version of the API before API-version +// negotiation was introduced. If negotiation fails (or no API version was +// included in the API response), we assume the API server uses the most +// recent version before negotiation was introduced. +const fallbackAPIVersion = "1.24" // Client is the API client that performs all operations // against a docker server. @@ -106,7 +114,12 @@ type Client struct { client *http.Client // version of the server to talk to. version string - // custom http headers configured by users. + // userAgent is the User-Agent header to use for HTTP requests. It takes + // precedence over User-Agent headers set in customHTTPHeaders, and other + // header variables. When set to an empty string, the User-Agent header + // is removed, and no header is sent. + userAgent *string + // custom HTTP headers configured by users. customHTTPHeaders map[string]string // manualOverride is set to true when the version was set by users. manualOverride bool @@ -119,22 +132,33 @@ type Client struct { // negotiated indicates that API version negotiation took place negotiated bool + + tp trace.TracerProvider + + // When the client transport is an *http.Transport (default) we need to do some extra things (like closing idle connections). + // Store the original transport as the http.Client transport will be wrapped with tracing libs. + baseTransport *http.Transport } -// CheckRedirect specifies the policy for dealing with redirect responses: -// If the request is non-GET return ErrRedirect, otherwise use the last response. +// ErrRedirect is the error returned by checkRedirect when the request is non-GET. +var ErrRedirect = errors.New("unexpected redirect in response") + +// CheckRedirect specifies the policy for dealing with redirect responses. It +// can be set on [http.Client.CheckRedirect] to prevent HTTP redirects for +// non-GET requests. It returns an [ErrRedirect] for non-GET request, otherwise +// returns a [http.ErrUseLastResponse], which is special-cased by http.Client +// to use the last response. // -// Go 1.8 changes behavior for HTTP redirects (specifically 301, 307, and 308) -// in the client. The Docker client (and by extension docker API client) can be -// made to send a request like POST /containers//start where what would normally -// be in the name section of the URL is empty. This triggers an HTTP 301 from -// the daemon. +// Go 1.8 changed behavior for HTTP redirects (specifically 301, 307, and 308) +// in the client. The client (and by extension API client) can be made to send +// a request like "POST /containers//start" where what would normally be in the +// name section of the URL is empty. This triggers an HTTP 301 from the daemon. // -// In go 1.8 this 301 will be converted to a GET request, and ends up getting +// In go 1.8 this 301 is converted to a GET request, and ends up getting // a 404 from the daemon. This behavior change manifests in the client in that // before, the 301 was not followed and the client did not generate an error, -// but now results in a message like Error response from daemon: page not found. -func CheckRedirect(req *http.Request, via []*http.Request) error { +// but now results in a message like "Error response from daemon: page not found". +func CheckRedirect(_ *http.Request, via []*http.Request) error { if via[0].Method == http.MethodGet { return http.ErrUseLastResponse } @@ -145,11 +169,11 @@ func CheckRedirect(req *http.Request, via []*http.Request) error { // default API host and version. It also initializes the custom HTTP headers to // add to each request. // -// It takes an optional list of Opt functional arguments, which are applied in +// It takes an optional list of [Opt] functional arguments, which are applied in // the order they're provided, which allows modifying the defaults when creating // the client. For example, the following initializes a client that configures -// itself with values from environment variables (client.FromEnv), and has -// automatic API version negotiation enabled (client.WithAPIVersionNegotiation()). +// itself with values from environment variables ([FromEnv]), and has automatic +// API version negotiation enabled ([WithAPIVersionNegotiation]). // // cli, err := client.NewClientWithOpts( // client.FromEnv, @@ -179,23 +203,43 @@ func NewClientWithOpts(ops ...Opt) (*Client, error) { } } + if tr, ok := c.client.Transport.(*http.Transport); ok { + // Store the base transport before we wrap it in tracing libs below + // This is used, as an example, to close idle connections when the client is closed + c.baseTransport = tr + } + if c.scheme == "" { - c.scheme = "http" - - tlsConfig := resolveTLSConfig(c.client.Transport) - if tlsConfig != nil { - // TODO(stevvooe): This isn't really the right way to write clients in Go. - // `NewClient` should probably only take an `*http.Client` and work from there. - // Unfortunately, the model of having a host-ish/url-thingy as the connection - // string has us confusing protocol and transport layers. We continue doing - // this to avoid breaking existing clients but this should be addressed. + // TODO(stevvooe): This isn't really the right way to write clients in Go. + // `NewClient` should probably only take an `*http.Client` and work from there. + // Unfortunately, the model of having a host-ish/url-thingy as the connection + // string has us confusing protocol and transport layers. We continue doing + // this to avoid breaking existing clients but this should be addressed. + if c.tlsConfig() != nil { c.scheme = "https" + } else { + c.scheme = "http" } } + c.client.Transport = otelhttp.NewTransport( + c.client.Transport, + otelhttp.WithTracerProvider(c.tp), + otelhttp.WithSpanNameFormatter(func(_ string, req *http.Request) string { + return req.Method + " " + req.URL.Path + }), + ) + return c, nil } +func (cli *Client) tlsConfig() *tls.Config { + if cli.baseTransport == nil { + return nil + } + return cli.baseTransport.TLSClientConfig +} + func defaultHTTPClient(hostURL *url.URL) (*http.Client, error) { transport := &http.Transport{} err := sockets.ConfigureTransport(transport, hostURL.Scheme, hostURL.Host) @@ -210,19 +254,33 @@ func defaultHTTPClient(hostURL *url.URL) (*http.Client, error) { // Close the transport used by the client func (cli *Client) Close() error { - if t, ok := cli.client.Transport.(*http.Transport); ok { - t.CloseIdleConnections() + if cli.baseTransport != nil { + cli.baseTransport.CloseIdleConnections() + return nil + } + return nil +} + +// checkVersion manually triggers API version negotiation (if configured). +// This allows for version-dependent code to use the same version as will +// be negotiated when making the actual requests, and for which cases +// we cannot do the negotiation lazily. +func (cli *Client) checkVersion(ctx context.Context) error { + if !cli.manualOverride && cli.negotiateVersion && !cli.negotiated { + ping, err := cli.Ping(ctx) + if err != nil { + return err + } + cli.negotiateAPIVersionPing(ping) } return nil } -// getAPIPath returns the versioned request path to call the api. +// getAPIPath returns the versioned request path to call the API. // It appends the query parameters to the path if they are not empty. func (cli *Client) getAPIPath(ctx context.Context, p string, query url.Values) string { var apiPath string - if cli.negotiateVersion && !cli.negotiated { - cli.NegotiateAPIVersion(ctx) - } + _ = cli.checkVersion(ctx) if cli.version != "" { v := strings.TrimPrefix(cli.version, "v") apiPath = path.Join(cli.basePath, "/v"+v, p) @@ -244,8 +302,8 @@ func (cli *Client) ClientVersion() string { // by the client, it uses the client's maximum version. // // If a manual override is in place, either through the "DOCKER_API_VERSION" -// (EnvOverrideAPIVersion) environment variable, or if the client is initialized -// with a fixed version (WithVersion(xx)), no negotiation is performed. +// ([EnvOverrideAPIVersion]) environment variable, or if the client is initialized +// with a fixed version ([WithVersion]), no negotiation is performed. // // If the API server's ping response does not contain an API version, or if the // client did not get a successful ping response, it assumes it is connected with @@ -254,7 +312,11 @@ func (cli *Client) ClientVersion() string { // added (1.24). func (cli *Client) NegotiateAPIVersion(ctx context.Context) { if !cli.manualOverride { - ping, _ := cli.Ping(ctx) + ping, err := cli.Ping(ctx) + if err != nil { + // FIXME(thaJeztah): Ping returns an error when failing to connect to the API; we should not swallow the error here, and instead returning it. + return + } cli.negotiateAPIVersionPing(ping) } } @@ -265,8 +327,8 @@ func (cli *Client) NegotiateAPIVersion(ctx context.Context) { // version. // // If a manual override is in place, either through the "DOCKER_API_VERSION" -// (EnvOverrideAPIVersion) environment variable, or if the client is initialized -// with a fixed version (WithVersion(xx)), no negotiation is performed. +// ([EnvOverrideAPIVersion]) environment variable, or if the client is initialized +// with a fixed version ([WithVersion]), no negotiation is performed. // // If the API server's ping response does not contain an API version, we assume // we are connected with an old daemon without API version negotiation support, @@ -283,7 +345,7 @@ func (cli *Client) NegotiateAPIVersionPing(pingResponse types.Ping) { func (cli *Client) negotiateAPIVersionPing(pingResponse types.Ping) { // default to the latest version before versioning headers existed if pingResponse.APIVersion == "" { - pingResponse.APIVersion = "1.24" + pingResponse.APIVersion = fallbackAPIVersion } // if the client is not initialized with a version, start with the latest supported version @@ -338,17 +400,40 @@ func ParseHostURL(host string) (*url.URL, error) { }, nil } +func (cli *Client) dialerFromTransport() func(context.Context, string, string) (net.Conn, error) { + if cli.baseTransport == nil || cli.baseTransport.DialContext == nil { + return nil + } + + if cli.baseTransport.TLSClientConfig != nil { + // When using a tls config we don't use the configured dialer but instead a fallback dialer... + // Note: It seems like this should use the normal dialer and wrap the returned net.Conn in a tls.Conn + // I honestly don't know why it doesn't do that, but it doesn't and such a change is entirely unrelated to the change in this commit. + return nil + } + return cli.baseTransport.DialContext +} + // Dialer returns a dialer for a raw stream connection, with an HTTP/1.1 header, -// that can be used for proxying the daemon connection. +// that can be used for proxying the daemon connection. It is used by +// ["docker dial-stdio"]. // -// Used by `docker dial-stdio` (docker/cli#889). +// ["docker dial-stdio"]: https://github.com/docker/cli/pull/1014 func (cli *Client) Dialer() func(context.Context) (net.Conn, error) { return func(ctx context.Context) (net.Conn, error) { - if transport, ok := cli.client.Transport.(*http.Transport); ok { - if transport.DialContext != nil && transport.TLSClientConfig == nil { - return transport.DialContext(ctx, cli.proto, cli.addr) + if dialFn := cli.dialerFromTransport(); dialFn != nil { + return dialFn(ctx, cli.proto, cli.addr) + } + switch cli.proto { + case "unix": + return net.Dial(cli.proto, cli.addr) + case "npipe": + return sockets.DialPipe(cli.addr, 32*time.Second) + default: + if tlsConfig := cli.tlsConfig(); tlsConfig != nil { + return tls.Dial(cli.proto, cli.addr, tlsConfig) } + return net.Dial(cli.proto, cli.addr) } - return fallbackDial(cli.proto, cli.addr, resolveTLSConfig(cli.client.Transport)) } } diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go index 319b738d..9fe78ea4 100644 --- a/vendor/github.com/docker/docker/client/client_unix.go +++ b/vendor/github.com/docker/docker/client/client_unix.go @@ -1,5 +1,4 @@ //go:build !windows -// +build !windows package client // import "github.com/docker/docker/client" diff --git a/vendor/github.com/docker/docker/client/config_create.go b/vendor/github.com/docker/docker/client/config_create.go index f6b1881f..3deb4a8e 100644 --- a/vendor/github.com/docker/docker/client/config_create.go +++ b/vendor/github.com/docker/docker/client/config_create.go @@ -11,7 +11,7 @@ import ( // ConfigCreate creates a new config. func (cli *Client) ConfigCreate(ctx context.Context, config swarm.ConfigSpec) (types.ConfigCreateResponse, error) { var response types.ConfigCreateResponse - if err := cli.NewVersionError("1.30", "config create"); err != nil { + if err := cli.NewVersionError(ctx, "1.30", "config create"); err != nil { return response, err } resp, err := cli.post(ctx, "/configs/create", nil, config, nil) diff --git a/vendor/github.com/docker/docker/client/config_inspect.go b/vendor/github.com/docker/docker/client/config_inspect.go index 9be7882c..2c6c7cb3 100644 --- a/vendor/github.com/docker/docker/client/config_inspect.go +++ b/vendor/github.com/docker/docker/client/config_inspect.go @@ -14,7 +14,7 @@ func (cli *Client) ConfigInspectWithRaw(ctx context.Context, id string) (swarm.C if id == "" { return swarm.Config{}, nil, objectNotFoundError{object: "config", id: id} } - if err := cli.NewVersionError("1.30", "config inspect"); err != nil { + if err := cli.NewVersionError(ctx, "1.30", "config inspect"); err != nil { return swarm.Config{}, nil, err } resp, err := cli.get(ctx, "/configs/"+id, nil, nil) diff --git a/vendor/github.com/docker/docker/client/config_list.go b/vendor/github.com/docker/docker/client/config_list.go index 565acc6e..14dd3813 100644 --- a/vendor/github.com/docker/docker/client/config_list.go +++ b/vendor/github.com/docker/docker/client/config_list.go @@ -12,7 +12,7 @@ import ( // ConfigList returns the list of configs. func (cli *Client) ConfigList(ctx context.Context, options types.ConfigListOptions) ([]swarm.Config, error) { - if err := cli.NewVersionError("1.30", "config list"); err != nil { + if err := cli.NewVersionError(ctx, "1.30", "config list"); err != nil { return nil, err } query := url.Values{} diff --git a/vendor/github.com/docker/docker/client/config_remove.go b/vendor/github.com/docker/docker/client/config_remove.go index 24b94e9c..d05b0113 100644 --- a/vendor/github.com/docker/docker/client/config_remove.go +++ b/vendor/github.com/docker/docker/client/config_remove.go @@ -4,7 +4,7 @@ import "context" // ConfigRemove removes a config. func (cli *Client) ConfigRemove(ctx context.Context, id string) error { - if err := cli.NewVersionError("1.30", "config remove"); err != nil { + if err := cli.NewVersionError(ctx, "1.30", "config remove"); err != nil { return err } resp, err := cli.delete(ctx, "/configs/"+id, nil, nil) diff --git a/vendor/github.com/docker/docker/client/config_update.go b/vendor/github.com/docker/docker/client/config_update.go index 1ac29854..6995861d 100644 --- a/vendor/github.com/docker/docker/client/config_update.go +++ b/vendor/github.com/docker/docker/client/config_update.go @@ -9,7 +9,7 @@ import ( // ConfigUpdate attempts to update a config func (cli *Client) ConfigUpdate(ctx context.Context, id string, version swarm.Version, config swarm.ConfigSpec) error { - if err := cli.NewVersionError("1.30", "config update"); err != nil { + if err := cli.NewVersionError(ctx, "1.30", "config update"); err != nil { return err } query := url.Values{} diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go index ba92117d..6a32e5f6 100644 --- a/vendor/github.com/docker/docker/client/container_attach.go +++ b/vendor/github.com/docker/docker/client/container_attach.go @@ -2,9 +2,11 @@ package client // import "github.com/docker/docker/client" import ( "context" + "net/http" "net/url" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" ) // ContainerAttach attaches a connection to a container in the server. @@ -31,7 +33,7 @@ import ( // // You can use github.com/docker/docker/pkg/stdcopy.StdCopy to demultiplex this // stream. -func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) { +func (cli *Client) ContainerAttach(ctx context.Context, container string, options container.AttachOptions) (types.HijackedResponse, error) { query := url.Values{} if options.Stream { query.Set("stream", "1") @@ -52,8 +54,7 @@ func (cli *Client) ContainerAttach(ctx context.Context, container string, option query.Set("logs", "1") } - headers := map[string][]string{ + return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, http.Header{ "Content-Type": {"text/plain"}, - } - return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, headers) + }) } diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go index cd7f7634..26b3f091 100644 --- a/vendor/github.com/docker/docker/client/container_commit.go +++ b/vendor/github.com/docker/docker/client/container_commit.go @@ -6,12 +6,13 @@ import ( "errors" "net/url" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" ) // ContainerCommit applies changes to a container and creates a new tagged image. -func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) { +func (cli *Client) ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error) { var repository, tag string if options.Reference != "" { ref, err := reference.ParseNormalizedNamed(options.Reference) diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go index 193a2bb5..5442d426 100644 --- a/vendor/github.com/docker/docker/client/container_create.go +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -23,10 +23,25 @@ type configWrapper struct { func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error) { var response container.CreateResponse - if err := cli.NewVersionError("1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { return response, err } - if err := cli.NewVersionError("1.41", "specify container image platform"); platform != nil && err != nil { + + if err := cli.NewVersionError(ctx, "1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { + return response, err + } + if err := cli.NewVersionError(ctx, "1.41", "specify container image platform"); platform != nil && err != nil { + return response, err + } + if err := cli.NewVersionError(ctx, "1.44", "specify health-check start interval"); config != nil && config.Healthcheck != nil && config.Healthcheck.StartInterval != 0 && err != nil { + return response, err + } + if err := cli.NewVersionError(ctx, "1.44", "specify mac-address per network"); hasEndpointSpecificMacAddress(networkingConfig) && err != nil { return response, err } @@ -45,6 +60,11 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config } } + // Since API 1.44, the container-wide MacAddress is deprecated and will trigger a WARNING if it's specified. + if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.44") { + config.MacAddress = "" //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + } + query := url.Values{} if p := formatPlatform(platform); p != "" { query.Set("platform", p) @@ -81,3 +101,16 @@ func formatPlatform(platform *ocispec.Platform) string { } return path.Join(platform.OS, platform.Architecture, platform.Variant) } + +// hasEndpointSpecificMacAddress checks whether one of the endpoint in networkingConfig has a MacAddress defined. +func hasEndpointSpecificMacAddress(networkingConfig *network.NetworkingConfig) bool { + if networkingConfig == nil { + return false + } + for _, endpoint := range networkingConfig.EndpointsConfig { + if endpoint.MacAddress != "" { + return true + } + } + return false +} diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go index 6a2cb006..526a3876 100644 --- a/vendor/github.com/docker/docker/client/container_exec.go +++ b/vendor/github.com/docker/docker/client/container_exec.go @@ -3,6 +3,7 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" + "net/http" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" @@ -12,7 +13,16 @@ import ( func (cli *Client) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) { var response types.IDResponse - if err := cli.NewVersionError("1.25", "env"); len(config.Env) != 0 && err != nil { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return response, err + } + + if err := cli.NewVersionError(ctx, "1.25", "env"); len(config.Env) != 0 && err != nil { return response, err } if versions.LessThan(cli.ClientVersion(), "1.42") { @@ -46,10 +56,9 @@ func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, confi if versions.LessThan(cli.ClientVersion(), "1.42") { config.ConsoleSize = nil } - headers := map[string][]string{ + return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, http.Header{ "Content-Type": {"application/json"}, - } - return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) + }) } // ContainerExecInspect returns information about a specific exec process on the docker host. diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go index bd491b3d..782e1b3c 100644 --- a/vendor/github.com/docker/docker/client/container_list.go +++ b/vendor/github.com/docker/docker/client/container_list.go @@ -7,11 +7,12 @@ import ( "strconv" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" ) // ContainerList returns the list of containers in the docker host. -func (cli *Client) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) { +func (cli *Client) ContainerList(ctx context.Context, options container.ListOptions) ([]types.Container, error) { query := url.Values{} if options.All { @@ -37,7 +38,6 @@ func (cli *Client) ContainerList(ctx context.Context, options types.ContainerLis if options.Filters.Len() > 0 { //nolint:staticcheck // ignore SA1019 for old code filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) - if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go index 9bdf2b0f..61197d84 100644 --- a/vendor/github.com/docker/docker/client/container_logs.go +++ b/vendor/github.com/docker/docker/client/container_logs.go @@ -6,7 +6,7 @@ import ( "net/url" "time" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" timetypes "github.com/docker/docker/api/types/time" "github.com/pkg/errors" ) @@ -33,7 +33,7 @@ import ( // // You can use github.com/docker/docker/pkg/stdcopy.StdCopy to demultiplex this // stream. -func (cli *Client) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) { +func (cli *Client) ContainerLogs(ctx context.Context, container string, options container.LogsOptions) (io.ReadCloser, error) { query := url.Values{} if options.ShowStdout { query.Set("stdout", "1") diff --git a/vendor/github.com/docker/docker/client/container_prune.go b/vendor/github.com/docker/docker/client/container_prune.go index 04383dea..ca509238 100644 --- a/vendor/github.com/docker/docker/client/container_prune.go +++ b/vendor/github.com/docker/docker/client/container_prune.go @@ -13,7 +13,7 @@ import ( func (cli *Client) ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) { var report types.ContainersPruneReport - if err := cli.NewVersionError("1.25", "container prune"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "container prune"); err != nil { return report, err } diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go index c21de609..39f7b106 100644 --- a/vendor/github.com/docker/docker/client/container_remove.go +++ b/vendor/github.com/docker/docker/client/container_remove.go @@ -4,11 +4,11 @@ import ( "context" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" ) // ContainerRemove kills and removes a container from the docker host. -func (cli *Client) ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error { +func (cli *Client) ContainerRemove(ctx context.Context, containerID string, options container.RemoveOptions) error { query := url.Values{} if options.RemoveVolumes { query.Set("v", "1") diff --git a/vendor/github.com/docker/docker/client/container_resize.go b/vendor/github.com/docker/docker/client/container_resize.go index a9d4c0c7..5cfd01d4 100644 --- a/vendor/github.com/docker/docker/client/container_resize.go +++ b/vendor/github.com/docker/docker/client/container_resize.go @@ -5,16 +5,16 @@ import ( "net/url" "strconv" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" ) // ContainerResize changes the size of the tty for a container. -func (cli *Client) ContainerResize(ctx context.Context, containerID string, options types.ResizeOptions) error { +func (cli *Client) ContainerResize(ctx context.Context, containerID string, options container.ResizeOptions) error { return cli.resize(ctx, "/containers/"+containerID, options.Height, options.Width) } // ContainerExecResize changes the size of the tty for an exec process running inside a container. -func (cli *Client) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error { +func (cli *Client) ContainerExecResize(ctx context.Context, execID string, options container.ResizeOptions) error { return cli.resize(ctx, "/exec/"+execID, options.Height, options.Width) } diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go index 1e0ad999..02b5079b 100644 --- a/vendor/github.com/docker/docker/client/container_restart.go +++ b/vendor/github.com/docker/docker/client/container_restart.go @@ -17,8 +17,18 @@ func (cli *Client) ContainerRestart(ctx context.Context, containerID string, opt if options.Timeout != nil { query.Set("t", strconv.Itoa(*options.Timeout)) } - if options.Signal != "" && versions.GreaterThanOrEqualTo(cli.version, "1.42") { - query.Set("signal", options.Signal) + if options.Signal != "" { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return err + } + if versions.GreaterThanOrEqualTo(cli.version, "1.42") { + query.Set("signal", options.Signal) + } } resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil) ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/container_start.go b/vendor/github.com/docker/docker/client/container_start.go index c2e0b15d..33ba85f2 100644 --- a/vendor/github.com/docker/docker/client/container_start.go +++ b/vendor/github.com/docker/docker/client/container_start.go @@ -4,11 +4,11 @@ import ( "context" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" ) // ContainerStart sends a request to the docker daemon to start a container. -func (cli *Client) ContainerStart(ctx context.Context, containerID string, options types.ContainerStartOptions) error { +func (cli *Client) ContainerStart(ctx context.Context, containerID string, options container.StartOptions) error { query := url.Values{} if len(options.CheckpointID) != 0 { query.Set("checkpoint", options.CheckpointID) diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go index 0a6488dd..3fabb75f 100644 --- a/vendor/github.com/docker/docker/client/container_stats.go +++ b/vendor/github.com/docker/docker/client/container_stats.go @@ -21,8 +21,10 @@ func (cli *Client) ContainerStats(ctx context.Context, containerID string, strea return types.ContainerStats{}, err } - osType := getDockerOS(resp.header.Get("Server")) - return types.ContainerStats{Body: resp.body, OSType: osType}, err + return types.ContainerStats{ + Body: resp.body, + OSType: getDockerOS(resp.header.Get("Server")), + }, nil } // ContainerStatsOneShot gets a single stat entry from a container. @@ -37,6 +39,8 @@ func (cli *Client) ContainerStatsOneShot(ctx context.Context, containerID string return types.ContainerStats{}, err } - osType := getDockerOS(resp.header.Get("Server")) - return types.ContainerStats{Body: resp.body, OSType: osType}, err + return types.ContainerStats{ + Body: resp.body, + OSType: getDockerOS(resp.header.Get("Server")), + }, nil } diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go index 2a43ce22..7c98a354 100644 --- a/vendor/github.com/docker/docker/client/container_stop.go +++ b/vendor/github.com/docker/docker/client/container_stop.go @@ -21,8 +21,18 @@ func (cli *Client) ContainerStop(ctx context.Context, containerID string, option if options.Timeout != nil { query.Set("t", strconv.Itoa(*options.Timeout)) } - if options.Signal != "" && versions.GreaterThanOrEqualTo(cli.version, "1.42") { - query.Set("signal", options.Signal) + if options.Signal != "" { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return err + } + if versions.GreaterThanOrEqualTo(cli.version, "1.42") { + query.Set("signal", options.Signal) + } } resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil) ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go index 2375eb1e..8bb6be0a 100644 --- a/vendor/github.com/docker/docker/client/container_wait.go +++ b/vendor/github.com/docker/docker/client/container_wait.go @@ -30,13 +30,22 @@ const containerWaitErrorMsgLimit = 2 * 1024 /* Max: 2KiB */ // synchronize ContainerWait with other calls, such as specifying a // "next-exit" condition before issuing a ContainerStart request. func (cli *Client) ContainerWait(ctx context.Context, containerID string, condition container.WaitCondition) (<-chan container.WaitResponse, <-chan error) { + resultC := make(chan container.WaitResponse) + errC := make(chan error, 1) + + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + errC <- err + return resultC, errC + } if versions.LessThan(cli.ClientVersion(), "1.30") { return cli.legacyContainerWait(ctx, containerID) } - resultC := make(chan container.WaitResponse) - errC := make(chan error, 1) - query := url.Values{} if condition != "" { query.Set("condition", string(condition)) @@ -66,8 +75,12 @@ func (cli *Client) ContainerWait(ctx context.Context, containerID string, condit // // If there's a JSON parsing error, read the real error message // off the body and send it to the client. - _, _ = io.ReadAll(io.LimitReader(stream, containerWaitErrorMsgLimit)) - errC <- errors.New(responseText.String()) + if errors.As(err, new(*json.SyntaxError)) { + _, _ = io.ReadAll(io.LimitReader(stream, containerWaitErrorMsgLimit)) + errC <- errors.New(responseText.String()) + } else { + errC <- err + } return } diff --git a/vendor/github.com/docker/docker/client/distribution_inspect.go b/vendor/github.com/docker/docker/client/distribution_inspect.go index efab066d..68e6ec5e 100644 --- a/vendor/github.com/docker/docker/client/distribution_inspect.go +++ b/vendor/github.com/docker/docker/client/distribution_inspect.go @@ -3,31 +3,32 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" + "net/http" "net/url" "github.com/docker/docker/api/types/registry" ) // DistributionInspect returns the image digest with the full manifest. -func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registry.DistributionInspect, error) { +func (cli *Client) DistributionInspect(ctx context.Context, imageRef, encodedRegistryAuth string) (registry.DistributionInspect, error) { // Contact the registry to retrieve digest and platform information var distributionInspect registry.DistributionInspect - if image == "" { - return distributionInspect, objectNotFoundError{object: "distribution", id: image} + if imageRef == "" { + return distributionInspect, objectNotFoundError{object: "distribution", id: imageRef} } - if err := cli.NewVersionError("1.30", "distribution inspect"); err != nil { + if err := cli.NewVersionError(ctx, "1.30", "distribution inspect"); err != nil { return distributionInspect, err } - var headers map[string][]string + var headers http.Header if encodedRegistryAuth != "" { - headers = map[string][]string{ + headers = http.Header{ registry.AuthHeader: {encodedRegistryAuth}, } } - resp, err := cli.get(ctx, "/distribution/"+image+"/json", url.Values{}, headers) + resp, err := cli.get(ctx, "/distribution/"+imageRef+"/json", url.Values{}, headers) defer ensureReaderClosed(resp) if err != nil { return distributionInspect, err diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go index 6878144c..0d01e243 100644 --- a/vendor/github.com/docker/docker/client/errors.go +++ b/vendor/github.com/docker/docker/client/errors.go @@ -1,6 +1,7 @@ package client // import "github.com/docker/docker/client" import ( + "context" "fmt" "github.com/docker/docker/api/types/versions" @@ -10,15 +11,16 @@ import ( // errConnectionFailed implements an error returned when connection failed. type errConnectionFailed struct { - host string + error } // Error returns a string representation of an errConnectionFailed -func (err errConnectionFailed) Error() string { - if err.host == "" { - return "Cannot connect to the Docker daemon. Is the docker daemon running on this host?" - } - return fmt.Sprintf("Cannot connect to the Docker daemon at %s. Is the docker daemon running?", err.host) +func (e errConnectionFailed) Error() string { + return e.error.Error() +} + +func (e errConnectionFailed) Unwrap() error { + return e.error } // IsErrConnectionFailed returns true if the error is caused by connection failed. @@ -28,23 +30,19 @@ func IsErrConnectionFailed(err error) bool { // ErrorConnectionFailed returns an error with host in the error message when connection to docker daemon failed. func ErrorConnectionFailed(host string) error { - return errConnectionFailed{host: host} -} - -// Deprecated: use the errdefs.NotFound() interface instead. Kept for backward compatibility -type notFound interface { - error - NotFound() bool + var err error + if host == "" { + err = fmt.Errorf("Cannot connect to the Docker daemon. Is the docker daemon running on this host?") + } else { + err = fmt.Errorf("Cannot connect to the Docker daemon at %s. Is the docker daemon running?", host) + } + return errConnectionFailed{error: err} } // IsErrNotFound returns true if the error is a NotFound error, which is returned -// by the API when some object is not found. +// by the API when some object is not found. It is an alias for [errdefs.IsNotFound]. func IsErrNotFound(err error) bool { - if errdefs.IsNotFound(err) { - return true - } - var e notFound - return errors.As(err, &e) + return errdefs.IsNotFound(err) } type objectNotFoundError struct { @@ -58,9 +56,20 @@ func (e objectNotFoundError) Error() string { return fmt.Sprintf("Error: No such %s: %s", e.object, e.id) } -// NewVersionError returns an error if the APIVersion required -// if less than the current supported version -func (cli *Client) NewVersionError(APIrequired, feature string) error { +// NewVersionError returns an error if the APIVersion required is less than the +// current supported version. +// +// It performs API-version negotiation if the Client is configured with this +// option, otherwise it assumes the latest API version is used. +func (cli *Client) NewVersionError(ctx context.Context, APIrequired, feature string) error { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return err + } if cli.version != "" && versions.LessThan(cli.version, APIrequired) { return fmt.Errorf("%q requires API version %s, but the Docker daemon API version is %s", feature, APIrequired, cli.version) } diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go index 7e84865f..839d4c5c 100644 --- a/vendor/github.com/docker/docker/client/hijack.go +++ b/vendor/github.com/docker/docker/client/hijack.go @@ -3,18 +3,16 @@ package client // import "github.com/docker/docker/client" import ( "bufio" "context" - "crypto/tls" "fmt" "net" "net/http" - "net/http/httputil" "net/url" "time" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" - "github.com/docker/go-connections/sockets" "github.com/pkg/errors" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) // postHijacked sends a POST request and hijacks the connection. @@ -23,11 +21,11 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu if err != nil { return types.HijackedResponse{}, err } - req, err := cli.buildRequest(http.MethodPost, cli.getAPIPath(ctx, path, query), bodyEncoded, headers) + req, err := cli.buildRequest(ctx, http.MethodPost, cli.getAPIPath(ctx, path, query), bodyEncoded, headers) if err != nil { return types.HijackedResponse{}, err } - conn, mediaType, err := cli.setupHijackConn(ctx, req, "tcp") + conn, mediaType, err := cli.setupHijackConn(req, "tcp") if err != nil { return types.HijackedResponse{}, err } @@ -37,29 +35,18 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu // DialHijack returns a hijacked connection with negotiated protocol proto. func (cli *Client) DialHijack(ctx context.Context, url, proto string, meta map[string][]string) (net.Conn, error) { - req, err := http.NewRequest(http.MethodPost, url, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, nil) if err != nil { return nil, err } req = cli.addHeaders(req, meta) - conn, _, err := cli.setupHijackConn(ctx, req, proto) + conn, _, err := cli.setupHijackConn(req, proto) return conn, err } -// fallbackDial is used when WithDialer() was not called. -// See cli.Dialer(). -func fallbackDial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) { - if tlsConfig != nil && proto != "unix" && proto != "npipe" { - return tls.Dial(proto, addr, tlsConfig) - } - if proto == "npipe" { - return sockets.DialPipe(addr, 32*time.Second) - } - return net.Dial(proto, addr) -} - -func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto string) (net.Conn, string, error) { +func (cli *Client) setupHijackConn(req *http.Request, proto string) (_ net.Conn, _ string, retErr error) { + ctx := req.Context() req.Header.Set("Connection", "Upgrade") req.Header.Set("Upgrade", proto) @@ -68,6 +55,11 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto if err != nil { return nil, "", errors.Wrap(err, "cannot connect to the Docker daemon. Is 'docker daemon' running on this host?") } + defer func() { + if retErr != nil { + conn.Close() + } + }() // When we set up a TCP connection for hijack, there could be long periods // of inactivity (a long running command with no output) that in certain @@ -79,35 +71,29 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto _ = tcpConn.SetKeepAlivePeriod(30 * time.Second) } - clientconn := httputil.NewClientConn(conn, nil) - defer clientconn.Close() + hc := &hijackedConn{conn, bufio.NewReader(conn)} // Server hijacks the connection, error 'connection closed' expected - resp, err := clientconn.Do(req) - - //nolint:staticcheck // ignore SA1019 for connecting to old (pre go1.8) daemons - if err != httputil.ErrPersistEOF { - if err != nil { - return nil, "", err - } - if resp.StatusCode != http.StatusSwitchingProtocols { - _ = resp.Body.Close() - return nil, "", fmt.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode) - } + resp, err := otelhttp.NewTransport(hc).RoundTrip(req) + if err != nil { + return nil, "", err + } + if resp.StatusCode != http.StatusSwitchingProtocols { + _ = resp.Body.Close() + return nil, "", fmt.Errorf("unable to upgrade to %s, received %d", proto, resp.StatusCode) } - c, br := clientconn.Hijack() - if br.Buffered() > 0 { + if hc.r.Buffered() > 0 { // If there is buffered content, wrap the connection. We return an // object that implements CloseWrite if the underlying connection // implements it. - if _, ok := c.(types.CloseWriter); ok { - c = &hijackedConnCloseWriter{&hijackedConn{c, br}} + if _, ok := hc.Conn.(types.CloseWriter); ok { + conn = &hijackedConnCloseWriter{hc} } else { - c = &hijackedConn{c, br} + conn = hc } } else { - br.Reset(nil) + hc.r.Reset(nil) } var mediaType string @@ -116,7 +102,7 @@ func (cli *Client) setupHijackConn(ctx context.Context, req *http.Request, proto mediaType = resp.Header.Get("Content-Type") } - return c, mediaType, nil + return conn, mediaType, nil } // hijackedConn wraps a net.Conn and is returned by setupHijackConn in the case @@ -128,6 +114,13 @@ type hijackedConn struct { r *bufio.Reader } +func (c *hijackedConn) RoundTrip(req *http.Request) (*http.Response, error) { + if err := req.Write(c.Conn); err != nil { + return nil, err + } + return http.ReadResponse(c.r, req) +} + func (c *hijackedConn) Read(b []byte) (int, error) { return c.r.Read(b) } diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go index d16e1d8e..d294ddc8 100644 --- a/vendor/github.com/docker/docker/client/image_build.go +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -18,18 +18,18 @@ import ( // The Body in the response implements an io.ReadCloser and it's up to the caller to // close it. func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { - query, err := cli.imageBuildOptionsToQuery(options) + query, err := cli.imageBuildOptionsToQuery(ctx, options) if err != nil { return types.ImageBuildResponse{}, err } - headers := http.Header(make(map[string][]string)) buf, err := json.Marshal(options.AuthConfigs) if err != nil { return types.ImageBuildResponse{}, err } - headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) + headers := http.Header{} + headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) headers.Set("Content-Type", "application/x-tar") serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) @@ -37,15 +37,13 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio return types.ImageBuildResponse{}, err } - osType := getDockerOS(serverResp.header.Get("Server")) - return types.ImageBuildResponse{ Body: serverResp.body, - OSType: osType, + OSType: getDockerOS(serverResp.header.Get("Server")), }, nil } -func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (url.Values, error) { +func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options types.ImageBuildOptions) (url.Values, error) { query := url.Values{ "t": options.Tags, "securityopt": options.SecurityOpt, @@ -75,7 +73,7 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur } if options.Squash { - if err := cli.NewVersionError("1.25", "squash"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "squash"); err != nil { return query, err } query.Set("squash", "1") @@ -125,7 +123,7 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur query.Set("session", options.SessionID) } if options.Platform != "" { - if err := cli.NewVersionError("1.32", "platform"); err != nil { + if err := cli.NewVersionError(ctx, "1.32", "platform"); err != nil { return query, err } query.Set("platform", strings.ToLower(options.Platform)) diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go index 6a9b708f..7c7873dc 100644 --- a/vendor/github.com/docker/docker/client/image_create.go +++ b/vendor/github.com/docker/docker/client/image_create.go @@ -3,17 +3,18 @@ package client // import "github.com/docker/docker/client" import ( "context" "io" + "net/http" "net/url" "strings" - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" + "github.com/distribution/reference" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/registry" ) // ImageCreate creates a new image based on the parent options. // It returns the JSON content in the response body. -func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) { +func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options image.CreateOptions) (io.ReadCloser, error) { ref, err := reference.ParseNormalizedNamed(parentReference) if err != nil { return nil, err @@ -33,6 +34,7 @@ func (cli *Client) ImageCreate(ctx context.Context, parentReference string, opti } func (cli *Client) tryImageCreate(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - return cli.post(ctx, "/images/create", query, nil, headers) + return cli.post(ctx, "/images/create", query, nil, http.Header{ + registry.AuthHeader: {registryAuth}, + }) } diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go index c5de42cb..5a890b0c 100644 --- a/vendor/github.com/docker/docker/client/image_import.go +++ b/vendor/github.com/docker/docker/client/image_import.go @@ -6,13 +6,14 @@ import ( "net/url" "strings" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/image" ) // ImageImport creates a new image based on the source options. // It returns the JSON content in the response body. -func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) { +func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error) { if ref != "" { // Check if the given image name can be resolved if _, err := reference.ParseNormalizedNamed(ref); err != nil { diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go index 950d5133..a9cc1e21 100644 --- a/vendor/github.com/docker/docker/client/image_list.go +++ b/vendor/github.com/docker/docker/client/image_list.go @@ -5,14 +5,24 @@ import ( "encoding/json" "net/url" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/versions" ) // ImageList returns a list of images in the docker host. -func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error) { - var images []types.ImageSummary +func (cli *Client) ImageList(ctx context.Context, options image.ListOptions) ([]image.Summary, error) { + var images []image.Summary + + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return images, err + } + query := url.Values{} optionFilters := options.Filters diff --git a/vendor/github.com/docker/docker/client/image_load.go b/vendor/github.com/docker/docker/client/image_load.go index 91016e49..c825206e 100644 --- a/vendor/github.com/docker/docker/client/image_load.go +++ b/vendor/github.com/docker/docker/client/image_load.go @@ -3,6 +3,7 @@ package client // import "github.com/docker/docker/client" import ( "context" "io" + "net/http" "net/url" "github.com/docker/docker/api/types" @@ -17,8 +18,9 @@ func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) ( if quiet { v.Set("quiet", "1") } - headers := map[string][]string{"Content-Type": {"application/x-tar"}} - resp, err := cli.postRaw(ctx, "/images/load", v, input, headers) + resp, err := cli.postRaw(ctx, "/images/load", v, input, http.Header{ + "Content-Type": {"application/x-tar"}, + }) if err != nil { return types.ImageLoadResponse{}, err } diff --git a/vendor/github.com/docker/docker/client/image_prune.go b/vendor/github.com/docker/docker/client/image_prune.go index 56af6d7f..6b82d6ab 100644 --- a/vendor/github.com/docker/docker/client/image_prune.go +++ b/vendor/github.com/docker/docker/client/image_prune.go @@ -13,7 +13,7 @@ import ( func (cli *Client) ImagesPrune(ctx context.Context, pruneFilters filters.Args) (types.ImagesPruneReport, error) { var report types.ImagesPruneReport - if err := cli.NewVersionError("1.25", "image prune"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "image prune"); err != nil { return report, err } diff --git a/vendor/github.com/docker/docker/client/image_pull.go b/vendor/github.com/docker/docker/client/image_pull.go index a2397559..6438cf6a 100644 --- a/vendor/github.com/docker/docker/client/image_pull.go +++ b/vendor/github.com/docker/docker/client/image_pull.go @@ -6,8 +6,8 @@ import ( "net/url" "strings" - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" + "github.com/distribution/reference" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/errdefs" ) @@ -19,7 +19,7 @@ import ( // FIXME(vdemeester): there is currently used in a few way in docker/docker // - if not in trusted content, ref is used to pass the whole reference, and tag is empty // - if in trusted content, ref is used to pass the reference name, and tag for the digest -func (cli *Client) ImagePull(ctx context.Context, refStr string, options types.ImagePullOptions) (io.ReadCloser, error) { +func (cli *Client) ImagePull(ctx context.Context, refStr string, options image.PullOptions) (io.ReadCloser, error) { ref, err := reference.ParseNormalizedNamed(refStr) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go index dd1b8f34..e6a6b11e 100644 --- a/vendor/github.com/docker/docker/client/image_push.go +++ b/vendor/github.com/docker/docker/client/image_push.go @@ -4,10 +4,11 @@ import ( "context" "errors" "io" + "net/http" "net/url" - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" + "github.com/distribution/reference" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/errdefs" ) @@ -16,7 +17,7 @@ import ( // It executes the privileged function if the operation is unauthorized // and it tries one more time. // It's up to the caller to handle the io.ReadCloser and close it properly. -func (cli *Client) ImagePush(ctx context.Context, image string, options types.ImagePushOptions) (io.ReadCloser, error) { +func (cli *Client) ImagePush(ctx context.Context, image string, options image.PushOptions) (io.ReadCloser, error) { ref, err := reference.ParseNormalizedNamed(image) if err != nil { return nil, err @@ -50,6 +51,7 @@ func (cli *Client) ImagePush(ctx context.Context, image string, options types.Im } func (cli *Client) tryImagePush(ctx context.Context, imageID string, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - return cli.post(ctx, "/images/"+imageID+"/push", query, nil, headers) + return cli.post(ctx, "/images/"+imageID+"/push", query, nil, http.Header{ + registry.AuthHeader: {registryAuth}, + }) } diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go index 6a9fb3f4..652d1bfa 100644 --- a/vendor/github.com/docker/docker/client/image_remove.go +++ b/vendor/github.com/docker/docker/client/image_remove.go @@ -5,11 +5,11 @@ import ( "encoding/json" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/image" ) // ImageRemove removes an image from the docker host. -func (cli *Client) ImageRemove(ctx context.Context, imageID string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { +func (cli *Client) ImageRemove(ctx context.Context, imageID string, options image.RemoveOptions) ([]image.DeleteResponse, error) { query := url.Values{} if options.Force { @@ -19,7 +19,7 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options type query.Set("noprune", "1") } - var dels []types.ImageDeleteResponseItem + var dels []image.DeleteResponse resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) defer ensureReaderClosed(resp) if err != nil { diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go index 5f0c49ed..8971b139 100644 --- a/vendor/github.com/docker/docker/client/image_search.go +++ b/vendor/github.com/docker/docker/client/image_search.go @@ -3,6 +3,7 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" + "net/http" "net/url" "strconv" @@ -48,6 +49,7 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options types.I } func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - return cli.get(ctx, "/images/search", query, headers) + return cli.get(ctx, "/images/search", query, http.Header{ + registry.AuthHeader: {registryAuth}, + }) } diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go index 5652bfc2..ea6b4a1e 100644 --- a/vendor/github.com/docker/docker/client/image_tag.go +++ b/vendor/github.com/docker/docker/client/image_tag.go @@ -4,7 +4,7 @@ import ( "context" "net/url" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/pkg/errors" ) diff --git a/vendor/github.com/docker/docker/client/info.go b/vendor/github.com/docker/docker/client/info.go index c856704e..cc3fcc46 100644 --- a/vendor/github.com/docker/docker/client/info.go +++ b/vendor/github.com/docker/docker/client/info.go @@ -6,12 +6,12 @@ import ( "fmt" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/system" ) // Info returns information about the docker server. -func (cli *Client) Info(ctx context.Context) (types.Info, error) { - var info types.Info +func (cli *Client) Info(ctx context.Context) (system.Info, error) { + var info system.Info serverResp, err := cli.get(ctx, "/info", url.Values{}, nil) defer ensureReaderClosed(serverResp) if err != nil { diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go index 7993c5a4..45d233f2 100644 --- a/vendor/github.com/docker/docker/client/interface.go +++ b/vendor/github.com/docker/docker/client/interface.go @@ -14,6 +14,7 @@ import ( "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/api/types/system" "github.com/docker/docker/api/types/volume" ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) @@ -45,30 +46,30 @@ type CommonAPIClient interface { // ContainerAPIClient defines API client methods for the containers type ContainerAPIClient interface { - ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) - ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) + ContainerAttach(ctx context.Context, container string, options container.AttachOptions) (types.HijackedResponse, error) + ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *ocispec.Platform, containerName string) (container.CreateResponse, error) ContainerDiff(ctx context.Context, container string) ([]container.FilesystemChange, error) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) - ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error + ContainerExecResize(ctx context.Context, execID string, options container.ResizeOptions) error ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error ContainerExport(ctx context.Context, container string) (io.ReadCloser, error) ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error) ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error) ContainerKill(ctx context.Context, container, signal string) error - ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) - ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) + ContainerList(ctx context.Context, options container.ListOptions) ([]types.Container, error) + ContainerLogs(ctx context.Context, container string, options container.LogsOptions) (io.ReadCloser, error) ContainerPause(ctx context.Context, container string) error - ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error + ContainerRemove(ctx context.Context, container string, options container.RemoveOptions) error ContainerRename(ctx context.Context, container, newContainerName string) error - ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error + ContainerResize(ctx context.Context, container string, options container.ResizeOptions) error ContainerRestart(ctx context.Context, container string, options container.StopOptions) error ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) ContainerStatsOneShot(ctx context.Context, container string) (types.ContainerStats, error) - ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error + ContainerStart(ctx context.Context, container string, options container.StartOptions) error ContainerStop(ctx context.Context, container string, options container.StopOptions) error ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error) ContainerUnpause(ctx context.Context, container string) error @@ -89,15 +90,15 @@ type ImageAPIClient interface { ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) BuildCachePrune(ctx context.Context, opts types.BuildCachePruneOptions) (*types.BuildCachePruneReport, error) BuildCancel(ctx context.Context, id string) error - ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) + ImageCreate(ctx context.Context, parentReference string, options image.CreateOptions) (io.ReadCloser, error) ImageHistory(ctx context.Context, image string) ([]image.HistoryResponseItem, error) - ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) + ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options image.ImportOptions) (io.ReadCloser, error) ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error) - ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, error) + ImageList(ctx context.Context, options image.ListOptions) ([]image.Summary, error) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) - ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) - ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error) - ImageRemove(ctx context.Context, image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) + ImagePull(ctx context.Context, ref string, options image.PullOptions) (io.ReadCloser, error) + ImagePush(ctx context.Context, ref string, options image.PushOptions) (io.ReadCloser, error) + ImageRemove(ctx context.Context, image string, options image.RemoveOptions) ([]image.DeleteResponse, error) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) ImageSave(ctx context.Context, images []string) (io.ReadCloser, error) ImageTag(ctx context.Context, image, ref string) error @@ -140,13 +141,13 @@ type PluginAPIClient interface { // ServiceAPIClient defines API client methods for the services type ServiceAPIClient interface { - ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) + ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (swarm.ServiceCreateResponse, error) ServiceInspectWithRaw(ctx context.Context, serviceID string, options types.ServiceInspectOptions) (swarm.Service, []byte, error) ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error) ServiceRemove(ctx context.Context, serviceID string) error - ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) - ServiceLogs(ctx context.Context, serviceID string, options types.ContainerLogsOptions) (io.ReadCloser, error) - TaskLogs(ctx context.Context, taskID string, options types.ContainerLogsOptions) (io.ReadCloser, error) + ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (swarm.ServiceUpdateResponse, error) + ServiceLogs(ctx context.Context, serviceID string, options container.LogsOptions) (io.ReadCloser, error) + TaskLogs(ctx context.Context, taskID string, options container.LogsOptions) (io.ReadCloser, error) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) } @@ -165,7 +166,7 @@ type SwarmAPIClient interface { // SystemAPIClient defines API client methods for the system type SystemAPIClient interface { Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) - Info(ctx context.Context) (types.Info, error) + Info(ctx context.Context) (system.Info, error) RegistryLogin(ctx context.Context, auth registry.AuthConfig) (registry.AuthenticateOKBody, error) DiskUsage(ctx context.Context, options types.DiskUsageOptions) (types.DiskUsage, error) Ping(ctx context.Context) (types.Ping, error) diff --git a/vendor/github.com/docker/docker/client/interface_experimental.go b/vendor/github.com/docker/docker/client/interface_experimental.go index 402ffb51..c585c104 100644 --- a/vendor/github.com/docker/docker/client/interface_experimental.go +++ b/vendor/github.com/docker/docker/client/interface_experimental.go @@ -3,7 +3,7 @@ package client // import "github.com/docker/docker/client" import ( "context" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/checkpoint" ) type apiClientExperimental interface { @@ -12,7 +12,7 @@ type apiClientExperimental interface { // CheckpointAPIClient defines API client methods for the checkpoints type CheckpointAPIClient interface { - CheckpointCreate(ctx context.Context, container string, options types.CheckpointCreateOptions) error - CheckpointDelete(ctx context.Context, container string, options types.CheckpointDeleteOptions) error - CheckpointList(ctx context.Context, container string, options types.CheckpointListOptions) ([]types.Checkpoint, error) + CheckpointCreate(ctx context.Context, container string, options checkpoint.CreateOptions) error + CheckpointDelete(ctx context.Context, container string, options checkpoint.DeleteOptions) error + CheckpointList(ctx context.Context, container string, options checkpoint.ListOptions) ([]checkpoint.Summary, error) } diff --git a/vendor/github.com/docker/docker/client/network_create.go b/vendor/github.com/docker/docker/client/network_create.go index 278d9383..d510feb3 100644 --- a/vendor/github.com/docker/docker/client/network_create.go +++ b/vendor/github.com/docker/docker/client/network_create.go @@ -5,15 +5,30 @@ import ( "encoding/json" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/versions" ) // NetworkCreate creates a new network in the docker host. func (cli *Client) NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) { + var response types.NetworkCreateResponse + + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return response, err + } + networkCreateRequest := types.NetworkCreateRequest{ NetworkCreate: options, Name: name, } - var response types.NetworkCreateResponse + if versions.LessThan(cli.version, "1.44") { + networkCreateRequest.CheckDuplicate = true //nolint:staticcheck // ignore SA1019: CheckDuplicate is deprecated since API v1.44. + } + serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil) defer ensureReaderClosed(serverResp) if err != nil { diff --git a/vendor/github.com/docker/docker/client/network_prune.go b/vendor/github.com/docker/docker/client/network_prune.go index cebb1882..7b5f831e 100644 --- a/vendor/github.com/docker/docker/client/network_prune.go +++ b/vendor/github.com/docker/docker/client/network_prune.go @@ -13,7 +13,7 @@ import ( func (cli *Client) NetworksPrune(ctx context.Context, pruneFilters filters.Args) (types.NetworksPruneReport, error) { var report types.NetworksPruneReport - if err := cli.NewVersionError("1.25", "network prune"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "network prune"); err != nil { return report, err } diff --git a/vendor/github.com/docker/docker/client/node_list.go b/vendor/github.com/docker/docker/client/node_list.go index c212906b..1a9e6bfb 100644 --- a/vendor/github.com/docker/docker/client/node_list.go +++ b/vendor/github.com/docker/docker/client/node_list.go @@ -16,7 +16,6 @@ func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions) if options.Filters.Len() > 0 { filterJSON, err := filters.ToJSON(options.Filters) - if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/options.go b/vendor/github.com/docker/docker/client/options.go index 099ad418..ddb0ca39 100644 --- a/vendor/github.com/docker/docker/client/options.go +++ b/vendor/github.com/docker/docker/client/options.go @@ -11,25 +11,25 @@ import ( "github.com/docker/go-connections/sockets" "github.com/docker/go-connections/tlsconfig" "github.com/pkg/errors" + "go.opentelemetry.io/otel/trace" ) -// Opt is a configuration option to initialize a client +// Opt is a configuration option to initialize a [Client]. type Opt func(*Client) error -// FromEnv configures the client with values from environment variables. +// FromEnv configures the client with values from environment variables. It +// is the equivalent of using the [WithTLSClientConfigFromEnv], [WithHostFromEnv], +// and [WithVersionFromEnv] options. // // FromEnv uses the following environment variables: // -// DOCKER_HOST (EnvOverrideHost) to set the URL to the docker server. -// -// DOCKER_API_VERSION (EnvOverrideAPIVersion) to set the version of the API to -// use, leave empty for latest. -// -// DOCKER_CERT_PATH (EnvOverrideCertPath) to specify the directory from which to -// load the TLS certificates (ca.pem, cert.pem, key.pem). -// -// DOCKER_TLS_VERIFY (EnvTLSVerify) to enable or disable TLS verification (off by -// default). +// - DOCKER_HOST ([EnvOverrideHost]) to set the URL to the docker server. +// - DOCKER_API_VERSION ([EnvOverrideAPIVersion]) to set the version of the +// API to use, leave empty for latest. +// - DOCKER_CERT_PATH ([EnvOverrideCertPath]) to specify the directory from +// which to load the TLS certificates ("ca.pem", "cert.pem", "key.pem'). +// - DOCKER_TLS_VERIFY ([EnvTLSVerify]) to enable or disable TLS verification +// (off by default). func FromEnv(c *Client) error { ops := []Opt{ WithTLSClientConfigFromEnv(), @@ -45,7 +45,8 @@ func FromEnv(c *Client) error { } // WithDialContext applies the dialer to the client transport. This can be -// used to set the Timeout and KeepAlive settings of the client. +// used to set the Timeout and KeepAlive settings of the client. It returns +// an error if the client does not have a [http.Transport] configured. func WithDialContext(dialContext func(ctx context.Context, network, addr string) (net.Conn, error)) Opt { return func(c *Client) error { if transport, ok := c.client.Transport.(*http.Transport); ok { @@ -75,7 +76,7 @@ func WithHost(host string) Opt { } // WithHostFromEnv overrides the client host with the host specified in the -// DOCKER_HOST (EnvOverrideHost) environment variable. If DOCKER_HOST is not set, +// DOCKER_HOST ([EnvOverrideHost]) environment variable. If DOCKER_HOST is not set, // or set to an empty value, the host is not modified. func WithHostFromEnv() Opt { return func(c *Client) error { @@ -86,7 +87,7 @@ func WithHostFromEnv() Opt { } } -// WithHTTPClient overrides the client http client with the specified one +// WithHTTPClient overrides the client's HTTP client with the specified one. func WithHTTPClient(client *http.Client) Opt { return func(c *Client) error { if client != nil { @@ -96,7 +97,7 @@ func WithHTTPClient(client *http.Client) Opt { } } -// WithTimeout configures the time limit for requests made by the HTTP client +// WithTimeout configures the time limit for requests made by the HTTP client. func WithTimeout(timeout time.Duration) Opt { return func(c *Client) error { c.client.Timeout = timeout @@ -104,7 +105,19 @@ func WithTimeout(timeout time.Duration) Opt { } } -// WithHTTPHeaders overrides the client default http headers +// WithUserAgent configures the User-Agent header to use for HTTP requests. +// It overrides any User-Agent set in headers. When set to an empty string, +// the User-Agent header is removed, and no header is sent. +func WithUserAgent(ua string) Opt { + return func(c *Client) error { + c.userAgent = &ua + return nil + } +} + +// WithHTTPHeaders appends custom HTTP headers to the client's default headers. +// It does not allow for built-in headers (such as "User-Agent", if set) to +// be overridden. Also see [WithUserAgent]. func WithHTTPHeaders(headers map[string]string) Opt { return func(c *Client) error { c.customHTTPHeaders = headers @@ -112,7 +125,7 @@ func WithHTTPHeaders(headers map[string]string) Opt { } } -// WithScheme overrides the client scheme with the specified one +// WithScheme overrides the client scheme with the specified one. func WithScheme(scheme string) Opt { return func(c *Client) error { c.scheme = scheme @@ -120,51 +133,50 @@ func WithScheme(scheme string) Opt { } } -// WithTLSClientConfig applies a tls config to the client transport. +// WithTLSClientConfig applies a TLS config to the client transport. func WithTLSClientConfig(cacertPath, certPath, keyPath string) Opt { return func(c *Client) error { - opts := tlsconfig.Options{ + transport, ok := c.client.Transport.(*http.Transport) + if !ok { + return errors.Errorf("cannot apply tls config to transport: %T", c.client.Transport) + } + config, err := tlsconfig.Client(tlsconfig.Options{ CAFile: cacertPath, CertFile: certPath, KeyFile: keyPath, ExclusiveRootPools: true, - } - config, err := tlsconfig.Client(opts) + }) if err != nil { return errors.Wrap(err, "failed to create tls config") } - if transport, ok := c.client.Transport.(*http.Transport); ok { - transport.TLSClientConfig = config - return nil - } - return errors.Errorf("cannot apply tls config to transport: %T", c.client.Transport) + transport.TLSClientConfig = config + return nil } } // WithTLSClientConfigFromEnv configures the client's TLS settings with the -// settings in the DOCKER_CERT_PATH and DOCKER_TLS_VERIFY environment variables. -// If DOCKER_CERT_PATH is not set or empty, TLS configuration is not modified. +// settings in the DOCKER_CERT_PATH ([EnvOverrideCertPath]) and DOCKER_TLS_VERIFY +// ([EnvTLSVerify]) environment variables. If DOCKER_CERT_PATH is not set or empty, +// TLS configuration is not modified. // // WithTLSClientConfigFromEnv uses the following environment variables: // -// DOCKER_CERT_PATH (EnvOverrideCertPath) to specify the directory from which to -// load the TLS certificates (ca.pem, cert.pem, key.pem). -// -// DOCKER_TLS_VERIFY (EnvTLSVerify) to enable or disable TLS verification (off by -// default). +// - DOCKER_CERT_PATH ([EnvOverrideCertPath]) to specify the directory from +// which to load the TLS certificates ("ca.pem", "cert.pem", "key.pem"). +// - DOCKER_TLS_VERIFY ([EnvTLSVerify]) to enable or disable TLS verification +// (off by default). func WithTLSClientConfigFromEnv() Opt { return func(c *Client) error { dockerCertPath := os.Getenv(EnvOverrideCertPath) if dockerCertPath == "" { return nil } - options := tlsconfig.Options{ + tlsc, err := tlsconfig.Client(tlsconfig.Options{ CAFile: filepath.Join(dockerCertPath, "ca.pem"), CertFile: filepath.Join(dockerCertPath, "cert.pem"), KeyFile: filepath.Join(dockerCertPath, "key.pem"), InsecureSkipVerify: os.Getenv(EnvTLSVerify) == "", - } - tlsc, err := tlsconfig.Client(options) + }) if err != nil { return err } @@ -178,7 +190,8 @@ func WithTLSClientConfigFromEnv() Opt { } // WithVersion overrides the client version with the specified one. If an empty -// version is specified, the value will be ignored to allow version negotiation. +// version is provided, the value is ignored to allow version negotiation +// (see [WithAPIVersionNegotiation]). func WithVersion(version string) Opt { return func(c *Client) error { if version != "" { @@ -190,8 +203,9 @@ func WithVersion(version string) Opt { } // WithVersionFromEnv overrides the client version with the version specified in -// the DOCKER_API_VERSION environment variable. If DOCKER_API_VERSION is not set, -// the version is not modified. +// the DOCKER_API_VERSION ([EnvOverrideAPIVersion]) environment variable. +// If DOCKER_API_VERSION is not set, or set to an empty value, the version +// is not modified. func WithVersionFromEnv() Opt { return func(c *Client) error { return WithVersion(os.Getenv(EnvOverrideAPIVersion))(c) @@ -201,10 +215,19 @@ func WithVersionFromEnv() Opt { // WithAPIVersionNegotiation enables automatic API version negotiation for the client. // With this option enabled, the client automatically negotiates the API version // to use when making requests. API version negotiation is performed on the first -// request; subsequent requests will not re-negotiate. +// request; subsequent requests do not re-negotiate. func WithAPIVersionNegotiation() Opt { return func(c *Client) error { c.negotiateVersion = true return nil } } + +// WithTraceProvider sets the trace provider for the client. +// If this is not set then the global trace provider will be used. +func WithTraceProvider(provider trace.TracerProvider) Opt { + return func(c *Client) error { + c.tp = provider + return nil + } +} diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go index 347ae71e..bf3e9b1c 100644 --- a/vendor/github.com/docker/docker/client/ping.go +++ b/vendor/github.com/docker/docker/client/ping.go @@ -14,18 +14,21 @@ import ( // Ping pings the server and returns the value of the "Docker-Experimental", // "Builder-Version", "OS-Type" & "API-Version" headers. It attempts to use // a HEAD request on the endpoint, but falls back to GET if HEAD is not supported -// by the daemon. +// by the daemon. It ignores internal server errors returned by the API, which +// may be returned if the daemon is in an unhealthy state, but returns errors +// for other non-success status codes, failing to connect to the API, or failing +// to parse the API response. func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { var ping types.Ping // Using cli.buildRequest() + cli.doRequest() instead of cli.sendRequest() // because ping requests are used during API version negotiation, so we want // to hit the non-versioned /_ping endpoint, not /v1.xx/_ping - req, err := cli.buildRequest(http.MethodHead, path.Join(cli.basePath, "/_ping"), nil, nil) + req, err := cli.buildRequest(ctx, http.MethodHead, path.Join(cli.basePath, "/_ping"), nil, nil) if err != nil { return ping, err } - serverResp, err := cli.doRequest(ctx, req) + serverResp, err := cli.doRequest(req) if err == nil { defer ensureReaderClosed(serverResp) switch serverResp.statusCode { @@ -37,11 +40,9 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { return ping, err } - req, err = cli.buildRequest(http.MethodGet, path.Join(cli.basePath, "/_ping"), nil, nil) - if err != nil { - return ping, err - } - serverResp, err = cli.doRequest(ctx, req) + // HEAD failed; fallback to GET. + req.Method = http.MethodGet + serverResp, err = cli.doRequest(req) defer ensureReaderClosed(serverResp) if err != nil { return ping, err diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go index 3a740ec4..69184619 100644 --- a/vendor/github.com/docker/docker/client/plugin_install.go +++ b/vendor/github.com/docker/docker/client/plugin_install.go @@ -4,9 +4,10 @@ import ( "context" "encoding/json" "io" + "net/http" "net/url" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/errdefs" @@ -68,13 +69,15 @@ func (cli *Client) PluginInstall(ctx context.Context, name string, options types } func (cli *Client) tryPluginPrivileges(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - return cli.get(ctx, "/plugins/privileges", query, headers) + return cli.get(ctx, "/plugins/privileges", query, http.Header{ + registry.AuthHeader: {registryAuth}, + }) } func (cli *Client) tryPluginPull(ctx context.Context, query url.Values, privileges types.PluginPrivileges, registryAuth string) (serverResponse, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - return cli.post(ctx, "/plugins/pull", query, privileges, headers) + return cli.post(ctx, "/plugins/pull", query, privileges, http.Header{ + registry.AuthHeader: {registryAuth}, + }) } func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values, options types.PluginInstallOptions) (types.PluginPrivileges, error) { diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go index 18f9754c..8f68a86e 100644 --- a/vendor/github.com/docker/docker/client/plugin_push.go +++ b/vendor/github.com/docker/docker/client/plugin_push.go @@ -3,14 +3,16 @@ package client // import "github.com/docker/docker/client" import ( "context" "io" + "net/http" "github.com/docker/docker/api/types/registry" ) // PluginPush pushes a plugin to a registry func (cli *Client) PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - resp, err := cli.post(ctx, "/plugins/"+name+"/push", nil, nil, headers) + resp, err := cli.post(ctx, "/plugins/"+name+"/push", nil, nil, http.Header{ + registry.AuthHeader: {registryAuth}, + }) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go index 995d1fd2..5cade450 100644 --- a/vendor/github.com/docker/docker/client/plugin_upgrade.go +++ b/vendor/github.com/docker/docker/client/plugin_upgrade.go @@ -3,9 +3,10 @@ package client // import "github.com/docker/docker/client" import ( "context" "io" + "net/http" "net/url" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" "github.com/pkg/errors" @@ -13,7 +14,7 @@ import ( // PluginUpgrade upgrades a plugin func (cli *Client) PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) { - if err := cli.NewVersionError("1.26", "plugin upgrade"); err != nil { + if err := cli.NewVersionError(ctx, "1.26", "plugin upgrade"); err != nil { return nil, err } query := url.Values{} @@ -35,6 +36,7 @@ func (cli *Client) PluginUpgrade(ctx context.Context, name string, options types } func (cli *Client) tryPluginUpgrade(ctx context.Context, query url.Values, privileges types.PluginPrivileges, name, registryAuth string) (serverResponse, error) { - headers := map[string][]string{registry.AuthHeader: {registryAuth}} - return cli.post(ctx, "/plugins/"+name+"/upgrade", query, privileges, headers) + return cli.post(ctx, "/plugins/"+name+"/upgrade", query, privileges, http.Header{ + registry.AuthHeader: {registryAuth}, + }) } diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go index bcedcf3b..50e213b5 100644 --- a/vendor/github.com/docker/docker/client/request.go +++ b/vendor/github.com/docker/docker/client/request.go @@ -10,6 +10,7 @@ import ( "net/http" "net/url" "os" + "reflect" "strings" "github.com/docker/docker/api/types" @@ -27,17 +28,17 @@ type serverResponse struct { } // head sends an http request to the docker API using the method HEAD. -func (cli *Client) head(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { +func (cli *Client) head(ctx context.Context, path string, query url.Values, headers http.Header) (serverResponse, error) { return cli.sendRequest(ctx, http.MethodHead, path, query, nil, headers) } // get sends an http request to the docker API using the method GET with a specific Go context. -func (cli *Client) get(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { +func (cli *Client) get(ctx context.Context, path string, query url.Values, headers http.Header) (serverResponse, error) { return cli.sendRequest(ctx, http.MethodGet, path, query, nil, headers) } // post sends an http request to the docker API using the method POST with a specific Go context. -func (cli *Client) post(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { +func (cli *Client) post(ctx context.Context, path string, query url.Values, obj interface{}, headers http.Header) (serverResponse, error) { body, headers, err := encodeBody(obj, headers) if err != nil { return serverResponse{}, err @@ -45,34 +46,44 @@ func (cli *Client) post(ctx context.Context, path string, query url.Values, obj return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers) } -func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { +func (cli *Client) postRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers http.Header) (serverResponse, error) { return cli.sendRequest(ctx, http.MethodPost, path, query, body, headers) } -func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { +func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers http.Header) (serverResponse, error) { body, headers, err := encodeBody(obj, headers) if err != nil { return serverResponse{}, err } - return cli.sendRequest(ctx, http.MethodPut, path, query, body, headers) + return cli.putRaw(ctx, path, query, body, headers) } // putRaw sends an http request to the docker API using the method PUT. -func (cli *Client) putRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers map[string][]string) (serverResponse, error) { +func (cli *Client) putRaw(ctx context.Context, path string, query url.Values, body io.Reader, headers http.Header) (serverResponse, error) { + // PUT requests are expected to always have a body (apparently) + // so explicitly pass an empty body to sendRequest to signal that + // it should set the Content-Type header if not already present. + if body == nil { + body = http.NoBody + } return cli.sendRequest(ctx, http.MethodPut, path, query, body, headers) } // delete sends an http request to the docker API using the method DELETE. -func (cli *Client) delete(ctx context.Context, path string, query url.Values, headers map[string][]string) (serverResponse, error) { +func (cli *Client) delete(ctx context.Context, path string, query url.Values, headers http.Header) (serverResponse, error) { return cli.sendRequest(ctx, http.MethodDelete, path, query, nil, headers) } -type headers map[string][]string - -func encodeBody(obj interface{}, headers headers) (io.Reader, headers, error) { +func encodeBody(obj interface{}, headers http.Header) (io.Reader, http.Header, error) { if obj == nil { return nil, headers, nil } + // encoding/json encodes a nil pointer as the JSON document `null`, + // irrespective of whether the type implements json.Marshaler or encoding.TextMarshaler. + // That is almost certainly not what the caller intended as the request body. + if reflect.TypeOf(obj).Kind() == reflect.Ptr && reflect.ValueOf(obj).IsNil() { + return nil, headers, nil + } body, err := encodeData(obj) if err != nil { @@ -85,13 +96,8 @@ func encodeBody(obj interface{}, headers headers) (io.Reader, headers, error) { return body, headers, nil } -func (cli *Client) buildRequest(method, path string, body io.Reader, headers headers) (*http.Request, error) { - expectedPayload := (method == http.MethodPost || method == http.MethodPut) - if expectedPayload && body == nil { - body = bytes.NewReader([]byte{}) - } - - req, err := http.NewRequest(method, path, body) +func (cli *Client) buildRequest(ctx context.Context, method, path string, body io.Reader, headers http.Header) (*http.Request, error) { + req, err := http.NewRequestWithContext(ctx, method, path, body) if err != nil { return nil, err } @@ -104,19 +110,19 @@ func (cli *Client) buildRequest(method, path string, body io.Reader, headers hea req.Host = DummyHost } - if expectedPayload && req.Header.Get("Content-Type") == "" { + if body != nil && req.Header.Get("Content-Type") == "" { req.Header.Set("Content-Type", "text/plain") } return req, nil } -func (cli *Client) sendRequest(ctx context.Context, method, path string, query url.Values, body io.Reader, headers headers) (serverResponse, error) { - req, err := cli.buildRequest(method, cli.getAPIPath(ctx, path, query), body, headers) +func (cli *Client) sendRequest(ctx context.Context, method, path string, query url.Values, body io.Reader, headers http.Header) (serverResponse, error) { + req, err := cli.buildRequest(ctx, method, cli.getAPIPath(ctx, path, query), body, headers) if err != nil { return serverResponse{}, err } - resp, err := cli.doRequest(ctx, req) + resp, err := cli.doRequest(req) switch { case errors.Is(err, context.Canceled): return serverResponse{}, errdefs.Cancelled(err) @@ -128,18 +134,18 @@ func (cli *Client) sendRequest(ctx context.Context, method, path string, query u return resp, errdefs.FromStatusCode(err, resp.statusCode) } -func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) { +// FIXME(thaJeztah): Should this actually return a serverResp when a connection error occurred? +func (cli *Client) doRequest(req *http.Request) (serverResponse, error) { serverResp := serverResponse{statusCode: -1, reqURL: req.URL} - req = req.WithContext(ctx) resp, err := cli.client.Do(req) if err != nil { if cli.scheme != "https" && strings.Contains(err.Error(), "malformed HTTP response") { - return serverResp, fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err) + return serverResp, errConnectionFailed{fmt.Errorf("%v.\n* Are you trying to connect to a TLS-enabled daemon without TLS?", err)} } if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") { - return serverResp, errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings") + return serverResp, errConnectionFailed{errors.Wrap(err, "the server probably has client authentication (--tlsverify) enabled; check your TLS client certification settings")} } // Don't decorate context sentinel errors; users may be comparing to @@ -148,19 +154,20 @@ func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResp return serverResp, err } - if nErr, ok := err.(*url.Error); ok { - if nErr, ok := nErr.Err.(*net.OpError); ok { + if uErr, ok := err.(*url.Error); ok { + if nErr, ok := uErr.Err.(*net.OpError); ok { if os.IsPermission(nErr.Err) { - return serverResp, errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host) + return serverResp, errConnectionFailed{errors.Wrapf(err, "permission denied while trying to connect to the Docker daemon socket at %v", cli.host)} } } } - if err, ok := err.(net.Error); ok { - if err.Timeout() { + if nErr, ok := err.(net.Error); ok { + // FIXME(thaJeztah): any net.Error should be considered a connection error (but we should include the original error)? + if nErr.Timeout() { return serverResp, ErrorConnectionFailed(cli.host) } - if strings.Contains(err.Error(), "connection refused") || strings.Contains(err.Error(), "dial unix") { + if strings.Contains(nErr.Error(), "connection refused") || strings.Contains(nErr.Error(), "dial unix") { return serverResp, ErrorConnectionFailed(cli.host) } } @@ -185,7 +192,7 @@ func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResp } } - return serverResp, errors.Wrap(err, "error during connect") + return serverResp, errConnectionFailed{errors.Wrap(err, "error during connect")} } if resp != nil { @@ -221,26 +228,20 @@ func (cli *Client) checkResponseErr(serverResp serverResponse) error { return fmt.Errorf("request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), serverResp.reqURL) } - var ct string - if serverResp.header != nil { - ct = serverResp.header.Get("Content-Type") - } - - var errorMessage string - if (cli.version == "" || versions.GreaterThan(cli.version, "1.23")) && ct == "application/json" { + var daemonErr error + if serverResp.header.Get("Content-Type") == "application/json" && (cli.version == "" || versions.GreaterThan(cli.version, "1.23")) { var errorResponse types.ErrorResponse if err := json.Unmarshal(body, &errorResponse); err != nil { return errors.Wrap(err, "Error reading JSON") } - errorMessage = strings.TrimSpace(errorResponse.Message) + daemonErr = errors.New(strings.TrimSpace(errorResponse.Message)) } else { - errorMessage = strings.TrimSpace(string(body)) + daemonErr = errors.New(strings.TrimSpace(string(body))) } - - return errors.Wrap(errors.New(errorMessage), "Error response from daemon") + return errors.Wrap(daemonErr, "Error response from daemon") } -func (cli *Client) addHeaders(req *http.Request, headers headers) *http.Request { +func (cli *Client) addHeaders(req *http.Request, headers http.Header) *http.Request { // Add CLI Config's HTTP Headers BEFORE we set the Docker headers // then the user can't change OUR headers for k, v := range cli.customHTTPHeaders { @@ -253,6 +254,14 @@ func (cli *Client) addHeaders(req *http.Request, headers headers) *http.Request for k, v := range headers { req.Header[http.CanonicalHeaderKey(k)] = v } + + if cli.userAgent != nil { + if *cli.userAgent == "" { + req.Header.Del("User-Agent") + } else { + req.Header.Set("User-Agent", *cli.userAgent) + } + } return req } diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go index c65d38a1..7b7f1ba7 100644 --- a/vendor/github.com/docker/docker/client/secret_create.go +++ b/vendor/github.com/docker/docker/client/secret_create.go @@ -11,7 +11,7 @@ import ( // SecretCreate creates a new secret. func (cli *Client) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) { var response types.SecretCreateResponse - if err := cli.NewVersionError("1.25", "secret create"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "secret create"); err != nil { return response, err } resp, err := cli.post(ctx, "/secrets/create", nil, secret, nil) diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go index 5906874b..a9cb5988 100644 --- a/vendor/github.com/docker/docker/client/secret_inspect.go +++ b/vendor/github.com/docker/docker/client/secret_inspect.go @@ -11,7 +11,7 @@ import ( // SecretInspectWithRaw returns the secret information with raw data func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.Secret, []byte, error) { - if err := cli.NewVersionError("1.25", "secret inspect"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "secret inspect"); err != nil { return swarm.Secret{}, nil, err } if id == "" { diff --git a/vendor/github.com/docker/docker/client/secret_list.go b/vendor/github.com/docker/docker/client/secret_list.go index a0289c9f..4d21639e 100644 --- a/vendor/github.com/docker/docker/client/secret_list.go +++ b/vendor/github.com/docker/docker/client/secret_list.go @@ -12,7 +12,7 @@ import ( // SecretList returns the list of secrets. func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) { - if err := cli.NewVersionError("1.25", "secret list"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "secret list"); err != nil { return nil, err } query := url.Values{} diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go index f47f68b6..079ed673 100644 --- a/vendor/github.com/docker/docker/client/secret_remove.go +++ b/vendor/github.com/docker/docker/client/secret_remove.go @@ -4,7 +4,7 @@ import "context" // SecretRemove removes a secret. func (cli *Client) SecretRemove(ctx context.Context, id string) error { - if err := cli.NewVersionError("1.25", "secret remove"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "secret remove"); err != nil { return err } resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil) diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go index 2e939e8c..9dfe6719 100644 --- a/vendor/github.com/docker/docker/client/secret_update.go +++ b/vendor/github.com/docker/docker/client/secret_update.go @@ -9,7 +9,7 @@ import ( // SecretUpdate attempts to update a secret. func (cli *Client) SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error { - if err := cli.NewVersionError("1.25", "secret update"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "secret update"); err != nil { return err } query := url.Values{} diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go index b6065b8e..b72cb420 100644 --- a/vendor/github.com/docker/docker/client/service_create.go +++ b/vendor/github.com/docker/docker/client/service_create.go @@ -4,25 +4,29 @@ import ( "context" "encoding/json" "fmt" + "net/http" "strings" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/api/types/versions" "github.com/opencontainers/go-digest" "github.com/pkg/errors" ) // ServiceCreate creates a new service. -func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) { - var response types.ServiceCreateResponse - headers := map[string][]string{ - "version": {cli.version}, - } - - if options.EncodedRegistryAuth != "" { - headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth} +func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (swarm.ServiceCreateResponse, error) { + var response swarm.ServiceCreateResponse + + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return response, err } // Make sure containerSpec is not nil when no runtime is set or the runtime is set to container @@ -53,6 +57,16 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, } } + headers := http.Header{} + if versions.LessThan(cli.version, "1.30") { + // the custom "version" header was used by engine API before 20.10 + // (API 1.30) to switch between client- and server-side lookup of + // image digests. + headers["version"] = []string{cli.version} + } + if options.EncodedRegistryAuth != "" { + headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth} + } resp, err := cli.post(ctx, "/services/create", nil, service, headers) defer ensureReaderClosed(resp) if err != nil { diff --git a/vendor/github.com/docker/docker/client/service_logs.go b/vendor/github.com/docker/docker/client/service_logs.go index 906fd405..e9e30a2a 100644 --- a/vendor/github.com/docker/docker/client/service_logs.go +++ b/vendor/github.com/docker/docker/client/service_logs.go @@ -6,14 +6,14 @@ import ( "net/url" "time" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" timetypes "github.com/docker/docker/api/types/time" "github.com/pkg/errors" ) // ServiceLogs returns the logs generated by a service in an io.ReadCloser. // It's up to the caller to close the stream. -func (cli *Client) ServiceLogs(ctx context.Context, serviceID string, options types.ContainerLogsOptions) (io.ReadCloser, error) { +func (cli *Client) ServiceLogs(ctx context.Context, serviceID string, options container.LogsOptions) (io.ReadCloser, error) { query := url.Values{} if options.ShowStdout { query.Set("stdout", "1") diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go index ff8cded8..d2f03f02 100644 --- a/vendor/github.com/docker/docker/client/service_update.go +++ b/vendor/github.com/docker/docker/client/service_update.go @@ -3,30 +3,31 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" + "net/http" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/api/types/versions" ) // ServiceUpdate updates a Service. The version number is required to avoid conflicting writes. // It should be the value as set *before* the update. You can find this value in the Meta field // of swarm.Service, which can be found using ServiceInspectWithRaw. -func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { - var ( - query = url.Values{} - response = types.ServiceUpdateResponse{} - ) +func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (swarm.ServiceUpdateResponse, error) { + response := swarm.ServiceUpdateResponse{} - headers := map[string][]string{ - "version": {cli.version}, - } - - if options.EncodedRegistryAuth != "" { - headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth} + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return response, err } + query := url.Values{} if options.RegistryAuthFrom != "" { query.Set("registryAuthFrom", options.RegistryAuthFrom) } @@ -60,6 +61,16 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version } } + headers := http.Header{} + if versions.LessThan(cli.version, "1.30") { + // the custom "version" header was used by engine API before 20.10 + // (API 1.30) to switch between client- and server-side lookup of + // image digests. + headers["version"] = []string{cli.version} + } + if options.EncodedRegistryAuth != "" { + headers[registry.AuthHeader] = []string{options.EncodedRegistryAuth} + } resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) defer ensureReaderClosed(resp) if err != nil { diff --git a/vendor/github.com/docker/docker/client/task_logs.go b/vendor/github.com/docker/docker/client/task_logs.go index 6222fab5..b8c20e71 100644 --- a/vendor/github.com/docker/docker/client/task_logs.go +++ b/vendor/github.com/docker/docker/client/task_logs.go @@ -6,13 +6,13 @@ import ( "net/url" "time" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" timetypes "github.com/docker/docker/api/types/time" ) // TaskLogs returns the logs generated by a task in an io.ReadCloser. // It's up to the caller to close the stream. -func (cli *Client) TaskLogs(ctx context.Context, taskID string, options types.ContainerLogsOptions) (io.ReadCloser, error) { +func (cli *Client) TaskLogs(ctx context.Context, taskID string, options container.LogsOptions) (io.ReadCloser, error) { query := url.Values{} if options.ShowStdout { query.Set("stdout", "1") diff --git a/vendor/github.com/docker/docker/client/transport.go b/vendor/github.com/docker/docker/client/transport.go deleted file mode 100644 index 55413443..00000000 --- a/vendor/github.com/docker/docker/client/transport.go +++ /dev/null @@ -1,17 +0,0 @@ -package client // import "github.com/docker/docker/client" - -import ( - "crypto/tls" - "net/http" -) - -// resolveTLSConfig attempts to resolve the TLS configuration from the -// RoundTripper. -func resolveTLSConfig(transport http.RoundTripper) *tls.Config { - switch tr := transport.(type) { - case *http.Transport: - return tr.TLSClientConfig - default: - return nil - } -} diff --git a/vendor/github.com/docker/docker/client/volume_prune.go b/vendor/github.com/docker/docker/client/volume_prune.go index 6e324708..9333f6ee 100644 --- a/vendor/github.com/docker/docker/client/volume_prune.go +++ b/vendor/github.com/docker/docker/client/volume_prune.go @@ -13,7 +13,7 @@ import ( func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters filters.Args) (types.VolumesPruneReport, error) { var report types.VolumesPruneReport - if err := cli.NewVersionError("1.25", "volume prune"); err != nil { + if err := cli.NewVersionError(ctx, "1.25", "volume prune"); err != nil { return report, err } diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go index 1f264383..b8bdc5ae 100644 --- a/vendor/github.com/docker/docker/client/volume_remove.go +++ b/vendor/github.com/docker/docker/client/volume_remove.go @@ -10,8 +10,16 @@ import ( // VolumeRemove removes a volume from the docker host. func (cli *Client) VolumeRemove(ctx context.Context, volumeID string, force bool) error { query := url.Values{} - if versions.GreaterThanOrEqualTo(cli.version, "1.25") { - if force { + if force { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return err + } + if versions.GreaterThanOrEqualTo(cli.version, "1.25") { query.Set("force", "1") } } diff --git a/vendor/github.com/docker/docker/client/volume_update.go b/vendor/github.com/docker/docker/client/volume_update.go index 33bd31e5..151863f0 100644 --- a/vendor/github.com/docker/docker/client/volume_update.go +++ b/vendor/github.com/docker/docker/client/volume_update.go @@ -11,7 +11,7 @@ import ( // VolumeUpdate updates a volume. This only works for Cluster Volumes, and // only some fields can be updated. func (cli *Client) VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error { - if err := cli.NewVersionError("1.42", "volume update"); err != nil { + if err := cli.NewVersionError(ctx, "1.42", "volume update"); err != nil { return err } diff --git a/vendor/github.com/docker/docker/errdefs/defs.go b/vendor/github.com/docker/docker/errdefs/defs.go index 61e7456b..a5523c3e 100644 --- a/vendor/github.com/docker/docker/errdefs/defs.go +++ b/vendor/github.com/docker/docker/errdefs/defs.go @@ -1,4 +1,4 @@ -package errdefs // import "github.com/docker/docker/errdefs" +package errdefs // ErrNotFound signals that the requested object doesn't exist type ErrNotFound interface { diff --git a/vendor/github.com/docker/docker/errdefs/helpers.go b/vendor/github.com/docker/docker/errdefs/helpers.go index fe06fb6f..042de4b7 100644 --- a/vendor/github.com/docker/docker/errdefs/helpers.go +++ b/vendor/github.com/docker/docker/errdefs/helpers.go @@ -1,4 +1,4 @@ -package errdefs // import "github.com/docker/docker/errdefs" +package errdefs import "context" diff --git a/vendor/github.com/docker/docker/errdefs/http_helpers.go b/vendor/github.com/docker/docker/errdefs/http_helpers.go index 77bda389..ebcd7893 100644 --- a/vendor/github.com/docker/docker/errdefs/http_helpers.go +++ b/vendor/github.com/docker/docker/errdefs/http_helpers.go @@ -1,4 +1,4 @@ -package errdefs // import "github.com/docker/docker/errdefs" +package errdefs import ( "net/http" diff --git a/vendor/github.com/docker/docker/errdefs/is.go b/vendor/github.com/docker/docker/errdefs/is.go index 3abf07d0..f94034cb 100644 --- a/vendor/github.com/docker/docker/errdefs/is.go +++ b/vendor/github.com/docker/docker/errdefs/is.go @@ -1,9 +1,18 @@ -package errdefs // import "github.com/docker/docker/errdefs" +package errdefs + +import ( + "context" + "errors" +) type causer interface { Cause() error } +type wrapErr interface { + Unwrap() error +} + func getImplementer(err error) error { switch e := err.(type) { case @@ -23,6 +32,8 @@ func getImplementer(err error) error { return err case causer: return getImplementer(e.Cause()) + case wrapErr: + return getImplementer(e.Unwrap()) default: return err } @@ -105,3 +116,8 @@ func IsDataLoss(err error) bool { _, ok := getImplementer(err).(ErrDataLoss) return ok } + +// IsContext returns if the passed in error is due to context cancellation or deadline exceeded. +func IsContext(err error) bool { + return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) +} diff --git a/vendor/github.com/docker/docker/internal/multierror/multierror.go b/vendor/github.com/docker/docker/internal/multierror/multierror.go new file mode 100644 index 00000000..cf4d6a59 --- /dev/null +++ b/vendor/github.com/docker/docker/internal/multierror/multierror.go @@ -0,0 +1,46 @@ +package multierror + +import ( + "strings" +) + +// Join is a drop-in replacement for errors.Join with better formatting. +func Join(errs ...error) error { + n := 0 + for _, err := range errs { + if err != nil { + n++ + } + } + if n == 0 { + return nil + } + e := &joinError{ + errs: make([]error, 0, n), + } + for _, err := range errs { + if err != nil { + e.errs = append(e.errs, err) + } + } + return e +} + +type joinError struct { + errs []error +} + +func (e *joinError) Error() string { + if len(e.errs) == 1 { + return strings.TrimSpace(e.errs[0].Error()) + } + stringErrs := make([]string, 0, len(e.errs)) + for _, subErr := range e.errs { + stringErrs = append(stringErrs, strings.Replace(subErr.Error(), "\n", "\n\t", -1)) + } + return "* " + strings.Join(stringErrs, "\n* ") +} + +func (e *joinError) Unwrap() []error { + return e.errs +} diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go b/vendor/github.com/docker/docker/pkg/homedir/homedir.go similarity index 52% rename from vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go rename to vendor/github.com/docker/docker/pkg/homedir/homedir.go index d1732dee..c0ab3f5b 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_unix.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir.go @@ -1,39 +1,28 @@ -//go:build !windows -// +build !windows - -package homedir // import "github.com/docker/docker/pkg/homedir" +package homedir import ( "os" "os/user" + "runtime" ) -// Key returns the env var name for the user's home dir based on -// the platform being run on -func Key() string { - return "HOME" -} - // Get returns the home directory of the current user with the help of // environment variables depending on the target operating system. // Returned path should be used with "path/filepath" to form new paths. // +// On non-Windows platforms, it falls back to nss lookups, if the home +// directory cannot be obtained from environment-variables. +// // If linking statically with cgo enabled against glibc, ensure the // osusergo build tag is used. // // If needing to do nss lookups, do not disable cgo or set osusergo. func Get() string { - home := os.Getenv(Key()) - if home == "" { + home, _ := os.UserHomeDir() + if home == "" && runtime.GOOS != "windows" { if u, err := user.Current(); err == nil { return u.HomeDir } } return home } - -// GetShortcutString returns the string that is shortcut to user's home directory -// in the native shell of the platform running on. -func GetShortcutString() string { - return "~" -} diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go index 11f1bec9..4eeb26b5 100644 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go +++ b/vendor/github.com/docker/docker/pkg/homedir/homedir_others.go @@ -1,5 +1,4 @@ //go:build !linux -// +build !linux package homedir // import "github.com/docker/docker/pkg/homedir" diff --git a/vendor/github.com/docker/docker/pkg/homedir/homedir_windows.go b/vendor/github.com/docker/docker/pkg/homedir/homedir_windows.go deleted file mode 100644 index 2f81813b..00000000 --- a/vendor/github.com/docker/docker/pkg/homedir/homedir_windows.go +++ /dev/null @@ -1,24 +0,0 @@ -package homedir // import "github.com/docker/docker/pkg/homedir" - -import ( - "os" -) - -// Key returns the env var name for the user's home dir based on -// the platform being run on -func Key() string { - return "USERPROFILE" -} - -// Get returns the home directory of the current user with the help of -// environment variables depending on the target operating system. -// Returned path should be used with "path/filepath" to form new paths. -func Get() string { - return os.Getenv(Key()) -} - -// GetShortcutString returns the string that is shortcut to user's home directory -// in the native shell of the platform running on. -func GetShortcutString() string { - return "%USERPROFILE%" // be careful while using in format functions -} diff --git a/vendor/github.com/docker/go-connections/nat/nat.go b/vendor/github.com/docker/go-connections/nat/nat.go index bb7e4e33..4049d780 100644 --- a/vendor/github.com/docker/go-connections/nat/nat.go +++ b/vendor/github.com/docker/go-connections/nat/nat.go @@ -8,11 +8,6 @@ import ( "strings" ) -const ( - // portSpecTemplate is the expected format for port specifications - portSpecTemplate = "ip:hostPort:containerPort" -) - // PortBinding represents a binding between a Host IP address and a Host Port type PortBinding struct { // HostIP is the host IP Address @@ -158,48 +153,51 @@ type PortMapping struct { func splitParts(rawport string) (string, string, string) { parts := strings.Split(rawport, ":") n := len(parts) - containerport := parts[n-1] + containerPort := parts[n-1] switch n { case 1: - return "", "", containerport + return "", "", containerPort case 2: - return "", parts[0], containerport + return "", parts[0], containerPort case 3: - return parts[0], parts[1], containerport + return parts[0], parts[1], containerPort default: - return strings.Join(parts[:n-2], ":"), parts[n-2], containerport + return strings.Join(parts[:n-2], ":"), parts[n-2], containerPort } } // ParsePortSpec parses a port specification string into a slice of PortMappings func ParsePortSpec(rawPort string) ([]PortMapping, error) { var proto string - rawIP, hostPort, containerPort := splitParts(rawPort) + ip, hostPort, containerPort := splitParts(rawPort) proto, containerPort = SplitProtoPort(containerPort) - // Strip [] from IPV6 addresses - ip, _, err := net.SplitHostPort(rawIP + ":") - if err != nil { - return nil, fmt.Errorf("Invalid ip address %v: %s", rawIP, err) + if ip != "" && ip[0] == '[' { + // Strip [] from IPV6 addresses + rawIP, _, err := net.SplitHostPort(ip + ":") + if err != nil { + return nil, fmt.Errorf("invalid IP address %v: %w", ip, err) + } + ip = rawIP } if ip != "" && net.ParseIP(ip) == nil { - return nil, fmt.Errorf("Invalid ip address: %s", ip) + return nil, fmt.Errorf("invalid IP address: %s", ip) } if containerPort == "" { - return nil, fmt.Errorf("No port specified: %s", rawPort) + return nil, fmt.Errorf("no port specified: %s", rawPort) } startPort, endPort, err := ParsePortRange(containerPort) if err != nil { - return nil, fmt.Errorf("Invalid containerPort: %s", containerPort) + return nil, fmt.Errorf("invalid containerPort: %s", containerPort) } var startHostPort, endHostPort uint64 = 0, 0 if len(hostPort) > 0 { startHostPort, endHostPort, err = ParsePortRange(hostPort) if err != nil { - return nil, fmt.Errorf("Invalid hostPort: %s", hostPort) + return nil, fmt.Errorf("invalid hostPort: %s", hostPort) } } @@ -208,12 +206,12 @@ func ParsePortSpec(rawPort string) ([]PortMapping, error) { // In this case, use the host port range as the dynamic // host port range to allocate into. if endPort != startPort { - return nil, fmt.Errorf("Invalid ranges specified for container and host Ports: %s and %s", containerPort, hostPort) + return nil, fmt.Errorf("invalid ranges specified for container and host Ports: %s and %s", containerPort, hostPort) } } if !validateProto(strings.ToLower(proto)) { - return nil, fmt.Errorf("Invalid proto: %s", proto) + return nil, fmt.Errorf("invalid proto: %s", proto) } ports := []PortMapping{} diff --git a/vendor/github.com/docker/go-connections/nat/parse.go b/vendor/github.com/docker/go-connections/nat/parse.go index 892adf8c..e4b53e8a 100644 --- a/vendor/github.com/docker/go-connections/nat/parse.go +++ b/vendor/github.com/docker/go-connections/nat/parse.go @@ -6,34 +6,10 @@ import ( "strings" ) -// PartParser parses and validates the specified string (data) using the specified template -// e.g. ip:public:private -> 192.168.0.1:80:8000 -// DEPRECATED: do not use, this function may be removed in a future version -func PartParser(template, data string) (map[string]string, error) { - // ip:public:private - var ( - templateParts = strings.Split(template, ":") - parts = strings.Split(data, ":") - out = make(map[string]string, len(templateParts)) - ) - if len(parts) != len(templateParts) { - return nil, fmt.Errorf("Invalid format to parse. %s should match template %s", data, template) - } - - for i, t := range templateParts { - value := "" - if len(parts) > i { - value = parts[i] - } - out[t] = value - } - return out, nil -} - // ParsePortRange parses and validates the specified string as a port-range (8000-9000) func ParsePortRange(ports string) (uint64, uint64, error) { if ports == "" { - return 0, 0, fmt.Errorf("Empty string specified for ports.") + return 0, 0, fmt.Errorf("empty string specified for ports") } if !strings.Contains(ports, "-") { start, err := strconv.ParseUint(ports, 10, 16) @@ -51,7 +27,7 @@ func ParsePortRange(ports string) (uint64, uint64, error) { return 0, 0, err } if end < start { - return 0, 0, fmt.Errorf("Invalid range specified for the Port: %s", ports) + return 0, 0, fmt.Errorf("invalid range specified for port: %s", ports) } return start, end, nil } diff --git a/vendor/github.com/docker/go-connections/nat/sort.go b/vendor/github.com/docker/go-connections/nat/sort.go index ce950171..b6eed145 100644 --- a/vendor/github.com/docker/go-connections/nat/sort.go +++ b/vendor/github.com/docker/go-connections/nat/sort.go @@ -43,7 +43,7 @@ type portMapSorter []portMapEntry func (s portMapSorter) Len() int { return len(s) } func (s portMapSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -// sort the port so that the order is: +// Less sorts the port so that the order is: // 1. port with larger specified bindings // 2. larger port // 3. port with tcp protocol @@ -58,7 +58,7 @@ func (s portMapSorter) Less(i, j int) bool { func SortPortMap(ports []Port, bindings PortMap) { s := portMapSorter{} for _, p := range ports { - if binding, ok := bindings[p]; ok { + if binding, ok := bindings[p]; ok && len(binding) > 0 { for _, b := range binding { s = append(s, portMapEntry{port: p, binding: b}) } diff --git a/vendor/github.com/docker/go-connections/sockets/proxy.go b/vendor/github.com/docker/go-connections/sockets/proxy.go index 98e9a1dc..c897cb02 100644 --- a/vendor/github.com/docker/go-connections/sockets/proxy.go +++ b/vendor/github.com/docker/go-connections/sockets/proxy.go @@ -2,11 +2,8 @@ package sockets import ( "net" - "net/url" "os" "strings" - - "golang.org/x/net/proxy" ) // GetProxyEnv allows access to the uppercase and the lowercase forms of @@ -20,32 +17,12 @@ func GetProxyEnv(key string) string { return proxyValue } -// DialerFromEnvironment takes in a "direct" *net.Dialer and returns a -// proxy.Dialer which will route the connections through the proxy using the -// given dialer. -func DialerFromEnvironment(direct *net.Dialer) (proxy.Dialer, error) { - allProxy := GetProxyEnv("all_proxy") - if len(allProxy) == 0 { - return direct, nil - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return direct, err - } - - proxyFromURL, err := proxy.FromURL(proxyURL, direct) - if err != nil { - return direct, err - } - - noProxy := GetProxyEnv("no_proxy") - if len(noProxy) == 0 { - return proxyFromURL, nil - } - - perHost := proxy.NewPerHost(proxyFromURL, direct) - perHost.AddFromString(noProxy) - - return perHost, nil +// DialerFromEnvironment was previously used to configure a net.Dialer to route +// connections through a SOCKS proxy. +// DEPRECATED: SOCKS proxies are now supported by configuring only +// http.Transport.Proxy, and no longer require changing http.Transport.Dial. +// Therefore, only sockets.ConfigureTransport() needs to be called, and any +// sockets.DialerFromEnvironment() calls can be dropped. +func DialerFromEnvironment(direct *net.Dialer) (*net.Dialer, error) { + return direct, nil } diff --git a/vendor/github.com/docker/go-connections/sockets/sockets.go b/vendor/github.com/docker/go-connections/sockets/sockets.go index a1d7beb4..b0eae239 100644 --- a/vendor/github.com/docker/go-connections/sockets/sockets.go +++ b/vendor/github.com/docker/go-connections/sockets/sockets.go @@ -8,16 +8,18 @@ import ( "time" ) -// Why 32? See https://github.com/docker/docker/pull/8035. -const defaultTimeout = 32 * time.Second +const defaultTimeout = 10 * time.Second // ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system. var ErrProtocolNotAvailable = errors.New("protocol not available") -// ConfigureTransport configures the specified Transport according to the -// specified proto and addr. -// If the proto is unix (using a unix socket to communicate) or npipe the -// compression is disabled. +// ConfigureTransport configures the specified [http.Transport] according to the specified proto +// and addr. +// +// If the proto is unix (using a unix socket to communicate) or npipe the compression is disabled. +// For other protos, compression is enabled. If you want to manually enable/disable compression, +// make sure you do it _after_ any subsequent calls to ConfigureTransport is made against the same +// [http.Transport]. func ConfigureTransport(tr *http.Transport, proto, addr string) error { switch proto { case "unix": @@ -26,13 +28,10 @@ func ConfigureTransport(tr *http.Transport, proto, addr string) error { return configureNpipeTransport(tr, proto, addr) default: tr.Proxy = http.ProxyFromEnvironment - dialer, err := DialerFromEnvironment(&net.Dialer{ + tr.DisableCompression = false + tr.DialContext = (&net.Dialer{ Timeout: defaultTimeout, - }) - if err != nil { - return err - } - tr.Dial = dialer.Dial + }).DialContext } return nil } diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go b/vendor/github.com/docker/go-connections/sockets/sockets_unix.go index 4479b587..78a34a98 100644 --- a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go +++ b/vendor/github.com/docker/go-connections/sockets/sockets_unix.go @@ -1,9 +1,9 @@ //go:build !windows -// +build !windows package sockets import ( + "context" "fmt" "net" "net/http" @@ -15,12 +15,15 @@ const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path) func configureUnixTransport(tr *http.Transport, proto, addr string) error { if len(addr) > maxUnixSocketPathSize { - return fmt.Errorf("Unix socket path %q is too long", addr) + return fmt.Errorf("unix socket path %q is too long", addr) } // No need for compression in local communications. tr.DisableCompression = true - tr.Dial = func(_, _ string) (net.Conn, error) { - return net.DialTimeout(proto, addr, defaultTimeout) + dialer := &net.Dialer{ + Timeout: defaultTimeout, + } + tr.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) { + return dialer.DialContext(ctx, proto, addr) } return nil } diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go b/vendor/github.com/docker/go-connections/sockets/sockets_windows.go index 5c21644e..7acafc5a 100644 --- a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go +++ b/vendor/github.com/docker/go-connections/sockets/sockets_windows.go @@ -1,6 +1,7 @@ package sockets import ( + "context" "net" "net/http" "time" @@ -15,8 +16,8 @@ func configureUnixTransport(tr *http.Transport, proto, addr string) error { func configureNpipeTransport(tr *http.Transport, proto, addr string) error { // No need for compression in local communications. tr.DisableCompression = true - tr.Dial = func(_, _ string) (net.Conn, error) { - return DialPipe(addr, defaultTimeout) + tr.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) { + return winio.DialPipeContext(ctx, addr) } return nil } diff --git a/vendor/github.com/docker/go-connections/sockets/unix_socket.go b/vendor/github.com/docker/go-connections/sockets/unix_socket.go index f1788c7b..b9233521 100644 --- a/vendor/github.com/docker/go-connections/sockets/unix_socket.go +++ b/vendor/github.com/docker/go-connections/sockets/unix_socket.go @@ -1,6 +1,51 @@ //go:build !windows -// +build !windows +/* +Package sockets is a simple unix domain socket wrapper. + +# Usage + +For example: + + import( + "fmt" + "net" + "os" + "github.com/docker/go-connections/sockets" + ) + + func main() { + l, err := sockets.NewUnixSocketWithOpts("/path/to/sockets", + sockets.WithChown(0,0),sockets.WithChmod(0660)) + if err != nil { + panic(err) + } + echoStr := "hello" + + go func() { + for { + conn, err := l.Accept() + if err != nil { + return + } + conn.Write([]byte(echoStr)) + conn.Close() + } + }() + + conn, err := net.Dial("unix", path) + if err != nil { + t.Fatal(err) + } + + buf := make([]byte, 5) + if _, err := conn.Read(buf); err != nil { + panic(err) + } else if string(buf) != echoStr { + panic(fmt.Errorf("msg may lost")) + } + } +*/ package sockets import ( @@ -9,25 +54,73 @@ import ( "syscall" ) -// NewUnixSocket creates a unix socket with the specified path and group. -func NewUnixSocket(path string, gid int) (net.Listener, error) { +// SockOption sets up socket file's creating option +type SockOption func(string) error + +// WithChown modifies the socket file's uid and gid +func WithChown(uid, gid int) SockOption { + return func(path string) error { + if err := os.Chown(path, uid, gid); err != nil { + return err + } + return nil + } +} + +// WithChmod modifies socket file's access mode. +func WithChmod(mask os.FileMode) SockOption { + return func(path string) error { + if err := os.Chmod(path, mask); err != nil { + return err + } + return nil + } +} + +// NewUnixSocketWithOpts creates a unix socket with the specified options. +// By default, socket permissions are 0000 (i.e.: no access for anyone); pass +// WithChmod() and WithChown() to set the desired ownership and permissions. +// +// This function temporarily changes the system's "umask" to 0777 to work around +// a race condition between creating the socket and setting its permissions. While +// this should only be for a short duration, it may affect other processes that +// create files/directories during that period. +func NewUnixSocketWithOpts(path string, opts ...SockOption) (net.Listener, error) { if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) { return nil, err } - mask := syscall.Umask(0777) - defer syscall.Umask(mask) + // net.Listen does not allow for permissions to be set. As a result, when + // specifying custom permissions ("WithChmod()"), there is a short time + // between creating the socket and applying the permissions, during which + // the socket permissions are Less restrictive than desired. + // + // To work around this limitation of net.Listen(), we temporarily set the + // umask to 0777, which forces the socket to be created with 000 permissions + // (i.e.: no access for anyone). After that, WithChmod() must be used to set + // the desired permissions. + // + // We don't use "defer" here, to reset the umask to its original value as soon + // as possible. Ideally we'd be able to detect if WithChmod() was passed as + // an option, and skip changing umask if default permissions are used. + origUmask := syscall.Umask(0o777) l, err := net.Listen("unix", path) + syscall.Umask(origUmask) if err != nil { return nil, err } - if err := os.Chown(path, 0, gid); err != nil { - l.Close() - return nil, err - } - if err := os.Chmod(path, 0660); err != nil { - l.Close() - return nil, err + + for _, op := range opts { + if err := op(path); err != nil { + _ = l.Close() + return nil, err + } } + return l, nil } + +// NewUnixSocket creates a unix socket with the specified path and group. +func NewUnixSocket(path string, gid int) (net.Listener, error) { + return NewUnixSocketWithOpts(path, WithChown(0, gid), WithChmod(0o660)) +} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go b/vendor/github.com/docker/go-connections/tlsconfig/certpool.go similarity index 91% rename from vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go rename to vendor/github.com/docker/go-connections/tlsconfig/certpool.go index 600e0c7d..f84c624b 100644 --- a/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go +++ b/vendor/github.com/docker/go-connections/tlsconfig/certpool.go @@ -1,6 +1,3 @@ -//go:build go1.7 -// +build go1.7 - package tlsconfig import ( diff --git a/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go b/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go deleted file mode 100644 index e84af642..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !go1.7 -// +build !go1.7 - -package tlsconfig - -import ( - "crypto/x509" -) - -// SystemCertPool returns an new empty cert pool, -// accessing system cert pool is supported in go 1.7 -func SystemCertPool() (*x509.CertPool, error) { - return x509.NewCertPool(), nil -} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config.go b/vendor/github.com/docker/go-connections/tlsconfig/config.go index 2490c6ac..606c98a3 100644 --- a/vendor/github.com/docker/go-connections/tlsconfig/config.go +++ b/vendor/github.com/docker/go-connections/tlsconfig/config.go @@ -10,11 +10,9 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" + "errors" "fmt" - "io/ioutil" "os" - - "github.com/pkg/errors" ) // Options represents the information needed to create client and server TLS configurations. @@ -37,7 +35,12 @@ type Options struct { ExclusiveRootPools bool MinVersion uint16 // If Passphrase is set, it will be used to decrypt a TLS private key - // if the key is encrypted + // if the key is encrypted. + // + // Deprecated: Use of encrypted TLS private keys has been deprecated, and + // will be removed in a future release. Golang has deprecated support for + // legacy PEM encryption (as specified in RFC 1423), as it is insecure by + // design (see https://go-review.googlesource.com/c/go/+/264159). Passphrase string } @@ -54,18 +57,9 @@ var acceptedCBCCiphers = []uint16{ // known weak algorithms removed. var DefaultServerAcceptedCiphers = append(clientCipherSuites, acceptedCBCCiphers...) -// allTLSVersions lists all the TLS versions and is used by the code that validates -// a uint16 value as a TLS version. -var allTLSVersions = map[uint16]struct{}{ - tls.VersionSSL30: {}, - tls.VersionTLS10: {}, - tls.VersionTLS11: {}, - tls.VersionTLS12: {}, -} - // ServerDefault returns a secure-enough TLS configuration for the server TLS configuration. func ServerDefault(ops ...func(*tls.Config)) *tls.Config { - tlsconfig := &tls.Config{ + tlsConfig := &tls.Config{ // Avoid fallback by default to SSL protocols < TLS1.2 MinVersion: tls.VersionTLS12, PreferServerCipherSuites: true, @@ -73,25 +67,25 @@ func ServerDefault(ops ...func(*tls.Config)) *tls.Config { } for _, op := range ops { - op(tlsconfig) + op(tlsConfig) } - return tlsconfig + return tlsConfig } // ClientDefault returns a secure-enough TLS configuration for the client TLS configuration. func ClientDefault(ops ...func(*tls.Config)) *tls.Config { - tlsconfig := &tls.Config{ + tlsConfig := &tls.Config{ // Prefer TLS1.2 as the client minimum MinVersion: tls.VersionTLS12, CipherSuites: clientCipherSuites, } for _, op := range ops { - op(tlsconfig) + op(tlsConfig) } - return tlsconfig + return tlsConfig } // certPool returns an X.509 certificate pool from `caFile`, the certificate file. @@ -109,16 +103,25 @@ func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) { return nil, fmt.Errorf("failed to read system certificates: %v", err) } } - pem, err := ioutil.ReadFile(caFile) + pemData, err := os.ReadFile(caFile) if err != nil { return nil, fmt.Errorf("could not read CA certificate %q: %v", caFile, err) } - if !certPool.AppendCertsFromPEM(pem) { + if !certPool.AppendCertsFromPEM(pemData) { return nil, fmt.Errorf("failed to append certificates from PEM file: %q", caFile) } return certPool, nil } +// allTLSVersions lists all the TLS versions and is used by the code that validates +// a uint16 value as a TLS version. +var allTLSVersions = map[uint16]struct{}{ + tls.VersionTLS10: {}, + tls.VersionTLS11: {}, + tls.VersionTLS12: {}, + tls.VersionTLS13: {}, +} + // isValidMinVersion checks that the input value is a valid tls minimum version func isValidMinVersion(version uint16) bool { _, ok := allTLSVersions[version] @@ -130,10 +133,10 @@ func isValidMinVersion(version uint16) bool { func adjustMinVersion(options Options, config *tls.Config) error { if options.MinVersion > 0 { if !isValidMinVersion(options.MinVersion) { - return fmt.Errorf("Invalid minimum TLS version: %x", options.MinVersion) + return fmt.Errorf("invalid minimum TLS version: %x", options.MinVersion) } if options.MinVersion < config.MinVersion { - return fmt.Errorf("Requested minimum TLS version is too low. Should be at-least: %x", config.MinVersion) + return fmt.Errorf("requested minimum TLS version is too low. Should be at-least: %x", config.MinVersion) } config.MinVersion = options.MinVersion } @@ -142,9 +145,14 @@ func adjustMinVersion(options Options, config *tls.Config) error { } // IsErrEncryptedKey returns true if the 'err' is an error of incorrect -// password when tryin to decrypt a TLS private key +// password when trying to decrypt a TLS private key. +// +// Deprecated: Use of encrypted TLS private keys has been deprecated, and +// will be removed in a future release. Golang has deprecated support for +// legacy PEM encryption (as specified in RFC 1423), as it is insecure by +// design (see https://go-review.googlesource.com/c/go/+/264159). func IsErrEncryptedKey(err error) bool { - return errors.Cause(err) == x509.IncorrectPasswordError + return errors.Is(err, x509.IncorrectPasswordError) } // getPrivateKey returns the private key in 'keyBytes', in PEM-encoded format. @@ -158,10 +166,10 @@ func getPrivateKey(keyBytes []byte, passphrase string) ([]byte, error) { } var err error - if x509.IsEncryptedPEMBlock(pemBlock) { - keyBytes, err = x509.DecryptPEMBlock(pemBlock, []byte(passphrase)) + if x509.IsEncryptedPEMBlock(pemBlock) { //nolint:staticcheck // Ignore SA1019 (IsEncryptedPEMBlock is deprecated) + keyBytes, err = x509.DecryptPEMBlock(pemBlock, []byte(passphrase)) //nolint:staticcheck // Ignore SA1019 (DecryptPEMBlock is deprecated) if err != nil { - return nil, errors.Wrap(err, "private key is encrypted, but could not decrypt it") + return nil, fmt.Errorf("private key is encrypted, but could not decrypt it: %w", err) } keyBytes = pem.EncodeToMemory(&pem.Block{Type: pemBlock.Type, Bytes: keyBytes}) } @@ -177,26 +185,24 @@ func getCert(options Options) ([]tls.Certificate, error) { return nil, nil } - errMessage := "Could not load X509 key pair" - - cert, err := ioutil.ReadFile(options.CertFile) + cert, err := os.ReadFile(options.CertFile) if err != nil { - return nil, errors.Wrap(err, errMessage) + return nil, err } - prKeyBytes, err := ioutil.ReadFile(options.KeyFile) + prKeyBytes, err := os.ReadFile(options.KeyFile) if err != nil { - return nil, errors.Wrap(err, errMessage) + return nil, err } prKeyBytes, err = getPrivateKey(prKeyBytes, options.Passphrase) if err != nil { - return nil, errors.Wrap(err, errMessage) + return nil, err } tlsCert, err := tls.X509KeyPair(cert, prKeyBytes) if err != nil { - return nil, errors.Wrap(err, errMessage) + return nil, err } return []tls.Certificate{tlsCert}, nil @@ -216,7 +222,7 @@ func Client(options Options) (*tls.Config, error) { tlsCerts, err := getCert(options) if err != nil { - return nil, err + return nil, fmt.Errorf("could not load X509 key pair: %w", err) } tlsConfig.Certificates = tlsCerts @@ -234,9 +240,9 @@ func Server(options Options) (*tls.Config, error) { tlsCert, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile) if err != nil { if os.IsNotExist(err) { - return nil, fmt.Errorf("Could not load X509 key pair (cert: %q, key: %q): %v", options.CertFile, options.KeyFile, err) + return nil, fmt.Errorf("could not load X509 key pair (cert: %q, key: %q): %v", options.CertFile, options.KeyFile, err) } - return nil, fmt.Errorf("Error reading X509 key pair (cert: %q, key: %q): %v. Make sure the key is not encrypted.", options.CertFile, options.KeyFile, err) + return nil, fmt.Errorf("error reading X509 key pair - make sure the key is not encrypted (cert: %q, key: %q): %v", options.CertFile, options.KeyFile, err) } tlsConfig.Certificates = []tls.Certificate{tlsCert} if options.ClientAuth >= tls.VerifyClientCertIfGiven && options.CAFile != "" { diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go b/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go index dd1cfb8f..a82f9fa5 100644 --- a/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go +++ b/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go @@ -1,6 +1,3 @@ -//go:build go1.5 -// +build go1.5 - // Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers. package tlsconfig diff --git a/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go b/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go deleted file mode 100644 index 061cd6f7..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build !go1.5 -// +build !go1.5 - -// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers. -package tlsconfig - -import ( - "crypto/tls" -) - -// Client TLS cipher suites (dropping CBC ciphers for client preferred suite set) -var clientCipherSuites = []uint16{ - tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, -} diff --git a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md index 02a73ccf..9e790390 100644 --- a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md +++ b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md @@ -1,6 +1,27 @@ # Change history of go-restful -## [v3.10.1] - 2022-11-19 + +## [v3.12.0] - 2024-03-11 +- add Flush method #529 (#538) +- fix: Improper handling of empty POST requests (#543) + +## [v3.11.3] - 2024-01-09 +- better not have 2 tags on one commit + +## [v3.11.1, v3.11.2] - 2024-01-09 + +- fix by restoring custom JSON handler functions (Mike Beaumont #540) + +## [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..7234604e 100644 --- a/vendor/github.com/emicklei/go-restful/v3/README.md +++ b/vendor/github.com/emicklei/go-restful/v3/README.md @@ -2,7 +2,6 @@ go-restful ========== package for building REST-style Web Services using Google Go -[![Build Status](https://travis-ci.org/emicklei/go-restful.png)](https://travis-ci.org/emicklei/go-restful) [![Go Report Card](https://goreportcard.com/badge/github.com/emicklei/go-restful)](https://goreportcard.com/report/github.com/emicklei/go-restful) [![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://pkg.go.dev/github.com/emicklei/go-restful) [![codecov](https://codecov.io/gh/emicklei/go-restful/branch/master/graph/badge.svg)](https://codecov.io/gh/emicklei/go-restful) @@ -79,7 +78,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 @@ -95,7 +94,7 @@ There are several hooks to customize the behavior of the go-restful package. - Trace logging - 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 +107,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/compress.go b/vendor/github.com/emicklei/go-restful/v3/compress.go index 1ff239f9..80adf55f 100644 --- a/vendor/github.com/emicklei/go-restful/v3/compress.go +++ b/vendor/github.com/emicklei/go-restful/v3/compress.go @@ -49,6 +49,16 @@ func (c *CompressingResponseWriter) CloseNotify() <-chan bool { return c.writer.(http.CloseNotifier).CloseNotify() } +// Flush is part of http.Flusher interface. Noop if the underlying writer doesn't support it. +func (c *CompressingResponseWriter) Flush() { + flusher, ok := c.writer.(http.Flusher) + if !ok { + // writer doesn't support http.Flusher interface + return + } + flusher.Flush() +} + // Close the underlying compressor func (c *CompressingResponseWriter) Close() error { if c.isCompressorClosed() { diff --git a/vendor/github.com/emicklei/go-restful/v3/curly.go b/vendor/github.com/emicklei/go-restful/v3/curly.go index d7a27a9a..ba1fc5d5 100644 --- a/vendor/github.com/emicklei/go-restful/v3/curly.go +++ b/vendor/github.com/emicklei/go-restful/v3/curly.go @@ -72,7 +72,7 @@ func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []strin return false, 0, 0 } requestToken := requestTokens[i] - if routeHasCustomVerb && hasCustomVerb(routeToken) { + if routeHasCustomVerb && hasCustomVerb(routeToken){ if !isMatchCustomVerb(routeToken, requestToken) { return false, 0, 0 } diff --git a/vendor/github.com/emicklei/go-restful/v3/doc.go b/vendor/github.com/emicklei/go-restful/v3/doc.go index 5bdb9bb1..69b13057 100644 --- a/vendor/github.com/emicklei/go-restful/v3/doc.go +++ b/vendor/github.com/emicklei/go-restful/v3/doc.go @@ -1,7 +1,7 @@ /* Package restful , a lean package for creating REST-style WebServices without magic. -# WebServices and Routes +WebServices and Routes A WebService has a collection of Route objects that dispatch incoming Http Requests to a function calls. Typically, a WebService has a root path (e.g. /users) and defines common MIME types for its routes. @@ -30,14 +30,14 @@ The (*Request, *Response) arguments provide functions for reading information fr See the example https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go with a full implementation. -# Regular expression matching Routes +Regular expression matching Routes A Route parameter can be specified using the format "uri/{var[:regexp]}" or the special version "uri/{var:*}" for matching the tail of the path. For example, /persons/{name:[A-Z][A-Z]} can be used to restrict values for the parameter "name" to only contain capital alphabetic characters. Regular expressions must use the standard Go syntax as described in the regexp package. (https://code.google.com/p/re2/wiki/Syntax) This feature requires the use of a CurlyRouter. -# Containers +Containers A Container holds a collection of WebServices, Filters and a http.ServeMux for multiplexing http requests. Using the statements "restful.Add(...) and restful.Filter(...)" will register WebServices and Filters to the Default Container. @@ -47,7 +47,7 @@ You can create your own Container and create a new http.Server for that particul container := restful.NewContainer() server := &http.Server{Addr: ":8081", Handler: container} -# Filters +Filters A filter dynamically intercepts requests and responses to transform or use the information contained in the requests or responses. You can use filters to perform generic logging, measurement, authentication, redirect, set response headers etc. @@ -60,21 +60,22 @@ Use the following statement to pass the request,response pair to the next filter chain.ProcessFilter(req, resp) -# Container Filters +Container Filters These are processed before any registered WebService. // install a (global) filter for the default container (processed before any webservice) restful.Filter(globalLogging) -# WebService Filters +WebService Filters These are processed before any Route of a WebService. // install a webservice filter (processed before any route) ws.Filter(webserviceLogging).Filter(measureTime) -# Route Filters + +Route Filters These are processed before calling the function associated with the Route. @@ -83,7 +84,7 @@ These are processed before calling the function associated with the Route. See the example https://github.com/emicklei/go-restful/blob/v3/examples/filters/restful-filters.go with full implementations. -# Response Encoding +Response Encoding Two encodings are supported: gzip and deflate. To enable this for all responses: @@ -94,20 +95,20 @@ Alternatively, you can create a Filter that performs the encoding and install it See the example https://github.com/emicklei/go-restful/blob/v3/examples/encoding/restful-encoding-filter.go -# OPTIONS support +OPTIONS support By installing a pre-defined container filter, your Webservice(s) can respond to the OPTIONS Http request. Filter(OPTIONSFilter()) -# CORS +CORS By installing the filter of a CrossOriginResourceSharing (CORS), your WebService(s) can handle CORS requests. cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer} Filter(cors.Filter) -# Error Handling +Error Handling Unexpected things happen. If a request cannot be processed because of a failure, your service needs to tell via the response what happened and why. For this reason HTTP status codes exist and it is important to use the correct code in every exceptional situation. @@ -136,11 +137,11 @@ The request does not have or has an unknown Accept Header set for this operation The request does not have or has an unknown Content-Type Header set for this operation. -# ServiceError +ServiceError In addition to setting the correct (error) Http status code, you can choose to write a ServiceError message on the response. -# Performance options +Performance options This package has several options that affect the performance of your service. It is important to understand them and how you can change it. @@ -155,27 +156,30 @@ Default value is true If content encoding is enabled then the default strategy for getting new gzip/zlib writers and readers is to use a sync.Pool. Because writers are expensive structures, performance is even more improved when using a preloaded cache. You can also inject your own implementation. -# Trouble shooting +Trouble shooting This package has the means to produce detail logging of the complete Http request matching process and filter invocation. Enabling this feature requires you to set an implementation of restful.StdLogger (e.g. log.Logger) instance such as: restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile)) -# Logging +Logging The restful.SetLogger() method allows you to override the logger used by the package. By default restful uses the standard library `log` package and logs to stdout. Different logging packages are supported as long as they conform to `StdLogger` interface defined in the `log` sub-package, writing an adapter for your preferred package is simple. -# Resources - -(c) 2012-2015, http://ernestmicklei.com. MIT License +Resources [project]: https://github.com/emicklei/go-restful + [examples]: https://github.com/emicklei/go-restful/blob/master/examples -[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/ + +[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/ + [showcases]: https://github.com/emicklei/mora, https://github.com/emicklei/landskape + +(c) 2012-2015, http://ernestmicklei.com. MIT License */ package restful diff --git a/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go index 66dfc824..9808752a 100644 --- a/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go +++ b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go @@ -5,11 +5,18 @@ package restful // that can be found in the LICENSE file. import ( + "encoding/json" "encoding/xml" "strings" "sync" ) +var ( + MarshalIndent = json.MarshalIndent + NewDecoder = json.NewDecoder + NewEncoder = json.NewEncoder +) + // EntityReaderWriter can read and write values using an encoding such as JSON,XML. type EntityReaderWriter interface { // Read a serialized version of the value from the request. diff --git a/vendor/github.com/emicklei/go-restful/v3/json.go b/vendor/github.com/emicklei/go-restful/v3/json.go deleted file mode 100644 index 23a83fb4..00000000 --- a/vendor/github.com/emicklei/go-restful/v3/json.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build !jsoniter -// +build !jsoniter - -package restful - -import "encoding/json" - -var ( - MarshalIndent = json.MarshalIndent - NewDecoder = json.NewDecoder - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/emicklei/go-restful/v3/jsoniter.go b/vendor/github.com/emicklei/go-restful/v3/jsoniter.go deleted file mode 100644 index ba9dd9ab..00000000 --- a/vendor/github.com/emicklei/go-restful/v3/jsoniter.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build jsoniter -// +build jsoniter - -package restful - -import "github.com/json-iterator/go" - -var ( - json = jsoniter.ConfigCompatibleWithStandardLibrary - MarshalIndent = json.MarshalIndent - NewDecoder = json.NewDecoder - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/emicklei/go-restful/v3/jsr311.go b/vendor/github.com/emicklei/go-restful/v3/jsr311.go index 07a0c91e..a9b3faaa 100644 --- a/vendor/github.com/emicklei/go-restful/v3/jsr311.go +++ b/vendor/github.com/emicklei/go-restful/v3/jsr311.go @@ -155,7 +155,7 @@ func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*R method, length := httpRequest.Method, httpRequest.Header.Get("Content-Length") if (method == http.MethodPost || method == http.MethodPut || - method == http.MethodPatch) && length == "" { + method == http.MethodPatch) && (length == "" || length == "0") { return nil, NewError( http.StatusUnsupportedMediaType, fmt.Sprintf("415: Unsupported Media Type\n\nAvailable representations: %s", strings.Join(available, ", ")), diff --git a/vendor/github.com/emicklei/go-restful/v3/response.go b/vendor/github.com/emicklei/go-restful/v3/response.go index 09fb3c75..a41a92cc 100644 --- a/vendor/github.com/emicklei/go-restful/v3/response.go +++ b/vendor/github.com/emicklei/go-restful/v3/response.go @@ -14,7 +14,7 @@ import ( // DefaultResponseMimeType is DEPRECATED, use DefaultResponseContentType(mime) var DefaultResponseMimeType string -// PrettyPrintResponses controls the indentation feature of XML and JSON serialization +//PrettyPrintResponses controls the indentation feature of XML and JSON serialization var PrettyPrintResponses = true // Response is a wrapper on the actual http ResponseWriter @@ -40,8 +40,7 @@ func NewResponse(httpWriter http.ResponseWriter) *Response { // If Accept header matching fails, fall back to this type. // Valid values are restful.MIME_JSON and restful.MIME_XML // Example: -// -// restful.DefaultResponseContentType(restful.MIME_JSON) +// restful.DefaultResponseContentType(restful.MIME_JSON) func DefaultResponseContentType(mime string) { DefaultResponseMimeType = mime } 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/emicklei/go-restful/v3/web_service.go b/vendor/github.com/emicklei/go-restful/v3/web_service.go index 336a0bc2..789c4df2 100644 --- a/vendor/github.com/emicklei/go-restful/v3/web_service.go +++ b/vendor/github.com/emicklei/go-restful/v3/web_service.go @@ -188,20 +188,20 @@ func (w *WebService) Route(builder *RouteBuilder) *WebService { // RemoveRoute removes the specified route, looks for something that matches 'path' and 'method' func (w *WebService) RemoveRoute(path, method string) error { - if !w.dynamicRoutes { - return errors.New("dynamic routes are not enabled.") - } - w.routesLock.Lock() - defer w.routesLock.Unlock() - newRoutes := []Route{} - for _, route := range w.routes { - if route.Method == method && route.Path == path { - continue - } - newRoutes = append(newRoutes, route) - } - w.routes = newRoutes - return nil + if !w.dynamicRoutes { + return errors.New("dynamic routes are not enabled.") + } + w.routesLock.Lock() + defer w.routesLock.Unlock() + newRoutes := []Route{} + for _, route := range w.routes { + if route.Method == method && route.Path == path { + continue + } + newRoutes = append(newRoutes, route) + } + w.routes = newRoutes + return nil } // Method creates a new RouteBuilder and initialize its http method diff --git a/vendor/github.com/felixge/httpsnoop/.gitignore b/vendor/github.com/felixge/httpsnoop/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/felixge/httpsnoop/LICENSE.txt b/vendor/github.com/felixge/httpsnoop/LICENSE.txt new file mode 100644 index 00000000..e028b46a --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016 Felix Geisendörfer (felix@debuggable.com) + + 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/felixge/httpsnoop/Makefile b/vendor/github.com/felixge/httpsnoop/Makefile new file mode 100644 index 00000000..4e12afdd --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/Makefile @@ -0,0 +1,10 @@ +.PHONY: ci generate clean + +ci: clean generate + go test -race -v ./... + +generate: + go generate . + +clean: + rm -rf *_generated*.go diff --git a/vendor/github.com/felixge/httpsnoop/README.md b/vendor/github.com/felixge/httpsnoop/README.md new file mode 100644 index 00000000..cf6b42f3 --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/README.md @@ -0,0 +1,95 @@ +# httpsnoop + +Package httpsnoop provides an easy way to capture http related metrics (i.e. +response time, bytes written, and http status code) from your application's +http.Handlers. + +Doing this requires non-trivial wrapping of the http.ResponseWriter interface, +which is also exposed for users interested in a more low-level API. + +[![Go Reference](https://pkg.go.dev/badge/github.com/felixge/httpsnoop.svg)](https://pkg.go.dev/github.com/felixge/httpsnoop) +[![Build Status](https://github.com/felixge/httpsnoop/actions/workflows/main.yaml/badge.svg)](https://github.com/felixge/httpsnoop/actions/workflows/main.yaml) + +## Usage Example + +```go +// myH is your app's http handler, perhaps a http.ServeMux or similar. +var myH http.Handler +// wrappedH wraps myH in order to log every request. +wrappedH := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + m := httpsnoop.CaptureMetrics(myH, w, r) + log.Printf( + "%s %s (code=%d dt=%s written=%d)", + r.Method, + r.URL, + m.Code, + m.Duration, + m.Written, + ) +}) +http.ListenAndServe(":8080", wrappedH) +``` + +## Why this package exists + +Instrumenting an application's http.Handler is surprisingly difficult. + +However if you google for e.g. "capture ResponseWriter status code" you'll find +lots of advise and code examples that suggest it to be a fairly trivial +undertaking. Unfortunately everything I've seen so far has a high chance of +breaking your application. + +The main problem is that a `http.ResponseWriter` often implements additional +interfaces such as `http.Flusher`, `http.CloseNotifier`, `http.Hijacker`, `http.Pusher`, and +`io.ReaderFrom`. So the naive approach of just wrapping `http.ResponseWriter` +in your own struct that also implements the `http.ResponseWriter` interface +will hide the additional interfaces mentioned above. This has a high change of +introducing subtle bugs into any non-trivial application. + +Another approach I've seen people take is to return a struct that implements +all of the interfaces above. However, that's also problematic, because it's +difficult to fake some of these interfaces behaviors when the underlying +`http.ResponseWriter` doesn't have an implementation. It's also dangerous, +because an application may choose to operate differently, merely because it +detects the presence of these additional interfaces. + +This package solves this problem by checking which additional interfaces a +`http.ResponseWriter` implements, returning a wrapped version implementing the +exact same set of interfaces. + +Additionally this package properly handles edge cases such as `WriteHeader` not +being called, or called more than once, as well as concurrent calls to +`http.ResponseWriter` methods, and even calls happening after the wrapped +`ServeHTTP` has already returned. + +Unfortunately this package is not perfect either. It's possible that it is +still missing some interfaces provided by the go core (let me know if you find +one), and it won't work for applications adding their own interfaces into the +mix. You can however use `httpsnoop.Unwrap(w)` to access the underlying +`http.ResponseWriter` and type-assert the result to its other interfaces. + +However, hopefully the explanation above has sufficiently scared you of rolling +your own solution to this problem. httpsnoop may still break your application, +but at least it tries to avoid it as much as possible. + +Anyway, the real problem here is that smuggling additional interfaces inside +`http.ResponseWriter` is a problematic design choice, but it probably goes as +deep as the Go language specification itself. But that's okay, I still prefer +Go over the alternatives ;). + +## Performance + +``` +BenchmarkBaseline-8 20000 94912 ns/op +BenchmarkCaptureMetrics-8 20000 95461 ns/op +``` + +As you can see, using `CaptureMetrics` on a vanilla http.Handler introduces an +overhead of ~500 ns per http request on my machine. However, the margin of +error appears to be larger than that, therefor it should be reasonable to +assume that the overhead introduced by `CaptureMetrics` is absolutely +negligible. + +## License + +MIT diff --git a/vendor/github.com/felixge/httpsnoop/capture_metrics.go b/vendor/github.com/felixge/httpsnoop/capture_metrics.go new file mode 100644 index 00000000..bec7b71b --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/capture_metrics.go @@ -0,0 +1,86 @@ +package httpsnoop + +import ( + "io" + "net/http" + "time" +) + +// Metrics holds metrics captured from CaptureMetrics. +type Metrics struct { + // Code is the first http response code passed to the WriteHeader func of + // the ResponseWriter. If no such call is made, a default code of 200 is + // assumed instead. + Code int + // Duration is the time it took to execute the handler. + Duration time.Duration + // Written is the number of bytes successfully written by the Write or + // ReadFrom function of the ResponseWriter. ResponseWriters may also write + // data to their underlaying connection directly (e.g. headers), but those + // are not tracked. Therefor the number of Written bytes will usually match + // the size of the response body. + Written int64 +} + +// CaptureMetrics wraps the given hnd, executes it with the given w and r, and +// returns the metrics it captured from it. +func CaptureMetrics(hnd http.Handler, w http.ResponseWriter, r *http.Request) Metrics { + return CaptureMetricsFn(w, func(ww http.ResponseWriter) { + hnd.ServeHTTP(ww, r) + }) +} + +// CaptureMetricsFn wraps w and calls fn with the wrapped w and returns the +// resulting metrics. This is very similar to CaptureMetrics (which is just +// sugar on top of this func), but is a more usable interface if your +// application doesn't use the Go http.Handler interface. +func CaptureMetricsFn(w http.ResponseWriter, fn func(http.ResponseWriter)) Metrics { + m := Metrics{Code: http.StatusOK} + m.CaptureMetrics(w, fn) + return m +} + +// CaptureMetrics wraps w and calls fn with the wrapped w and updates +// Metrics m with the resulting metrics. This is similar to CaptureMetricsFn, +// but allows one to customize starting Metrics object. +func (m *Metrics) CaptureMetrics(w http.ResponseWriter, fn func(http.ResponseWriter)) { + var ( + start = time.Now() + headerWritten bool + hooks = Hooks{ + WriteHeader: func(next WriteHeaderFunc) WriteHeaderFunc { + return func(code int) { + next(code) + + if !(code >= 100 && code <= 199) && !headerWritten { + m.Code = code + headerWritten = true + } + } + }, + + Write: func(next WriteFunc) WriteFunc { + return func(p []byte) (int, error) { + n, err := next(p) + + m.Written += int64(n) + headerWritten = true + return n, err + } + }, + + ReadFrom: func(next ReadFromFunc) ReadFromFunc { + return func(src io.Reader) (int64, error) { + n, err := next(src) + + headerWritten = true + m.Written += n + return n, err + } + }, + } + ) + + fn(Wrap(w, hooks)) + m.Duration += time.Since(start) +} diff --git a/vendor/github.com/felixge/httpsnoop/docs.go b/vendor/github.com/felixge/httpsnoop/docs.go new file mode 100644 index 00000000..203c35b3 --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/docs.go @@ -0,0 +1,10 @@ +// Package httpsnoop provides an easy way to capture http related metrics (i.e. +// response time, bytes written, and http status code) from your application's +// http.Handlers. +// +// Doing this requires non-trivial wrapping of the http.ResponseWriter +// interface, which is also exposed for users interested in a more low-level +// API. +package httpsnoop + +//go:generate go run codegen/main.go diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go new file mode 100644 index 00000000..101cedde --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/wrap_generated_gteq_1.8.go @@ -0,0 +1,436 @@ +// +build go1.8 +// Code generated by "httpsnoop/codegen"; DO NOT EDIT. + +package httpsnoop + +import ( + "bufio" + "io" + "net" + "net/http" +) + +// HeaderFunc is part of the http.ResponseWriter interface. +type HeaderFunc func() http.Header + +// WriteHeaderFunc is part of the http.ResponseWriter interface. +type WriteHeaderFunc func(code int) + +// WriteFunc is part of the http.ResponseWriter interface. +type WriteFunc func(b []byte) (int, error) + +// FlushFunc is part of the http.Flusher interface. +type FlushFunc func() + +// CloseNotifyFunc is part of the http.CloseNotifier interface. +type CloseNotifyFunc func() <-chan bool + +// HijackFunc is part of the http.Hijacker interface. +type HijackFunc func() (net.Conn, *bufio.ReadWriter, error) + +// ReadFromFunc is part of the io.ReaderFrom interface. +type ReadFromFunc func(src io.Reader) (int64, error) + +// PushFunc is part of the http.Pusher interface. +type PushFunc func(target string, opts *http.PushOptions) error + +// Hooks defines a set of method interceptors for methods included in +// http.ResponseWriter as well as some others. You can think of them as +// middleware for the function calls they target. See Wrap for more details. +type Hooks struct { + Header func(HeaderFunc) HeaderFunc + WriteHeader func(WriteHeaderFunc) WriteHeaderFunc + Write func(WriteFunc) WriteFunc + Flush func(FlushFunc) FlushFunc + CloseNotify func(CloseNotifyFunc) CloseNotifyFunc + Hijack func(HijackFunc) HijackFunc + ReadFrom func(ReadFromFunc) ReadFromFunc + Push func(PushFunc) PushFunc +} + +// Wrap returns a wrapped version of w that provides the exact same interface +// as w. Specifically if w implements any combination of: +// +// - http.Flusher +// - http.CloseNotifier +// - http.Hijacker +// - io.ReaderFrom +// - http.Pusher +// +// The wrapped version will implement the exact same combination. If no hooks +// are set, the wrapped version also behaves exactly as w. Hooks targeting +// methods not supported by w are ignored. Any other hooks will intercept the +// method they target and may modify the call's arguments and/or return values. +// The CaptureMetrics implementation serves as a working example for how the +// hooks can be used. +func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter { + rw := &rw{w: w, h: hooks} + _, i0 := w.(http.Flusher) + _, i1 := w.(http.CloseNotifier) + _, i2 := w.(http.Hijacker) + _, i3 := w.(io.ReaderFrom) + _, i4 := w.(http.Pusher) + switch { + // combination 1/32 + case !i0 && !i1 && !i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + }{rw, rw} + // combination 2/32 + case !i0 && !i1 && !i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Pusher + }{rw, rw, rw} + // combination 3/32 + case !i0 && !i1 && !i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + io.ReaderFrom + }{rw, rw, rw} + // combination 4/32 + case !i0 && !i1 && !i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw} + // combination 5/32 + case !i0 && !i1 && i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Hijacker + }{rw, rw, rw} + // combination 6/32 + case !i0 && !i1 && i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Hijacker + http.Pusher + }{rw, rw, rw, rw} + // combination 7/32 + case !i0 && !i1 && i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw} + // combination 8/32 + case !i0 && !i1 && i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Hijacker + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw} + // combination 9/32 + case !i0 && i1 && !i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + }{rw, rw, rw} + // combination 10/32 + case !i0 && i1 && !i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Pusher + }{rw, rw, rw, rw} + // combination 11/32 + case !i0 && i1 && !i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + io.ReaderFrom + }{rw, rw, rw, rw} + // combination 12/32 + case !i0 && i1 && !i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw} + // combination 13/32 + case !i0 && i1 && i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Hijacker + }{rw, rw, rw, rw} + // combination 14/32 + case !i0 && i1 && i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Hijacker + http.Pusher + }{rw, rw, rw, rw, rw} + // combination 15/32 + case !i0 && i1 && i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw, rw} + // combination 16/32 + case !i0 && i1 && i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Hijacker + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw, rw} + // combination 17/32 + case i0 && !i1 && !i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + }{rw, rw, rw} + // combination 18/32 + case i0 && !i1 && !i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Pusher + }{rw, rw, rw, rw} + // combination 19/32 + case i0 && !i1 && !i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + io.ReaderFrom + }{rw, rw, rw, rw} + // combination 20/32 + case i0 && !i1 && !i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw} + // combination 21/32 + case i0 && !i1 && i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Hijacker + }{rw, rw, rw, rw} + // combination 22/32 + case i0 && !i1 && i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Hijacker + http.Pusher + }{rw, rw, rw, rw, rw} + // combination 23/32 + case i0 && !i1 && i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw, rw} + // combination 24/32 + case i0 && !i1 && i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Hijacker + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw, rw} + // combination 25/32 + case i0 && i1 && !i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + }{rw, rw, rw, rw} + // combination 26/32 + case i0 && i1 && !i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Pusher + }{rw, rw, rw, rw, rw} + // combination 27/32 + case i0 && i1 && !i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + io.ReaderFrom + }{rw, rw, rw, rw, rw} + // combination 28/32 + case i0 && i1 && !i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw, rw} + // combination 29/32 + case i0 && i1 && i2 && !i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Hijacker + }{rw, rw, rw, rw, rw} + // combination 30/32 + case i0 && i1 && i2 && !i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Hijacker + http.Pusher + }{rw, rw, rw, rw, rw, rw} + // combination 31/32 + case i0 && i1 && i2 && i3 && !i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw, rw, rw} + // combination 32/32 + case i0 && i1 && i2 && i3 && i4: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Hijacker + io.ReaderFrom + http.Pusher + }{rw, rw, rw, rw, rw, rw, rw} + } + panic("unreachable") +} + +type rw struct { + w http.ResponseWriter + h Hooks +} + +func (w *rw) Unwrap() http.ResponseWriter { + return w.w +} + +func (w *rw) Header() http.Header { + f := w.w.(http.ResponseWriter).Header + if w.h.Header != nil { + f = w.h.Header(f) + } + return f() +} + +func (w *rw) WriteHeader(code int) { + f := w.w.(http.ResponseWriter).WriteHeader + if w.h.WriteHeader != nil { + f = w.h.WriteHeader(f) + } + f(code) +} + +func (w *rw) Write(b []byte) (int, error) { + f := w.w.(http.ResponseWriter).Write + if w.h.Write != nil { + f = w.h.Write(f) + } + return f(b) +} + +func (w *rw) Flush() { + f := w.w.(http.Flusher).Flush + if w.h.Flush != nil { + f = w.h.Flush(f) + } + f() +} + +func (w *rw) CloseNotify() <-chan bool { + f := w.w.(http.CloseNotifier).CloseNotify + if w.h.CloseNotify != nil { + f = w.h.CloseNotify(f) + } + return f() +} + +func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) { + f := w.w.(http.Hijacker).Hijack + if w.h.Hijack != nil { + f = w.h.Hijack(f) + } + return f() +} + +func (w *rw) ReadFrom(src io.Reader) (int64, error) { + f := w.w.(io.ReaderFrom).ReadFrom + if w.h.ReadFrom != nil { + f = w.h.ReadFrom(f) + } + return f(src) +} + +func (w *rw) Push(target string, opts *http.PushOptions) error { + f := w.w.(http.Pusher).Push + if w.h.Push != nil { + f = w.h.Push(f) + } + return f(target, opts) +} + +type Unwrapper interface { + Unwrap() http.ResponseWriter +} + +// Unwrap returns the underlying http.ResponseWriter from within zero or more +// layers of httpsnoop wrappers. +func Unwrap(w http.ResponseWriter) http.ResponseWriter { + if rw, ok := w.(Unwrapper); ok { + // recurse until rw.Unwrap() returns a non-Unwrapper + return Unwrap(rw.Unwrap()) + } else { + return w + } +} diff --git a/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go new file mode 100644 index 00000000..e0951df1 --- /dev/null +++ b/vendor/github.com/felixge/httpsnoop/wrap_generated_lt_1.8.go @@ -0,0 +1,278 @@ +// +build !go1.8 +// Code generated by "httpsnoop/codegen"; DO NOT EDIT. + +package httpsnoop + +import ( + "bufio" + "io" + "net" + "net/http" +) + +// HeaderFunc is part of the http.ResponseWriter interface. +type HeaderFunc func() http.Header + +// WriteHeaderFunc is part of the http.ResponseWriter interface. +type WriteHeaderFunc func(code int) + +// WriteFunc is part of the http.ResponseWriter interface. +type WriteFunc func(b []byte) (int, error) + +// FlushFunc is part of the http.Flusher interface. +type FlushFunc func() + +// CloseNotifyFunc is part of the http.CloseNotifier interface. +type CloseNotifyFunc func() <-chan bool + +// HijackFunc is part of the http.Hijacker interface. +type HijackFunc func() (net.Conn, *bufio.ReadWriter, error) + +// ReadFromFunc is part of the io.ReaderFrom interface. +type ReadFromFunc func(src io.Reader) (int64, error) + +// Hooks defines a set of method interceptors for methods included in +// http.ResponseWriter as well as some others. You can think of them as +// middleware for the function calls they target. See Wrap for more details. +type Hooks struct { + Header func(HeaderFunc) HeaderFunc + WriteHeader func(WriteHeaderFunc) WriteHeaderFunc + Write func(WriteFunc) WriteFunc + Flush func(FlushFunc) FlushFunc + CloseNotify func(CloseNotifyFunc) CloseNotifyFunc + Hijack func(HijackFunc) HijackFunc + ReadFrom func(ReadFromFunc) ReadFromFunc +} + +// Wrap returns a wrapped version of w that provides the exact same interface +// as w. Specifically if w implements any combination of: +// +// - http.Flusher +// - http.CloseNotifier +// - http.Hijacker +// - io.ReaderFrom +// +// The wrapped version will implement the exact same combination. If no hooks +// are set, the wrapped version also behaves exactly as w. Hooks targeting +// methods not supported by w are ignored. Any other hooks will intercept the +// method they target and may modify the call's arguments and/or return values. +// The CaptureMetrics implementation serves as a working example for how the +// hooks can be used. +func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter { + rw := &rw{w: w, h: hooks} + _, i0 := w.(http.Flusher) + _, i1 := w.(http.CloseNotifier) + _, i2 := w.(http.Hijacker) + _, i3 := w.(io.ReaderFrom) + switch { + // combination 1/16 + case !i0 && !i1 && !i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + }{rw, rw} + // combination 2/16 + case !i0 && !i1 && !i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + io.ReaderFrom + }{rw, rw, rw} + // combination 3/16 + case !i0 && !i1 && i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.Hijacker + }{rw, rw, rw} + // combination 4/16 + case !i0 && !i1 && i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw} + // combination 5/16 + case !i0 && i1 && !i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + }{rw, rw, rw} + // combination 6/16 + case !i0 && i1 && !i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + io.ReaderFrom + }{rw, rw, rw, rw} + // combination 7/16 + case !i0 && i1 && i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Hijacker + }{rw, rw, rw, rw} + // combination 8/16 + case !i0 && i1 && i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.CloseNotifier + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw, rw} + // combination 9/16 + case i0 && !i1 && !i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + }{rw, rw, rw} + // combination 10/16 + case i0 && !i1 && !i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + io.ReaderFrom + }{rw, rw, rw, rw} + // combination 11/16 + case i0 && !i1 && i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Hijacker + }{rw, rw, rw, rw} + // combination 12/16 + case i0 && !i1 && i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw, rw} + // combination 13/16 + case i0 && i1 && !i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + }{rw, rw, rw, rw} + // combination 14/16 + case i0 && i1 && !i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + io.ReaderFrom + }{rw, rw, rw, rw, rw} + // combination 15/16 + case i0 && i1 && i2 && !i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Hijacker + }{rw, rw, rw, rw, rw} + // combination 16/16 + case i0 && i1 && i2 && i3: + return struct { + Unwrapper + http.ResponseWriter + http.Flusher + http.CloseNotifier + http.Hijacker + io.ReaderFrom + }{rw, rw, rw, rw, rw, rw} + } + panic("unreachable") +} + +type rw struct { + w http.ResponseWriter + h Hooks +} + +func (w *rw) Unwrap() http.ResponseWriter { + return w.w +} + +func (w *rw) Header() http.Header { + f := w.w.(http.ResponseWriter).Header + if w.h.Header != nil { + f = w.h.Header(f) + } + return f() +} + +func (w *rw) WriteHeader(code int) { + f := w.w.(http.ResponseWriter).WriteHeader + if w.h.WriteHeader != nil { + f = w.h.WriteHeader(f) + } + f(code) +} + +func (w *rw) Write(b []byte) (int, error) { + f := w.w.(http.ResponseWriter).Write + if w.h.Write != nil { + f = w.h.Write(f) + } + return f(b) +} + +func (w *rw) Flush() { + f := w.w.(http.Flusher).Flush + if w.h.Flush != nil { + f = w.h.Flush(f) + } + f() +} + +func (w *rw) CloseNotify() <-chan bool { + f := w.w.(http.CloseNotifier).CloseNotify + if w.h.CloseNotify != nil { + f = w.h.CloseNotify(f) + } + return f() +} + +func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) { + f := w.w.(http.Hijacker).Hijack + if w.h.Hijack != nil { + f = w.h.Hijack(f) + } + return f() +} + +func (w *rw) ReadFrom(src io.Reader) (int64, error) { + f := w.w.(io.ReaderFrom).ReadFrom + if w.h.ReadFrom != nil { + f = w.h.ReadFrom(f) + } + return f(src) +} + +type Unwrapper interface { + Unwrap() http.ResponseWriter +} + +// Unwrap returns the underlying http.ResponseWriter from within zero or more +// layers of httpsnoop wrappers. +func Unwrap(w http.ResponseWriter) http.ResponseWriter { + if rw, ok := w.(Unwrapper); ok { + // recurse until rw.Unwrap() returns a non-Unwrapper + return Unwrap(rw.Unwrap()) + } else { + return w + } +} 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 aef4a039..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 @@ -7,24 +9,24 @@ // it is important that the log messages are structured and actionable. // Package log is designed to encourage both of these best practices. // -// # Basic Usage +// Basic Usage // // The fundamental interface is Logger. Loggers create log events from // key/value data. The Logger interface has a single method, Log, which // accepts a sequence of alternating key/value pairs, which this package names // keyvals. // -// type Logger interface { -// Log(keyvals ...interface{}) error -// } +// type Logger interface { +// Log(keyvals ...interface{}) error +// } // // Here is an example of a function using a Logger to create log events. // -// func RunTask(task Task, logger log.Logger) string { -// logger.Log("taskID", task.ID, "event", "starting task") -// ... -// logger.Log("taskID", task.ID, "event", "task complete") -// } +// func RunTask(task Task, logger log.Logger) string { +// logger.Log("taskID", task.ID, "event", "starting task") +// ... +// logger.Log("taskID", task.ID, "event", "task complete") +// } // // The keys in the above example are "taskID" and "event". The values are // task.ID, "starting task", and "task complete". Every key is followed @@ -35,21 +37,21 @@ // idea to log simple values without formatting them. This practice allows // the chosen logger to encode values in the most appropriate way. // -// # Contextual Loggers +// Contextual Loggers // // 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. -// -// func RunTask(task Task, logger log.Logger) string { -// logger = log.With(logger, "taskID", task.ID) -// logger.Log("event", "starting task") -// ... -// taskHelper(task.Cmd, logger) -// ... -// logger.Log("event", "task complete") -// } +// 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) +// logger.Log("event", "starting task") +// ... +// taskHelper(task.Cmd, logger) +// ... +// logger.Log("event", "task complete") +// } // // The improved version emits the same log events as the original for the // first and last calls to Log. Passing the contextual logger to taskHelper @@ -59,7 +61,7 @@ // life cycle of individual tasks. (See the Contextual example for the full // code of the above snippet.) // -// # Dynamic Contextual Values +// Dynamic Contextual Values // // A Valuer function stored in a contextual logger generates a new value each // time an event is logged. The Valuer example demonstrates how this feature @@ -71,10 +73,10 @@ // DefaultCaller. A common logger initialization sequence that ensures all log // entries contain a timestamp and source location looks like this: // -// logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) -// logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) +// logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) +// logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) // -// # Concurrent Safety +// Concurrent Safety // // Applications with multiple goroutines want each log event written to the // same logger to remain separate from other log events. Package log provides @@ -91,7 +93,7 @@ // both the formatting and output logic. Use a SyncLogger if the formatting // logger may perform multiple writes per log event. // -// # Error Handling +// Error Handling // // This package relies on the practice of wrapping or decorating loggers with // other loggers to provide composable pieces of functionality. It also means @@ -106,11 +108,11 @@ // An application required to panic whenever its Logger encounters // an error could initialize its logger as follows. // -// fmtlogger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) -// logger := log.LoggerFunc(func(keyvals ...interface{}) error { -// if err := fmtlogger.Log(keyvals...); err != nil { -// panic(err) -// } -// return nil -// }) +// fmtlogger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) +// logger := log.LoggerFunc(func(keyvals ...interface{}) error { +// if err := fmtlogger.Log(keyvals...); err != nil { +// panic(err) +// } +// return nil +// }) package log 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 0cedbf82..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,91 +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) - } - enc := json.NewEncoder(l.Writer) - enc.SetEscapeHTML(false) - return enc.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 518af408..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