From 8685ab86a8d548b2eca10ab6e1bcfe10e18d6aad Mon Sep 17 00:00:00 2001 From: Shreya Bhagat Date: Tue, 14 Mar 2023 22:51:46 +0530 Subject: [PATCH 1/2] refactor(*): remove vendor --- vendor/github.com/BurntSushi/toml/.gitignore | 5 - vendor/github.com/BurntSushi/toml/.travis.yml | 15 - vendor/github.com/BurntSushi/toml/COMPATIBLE | 3 - vendor/github.com/BurntSushi/toml/COPYING | 21 - vendor/github.com/BurntSushi/toml/Makefile | 19 - vendor/github.com/BurntSushi/toml/README.md | 218 - vendor/github.com/BurntSushi/toml/decode.go | 509 - .../github.com/BurntSushi/toml/decode_meta.go | 121 - vendor/github.com/BurntSushi/toml/doc.go | 27 - vendor/github.com/BurntSushi/toml/encode.go | 568 -- .../BurntSushi/toml/encoding_types.go | 19 - .../BurntSushi/toml/encoding_types_1.1.go | 18 - vendor/github.com/BurntSushi/toml/lex.go | 953 -- vendor/github.com/BurntSushi/toml/parse.go | 592 -- vendor/github.com/BurntSushi/toml/session.vim | 1 - .../github.com/BurntSushi/toml/type_check.go | 91 - .../github.com/BurntSushi/toml/type_fields.go | 242 - .../github.com/Microsoft/go-winio/.gitignore | 1 - vendor/github.com/Microsoft/go-winio/LICENSE | 22 - .../github.com/Microsoft/go-winio/README.md | 22 - .../github.com/Microsoft/go-winio/backup.go | 280 - vendor/github.com/Microsoft/go-winio/ea.go | 137 - vendor/github.com/Microsoft/go-winio/file.go | 323 - .../github.com/Microsoft/go-winio/fileinfo.go | 61 - vendor/github.com/Microsoft/go-winio/go.mod | 9 - vendor/github.com/Microsoft/go-winio/go.sum | 16 - .../github.com/Microsoft/go-winio/hvsock.go | 305 - vendor/github.com/Microsoft/go-winio/pipe.go | 510 - .../Microsoft/go-winio/pkg/guid/guid.go | 235 - .../Microsoft/go-winio/privilege.go | 202 - .../github.com/Microsoft/go-winio/reparse.go | 128 - vendor/github.com/Microsoft/go-winio/sd.go | 98 - .../github.com/Microsoft/go-winio/syscall.go | 3 - .../Microsoft/go-winio/zsyscall_windows.go | 562 -- .../github.com/NYTimes/gziphandler/.gitignore | 1 - .../NYTimes/gziphandler/.travis.yml | 10 - .../NYTimes/gziphandler/CODE_OF_CONDUCT.md | 75 - .../NYTimes/gziphandler/CONTRIBUTING.md | 30 - vendor/github.com/NYTimes/gziphandler/LICENSE | 201 - .../github.com/NYTimes/gziphandler/README.md | 56 - vendor/github.com/NYTimes/gziphandler/go.mod | 5 - vendor/github.com/NYTimes/gziphandler/go.sum | 7 - vendor/github.com/NYTimes/gziphandler/gzip.go | 532 - .../NYTimes/gziphandler/gzip_go18.go | 43 - vendor/github.com/alphadose/gotty/LICENSE | 21 - .../gotty/backend/localcommand/doc.go | 3 - .../gotty/backend/localcommand/factory.go | 48 - .../backend/localcommand/local_command.go | 132 - .../gotty/backend/localcommand/options.go | 20 - .../alphadose/gotty/pkg/homedir/expand.go | 13 - .../gotty/pkg/randomstring/generate.go | 18 - .../alphadose/gotty/server/asset.go | 379 - .../alphadose/gotty/server/handler_atomic.go | 70 - .../alphadose/gotty/server/handlers.go | 235 - .../alphadose/gotty/server/init_message.go | 6 - .../alphadose/gotty/server/list_address.go | 28 - .../gotty/server/log_response_writer.go | 23 - .../alphadose/gotty/server/middleware.go | 51 - .../alphadose/gotty/server/options.go | 99 - .../alphadose/gotty/server/run_option.go | 21 - .../alphadose/gotty/server/server.go | 246 - .../alphadose/gotty/server/slave.go | 17 - .../alphadose/gotty/server/ws_wrapper.go | 33 - .../alphadose/gotty/utils/default.go | 41 - .../github.com/alphadose/gotty/utils/flags.go | 124 - .../github.com/alphadose/gotty/webtty/doc.go | 3 - .../alphadose/gotty/webtty/errors.go | 13 - .../alphadose/gotty/webtty/master.go | 8 - .../alphadose/gotty/webtty/message_types.go | 31 - .../alphadose/gotty/webtty/option.go | 62 - .../alphadose/gotty/webtty/slave.go | 17 - .../alphadose/gotty/webtty/webtty.go | 219 - vendor/github.com/anmitsu/go-shlex/.gitignore | 1 - vendor/github.com/anmitsu/go-shlex/LICENSE | 20 - vendor/github.com/anmitsu/go-shlex/README.md | 45 - vendor/github.com/anmitsu/go-shlex/go.mod | 5 - vendor/github.com/anmitsu/go-shlex/go.sum | 2 - vendor/github.com/anmitsu/go-shlex/shlex.go | 193 - .../github.com/appleboy/gin-jwt/v2/.drone.yml | 69 - .../appleboy/gin-jwt/v2/.editorconfig | 42 - .../github.com/appleboy/gin-jwt/v2/.gitignore | 31 - .../appleboy/gin-jwt/v2/.revive.toml | 25 - vendor/github.com/appleboy/gin-jwt/v2/LICENSE | 21 - .../github.com/appleboy/gin-jwt/v2/Makefile | 59 - .../github.com/appleboy/gin-jwt/v2/README.md | 291 - .../appleboy/gin-jwt/v2/auth_jwt.go | 747 -- vendor/github.com/appleboy/gin-jwt/v2/go.mod | 13 - vendor/github.com/appleboy/gin-jwt/v2/go.sum | 56 - .../asaskevich/govalidator/.gitignore | 15 - .../asaskevich/govalidator/.travis.yml | 18 - .../asaskevich/govalidator/CONTRIBUTING.md | 63 - .../github.com/asaskevich/govalidator/LICENSE | 21 - .../asaskevich/govalidator/README.md | 616 -- .../asaskevich/govalidator/arrays.go | 58 - .../asaskevich/govalidator/converter.go | 64 - .../github.com/asaskevich/govalidator/doc.go | 3 - .../asaskevich/govalidator/error.go | 47 - .../github.com/asaskevich/govalidator/go.mod | 3 - .../asaskevich/govalidator/numerics.go | 97 - .../asaskevich/govalidator/patterns.go | 105 - .../asaskevich/govalidator/types.go | 653 -- .../asaskevich/govalidator/utils.go | 270 - .../asaskevich/govalidator/validator.go | 1530 --- .../asaskevich/govalidator/wercker.yml | 15 - .../cpuguy83/go-md2man/v2/LICENSE.md | 21 - .../cpuguy83/go-md2man/v2/md2man/md2man.go | 14 - .../cpuguy83/go-md2man/v2/md2man/roff.go | 345 - vendor/github.com/creack/pty/.gitignore | 4 - vendor/github.com/creack/pty/Dockerfile.riscv | 14 - vendor/github.com/creack/pty/LICENSE | 23 - vendor/github.com/creack/pty/README.md | 100 - vendor/github.com/creack/pty/doc.go | 16 - vendor/github.com/creack/pty/go.mod | 4 - vendor/github.com/creack/pty/ioctl.go | 13 - vendor/github.com/creack/pty/ioctl_bsd.go | 39 - vendor/github.com/creack/pty/ioctl_solaris.go | 30 - vendor/github.com/creack/pty/mktypes.bash | 19 - vendor/github.com/creack/pty/pty_darwin.go | 65 - vendor/github.com/creack/pty/pty_dragonfly.go | 80 - vendor/github.com/creack/pty/pty_freebsd.go | 78 - vendor/github.com/creack/pty/pty_linux.go | 51 - vendor/github.com/creack/pty/pty_openbsd.go | 33 - vendor/github.com/creack/pty/pty_solaris.go | 139 - .../github.com/creack/pty/pty_unsupported.go | 11 - vendor/github.com/creack/pty/run.go | 74 - .../creack/pty/test_crosscompile.sh | 50 - vendor/github.com/creack/pty/util.go | 64 - vendor/github.com/creack/pty/util_solaris.go | 51 - vendor/github.com/creack/pty/ztypes_386.go | 9 - vendor/github.com/creack/pty/ztypes_amd64.go | 9 - vendor/github.com/creack/pty/ztypes_arm.go | 9 - vendor/github.com/creack/pty/ztypes_arm64.go | 11 - .../creack/pty/ztypes_dragonfly_amd64.go | 14 - .../creack/pty/ztypes_freebsd_386.go | 13 - .../creack/pty/ztypes_freebsd_amd64.go | 14 - .../creack/pty/ztypes_freebsd_arm.go | 13 - .../creack/pty/ztypes_freebsd_arm64.go | 13 - vendor/github.com/creack/pty/ztypes_mipsx.go | 12 - .../creack/pty/ztypes_openbsd_386.go | 13 - .../creack/pty/ztypes_openbsd_amd64.go | 13 - vendor/github.com/creack/pty/ztypes_ppc64.go | 11 - .../github.com/creack/pty/ztypes_ppc64le.go | 11 - vendor/github.com/creack/pty/ztypes_riscvx.go | 11 - vendor/github.com/creack/pty/ztypes_s390x.go | 11 - vendor/github.com/dgrijalva/jwt-go/.gitignore | 4 - .../github.com/dgrijalva/jwt-go/.travis.yml | 13 - vendor/github.com/dgrijalva/jwt-go/LICENSE | 8 - .../dgrijalva/jwt-go/MIGRATION_GUIDE.md | 97 - vendor/github.com/dgrijalva/jwt-go/README.md | 100 - .../dgrijalva/jwt-go/VERSION_HISTORY.md | 118 - vendor/github.com/dgrijalva/jwt-go/claims.go | 134 - vendor/github.com/dgrijalva/jwt-go/doc.go | 4 - vendor/github.com/dgrijalva/jwt-go/ecdsa.go | 148 - .../dgrijalva/jwt-go/ecdsa_utils.go | 67 - vendor/github.com/dgrijalva/jwt-go/errors.go | 59 - vendor/github.com/dgrijalva/jwt-go/hmac.go | 95 - .../github.com/dgrijalva/jwt-go/map_claims.go | 94 - vendor/github.com/dgrijalva/jwt-go/none.go | 52 - vendor/github.com/dgrijalva/jwt-go/parser.go | 148 - vendor/github.com/dgrijalva/jwt-go/rsa.go | 101 - vendor/github.com/dgrijalva/jwt-go/rsa_pss.go | 126 - .../github.com/dgrijalva/jwt-go/rsa_utils.go | 101 - .../dgrijalva/jwt-go/signing_method.go | 35 - vendor/github.com/dgrijalva/jwt-go/token.go | 108 - vendor/github.com/docker/distribution/LICENSE | 202 - .../docker/distribution/digestset/set.go | 247 - .../docker/distribution/reference/helpers.go | 42 - .../distribution/reference/normalize.go | 170 - .../distribution/reference/reference.go | 433 - .../docker/distribution/reference/regexp.go | 143 - vendor/github.com/docker/docker/AUTHORS | 1652 --- vendor/github.com/docker/docker/LICENSE | 191 - vendor/github.com/docker/docker/NOTICE | 19 - .../docker/docker/api/types/auth.go | 22 - .../docker/docker/api/types/blkiodev/blkio.go | 23 - .../docker/docker/api/types/client.go | 378 - .../docker/docker/api/types/configs.go | 69 - .../docker/api/types/container/config.go | 62 - .../api/types/container/container_create.go | 21 - .../api/types/container/container_update.go | 17 - .../api/types/container/container_wait.go | 17 - .../docker/api/types/container/host_config.go | 333 - .../api/types/container/hostconfig_unix.go | 81 - .../api/types/container/hostconfig_windows.go | 87 - .../docker/docker/api/types/error_response.go | 13 - .../docker/docker/api/types/events/events.go | 42 - .../docker/docker/api/types/filters/parse.go | 310 - .../docker/docker/api/types/id_response.go | 13 - .../docker/docker/api/types/image_summary.go | 49 - .../docker/docker/api/types/mount/mount.go | 113 - .../docker/api/types/network/network.go | 59 - .../docker/docker/api/types/plugin.go | 189 - .../docker/docker/api/types/plugin_device.go | 25 - .../docker/docker/api/types/plugin_env.go | 25 - .../docker/api/types/plugin_interface_type.go | 21 - .../docker/docker/api/types/plugin_mount.go | 37 - .../docker/api/types/plugin_responses.go | 64 - .../docker/docker/api/types/port.go | 23 - .../api/types/reference/image_reference.go | 34 - .../docker/api/types/registry/authenticate.go | 21 - .../docker/api/types/registry/registry.go | 104 - .../docker/docker/api/types/seccomp.go | 93 - .../api/types/service_update_response.go | 12 - .../docker/docker/api/types/stats.go | 178 - .../docker/api/types/strslice/strslice.go | 30 - .../docker/docker/api/types/swarm/common.go | 27 - .../docker/api/types/swarm/container.go | 46 - .../docker/docker/api/types/swarm/network.go | 111 - .../docker/docker/api/types/swarm/node.go | 114 - .../docker/docker/api/types/swarm/secret.go | 31 - .../docker/docker/api/types/swarm/service.go | 105 - .../docker/docker/api/types/swarm/swarm.go | 197 - .../docker/docker/api/types/swarm/task.go | 128 - .../docker/api/types/time/duration_convert.go | 12 - .../docker/docker/api/types/time/timestamp.go | 124 - .../docker/docker/api/types/types.go | 549 - .../docker/api/types/versions/README.md | 14 - .../docker/api/types/versions/compare.go | 62 - .../docker/docker/api/types/volume.go | 58 - .../docker/api/types/volume/volumes_create.go | 29 - .../docker/api/types/volume/volumes_list.go | 23 - .../github.com/docker/docker/client/README.md | 35 - .../docker/docker/client/checkpoint_create.go | 13 - .../docker/docker/client/checkpoint_delete.go | 20 - .../docker/docker/client/checkpoint_list.go | 28 - .../github.com/docker/docker/client/client.go | 246 - .../docker/docker/client/client_unix.go | 6 - .../docker/docker/client/client_windows.go | 4 - .../docker/docker/client/container_attach.go | 37 - .../docker/docker/client/container_commit.go | 53 - .../docker/docker/client/container_copy.go | 97 - .../docker/docker/client/container_create.go | 50 - .../docker/docker/client/container_diff.go | 23 - .../docker/docker/client/container_exec.go | 54 - .../docker/docker/client/container_export.go | 20 - .../docker/docker/client/container_inspect.go | 54 - .../docker/docker/client/container_kill.go | 17 - .../docker/docker/client/container_list.go | 56 - .../docker/docker/client/container_logs.go | 52 - .../docker/docker/client/container_pause.go | 10 - .../docker/docker/client/container_prune.go | 36 - .../docker/docker/client/container_remove.go | 27 - .../docker/docker/client/container_rename.go | 16 - .../docker/docker/client/container_resize.go | 29 - .../docker/docker/client/container_restart.go | 22 - .../docker/docker/client/container_start.go | 24 - .../docker/docker/client/container_stats.go | 26 - .../docker/docker/client/container_stop.go | 21 - .../docker/docker/client/container_top.go | 28 - .../docker/docker/client/container_unpause.go | 10 - .../docker/docker/client/container_update.go | 22 - .../docker/docker/client/container_wait.go | 26 - .../docker/docker/client/disk_usage.go | 26 - .../github.com/docker/docker/client/errors.go | 278 - .../github.com/docker/docker/client/events.go | 102 - .../github.com/docker/docker/client/hijack.go | 177 - .../docker/docker/client/image_build.go | 123 - .../docker/docker/client/image_create.go | 34 - .../docker/docker/client/image_history.go | 22 - .../docker/docker/client/image_import.go | 37 - .../docker/docker/client/image_inspect.go | 33 - .../docker/docker/client/image_list.go | 45 - .../docker/docker/client/image_load.go | 30 - .../docker/docker/client/image_prune.go | 36 - .../docker/docker/client/image_pull.go | 46 - .../docker/docker/client/image_push.go | 54 - .../docker/docker/client/image_remove.go | 31 - .../docker/docker/client/image_save.go | 22 - .../docker/docker/client/image_search.go | 51 - .../docker/docker/client/image_tag.go | 34 - .../github.com/docker/docker/client/info.go | 26 - .../docker/docker/client/interface.go | 171 - .../docker/client/interface_experimental.go | 17 - .../docker/docker/client/interface_stable.go | 10 - .../github.com/docker/docker/client/login.go | 29 - .../docker/docker/client/network_connect.go | 18 - .../docker/docker/client/network_create.go | 25 - .../docker/client/network_disconnect.go | 14 - .../docker/docker/client/network_inspect.go | 38 - .../docker/docker/client/network_list.go | 31 - .../docker/docker/client/network_prune.go | 36 - .../docker/docker/client/network_remove.go | 10 - .../docker/docker/client/node_inspect.go | 33 - .../docker/docker/client/node_list.go | 36 - .../docker/docker/client/node_remove.go | 21 - .../docker/docker/client/node_update.go | 18 - .../github.com/docker/docker/client/ping.go | 30 - .../docker/docker/client/plugin_create.go | 26 - .../docker/docker/client/plugin_disable.go | 19 - .../docker/docker/client/plugin_enable.go | 19 - .../docker/docker/client/plugin_inspect.go | 32 - .../docker/docker/client/plugin_install.go | 113 - .../docker/docker/client/plugin_list.go | 21 - .../docker/docker/client/plugin_push.go | 17 - .../docker/docker/client/plugin_remove.go | 20 - .../docker/docker/client/plugin_set.go | 12 - .../docker/docker/client/plugin_upgrade.go | 37 - .../docker/docker/client/request.go | 247 - .../docker/docker/client/secret_create.go | 24 - .../docker/docker/client/secret_inspect.go | 34 - .../docker/docker/client/secret_list.go | 35 - .../docker/docker/client/secret_remove.go | 10 - .../docker/docker/client/secret_update.go | 19 - .../docker/docker/client/service_create.go | 30 - .../docker/docker/client/service_inspect.go | 33 - .../docker/docker/client/service_list.go | 35 - .../docker/docker/client/service_logs.go | 52 - .../docker/docker/client/service_remove.go | 10 - .../docker/docker/client/service_update.go | 41 - .../docker/client/swarm_get_unlock_key.go | 21 - .../docker/docker/client/swarm_init.go | 21 - .../docker/docker/client/swarm_inspect.go | 21 - .../docker/docker/client/swarm_join.go | 13 - .../docker/docker/client/swarm_leave.go | 18 - .../docker/docker/client/swarm_unlock.go | 17 - .../docker/docker/client/swarm_update.go | 22 - .../docker/docker/client/task_inspect.go | 34 - .../docker/docker/client/task_list.go | 35 - .../docker/docker/client/transport.go | 28 - .../github.com/docker/docker/client/utils.go | 33 - .../docker/docker/client/version.go | 21 - .../docker/docker/client/volume_create.go | 21 - .../docker/docker/client/volume_inspect.go | 38 - .../docker/docker/client/volume_list.go | 32 - .../docker/docker/client/volume_prune.go | 36 - .../docker/docker/client/volume_remove.go | 21 - .../docker/pkg/tlsconfig/tlsconfig_clone.go | 11 - .../pkg/tlsconfig/tlsconfig_clone_go16.go | 31 - .../pkg/tlsconfig/tlsconfig_clone_go17.go | 33 - .../github.com/docker/go-connections/LICENSE | 191 - .../docker/go-connections/nat/nat.go | 242 - .../docker/go-connections/nat/parse.go | 57 - .../docker/go-connections/nat/sort.go | 96 - .../docker/go-connections/sockets/README.md | 0 .../go-connections/sockets/inmem_socket.go | 81 - .../docker/go-connections/sockets/proxy.go | 51 - .../docker/go-connections/sockets/sockets.go | 38 - .../go-connections/sockets/sockets_unix.go | 35 - .../go-connections/sockets/sockets_windows.go | 27 - .../go-connections/sockets/tcp_socket.go | 22 - .../go-connections/sockets/unix_socket.go | 32 - .../go-connections/tlsconfig/certpool_go17.go | 18 - .../tlsconfig/certpool_other.go | 13 - .../docker/go-connections/tlsconfig/config.go | 254 - .../tlsconfig/config_client_ciphers.go | 17 - .../tlsconfig/config_legacy_client_ciphers.go | 15 - .../docker/go-units/CONTRIBUTING.md | 67 - vendor/github.com/docker/go-units/LICENSE | 191 - vendor/github.com/docker/go-units/MAINTAINERS | 46 - vendor/github.com/docker/go-units/README.md | 16 - vendor/github.com/docker/go-units/circle.yml | 11 - vendor/github.com/docker/go-units/duration.go | 35 - vendor/github.com/docker/go-units/size.go | 108 - vendor/github.com/docker/go-units/ulimit.go | 123 - .../elazarl/go-bindata-assetfs/LICENSE | 23 - .../elazarl/go-bindata-assetfs/README.md | 46 - .../elazarl/go-bindata-assetfs/assetfs.go | 167 - .../elazarl/go-bindata-assetfs/doc.go | 13 - vendor/github.com/emirpasic/gods/LICENSE | 41 - .../emirpasic/gods/containers/containers.go | 35 - .../emirpasic/gods/containers/enumerable.go | 61 - .../emirpasic/gods/containers/iterator.go | 109 - .../gods/containers/serialization.go | 17 - .../gods/lists/arraylist/arraylist.go | 228 - .../gods/lists/arraylist/enumerable.go | 79 - .../gods/lists/arraylist/iterator.go | 83 - .../gods/lists/arraylist/serialization.go | 29 - .../github.com/emirpasic/gods/lists/lists.go | 33 - .../gods/trees/binaryheap/binaryheap.go | 163 - .../gods/trees/binaryheap/iterator.go | 84 - .../gods/trees/binaryheap/serialization.go | 22 - .../github.com/emirpasic/gods/trees/trees.go | 21 - .../emirpasic/gods/utils/comparator.go | 251 - .../github.com/emirpasic/gods/utils/sort.go | 29 - .../github.com/emirpasic/gods/utils/utils.go | 47 - vendor/github.com/fatih/structs/.gitignore | 23 - vendor/github.com/fatih/structs/.travis.yml | 13 - vendor/github.com/fatih/structs/LICENSE | 21 - vendor/github.com/fatih/structs/README.md | 163 - vendor/github.com/fatih/structs/field.go | 141 - vendor/github.com/fatih/structs/structs.go | 584 -- vendor/github.com/fatih/structs/tags.go | 32 - vendor/github.com/gin-contrib/cors/.gitignore | 23 - .../github.com/gin-contrib/cors/.travis.yml | 31 - vendor/github.com/gin-contrib/cors/LICENSE | 21 - vendor/github.com/gin-contrib/cors/README.md | 91 - vendor/github.com/gin-contrib/cors/config.go | 134 - vendor/github.com/gin-contrib/cors/cors.go | 171 - vendor/github.com/gin-contrib/cors/go.mod | 10 - vendor/github.com/gin-contrib/cors/go.sum | 52 - vendor/github.com/gin-contrib/cors/utils.go | 85 - vendor/github.com/gin-contrib/sse/.travis.yml | 26 - vendor/github.com/gin-contrib/sse/LICENSE | 21 - vendor/github.com/gin-contrib/sse/README.md | 58 - vendor/github.com/gin-contrib/sse/go.mod | 5 - vendor/github.com/gin-contrib/sse/go.sum | 7 - .../github.com/gin-contrib/sse/sse-decoder.go | 116 - .../github.com/gin-contrib/sse/sse-encoder.go | 110 - vendor/github.com/gin-contrib/sse/writer.go | 24 - vendor/github.com/gin-gonic/gin/.gitignore | 7 - vendor/github.com/gin-gonic/gin/.travis.yml | 48 - vendor/github.com/gin-gonic/gin/AUTHORS.md | 231 - vendor/github.com/gin-gonic/gin/BENCHMARKS.md | 693 -- vendor/github.com/gin-gonic/gin/CHANGELOG.md | 373 - .../gin-gonic/gin/CODE_OF_CONDUCT.md | 46 - .../github.com/gin-gonic/gin/CONTRIBUTING.md | 13 - vendor/github.com/gin-gonic/gin/LICENSE | 21 - vendor/github.com/gin-gonic/gin/Makefile | 71 - vendor/github.com/gin-gonic/gin/README.md | 2127 ---- vendor/github.com/gin-gonic/gin/auth.go | 89 - .../gin-gonic/gin/binding/binding.go | 116 - .../gin/binding/binding_nomsgpack.go | 111 - .../gin/binding/default_validator.go | 51 - .../github.com/gin-gonic/gin/binding/form.go | 63 - .../gin-gonic/gin/binding/form_mapping.go | 351 - .../gin-gonic/gin/binding/header.go | 34 - .../github.com/gin-gonic/gin/binding/json.go | 56 - .../gin-gonic/gin/binding/msgpack.go | 37 - .../gin/binding/multipart_form_mapping.go | 66 - .../gin-gonic/gin/binding/protobuf.go | 36 - .../github.com/gin-gonic/gin/binding/query.go | 21 - .../github.com/gin-gonic/gin/binding/uri.go | 18 - .../github.com/gin-gonic/gin/binding/xml.go | 33 - .../github.com/gin-gonic/gin/binding/yaml.go | 35 - vendor/github.com/gin-gonic/gin/codecov.yml | 5 - vendor/github.com/gin-gonic/gin/context.go | 1106 -- .../gin-gonic/gin/context_appengine.go | 11 - vendor/github.com/gin-gonic/gin/debug.go | 103 - vendor/github.com/gin-gonic/gin/deprecated.go | 21 - vendor/github.com/gin-gonic/gin/doc.go | 6 - vendor/github.com/gin-gonic/gin/errors.go | 169 - vendor/github.com/gin-gonic/gin/fs.go | 45 - vendor/github.com/gin-gonic/gin/gin.go | 497 - vendor/github.com/gin-gonic/gin/go.mod | 14 - vendor/github.com/gin-gonic/gin/go.sum | 45 - .../gin/internal/bytesconv/bytesconv.go | 19 - .../gin-gonic/gin/internal/json/json.go | 22 - .../gin-gonic/gin/internal/json/jsoniter.go | 23 - vendor/github.com/gin-gonic/gin/logger.go | 271 - vendor/github.com/gin-gonic/gin/mode.go | 89 - vendor/github.com/gin-gonic/gin/path.go | 149 - vendor/github.com/gin-gonic/gin/recovery.go | 151 - .../github.com/gin-gonic/gin/render/data.go | 25 - .../github.com/gin-gonic/gin/render/html.go | 92 - .../github.com/gin-gonic/gin/render/json.go | 196 - .../gin-gonic/gin/render/msgpack.go | 41 - .../gin-gonic/gin/render/protobuf.go | 36 - .../github.com/gin-gonic/gin/render/reader.go | 48 - .../gin-gonic/gin/render/redirect.go | 29 - .../github.com/gin-gonic/gin/render/render.go | 40 - .../github.com/gin-gonic/gin/render/text.go | 40 - vendor/github.com/gin-gonic/gin/render/xml.go | 28 - .../github.com/gin-gonic/gin/render/yaml.go | 36 - .../gin-gonic/gin/response_writer.go | 126 - .../github.com/gin-gonic/gin/routergroup.go | 230 - .../github.com/gin-gonic/gin/test_helpers.go | 16 - vendor/github.com/gin-gonic/gin/tree.go | 684 -- vendor/github.com/gin-gonic/gin/utils.go | 151 - vendor/github.com/gin-gonic/gin/version.go | 8 - vendor/github.com/gliderlabs/ssh/LICENSE | 27 - vendor/github.com/gliderlabs/ssh/README.md | 96 - vendor/github.com/gliderlabs/ssh/agent.go | 83 - vendor/github.com/gliderlabs/ssh/circle.yml | 26 - vendor/github.com/gliderlabs/ssh/conn.go | 55 - vendor/github.com/gliderlabs/ssh/context.go | 152 - vendor/github.com/gliderlabs/ssh/doc.go | 45 - vendor/github.com/gliderlabs/ssh/options.go | 77 - vendor/github.com/gliderlabs/ssh/server.go | 431 - vendor/github.com/gliderlabs/ssh/session.go | 308 - vendor/github.com/gliderlabs/ssh/ssh.go | 123 - vendor/github.com/gliderlabs/ssh/tcpip.go | 193 - vendor/github.com/gliderlabs/ssh/util.go | 83 - vendor/github.com/gliderlabs/ssh/wrap.go | 33 - .../go-playground/locales/.gitignore | 24 - .../go-playground/locales/.travis.yml | 26 - .../github.com/go-playground/locales/LICENSE | 21 - .../go-playground/locales/README.md | 172 - .../locales/currency/currency.go | 308 - .../github.com/go-playground/locales/go.mod | 5 - .../github.com/go-playground/locales/go.sum | 3 - .../github.com/go-playground/locales/logo.png | Bin 37360 -> 0 bytes .../github.com/go-playground/locales/rules.go | 293 - .../universal-translator/.gitignore | 25 - .../universal-translator/.travis.yml | 27 - .../universal-translator/LICENSE | 21 - .../universal-translator/README.md | 89 - .../universal-translator/errors.go | 148 - .../go-playground/universal-translator/go.mod | 5 - .../go-playground/universal-translator/go.sum | 4 - .../universal-translator/import_export.go | 274 - .../universal-translator/logo.png | Bin 16598 -> 0 bytes .../universal-translator/translator.go | 420 - .../universal_translator.go | 113 - .../go-playground/validator/v10/.gitignore | 29 - .../go-playground/validator/v10/.travis.yml | 29 - .../go-playground/validator/v10/LICENSE | 22 - .../go-playground/validator/v10/Makefile | 18 - .../go-playground/validator/v10/README.md | 153 - .../go-playground/validator/v10/baked_in.go | 2091 ---- .../go-playground/validator/v10/cache.go | 322 - .../go-playground/validator/v10/doc.go | 1145 --- .../go-playground/validator/v10/errors.go | 272 - .../validator/v10/field_level.go | 119 - .../go-playground/validator/v10/go.mod | 10 - .../go-playground/validator/v10/go.sum | 21 - .../go-playground/validator/v10/logo.png | Bin 13443 -> 0 bytes .../go-playground/validator/v10/regexes.go | 99 - .../validator/v10/struct_level.go | 175 - .../validator/v10/translations.go | 11 - .../go-playground/validator/v10/util.go | 266 - .../go-playground/validator/v10/validator.go | 477 - .../validator/v10/validator_instance.go | 615 -- vendor/github.com/go-redis/redis/.gitignore | 2 - vendor/github.com/go-redis/redis/.travis.yml | 20 - vendor/github.com/go-redis/redis/CHANGELOG.md | 25 - vendor/github.com/go-redis/redis/LICENSE | 25 - vendor/github.com/go-redis/redis/Makefile | 22 - vendor/github.com/go-redis/redis/README.md | 146 - vendor/github.com/go-redis/redis/cluster.go | 1627 --- .../go-redis/redis/cluster_commands.go | 22 - vendor/github.com/go-redis/redis/command.go | 1972 ---- vendor/github.com/go-redis/redis/commands.go | 2583 ----- vendor/github.com/go-redis/redis/doc.go | 4 - .../internal/consistenthash/consistenthash.go | 81 - .../go-redis/redis/internal/error.go | 89 - .../redis/internal/hashtag/hashtag.go | 77 - .../go-redis/redis/internal/internal.go | 24 - .../github.com/go-redis/redis/internal/log.go | 15 - .../go-redis/redis/internal/once.go | 60 - .../go-redis/redis/internal/pool/conn.go | 95 - .../go-redis/redis/internal/pool/pool.go | 476 - .../redis/internal/pool/pool_single.go | 203 - .../redis/internal/pool/pool_sticky.go | 109 - .../go-redis/redis/internal/proto/reader.go | 290 - .../go-redis/redis/internal/proto/scan.go | 166 - .../go-redis/redis/internal/proto/writer.go | 159 - .../go-redis/redis/internal/util.go | 39 - .../go-redis/redis/internal/util/safe.go | 11 - .../go-redis/redis/internal/util/strconv.go | 19 - .../go-redis/redis/internal/util/unsafe.go | 22 - vendor/github.com/go-redis/redis/iterator.go | 73 - vendor/github.com/go-redis/redis/options.go | 226 - vendor/github.com/go-redis/redis/pipeline.go | 133 - vendor/github.com/go-redis/redis/pubsub.go | 513 - vendor/github.com/go-redis/redis/redis.go | 583 -- vendor/github.com/go-redis/redis/result.go | 140 - vendor/github.com/go-redis/redis/ring.go | 702 -- vendor/github.com/go-redis/redis/script.go | 62 - vendor/github.com/go-redis/redis/sentinel.go | 415 - vendor/github.com/go-redis/redis/tx.go | 110 - vendor/github.com/go-redis/redis/universal.go | 180 - .../github.com/go-sql-driver/mysql/.gitignore | 9 - .../go-sql-driver/mysql/.travis.yml | 129 - vendor/github.com/go-sql-driver/mysql/AUTHORS | 105 - .../go-sql-driver/mysql/CHANGELOG.md | 206 - vendor/github.com/go-sql-driver/mysql/LICENSE | 373 - .../github.com/go-sql-driver/mysql/README.md | 501 - vendor/github.com/go-sql-driver/mysql/auth.go | 422 - .../github.com/go-sql-driver/mysql/buffer.go | 182 - .../go-sql-driver/mysql/collations.go | 265 - .../go-sql-driver/mysql/conncheck.go | 54 - .../go-sql-driver/mysql/conncheck_dummy.go | 17 - .../go-sql-driver/mysql/connection.go | 651 -- .../go-sql-driver/mysql/connector.go | 146 - .../github.com/go-sql-driver/mysql/const.go | 174 - .../github.com/go-sql-driver/mysql/driver.go | 107 - vendor/github.com/go-sql-driver/mysql/dsn.go | 560 -- .../github.com/go-sql-driver/mysql/errors.go | 65 - .../github.com/go-sql-driver/mysql/fields.go | 194 - vendor/github.com/go-sql-driver/mysql/go.mod | 3 - .../github.com/go-sql-driver/mysql/infile.go | 182 - .../go-sql-driver/mysql/nulltime.go | 50 - .../go-sql-driver/mysql/nulltime_go113.go | 31 - .../go-sql-driver/mysql/nulltime_legacy.go | 34 - .../github.com/go-sql-driver/mysql/packets.go | 1342 --- .../github.com/go-sql-driver/mysql/result.go | 22 - vendor/github.com/go-sql-driver/mysql/rows.go | 223 - .../go-sql-driver/mysql/statement.go | 204 - .../go-sql-driver/mysql/transaction.go | 31 - .../github.com/go-sql-driver/mysql/utils.go | 701 -- vendor/github.com/go-stack/stack/.travis.yml | 15 - vendor/github.com/go-stack/stack/LICENSE.md | 21 - vendor/github.com/go-stack/stack/README.md | 38 - vendor/github.com/go-stack/stack/go.mod | 1 - vendor/github.com/go-stack/stack/stack.go | 400 - vendor/github.com/golang/protobuf/AUTHORS | 3 - .../github.com/golang/protobuf/CONTRIBUTORS | 3 - vendor/github.com/golang/protobuf/LICENSE | 28 - .../golang/protobuf/proto/buffer.go | 324 - .../golang/protobuf/proto/defaults.go | 63 - .../golang/protobuf/proto/deprecated.go | 92 - .../golang/protobuf/proto/discard.go | 58 - .../golang/protobuf/proto/extensions.go | 356 - .../golang/protobuf/proto/properties.go | 306 - .../github.com/golang/protobuf/proto/proto.go | 167 - .../golang/protobuf/proto/registry.go | 323 - .../golang/protobuf/proto/text_decode.go | 801 -- .../golang/protobuf/proto/text_encode.go | 560 -- .../github.com/golang/protobuf/proto/wire.go | 78 - .../golang/protobuf/proto/wrappers.go | 34 - .../github.com/golang/protobuf/ptypes/any.go | 165 - .../golang/protobuf/ptypes/any/any.pb.go | 62 - .../github.com/golang/protobuf/ptypes/doc.go | 6 - .../golang/protobuf/ptypes/duration.go | 72 - .../protobuf/ptypes/duration/duration.pb.go | 63 - .../golang/protobuf/ptypes/timestamp.go | 103 - .../protobuf/ptypes/timestamp/timestamp.pb.go | 64 - vendor/github.com/golang/snappy/.gitignore | 16 - vendor/github.com/golang/snappy/AUTHORS | 15 - vendor/github.com/golang/snappy/CONTRIBUTORS | 37 - vendor/github.com/golang/snappy/LICENSE | 27 - vendor/github.com/golang/snappy/README | 107 - vendor/github.com/golang/snappy/decode.go | 237 - .../github.com/golang/snappy/decode_amd64.go | 14 - .../github.com/golang/snappy/decode_amd64.s | 490 - .../github.com/golang/snappy/decode_other.go | 101 - vendor/github.com/golang/snappy/encode.go | 285 - .../github.com/golang/snappy/encode_amd64.go | 29 - .../github.com/golang/snappy/encode_amd64.s | 730 -- .../github.com/golang/snappy/encode_other.go | 238 - vendor/github.com/golang/snappy/go.mod | 1 - vendor/github.com/golang/snappy/snappy.go | 98 - vendor/github.com/google/uuid/.travis.yml | 9 - vendor/github.com/google/uuid/CONTRIBUTING.md | 10 - vendor/github.com/google/uuid/CONTRIBUTORS | 9 - vendor/github.com/google/uuid/LICENSE | 27 - vendor/github.com/google/uuid/README.md | 19 - vendor/github.com/google/uuid/dce.go | 80 - vendor/github.com/google/uuid/doc.go | 12 - vendor/github.com/google/uuid/go.mod | 1 - vendor/github.com/google/uuid/hash.go | 53 - vendor/github.com/google/uuid/marshal.go | 37 - vendor/github.com/google/uuid/node.go | 90 - vendor/github.com/google/uuid/node_js.go | 12 - vendor/github.com/google/uuid/node_net.go | 33 - vendor/github.com/google/uuid/sql.go | 59 - vendor/github.com/google/uuid/time.go | 123 - vendor/github.com/google/uuid/util.go | 43 - vendor/github.com/google/uuid/uuid.go | 245 - vendor/github.com/google/uuid/version1.go | 44 - vendor/github.com/google/uuid/version4.go | 38 - .../github.com/gorilla/websocket/.gitignore | 25 - vendor/github.com/gorilla/websocket/AUTHORS | 9 - vendor/github.com/gorilla/websocket/LICENSE | 22 - vendor/github.com/gorilla/websocket/README.md | 64 - vendor/github.com/gorilla/websocket/client.go | 395 - .../gorilla/websocket/client_clone.go | 16 - .../gorilla/websocket/client_clone_legacy.go | 38 - .../gorilla/websocket/compression.go | 148 - vendor/github.com/gorilla/websocket/conn.go | 1201 --- .../gorilla/websocket/conn_write.go | 15 - .../gorilla/websocket/conn_write_legacy.go | 18 - vendor/github.com/gorilla/websocket/doc.go | 227 - vendor/github.com/gorilla/websocket/go.mod | 3 - vendor/github.com/gorilla/websocket/go.sum | 0 vendor/github.com/gorilla/websocket/join.go | 42 - vendor/github.com/gorilla/websocket/json.go | 60 - vendor/github.com/gorilla/websocket/mask.go | 54 - .../github.com/gorilla/websocket/mask_safe.go | 15 - .../github.com/gorilla/websocket/prepared.go | 102 - vendor/github.com/gorilla/websocket/proxy.go | 77 - vendor/github.com/gorilla/websocket/server.go | 363 - vendor/github.com/gorilla/websocket/trace.go | 19 - .../github.com/gorilla/websocket/trace_17.go | 12 - vendor/github.com/gorilla/websocket/util.go | 283 - .../gorilla/websocket/x_net_proxy.go | 473 - vendor/github.com/hashicorp/errwrap/LICENSE | 354 - vendor/github.com/hashicorp/errwrap/README.md | 89 - .../github.com/hashicorp/errwrap/errwrap.go | 169 - vendor/github.com/hashicorp/errwrap/go.mod | 1 - .../hashicorp/go-multierror/.travis.yml | 12 - .../hashicorp/go-multierror/LICENSE | 353 - .../hashicorp/go-multierror/Makefile | 31 - .../hashicorp/go-multierror/README.md | 131 - .../hashicorp/go-multierror/append.go | 41 - .../hashicorp/go-multierror/flatten.go | 26 - .../hashicorp/go-multierror/format.go | 27 - .../github.com/hashicorp/go-multierror/go.mod | 5 - .../github.com/hashicorp/go-multierror/go.sum | 2 - .../hashicorp/go-multierror/group.go | 38 - .../hashicorp/go-multierror/multierror.go | 118 - .../hashicorp/go-multierror/prefix.go | 37 - .../hashicorp/go-multierror/sort.go | 16 - .../jackc/chunkreader/v2/.travis.yml | 9 - .../github.com/jackc/chunkreader/v2/LICENSE | 22 - .../github.com/jackc/chunkreader/v2/README.md | 8 - .../jackc/chunkreader/v2/chunkreader.go | 104 - vendor/github.com/jackc/chunkreader/v2/go.mod | 3 - vendor/github.com/jackc/pgconn/.gitignore | 3 - vendor/github.com/jackc/pgconn/.travis.yml | 49 - vendor/github.com/jackc/pgconn/CHANGELOG.md | 52 - vendor/github.com/jackc/pgconn/LICENSE | 22 - vendor/github.com/jackc/pgconn/README.md | 56 - vendor/github.com/jackc/pgconn/auth_scram.go | 266 - vendor/github.com/jackc/pgconn/config.go | 692 -- vendor/github.com/jackc/pgconn/doc.go | 29 - vendor/github.com/jackc/pgconn/errors.go | 166 - vendor/github.com/jackc/pgconn/go.mod | 16 - vendor/github.com/jackc/pgconn/go.sum | 115 - .../internal/ctxwatch/context_watcher.go | 64 - vendor/github.com/jackc/pgconn/pgconn.go | 1574 --- .../github.com/jackc/pgconn/stmtcache/lru.go | 113 - .../jackc/pgconn/stmtcache/stmtcache.go | 52 - vendor/github.com/jackc/pgio/.travis.yml | 9 - vendor/github.com/jackc/pgio/LICENSE | 22 - vendor/github.com/jackc/pgio/README.md | 11 - vendor/github.com/jackc/pgio/doc.go | 6 - vendor/github.com/jackc/pgio/go.mod | 3 - vendor/github.com/jackc/pgio/write.go | 40 - .../github.com/jackc/pgpassfile/.travis.yml | 9 - vendor/github.com/jackc/pgpassfile/LICENSE | 22 - vendor/github.com/jackc/pgpassfile/README.md | 8 - vendor/github.com/jackc/pgpassfile/go.mod | 5 - vendor/github.com/jackc/pgpassfile/go.sum | 7 - vendor/github.com/jackc/pgpassfile/pgpass.go | 110 - .../github.com/jackc/pgproto3/v2/.travis.yml | 9 - vendor/github.com/jackc/pgproto3/v2/LICENSE | 22 - vendor/github.com/jackc/pgproto3/v2/README.md | 12 - .../v2/authentication_cleartext_password.go | 39 - .../v2/authentication_md5_password.go | 43 - .../jackc/pgproto3/v2/authentication_ok.go | 39 - .../jackc/pgproto3/v2/authentication_sasl.go | 60 - .../v2/authentication_sasl_continue.go | 49 - .../pgproto3/v2/authentication_sasl_final.go | 49 - .../github.com/jackc/pgproto3/v2/backend.go | 137 - .../jackc/pgproto3/v2/backend_key_data.go | 51 - .../jackc/pgproto3/v2/big_endian.go | 37 - vendor/github.com/jackc/pgproto3/v2/bind.go | 176 - .../jackc/pgproto3/v2/bind_complete.go | 34 - .../jackc/pgproto3/v2/cancel_request.go | 58 - .../jackc/pgproto3/v2/chunkreader.go | 19 - vendor/github.com/jackc/pgproto3/v2/close.go | 64 - .../jackc/pgproto3/v2/close_complete.go | 34 - .../jackc/pgproto3/v2/command_complete.go | 53 - .../jackc/pgproto3/v2/copy_both_response.go | 70 - .../github.com/jackc/pgproto3/v2/copy_data.go | 44 - .../github.com/jackc/pgproto3/v2/copy_done.go | 35 - .../github.com/jackc/pgproto3/v2/copy_fail.go | 53 - .../jackc/pgproto3/v2/copy_in_response.go | 70 - .../jackc/pgproto3/v2/copy_out_response.go | 71 - .../github.com/jackc/pgproto3/v2/data_row.go | 117 - .../github.com/jackc/pgproto3/v2/describe.go | 64 - vendor/github.com/jackc/pgproto3/v2/doc.go | 4 - .../jackc/pgproto3/v2/empty_query_response.go | 34 - .../jackc/pgproto3/v2/error_response.go | 218 - .../github.com/jackc/pgproto3/v2/execute.go | 65 - vendor/github.com/jackc/pgproto3/v2/flush.go | 34 - .../github.com/jackc/pgproto3/v2/frontend.go | 180 - .../pgproto3/v2/function_call_response.go | 83 - vendor/github.com/jackc/pgproto3/v2/go.mod | 9 - vendor/github.com/jackc/pgproto3/v2/go.sum | 14 - .../github.com/jackc/pgproto3/v2/no_data.go | 34 - .../jackc/pgproto3/v2/notice_response.go | 17 - .../pgproto3/v2/notification_response.go | 72 - .../pgproto3/v2/parameter_description.go | 66 - .../jackc/pgproto3/v2/parameter_status.go | 66 - vendor/github.com/jackc/pgproto3/v2/parse.go | 88 - .../jackc/pgproto3/v2/parse_complete.go | 34 - .../jackc/pgproto3/v2/password_message.go | 51 - .../github.com/jackc/pgproto3/v2/pgproto3.go | 42 - .../jackc/pgproto3/v2/portal_suspended.go | 34 - vendor/github.com/jackc/pgproto3/v2/query.go | 50 - .../jackc/pgproto3/v2/ready_for_query.go | 40 - .../jackc/pgproto3/v2/row_description.go | 134 - .../pgproto3/v2/sasl_initial_response.go | 69 - .../jackc/pgproto3/v2/sasl_response.go | 43 - .../jackc/pgproto3/v2/ssl_request.go | 49 - .../jackc/pgproto3/v2/startup_message.go | 96 - vendor/github.com/jackc/pgproto3/v2/sync.go | 34 - .../github.com/jackc/pgproto3/v2/terminate.go | 34 - .../jackc/pgservicefile/.travis.yml | 9 - vendor/github.com/jackc/pgservicefile/LICENSE | 22 - .../github.com/jackc/pgservicefile/README.md | 6 - vendor/github.com/jackc/pgservicefile/go.mod | 5 - vendor/github.com/jackc/pgservicefile/go.sum | 10 - .../jackc/pgservicefile/pgservicefile.go | 79 - vendor/github.com/jackc/pgtype/CHANGELOG.md | 32 - vendor/github.com/jackc/pgtype/LICENSE | 22 - vendor/github.com/jackc/pgtype/README.md | 7 - vendor/github.com/jackc/pgtype/aclitem.go | 139 - .../github.com/jackc/pgtype/aclitem_array.go | 232 - vendor/github.com/jackc/pgtype/array.go | 352 - vendor/github.com/jackc/pgtype/bit.go | 45 - vendor/github.com/jackc/pgtype/bool.go | 206 - vendor/github.com/jackc/pgtype/bool_array.go | 320 - vendor/github.com/jackc/pgtype/box.go | 166 - vendor/github.com/jackc/pgtype/bpchar.go | 68 - .../github.com/jackc/pgtype/bpchar_array.go | 320 - vendor/github.com/jackc/pgtype/bytea.go | 164 - vendor/github.com/jackc/pgtype/bytea_array.go | 320 - vendor/github.com/jackc/pgtype/cid.go | 61 - vendor/github.com/jackc/pgtype/cidr.go | 31 - vendor/github.com/jackc/pgtype/cidr_array.go | 349 - vendor/github.com/jackc/pgtype/circle.go | 151 - vendor/github.com/jackc/pgtype/convert.go | 453 - .../github.com/jackc/pgtype/database_sql.go | 42 - vendor/github.com/jackc/pgtype/date.go | 275 - vendor/github.com/jackc/pgtype/date_array.go | 321 - vendor/github.com/jackc/pgtype/daterange.go | 267 - vendor/github.com/jackc/pgtype/enum_array.go | 232 - vendor/github.com/jackc/pgtype/float4.go | 204 - .../github.com/jackc/pgtype/float4_array.go | 320 - vendor/github.com/jackc/pgtype/float8.go | 194 - .../github.com/jackc/pgtype/float8_array.go | 320 - .../github.com/jackc/pgtype/generic_binary.go | 39 - .../github.com/jackc/pgtype/generic_text.go | 39 - vendor/github.com/jackc/pgtype/go.mod | 14 - vendor/github.com/jackc/pgtype/go.sum | 120 - vendor/github.com/jackc/pgtype/hstore.go | 438 - .../github.com/jackc/pgtype/hstore_array.go | 320 - vendor/github.com/jackc/pgtype/inet.go | 223 - vendor/github.com/jackc/pgtype/inet_array.go | 349 - vendor/github.com/jackc/pgtype/int2.go | 216 - vendor/github.com/jackc/pgtype/int2_array.go | 516 - vendor/github.com/jackc/pgtype/int4.go | 224 - vendor/github.com/jackc/pgtype/int4_array.go | 516 - vendor/github.com/jackc/pgtype/int4range.go | 267 - vendor/github.com/jackc/pgtype/int8.go | 210 - vendor/github.com/jackc/pgtype/int8_array.go | 516 - vendor/github.com/jackc/pgtype/int8range.go | 267 - vendor/github.com/jackc/pgtype/interval.go | 258 - vendor/github.com/jackc/pgtype/json.go | 197 - vendor/github.com/jackc/pgtype/jsonb.go | 78 - vendor/github.com/jackc/pgtype/line.go | 149 - vendor/github.com/jackc/pgtype/lseg.go | 166 - vendor/github.com/jackc/pgtype/macaddr.go | 162 - .../github.com/jackc/pgtype/macaddr_array.go | 321 - vendor/github.com/jackc/pgtype/name.go | 58 - vendor/github.com/jackc/pgtype/numeric.go | 604 -- .../github.com/jackc/pgtype/numeric_array.go | 404 - vendor/github.com/jackc/pgtype/numrange.go | 267 - vendor/github.com/jackc/pgtype/oid.go | 81 - vendor/github.com/jackc/pgtype/oid_value.go | 55 - vendor/github.com/jackc/pgtype/path.go | 196 - vendor/github.com/jackc/pgtype/pgtype.go | 493 - vendor/github.com/jackc/pgtype/pguint32.go | 162 - vendor/github.com/jackc/pgtype/point.go | 142 - vendor/github.com/jackc/pgtype/polygon.go | 177 - vendor/github.com/jackc/pgtype/qchar.go | 153 - vendor/github.com/jackc/pgtype/range.go | 278 - vendor/github.com/jackc/pgtype/record.go | 137 - vendor/github.com/jackc/pgtype/text.go | 175 - vendor/github.com/jackc/pgtype/text_array.go | 320 - vendor/github.com/jackc/pgtype/tid.go | 144 - vendor/github.com/jackc/pgtype/time.go | 226 - vendor/github.com/jackc/pgtype/timestamp.go | 233 - .../jackc/pgtype/timestamp_array.go | 321 - vendor/github.com/jackc/pgtype/timestamptz.go | 286 - .../jackc/pgtype/timestamptz_array.go | 321 - vendor/github.com/jackc/pgtype/tsrange.go | 267 - vendor/github.com/jackc/pgtype/tstzrange.go | 267 - .../jackc/pgtype/tstzrange_array.go | 301 - .../jackc/pgtype/typed_array.go.erb | 326 - .../jackc/pgtype/typed_array_gen.sh | 26 - .../jackc/pgtype/typed_range.go.erb | 269 - .../jackc/pgtype/typed_range_gen.sh | 7 - vendor/github.com/jackc/pgtype/unknown.go | 44 - vendor/github.com/jackc/pgtype/uuid.go | 193 - vendor/github.com/jackc/pgtype/uuid_array.go | 376 - vendor/github.com/jackc/pgtype/varbit.go | 133 - vendor/github.com/jackc/pgtype/varchar.go | 58 - .../github.com/jackc/pgtype/varchar_array.go | 320 - vendor/github.com/jackc/pgtype/xid.go | 64 - vendor/github.com/jackc/pgx/v4/.gitignore | 24 - vendor/github.com/jackc/pgx/v4/.travis.yml | 33 - vendor/github.com/jackc/pgx/v4/CHANGELOG.md | 102 - vendor/github.com/jackc/pgx/v4/LICENSE | 22 - vendor/github.com/jackc/pgx/v4/README.md | 186 - vendor/github.com/jackc/pgx/v4/batch.go | 181 - vendor/github.com/jackc/pgx/v4/conn.go | 797 -- vendor/github.com/jackc/pgx/v4/copy_from.go | 169 - vendor/github.com/jackc/pgx/v4/doc.go | 250 - .../jackc/pgx/v4/extended_query_builder.go | 141 - vendor/github.com/jackc/pgx/v4/go.mod | 23 - vendor/github.com/jackc/pgx/v4/go.sum | 172 - vendor/github.com/jackc/pgx/v4/go_stdlib.go | 61 - .../pgx/v4/internal/sanitize/sanitize.go | 237 - .../github.com/jackc/pgx/v4/large_objects.go | 122 - vendor/github.com/jackc/pgx/v4/logger.go | 99 - vendor/github.com/jackc/pgx/v4/messages.go | 42 - vendor/github.com/jackc/pgx/v4/rows.go | 308 - vendor/github.com/jackc/pgx/v4/tx.go | 350 - vendor/github.com/jackc/pgx/v4/values.go | 261 - vendor/github.com/jbenet/go-context/LICENSE | 21 - .../github.com/jbenet/go-context/io/ctxio.go | 120 - .../github.com/json-iterator/go/.codecov.yml | 3 - vendor/github.com/json-iterator/go/.gitignore | 4 - .../github.com/json-iterator/go/.travis.yml | 14 - vendor/github.com/json-iterator/go/Gopkg.lock | 21 - vendor/github.com/json-iterator/go/Gopkg.toml | 26 - vendor/github.com/json-iterator/go/LICENSE | 21 - vendor/github.com/json-iterator/go/README.md | 87 - vendor/github.com/json-iterator/go/adapter.go | 150 - vendor/github.com/json-iterator/go/any.go | 325 - .../github.com/json-iterator/go/any_array.go | 278 - .../github.com/json-iterator/go/any_bool.go | 137 - .../github.com/json-iterator/go/any_float.go | 83 - .../github.com/json-iterator/go/any_int32.go | 74 - .../github.com/json-iterator/go/any_int64.go | 74 - .../json-iterator/go/any_invalid.go | 82 - vendor/github.com/json-iterator/go/any_nil.go | 69 - .../github.com/json-iterator/go/any_number.go | 123 - .../github.com/json-iterator/go/any_object.go | 374 - vendor/github.com/json-iterator/go/any_str.go | 166 - .../github.com/json-iterator/go/any_uint32.go | 74 - .../github.com/json-iterator/go/any_uint64.go | 74 - vendor/github.com/json-iterator/go/build.sh | 12 - vendor/github.com/json-iterator/go/config.go | 375 - .../go/fuzzy_mode_convert_table.md | 7 - vendor/github.com/json-iterator/go/go.mod | 11 - vendor/github.com/json-iterator/go/go.sum | 14 - vendor/github.com/json-iterator/go/iter.go | 349 - .../github.com/json-iterator/go/iter_array.go | 64 - .../github.com/json-iterator/go/iter_float.go | 339 - .../github.com/json-iterator/go/iter_int.go | 345 - .../json-iterator/go/iter_object.go | 267 - .../github.com/json-iterator/go/iter_skip.go | 130 - .../json-iterator/go/iter_skip_sloppy.go | 163 - .../json-iterator/go/iter_skip_strict.go | 99 - .../github.com/json-iterator/go/iter_str.go | 215 - .../github.com/json-iterator/go/jsoniter.go | 18 - vendor/github.com/json-iterator/go/pool.go | 42 - vendor/github.com/json-iterator/go/reflect.go | 337 - .../json-iterator/go/reflect_array.go | 104 - .../json-iterator/go/reflect_dynamic.go | 70 - .../json-iterator/go/reflect_extension.go | 483 - .../json-iterator/go/reflect_json_number.go | 112 - .../go/reflect_json_raw_message.go | 60 - .../json-iterator/go/reflect_map.go | 346 - .../json-iterator/go/reflect_marshaler.go | 225 - .../json-iterator/go/reflect_native.go | 453 - .../json-iterator/go/reflect_optional.go | 133 - .../json-iterator/go/reflect_slice.go | 99 - .../go/reflect_struct_decoder.go | 1092 -- .../go/reflect_struct_encoder.go | 211 - vendor/github.com/json-iterator/go/stream.go | 211 - .../json-iterator/go/stream_float.go | 111 - .../github.com/json-iterator/go/stream_int.go | 190 - .../github.com/json-iterator/go/stream_str.go | 372 - vendor/github.com/json-iterator/go/test.sh | 12 - .../kevinburke/ssh_config/.gitattributes | 1 - .../kevinburke/ssh_config/.gitignore | 0 .../github.com/kevinburke/ssh_config/.mailmap | 1 - .../kevinburke/ssh_config/.travis.yml | 14 - .../kevinburke/ssh_config/AUTHORS.txt | 5 - .../github.com/kevinburke/ssh_config/LICENSE | 49 - .../github.com/kevinburke/ssh_config/Makefile | 30 - .../kevinburke/ssh_config/README.md | 81 - .../kevinburke/ssh_config/config.go | 649 -- .../github.com/kevinburke/ssh_config/lexer.go | 240 - .../kevinburke/ssh_config/parser.go | 191 - .../kevinburke/ssh_config/position.go | 25 - .../github.com/kevinburke/ssh_config/token.go | 49 - .../kevinburke/ssh_config/validators.go | 162 - vendor/github.com/klauspost/compress/LICENSE | 28 - .../klauspost/compress/fse/README.md | 79 - .../klauspost/compress/fse/bitreader.go | 107 - .../klauspost/compress/fse/bitwriter.go | 168 - .../klauspost/compress/fse/bytereader.go | 56 - .../klauspost/compress/fse/compress.go | 684 -- .../klauspost/compress/fse/decompress.go | 374 - .../github.com/klauspost/compress/fse/fse.go | 144 - .../klauspost/compress/huff0/.gitignore | 1 - .../klauspost/compress/huff0/README.md | 87 - .../klauspost/compress/huff0/bitreader.go | 115 - .../klauspost/compress/huff0/bitwriter.go | 197 - .../klauspost/compress/huff0/bytereader.go | 54 - .../klauspost/compress/huff0/compress.go | 651 -- .../klauspost/compress/huff0/decompress.go | 472 - .../klauspost/compress/huff0/huff0.go | 260 - .../klauspost/compress/snappy/.gitignore | 16 - .../klauspost/compress/snappy/AUTHORS | 15 - .../klauspost/compress/snappy/CONTRIBUTORS | 37 - .../klauspost/compress/snappy/LICENSE | 27 - .../klauspost/compress/snappy/README | 107 - .../klauspost/compress/snappy/decode.go | 237 - .../klauspost/compress/snappy/decode_amd64.go | 14 - .../klauspost/compress/snappy/decode_amd64.s | 482 - .../klauspost/compress/snappy/decode_other.go | 115 - .../klauspost/compress/snappy/encode.go | 285 - .../klauspost/compress/snappy/encode_amd64.go | 29 - .../klauspost/compress/snappy/encode_amd64.s | 730 -- .../klauspost/compress/snappy/encode_other.go | 238 - .../klauspost/compress/snappy/runbench.cmd | 2 - .../klauspost/compress/snappy/snappy.go | 98 - .../klauspost/compress/zstd/README.md | 393 - .../klauspost/compress/zstd/bitreader.go | 121 - .../klauspost/compress/zstd/bitwriter.go | 169 - .../klauspost/compress/zstd/blockdec.go | 731 -- .../klauspost/compress/zstd/blockenc.go | 837 -- .../compress/zstd/blocktype_string.go | 85 - .../klauspost/compress/zstd/bytebuf.go | 127 - .../klauspost/compress/zstd/bytereader.go | 74 - .../klauspost/compress/zstd/decoder.go | 518 - .../compress/zstd/decoder_options.go | 68 - .../klauspost/compress/zstd/enc_better.go | 518 - .../klauspost/compress/zstd/enc_dfast.go | 674 -- .../klauspost/compress/zstd/enc_fast.go | 744 -- .../klauspost/compress/zstd/enc_params.go | 157 - .../klauspost/compress/zstd/encoder.go | 555 - .../compress/zstd/encoder_options.go | 249 - .../klauspost/compress/zstd/framedec.go | 495 - .../klauspost/compress/zstd/frameenc.go | 115 - .../klauspost/compress/zstd/fse_decoder.go | 384 - .../klauspost/compress/zstd/fse_encoder.go | 726 -- .../klauspost/compress/zstd/fse_predefined.go | 158 - .../klauspost/compress/zstd/hash.go | 77 - .../klauspost/compress/zstd/history.go | 73 - .../compress/zstd/internal/xxhash/LICENSE.txt | 22 - .../compress/zstd/internal/xxhash/README.md | 58 - .../compress/zstd/internal/xxhash/xxhash.go | 238 - .../zstd/internal/xxhash/xxhash_amd64.go | 13 - .../zstd/internal/xxhash/xxhash_amd64.s | 215 - .../zstd/internal/xxhash/xxhash_other.go | 76 - .../zstd/internal/xxhash/xxhash_safe.go | 11 - .../klauspost/compress/zstd/seqdec.go | 402 - .../klauspost/compress/zstd/seqenc.go | 115 - .../klauspost/compress/zstd/snappy.go | 436 - .../klauspost/compress/zstd/zstd.go | 144 - vendor/github.com/kr/pty/.gitignore | 4 - vendor/github.com/kr/pty/LICENSE | 23 - vendor/github.com/kr/pty/README.md | 9 - vendor/github.com/kr/pty/go.mod | 5 - vendor/github.com/kr/pty/go.sum | 2 - vendor/github.com/kr/pty/shim.go | 76 - vendor/github.com/leodido/go-urn/.gitignore | 11 - vendor/github.com/leodido/go-urn/.travis.yml | 18 - vendor/github.com/leodido/go-urn/LICENSE | 21 - vendor/github.com/leodido/go-urn/README.md | 55 - vendor/github.com/leodido/go-urn/go.mod | 5 - vendor/github.com/leodido/go-urn/go.sum | 11 - vendor/github.com/leodido/go-urn/machine.go | 1691 ---- .../github.com/leodido/go-urn/machine.go.rl | 159 - vendor/github.com/leodido/go-urn/makefile | 39 - vendor/github.com/leodido/go-urn/urn.go | 63 - vendor/github.com/mattn/go-isatty/.travis.yml | 14 - vendor/github.com/mattn/go-isatty/LICENSE | 9 - vendor/github.com/mattn/go-isatty/README.md | 50 - vendor/github.com/mattn/go-isatty/doc.go | 2 - vendor/github.com/mattn/go-isatty/go.mod | 5 - vendor/github.com/mattn/go-isatty/go.sum | 2 - vendor/github.com/mattn/go-isatty/go.test.sh | 12 - .../github.com/mattn/go-isatty/isatty_bsd.go | 18 - .../mattn/go-isatty/isatty_others.go | 15 - .../mattn/go-isatty/isatty_plan9.go | 22 - .../mattn/go-isatty/isatty_solaris.go | 22 - .../mattn/go-isatty/isatty_tcgets.go | 18 - .../mattn/go-isatty/isatty_windows.go | 125 - .../github.com/mattn/go-isatty/renovate.json | 8 - vendor/github.com/miekg/dns/.codecov.yml | 8 - vendor/github.com/miekg/dns/.gitignore | 4 - vendor/github.com/miekg/dns/.travis.yml | 17 - vendor/github.com/miekg/dns/AUTHORS | 1 - vendor/github.com/miekg/dns/CODEOWNERS | 1 - vendor/github.com/miekg/dns/CONTRIBUTORS | 10 - vendor/github.com/miekg/dns/COPYRIGHT | 9 - vendor/github.com/miekg/dns/LICENSE | 30 - vendor/github.com/miekg/dns/Makefile.fuzz | 33 - vendor/github.com/miekg/dns/Makefile.release | 52 - vendor/github.com/miekg/dns/README.md | 175 - vendor/github.com/miekg/dns/acceptfunc.go | 61 - vendor/github.com/miekg/dns/client.go | 415 - vendor/github.com/miekg/dns/clientconfig.go | 135 - vendor/github.com/miekg/dns/dane.go | 43 - vendor/github.com/miekg/dns/defaults.go | 384 - vendor/github.com/miekg/dns/dns.go | 134 - vendor/github.com/miekg/dns/dnssec.go | 794 -- vendor/github.com/miekg/dns/dnssec_keygen.go | 140 - vendor/github.com/miekg/dns/dnssec_keyscan.go | 322 - vendor/github.com/miekg/dns/dnssec_privkey.go | 94 - vendor/github.com/miekg/dns/doc.go | 268 - vendor/github.com/miekg/dns/duplicate.go | 37 - vendor/github.com/miekg/dns/edns.go | 675 -- vendor/github.com/miekg/dns/format.go | 93 - vendor/github.com/miekg/dns/fuzz.go | 32 - vendor/github.com/miekg/dns/generate.go | 247 - vendor/github.com/miekg/dns/go.mod | 11 - vendor/github.com/miekg/dns/go.sum | 39 - vendor/github.com/miekg/dns/labels.go | 212 - vendor/github.com/miekg/dns/listen_go111.go | 44 - .../github.com/miekg/dns/listen_go_not111.go | 23 - vendor/github.com/miekg/dns/msg.go | 1195 --- vendor/github.com/miekg/dns/msg_helpers.go | 810 -- vendor/github.com/miekg/dns/msg_truncate.go | 111 - vendor/github.com/miekg/dns/nsecx.go | 95 - vendor/github.com/miekg/dns/privaterr.go | 113 - vendor/github.com/miekg/dns/reverse.go | 52 - vendor/github.com/miekg/dns/sanitize.go | 86 - vendor/github.com/miekg/dns/scan.go | 1405 --- vendor/github.com/miekg/dns/scan_rr.go | 1742 ---- vendor/github.com/miekg/dns/serve_mux.go | 122 - vendor/github.com/miekg/dns/server.go | 764 -- vendor/github.com/miekg/dns/sig0.go | 209 - vendor/github.com/miekg/dns/singleinflight.go | 61 - vendor/github.com/miekg/dns/smimea.go | 44 - vendor/github.com/miekg/dns/tlsa.go | 44 - vendor/github.com/miekg/dns/tsig.go | 389 - vendor/github.com/miekg/dns/types.go | 1527 --- vendor/github.com/miekg/dns/udp.go | 102 - vendor/github.com/miekg/dns/udp_windows.go | 35 - vendor/github.com/miekg/dns/update.go | 110 - vendor/github.com/miekg/dns/version.go | 15 - vendor/github.com/miekg/dns/xfr.go | 266 - vendor/github.com/miekg/dns/zduplicate.go | 1157 --- vendor/github.com/miekg/dns/zmsg.go | 2741 ----- vendor/github.com/miekg/dns/ztypes.go | 898 -- .../github.com/mitchellh/go-homedir/LICENSE | 21 - .../github.com/mitchellh/go-homedir/README.md | 14 - vendor/github.com/mitchellh/go-homedir/go.mod | 1 - .../mitchellh/go-homedir/homedir.go | 167 - .../modern-go/concurrent/.gitignore | 1 - .../modern-go/concurrent/.travis.yml | 14 - .../github.com/modern-go/concurrent/LICENSE | 201 - .../github.com/modern-go/concurrent/README.md | 49 - .../modern-go/concurrent/executor.go | 14 - .../modern-go/concurrent/go_above_19.go | 15 - .../modern-go/concurrent/go_below_19.go | 33 - vendor/github.com/modern-go/concurrent/log.go | 13 - .../github.com/modern-go/concurrent/test.sh | 12 - .../concurrent/unbounded_executor.go | 119 - .../github.com/modern-go/reflect2/.gitignore | 2 - .../github.com/modern-go/reflect2/.travis.yml | 15 - .../github.com/modern-go/reflect2/Gopkg.lock | 15 - .../github.com/modern-go/reflect2/Gopkg.toml | 35 - vendor/github.com/modern-go/reflect2/LICENSE | 201 - .../github.com/modern-go/reflect2/README.md | 71 - .../modern-go/reflect2/go_above_17.go | 8 - .../modern-go/reflect2/go_above_19.go | 14 - .../modern-go/reflect2/go_below_17.go | 9 - .../modern-go/reflect2/go_below_19.go | 14 - .../github.com/modern-go/reflect2/reflect2.go | 298 - .../modern-go/reflect2/reflect2_amd64.s | 0 .../modern-go/reflect2/reflect2_kind.go | 30 - .../modern-go/reflect2/relfect2_386.s | 0 .../modern-go/reflect2/relfect2_amd64p32.s | 0 .../modern-go/reflect2/relfect2_arm.s | 0 .../modern-go/reflect2/relfect2_arm64.s | 0 .../modern-go/reflect2/relfect2_mips64x.s | 0 .../modern-go/reflect2/relfect2_mipsx.s | 0 .../modern-go/reflect2/relfect2_ppc64x.s | 0 .../modern-go/reflect2/relfect2_s390x.s | 0 .../modern-go/reflect2/safe_field.go | 58 - .../github.com/modern-go/reflect2/safe_map.go | 101 - .../modern-go/reflect2/safe_slice.go | 92 - .../modern-go/reflect2/safe_struct.go | 29 - .../modern-go/reflect2/safe_type.go | 78 - vendor/github.com/modern-go/reflect2/test.sh | 12 - .../github.com/modern-go/reflect2/type_map.go | 113 - .../modern-go/reflect2/unsafe_array.go | 65 - .../modern-go/reflect2/unsafe_eface.go | 59 - .../modern-go/reflect2/unsafe_field.go | 74 - .../modern-go/reflect2/unsafe_iface.go | 64 - .../modern-go/reflect2/unsafe_link.go | 70 - .../modern-go/reflect2/unsafe_map.go | 138 - .../modern-go/reflect2/unsafe_ptr.go | 46 - .../modern-go/reflect2/unsafe_slice.go | 177 - .../modern-go/reflect2/unsafe_struct.go | 59 - .../modern-go/reflect2/unsafe_type.go | 85 - .../opencontainers/go-digest/.mailmap | 1 - .../opencontainers/go-digest/.pullapprove.yml | 12 - .../opencontainers/go-digest/.travis.yml | 4 - .../opencontainers/go-digest/CONTRIBUTING.md | 72 - .../opencontainers/go-digest/LICENSE.code | 191 - .../opencontainers/go-digest/LICENSE.docs | 425 - .../opencontainers/go-digest/MAINTAINERS | 9 - .../opencontainers/go-digest/README.md | 104 - .../opencontainers/go-digest/algorithm.go | 192 - .../opencontainers/go-digest/digest.go | 156 - .../opencontainers/go-digest/digester.go | 39 - .../opencontainers/go-digest/doc.go | 56 - .../opencontainers/go-digest/verifiers.go | 45 - vendor/github.com/pkg/errors/.gitignore | 24 - vendor/github.com/pkg/errors/.travis.yml | 10 - vendor/github.com/pkg/errors/LICENSE | 23 - vendor/github.com/pkg/errors/Makefile | 44 - vendor/github.com/pkg/errors/README.md | 59 - vendor/github.com/pkg/errors/appveyor.yml | 32 - vendor/github.com/pkg/errors/errors.go | 288 - vendor/github.com/pkg/errors/go113.go | 38 - vendor/github.com/pkg/errors/stack.go | 177 - .../russross/blackfriday/v2/.gitignore | 8 - .../russross/blackfriday/v2/.travis.yml | 17 - .../russross/blackfriday/v2/LICENSE.txt | 29 - .../russross/blackfriday/v2/README.md | 291 - .../russross/blackfriday/v2/block.go | 1590 --- .../github.com/russross/blackfriday/v2/doc.go | 18 - .../github.com/russross/blackfriday/v2/esc.go | 34 - .../github.com/russross/blackfriday/v2/go.mod | 1 - .../russross/blackfriday/v2/html.go | 949 -- .../russross/blackfriday/v2/inline.go | 1228 --- .../russross/blackfriday/v2/markdown.go | 950 -- .../russross/blackfriday/v2/node.go | 354 - .../russross/blackfriday/v2/smartypants.go | 457 - vendor/github.com/sdslabs/gin-jwt/.drone.yml | 69 - .../github.com/sdslabs/gin-jwt/.editorconfig | 42 - vendor/github.com/sdslabs/gin-jwt/.gitignore | 31 - .../github.com/sdslabs/gin-jwt/.revive.toml | 25 - vendor/github.com/sdslabs/gin-jwt/LICENSE | 21 - vendor/github.com/sdslabs/gin-jwt/Makefile | 59 - vendor/github.com/sdslabs/gin-jwt/README.md | 335 - vendor/github.com/sdslabs/gin-jwt/auth_jwt.go | 774 -- vendor/github.com/sdslabs/gin-jwt/go.mod | 13 - vendor/github.com/sdslabs/gin-jwt/go.sum | 60 - vendor/github.com/sergi/go-diff/AUTHORS | 25 - vendor/github.com/sergi/go-diff/CONTRIBUTORS | 32 - vendor/github.com/sergi/go-diff/LICENSE | 20 - .../sergi/go-diff/diffmatchpatch/diff.go | 1345 --- .../go-diff/diffmatchpatch/diffmatchpatch.go | 46 - .../sergi/go-diff/diffmatchpatch/match.go | 160 - .../sergi/go-diff/diffmatchpatch/mathutil.go | 23 - .../diffmatchpatch/operation_string.go | 17 - .../sergi/go-diff/diffmatchpatch/patch.go | 556 - .../go-diff/diffmatchpatch/stringutil.go | 88 - .../sanitized_anchor_name/.travis.yml | 16 - .../shurcooL/sanitized_anchor_name/LICENSE | 21 - .../shurcooL/sanitized_anchor_name/README.md | 36 - .../shurcooL/sanitized_anchor_name/go.mod | 1 - .../shurcooL/sanitized_anchor_name/main.go | 29 - vendor/github.com/src-d/gcfg/LICENSE | 28 - vendor/github.com/src-d/gcfg/README | 4 - vendor/github.com/src-d/gcfg/doc.go | 145 - vendor/github.com/src-d/gcfg/errors.go | 41 - vendor/github.com/src-d/gcfg/go1_0.go | 7 - vendor/github.com/src-d/gcfg/go1_2.go | 9 - vendor/github.com/src-d/gcfg/read.go | 273 - .../github.com/src-d/gcfg/scanner/errors.go | 121 - .../github.com/src-d/gcfg/scanner/scanner.go | 342 - vendor/github.com/src-d/gcfg/set.go | 332 - .../github.com/src-d/gcfg/token/position.go | 435 - .../github.com/src-d/gcfg/token/serialize.go | 56 - vendor/github.com/src-d/gcfg/token/token.go | 83 - vendor/github.com/src-d/gcfg/types/bool.go | 23 - vendor/github.com/src-d/gcfg/types/doc.go | 4 - vendor/github.com/src-d/gcfg/types/enum.go | 44 - vendor/github.com/src-d/gcfg/types/int.go | 86 - vendor/github.com/src-d/gcfg/types/scan.go | 23 - .../ugorji/go/codec/0_importpath.go | 7 - vendor/github.com/ugorji/go/codec/LICENSE | 22 - vendor/github.com/ugorji/go/codec/binc.go | 1219 --- vendor/github.com/ugorji/go/codec/build.sh | 272 - vendor/github.com/ugorji/go/codec/cbor.go | 846 -- vendor/github.com/ugorji/go/codec/codecgen.go | 13 - vendor/github.com/ugorji/go/codec/decode.go | 2034 ---- vendor/github.com/ugorji/go/codec/doc.go | 226 - vendor/github.com/ugorji/go/codec/encode.go | 1373 --- .../ugorji/go/codec/fast-path.generated.go | 8950 ----------------- .../ugorji/go/codec/fast-path.go.tmpl | 503 - .../ugorji/go/codec/fast-path.not.go | 41 - vendor/github.com/ugorji/go/codec/float.go | 313 - .../ugorji/go/codec/gen-dec-array.go.tmpl | 90 - .../ugorji/go/codec/gen-dec-map.go.tmpl | 53 - .../ugorji/go/codec/gen-enc-chan.go.tmpl | 27 - .../ugorji/go/codec/gen-helper.generated.go | 273 - .../ugorji/go/codec/gen-helper.go.tmpl | 241 - .../ugorji/go/codec/gen.generated.go | 187 - vendor/github.com/ugorji/go/codec/gen.go | 2339 ----- vendor/github.com/ugorji/go/codec/go.mod | 5 - .../go/codec/goversion_arrayof_gte_go15.go | 14 - .../go/codec/goversion_arrayof_lt_go15.go | 14 - .../go/codec/goversion_fmt_time_gte_go15.go | 12 - .../go/codec/goversion_fmt_time_lt_go15.go | 15 - .../go/codec/goversion_makemap_gte_go19.go | 15 - .../go/codec/goversion_makemap_lt_go19.go | 12 - .../go/codec/goversion_maprange_gte_go112.go | 44 - .../go/codec/goversion_maprange_lt_go112.go | 47 - ...version_unexportedembeddedptr_gte_go110.go | 8 - ...oversion_unexportedembeddedptr_lt_go110.go | 8 - .../go/codec/goversion_unsupported_lt_go14.go | 17 - .../go/codec/goversion_vendor_eq_go15.go | 10 - .../go/codec/goversion_vendor_eq_go16.go | 10 - .../go/codec/goversion_vendor_gte_go17.go | 8 - .../go/codec/goversion_vendor_lt_go15.go | 8 - vendor/github.com/ugorji/go/codec/helper.go | 2682 ----- vendor/github.com/ugorji/go/codec/helper.s | 0 .../ugorji/go/codec/helper_internal.go | 124 - .../ugorji/go/codec/helper_not_unsafe.go | 409 - .../ugorji/go/codec/helper_unsafe.go | 867 -- vendor/github.com/ugorji/go/codec/json.go | 1493 --- .../ugorji/go/codec/mammoth-test.go.tmpl | 162 - .../ugorji/go/codec/mammoth2-test.go.tmpl | 94 - vendor/github.com/ugorji/go/codec/msgpack.go | 1108 -- vendor/github.com/ugorji/go/codec/prebuild.go | 136 - vendor/github.com/ugorji/go/codec/reader.go | 1017 -- .../ugorji/go/codec/register_ext.go | 38 - vendor/github.com/ugorji/go/codec/rpc.go | 222 - vendor/github.com/ugorji/go/codec/simple.go | 647 -- .../ugorji/go/codec/sort-slice.generated.go | 266 - .../ugorji/go/codec/sort-slice.go.tmpl | 64 - .../ugorji/go/codec/test-cbor-goldens.json | 639 -- vendor/github.com/ugorji/go/codec/test.py | 126 - vendor/github.com/ugorji/go/codec/writer.go | 267 - vendor/github.com/urfave/cli/.flake8 | 2 - vendor/github.com/urfave/cli/.gitignore | 4 - .../github.com/urfave/cli/CODE_OF_CONDUCT.md | 74 - vendor/github.com/urfave/cli/LICENSE | 21 - vendor/github.com/urfave/cli/README.md | 70 - vendor/github.com/urfave/cli/app.go | 533 - vendor/github.com/urfave/cli/appveyor.yml | 28 - vendor/github.com/urfave/cli/category.go | 44 - vendor/github.com/urfave/cli/cli.go | 22 - vendor/github.com/urfave/cli/command.go | 379 - vendor/github.com/urfave/cli/context.go | 347 - vendor/github.com/urfave/cli/docs.go | 148 - vendor/github.com/urfave/cli/errors.go | 115 - vendor/github.com/urfave/cli/fish.go | 194 - vendor/github.com/urfave/cli/flag.go | 346 - vendor/github.com/urfave/cli/flag_bool.go | 109 - vendor/github.com/urfave/cli/flag_bool_t.go | 110 - vendor/github.com/urfave/cli/flag_duration.go | 106 - vendor/github.com/urfave/cli/flag_float64.go | 106 - vendor/github.com/urfave/cli/flag_generic.go | 110 - vendor/github.com/urfave/cli/flag_int.go | 105 - vendor/github.com/urfave/cli/flag_int64.go | 106 - .../github.com/urfave/cli/flag_int64_slice.go | 197 - .../github.com/urfave/cli/flag_int_slice.go | 196 - vendor/github.com/urfave/cli/flag_string.go | 98 - .../urfave/cli/flag_string_slice.go | 182 - vendor/github.com/urfave/cli/flag_uint.go | 106 - vendor/github.com/urfave/cli/flag_uint64.go | 106 - vendor/github.com/urfave/cli/funcs.go | 44 - vendor/github.com/urfave/cli/go.mod | 9 - vendor/github.com/urfave/cli/go.sum | 14 - vendor/github.com/urfave/cli/help.go | 363 - vendor/github.com/urfave/cli/parse.go | 94 - vendor/github.com/urfave/cli/sort.go | 29 - vendor/github.com/urfave/cli/template.go | 121 - vendor/github.com/xanzy/ssh-agent/.gitignore | 24 - vendor/github.com/xanzy/ssh-agent/LICENSE | 202 - vendor/github.com/xanzy/ssh-agent/README.md | 23 - vendor/github.com/xanzy/ssh-agent/go.mod | 6 - vendor/github.com/xanzy/ssh-agent/go.sum | 4 - .../xanzy/ssh-agent/pageant_windows.go | 146 - vendor/github.com/xanzy/ssh-agent/sshagent.go | 49 - .../xanzy/ssh-agent/sshagent_windows.go | 80 - vendor/github.com/xdg/scram/.gitignore | 0 vendor/github.com/xdg/scram/.travis.yml | 11 - vendor/github.com/xdg/scram/LICENSE | 175 - vendor/github.com/xdg/scram/README.md | 71 - vendor/github.com/xdg/scram/client.go | 130 - vendor/github.com/xdg/scram/client_conv.go | 149 - vendor/github.com/xdg/scram/common.go | 97 - vendor/github.com/xdg/scram/doc.go | 24 - vendor/github.com/xdg/scram/parse.go | 205 - vendor/github.com/xdg/scram/scram.go | 66 - vendor/github.com/xdg/scram/server.go | 50 - vendor/github.com/xdg/scram/server_conv.go | 151 - vendor/github.com/xdg/stringprep/.gitignore | 0 vendor/github.com/xdg/stringprep/.travis.yml | 10 - vendor/github.com/xdg/stringprep/LICENSE | 175 - vendor/github.com/xdg/stringprep/README.md | 27 - vendor/github.com/xdg/stringprep/bidi.go | 73 - vendor/github.com/xdg/stringprep/doc.go | 10 - vendor/github.com/xdg/stringprep/error.go | 14 - vendor/github.com/xdg/stringprep/map.go | 21 - vendor/github.com/xdg/stringprep/profile.go | 75 - vendor/github.com/xdg/stringprep/saslprep.go | 52 - vendor/github.com/xdg/stringprep/set.go | 36 - vendor/github.com/xdg/stringprep/tables.go | 3215 ------ vendor/github.com/yudai/hcl/.gitignore | 1 - vendor/github.com/yudai/hcl/LICENSE | 354 - vendor/github.com/yudai/hcl/Makefile | 17 - vendor/github.com/yudai/hcl/README.md | 84 - vendor/github.com/yudai/hcl/decoder.go | 490 - vendor/github.com/yudai/hcl/hcl.go | 11 - vendor/github.com/yudai/hcl/hcl/lex.go | 447 - vendor/github.com/yudai/hcl/hcl/object.go | 128 - vendor/github.com/yudai/hcl/hcl/parse.go | 39 - vendor/github.com/yudai/hcl/hcl/parse.y | 281 - .../yudai/hcl/hcl/valuetype_string.go | 16 - vendor/github.com/yudai/hcl/hcl/y.go | 790 -- vendor/github.com/yudai/hcl/json/lex.go | 256 - vendor/github.com/yudai/hcl/json/parse.go | 40 - vendor/github.com/yudai/hcl/json/parse.y | 210 - vendor/github.com/yudai/hcl/json/y.go | 699 -- vendor/github.com/yudai/hcl/lex.go | 31 - vendor/github.com/yudai/hcl/parse.go | 22 - vendor/go.mongodb.org/mongo-driver/LICENSE | 201 - .../go.mongodb.org/mongo-driver/bson/bson.go | 50 - .../mongo-driver/bson/bson_1_8.go | 81 - .../mongo-driver/bson/bsoncodec/bsoncodec.go | 163 - .../bson/bsoncodec/byte_slice_codec.go | 87 - .../bson/bsoncodec/cond_addr_codec.go | 63 - .../bson/bsoncodec/default_value_decoders.go | 1249 --- .../bson/bsoncodec/default_value_encoders.go | 771 -- .../mongo-driver/bson/bsoncodec/doc.go | 84 - .../bson/bsoncodec/empty_interface_codec.go | 125 - .../mongo-driver/bson/bsoncodec/map_codec.go | 206 - .../mongo-driver/bson/bsoncodec/mode.go | 65 - .../bson/bsoncodec/pointer_codec.go | 110 - .../mongo-driver/bson/bsoncodec/proxy.go | 14 - .../mongo-driver/bson/bsoncodec/registry.go | 472 - .../bson/bsoncodec/slice_codec.go | 196 - .../bson/bsoncodec/string_codec.go | 94 - .../bson/bsoncodec/struct_codec.go | 536 - .../bson/bsoncodec/struct_tag_parser.go | 119 - .../mongo-driver/bson/bsoncodec/time_codec.go | 101 - .../mongo-driver/bson/bsoncodec/types.go | 81 - .../mongo-driver/bson/bsoncodec/uint_codec.go | 150 - .../bsonoptions/byte_slice_codec_options.go | 38 - .../empty_interface_codec_options.go | 38 - .../bson/bsonoptions/map_codec_options.go | 48 - .../bson/bsonoptions/slice_codec_options.go | 38 - .../bson/bsonoptions/string_codec_options.go | 41 - .../bson/bsonoptions/struct_codec_options.go | 70 - .../bson/bsonoptions/time_codec_options.go | 38 - .../bson/bsonoptions/uint_codec_options.go | 38 - .../mongo-driver/bson/bsonrw/copier.go | 389 - .../mongo-driver/bson/bsonrw/doc.go | 9 - .../bson/bsonrw/extjson_parser.go | 738 -- .../bson/bsonrw/extjson_reader.go | 659 -- .../bson/bsonrw/extjson_tables.go | 223 - .../bson/bsonrw/extjson_wrappers.go | 498 - .../bson/bsonrw/extjson_writer.go | 737 -- .../mongo-driver/bson/bsonrw/json_scanner.go | 439 - .../mongo-driver/bson/bsonrw/mode.go | 108 - .../mongo-driver/bson/bsonrw/reader.go | 63 - .../mongo-driver/bson/bsonrw/value_reader.go | 877 -- .../mongo-driver/bson/bsonrw/value_writer.go | 604 -- .../mongo-driver/bson/bsonrw/writer.go | 102 - .../mongo-driver/bson/bsontype/bsontype.go | 95 - .../mongo-driver/bson/decoder.go | 118 - .../go.mongodb.org/mongo-driver/bson/doc.go | 120 - .../mongo-driver/bson/encoder.go | 99 - .../mongo-driver/bson/marshal.go | 223 - .../mongo-driver/bson/primitive/decimal.go | 376 - .../mongo-driver/bson/primitive/objectid.go | 165 - .../mongo-driver/bson/primitive/primitive.go | 196 - .../mongo-driver/bson/primitive_codecs.go | 111 - .../go.mongodb.org/mongo-driver/bson/raw.go | 92 - .../mongo-driver/bson/raw_element.go | 51 - .../mongo-driver/bson/raw_value.go | 287 - .../mongo-driver/bson/registry.go | 24 - .../go.mongodb.org/mongo-driver/bson/types.go | 85 - .../mongo-driver/bson/unmarshal.go | 101 - .../mongo-driver/event/monitoring.go | 91 - .../mongo-driver/internal/const.go | 10 - .../mongo-driver/internal/error.go | 119 - .../mongo-driver/internal/semaphore.go | 57 - .../mongo-driver/mongo/batch_cursor.go | 42 - .../mongo-driver/mongo/bulk_write.go | 457 - .../mongo-driver/mongo/bulk_write_models.go | 245 - .../mongo-driver/mongo/change_stream.go | 575 -- .../mongo-driver/mongo/client.go | 825 -- .../mongo-driver/mongo/client_encryption.go | 135 - .../mongo-driver/mongo/collection.go | 1634 --- .../mongo-driver/mongo/crypt_retrievers.go | 59 - .../mongo-driver/mongo/cursor.go | 252 - .../mongo-driver/mongo/database.go | 435 - .../go.mongodb.org/mongo-driver/mongo/doc.go | 123 - .../mongo-driver/mongo/errors.go | 275 - .../mongo/index_options_builder.go | 134 - .../mongo-driver/mongo/index_view.go | 468 - .../mongo-driver/mongo/mongo.go | 484 - .../mongo-driver/mongo/mongocryptd.go | 150 - .../mongo/options/aggregateoptions.go | 137 - .../mongo/options/autoencryptionoptions.go | 109 - .../mongo/options/bulkwriteoptions.go | 60 - .../mongo/options/changestreamoptions.go | 132 - .../mongo/options/clientencryptionoptions.go | 49 - .../mongo/options/clientoptions.go | 909 -- .../mongo/options/clientoptions_1_10.go | 9 - .../mongo/options/clientoptions_1_9.go | 13 - .../mongo/options/collectionoptions.go | 88 - .../mongo/options/countoptions.go | 94 - .../mongo/options/datakeyoptions.go | 55 - .../mongo-driver/mongo/options/dboptions.go | 88 - .../mongo/options/deleteoptions.go | 41 - .../mongo/options/distinctoptions.go | 57 - .../mongo/options/encryptoptions.go | 64 - .../mongo/options/estimatedcountoptions.go | 44 - .../mongo-driver/mongo/options/findoptions.go | 852 -- .../mongo/options/gridfsoptions.go | 306 - .../mongo/options/indexoptions.go | 397 - .../mongo/options/insertoptions.go | 93 - .../mongo/options/listcollectionsoptions.go | 40 - .../mongo/options/listdatabasesoptions.go | 41 - .../mongo/options/mongooptions.go | 161 - .../mongo/options/replaceoptions.go | 70 - .../mongo/options/runcmdoptions.go | 42 - .../mongo/options/sessionoptions.go | 106 - .../mongo/options/transactionoptions.go | 92 - .../mongo/options/updateoptions.go | 83 - .../mongo/readconcern/readconcern.go | 82 - .../mongo-driver/mongo/readpref/mode.go | 56 - .../mongo-driver/mongo/readpref/options.go | 60 - .../mongo-driver/mongo/readpref/readpref.go | 99 - .../mongo-driver/mongo/results.go | 144 - .../mongo-driver/mongo/session.go | 328 - .../mongo-driver/mongo/single_result.go | 95 - .../go.mongodb.org/mongo-driver/mongo/util.go | 7 - .../mongo/writeconcern/writeconcern.go | 216 - vendor/go.mongodb.org/mongo-driver/tag/tag.go | 57 - .../mongo-driver/version/version.go | 10 - .../mongo-driver/x/bsonx/array.go | 97 - .../mongo-driver/x/bsonx/bsoncore/bsoncore.go | 843 -- .../mongo-driver/x/bsonx/bsoncore/document.go | 399 - .../x/bsonx/bsoncore/document_sequence.go | 183 - .../mongo-driver/x/bsonx/bsoncore/element.go | 152 - .../mongo-driver/x/bsonx/bsoncore/tables.go | 223 - .../mongo-driver/x/bsonx/bsoncore/value.go | 1015 -- .../mongo-driver/x/bsonx/constructor.go | 166 - .../mongo-driver/x/bsonx/document.go | 305 - .../mongo-driver/x/bsonx/element.go | 53 - .../mongo-driver/x/bsonx/mdocument.go | 231 - .../mongo-driver/x/bsonx/primitive_codecs.go | 638 -- .../mongo-driver/x/bsonx/registry.go | 22 - .../mongo-driver/x/bsonx/value.go | 900 -- .../mongo-driver/x/mongo/driver/DESIGN.md | 23 - .../x/mongo/driver/address/addr.go | 49 - .../mongo-driver/x/mongo/driver/auth/auth.go | 153 - .../mongo-driver/x/mongo/driver/auth/cred.go | 16 - .../x/mongo/driver/auth/default.go | 67 - .../mongo-driver/x/mongo/driver/auth/doc.go | 23 - .../x/mongo/driver/auth/gssapi.go | 60 - .../x/mongo/driver/auth/gssapi_not_enabled.go | 16 - .../mongo/driver/auth/gssapi_not_supported.go | 21 - .../mongo/driver/auth/internal/gssapi/gss.go | 166 - .../driver/auth/internal/gssapi/gss_wrapper.c | 248 - .../driver/auth/internal/gssapi/gss_wrapper.h | 66 - .../mongo/driver/auth/internal/gssapi/sspi.go | 352 - .../auth/internal/gssapi/sspi_wrapper.c | 218 - .../auth/internal/gssapi/sspi_wrapper.h | 58 - .../x/mongo/driver/auth/mongodbcr.go | 94 - .../mongo-driver/x/mongo/driver/auth/plain.go | 56 - .../mongo-driver/x/mongo/driver/auth/sasl.go | 112 - .../mongo-driver/x/mongo/driver/auth/scram.go | 102 - .../mongo-driver/x/mongo/driver/auth/util.go | 23 - .../mongo-driver/x/mongo/driver/auth/x509.go | 49 - .../x/mongo/driver/batch_cursor.go | 322 - .../mongo-driver/x/mongo/driver/batches.go | 74 - .../x/mongo/driver/compression.go | 105 - .../x/mongo/driver/connstring/connstring.go | 789 -- .../mongo-driver/x/mongo/driver/crypt.go | 333 - .../x/mongo/driver/description/description.go | 10 - .../x/mongo/driver/description/feature.go | 36 - .../x/mongo/driver/description/server.go | 357 - .../x/mongo/driver/description/server_kind.go | 43 - .../driver/description/server_selector.go | 286 - .../x/mongo/driver/description/topology.go | 93 - .../mongo/driver/description/topology_kind.go | 37 - .../x/mongo/driver/description/version.go | 44 - .../mongo/driver/description/version_range.go | 31 - .../mongo-driver/x/mongo/driver/dns/dns.go | 139 - .../mongo-driver/x/mongo/driver/driver.go | 181 - .../mongo-driver/x/mongo/driver/errors.go | 409 - .../mongo-driver/x/mongo/driver/legacy.go | 16 - .../driver/list_collections_batch_cursor.go | 129 - .../x/mongo/driver/mongocrypt/binary.go | 55 - .../x/mongo/driver/mongocrypt/errors.go | 43 - .../driver/mongocrypt/errors_not_enabled.go | 20 - .../x/mongo/driver/mongocrypt/mongocrypt.go | 292 - .../driver/mongocrypt/mongocrypt_context.go | 103 - .../mongocrypt_context_not_enabled.go | 56 - .../mongocrypt/mongocrypt_kms_context.go | 69 - .../mongocrypt_kms_context_not_enabled.go | 38 - .../mongocrypt/mongocrypt_not_enabled.go | 54 - .../options/mongocrypt_context_options.go | 65 - .../mongocrypt/options/mongocrypt_options.go | 41 - .../mongocrypt/options/provider_options.go | 46 - .../x/mongo/driver/mongocrypt/state.go | 43 - .../mongo-driver/x/mongo/driver/operation.go | 1326 --- .../driver/operation/abort_transaction.go | 189 - .../driver/operation/abort_transaction.toml | 17 - .../x/mongo/driver/operation/aggregate.go | 355 - .../x/mongo/driver/operation/aggregate.toml | 48 - .../x/mongo/driver/operation/command.go | 176 - .../driver/operation/commit_transaction.go | 192 - .../driver/operation/commit_transaction.toml | 22 - .../x/mongo/driver/operation/count.go | 245 - .../x/mongo/driver/operation/count.toml | 26 - .../x/mongo/driver/operation/createIndexes.go | 236 - .../mongo/driver/operation/createIndexes.toml | 34 - .../x/mongo/driver/operation/delete.go | 240 - .../x/mongo/driver/operation/delete.toml | 38 - .../x/mongo/driver/operation/distinct.go | 274 - .../x/mongo/driver/operation/distinct.toml | 37 - .../mongo/driver/operation/drop_collection.go | 198 - .../driver/operation/drop_collection.toml | 21 - .../x/mongo/driver/operation/drop_database.go | 180 - .../mongo/driver/operation/drop_database.toml | 18 - .../x/mongo/driver/operation/drop_indexes.go | 221 - .../mongo/driver/operation/drop_indexes.toml | 28 - .../x/mongo/driver/operation/end_sessions.go | 151 - .../mongo/driver/operation/end_sessions.toml | 16 - .../x/mongo/driver/operation/find.go | 495 - .../x/mongo/driver/operation/find.toml | 100 - .../mongo/driver/operation/find_and_modify.go | 406 - .../driver/operation/find_and_modify.toml | 68 - .../x/mongo/driver/operation/insert.go | 254 - .../x/mongo/driver/operation/insert.toml | 45 - .../x/mongo/driver/operation/ismaster.go | 429 - .../x/mongo/driver/operation/listDatabases.go | 300 - .../mongo/driver/operation/listDatabases.toml | 33 - .../driver/operation/list_collections.go | 210 - .../driver/operation/list_collections.toml | 23 - .../x/mongo/driver/operation/list_indexes.go | 212 - .../mongo/driver/operation/list_indexes.toml | 20 - .../x/mongo/driver/operation/operation.go | 15 - .../x/mongo/driver/operation/update.go | 307 - .../x/mongo/driver/operation/update.toml | 49 - .../x/mongo/driver/operation_legacy.go | 686 -- .../x/mongo/driver/session/client_session.go | 403 - .../x/mongo/driver/session/cluster_clock.go | 36 - .../x/mongo/driver/session/options.go | 58 - .../x/mongo/driver/session/server_session.go | 69 - .../x/mongo/driver/session/session_pool.go | 180 - .../x/mongo/driver/topology/DESIGN.md | 40 - .../x/mongo/driver/topology/connection.go | 533 - .../driver/topology/connection_legacy.go | 1 - .../connection_legacy_command_metadata.go | 28 - .../driver/topology/connection_options.go | 182 - .../x/mongo/driver/topology/errors.go | 22 - .../x/mongo/driver/topology/fsm.go | 350 - .../x/mongo/driver/topology/pool.go | 487 - .../x/mongo/driver/topology/resource_pool.go | 218 - .../x/mongo/driver/topology/server.go | 657 -- .../x/mongo/driver/topology/server_options.go | 148 - .../x/mongo/driver/topology/topology.go | 678 -- .../mongo/driver/topology/topology_options.go | 403 - .../driver/topology/topology_options_1_10.go | 9 - .../driver/topology/topology_options_1_9.go | 13 - .../mongo-driver/x/mongo/driver/uuid/uuid.go | 37 - .../x/mongo/driver/wiremessage/wiremessage.go | 555 - vendor/golang.org/x/crypto/AUTHORS | 3 - vendor/golang.org/x/crypto/CONTRIBUTORS | 3 - vendor/golang.org/x/crypto/LICENSE | 27 - vendor/golang.org/x/crypto/PATENTS | 22 - vendor/golang.org/x/crypto/bcrypt/base64.go | 35 - vendor/golang.org/x/crypto/bcrypt/bcrypt.go | 295 - vendor/golang.org/x/crypto/blowfish/block.go | 159 - vendor/golang.org/x/crypto/blowfish/cipher.go | 99 - vendor/golang.org/x/crypto/blowfish/const.go | 199 - vendor/golang.org/x/crypto/cast5/cast5.go | 533 - .../x/crypto/chacha20/chacha_arm64.go | 16 - .../x/crypto/chacha20/chacha_arm64.s | 307 - .../x/crypto/chacha20/chacha_generic.go | 398 - .../x/crypto/chacha20/chacha_noasm.go | 13 - .../x/crypto/chacha20/chacha_ppc64le.go | 16 - .../x/crypto/chacha20/chacha_ppc64le.s | 449 - .../x/crypto/chacha20/chacha_s390x.go | 26 - .../x/crypto/chacha20/chacha_s390x.s | 224 - vendor/golang.org/x/crypto/chacha20/xor.go | 42 - .../x/crypto/curve25519/curve25519.go | 95 - .../x/crypto/curve25519/curve25519_amd64.go | 240 - .../x/crypto/curve25519/curve25519_amd64.s | 1793 ---- .../x/crypto/curve25519/curve25519_generic.go | 828 -- .../x/crypto/curve25519/curve25519_noasm.go | 11 - vendor/golang.org/x/crypto/ed25519/ed25519.go | 222 - .../x/crypto/ed25519/ed25519_go113.go | 73 - .../ed25519/internal/edwards25519/const.go | 1422 --- .../internal/edwards25519/edwards25519.go | 1793 ---- .../x/crypto/internal/subtle/aliasing.go | 32 - .../internal/subtle/aliasing_appengine.go | 35 - .../x/crypto/openpgp/armor/armor.go | 224 - .../x/crypto/openpgp/armor/encode.go | 160 - .../x/crypto/openpgp/canonical_text.go | 59 - .../x/crypto/openpgp/elgamal/elgamal.go | 124 - .../x/crypto/openpgp/errors/errors.go | 72 - vendor/golang.org/x/crypto/openpgp/keys.go | 693 -- .../x/crypto/openpgp/packet/compressed.go | 123 - .../x/crypto/openpgp/packet/config.go | 91 - .../x/crypto/openpgp/packet/encrypted_key.go | 208 - .../x/crypto/openpgp/packet/literal.go | 89 - .../x/crypto/openpgp/packet/ocfb.go | 143 - .../openpgp/packet/one_pass_signature.go | 73 - .../x/crypto/openpgp/packet/opaque.go | 162 - .../x/crypto/openpgp/packet/packet.go | 584 -- .../x/crypto/openpgp/packet/private_key.go | 385 - .../x/crypto/openpgp/packet/public_key.go | 753 -- .../x/crypto/openpgp/packet/public_key_v3.go | 279 - .../x/crypto/openpgp/packet/reader.go | 76 - .../x/crypto/openpgp/packet/signature.go | 731 -- .../x/crypto/openpgp/packet/signature_v3.go | 146 - .../openpgp/packet/symmetric_key_encrypted.go | 155 - .../openpgp/packet/symmetrically_encrypted.go | 290 - .../x/crypto/openpgp/packet/userattribute.go | 91 - .../x/crypto/openpgp/packet/userid.go | 160 - vendor/golang.org/x/crypto/openpgp/read.go | 442 - vendor/golang.org/x/crypto/openpgp/s2k/s2k.go | 273 - vendor/golang.org/x/crypto/openpgp/write.go | 418 - vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go | 77 - .../x/crypto/poly1305/bits_compat.go | 39 - .../x/crypto/poly1305/bits_go1.13.go | 21 - .../golang.org/x/crypto/poly1305/mac_noasm.go | 9 - .../golang.org/x/crypto/poly1305/poly1305.go | 99 - .../golang.org/x/crypto/poly1305/sum_amd64.go | 47 - .../golang.org/x/crypto/poly1305/sum_amd64.s | 108 - .../x/crypto/poly1305/sum_generic.go | 310 - .../x/crypto/poly1305/sum_ppc64le.go | 47 - .../x/crypto/poly1305/sum_ppc64le.s | 181 - .../golang.org/x/crypto/poly1305/sum_s390x.go | 75 - .../golang.org/x/crypto/poly1305/sum_s390x.s | 503 - .../golang.org/x/crypto/ssh/agent/client.go | 813 -- .../golang.org/x/crypto/ssh/agent/forward.go | 103 - .../golang.org/x/crypto/ssh/agent/keyring.go | 241 - .../golang.org/x/crypto/ssh/agent/server.go | 570 -- vendor/golang.org/x/crypto/ssh/buffer.go | 97 - vendor/golang.org/x/crypto/ssh/certs.go | 546 - vendor/golang.org/x/crypto/ssh/channel.go | 633 -- vendor/golang.org/x/crypto/ssh/cipher.go | 781 -- vendor/golang.org/x/crypto/ssh/client.go | 278 - vendor/golang.org/x/crypto/ssh/client_auth.go | 639 -- vendor/golang.org/x/crypto/ssh/common.go | 404 - vendor/golang.org/x/crypto/ssh/connection.go | 143 - vendor/golang.org/x/crypto/ssh/doc.go | 21 - vendor/golang.org/x/crypto/ssh/handshake.go | 647 -- .../ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go | 93 - vendor/golang.org/x/crypto/ssh/kex.go | 789 -- vendor/golang.org/x/crypto/ssh/keys.go | 1474 --- .../x/crypto/ssh/knownhosts/knownhosts.go | 540 - vendor/golang.org/x/crypto/ssh/mac.go | 61 - vendor/golang.org/x/crypto/ssh/messages.go | 866 -- vendor/golang.org/x/crypto/ssh/mux.go | 330 - vendor/golang.org/x/crypto/ssh/server.go | 716 -- vendor/golang.org/x/crypto/ssh/session.go | 647 -- vendor/golang.org/x/crypto/ssh/ssh_gss.go | 139 - vendor/golang.org/x/crypto/ssh/streamlocal.go | 116 - vendor/golang.org/x/crypto/ssh/tcpip.go | 474 - vendor/golang.org/x/crypto/ssh/transport.go | 353 - vendor/golang.org/x/net/AUTHORS | 3 - vendor/golang.org/x/net/CONTRIBUTORS | 3 - vendor/golang.org/x/net/LICENSE | 27 - vendor/golang.org/x/net/PATENTS | 22 - vendor/golang.org/x/net/bpf/asm.go | 41 - vendor/golang.org/x/net/bpf/constants.go | 222 - vendor/golang.org/x/net/bpf/doc.go | 82 - vendor/golang.org/x/net/bpf/instructions.go | 726 -- vendor/golang.org/x/net/bpf/setter.go | 10 - vendor/golang.org/x/net/bpf/vm.go | 150 - .../golang.org/x/net/bpf/vm_instructions.go | 182 - vendor/golang.org/x/net/context/context.go | 56 - .../x/net/context/ctxhttp/ctxhttp.go | 71 - vendor/golang.org/x/net/context/go17.go | 72 - vendor/golang.org/x/net/context/go19.go | 20 - vendor/golang.org/x/net/context/pre_go17.go | 300 - vendor/golang.org/x/net/context/pre_go19.go | 109 - vendor/golang.org/x/net/http/httpguts/guts.go | 50 - .../golang.org/x/net/http/httpguts/httplex.go | 346 - vendor/golang.org/x/net/http2/.gitignore | 2 - vendor/golang.org/x/net/http2/Dockerfile | 51 - vendor/golang.org/x/net/http2/Makefile | 3 - vendor/golang.org/x/net/http2/README | 20 - vendor/golang.org/x/net/http2/ciphers.go | 641 -- .../x/net/http2/client_conn_pool.go | 278 - vendor/golang.org/x/net/http2/databuffer.go | 146 - vendor/golang.org/x/net/http2/errors.go | 133 - vendor/golang.org/x/net/http2/flow.go | 52 - vendor/golang.org/x/net/http2/frame.go | 1614 --- vendor/golang.org/x/net/http2/go111.go | 29 - vendor/golang.org/x/net/http2/gotrack.go | 170 - vendor/golang.org/x/net/http2/headermap.go | 88 - vendor/golang.org/x/net/http2/hpack/encode.go | 240 - vendor/golang.org/x/net/http2/hpack/hpack.go | 504 - .../golang.org/x/net/http2/hpack/huffman.go | 229 - vendor/golang.org/x/net/http2/hpack/tables.go | 479 - vendor/golang.org/x/net/http2/http2.go | 385 - vendor/golang.org/x/net/http2/not_go111.go | 20 - vendor/golang.org/x/net/http2/pipe.go | 168 - vendor/golang.org/x/net/http2/server.go | 2964 ------ vendor/golang.org/x/net/http2/transport.go | 2676 ----- vendor/golang.org/x/net/http2/write.go | 365 - vendor/golang.org/x/net/http2/writesched.go | 248 - .../x/net/http2/writesched_priority.go | 452 - .../x/net/http2/writesched_random.go | 77 - vendor/golang.org/x/net/idna/idna10.0.0.go | 734 -- vendor/golang.org/x/net/idna/idna9.0.0.go | 682 -- vendor/golang.org/x/net/idna/punycode.go | 203 - vendor/golang.org/x/net/idna/tables10.0.0.go | 4559 --------- vendor/golang.org/x/net/idna/tables11.0.0.go | 4653 --------- vendor/golang.org/x/net/idna/tables12.00.go | 4733 --------- vendor/golang.org/x/net/idna/tables9.0.0.go | 4486 --------- vendor/golang.org/x/net/idna/trie.go | 72 - vendor/golang.org/x/net/idna/trieval.go | 119 - .../golang.org/x/net/internal/iana/const.go | 223 - .../x/net/internal/socket/cmsghdr.go | 11 - .../x/net/internal/socket/cmsghdr_bsd.go | 13 - .../internal/socket/cmsghdr_linux_32bit.go | 14 - .../internal/socket/cmsghdr_linux_64bit.go | 14 - .../internal/socket/cmsghdr_solaris_64bit.go | 14 - .../x/net/internal/socket/cmsghdr_stub.go | 17 - .../golang.org/x/net/internal/socket/empty.s | 7 - .../x/net/internal/socket/error_unix.go | 31 - .../x/net/internal/socket/error_windows.go | 26 - .../x/net/internal/socket/iovec_32bit.go | 19 - .../x/net/internal/socket/iovec_64bit.go | 19 - .../internal/socket/iovec_solaris_64bit.go | 19 - .../x/net/internal/socket/iovec_stub.go | 11 - .../x/net/internal/socket/mmsghdr_stub.go | 21 - .../x/net/internal/socket/mmsghdr_unix.go | 42 - .../x/net/internal/socket/msghdr_bsd.go | 39 - .../x/net/internal/socket/msghdr_bsdvar.go | 16 - .../x/net/internal/socket/msghdr_linux.go | 36 - .../net/internal/socket/msghdr_linux_32bit.go | 24 - .../net/internal/socket/msghdr_linux_64bit.go | 24 - .../x/net/internal/socket/msghdr_openbsd.go | 14 - .../internal/socket/msghdr_solaris_64bit.go | 36 - .../x/net/internal/socket/msghdr_stub.go | 14 - .../x/net/internal/socket/norace.go | 12 - .../golang.org/x/net/internal/socket/race.go | 37 - .../x/net/internal/socket/rawconn.go | 64 - .../x/net/internal/socket/rawconn_mmsg.go | 79 - .../x/net/internal/socket/rawconn_msg.go | 78 - .../x/net/internal/socket/rawconn_nommsg.go | 15 - .../x/net/internal/socket/rawconn_nomsg.go | 15 - .../x/net/internal/socket/socket.go | 288 - .../golang.org/x/net/internal/socket/sys.go | 33 - .../x/net/internal/socket/sys_bsd.go | 15 - .../x/net/internal/socket/sys_bsdvar.go | 23 - .../x/net/internal/socket/sys_const_unix.go | 17 - .../x/net/internal/socket/sys_darwin.go | 7 - .../x/net/internal/socket/sys_dragonfly.go | 32 - .../net/internal/socket/sys_go1_11_darwin.go | 33 - .../x/net/internal/socket/sys_linkname.go | 42 - .../x/net/internal/socket/sys_linux.go | 27 - .../x/net/internal/socket/sys_linux_386.go | 55 - .../x/net/internal/socket/sys_linux_386.s | 11 - .../x/net/internal/socket/sys_linux_amd64.go | 10 - .../x/net/internal/socket/sys_linux_arm.go | 10 - .../x/net/internal/socket/sys_linux_arm64.go | 10 - .../x/net/internal/socket/sys_linux_mips.go | 10 - .../x/net/internal/socket/sys_linux_mips64.go | 10 - .../net/internal/socket/sys_linux_mips64le.go | 10 - .../x/net/internal/socket/sys_linux_mipsle.go | 10 - .../x/net/internal/socket/sys_linux_ppc64.go | 10 - .../net/internal/socket/sys_linux_ppc64le.go | 10 - .../net/internal/socket/sys_linux_riscv64.go | 12 - .../x/net/internal/socket/sys_linux_s390x.go | 55 - .../x/net/internal/socket/sys_linux_s390x.s | 11 - .../x/net/internal/socket/sys_netbsd.go | 25 - .../x/net/internal/socket/sys_posix.go | 183 - .../x/net/internal/socket/sys_solaris.go | 70 - .../x/net/internal/socket/sys_solaris_amd64.s | 11 - .../x/net/internal/socket/sys_stub.go | 63 - .../x/net/internal/socket/sys_unix.go | 33 - .../x/net/internal/socket/sys_windows.go | 71 - .../x/net/internal/socket/zsys_aix_ppc64.go | 60 - .../x/net/internal/socket/zsys_darwin_386.go | 51 - .../net/internal/socket/zsys_darwin_amd64.go | 53 - .../x/net/internal/socket/zsys_darwin_arm.go | 51 - .../net/internal/socket/zsys_darwin_arm64.go | 53 - .../internal/socket/zsys_dragonfly_amd64.go | 53 - .../x/net/internal/socket/zsys_freebsd_386.go | 51 - .../net/internal/socket/zsys_freebsd_amd64.go | 53 - .../x/net/internal/socket/zsys_freebsd_arm.go | 51 - .../net/internal/socket/zsys_freebsd_arm64.go | 53 - .../x/net/internal/socket/zsys_linux_386.go | 54 - .../x/net/internal/socket/zsys_linux_amd64.go | 57 - .../x/net/internal/socket/zsys_linux_arm.go | 55 - .../x/net/internal/socket/zsys_linux_arm64.go | 58 - .../x/net/internal/socket/zsys_linux_mips.go | 55 - .../net/internal/socket/zsys_linux_mips64.go | 58 - .../internal/socket/zsys_linux_mips64le.go | 58 - .../net/internal/socket/zsys_linux_mipsle.go | 55 - .../x/net/internal/socket/zsys_linux_ppc64.go | 58 - .../net/internal/socket/zsys_linux_ppc64le.go | 58 - .../net/internal/socket/zsys_linux_riscv64.go | 59 - .../x/net/internal/socket/zsys_linux_s390x.go | 58 - .../x/net/internal/socket/zsys_netbsd_386.go | 57 - .../net/internal/socket/zsys_netbsd_amd64.go | 60 - .../x/net/internal/socket/zsys_netbsd_arm.go | 57 - .../net/internal/socket/zsys_netbsd_arm64.go | 59 - .../x/net/internal/socket/zsys_openbsd_386.go | 51 - .../net/internal/socket/zsys_openbsd_amd64.go | 53 - .../x/net/internal/socket/zsys_openbsd_arm.go | 51 - .../net/internal/socket/zsys_openbsd_arm64.go | 53 - .../net/internal/socket/zsys_solaris_amd64.go | 52 - .../golang.org/x/net/internal/socks/client.go | 168 - .../golang.org/x/net/internal/socks/socks.go | 317 - .../x/net/internal/timeseries/timeseries.go | 525 - vendor/golang.org/x/net/ipv4/batch.go | 194 - vendor/golang.org/x/net/ipv4/control.go | 144 - vendor/golang.org/x/net/ipv4/control_bsd.go | 41 - .../golang.org/x/net/ipv4/control_pktinfo.go | 39 - vendor/golang.org/x/net/ipv4/control_stub.go | 13 - vendor/golang.org/x/net/ipv4/control_unix.go | 73 - .../golang.org/x/net/ipv4/control_windows.go | 12 - vendor/golang.org/x/net/ipv4/dgramopt.go | 264 - vendor/golang.org/x/net/ipv4/doc.go | 244 - vendor/golang.org/x/net/ipv4/endpoint.go | 186 - vendor/golang.org/x/net/ipv4/genericopt.go | 55 - vendor/golang.org/x/net/ipv4/header.go | 172 - vendor/golang.org/x/net/ipv4/helper.go | 77 - vendor/golang.org/x/net/ipv4/iana.go | 38 - vendor/golang.org/x/net/ipv4/icmp.go | 57 - vendor/golang.org/x/net/ipv4/icmp_linux.go | 25 - vendor/golang.org/x/net/ipv4/icmp_stub.go | 25 - vendor/golang.org/x/net/ipv4/packet.go | 117 - vendor/golang.org/x/net/ipv4/payload.go | 23 - vendor/golang.org/x/net/ipv4/payload_cmsg.go | 84 - .../golang.org/x/net/ipv4/payload_nocmsg.go | 39 - vendor/golang.org/x/net/ipv4/sockopt.go | 44 - vendor/golang.org/x/net/ipv4/sockopt_posix.go | 71 - vendor/golang.org/x/net/ipv4/sockopt_stub.go | 42 - vendor/golang.org/x/net/ipv4/sys_aix.go | 38 - vendor/golang.org/x/net/ipv4/sys_asmreq.go | 122 - .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 25 - vendor/golang.org/x/net/ipv4/sys_asmreqn.go | 42 - .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 21 - vendor/golang.org/x/net/ipv4/sys_bpf.go | 24 - vendor/golang.org/x/net/ipv4/sys_bpf_stub.go | 16 - vendor/golang.org/x/net/ipv4/sys_bsd.go | 37 - vendor/golang.org/x/net/ipv4/sys_darwin.go | 65 - vendor/golang.org/x/net/ipv4/sys_dragonfly.go | 35 - vendor/golang.org/x/net/ipv4/sys_freebsd.go | 76 - vendor/golang.org/x/net/ipv4/sys_linux.go | 60 - vendor/golang.org/x/net/ipv4/sys_solaris.go | 57 - vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 52 - .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 21 - vendor/golang.org/x/net/ipv4/sys_stub.go | 13 - vendor/golang.org/x/net/ipv4/sys_windows.go | 67 - .../golang.org/x/net/ipv4/zsys_aix_ppc64.go | 33 - vendor/golang.org/x/net/ipv4/zsys_darwin.go | 99 - .../golang.org/x/net/ipv4/zsys_dragonfly.go | 31 - .../golang.org/x/net/ipv4/zsys_freebsd_386.go | 93 - .../x/net/ipv4/zsys_freebsd_amd64.go | 95 - .../golang.org/x/net/ipv4/zsys_freebsd_arm.go | 95 - .../x/net/ipv4/zsys_freebsd_arm64.go | 93 - .../golang.org/x/net/ipv4/zsys_linux_386.go | 130 - .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 132 - .../golang.org/x/net/ipv4/zsys_linux_arm.go | 130 - .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 132 - .../golang.org/x/net/ipv4/zsys_linux_mips.go | 130 - .../x/net/ipv4/zsys_linux_mips64.go | 132 - .../x/net/ipv4/zsys_linux_mips64le.go | 132 - .../x/net/ipv4/zsys_linux_mipsle.go | 130 - .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 130 - .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 132 - .../x/net/ipv4/zsys_linux_ppc64le.go | 132 - .../x/net/ipv4/zsys_linux_riscv64.go | 134 - .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 132 - vendor/golang.org/x/net/ipv4/zsys_netbsd.go | 30 - vendor/golang.org/x/net/ipv4/zsys_openbsd.go | 30 - vendor/golang.org/x/net/ipv4/zsys_solaris.go | 100 - vendor/golang.org/x/net/ipv6/batch.go | 116 - vendor/golang.org/x/net/ipv6/control.go | 187 - .../x/net/ipv6/control_rfc2292_unix.go | 48 - .../x/net/ipv6/control_rfc3542_unix.go | 94 - vendor/golang.org/x/net/ipv6/control_stub.go | 13 - vendor/golang.org/x/net/ipv6/control_unix.go | 55 - .../golang.org/x/net/ipv6/control_windows.go | 12 - vendor/golang.org/x/net/ipv6/dgramopt.go | 301 - vendor/golang.org/x/net/ipv6/doc.go | 243 - vendor/golang.org/x/net/ipv6/endpoint.go | 127 - vendor/golang.org/x/net/ipv6/genericopt.go | 56 - vendor/golang.org/x/net/ipv6/header.go | 55 - vendor/golang.org/x/net/ipv6/helper.go | 58 - vendor/golang.org/x/net/ipv6/iana.go | 86 - vendor/golang.org/x/net/ipv6/icmp.go | 60 - vendor/golang.org/x/net/ipv6/icmp_bsd.go | 29 - vendor/golang.org/x/net/ipv6/icmp_linux.go | 27 - vendor/golang.org/x/net/ipv6/icmp_solaris.go | 27 - vendor/golang.org/x/net/ipv6/icmp_stub.go | 23 - vendor/golang.org/x/net/ipv6/icmp_windows.go | 22 - vendor/golang.org/x/net/ipv6/payload.go | 23 - vendor/golang.org/x/net/ipv6/payload_cmsg.go | 70 - .../golang.org/x/net/ipv6/payload_nocmsg.go | 38 - vendor/golang.org/x/net/ipv6/sockopt.go | 43 - vendor/golang.org/x/net/ipv6/sockopt_posix.go | 89 - vendor/golang.org/x/net/ipv6/sockopt_stub.go | 46 - vendor/golang.org/x/net/ipv6/sys_aix.go | 77 - vendor/golang.org/x/net/ipv6/sys_asmreq.go | 24 - .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 17 - vendor/golang.org/x/net/ipv6/sys_bpf.go | 24 - vendor/golang.org/x/net/ipv6/sys_bpf_stub.go | 16 - vendor/golang.org/x/net/ipv6/sys_bsd.go | 57 - vendor/golang.org/x/net/ipv6/sys_darwin.go | 78 - vendor/golang.org/x/net/ipv6/sys_freebsd.go | 92 - vendor/golang.org/x/net/ipv6/sys_linux.go | 75 - vendor/golang.org/x/net/ipv6/sys_solaris.go | 74 - vendor/golang.org/x/net/ipv6/sys_ssmreq.go | 54 - .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 21 - vendor/golang.org/x/net/ipv6/sys_stub.go | 13 - vendor/golang.org/x/net/ipv6/sys_windows.go | 75 - .../golang.org/x/net/ipv6/zsys_aix_ppc64.go | 103 - vendor/golang.org/x/net/ipv6/zsys_darwin.go | 131 - .../golang.org/x/net/ipv6/zsys_dragonfly.go | 88 - .../golang.org/x/net/ipv6/zsys_freebsd_386.go | 122 - .../x/net/ipv6/zsys_freebsd_amd64.go | 124 - .../golang.org/x/net/ipv6/zsys_freebsd_arm.go | 124 - .../x/net/ipv6/zsys_freebsd_arm64.go | 122 - .../golang.org/x/net/ipv6/zsys_linux_386.go | 152 - .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 154 - .../golang.org/x/net/ipv6/zsys_linux_arm.go | 152 - .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 154 - .../golang.org/x/net/ipv6/zsys_linux_mips.go | 152 - .../x/net/ipv6/zsys_linux_mips64.go | 154 - .../x/net/ipv6/zsys_linux_mips64le.go | 154 - .../x/net/ipv6/zsys_linux_mipsle.go | 152 - .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 152 - .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 154 - .../x/net/ipv6/zsys_linux_ppc64le.go | 154 - .../x/net/ipv6/zsys_linux_riscv64.go | 156 - .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 154 - vendor/golang.org/x/net/ipv6/zsys_netbsd.go | 84 - vendor/golang.org/x/net/ipv6/zsys_openbsd.go | 93 - vendor/golang.org/x/net/ipv6/zsys_solaris.go | 131 - vendor/golang.org/x/net/proxy/dial.go | 54 - vendor/golang.org/x/net/proxy/direct.go | 31 - vendor/golang.org/x/net/proxy/per_host.go | 155 - vendor/golang.org/x/net/proxy/proxy.go | 149 - vendor/golang.org/x/net/proxy/socks5.go | 42 - vendor/golang.org/x/net/trace/events.go | 532 - vendor/golang.org/x/net/trace/histogram.go | 365 - vendor/golang.org/x/net/trace/trace.go | 1130 --- vendor/golang.org/x/sync/AUTHORS | 3 - vendor/golang.org/x/sync/CONTRIBUTORS | 3 - vendor/golang.org/x/sync/LICENSE | 27 - vendor/golang.org/x/sync/PATENTS | 22 - vendor/golang.org/x/sync/errgroup/errgroup.go | 66 - .../golang.org/x/sync/semaphore/semaphore.go | 136 - vendor/golang.org/x/sys/AUTHORS | 3 - vendor/golang.org/x/sys/CONTRIBUTORS | 3 - vendor/golang.org/x/sys/LICENSE | 27 - vendor/golang.org/x/sys/PATENTS | 22 - vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 17 - vendor/golang.org/x/sys/cpu/byteorder.go | 60 - vendor/golang.org/x/sys/cpu/cpu.go | 171 - vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go | 34 - vendor/golang.org/x/sys/cpu/cpu_arm.go | 40 - vendor/golang.org/x/sys/cpu/cpu_arm64.go | 138 - vendor/golang.org/x/sys/cpu/cpu_arm64.s | 31 - vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 11 - vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 21 - vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 16 - .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 11 - .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 22 - vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 43 - vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 26 - vendor/golang.org/x/sys/cpu/cpu_linux.go | 15 - vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 - .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 71 - .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 22 - .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 9 - .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 33 - .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 161 - vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 9 - vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 9 - .../golang.org/x/sys/cpu/cpu_other_arm64.go | 9 - vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 9 - vendor/golang.org/x/sys/cpu/cpu_s390x.s | 57 - vendor/golang.org/x/sys/cpu/cpu_wasm.go | 13 - vendor/golang.org/x/sys/cpu/cpu_x86.go | 59 - vendor/golang.org/x/sys/cpu/cpu_x86.s | 27 - vendor/golang.org/x/sys/cpu/hwcap_linux.go | 56 - .../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 - .../sys/internal/unsafeheader/unsafeheader.go | 30 - vendor/golang.org/x/sys/unix/.gitignore | 2 - vendor/golang.org/x/sys/unix/README.md | 184 - .../golang.org/x/sys/unix/affinity_linux.go | 86 - vendor/golang.org/x/sys/unix/aliases.go | 14 - vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 17 - vendor/golang.org/x/sys/unix/asm_darwin_386.s | 29 - .../golang.org/x/sys/unix/asm_darwin_amd64.s | 29 - vendor/golang.org/x/sys/unix/asm_darwin_arm.s | 30 - .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 - .../x/sys/unix/asm_dragonfly_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_386.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm64.s | 29 - vendor/golang.org/x/sys/unix/asm_linux_386.s | 65 - .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 - vendor/golang.org/x/sys/unix/asm_linux_arm.s | 56 - .../golang.org/x/sys/unix/asm_linux_arm64.s | 52 - .../golang.org/x/sys/unix/asm_linux_mips64x.s | 56 - .../golang.org/x/sys/unix/asm_linux_mipsx.s | 54 - .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 44 - .../golang.org/x/sys/unix/asm_linux_riscv64.s | 47 - .../golang.org/x/sys/unix/asm_linux_s390x.s | 56 - vendor/golang.org/x/sys/unix/asm_netbsd_386.s | 29 - .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 29 - vendor/golang.org/x/sys/unix/asm_netbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_netbsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_386.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 - .../golang.org/x/sys/unix/bluetooth_linux.go | 36 - vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 - vendor/golang.org/x/sys/unix/constants.go | 13 - vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 27 - vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 29 - vendor/golang.org/x/sys/unix/dev_darwin.go | 24 - vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 - vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 - vendor/golang.org/x/sys/unix/dev_linux.go | 42 - vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 - vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 - vendor/golang.org/x/sys/unix/dirent.go | 102 - vendor/golang.org/x/sys/unix/endian_big.go | 9 - vendor/golang.org/x/sys/unix/endian_little.go | 9 - vendor/golang.org/x/sys/unix/env_unix.go | 31 - .../x/sys/unix/errors_freebsd_386.go | 233 - .../x/sys/unix/errors_freebsd_amd64.go | 233 - .../x/sys/unix/errors_freebsd_arm.go | 226 - .../x/sys/unix/errors_freebsd_arm64.go | 17 - vendor/golang.org/x/sys/unix/fcntl.go | 36 - vendor/golang.org/x/sys/unix/fcntl_darwin.go | 18 - .../x/sys/unix/fcntl_linux_32bit.go | 13 - vendor/golang.org/x/sys/unix/fdset.go | 29 - vendor/golang.org/x/sys/unix/gccgo.go | 62 - vendor/golang.org/x/sys/unix/gccgo_c.c | 39 - .../x/sys/unix/gccgo_linux_amd64.go | 20 - vendor/golang.org/x/sys/unix/ioctl.go | 65 - vendor/golang.org/x/sys/unix/mkall.sh | 240 - vendor/golang.org/x/sys/unix/mkerrors.sh | 703 -- vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 - .../golang.org/x/sys/unix/pledge_openbsd.go | 163 - vendor/golang.org/x/sys/unix/race.go | 30 - vendor/golang.org/x/sys/unix/race0.go | 25 - .../x/sys/unix/readdirent_getdents.go | 12 - .../x/sys/unix/readdirent_getdirentries.go | 19 - .../x/sys/unix/sockcmsg_dragonfly.go | 16 - .../golang.org/x/sys/unix/sockcmsg_linux.go | 36 - vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 92 - .../x/sys/unix/sockcmsg_unix_other.go | 38 - vendor/golang.org/x/sys/unix/str.go | 26 - vendor/golang.org/x/sys/unix/syscall.go | 53 - vendor/golang.org/x/sys/unix/syscall_aix.go | 536 - .../golang.org/x/sys/unix/syscall_aix_ppc.go | 54 - .../x/sys/unix/syscall_aix_ppc64.go | 85 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 631 -- .../x/sys/unix/syscall_darwin.1_12.go | 29 - .../x/sys/unix/syscall_darwin.1_13.go | 108 - .../golang.org/x/sys/unix/syscall_darwin.go | 668 -- .../x/sys/unix/syscall_darwin_386.1_11.go | 9 - .../x/sys/unix/syscall_darwin_386.go | 57 - .../x/sys/unix/syscall_darwin_amd64.1_11.go | 9 - .../x/sys/unix/syscall_darwin_amd64.go | 57 - .../x/sys/unix/syscall_darwin_arm.1_11.go | 11 - .../x/sys/unix/syscall_darwin_arm.go | 57 - .../x/sys/unix/syscall_darwin_arm64.1_11.go | 11 - .../x/sys/unix/syscall_darwin_arm64.go | 59 - .../x/sys/unix/syscall_darwin_libSystem.go | 33 - .../x/sys/unix/syscall_dragonfly.go | 539 - .../x/sys/unix/syscall_dragonfly_amd64.go | 56 - .../golang.org/x/sys/unix/syscall_freebsd.go | 874 -- .../x/sys/unix/syscall_freebsd_386.go | 66 - .../x/sys/unix/syscall_freebsd_amd64.go | 66 - .../x/sys/unix/syscall_freebsd_arm.go | 62 - .../x/sys/unix/syscall_freebsd_arm64.go | 62 - .../golang.org/x/sys/unix/syscall_illumos.go | 57 - vendor/golang.org/x/sys/unix/syscall_linux.go | 2202 ---- .../x/sys/unix/syscall_linux_386.go | 390 - .../x/sys/unix/syscall_linux_amd64.go | 194 - .../x/sys/unix/syscall_linux_amd64_gc.go | 13 - .../x/sys/unix/syscall_linux_arm.go | 291 - .../x/sys/unix/syscall_linux_arm64.go | 245 - .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 - .../x/sys/unix/syscall_linux_gc_386.go | 16 - .../x/sys/unix/syscall_linux_gccgo_386.go | 30 - .../x/sys/unix/syscall_linux_gccgo_arm.go | 20 - .../x/sys/unix/syscall_linux_mips64x.go | 230 - .../x/sys/unix/syscall_linux_mipsx.go | 238 - .../x/sys/unix/syscall_linux_ppc64x.go | 156 - .../x/sys/unix/syscall_linux_riscv64.go | 230 - .../x/sys/unix/syscall_linux_s390x.go | 342 - .../x/sys/unix/syscall_linux_sparc64.go | 151 - .../golang.org/x/sys/unix/syscall_netbsd.go | 614 -- .../x/sys/unix/syscall_netbsd_386.go | 37 - .../x/sys/unix/syscall_netbsd_amd64.go | 37 - .../x/sys/unix/syscall_netbsd_arm.go | 37 - .../x/sys/unix/syscall_netbsd_arm64.go | 37 - .../golang.org/x/sys/unix/syscall_openbsd.go | 401 - .../x/sys/unix/syscall_openbsd_386.go | 41 - .../x/sys/unix/syscall_openbsd_amd64.go | 41 - .../x/sys/unix/syscall_openbsd_arm.go | 41 - .../x/sys/unix/syscall_openbsd_arm64.go | 41 - .../golang.org/x/sys/unix/syscall_solaris.go | 724 -- .../x/sys/unix/syscall_solaris_amd64.go | 27 - vendor/golang.org/x/sys/unix/syscall_unix.go | 430 - .../golang.org/x/sys/unix/syscall_unix_gc.go | 15 - .../x/sys/unix/syscall_unix_gc_ppc64x.go | 24 - vendor/golang.org/x/sys/unix/timestruct.go | 82 - .../golang.org/x/sys/unix/unveil_openbsd.go | 42 - vendor/golang.org/x/sys/unix/xattr_bsd.go | 240 - .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1384 --- .../x/sys/unix/zerrors_aix_ppc64.go | 1385 --- .../x/sys/unix/zerrors_darwin_386.go | 1784 ---- .../x/sys/unix/zerrors_darwin_amd64.go | 1784 ---- .../x/sys/unix/zerrors_darwin_arm.go | 1784 ---- .../x/sys/unix/zerrors_darwin_arm64.go | 1784 ---- .../x/sys/unix/zerrors_dragonfly_amd64.go | 1651 --- .../x/sys/unix/zerrors_freebsd_386.go | 1930 ---- .../x/sys/unix/zerrors_freebsd_amd64.go | 1929 ---- .../x/sys/unix/zerrors_freebsd_arm.go | 1819 ---- .../x/sys/unix/zerrors_freebsd_arm64.go | 1930 ---- vendor/golang.org/x/sys/unix/zerrors_linux.go | 2471 ----- .../x/sys/unix/zerrors_linux_386.go | 786 -- .../x/sys/unix/zerrors_linux_amd64.go | 786 -- .../x/sys/unix/zerrors_linux_arm.go | 792 -- .../x/sys/unix/zerrors_linux_arm64.go | 779 -- .../x/sys/unix/zerrors_linux_mips.go | 793 -- .../x/sys/unix/zerrors_linux_mips64.go | 793 -- .../x/sys/unix/zerrors_linux_mips64le.go | 793 -- .../x/sys/unix/zerrors_linux_mipsle.go | 793 -- .../x/sys/unix/zerrors_linux_ppc64.go | 849 -- .../x/sys/unix/zerrors_linux_ppc64le.go | 849 -- .../x/sys/unix/zerrors_linux_riscv64.go | 773 -- .../x/sys/unix/zerrors_linux_s390x.go | 846 -- .../x/sys/unix/zerrors_linux_sparc64.go | 843 -- .../x/sys/unix/zerrors_netbsd_386.go | 1773 ---- .../x/sys/unix/zerrors_netbsd_amd64.go | 1763 ---- .../x/sys/unix/zerrors_netbsd_arm.go | 1752 ---- .../x/sys/unix/zerrors_netbsd_arm64.go | 1763 ---- .../x/sys/unix/zerrors_openbsd_386.go | 1657 --- .../x/sys/unix/zerrors_openbsd_amd64.go | 1767 ---- .../x/sys/unix/zerrors_openbsd_arm.go | 1659 --- .../x/sys/unix/zerrors_openbsd_arm64.go | 1790 ---- .../x/sys/unix/zerrors_solaris_amd64.go | 1533 --- .../x/sys/unix/zptrace_armnn_linux.go | 41 - .../x/sys/unix/zptrace_linux_arm64.go | 17 - .../x/sys/unix/zptrace_mipsnn_linux.go | 50 - .../x/sys/unix/zptrace_mipsnnle_linux.go | 50 - .../x/sys/unix/zptrace_x86_linux.go | 80 - .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1484 --- .../x/sys/unix/zsyscall_aix_ppc64.go | 1442 --- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1192 --- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1070 -- .../x/sys/unix/zsyscall_darwin_386.1_11.go | 1809 ---- .../x/sys/unix/zsyscall_darwin_386.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_386.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_386.go | 2497 ----- .../x/sys/unix/zsyscall_darwin_386.s | 284 - .../x/sys/unix/zsyscall_darwin_amd64.1_11.go | 1809 ---- .../x/sys/unix/zsyscall_darwin_amd64.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_amd64.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_amd64.go | 2497 ----- .../x/sys/unix/zsyscall_darwin_amd64.s | 284 - .../x/sys/unix/zsyscall_darwin_arm.1_11.go | 1782 ---- .../x/sys/unix/zsyscall_darwin_arm.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_arm.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_arm.go | 2482 ----- .../x/sys/unix/zsyscall_darwin_arm.s | 282 - .../x/sys/unix/zsyscall_darwin_arm64.1_11.go | 1782 ---- .../x/sys/unix/zsyscall_darwin_arm64.1_13.go | 41 - .../x/sys/unix/zsyscall_darwin_arm64.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_arm64.go | 2482 ----- .../x/sys/unix/zsyscall_darwin_arm64.s | 282 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1666 --- .../x/sys/unix/zsyscall_freebsd_386.go | 2015 ---- .../x/sys/unix/zsyscall_freebsd_amd64.go | 2015 ---- .../x/sys/unix/zsyscall_freebsd_arm.go | 2015 ---- .../x/sys/unix/zsyscall_freebsd_arm64.go | 2015 ---- .../x/sys/unix/zsyscall_illumos_amd64.go | 87 - .../golang.org/x/sys/unix/zsyscall_linux.go | 1856 ---- .../x/sys/unix/zsyscall_linux_386.go | 578 -- .../x/sys/unix/zsyscall_linux_amd64.go | 745 -- .../x/sys/unix/zsyscall_linux_arm.go | 715 -- .../x/sys/unix/zsyscall_linux_arm64.go | 602 -- .../x/sys/unix/zsyscall_linux_mips.go | 758 -- .../x/sys/unix/zsyscall_linux_mips64.go | 729 -- .../x/sys/unix/zsyscall_linux_mips64le.go | 729 -- .../x/sys/unix/zsyscall_linux_mipsle.go | 758 -- .../x/sys/unix/zsyscall_linux_ppc64.go | 807 -- .../x/sys/unix/zsyscall_linux_ppc64le.go | 807 -- .../x/sys/unix/zsyscall_linux_riscv64.go | 582 -- .../x/sys/unix/zsyscall_linux_s390x.go | 577 -- .../x/sys/unix/zsyscall_linux_sparc64.go | 740 -- .../x/sys/unix/zsyscall_netbsd_386.go | 1851 ---- .../x/sys/unix/zsyscall_netbsd_amd64.go | 1851 ---- .../x/sys/unix/zsyscall_netbsd_arm.go | 1851 ---- .../x/sys/unix/zsyscall_netbsd_arm64.go | 1851 ---- .../x/sys/unix/zsyscall_openbsd_386.go | 1692 ---- .../x/sys/unix/zsyscall_openbsd_amd64.go | 1692 ---- .../x/sys/unix/zsyscall_openbsd_arm.go | 1692 ---- .../x/sys/unix/zsyscall_openbsd_arm64.go | 1692 ---- .../x/sys/unix/zsyscall_solaris_amd64.go | 1954 ---- .../x/sys/unix/zsysctl_openbsd_386.go | 272 - .../x/sys/unix/zsysctl_openbsd_amd64.go | 270 - .../x/sys/unix/zsysctl_openbsd_arm.go | 272 - .../x/sys/unix/zsysctl_openbsd_arm64.go | 275 - .../x/sys/unix/zsysnum_darwin_386.go | 436 - .../x/sys/unix/zsysnum_darwin_amd64.go | 438 - .../x/sys/unix/zsysnum_darwin_arm.go | 436 - .../x/sys/unix/zsysnum_darwin_arm64.go | 436 - .../x/sys/unix/zsysnum_dragonfly_amd64.go | 315 - .../x/sys/unix/zsysnum_freebsd_386.go | 396 - .../x/sys/unix/zsysnum_freebsd_amd64.go | 396 - .../x/sys/unix/zsysnum_freebsd_arm.go | 396 - .../x/sys/unix/zsysnum_freebsd_arm64.go | 396 - .../x/sys/unix/zsysnum_linux_386.go | 436 - .../x/sys/unix/zsysnum_linux_amd64.go | 358 - .../x/sys/unix/zsysnum_linux_arm.go | 400 - .../x/sys/unix/zsysnum_linux_arm64.go | 303 - .../x/sys/unix/zsysnum_linux_mips.go | 421 - .../x/sys/unix/zsysnum_linux_mips64.go | 351 - .../x/sys/unix/zsysnum_linux_mips64le.go | 351 - .../x/sys/unix/zsysnum_linux_mipsle.go | 421 - .../x/sys/unix/zsysnum_linux_ppc64.go | 400 - .../x/sys/unix/zsysnum_linux_ppc64le.go | 400 - .../x/sys/unix/zsysnum_linux_riscv64.go | 302 - .../x/sys/unix/zsysnum_linux_s390x.go | 365 - .../x/sys/unix/zsysnum_linux_sparc64.go | 379 - .../x/sys/unix/zsysnum_netbsd_386.go | 274 - .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 - .../x/sys/unix/zsysnum_netbsd_arm.go | 274 - .../x/sys/unix/zsysnum_netbsd_arm64.go | 274 - .../x/sys/unix/zsysnum_openbsd_386.go | 218 - .../x/sys/unix/zsysnum_openbsd_amd64.go | 218 - .../x/sys/unix/zsysnum_openbsd_arm.go | 218 - .../x/sys/unix/zsysnum_openbsd_arm64.go | 217 - .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 352 - .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 356 - .../x/sys/unix/ztypes_darwin_386.go | 499 - .../x/sys/unix/ztypes_darwin_amd64.go | 509 - .../x/sys/unix/ztypes_darwin_arm.go | 500 - .../x/sys/unix/ztypes_darwin_arm64.go | 509 - .../x/sys/unix/ztypes_dragonfly_amd64.go | 479 - .../x/sys/unix/ztypes_freebsd_386.go | 709 -- .../x/sys/unix/ztypes_freebsd_amd64.go | 712 -- .../x/sys/unix/ztypes_freebsd_arm.go | 693 -- .../x/sys/unix/ztypes_freebsd_arm64.go | 690 -- vendor/golang.org/x/sys/unix/ztypes_linux.go | 2345 ----- .../golang.org/x/sys/unix/ztypes_linux_386.go | 599 -- .../x/sys/unix/ztypes_linux_amd64.go | 614 -- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 591 -- .../x/sys/unix/ztypes_linux_arm64.go | 593 -- .../x/sys/unix/ztypes_linux_mips.go | 597 -- .../x/sys/unix/ztypes_linux_mips64.go | 596 -- .../x/sys/unix/ztypes_linux_mips64le.go | 596 -- .../x/sys/unix/ztypes_linux_mipsle.go | 597 -- .../x/sys/unix/ztypes_linux_ppc64.go | 603 -- .../x/sys/unix/ztypes_linux_ppc64le.go | 603 -- .../x/sys/unix/ztypes_linux_riscv64.go | 621 -- .../x/sys/unix/ztypes_linux_s390x.go | 617 -- .../x/sys/unix/ztypes_linux_sparc64.go | 598 -- .../x/sys/unix/ztypes_netbsd_386.go | 498 - .../x/sys/unix/ztypes_netbsd_amd64.go | 506 - .../x/sys/unix/ztypes_netbsd_arm.go | 503 - .../x/sys/unix/ztypes_netbsd_arm64.go | 506 - .../x/sys/unix/ztypes_openbsd_386.go | 571 -- .../x/sys/unix/ztypes_openbsd_amd64.go | 571 -- .../x/sys/unix/ztypes_openbsd_arm.go | 572 -- .../x/sys/unix/ztypes_openbsd_arm64.go | 565 -- .../x/sys/unix/ztypes_solaris_amd64.go | 449 - vendor/golang.org/x/sys/windows/aliases.go | 13 - .../golang.org/x/sys/windows/dll_windows.go | 415 - vendor/golang.org/x/sys/windows/empty.s | 8 - .../golang.org/x/sys/windows/env_windows.go | 61 - vendor/golang.org/x/sys/windows/eventlog.go | 20 - .../golang.org/x/sys/windows/exec_windows.go | 97 - .../x/sys/windows/memory_windows.go | 26 - vendor/golang.org/x/sys/windows/mkerrors.bash | 63 - .../x/sys/windows/mkknownfolderids.bash | 27 - vendor/golang.org/x/sys/windows/mksyscall.go | 9 - vendor/golang.org/x/sys/windows/race.go | 30 - vendor/golang.org/x/sys/windows/race0.go | 25 - .../x/sys/windows/security_windows.go | 1396 --- vendor/golang.org/x/sys/windows/service.go | 229 - vendor/golang.org/x/sys/windows/str.go | 22 - vendor/golang.org/x/sys/windows/syscall.go | 74 - .../x/sys/windows/syscall_windows.go | 1454 --- .../golang.org/x/sys/windows/types_windows.go | 1786 ---- .../x/sys/windows/types_windows_386.go | 22 - .../x/sys/windows/types_windows_amd64.go | 22 - .../x/sys/windows/types_windows_arm.go | 22 - .../x/sys/windows/zerrors_windows.go | 6853 ------------- .../x/sys/windows/zknownfolderids_windows.go | 149 - .../x/sys/windows/zsyscall_windows.go | 4051 -------- vendor/golang.org/x/text/AUTHORS | 3 - vendor/golang.org/x/text/CONTRIBUTORS | 3 - vendor/golang.org/x/text/LICENSE | 27 - vendor/golang.org/x/text/PATENTS | 22 - vendor/golang.org/x/text/cases/cases.go | 162 - vendor/golang.org/x/text/cases/context.go | 376 - vendor/golang.org/x/text/cases/fold.go | 34 - vendor/golang.org/x/text/cases/icu.go | 61 - vendor/golang.org/x/text/cases/info.go | 82 - vendor/golang.org/x/text/cases/map.go | 816 -- .../golang.org/x/text/cases/tables10.0.0.go | 2255 ----- .../golang.org/x/text/cases/tables11.0.0.go | 2316 ----- vendor/golang.org/x/text/cases/tables9.0.0.go | 2215 ---- vendor/golang.org/x/text/cases/trieval.go | 214 - vendor/golang.org/x/text/internal/internal.go | 49 - .../x/text/internal/language/common.go | 16 - .../x/text/internal/language/compact.go | 29 - .../text/internal/language/compact/compact.go | 61 - .../internal/language/compact/language.go | 260 - .../text/internal/language/compact/parents.go | 120 - .../text/internal/language/compact/tables.go | 1015 -- .../x/text/internal/language/compact/tags.go | 91 - .../x/text/internal/language/compose.go | 167 - .../x/text/internal/language/coverage.go | 28 - .../x/text/internal/language/language.go | 596 -- .../x/text/internal/language/lookup.go | 412 - .../x/text/internal/language/match.go | 226 - .../x/text/internal/language/parse.go | 594 -- .../x/text/internal/language/tables.go | 3431 ------- .../x/text/internal/language/tags.go | 48 - vendor/golang.org/x/text/internal/match.go | 67 - vendor/golang.org/x/text/internal/tag/tag.go | 100 - vendor/golang.org/x/text/language/coverage.go | 187 - vendor/golang.org/x/text/language/doc.go | 102 - vendor/golang.org/x/text/language/go1_1.go | 38 - vendor/golang.org/x/text/language/go1_2.go | 11 - vendor/golang.org/x/text/language/language.go | 601 -- vendor/golang.org/x/text/language/match.go | 735 -- vendor/golang.org/x/text/language/parse.go | 228 - vendor/golang.org/x/text/language/tables.go | 298 - vendor/golang.org/x/text/language/tags.go | 145 - vendor/golang.org/x/text/runes/cond.go | 187 - vendor/golang.org/x/text/runes/runes.go | 355 - .../x/text/secure/bidirule/bidirule.go | 336 - .../x/text/secure/bidirule/bidirule10.0.0.go | 11 - .../x/text/secure/bidirule/bidirule9.0.0.go | 14 - .../golang.org/x/text/secure/precis/class.go | 36 - .../x/text/secure/precis/context.go | 139 - vendor/golang.org/x/text/secure/precis/doc.go | 14 - .../x/text/secure/precis/nickname.go | 72 - .../x/text/secure/precis/options.go | 157 - .../x/text/secure/precis/profile.go | 412 - .../x/text/secure/precis/profiles.go | 78 - .../x/text/secure/precis/tables10.0.0.go | 3889 ------- .../x/text/secure/precis/tables11.0.0.go | 4016 -------- .../x/text/secure/precis/tables9.0.0.go | 3790 ------- .../x/text/secure/precis/transformer.go | 32 - .../x/text/secure/precis/trieval.go | 64 - .../golang.org/x/text/transform/transform.go | 705 -- vendor/golang.org/x/text/unicode/bidi/bidi.go | 198 - .../golang.org/x/text/unicode/bidi/bracket.go | 335 - vendor/golang.org/x/text/unicode/bidi/core.go | 1058 -- vendor/golang.org/x/text/unicode/bidi/prop.go | 206 - .../x/text/unicode/bidi/tables10.0.0.go | 1815 ---- .../x/text/unicode/bidi/tables11.0.0.go | 1887 ---- .../x/text/unicode/bidi/tables9.0.0.go | 1781 ---- .../golang.org/x/text/unicode/bidi/trieval.go | 60 - .../x/text/unicode/norm/composition.go | 512 - .../x/text/unicode/norm/forminfo.go | 278 - .../golang.org/x/text/unicode/norm/input.go | 109 - vendor/golang.org/x/text/unicode/norm/iter.go | 458 - .../x/text/unicode/norm/normalize.go | 609 -- .../x/text/unicode/norm/readwriter.go | 125 - .../x/text/unicode/norm/tables10.0.0.go | 7657 -------------- .../x/text/unicode/norm/tables11.0.0.go | 7693 -------------- .../x/text/unicode/norm/tables9.0.0.go | 7637 -------------- .../x/text/unicode/norm/transform.go | 88 - vendor/golang.org/x/text/unicode/norm/trie.go | 54 - vendor/golang.org/x/text/width/kind_string.go | 28 - .../golang.org/x/text/width/tables10.0.0.go | 1318 --- .../golang.org/x/text/width/tables11.0.0.go | 1330 --- vendor/golang.org/x/text/width/tables9.0.0.go | 1286 --- vendor/golang.org/x/text/width/transform.go | 239 - vendor/golang.org/x/text/width/trieval.go | 30 - vendor/golang.org/x/text/width/width.go | 206 - vendor/golang.org/x/xerrors/LICENSE | 27 - vendor/golang.org/x/xerrors/PATENTS | 22 - vendor/golang.org/x/xerrors/README | 2 - vendor/golang.org/x/xerrors/adaptor.go | 193 - vendor/golang.org/x/xerrors/codereview.cfg | 1 - vendor/golang.org/x/xerrors/doc.go | 22 - vendor/golang.org/x/xerrors/errors.go | 33 - vendor/golang.org/x/xerrors/fmt.go | 187 - vendor/golang.org/x/xerrors/format.go | 34 - vendor/golang.org/x/xerrors/frame.go | 56 - vendor/golang.org/x/xerrors/go.mod | 3 - .../golang.org/x/xerrors/internal/internal.go | 8 - vendor/golang.org/x/xerrors/wrap.go | 106 - vendor/google.golang.org/genproto/LICENSE | 202 - .../googleapis/rpc/status/status.pb.go | 117 - vendor/google.golang.org/grpc/.travis.yml | 42 - vendor/google.golang.org/grpc/AUTHORS | 1 - .../google.golang.org/grpc/CODE-OF-CONDUCT.md | 3 - vendor/google.golang.org/grpc/CONTRIBUTING.md | 62 - vendor/google.golang.org/grpc/GOVERNANCE.md | 1 - vendor/google.golang.org/grpc/LICENSE | 202 - vendor/google.golang.org/grpc/MAINTAINERS.md | 27 - vendor/google.golang.org/grpc/Makefile | 63 - vendor/google.golang.org/grpc/README.md | 141 - .../grpc/attributes/attributes.go | 70 - vendor/google.golang.org/grpc/backoff.go | 58 - .../google.golang.org/grpc/backoff/backoff.go | 52 - vendor/google.golang.org/grpc/balancer.go | 391 - .../grpc/balancer/balancer.go | 454 - .../grpc/balancer/base/balancer.go | 286 - .../grpc/balancer/base/base.go | 93 - .../grpc/balancer/roundrobin/roundrobin.go | 81 - .../grpc/balancer_conn_wrappers.go | 271 - .../grpc/balancer_v1_wrapper.go | 334 - .../grpc_binarylog_v1/binarylog.pb.go | 900 -- vendor/google.golang.org/grpc/call.go | 74 - vendor/google.golang.org/grpc/clientconn.go | 1534 --- vendor/google.golang.org/grpc/codec.go | 50 - vendor/google.golang.org/grpc/codegen.sh | 17 - .../grpc/codes/code_string.go | 62 - vendor/google.golang.org/grpc/codes/codes.go | 198 - .../grpc/connectivity/connectivity.go | 73 - .../grpc/credentials/credentials.go | 255 - .../grpc/credentials/go12.go | 30 - .../grpc/credentials/internal/syscallconn.go | 61 - .../internal/syscallconn_appengine.go | 30 - .../google.golang.org/grpc/credentials/tls.go | 235 - vendor/google.golang.org/grpc/dialoptions.go | 606 -- vendor/google.golang.org/grpc/doc.go | 24 - .../grpc/encoding/encoding.go | 122 - .../grpc/encoding/proto/proto.go | 110 - vendor/google.golang.org/grpc/go.mod | 16 - vendor/google.golang.org/grpc/go.sum | 64 - .../google.golang.org/grpc/grpclog/grpclog.go | 132 - .../google.golang.org/grpc/grpclog/logger.go | 87 - .../grpc/grpclog/loggerv2.go | 214 - vendor/google.golang.org/grpc/install_gae.sh | 6 - vendor/google.golang.org/grpc/interceptor.go | 77 - .../grpc/internal/backoff/backoff.go | 73 - .../grpc/internal/balancerload/load.go | 46 - .../grpc/internal/binarylog/binarylog.go | 167 - .../internal/binarylog/binarylog_testutil.go | 42 - .../grpc/internal/binarylog/env_config.go | 210 - .../grpc/internal/binarylog/method_logger.go | 423 - .../grpc/internal/binarylog/regenerate.sh | 33 - .../grpc/internal/binarylog/sink.go | 162 - .../grpc/internal/binarylog/util.go | 41 - .../grpc/internal/buffer/unbounded.go | 85 - .../grpc/internal/channelz/funcs.go | 739 -- .../grpc/internal/channelz/logging.go | 100 - .../grpc/internal/channelz/types.go | 702 -- .../grpc/internal/channelz/types_linux.go | 53 - .../grpc/internal/channelz/types_nonlinux.go | 44 - .../grpc/internal/channelz/util_linux.go | 39 - .../grpc/internal/channelz/util_nonlinux.go | 26 - .../grpc/internal/envconfig/envconfig.go | 38 - .../grpc/internal/grpclog/grpclog.go | 118 - .../grpc/internal/grpclog/prefixLogger.go | 63 - .../grpc/internal/grpcrand/grpcrand.go | 56 - .../grpc/internal/grpcsync/event.go | 61 - .../grpc/internal/grpcutil/target.go | 55 - .../grpc/internal/internal.go | 67 - .../internal/resolver/dns/dns_resolver.go | 441 - .../grpc/internal/resolver/dns/go113.go | 33 - .../resolver/passthrough/passthrough.go | 57 - .../grpc/internal/status/status.go | 161 - .../grpc/internal/syscall/syscall_linux.go | 114 - .../grpc/internal/syscall/syscall_nonlinux.go | 73 - .../grpc/internal/transport/bdp_estimator.go | 141 - .../grpc/internal/transport/controlbuf.go | 926 -- .../grpc/internal/transport/defaults.go | 49 - .../grpc/internal/transport/flowcontrol.go | 217 - .../grpc/internal/transport/handler_server.go | 462 - .../grpc/internal/transport/http2_client.go | 1462 --- .../grpc/internal/transport/http2_server.go | 1251 --- .../grpc/internal/transport/http_util.go | 677 -- .../grpc/internal/transport/log.go | 44 - .../grpc/internal/transport/transport.go | 808 -- .../grpc/keepalive/keepalive.go | 85 - .../grpc/metadata/metadata.go | 209 - .../grpc/naming/dns_resolver.go | 293 - .../google.golang.org/grpc/naming/naming.go | 68 - vendor/google.golang.org/grpc/peer/peer.go | 51 - .../google.golang.org/grpc/picker_wrapper.go | 229 - vendor/google.golang.org/grpc/pickfirst.go | 159 - vendor/google.golang.org/grpc/preloader.go | 64 - vendor/google.golang.org/grpc/proxy.go | 152 - .../grpc/resolver/resolver.go | 253 - .../grpc/resolver_conn_wrapper.go | 222 - vendor/google.golang.org/grpc/rpc_util.go | 889 -- vendor/google.golang.org/grpc/server.go | 1640 --- .../google.golang.org/grpc/service_config.go | 434 - .../grpc/serviceconfig/serviceconfig.go | 41 - .../google.golang.org/grpc/stats/handlers.go | 63 - vendor/google.golang.org/grpc/stats/stats.go | 314 - .../google.golang.org/grpc/status/status.go | 127 - vendor/google.golang.org/grpc/stream.go | 1528 --- vendor/google.golang.org/grpc/tap/tap.go | 51 - vendor/google.golang.org/grpc/trace.go | 123 - vendor/google.golang.org/grpc/version.go | 22 - vendor/google.golang.org/grpc/vet.sh | 163 - vendor/google.golang.org/protobuf/AUTHORS | 3 - .../google.golang.org/protobuf/CONTRIBUTORS | 3 - vendor/google.golang.org/protobuf/LICENSE | 27 - vendor/google.golang.org/protobuf/PATENTS | 22 - .../protobuf/encoding/prototext/decode.go | 788 -- .../protobuf/encoding/prototext/doc.go | 7 - .../protobuf/encoding/prototext/encode.go | 416 - .../protobuf/encoding/protowire/wire.go | 538 - .../protobuf/internal/descfmt/stringer.go | 316 - .../protobuf/internal/descopts/options.go | 29 - .../protobuf/internal/detrand/rand.go | 61 - .../internal/encoding/defval/default.go | 213 - .../encoding/messageset/messageset.go | 258 - .../protobuf/internal/encoding/tag/tag.go | 207 - .../protobuf/internal/encoding/text/decode.go | 665 -- .../internal/encoding/text/decode_number.go | 190 - .../internal/encoding/text/decode_string.go | 161 - .../internal/encoding/text/decode_token.go | 373 - .../protobuf/internal/encoding/text/doc.go | 29 - .../protobuf/internal/encoding/text/encode.go | 267 - .../protobuf/internal/errors/errors.go | 89 - .../protobuf/internal/errors/is_go112.go | 39 - .../protobuf/internal/errors/is_go113.go | 12 - .../protobuf/internal/fieldnum/any_gen.go | 13 - .../protobuf/internal/fieldnum/api_gen.go | 35 - .../internal/fieldnum/descriptor_gen.go | 240 - .../protobuf/internal/fieldnum/doc.go | 7 - .../internal/fieldnum/duration_gen.go | 13 - .../protobuf/internal/fieldnum/empty_gen.go | 10 - .../internal/fieldnum/field_mask_gen.go | 12 - .../internal/fieldnum/source_context_gen.go | 12 - .../protobuf/internal/fieldnum/struct_gen.go | 33 - .../internal/fieldnum/timestamp_gen.go | 13 - .../protobuf/internal/fieldnum/type_gen.go | 53 - .../internal/fieldnum/wrappers_gen.go | 52 - .../protobuf/internal/fieldsort/fieldsort.go | 40 - .../protobuf/internal/filedesc/build.go | 155 - .../protobuf/internal/filedesc/desc.go | 613 -- .../protobuf/internal/filedesc/desc_init.go | 471 - .../protobuf/internal/filedesc/desc_lazy.go | 704 -- .../protobuf/internal/filedesc/desc_list.go | 286 - .../internal/filedesc/desc_list_gen.go | 345 - .../protobuf/internal/filedesc/placeholder.go | 107 - .../protobuf/internal/filetype/build.go | 297 - .../protobuf/internal/flags/flags.go | 24 - .../internal/flags/proto_legacy_disable.go | 9 - .../internal/flags/proto_legacy_enable.go | 9 - .../protobuf/internal/genname/name.go | 25 - .../protobuf/internal/impl/api_export.go | 170 - .../protobuf/internal/impl/checkinit.go | 141 - .../protobuf/internal/impl/codec_extension.go | 223 - .../protobuf/internal/impl/codec_field.go | 828 -- .../protobuf/internal/impl/codec_gen.go | 5637 ----------- .../protobuf/internal/impl/codec_map.go | 388 - .../protobuf/internal/impl/codec_map_go111.go | 37 - .../protobuf/internal/impl/codec_map_go112.go | 11 - .../protobuf/internal/impl/codec_message.go | 170 - .../internal/impl/codec_messageset.go | 120 - .../protobuf/internal/impl/codec_reflect.go | 209 - .../protobuf/internal/impl/codec_tables.go | 557 - .../protobuf/internal/impl/codec_unsafe.go | 17 - .../protobuf/internal/impl/convert.go | 467 - .../protobuf/internal/impl/convert_list.go | 141 - .../protobuf/internal/impl/convert_map.go | 121 - .../protobuf/internal/impl/decode.go | 274 - .../protobuf/internal/impl/encode.go | 199 - .../protobuf/internal/impl/enum.go | 21 - .../protobuf/internal/impl/extension.go | 156 - .../protobuf/internal/impl/legacy_enum.go | 219 - .../protobuf/internal/impl/legacy_export.go | 92 - .../internal/impl/legacy_extension.go | 175 - .../protobuf/internal/impl/legacy_file.go | 81 - .../protobuf/internal/impl/legacy_message.go | 502 - .../protobuf/internal/impl/merge.go | 176 - .../protobuf/internal/impl/merge_gen.go | 209 - .../protobuf/internal/impl/message.go | 215 - .../protobuf/internal/impl/message_reflect.go | 361 - .../internal/impl/message_reflect_field.go | 463 - .../internal/impl/message_reflect_gen.go | 249 - .../protobuf/internal/impl/pointer_reflect.go | 177 - .../protobuf/internal/impl/pointer_unsafe.go | 169 - .../protobuf/internal/impl/validate.go | 575 -- .../protobuf/internal/impl/weak.go | 74 - .../protobuf/internal/mapsort/mapsort.go | 43 - .../protobuf/internal/pragma/pragma.go | 29 - .../protobuf/internal/set/ints.go | 58 - .../protobuf/internal/strs/strings.go | 196 - .../protobuf/internal/strs/strings_pure.go | 27 - .../protobuf/internal/strs/strings_unsafe.go | 94 - .../protobuf/internal/version/version.go | 79 - .../protobuf/proto/checkinit.go | 71 - .../protobuf/proto/decode.go | 270 - .../protobuf/proto/decode_gen.go | 603 -- .../google.golang.org/protobuf/proto/doc.go | 94 - .../protobuf/proto/encode.go | 343 - .../protobuf/proto/encode_gen.go | 97 - .../google.golang.org/protobuf/proto/equal.go | 154 - .../protobuf/proto/extension.go | 92 - .../google.golang.org/protobuf/proto/merge.go | 134 - .../protobuf/proto/messageset.go | 88 - .../google.golang.org/protobuf/proto/proto.go | 34 - .../protobuf/proto/proto_methods.go | 19 - .../protobuf/proto/proto_reflect.go | 19 - .../google.golang.org/protobuf/proto/reset.go | 39 - .../google.golang.org/protobuf/proto/size.go | 94 - .../protobuf/proto/size_gen.go | 55 - .../protobuf/proto/wrappers.go | 29 - .../protobuf/reflect/protoreflect/methods.go | 77 - .../protobuf/reflect/protoreflect/proto.go | 478 - .../protobuf/reflect/protoreflect/source.go | 52 - .../protobuf/reflect/protoreflect/type.go | 631 -- .../protobuf/reflect/protoreflect/value.go | 285 - .../reflect/protoreflect/value_pure.go | 59 - .../reflect/protoreflect/value_union.go | 367 - .../reflect/protoreflect/value_unsafe.go | 98 - .../reflect/protoregistry/registry.go | 768 -- .../protobuf/runtime/protoiface/legacy.go | 15 - .../protobuf/runtime/protoiface/methods.go | 167 - .../protobuf/runtime/protoimpl/impl.go | 44 - .../protobuf/runtime/protoimpl/version.go | 56 - .../protobuf/types/known/anypb/any.pb.go | 287 - .../types/known/durationpb/duration.pb.go | 249 - .../types/known/timestamppb/timestamp.pb.go | 271 - vendor/gopkg.in/src-d/go-billy.v4/.gitignore | 4 - vendor/gopkg.in/src-d/go-billy.v4/.travis.yml | 17 - vendor/gopkg.in/src-d/go-billy.v4/DCO | 25 - vendor/gopkg.in/src-d/go-billy.v4/LICENSE | 201 - vendor/gopkg.in/src-d/go-billy.v4/MAINTAINERS | 1 - vendor/gopkg.in/src-d/go-billy.v4/Makefile | 25 - vendor/gopkg.in/src-d/go-billy.v4/README.md | 72 - .../gopkg.in/src-d/go-billy.v4/appveyor.yml | 15 - vendor/gopkg.in/src-d/go-billy.v4/fs.go | 202 - vendor/gopkg.in/src-d/go-billy.v4/go.mod | 8 - vendor/gopkg.in/src-d/go-billy.v4/go.sum | 12 - .../src-d/go-billy.v4/helper/chroot/chroot.go | 242 - .../go-billy.v4/helper/polyfill/polyfill.go | 105 - vendor/gopkg.in/src-d/go-billy.v4/osfs/os.go | 139 - .../src-d/go-billy.v4/osfs/os_posix.go | 21 - .../src-d/go-billy.v4/osfs/os_windows.go | 57 - .../gopkg.in/src-d/go-billy.v4/util/glob.go | 111 - .../gopkg.in/src-d/go-billy.v4/util/util.go | 224 - vendor/gopkg.in/src-d/go-git.v4/.gitignore | 4 - vendor/gopkg.in/src-d/go-git.v4/.travis.yml | 37 - .../src-d/go-git.v4/CODE_OF_CONDUCT.md | 74 - .../gopkg.in/src-d/go-git.v4/COMPATIBILITY.md | 111 - .../gopkg.in/src-d/go-git.v4/CONTRIBUTING.md | 59 - vendor/gopkg.in/src-d/go-git.v4/DCO | 36 - vendor/gopkg.in/src-d/go-git.v4/LICENSE | 201 - vendor/gopkg.in/src-d/go-git.v4/MAINTAINERS | 3 - vendor/gopkg.in/src-d/go-git.v4/Makefile | 52 - vendor/gopkg.in/src-d/go-git.v4/README.md | 123 - vendor/gopkg.in/src-d/go-git.v4/appveyor.yml | 21 - vendor/gopkg.in/src-d/go-git.v4/blame.go | 302 - vendor/gopkg.in/src-d/go-git.v4/common.go | 22 - .../gopkg.in/src-d/go-git.v4/config/branch.go | 90 - .../gopkg.in/src-d/go-git.v4/config/config.go | 407 - .../src-d/go-git.v4/config/modules.go | 139 - .../src-d/go-git.v4/config/refspec.go | 150 - vendor/gopkg.in/src-d/go-git.v4/doc.go | 10 - vendor/gopkg.in/src-d/go-git.v4/go.mod | 29 - vendor/gopkg.in/src-d/go-git.v4/go.sum | 92 - .../go-git.v4/internal/revision/parser.go | 622 -- .../go-git.v4/internal/revision/scanner.go | 117 - .../go-git.v4/internal/revision/token.go | 28 - .../src-d/go-git.v4/internal/url/url.go | 37 - .../gopkg.in/src-d/go-git.v4/object_walker.go | 104 - vendor/gopkg.in/src-d/go-git.v4/options.go | 492 - .../go-git.v4/plumbing/cache/buffer_lru.go | 98 - .../src-d/go-git.v4/plumbing/cache/common.go | 39 - .../go-git.v4/plumbing/cache/object_lru.go | 101 - .../src-d/go-git.v4/plumbing/error.go | 35 - .../go-git.v4/plumbing/filemode/filemode.go | 188 - .../plumbing/format/config/common.go | 99 - .../plumbing/format/config/decoder.go | 37 - .../go-git.v4/plumbing/format/config/doc.go | 122 - .../plumbing/format/config/encoder.go | 77 - .../plumbing/format/config/option.go | 117 - .../plumbing/format/config/section.go | 146 - .../go-git.v4/plumbing/format/diff/patch.go | 58 - .../plumbing/format/diff/unified_encoder.go | 360 - .../plumbing/format/gitignore/dir.go | 136 - .../plumbing/format/gitignore/doc.go | 70 - .../plumbing/format/gitignore/matcher.go | 30 - .../plumbing/format/gitignore/pattern.go | 153 - .../plumbing/format/idxfile/decoder.go | 177 - .../go-git.v4/plumbing/format/idxfile/doc.go | 128 - .../plumbing/format/idxfile/encoder.go | 142 - .../plumbing/format/idxfile/idxfile.go | 346 - .../plumbing/format/idxfile/writer.go | 186 - .../plumbing/format/index/decoder.go | 477 - .../go-git.v4/plumbing/format/index/doc.go | 360 - .../plumbing/format/index/encoder.go | 150 - .../go-git.v4/plumbing/format/index/index.go | 213 - .../go-git.v4/plumbing/format/index/match.go | 186 - .../go-git.v4/plumbing/format/objfile/doc.go | 2 - .../plumbing/format/objfile/reader.go | 114 - .../plumbing/format/objfile/writer.go | 109 - .../plumbing/format/packfile/common.go | 78 - .../plumbing/format/packfile/delta_index.go | 297 - .../format/packfile/delta_selector.go | 369 - .../plumbing/format/packfile/diff_delta.go | 200 - .../go-git.v4/plumbing/format/packfile/doc.go | 39 - .../plumbing/format/packfile/encoder.go | 219 - .../plumbing/format/packfile/error.go | 30 - .../plumbing/format/packfile/fsobject.go | 116 - .../plumbing/format/packfile/object_pack.go | 164 - .../plumbing/format/packfile/packfile.go | 562 -- .../plumbing/format/packfile/parser.go | 483 - .../plumbing/format/packfile/patch_delta.go | 229 - .../plumbing/format/packfile/scanner.go | 466 - .../plumbing/format/pktline/encoder.go | 122 - .../plumbing/format/pktline/scanner.go | 134 - .../gopkg.in/src-d/go-git.v4/plumbing/hash.go | 73 - .../src-d/go-git.v4/plumbing/memory.go | 61 - .../src-d/go-git.v4/plumbing/object.go | 111 - .../src-d/go-git.v4/plumbing/object/blob.go | 144 - .../src-d/go-git.v4/plumbing/object/change.go | 157 - .../plumbing/object/change_adaptor.go | 61 - .../src-d/go-git.v4/plumbing/object/commit.go | 430 - .../plumbing/object/commit_walker.go | 327 - .../plumbing/object/commit_walker_bfs.go | 100 - .../object/commit_walker_bfs_filtered.go | 176 - .../plumbing/object/commit_walker_ctime.go | 103 - .../plumbing/object/commit_walker_file.go | 145 - .../src-d/go-git.v4/plumbing/object/common.go | 12 - .../go-git.v4/plumbing/object/difftree.go | 37 - .../src-d/go-git.v4/plumbing/object/file.go | 137 - .../go-git.v4/plumbing/object/merge_base.go | 210 - .../src-d/go-git.v4/plumbing/object/object.go | 237 - .../src-d/go-git.v4/plumbing/object/patch.go | 346 - .../src-d/go-git.v4/plumbing/object/tag.go | 357 - .../src-d/go-git.v4/plumbing/object/tree.go | 520 - .../go-git.v4/plumbing/object/treenoder.go | 136 - .../plumbing/protocol/packp/advrefs.go | 203 - .../plumbing/protocol/packp/advrefs_decode.go | 288 - .../plumbing/protocol/packp/advrefs_encode.go | 176 - .../protocol/packp/capability/capability.go | 252 - .../protocol/packp/capability/list.go | 196 - .../plumbing/protocol/packp/common.go | 70 - .../go-git.v4/plumbing/protocol/packp/doc.go | 724 -- .../plumbing/protocol/packp/report_status.go | 165 - .../plumbing/protocol/packp/shallowupd.go | 92 - .../protocol/packp/sideband/common.go | 33 - .../plumbing/protocol/packp/sideband/demux.go | 148 - .../plumbing/protocol/packp/sideband/doc.go | 31 - .../plumbing/protocol/packp/sideband/muxer.go | 65 - .../plumbing/protocol/packp/srvresp.go | 127 - .../plumbing/protocol/packp/ulreq.go | 168 - .../plumbing/protocol/packp/ulreq_decode.go | 257 - .../plumbing/protocol/packp/ulreq_encode.go | 145 - .../plumbing/protocol/packp/updreq.go | 122 - .../plumbing/protocol/packp/updreq_decode.go | 250 - .../plumbing/protocol/packp/updreq_encode.go | 75 - .../plumbing/protocol/packp/uppackreq.go | 98 - .../plumbing/protocol/packp/uppackresp.go | 109 - .../src-d/go-git.v4/plumbing/reference.go | 209 - .../src-d/go-git.v4/plumbing/revision.go | 11 - .../go-git.v4/plumbing/revlist/revlist.go | 230 - .../src-d/go-git.v4/plumbing/storer/doc.go | 2 - .../src-d/go-git.v4/plumbing/storer/index.go | 9 - .../src-d/go-git.v4/plumbing/storer/object.go | 288 - .../go-git.v4/plumbing/storer/reference.go | 240 - .../go-git.v4/plumbing/storer/shallow.go | 10 - .../src-d/go-git.v4/plumbing/storer/storer.go | 15 - .../plumbing/transport/client/client.go | 48 - .../go-git.v4/plumbing/transport/common.go | 274 - .../plumbing/transport/file/client.go | 156 - .../plumbing/transport/file/server.go | 53 - .../plumbing/transport/git/common.go | 109 - .../plumbing/transport/http/common.go | 281 - .../plumbing/transport/http/receive_pack.go | 106 - .../plumbing/transport/http/upload_pack.go | 123 - .../transport/internal/common/common.go | 467 - .../transport/internal/common/server.go | 73 - .../plumbing/transport/server/loader.go | 64 - .../plumbing/transport/server/server.go | 422 - .../plumbing/transport/ssh/auth_method.go | 322 - .../plumbing/transport/ssh/common.go | 228 - vendor/gopkg.in/src-d/go-git.v4/prune.go | 66 - vendor/gopkg.in/src-d/go-git.v4/references.go | 264 - vendor/gopkg.in/src-d/go-git.v4/remote.go | 1114 -- vendor/gopkg.in/src-d/go-git.v4/repository.go | 1545 --- vendor/gopkg.in/src-d/go-git.v4/status.go | 79 - .../go-git.v4/storage/filesystem/config.go | 61 - .../storage/filesystem/deltaobject.go | 37 - .../storage/filesystem/dotgit/dotgit.go | 1099 -- .../dotgit/dotgit_rewrite_packed_refs.go | 81 - .../filesystem/dotgit/dotgit_setref.go | 90 - .../storage/filesystem/dotgit/writers.go | 284 - .../go-git.v4/storage/filesystem/index.go | 54 - .../go-git.v4/storage/filesystem/module.go | 20 - .../go-git.v4/storage/filesystem/object.go | 815 -- .../go-git.v4/storage/filesystem/reference.go | 44 - .../go-git.v4/storage/filesystem/shallow.go | 54 - .../go-git.v4/storage/filesystem/storage.go | 73 - .../src-d/go-git.v4/storage/memory/storage.go | 320 - .../src-d/go-git.v4/storage/storer.go | 30 - vendor/gopkg.in/src-d/go-git.v4/submodule.go | 357 - .../src-d/go-git.v4/utils/binary/read.go | 180 - .../src-d/go-git.v4/utils/binary/write.go | 50 - .../src-d/go-git.v4/utils/diff/diff.go | 61 - .../src-d/go-git.v4/utils/ioutil/common.go | 170 - .../go-git.v4/utils/merkletrie/change.go | 149 - .../go-git.v4/utils/merkletrie/difftree.go | 424 - .../src-d/go-git.v4/utils/merkletrie/doc.go | 34 - .../go-git.v4/utils/merkletrie/doubleiter.go | 187 - .../utils/merkletrie/filesystem/node.go | 196 - .../go-git.v4/utils/merkletrie/index/node.go | 90 - .../utils/merkletrie/internal/frame/frame.go | 91 - .../src-d/go-git.v4/utils/merkletrie/iter.go | 216 - .../go-git.v4/utils/merkletrie/noder/noder.go | 59 - .../go-git.v4/utils/merkletrie/noder/path.go | 90 - vendor/gopkg.in/src-d/go-git.v4/worktree.go | 954 -- .../gopkg.in/src-d/go-git.v4/worktree_bsd.go | 26 - .../src-d/go-git.v4/worktree_commit.go | 228 - .../src-d/go-git.v4/worktree_linux.go | 26 - .../src-d/go-git.v4/worktree_status.go | 660 -- .../src-d/go-git.v4/worktree_unix_other.go | 26 - .../src-d/go-git.v4/worktree_windows.go | 35 - vendor/gopkg.in/warnings.v0/LICENSE | 24 - vendor/gopkg.in/warnings.v0/README | 77 - vendor/gopkg.in/warnings.v0/warnings.go | 194 - vendor/gopkg.in/yaml.v2/.travis.yml | 16 - vendor/gopkg.in/yaml.v2/LICENSE | 201 - vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 31 - vendor/gopkg.in/yaml.v2/NOTICE | 13 - vendor/gopkg.in/yaml.v2/README.md | 133 - vendor/gopkg.in/yaml.v2/apic.go | 739 -- vendor/gopkg.in/yaml.v2/decode.go | 815 -- vendor/gopkg.in/yaml.v2/emitterc.go | 1685 ---- vendor/gopkg.in/yaml.v2/encode.go | 390 - vendor/gopkg.in/yaml.v2/go.mod | 5 - vendor/gopkg.in/yaml.v2/parserc.go | 1095 -- vendor/gopkg.in/yaml.v2/readerc.go | 412 - vendor/gopkg.in/yaml.v2/resolve.go | 258 - vendor/gopkg.in/yaml.v2/scannerc.go | 2711 ----- vendor/gopkg.in/yaml.v2/sorter.go | 113 - vendor/gopkg.in/yaml.v2/writerc.go | 26 - vendor/gopkg.in/yaml.v2/yaml.go | 466 - vendor/gopkg.in/yaml.v2/yamlh.go | 739 -- vendor/gopkg.in/yaml.v2/yamlprivateh.go | 173 - vendor/modules.txt | 451 - 2909 files changed, 700734 deletions(-) delete mode 100644 vendor/github.com/BurntSushi/toml/.gitignore delete mode 100644 vendor/github.com/BurntSushi/toml/.travis.yml delete mode 100644 vendor/github.com/BurntSushi/toml/COMPATIBLE delete mode 100644 vendor/github.com/BurntSushi/toml/COPYING delete mode 100644 vendor/github.com/BurntSushi/toml/Makefile delete mode 100644 vendor/github.com/BurntSushi/toml/README.md delete mode 100644 vendor/github.com/BurntSushi/toml/decode.go delete mode 100644 vendor/github.com/BurntSushi/toml/decode_meta.go delete mode 100644 vendor/github.com/BurntSushi/toml/doc.go delete mode 100644 vendor/github.com/BurntSushi/toml/encode.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types_1.1.go delete mode 100644 vendor/github.com/BurntSushi/toml/lex.go delete mode 100644 vendor/github.com/BurntSushi/toml/parse.go delete mode 100644 vendor/github.com/BurntSushi/toml/session.vim delete mode 100644 vendor/github.com/BurntSushi/toml/type_check.go delete mode 100644 vendor/github.com/BurntSushi/toml/type_fields.go delete mode 100644 vendor/github.com/Microsoft/go-winio/.gitignore delete mode 100644 vendor/github.com/Microsoft/go-winio/LICENSE delete mode 100644 vendor/github.com/Microsoft/go-winio/README.md delete mode 100644 vendor/github.com/Microsoft/go-winio/backup.go delete mode 100644 vendor/github.com/Microsoft/go-winio/ea.go delete mode 100644 vendor/github.com/Microsoft/go-winio/file.go delete mode 100644 vendor/github.com/Microsoft/go-winio/fileinfo.go delete mode 100644 vendor/github.com/Microsoft/go-winio/go.mod delete mode 100644 vendor/github.com/Microsoft/go-winio/go.sum delete mode 100644 vendor/github.com/Microsoft/go-winio/hvsock.go delete mode 100644 vendor/github.com/Microsoft/go-winio/pipe.go delete mode 100644 vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go delete mode 100644 vendor/github.com/Microsoft/go-winio/privilege.go delete mode 100644 vendor/github.com/Microsoft/go-winio/reparse.go delete mode 100644 vendor/github.com/Microsoft/go-winio/sd.go delete mode 100644 vendor/github.com/Microsoft/go-winio/syscall.go delete mode 100644 vendor/github.com/Microsoft/go-winio/zsyscall_windows.go delete mode 100644 vendor/github.com/NYTimes/gziphandler/.gitignore delete mode 100644 vendor/github.com/NYTimes/gziphandler/.travis.yml delete mode 100644 vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md delete mode 100644 vendor/github.com/NYTimes/gziphandler/LICENSE delete mode 100644 vendor/github.com/NYTimes/gziphandler/README.md delete mode 100644 vendor/github.com/NYTimes/gziphandler/go.mod delete mode 100644 vendor/github.com/NYTimes/gziphandler/go.sum delete mode 100644 vendor/github.com/NYTimes/gziphandler/gzip.go delete mode 100644 vendor/github.com/NYTimes/gziphandler/gzip_go18.go delete mode 100644 vendor/github.com/alphadose/gotty/LICENSE delete mode 100644 vendor/github.com/alphadose/gotty/backend/localcommand/doc.go delete mode 100644 vendor/github.com/alphadose/gotty/backend/localcommand/factory.go delete mode 100644 vendor/github.com/alphadose/gotty/backend/localcommand/local_command.go delete mode 100644 vendor/github.com/alphadose/gotty/backend/localcommand/options.go delete mode 100644 vendor/github.com/alphadose/gotty/pkg/homedir/expand.go delete mode 100644 vendor/github.com/alphadose/gotty/pkg/randomstring/generate.go delete mode 100644 vendor/github.com/alphadose/gotty/server/asset.go delete mode 100644 vendor/github.com/alphadose/gotty/server/handler_atomic.go delete mode 100644 vendor/github.com/alphadose/gotty/server/handlers.go delete mode 100644 vendor/github.com/alphadose/gotty/server/init_message.go delete mode 100644 vendor/github.com/alphadose/gotty/server/list_address.go delete mode 100644 vendor/github.com/alphadose/gotty/server/log_response_writer.go delete mode 100644 vendor/github.com/alphadose/gotty/server/middleware.go delete mode 100644 vendor/github.com/alphadose/gotty/server/options.go delete mode 100644 vendor/github.com/alphadose/gotty/server/run_option.go delete mode 100644 vendor/github.com/alphadose/gotty/server/server.go delete mode 100644 vendor/github.com/alphadose/gotty/server/slave.go delete mode 100644 vendor/github.com/alphadose/gotty/server/ws_wrapper.go delete mode 100644 vendor/github.com/alphadose/gotty/utils/default.go delete mode 100644 vendor/github.com/alphadose/gotty/utils/flags.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/doc.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/errors.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/master.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/message_types.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/option.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/slave.go delete mode 100644 vendor/github.com/alphadose/gotty/webtty/webtty.go delete mode 100644 vendor/github.com/anmitsu/go-shlex/.gitignore delete mode 100644 vendor/github.com/anmitsu/go-shlex/LICENSE delete mode 100644 vendor/github.com/anmitsu/go-shlex/README.md delete mode 100644 vendor/github.com/anmitsu/go-shlex/go.mod delete mode 100644 vendor/github.com/anmitsu/go-shlex/go.sum delete mode 100644 vendor/github.com/anmitsu/go-shlex/shlex.go delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/.drone.yml delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/.editorconfig delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/.gitignore delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/.revive.toml delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/LICENSE delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/Makefile delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/README.md delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/go.mod delete mode 100644 vendor/github.com/appleboy/gin-jwt/v2/go.sum delete mode 100644 vendor/github.com/asaskevich/govalidator/.gitignore delete mode 100644 vendor/github.com/asaskevich/govalidator/.travis.yml delete mode 100644 vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md delete mode 100644 vendor/github.com/asaskevich/govalidator/LICENSE delete mode 100644 vendor/github.com/asaskevich/govalidator/README.md delete mode 100644 vendor/github.com/asaskevich/govalidator/arrays.go delete mode 100644 vendor/github.com/asaskevich/govalidator/converter.go delete mode 100644 vendor/github.com/asaskevich/govalidator/doc.go delete mode 100644 vendor/github.com/asaskevich/govalidator/error.go delete mode 100644 vendor/github.com/asaskevich/govalidator/go.mod delete mode 100644 vendor/github.com/asaskevich/govalidator/numerics.go delete mode 100644 vendor/github.com/asaskevich/govalidator/patterns.go delete mode 100644 vendor/github.com/asaskevich/govalidator/types.go delete mode 100644 vendor/github.com/asaskevich/govalidator/utils.go delete mode 100644 vendor/github.com/asaskevich/govalidator/validator.go delete mode 100644 vendor/github.com/asaskevich/govalidator/wercker.yml delete mode 100644 vendor/github.com/cpuguy83/go-md2man/v2/LICENSE.md delete mode 100644 vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go delete mode 100644 vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go delete mode 100644 vendor/github.com/creack/pty/.gitignore delete mode 100644 vendor/github.com/creack/pty/Dockerfile.riscv delete mode 100644 vendor/github.com/creack/pty/LICENSE delete mode 100644 vendor/github.com/creack/pty/README.md delete mode 100644 vendor/github.com/creack/pty/doc.go delete mode 100644 vendor/github.com/creack/pty/go.mod delete mode 100644 vendor/github.com/creack/pty/ioctl.go delete mode 100644 vendor/github.com/creack/pty/ioctl_bsd.go delete mode 100644 vendor/github.com/creack/pty/ioctl_solaris.go delete mode 100644 vendor/github.com/creack/pty/mktypes.bash delete mode 100644 vendor/github.com/creack/pty/pty_darwin.go delete mode 100644 vendor/github.com/creack/pty/pty_dragonfly.go delete mode 100644 vendor/github.com/creack/pty/pty_freebsd.go delete mode 100644 vendor/github.com/creack/pty/pty_linux.go delete mode 100644 vendor/github.com/creack/pty/pty_openbsd.go delete mode 100644 vendor/github.com/creack/pty/pty_solaris.go delete mode 100644 vendor/github.com/creack/pty/pty_unsupported.go delete mode 100644 vendor/github.com/creack/pty/run.go delete mode 100644 vendor/github.com/creack/pty/test_crosscompile.sh delete mode 100644 vendor/github.com/creack/pty/util.go delete mode 100644 vendor/github.com/creack/pty/util_solaris.go delete mode 100644 vendor/github.com/creack/pty/ztypes_386.go delete mode 100644 vendor/github.com/creack/pty/ztypes_amd64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_arm.go delete mode 100644 vendor/github.com/creack/pty/ztypes_arm64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_freebsd_386.go delete mode 100644 vendor/github.com/creack/pty/ztypes_freebsd_amd64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_freebsd_arm.go delete mode 100644 vendor/github.com/creack/pty/ztypes_freebsd_arm64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_mipsx.go delete mode 100644 vendor/github.com/creack/pty/ztypes_openbsd_386.go delete mode 100644 vendor/github.com/creack/pty/ztypes_openbsd_amd64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_ppc64.go delete mode 100644 vendor/github.com/creack/pty/ztypes_ppc64le.go delete mode 100644 vendor/github.com/creack/pty/ztypes_riscvx.go delete mode 100644 vendor/github.com/creack/pty/ztypes_s390x.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/.gitignore delete mode 100644 vendor/github.com/dgrijalva/jwt-go/.travis.yml delete mode 100644 vendor/github.com/dgrijalva/jwt-go/LICENSE delete mode 100644 vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md delete mode 100644 vendor/github.com/dgrijalva/jwt-go/README.md delete mode 100644 vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md delete mode 100644 vendor/github.com/dgrijalva/jwt-go/claims.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/doc.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/ecdsa.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/errors.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/hmac.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/map_claims.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/none.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/parser.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa_pss.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa_utils.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/signing_method.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/token.go delete mode 100644 vendor/github.com/docker/distribution/LICENSE delete mode 100644 vendor/github.com/docker/distribution/digestset/set.go delete mode 100644 vendor/github.com/docker/distribution/reference/helpers.go delete mode 100644 vendor/github.com/docker/distribution/reference/normalize.go delete mode 100644 vendor/github.com/docker/distribution/reference/reference.go delete mode 100644 vendor/github.com/docker/distribution/reference/regexp.go delete mode 100644 vendor/github.com/docker/docker/AUTHORS delete mode 100644 vendor/github.com/docker/docker/LICENSE delete mode 100644 vendor/github.com/docker/docker/NOTICE delete mode 100644 vendor/github.com/docker/docker/api/types/auth.go delete mode 100644 vendor/github.com/docker/docker/api/types/blkiodev/blkio.go delete mode 100644 vendor/github.com/docker/docker/api/types/client.go delete mode 100644 vendor/github.com/docker/docker/api/types/configs.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/config.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/container_create.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/container_update.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/container_wait.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/host_config.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go delete mode 100644 vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go delete mode 100644 vendor/github.com/docker/docker/api/types/error_response.go delete mode 100644 vendor/github.com/docker/docker/api/types/events/events.go delete mode 100644 vendor/github.com/docker/docker/api/types/filters/parse.go delete mode 100644 vendor/github.com/docker/docker/api/types/id_response.go delete mode 100644 vendor/github.com/docker/docker/api/types/image_summary.go delete mode 100644 vendor/github.com/docker/docker/api/types/mount/mount.go delete mode 100644 vendor/github.com/docker/docker/api/types/network/network.go delete mode 100644 vendor/github.com/docker/docker/api/types/plugin.go delete mode 100644 vendor/github.com/docker/docker/api/types/plugin_device.go delete mode 100644 vendor/github.com/docker/docker/api/types/plugin_env.go delete mode 100644 vendor/github.com/docker/docker/api/types/plugin_interface_type.go delete mode 100644 vendor/github.com/docker/docker/api/types/plugin_mount.go delete mode 100644 vendor/github.com/docker/docker/api/types/plugin_responses.go delete mode 100644 vendor/github.com/docker/docker/api/types/port.go delete mode 100644 vendor/github.com/docker/docker/api/types/reference/image_reference.go delete mode 100644 vendor/github.com/docker/docker/api/types/registry/authenticate.go delete mode 100644 vendor/github.com/docker/docker/api/types/registry/registry.go delete mode 100644 vendor/github.com/docker/docker/api/types/seccomp.go delete mode 100644 vendor/github.com/docker/docker/api/types/service_update_response.go delete mode 100644 vendor/github.com/docker/docker/api/types/stats.go delete mode 100644 vendor/github.com/docker/docker/api/types/strslice/strslice.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/common.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/container.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/network.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/node.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/secret.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/service.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/swarm.go delete mode 100644 vendor/github.com/docker/docker/api/types/swarm/task.go delete mode 100644 vendor/github.com/docker/docker/api/types/time/duration_convert.go delete mode 100644 vendor/github.com/docker/docker/api/types/time/timestamp.go delete mode 100644 vendor/github.com/docker/docker/api/types/types.go delete mode 100644 vendor/github.com/docker/docker/api/types/versions/README.md delete mode 100644 vendor/github.com/docker/docker/api/types/versions/compare.go delete mode 100644 vendor/github.com/docker/docker/api/types/volume.go delete mode 100644 vendor/github.com/docker/docker/api/types/volume/volumes_create.go delete mode 100644 vendor/github.com/docker/docker/api/types/volume/volumes_list.go delete mode 100644 vendor/github.com/docker/docker/client/README.md delete mode 100644 vendor/github.com/docker/docker/client/checkpoint_create.go delete mode 100644 vendor/github.com/docker/docker/client/checkpoint_delete.go delete mode 100644 vendor/github.com/docker/docker/client/checkpoint_list.go delete mode 100644 vendor/github.com/docker/docker/client/client.go delete mode 100644 vendor/github.com/docker/docker/client/client_unix.go delete mode 100644 vendor/github.com/docker/docker/client/client_windows.go delete mode 100644 vendor/github.com/docker/docker/client/container_attach.go delete mode 100644 vendor/github.com/docker/docker/client/container_commit.go delete mode 100644 vendor/github.com/docker/docker/client/container_copy.go delete mode 100644 vendor/github.com/docker/docker/client/container_create.go delete mode 100644 vendor/github.com/docker/docker/client/container_diff.go delete mode 100644 vendor/github.com/docker/docker/client/container_exec.go delete mode 100644 vendor/github.com/docker/docker/client/container_export.go delete mode 100644 vendor/github.com/docker/docker/client/container_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/container_kill.go delete mode 100644 vendor/github.com/docker/docker/client/container_list.go delete mode 100644 vendor/github.com/docker/docker/client/container_logs.go delete mode 100644 vendor/github.com/docker/docker/client/container_pause.go delete mode 100644 vendor/github.com/docker/docker/client/container_prune.go delete mode 100644 vendor/github.com/docker/docker/client/container_remove.go delete mode 100644 vendor/github.com/docker/docker/client/container_rename.go delete mode 100644 vendor/github.com/docker/docker/client/container_resize.go delete mode 100644 vendor/github.com/docker/docker/client/container_restart.go delete mode 100644 vendor/github.com/docker/docker/client/container_start.go delete mode 100644 vendor/github.com/docker/docker/client/container_stats.go delete mode 100644 vendor/github.com/docker/docker/client/container_stop.go delete mode 100644 vendor/github.com/docker/docker/client/container_top.go delete mode 100644 vendor/github.com/docker/docker/client/container_unpause.go delete mode 100644 vendor/github.com/docker/docker/client/container_update.go delete mode 100644 vendor/github.com/docker/docker/client/container_wait.go delete mode 100644 vendor/github.com/docker/docker/client/disk_usage.go delete mode 100644 vendor/github.com/docker/docker/client/errors.go delete mode 100644 vendor/github.com/docker/docker/client/events.go delete mode 100644 vendor/github.com/docker/docker/client/hijack.go delete mode 100644 vendor/github.com/docker/docker/client/image_build.go delete mode 100644 vendor/github.com/docker/docker/client/image_create.go delete mode 100644 vendor/github.com/docker/docker/client/image_history.go delete mode 100644 vendor/github.com/docker/docker/client/image_import.go delete mode 100644 vendor/github.com/docker/docker/client/image_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/image_list.go delete mode 100644 vendor/github.com/docker/docker/client/image_load.go delete mode 100644 vendor/github.com/docker/docker/client/image_prune.go delete mode 100644 vendor/github.com/docker/docker/client/image_pull.go delete mode 100644 vendor/github.com/docker/docker/client/image_push.go delete mode 100644 vendor/github.com/docker/docker/client/image_remove.go delete mode 100644 vendor/github.com/docker/docker/client/image_save.go delete mode 100644 vendor/github.com/docker/docker/client/image_search.go delete mode 100644 vendor/github.com/docker/docker/client/image_tag.go delete mode 100644 vendor/github.com/docker/docker/client/info.go delete mode 100644 vendor/github.com/docker/docker/client/interface.go delete mode 100644 vendor/github.com/docker/docker/client/interface_experimental.go delete mode 100644 vendor/github.com/docker/docker/client/interface_stable.go delete mode 100644 vendor/github.com/docker/docker/client/login.go delete mode 100644 vendor/github.com/docker/docker/client/network_connect.go delete mode 100644 vendor/github.com/docker/docker/client/network_create.go delete mode 100644 vendor/github.com/docker/docker/client/network_disconnect.go delete mode 100644 vendor/github.com/docker/docker/client/network_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/network_list.go delete mode 100644 vendor/github.com/docker/docker/client/network_prune.go delete mode 100644 vendor/github.com/docker/docker/client/network_remove.go delete mode 100644 vendor/github.com/docker/docker/client/node_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/node_list.go delete mode 100644 vendor/github.com/docker/docker/client/node_remove.go delete mode 100644 vendor/github.com/docker/docker/client/node_update.go delete mode 100644 vendor/github.com/docker/docker/client/ping.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_create.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_disable.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_enable.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_install.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_list.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_push.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_remove.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_set.go delete mode 100644 vendor/github.com/docker/docker/client/plugin_upgrade.go delete mode 100644 vendor/github.com/docker/docker/client/request.go delete mode 100644 vendor/github.com/docker/docker/client/secret_create.go delete mode 100644 vendor/github.com/docker/docker/client/secret_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/secret_list.go delete mode 100644 vendor/github.com/docker/docker/client/secret_remove.go delete mode 100644 vendor/github.com/docker/docker/client/secret_update.go delete mode 100644 vendor/github.com/docker/docker/client/service_create.go delete mode 100644 vendor/github.com/docker/docker/client/service_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/service_list.go delete mode 100644 vendor/github.com/docker/docker/client/service_logs.go delete mode 100644 vendor/github.com/docker/docker/client/service_remove.go delete mode 100644 vendor/github.com/docker/docker/client/service_update.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_get_unlock_key.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_init.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_join.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_leave.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_unlock.go delete mode 100644 vendor/github.com/docker/docker/client/swarm_update.go delete mode 100644 vendor/github.com/docker/docker/client/task_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/task_list.go delete mode 100644 vendor/github.com/docker/docker/client/transport.go delete mode 100644 vendor/github.com/docker/docker/client/utils.go delete mode 100644 vendor/github.com/docker/docker/client/version.go delete mode 100644 vendor/github.com/docker/docker/client/volume_create.go delete mode 100644 vendor/github.com/docker/docker/client/volume_inspect.go delete mode 100644 vendor/github.com/docker/docker/client/volume_list.go delete mode 100644 vendor/github.com/docker/docker/client/volume_prune.go delete mode 100644 vendor/github.com/docker/docker/client/volume_remove.go delete mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go delete mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go delete mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go delete mode 100644 vendor/github.com/docker/go-connections/LICENSE delete mode 100644 vendor/github.com/docker/go-connections/nat/nat.go delete mode 100644 vendor/github.com/docker/go-connections/nat/parse.go delete mode 100644 vendor/github.com/docker/go-connections/nat/sort.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/README.md delete mode 100644 vendor/github.com/docker/go-connections/sockets/inmem_socket.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/proxy.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/sockets.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/sockets_unix.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/sockets_windows.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/tcp_socket.go delete mode 100644 vendor/github.com/docker/go-connections/sockets/unix_socket.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go delete mode 100644 vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go delete mode 100644 vendor/github.com/docker/go-units/CONTRIBUTING.md delete mode 100644 vendor/github.com/docker/go-units/LICENSE delete mode 100644 vendor/github.com/docker/go-units/MAINTAINERS delete mode 100644 vendor/github.com/docker/go-units/README.md delete mode 100644 vendor/github.com/docker/go-units/circle.yml delete mode 100644 vendor/github.com/docker/go-units/duration.go delete mode 100644 vendor/github.com/docker/go-units/size.go delete mode 100644 vendor/github.com/docker/go-units/ulimit.go delete mode 100644 vendor/github.com/elazarl/go-bindata-assetfs/LICENSE delete mode 100644 vendor/github.com/elazarl/go-bindata-assetfs/README.md delete mode 100644 vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go delete mode 100644 vendor/github.com/elazarl/go-bindata-assetfs/doc.go delete mode 100644 vendor/github.com/emirpasic/gods/LICENSE delete mode 100644 vendor/github.com/emirpasic/gods/containers/containers.go delete mode 100644 vendor/github.com/emirpasic/gods/containers/enumerable.go delete mode 100644 vendor/github.com/emirpasic/gods/containers/iterator.go delete mode 100644 vendor/github.com/emirpasic/gods/containers/serialization.go delete mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go delete mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go delete mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go delete mode 100644 vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go delete mode 100644 vendor/github.com/emirpasic/gods/lists/lists.go delete mode 100644 vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go delete mode 100644 vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go delete mode 100644 vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go delete mode 100644 vendor/github.com/emirpasic/gods/trees/trees.go delete mode 100644 vendor/github.com/emirpasic/gods/utils/comparator.go delete mode 100644 vendor/github.com/emirpasic/gods/utils/sort.go delete mode 100644 vendor/github.com/emirpasic/gods/utils/utils.go delete mode 100644 vendor/github.com/fatih/structs/.gitignore delete mode 100644 vendor/github.com/fatih/structs/.travis.yml delete mode 100644 vendor/github.com/fatih/structs/LICENSE delete mode 100644 vendor/github.com/fatih/structs/README.md delete mode 100644 vendor/github.com/fatih/structs/field.go delete mode 100644 vendor/github.com/fatih/structs/structs.go delete mode 100644 vendor/github.com/fatih/structs/tags.go delete mode 100644 vendor/github.com/gin-contrib/cors/.gitignore delete mode 100644 vendor/github.com/gin-contrib/cors/.travis.yml delete mode 100644 vendor/github.com/gin-contrib/cors/LICENSE delete mode 100644 vendor/github.com/gin-contrib/cors/README.md delete mode 100644 vendor/github.com/gin-contrib/cors/config.go delete mode 100644 vendor/github.com/gin-contrib/cors/cors.go delete mode 100644 vendor/github.com/gin-contrib/cors/go.mod delete mode 100644 vendor/github.com/gin-contrib/cors/go.sum delete mode 100644 vendor/github.com/gin-contrib/cors/utils.go delete mode 100644 vendor/github.com/gin-contrib/sse/.travis.yml delete mode 100644 vendor/github.com/gin-contrib/sse/LICENSE delete mode 100644 vendor/github.com/gin-contrib/sse/README.md delete mode 100644 vendor/github.com/gin-contrib/sse/go.mod delete mode 100644 vendor/github.com/gin-contrib/sse/go.sum delete mode 100644 vendor/github.com/gin-contrib/sse/sse-decoder.go delete mode 100644 vendor/github.com/gin-contrib/sse/sse-encoder.go delete mode 100644 vendor/github.com/gin-contrib/sse/writer.go delete mode 100644 vendor/github.com/gin-gonic/gin/.gitignore delete mode 100644 vendor/github.com/gin-gonic/gin/.travis.yml delete mode 100644 vendor/github.com/gin-gonic/gin/AUTHORS.md delete mode 100644 vendor/github.com/gin-gonic/gin/BENCHMARKS.md delete mode 100644 vendor/github.com/gin-gonic/gin/CHANGELOG.md delete mode 100644 vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/gin-gonic/gin/CONTRIBUTING.md delete mode 100644 vendor/github.com/gin-gonic/gin/LICENSE delete mode 100644 vendor/github.com/gin-gonic/gin/Makefile delete mode 100644 vendor/github.com/gin-gonic/gin/README.md delete mode 100644 vendor/github.com/gin-gonic/gin/auth.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/binding.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/default_validator.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/form.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/form_mapping.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/header.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/msgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/protobuf.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/query.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/uri.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/xml.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/yaml.go delete mode 100644 vendor/github.com/gin-gonic/gin/codecov.yml delete mode 100644 vendor/github.com/gin-gonic/gin/context.go delete mode 100644 vendor/github.com/gin-gonic/gin/context_appengine.go delete mode 100644 vendor/github.com/gin-gonic/gin/debug.go delete mode 100644 vendor/github.com/gin-gonic/gin/deprecated.go delete mode 100644 vendor/github.com/gin-gonic/gin/doc.go delete mode 100644 vendor/github.com/gin-gonic/gin/errors.go delete mode 100644 vendor/github.com/gin-gonic/gin/fs.go delete mode 100644 vendor/github.com/gin-gonic/gin/gin.go delete mode 100644 vendor/github.com/gin-gonic/gin/go.mod delete mode 100644 vendor/github.com/gin-gonic/gin/go.sum delete mode 100644 vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go delete mode 100644 vendor/github.com/gin-gonic/gin/internal/json/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go delete mode 100644 vendor/github.com/gin-gonic/gin/logger.go delete mode 100644 vendor/github.com/gin-gonic/gin/mode.go delete mode 100644 vendor/github.com/gin-gonic/gin/path.go delete mode 100644 vendor/github.com/gin-gonic/gin/recovery.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/data.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/html.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/msgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/protobuf.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/reader.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/redirect.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/render.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/text.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/xml.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/yaml.go delete mode 100644 vendor/github.com/gin-gonic/gin/response_writer.go delete mode 100644 vendor/github.com/gin-gonic/gin/routergroup.go delete mode 100644 vendor/github.com/gin-gonic/gin/test_helpers.go delete mode 100644 vendor/github.com/gin-gonic/gin/tree.go delete mode 100644 vendor/github.com/gin-gonic/gin/utils.go delete mode 100644 vendor/github.com/gin-gonic/gin/version.go delete mode 100644 vendor/github.com/gliderlabs/ssh/LICENSE delete mode 100644 vendor/github.com/gliderlabs/ssh/README.md delete mode 100644 vendor/github.com/gliderlabs/ssh/agent.go delete mode 100644 vendor/github.com/gliderlabs/ssh/circle.yml delete mode 100644 vendor/github.com/gliderlabs/ssh/conn.go delete mode 100644 vendor/github.com/gliderlabs/ssh/context.go delete mode 100644 vendor/github.com/gliderlabs/ssh/doc.go delete mode 100644 vendor/github.com/gliderlabs/ssh/options.go delete mode 100644 vendor/github.com/gliderlabs/ssh/server.go delete mode 100644 vendor/github.com/gliderlabs/ssh/session.go delete mode 100644 vendor/github.com/gliderlabs/ssh/ssh.go delete mode 100644 vendor/github.com/gliderlabs/ssh/tcpip.go delete mode 100644 vendor/github.com/gliderlabs/ssh/util.go delete mode 100644 vendor/github.com/gliderlabs/ssh/wrap.go delete mode 100644 vendor/github.com/go-playground/locales/.gitignore delete mode 100644 vendor/github.com/go-playground/locales/.travis.yml delete mode 100644 vendor/github.com/go-playground/locales/LICENSE delete mode 100644 vendor/github.com/go-playground/locales/README.md delete mode 100644 vendor/github.com/go-playground/locales/currency/currency.go delete mode 100644 vendor/github.com/go-playground/locales/go.mod delete mode 100644 vendor/github.com/go-playground/locales/go.sum delete mode 100644 vendor/github.com/go-playground/locales/logo.png delete mode 100644 vendor/github.com/go-playground/locales/rules.go delete mode 100644 vendor/github.com/go-playground/universal-translator/.gitignore delete mode 100644 vendor/github.com/go-playground/universal-translator/.travis.yml delete mode 100644 vendor/github.com/go-playground/universal-translator/LICENSE delete mode 100644 vendor/github.com/go-playground/universal-translator/README.md delete mode 100644 vendor/github.com/go-playground/universal-translator/errors.go delete mode 100644 vendor/github.com/go-playground/universal-translator/go.mod delete mode 100644 vendor/github.com/go-playground/universal-translator/go.sum delete mode 100644 vendor/github.com/go-playground/universal-translator/import_export.go delete mode 100644 vendor/github.com/go-playground/universal-translator/logo.png delete mode 100644 vendor/github.com/go-playground/universal-translator/translator.go delete mode 100644 vendor/github.com/go-playground/universal-translator/universal_translator.go delete mode 100644 vendor/github.com/go-playground/validator/v10/.gitignore delete mode 100644 vendor/github.com/go-playground/validator/v10/.travis.yml delete mode 100644 vendor/github.com/go-playground/validator/v10/LICENSE delete mode 100644 vendor/github.com/go-playground/validator/v10/Makefile delete mode 100644 vendor/github.com/go-playground/validator/v10/README.md delete mode 100644 vendor/github.com/go-playground/validator/v10/baked_in.go delete mode 100644 vendor/github.com/go-playground/validator/v10/cache.go delete mode 100644 vendor/github.com/go-playground/validator/v10/doc.go delete mode 100644 vendor/github.com/go-playground/validator/v10/errors.go delete mode 100644 vendor/github.com/go-playground/validator/v10/field_level.go delete mode 100644 vendor/github.com/go-playground/validator/v10/go.mod delete mode 100644 vendor/github.com/go-playground/validator/v10/go.sum delete mode 100644 vendor/github.com/go-playground/validator/v10/logo.png delete mode 100644 vendor/github.com/go-playground/validator/v10/regexes.go delete mode 100644 vendor/github.com/go-playground/validator/v10/struct_level.go delete mode 100644 vendor/github.com/go-playground/validator/v10/translations.go delete mode 100644 vendor/github.com/go-playground/validator/v10/util.go delete mode 100644 vendor/github.com/go-playground/validator/v10/validator.go delete mode 100644 vendor/github.com/go-playground/validator/v10/validator_instance.go delete mode 100644 vendor/github.com/go-redis/redis/.gitignore delete mode 100644 vendor/github.com/go-redis/redis/.travis.yml delete mode 100644 vendor/github.com/go-redis/redis/CHANGELOG.md delete mode 100644 vendor/github.com/go-redis/redis/LICENSE delete mode 100644 vendor/github.com/go-redis/redis/Makefile delete mode 100644 vendor/github.com/go-redis/redis/README.md delete mode 100644 vendor/github.com/go-redis/redis/cluster.go delete mode 100644 vendor/github.com/go-redis/redis/cluster_commands.go delete mode 100644 vendor/github.com/go-redis/redis/command.go delete mode 100644 vendor/github.com/go-redis/redis/commands.go delete mode 100644 vendor/github.com/go-redis/redis/doc.go delete mode 100644 vendor/github.com/go-redis/redis/internal/consistenthash/consistenthash.go delete mode 100644 vendor/github.com/go-redis/redis/internal/error.go delete mode 100644 vendor/github.com/go-redis/redis/internal/hashtag/hashtag.go delete mode 100644 vendor/github.com/go-redis/redis/internal/internal.go delete mode 100644 vendor/github.com/go-redis/redis/internal/log.go delete mode 100644 vendor/github.com/go-redis/redis/internal/once.go delete mode 100644 vendor/github.com/go-redis/redis/internal/pool/conn.go delete mode 100644 vendor/github.com/go-redis/redis/internal/pool/pool.go delete mode 100644 vendor/github.com/go-redis/redis/internal/pool/pool_single.go delete mode 100644 vendor/github.com/go-redis/redis/internal/pool/pool_sticky.go delete mode 100644 vendor/github.com/go-redis/redis/internal/proto/reader.go delete mode 100644 vendor/github.com/go-redis/redis/internal/proto/scan.go delete mode 100644 vendor/github.com/go-redis/redis/internal/proto/writer.go delete mode 100644 vendor/github.com/go-redis/redis/internal/util.go delete mode 100644 vendor/github.com/go-redis/redis/internal/util/safe.go delete mode 100644 vendor/github.com/go-redis/redis/internal/util/strconv.go delete mode 100644 vendor/github.com/go-redis/redis/internal/util/unsafe.go delete mode 100644 vendor/github.com/go-redis/redis/iterator.go delete mode 100644 vendor/github.com/go-redis/redis/options.go delete mode 100644 vendor/github.com/go-redis/redis/pipeline.go delete mode 100644 vendor/github.com/go-redis/redis/pubsub.go delete mode 100644 vendor/github.com/go-redis/redis/redis.go delete mode 100644 vendor/github.com/go-redis/redis/result.go delete mode 100644 vendor/github.com/go-redis/redis/ring.go delete mode 100644 vendor/github.com/go-redis/redis/script.go delete mode 100644 vendor/github.com/go-redis/redis/sentinel.go delete mode 100644 vendor/github.com/go-redis/redis/tx.go delete mode 100644 vendor/github.com/go-redis/redis/universal.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/.gitignore delete mode 100644 vendor/github.com/go-sql-driver/mysql/.travis.yml delete mode 100644 vendor/github.com/go-sql-driver/mysql/AUTHORS delete mode 100644 vendor/github.com/go-sql-driver/mysql/CHANGELOG.md delete mode 100644 vendor/github.com/go-sql-driver/mysql/LICENSE delete mode 100644 vendor/github.com/go-sql-driver/mysql/README.md delete mode 100644 vendor/github.com/go-sql-driver/mysql/auth.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/buffer.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/collations.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/conncheck.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/conncheck_dummy.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/connection.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/connector.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/const.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/driver.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/dsn.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/errors.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/fields.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/go.mod delete mode 100644 vendor/github.com/go-sql-driver/mysql/infile.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/nulltime.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/nulltime_go113.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/nulltime_legacy.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/packets.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/result.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/rows.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/statement.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/transaction.go delete mode 100644 vendor/github.com/go-sql-driver/mysql/utils.go delete mode 100644 vendor/github.com/go-stack/stack/.travis.yml delete mode 100644 vendor/github.com/go-stack/stack/LICENSE.md delete mode 100644 vendor/github.com/go-stack/stack/README.md delete mode 100644 vendor/github.com/go-stack/stack/go.mod delete mode 100644 vendor/github.com/go-stack/stack/stack.go delete mode 100644 vendor/github.com/golang/protobuf/AUTHORS delete mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/protobuf/LICENSE delete mode 100644 vendor/github.com/golang/protobuf/proto/buffer.go delete mode 100644 vendor/github.com/golang/protobuf/proto/defaults.go delete mode 100644 vendor/github.com/golang/protobuf/proto/deprecated.go delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/golang/protobuf/proto/properties.go delete mode 100644 vendor/github.com/golang/protobuf/proto/proto.go delete mode 100644 vendor/github.com/golang/protobuf/proto/registry.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_decode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_encode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wire.go delete mode 100644 vendor/github.com/golang/protobuf/proto/wrappers.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 delete mode 100644 vendor/github.com/golang/snappy/.gitignore delete mode 100644 vendor/github.com/golang/snappy/AUTHORS delete mode 100644 vendor/github.com/golang/snappy/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/snappy/LICENSE delete mode 100644 vendor/github.com/golang/snappy/README delete mode 100644 vendor/github.com/golang/snappy/decode.go delete mode 100644 vendor/github.com/golang/snappy/decode_amd64.go delete mode 100644 vendor/github.com/golang/snappy/decode_amd64.s delete mode 100644 vendor/github.com/golang/snappy/decode_other.go delete mode 100644 vendor/github.com/golang/snappy/encode.go delete mode 100644 vendor/github.com/golang/snappy/encode_amd64.go delete mode 100644 vendor/github.com/golang/snappy/encode_amd64.s delete mode 100644 vendor/github.com/golang/snappy/encode_other.go delete mode 100644 vendor/github.com/golang/snappy/go.mod delete mode 100644 vendor/github.com/golang/snappy/snappy.go delete mode 100644 vendor/github.com/google/uuid/.travis.yml delete mode 100644 vendor/github.com/google/uuid/CONTRIBUTING.md delete mode 100644 vendor/github.com/google/uuid/CONTRIBUTORS delete mode 100644 vendor/github.com/google/uuid/LICENSE delete mode 100644 vendor/github.com/google/uuid/README.md delete mode 100644 vendor/github.com/google/uuid/dce.go delete mode 100644 vendor/github.com/google/uuid/doc.go delete mode 100644 vendor/github.com/google/uuid/go.mod delete mode 100644 vendor/github.com/google/uuid/hash.go delete mode 100644 vendor/github.com/google/uuid/marshal.go delete mode 100644 vendor/github.com/google/uuid/node.go delete mode 100644 vendor/github.com/google/uuid/node_js.go delete mode 100644 vendor/github.com/google/uuid/node_net.go delete mode 100644 vendor/github.com/google/uuid/sql.go delete mode 100644 vendor/github.com/google/uuid/time.go delete mode 100644 vendor/github.com/google/uuid/util.go delete mode 100644 vendor/github.com/google/uuid/uuid.go delete mode 100644 vendor/github.com/google/uuid/version1.go delete mode 100644 vendor/github.com/google/uuid/version4.go delete mode 100644 vendor/github.com/gorilla/websocket/.gitignore delete mode 100644 vendor/github.com/gorilla/websocket/AUTHORS delete mode 100644 vendor/github.com/gorilla/websocket/LICENSE delete mode 100644 vendor/github.com/gorilla/websocket/README.md delete mode 100644 vendor/github.com/gorilla/websocket/client.go delete mode 100644 vendor/github.com/gorilla/websocket/client_clone.go delete mode 100644 vendor/github.com/gorilla/websocket/client_clone_legacy.go delete mode 100644 vendor/github.com/gorilla/websocket/compression.go delete mode 100644 vendor/github.com/gorilla/websocket/conn.go delete mode 100644 vendor/github.com/gorilla/websocket/conn_write.go delete mode 100644 vendor/github.com/gorilla/websocket/conn_write_legacy.go delete mode 100644 vendor/github.com/gorilla/websocket/doc.go delete mode 100644 vendor/github.com/gorilla/websocket/go.mod delete mode 100644 vendor/github.com/gorilla/websocket/go.sum delete mode 100644 vendor/github.com/gorilla/websocket/join.go delete mode 100644 vendor/github.com/gorilla/websocket/json.go delete mode 100644 vendor/github.com/gorilla/websocket/mask.go delete mode 100644 vendor/github.com/gorilla/websocket/mask_safe.go delete mode 100644 vendor/github.com/gorilla/websocket/prepared.go delete mode 100644 vendor/github.com/gorilla/websocket/proxy.go delete mode 100644 vendor/github.com/gorilla/websocket/server.go delete mode 100644 vendor/github.com/gorilla/websocket/trace.go delete mode 100644 vendor/github.com/gorilla/websocket/trace_17.go delete mode 100644 vendor/github.com/gorilla/websocket/util.go delete mode 100644 vendor/github.com/gorilla/websocket/x_net_proxy.go delete mode 100644 vendor/github.com/hashicorp/errwrap/LICENSE delete mode 100644 vendor/github.com/hashicorp/errwrap/README.md delete mode 100644 vendor/github.com/hashicorp/errwrap/errwrap.go delete mode 100644 vendor/github.com/hashicorp/errwrap/go.mod delete mode 100644 vendor/github.com/hashicorp/go-multierror/.travis.yml delete mode 100644 vendor/github.com/hashicorp/go-multierror/LICENSE delete mode 100644 vendor/github.com/hashicorp/go-multierror/Makefile delete mode 100644 vendor/github.com/hashicorp/go-multierror/README.md delete mode 100644 vendor/github.com/hashicorp/go-multierror/append.go delete mode 100644 vendor/github.com/hashicorp/go-multierror/flatten.go delete mode 100644 vendor/github.com/hashicorp/go-multierror/format.go delete mode 100644 vendor/github.com/hashicorp/go-multierror/go.mod delete mode 100644 vendor/github.com/hashicorp/go-multierror/go.sum delete mode 100644 vendor/github.com/hashicorp/go-multierror/group.go delete mode 100644 vendor/github.com/hashicorp/go-multierror/multierror.go delete mode 100644 vendor/github.com/hashicorp/go-multierror/prefix.go delete mode 100644 vendor/github.com/hashicorp/go-multierror/sort.go delete mode 100644 vendor/github.com/jackc/chunkreader/v2/.travis.yml delete mode 100644 vendor/github.com/jackc/chunkreader/v2/LICENSE delete mode 100644 vendor/github.com/jackc/chunkreader/v2/README.md delete mode 100644 vendor/github.com/jackc/chunkreader/v2/chunkreader.go delete mode 100644 vendor/github.com/jackc/chunkreader/v2/go.mod delete mode 100644 vendor/github.com/jackc/pgconn/.gitignore delete mode 100644 vendor/github.com/jackc/pgconn/.travis.yml delete mode 100644 vendor/github.com/jackc/pgconn/CHANGELOG.md delete mode 100644 vendor/github.com/jackc/pgconn/LICENSE delete mode 100644 vendor/github.com/jackc/pgconn/README.md delete mode 100644 vendor/github.com/jackc/pgconn/auth_scram.go delete mode 100644 vendor/github.com/jackc/pgconn/config.go delete mode 100644 vendor/github.com/jackc/pgconn/doc.go delete mode 100644 vendor/github.com/jackc/pgconn/errors.go delete mode 100644 vendor/github.com/jackc/pgconn/go.mod delete mode 100644 vendor/github.com/jackc/pgconn/go.sum delete mode 100644 vendor/github.com/jackc/pgconn/internal/ctxwatch/context_watcher.go delete mode 100644 vendor/github.com/jackc/pgconn/pgconn.go delete mode 100644 vendor/github.com/jackc/pgconn/stmtcache/lru.go delete mode 100644 vendor/github.com/jackc/pgconn/stmtcache/stmtcache.go delete mode 100644 vendor/github.com/jackc/pgio/.travis.yml delete mode 100644 vendor/github.com/jackc/pgio/LICENSE delete mode 100644 vendor/github.com/jackc/pgio/README.md delete mode 100644 vendor/github.com/jackc/pgio/doc.go delete mode 100644 vendor/github.com/jackc/pgio/go.mod delete mode 100644 vendor/github.com/jackc/pgio/write.go delete mode 100644 vendor/github.com/jackc/pgpassfile/.travis.yml delete mode 100644 vendor/github.com/jackc/pgpassfile/LICENSE delete mode 100644 vendor/github.com/jackc/pgpassfile/README.md delete mode 100644 vendor/github.com/jackc/pgpassfile/go.mod delete mode 100644 vendor/github.com/jackc/pgpassfile/go.sum delete mode 100644 vendor/github.com/jackc/pgpassfile/pgpass.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/.travis.yml delete mode 100644 vendor/github.com/jackc/pgproto3/v2/LICENSE delete mode 100644 vendor/github.com/jackc/pgproto3/v2/README.md delete mode 100644 vendor/github.com/jackc/pgproto3/v2/authentication_cleartext_password.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/authentication_md5_password.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/authentication_ok.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/authentication_sasl.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/authentication_sasl_continue.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/authentication_sasl_final.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/backend.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/backend_key_data.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/big_endian.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/bind.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/bind_complete.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/cancel_request.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/chunkreader.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/close.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/close_complete.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/command_complete.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/copy_both_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/copy_data.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/copy_done.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/copy_fail.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/copy_in_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/copy_out_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/data_row.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/describe.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/doc.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/empty_query_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/error_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/execute.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/flush.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/frontend.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/function_call_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/go.mod delete mode 100644 vendor/github.com/jackc/pgproto3/v2/go.sum delete mode 100644 vendor/github.com/jackc/pgproto3/v2/no_data.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/notice_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/notification_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/parameter_description.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/parameter_status.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/parse.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/parse_complete.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/password_message.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/pgproto3.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/portal_suspended.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/query.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/ready_for_query.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/row_description.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/sasl_initial_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/sasl_response.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/ssl_request.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/startup_message.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/sync.go delete mode 100644 vendor/github.com/jackc/pgproto3/v2/terminate.go delete mode 100644 vendor/github.com/jackc/pgservicefile/.travis.yml delete mode 100644 vendor/github.com/jackc/pgservicefile/LICENSE delete mode 100644 vendor/github.com/jackc/pgservicefile/README.md delete mode 100644 vendor/github.com/jackc/pgservicefile/go.mod delete mode 100644 vendor/github.com/jackc/pgservicefile/go.sum delete mode 100644 vendor/github.com/jackc/pgservicefile/pgservicefile.go delete mode 100644 vendor/github.com/jackc/pgtype/CHANGELOG.md delete mode 100644 vendor/github.com/jackc/pgtype/LICENSE delete mode 100644 vendor/github.com/jackc/pgtype/README.md delete mode 100644 vendor/github.com/jackc/pgtype/aclitem.go delete mode 100644 vendor/github.com/jackc/pgtype/aclitem_array.go delete mode 100644 vendor/github.com/jackc/pgtype/array.go delete mode 100644 vendor/github.com/jackc/pgtype/bit.go delete mode 100644 vendor/github.com/jackc/pgtype/bool.go delete mode 100644 vendor/github.com/jackc/pgtype/bool_array.go delete mode 100644 vendor/github.com/jackc/pgtype/box.go delete mode 100644 vendor/github.com/jackc/pgtype/bpchar.go delete mode 100644 vendor/github.com/jackc/pgtype/bpchar_array.go delete mode 100644 vendor/github.com/jackc/pgtype/bytea.go delete mode 100644 vendor/github.com/jackc/pgtype/bytea_array.go delete mode 100644 vendor/github.com/jackc/pgtype/cid.go delete mode 100644 vendor/github.com/jackc/pgtype/cidr.go delete mode 100644 vendor/github.com/jackc/pgtype/cidr_array.go delete mode 100644 vendor/github.com/jackc/pgtype/circle.go delete mode 100644 vendor/github.com/jackc/pgtype/convert.go delete mode 100644 vendor/github.com/jackc/pgtype/database_sql.go delete mode 100644 vendor/github.com/jackc/pgtype/date.go delete mode 100644 vendor/github.com/jackc/pgtype/date_array.go delete mode 100644 vendor/github.com/jackc/pgtype/daterange.go delete mode 100644 vendor/github.com/jackc/pgtype/enum_array.go delete mode 100644 vendor/github.com/jackc/pgtype/float4.go delete mode 100644 vendor/github.com/jackc/pgtype/float4_array.go delete mode 100644 vendor/github.com/jackc/pgtype/float8.go delete mode 100644 vendor/github.com/jackc/pgtype/float8_array.go delete mode 100644 vendor/github.com/jackc/pgtype/generic_binary.go delete mode 100644 vendor/github.com/jackc/pgtype/generic_text.go delete mode 100644 vendor/github.com/jackc/pgtype/go.mod delete mode 100644 vendor/github.com/jackc/pgtype/go.sum delete mode 100644 vendor/github.com/jackc/pgtype/hstore.go delete mode 100644 vendor/github.com/jackc/pgtype/hstore_array.go delete mode 100644 vendor/github.com/jackc/pgtype/inet.go delete mode 100644 vendor/github.com/jackc/pgtype/inet_array.go delete mode 100644 vendor/github.com/jackc/pgtype/int2.go delete mode 100644 vendor/github.com/jackc/pgtype/int2_array.go delete mode 100644 vendor/github.com/jackc/pgtype/int4.go delete mode 100644 vendor/github.com/jackc/pgtype/int4_array.go delete mode 100644 vendor/github.com/jackc/pgtype/int4range.go delete mode 100644 vendor/github.com/jackc/pgtype/int8.go delete mode 100644 vendor/github.com/jackc/pgtype/int8_array.go delete mode 100644 vendor/github.com/jackc/pgtype/int8range.go delete mode 100644 vendor/github.com/jackc/pgtype/interval.go delete mode 100644 vendor/github.com/jackc/pgtype/json.go delete mode 100644 vendor/github.com/jackc/pgtype/jsonb.go delete mode 100644 vendor/github.com/jackc/pgtype/line.go delete mode 100644 vendor/github.com/jackc/pgtype/lseg.go delete mode 100644 vendor/github.com/jackc/pgtype/macaddr.go delete mode 100644 vendor/github.com/jackc/pgtype/macaddr_array.go delete mode 100644 vendor/github.com/jackc/pgtype/name.go delete mode 100644 vendor/github.com/jackc/pgtype/numeric.go delete mode 100644 vendor/github.com/jackc/pgtype/numeric_array.go delete mode 100644 vendor/github.com/jackc/pgtype/numrange.go delete mode 100644 vendor/github.com/jackc/pgtype/oid.go delete mode 100644 vendor/github.com/jackc/pgtype/oid_value.go delete mode 100644 vendor/github.com/jackc/pgtype/path.go delete mode 100644 vendor/github.com/jackc/pgtype/pgtype.go delete mode 100644 vendor/github.com/jackc/pgtype/pguint32.go delete mode 100644 vendor/github.com/jackc/pgtype/point.go delete mode 100644 vendor/github.com/jackc/pgtype/polygon.go delete mode 100644 vendor/github.com/jackc/pgtype/qchar.go delete mode 100644 vendor/github.com/jackc/pgtype/range.go delete mode 100644 vendor/github.com/jackc/pgtype/record.go delete mode 100644 vendor/github.com/jackc/pgtype/text.go delete mode 100644 vendor/github.com/jackc/pgtype/text_array.go delete mode 100644 vendor/github.com/jackc/pgtype/tid.go delete mode 100644 vendor/github.com/jackc/pgtype/time.go delete mode 100644 vendor/github.com/jackc/pgtype/timestamp.go delete mode 100644 vendor/github.com/jackc/pgtype/timestamp_array.go delete mode 100644 vendor/github.com/jackc/pgtype/timestamptz.go delete mode 100644 vendor/github.com/jackc/pgtype/timestamptz_array.go delete mode 100644 vendor/github.com/jackc/pgtype/tsrange.go delete mode 100644 vendor/github.com/jackc/pgtype/tstzrange.go delete mode 100644 vendor/github.com/jackc/pgtype/tstzrange_array.go delete mode 100644 vendor/github.com/jackc/pgtype/typed_array.go.erb delete mode 100644 vendor/github.com/jackc/pgtype/typed_array_gen.sh delete mode 100644 vendor/github.com/jackc/pgtype/typed_range.go.erb delete mode 100644 vendor/github.com/jackc/pgtype/typed_range_gen.sh delete mode 100644 vendor/github.com/jackc/pgtype/unknown.go delete mode 100644 vendor/github.com/jackc/pgtype/uuid.go delete mode 100644 vendor/github.com/jackc/pgtype/uuid_array.go delete mode 100644 vendor/github.com/jackc/pgtype/varbit.go delete mode 100644 vendor/github.com/jackc/pgtype/varchar.go delete mode 100644 vendor/github.com/jackc/pgtype/varchar_array.go delete mode 100644 vendor/github.com/jackc/pgtype/xid.go delete mode 100644 vendor/github.com/jackc/pgx/v4/.gitignore delete mode 100644 vendor/github.com/jackc/pgx/v4/.travis.yml delete mode 100644 vendor/github.com/jackc/pgx/v4/CHANGELOG.md delete mode 100644 vendor/github.com/jackc/pgx/v4/LICENSE delete mode 100644 vendor/github.com/jackc/pgx/v4/README.md delete mode 100644 vendor/github.com/jackc/pgx/v4/batch.go delete mode 100644 vendor/github.com/jackc/pgx/v4/conn.go delete mode 100644 vendor/github.com/jackc/pgx/v4/copy_from.go delete mode 100644 vendor/github.com/jackc/pgx/v4/doc.go delete mode 100644 vendor/github.com/jackc/pgx/v4/extended_query_builder.go delete mode 100644 vendor/github.com/jackc/pgx/v4/go.mod delete mode 100644 vendor/github.com/jackc/pgx/v4/go.sum delete mode 100644 vendor/github.com/jackc/pgx/v4/go_stdlib.go delete mode 100644 vendor/github.com/jackc/pgx/v4/internal/sanitize/sanitize.go delete mode 100644 vendor/github.com/jackc/pgx/v4/large_objects.go delete mode 100644 vendor/github.com/jackc/pgx/v4/logger.go delete mode 100644 vendor/github.com/jackc/pgx/v4/messages.go delete mode 100644 vendor/github.com/jackc/pgx/v4/rows.go delete mode 100644 vendor/github.com/jackc/pgx/v4/tx.go delete mode 100644 vendor/github.com/jackc/pgx/v4/values.go delete mode 100644 vendor/github.com/jbenet/go-context/LICENSE delete mode 100644 vendor/github.com/jbenet/go-context/io/ctxio.go delete mode 100644 vendor/github.com/json-iterator/go/.codecov.yml delete mode 100644 vendor/github.com/json-iterator/go/.gitignore delete mode 100644 vendor/github.com/json-iterator/go/.travis.yml delete mode 100644 vendor/github.com/json-iterator/go/Gopkg.lock delete mode 100644 vendor/github.com/json-iterator/go/Gopkg.toml delete mode 100644 vendor/github.com/json-iterator/go/LICENSE delete mode 100644 vendor/github.com/json-iterator/go/README.md delete mode 100644 vendor/github.com/json-iterator/go/adapter.go delete mode 100644 vendor/github.com/json-iterator/go/any.go delete mode 100644 vendor/github.com/json-iterator/go/any_array.go delete mode 100644 vendor/github.com/json-iterator/go/any_bool.go delete mode 100644 vendor/github.com/json-iterator/go/any_float.go delete mode 100644 vendor/github.com/json-iterator/go/any_int32.go delete mode 100644 vendor/github.com/json-iterator/go/any_int64.go delete mode 100644 vendor/github.com/json-iterator/go/any_invalid.go delete mode 100644 vendor/github.com/json-iterator/go/any_nil.go delete mode 100644 vendor/github.com/json-iterator/go/any_number.go delete mode 100644 vendor/github.com/json-iterator/go/any_object.go delete mode 100644 vendor/github.com/json-iterator/go/any_str.go delete mode 100644 vendor/github.com/json-iterator/go/any_uint32.go delete mode 100644 vendor/github.com/json-iterator/go/any_uint64.go delete mode 100644 vendor/github.com/json-iterator/go/build.sh delete mode 100644 vendor/github.com/json-iterator/go/config.go delete mode 100644 vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md delete mode 100644 vendor/github.com/json-iterator/go/go.mod delete mode 100644 vendor/github.com/json-iterator/go/go.sum delete mode 100644 vendor/github.com/json-iterator/go/iter.go delete mode 100644 vendor/github.com/json-iterator/go/iter_array.go delete mode 100644 vendor/github.com/json-iterator/go/iter_float.go delete mode 100644 vendor/github.com/json-iterator/go/iter_int.go delete mode 100644 vendor/github.com/json-iterator/go/iter_object.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip_sloppy.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip_strict.go delete mode 100644 vendor/github.com/json-iterator/go/iter_str.go delete mode 100644 vendor/github.com/json-iterator/go/jsoniter.go delete mode 100644 vendor/github.com/json-iterator/go/pool.go delete mode 100644 vendor/github.com/json-iterator/go/reflect.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_array.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_extension.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_map.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_native.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_struct_decoder.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_struct_encoder.go delete mode 100644 vendor/github.com/json-iterator/go/stream.go delete mode 100644 vendor/github.com/json-iterator/go/stream_float.go delete mode 100644 vendor/github.com/json-iterator/go/stream_int.go delete mode 100644 vendor/github.com/json-iterator/go/stream_str.go delete mode 100644 vendor/github.com/json-iterator/go/test.sh delete mode 100644 vendor/github.com/kevinburke/ssh_config/.gitattributes delete mode 100644 vendor/github.com/kevinburke/ssh_config/.gitignore delete mode 100644 vendor/github.com/kevinburke/ssh_config/.mailmap delete mode 100644 vendor/github.com/kevinburke/ssh_config/.travis.yml delete mode 100644 vendor/github.com/kevinburke/ssh_config/AUTHORS.txt delete mode 100644 vendor/github.com/kevinburke/ssh_config/LICENSE delete mode 100644 vendor/github.com/kevinburke/ssh_config/Makefile delete mode 100644 vendor/github.com/kevinburke/ssh_config/README.md delete mode 100644 vendor/github.com/kevinburke/ssh_config/config.go delete mode 100644 vendor/github.com/kevinburke/ssh_config/lexer.go delete mode 100644 vendor/github.com/kevinburke/ssh_config/parser.go delete mode 100644 vendor/github.com/kevinburke/ssh_config/position.go delete mode 100644 vendor/github.com/kevinburke/ssh_config/token.go delete mode 100644 vendor/github.com/kevinburke/ssh_config/validators.go delete mode 100644 vendor/github.com/klauspost/compress/LICENSE delete mode 100644 vendor/github.com/klauspost/compress/fse/README.md delete mode 100644 vendor/github.com/klauspost/compress/fse/bitreader.go delete mode 100644 vendor/github.com/klauspost/compress/fse/bitwriter.go delete mode 100644 vendor/github.com/klauspost/compress/fse/bytereader.go delete mode 100644 vendor/github.com/klauspost/compress/fse/compress.go delete mode 100644 vendor/github.com/klauspost/compress/fse/decompress.go delete mode 100644 vendor/github.com/klauspost/compress/fse/fse.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/.gitignore delete mode 100644 vendor/github.com/klauspost/compress/huff0/README.md delete mode 100644 vendor/github.com/klauspost/compress/huff0/bitreader.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/bitwriter.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/bytereader.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/compress.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/decompress.go delete mode 100644 vendor/github.com/klauspost/compress/huff0/huff0.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/.gitignore delete mode 100644 vendor/github.com/klauspost/compress/snappy/AUTHORS delete mode 100644 vendor/github.com/klauspost/compress/snappy/CONTRIBUTORS delete mode 100644 vendor/github.com/klauspost/compress/snappy/LICENSE delete mode 100644 vendor/github.com/klauspost/compress/snappy/README delete mode 100644 vendor/github.com/klauspost/compress/snappy/decode.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/decode_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/decode_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/snappy/decode_other.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/encode.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/encode_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/encode_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/snappy/encode_other.go delete mode 100644 vendor/github.com/klauspost/compress/snappy/runbench.cmd delete mode 100644 vendor/github.com/klauspost/compress/snappy/snappy.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/README.md delete mode 100644 vendor/github.com/klauspost/compress/zstd/bitreader.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/bitwriter.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/blockdec.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/blockenc.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/blocktype_string.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/bytebuf.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/bytereader.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/decoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/decoder_options.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_better.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_dfast.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_fast.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/enc_params.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/encoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/encoder_options.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/framedec.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/frameenc.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_decoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_encoder.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/fse_predefined.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/hash.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/history.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/README.md delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_amd64.s delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_other.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/internal/xxhash/xxhash_safe.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqdec.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/seqenc.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/snappy.go delete mode 100644 vendor/github.com/klauspost/compress/zstd/zstd.go delete mode 100644 vendor/github.com/kr/pty/.gitignore delete mode 100644 vendor/github.com/kr/pty/LICENSE delete mode 100644 vendor/github.com/kr/pty/README.md delete mode 100644 vendor/github.com/kr/pty/go.mod delete mode 100644 vendor/github.com/kr/pty/go.sum delete mode 100644 vendor/github.com/kr/pty/shim.go delete mode 100644 vendor/github.com/leodido/go-urn/.gitignore delete mode 100644 vendor/github.com/leodido/go-urn/.travis.yml delete mode 100644 vendor/github.com/leodido/go-urn/LICENSE delete mode 100644 vendor/github.com/leodido/go-urn/README.md delete mode 100644 vendor/github.com/leodido/go-urn/go.mod delete mode 100644 vendor/github.com/leodido/go-urn/go.sum delete mode 100644 vendor/github.com/leodido/go-urn/machine.go delete mode 100644 vendor/github.com/leodido/go-urn/machine.go.rl delete mode 100644 vendor/github.com/leodido/go-urn/makefile delete mode 100644 vendor/github.com/leodido/go-urn/urn.go delete mode 100644 vendor/github.com/mattn/go-isatty/.travis.yml delete mode 100644 vendor/github.com/mattn/go-isatty/LICENSE delete mode 100644 vendor/github.com/mattn/go-isatty/README.md delete mode 100644 vendor/github.com/mattn/go-isatty/doc.go delete mode 100644 vendor/github.com/mattn/go-isatty/go.mod delete mode 100644 vendor/github.com/mattn/go-isatty/go.sum delete mode 100644 vendor/github.com/mattn/go-isatty/go.test.sh delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_plan9.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_tcgets.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go delete mode 100644 vendor/github.com/mattn/go-isatty/renovate.json delete mode 100644 vendor/github.com/miekg/dns/.codecov.yml delete mode 100644 vendor/github.com/miekg/dns/.gitignore delete mode 100644 vendor/github.com/miekg/dns/.travis.yml delete mode 100644 vendor/github.com/miekg/dns/AUTHORS delete mode 100644 vendor/github.com/miekg/dns/CODEOWNERS delete mode 100644 vendor/github.com/miekg/dns/CONTRIBUTORS delete mode 100644 vendor/github.com/miekg/dns/COPYRIGHT delete mode 100644 vendor/github.com/miekg/dns/LICENSE delete mode 100644 vendor/github.com/miekg/dns/Makefile.fuzz delete mode 100644 vendor/github.com/miekg/dns/Makefile.release delete mode 100644 vendor/github.com/miekg/dns/README.md delete mode 100644 vendor/github.com/miekg/dns/acceptfunc.go delete mode 100644 vendor/github.com/miekg/dns/client.go delete mode 100644 vendor/github.com/miekg/dns/clientconfig.go delete mode 100644 vendor/github.com/miekg/dns/dane.go delete mode 100644 vendor/github.com/miekg/dns/defaults.go delete mode 100644 vendor/github.com/miekg/dns/dns.go delete mode 100644 vendor/github.com/miekg/dns/dnssec.go delete mode 100644 vendor/github.com/miekg/dns/dnssec_keygen.go delete mode 100644 vendor/github.com/miekg/dns/dnssec_keyscan.go delete mode 100644 vendor/github.com/miekg/dns/dnssec_privkey.go delete mode 100644 vendor/github.com/miekg/dns/doc.go delete mode 100644 vendor/github.com/miekg/dns/duplicate.go delete mode 100644 vendor/github.com/miekg/dns/edns.go delete mode 100644 vendor/github.com/miekg/dns/format.go delete mode 100644 vendor/github.com/miekg/dns/fuzz.go delete mode 100644 vendor/github.com/miekg/dns/generate.go delete mode 100644 vendor/github.com/miekg/dns/go.mod delete mode 100644 vendor/github.com/miekg/dns/go.sum delete mode 100644 vendor/github.com/miekg/dns/labels.go delete mode 100644 vendor/github.com/miekg/dns/listen_go111.go delete mode 100644 vendor/github.com/miekg/dns/listen_go_not111.go delete mode 100644 vendor/github.com/miekg/dns/msg.go delete mode 100644 vendor/github.com/miekg/dns/msg_helpers.go delete mode 100644 vendor/github.com/miekg/dns/msg_truncate.go delete mode 100644 vendor/github.com/miekg/dns/nsecx.go delete mode 100644 vendor/github.com/miekg/dns/privaterr.go delete mode 100644 vendor/github.com/miekg/dns/reverse.go delete mode 100644 vendor/github.com/miekg/dns/sanitize.go delete mode 100644 vendor/github.com/miekg/dns/scan.go delete mode 100644 vendor/github.com/miekg/dns/scan_rr.go delete mode 100644 vendor/github.com/miekg/dns/serve_mux.go delete mode 100644 vendor/github.com/miekg/dns/server.go delete mode 100644 vendor/github.com/miekg/dns/sig0.go delete mode 100644 vendor/github.com/miekg/dns/singleinflight.go delete mode 100644 vendor/github.com/miekg/dns/smimea.go delete mode 100644 vendor/github.com/miekg/dns/tlsa.go delete mode 100644 vendor/github.com/miekg/dns/tsig.go delete mode 100644 vendor/github.com/miekg/dns/types.go delete mode 100644 vendor/github.com/miekg/dns/udp.go delete mode 100644 vendor/github.com/miekg/dns/udp_windows.go delete mode 100644 vendor/github.com/miekg/dns/update.go delete mode 100644 vendor/github.com/miekg/dns/version.go delete mode 100644 vendor/github.com/miekg/dns/xfr.go delete mode 100644 vendor/github.com/miekg/dns/zduplicate.go delete mode 100644 vendor/github.com/miekg/dns/zmsg.go delete mode 100644 vendor/github.com/miekg/dns/ztypes.go delete mode 100644 vendor/github.com/mitchellh/go-homedir/LICENSE delete mode 100644 vendor/github.com/mitchellh/go-homedir/README.md delete mode 100644 vendor/github.com/mitchellh/go-homedir/go.mod delete mode 100644 vendor/github.com/mitchellh/go-homedir/homedir.go delete mode 100644 vendor/github.com/modern-go/concurrent/.gitignore delete mode 100644 vendor/github.com/modern-go/concurrent/.travis.yml delete mode 100644 vendor/github.com/modern-go/concurrent/LICENSE delete mode 100644 vendor/github.com/modern-go/concurrent/README.md delete mode 100644 vendor/github.com/modern-go/concurrent/executor.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/log.go delete mode 100644 vendor/github.com/modern-go/concurrent/test.sh delete mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go delete mode 100644 vendor/github.com/modern-go/reflect2/.gitignore delete mode 100644 vendor/github.com/modern-go/reflect2/.travis.yml delete mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.lock delete mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.toml delete mode 100644 vendor/github.com/modern-go/reflect2/LICENSE delete mode 100644 vendor/github.com/modern-go/reflect2/README.md delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s delete mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go delete mode 100644 vendor/github.com/modern-go/reflect2/test.sh delete mode 100644 vendor/github.com/modern-go/reflect2/type_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go delete mode 100644 vendor/github.com/opencontainers/go-digest/.mailmap delete mode 100644 vendor/github.com/opencontainers/go-digest/.pullapprove.yml delete mode 100644 vendor/github.com/opencontainers/go-digest/.travis.yml delete mode 100644 vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md delete mode 100644 vendor/github.com/opencontainers/go-digest/LICENSE.code delete mode 100644 vendor/github.com/opencontainers/go-digest/LICENSE.docs delete mode 100644 vendor/github.com/opencontainers/go-digest/MAINTAINERS delete mode 100644 vendor/github.com/opencontainers/go-digest/README.md delete mode 100644 vendor/github.com/opencontainers/go-digest/algorithm.go delete mode 100644 vendor/github.com/opencontainers/go-digest/digest.go delete mode 100644 vendor/github.com/opencontainers/go-digest/digester.go delete mode 100644 vendor/github.com/opencontainers/go-digest/doc.go delete mode 100644 vendor/github.com/opencontainers/go-digest/verifiers.go delete mode 100644 vendor/github.com/pkg/errors/.gitignore delete mode 100644 vendor/github.com/pkg/errors/.travis.yml delete mode 100644 vendor/github.com/pkg/errors/LICENSE delete mode 100644 vendor/github.com/pkg/errors/Makefile delete mode 100644 vendor/github.com/pkg/errors/README.md delete mode 100644 vendor/github.com/pkg/errors/appveyor.yml delete mode 100644 vendor/github.com/pkg/errors/errors.go delete mode 100644 vendor/github.com/pkg/errors/go113.go delete mode 100644 vendor/github.com/pkg/errors/stack.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/.gitignore delete mode 100644 vendor/github.com/russross/blackfriday/v2/.travis.yml delete mode 100644 vendor/github.com/russross/blackfriday/v2/LICENSE.txt delete mode 100644 vendor/github.com/russross/blackfriday/v2/README.md delete mode 100644 vendor/github.com/russross/blackfriday/v2/block.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/doc.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/esc.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/go.mod delete mode 100644 vendor/github.com/russross/blackfriday/v2/html.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/inline.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/markdown.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/node.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/smartypants.go delete mode 100644 vendor/github.com/sdslabs/gin-jwt/.drone.yml delete mode 100644 vendor/github.com/sdslabs/gin-jwt/.editorconfig delete mode 100644 vendor/github.com/sdslabs/gin-jwt/.gitignore delete mode 100644 vendor/github.com/sdslabs/gin-jwt/.revive.toml delete mode 100644 vendor/github.com/sdslabs/gin-jwt/LICENSE delete mode 100644 vendor/github.com/sdslabs/gin-jwt/Makefile delete mode 100644 vendor/github.com/sdslabs/gin-jwt/README.md delete mode 100644 vendor/github.com/sdslabs/gin-jwt/auth_jwt.go delete mode 100644 vendor/github.com/sdslabs/gin-jwt/go.mod delete mode 100644 vendor/github.com/sdslabs/gin-jwt/go.sum delete mode 100644 vendor/github.com/sergi/go-diff/AUTHORS delete mode 100644 vendor/github.com/sergi/go-diff/CONTRIBUTORS delete mode 100644 vendor/github.com/sergi/go-diff/LICENSE delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/match.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/mathutil.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go delete mode 100644 vendor/github.com/shurcooL/sanitized_anchor_name/.travis.yml delete mode 100644 vendor/github.com/shurcooL/sanitized_anchor_name/LICENSE delete mode 100644 vendor/github.com/shurcooL/sanitized_anchor_name/README.md delete mode 100644 vendor/github.com/shurcooL/sanitized_anchor_name/go.mod delete mode 100644 vendor/github.com/shurcooL/sanitized_anchor_name/main.go delete mode 100644 vendor/github.com/src-d/gcfg/LICENSE delete mode 100644 vendor/github.com/src-d/gcfg/README delete mode 100644 vendor/github.com/src-d/gcfg/doc.go delete mode 100644 vendor/github.com/src-d/gcfg/errors.go delete mode 100644 vendor/github.com/src-d/gcfg/go1_0.go delete mode 100644 vendor/github.com/src-d/gcfg/go1_2.go delete mode 100644 vendor/github.com/src-d/gcfg/read.go delete mode 100644 vendor/github.com/src-d/gcfg/scanner/errors.go delete mode 100644 vendor/github.com/src-d/gcfg/scanner/scanner.go delete mode 100644 vendor/github.com/src-d/gcfg/set.go delete mode 100644 vendor/github.com/src-d/gcfg/token/position.go delete mode 100644 vendor/github.com/src-d/gcfg/token/serialize.go delete mode 100644 vendor/github.com/src-d/gcfg/token/token.go delete mode 100644 vendor/github.com/src-d/gcfg/types/bool.go delete mode 100644 vendor/github.com/src-d/gcfg/types/doc.go delete mode 100644 vendor/github.com/src-d/gcfg/types/enum.go delete mode 100644 vendor/github.com/src-d/gcfg/types/int.go delete mode 100644 vendor/github.com/src-d/gcfg/types/scan.go delete mode 100644 vendor/github.com/ugorji/go/codec/0_importpath.go delete mode 100644 vendor/github.com/ugorji/go/codec/LICENSE delete mode 100644 vendor/github.com/ugorji/go/codec/binc.go delete mode 100644 vendor/github.com/ugorji/go/codec/build.sh delete mode 100644 vendor/github.com/ugorji/go/codec/cbor.go delete mode 100644 vendor/github.com/ugorji/go/codec/codecgen.go delete mode 100644 vendor/github.com/ugorji/go/codec/decode.go delete mode 100644 vendor/github.com/ugorji/go/codec/doc.go delete mode 100644 vendor/github.com/ugorji/go/codec/encode.go delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.not.go delete mode 100644 vendor/github.com/ugorji/go/codec/float.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-enc-chan.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen.go delete mode 100644 vendor/github.com/ugorji/go/codec/go.mod delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_gte_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_gte_go112.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_lt_go112.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper.s delete mode 100644 vendor/github.com/ugorji/go/codec/helper_internal.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_not_unsafe.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe.go delete mode 100644 vendor/github.com/ugorji/go/codec/json.go delete mode 100644 vendor/github.com/ugorji/go/codec/mammoth-test.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/mammoth2-test.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/msgpack.go delete mode 100644 vendor/github.com/ugorji/go/codec/prebuild.go delete mode 100644 vendor/github.com/ugorji/go/codec/reader.go delete mode 100644 vendor/github.com/ugorji/go/codec/register_ext.go delete mode 100644 vendor/github.com/ugorji/go/codec/rpc.go delete mode 100644 vendor/github.com/ugorji/go/codec/simple.go delete mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/test-cbor-goldens.json delete mode 100644 vendor/github.com/ugorji/go/codec/test.py delete mode 100644 vendor/github.com/ugorji/go/codec/writer.go delete mode 100644 vendor/github.com/urfave/cli/.flake8 delete mode 100644 vendor/github.com/urfave/cli/.gitignore delete mode 100644 vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/urfave/cli/LICENSE delete mode 100644 vendor/github.com/urfave/cli/README.md delete mode 100644 vendor/github.com/urfave/cli/app.go delete mode 100644 vendor/github.com/urfave/cli/appveyor.yml delete mode 100644 vendor/github.com/urfave/cli/category.go delete mode 100644 vendor/github.com/urfave/cli/cli.go delete mode 100644 vendor/github.com/urfave/cli/command.go delete mode 100644 vendor/github.com/urfave/cli/context.go delete mode 100644 vendor/github.com/urfave/cli/docs.go delete mode 100644 vendor/github.com/urfave/cli/errors.go delete mode 100644 vendor/github.com/urfave/cli/fish.go delete mode 100644 vendor/github.com/urfave/cli/flag.go delete mode 100644 vendor/github.com/urfave/cli/flag_bool.go delete mode 100644 vendor/github.com/urfave/cli/flag_bool_t.go delete mode 100644 vendor/github.com/urfave/cli/flag_duration.go delete mode 100644 vendor/github.com/urfave/cli/flag_float64.go delete mode 100644 vendor/github.com/urfave/cli/flag_generic.go delete mode 100644 vendor/github.com/urfave/cli/flag_int.go delete mode 100644 vendor/github.com/urfave/cli/flag_int64.go delete mode 100644 vendor/github.com/urfave/cli/flag_int64_slice.go delete mode 100644 vendor/github.com/urfave/cli/flag_int_slice.go delete mode 100644 vendor/github.com/urfave/cli/flag_string.go delete mode 100644 vendor/github.com/urfave/cli/flag_string_slice.go delete mode 100644 vendor/github.com/urfave/cli/flag_uint.go delete mode 100644 vendor/github.com/urfave/cli/flag_uint64.go delete mode 100644 vendor/github.com/urfave/cli/funcs.go delete mode 100644 vendor/github.com/urfave/cli/go.mod delete mode 100644 vendor/github.com/urfave/cli/go.sum delete mode 100644 vendor/github.com/urfave/cli/help.go delete mode 100644 vendor/github.com/urfave/cli/parse.go delete mode 100644 vendor/github.com/urfave/cli/sort.go delete mode 100644 vendor/github.com/urfave/cli/template.go delete mode 100644 vendor/github.com/xanzy/ssh-agent/.gitignore delete mode 100644 vendor/github.com/xanzy/ssh-agent/LICENSE delete mode 100644 vendor/github.com/xanzy/ssh-agent/README.md delete mode 100644 vendor/github.com/xanzy/ssh-agent/go.mod delete mode 100644 vendor/github.com/xanzy/ssh-agent/go.sum delete mode 100644 vendor/github.com/xanzy/ssh-agent/pageant_windows.go delete mode 100644 vendor/github.com/xanzy/ssh-agent/sshagent.go delete mode 100644 vendor/github.com/xanzy/ssh-agent/sshagent_windows.go delete mode 100644 vendor/github.com/xdg/scram/.gitignore delete mode 100644 vendor/github.com/xdg/scram/.travis.yml delete mode 100644 vendor/github.com/xdg/scram/LICENSE delete mode 100644 vendor/github.com/xdg/scram/README.md delete mode 100644 vendor/github.com/xdg/scram/client.go delete mode 100644 vendor/github.com/xdg/scram/client_conv.go delete mode 100644 vendor/github.com/xdg/scram/common.go delete mode 100644 vendor/github.com/xdg/scram/doc.go delete mode 100644 vendor/github.com/xdg/scram/parse.go delete mode 100644 vendor/github.com/xdg/scram/scram.go delete mode 100644 vendor/github.com/xdg/scram/server.go delete mode 100644 vendor/github.com/xdg/scram/server_conv.go delete mode 100644 vendor/github.com/xdg/stringprep/.gitignore delete mode 100644 vendor/github.com/xdg/stringprep/.travis.yml delete mode 100644 vendor/github.com/xdg/stringprep/LICENSE delete mode 100644 vendor/github.com/xdg/stringprep/README.md delete mode 100644 vendor/github.com/xdg/stringprep/bidi.go delete mode 100644 vendor/github.com/xdg/stringprep/doc.go delete mode 100644 vendor/github.com/xdg/stringprep/error.go delete mode 100644 vendor/github.com/xdg/stringprep/map.go delete mode 100644 vendor/github.com/xdg/stringprep/profile.go delete mode 100644 vendor/github.com/xdg/stringprep/saslprep.go delete mode 100644 vendor/github.com/xdg/stringprep/set.go delete mode 100644 vendor/github.com/xdg/stringprep/tables.go delete mode 100644 vendor/github.com/yudai/hcl/.gitignore delete mode 100644 vendor/github.com/yudai/hcl/LICENSE delete mode 100644 vendor/github.com/yudai/hcl/Makefile delete mode 100644 vendor/github.com/yudai/hcl/README.md delete mode 100644 vendor/github.com/yudai/hcl/decoder.go delete mode 100644 vendor/github.com/yudai/hcl/hcl.go delete mode 100644 vendor/github.com/yudai/hcl/hcl/lex.go delete mode 100644 vendor/github.com/yudai/hcl/hcl/object.go delete mode 100644 vendor/github.com/yudai/hcl/hcl/parse.go delete mode 100644 vendor/github.com/yudai/hcl/hcl/parse.y delete mode 100644 vendor/github.com/yudai/hcl/hcl/valuetype_string.go delete mode 100644 vendor/github.com/yudai/hcl/hcl/y.go delete mode 100644 vendor/github.com/yudai/hcl/json/lex.go delete mode 100644 vendor/github.com/yudai/hcl/json/parse.go delete mode 100644 vendor/github.com/yudai/hcl/json/parse.y delete mode 100644 vendor/github.com/yudai/hcl/json/y.go delete mode 100644 vendor/github.com/yudai/hcl/lex.go delete mode 100644 vendor/github.com/yudai/hcl/parse.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/LICENSE delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bson.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/byte_slice_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/empty_interface_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/map_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/slice_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/string_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/struct_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/time_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/uint_codec_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/copier.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/doc.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_reader.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_tables.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_wrappers.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_writer.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/json_scanner.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/mode.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/reader.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_writer.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsonrw/writer.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/bsontype/bsontype.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/decoder.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/doc.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/encoder.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/marshal.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/primitive/objectid.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/primitive/primitive.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/primitive_codecs.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/raw.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/raw_element.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/raw_value.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/registry.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/types.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/bson/unmarshal.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/event/monitoring.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/internal/const.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/internal/error.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/internal/semaphore.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/batch_cursor.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/bulk_write.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/bulk_write_models.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/change_stream.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/client.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/client_encryption.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/collection.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/crypt_retrievers.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/cursor.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/database.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/doc.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/errors.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/index_options_builder.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/index_view.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/mongo.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/mongocryptd.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/aggregateoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/autoencryptionoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/bulkwriteoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/changestreamoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/clientencryptionoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/clientoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/clientoptions_1_10.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/clientoptions_1_9.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/collectionoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/countoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/datakeyoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/dboptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/deleteoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/distinctoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/encryptoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/estimatedcountoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/findoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/gridfsoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/indexoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/insertoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/listcollectionsoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/listdatabasesoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/mongooptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/replaceoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/runcmdoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/sessionoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/transactionoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/options/updateoptions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/readconcern/readconcern.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/readpref/mode.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/readpref/options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/readpref/readpref.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/results.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/session.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/single_result.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/util.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/mongo/writeconcern/writeconcern.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/tag/tag.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/version/version.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/array.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/bsoncore.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/document.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/document_sequence.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/element.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/tables.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/value.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/constructor.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/document.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/element.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/mdocument.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/primitive_codecs.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/registry.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/bsonx/value.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/DESIGN.md delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/address/addr.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/auth.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/cred.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/default.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/doc.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/gssapi.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/gssapi_not_enabled.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/gssapi_not_supported.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss_wrapper.c delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/gss_wrapper.h delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/sspi.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/sspi_wrapper.c delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/internal/gssapi/sspi_wrapper.h delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/mongodbcr.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/plain.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/sasl.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/scram.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/util.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/auth/x509.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/batch_cursor.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/batches.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/compression.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/connstring/connstring.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/crypt.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/description.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/feature.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/server.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/server_kind.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/server_selector.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology_kind.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/version.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/version_range.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/dns/dns.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/driver.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/errors.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/legacy.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/list_collections_batch_cursor.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/binary.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/errors.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/errors_not_enabled.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/mongocrypt.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/mongocrypt_context.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/mongocrypt_context_not_enabled.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/mongocrypt_kms_context.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/mongocrypt_kms_context_not_enabled.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/mongocrypt_not_enabled.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/options/mongocrypt_context_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/options/mongocrypt_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/options/provider_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/mongocrypt/state.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/abort_transaction.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/abort_transaction.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/aggregate.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/aggregate.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/command.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/commit_transaction.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/commit_transaction.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/count.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/count.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/createIndexes.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/createIndexes.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/delete.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/delete.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/distinct.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/distinct.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/drop_collection.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/drop_collection.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/drop_database.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/drop_database.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/drop_indexes.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/drop_indexes.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/end_sessions.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/end_sessions.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/find.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/find.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/find_and_modify.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/find_and_modify.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/insert.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/insert.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/ismaster.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/listDatabases.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/listDatabases.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/list_collections.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/list_collections.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/list_indexes.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/list_indexes.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/operation.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/update.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation/update.toml delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/operation_legacy.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/session/client_session.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/session/cluster_clock.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/session/options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/session/server_session.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/session/session_pool.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/DESIGN.md delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/connection.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/connection_legacy.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/connection_legacy_command_metadata.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/connection_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/errors.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/fsm.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/pool.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/resource_pool.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/server.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/server_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/topology.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/topology_options.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/topology_options_1_10.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/topology/topology_options_1_9.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/uuid/uuid.go delete mode 100644 vendor/go.mongodb.org/mongo-driver/x/mongo/driver/wiremessage/wiremessage.go delete mode 100644 vendor/golang.org/x/crypto/AUTHORS delete mode 100644 vendor/golang.org/x/crypto/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/crypto/LICENSE delete mode 100644 vendor/golang.org/x/crypto/PATENTS delete mode 100644 vendor/golang.org/x/crypto/bcrypt/base64.go delete mode 100644 vendor/golang.org/x/crypto/bcrypt/bcrypt.go delete mode 100644 vendor/golang.org/x/crypto/blowfish/block.go delete mode 100644 vendor/golang.org/x/crypto/blowfish/cipher.go delete mode 100644 vendor/golang.org/x/crypto/blowfish/const.go delete mode 100644 vendor/golang.org/x/crypto/cast5/cast5.go delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_arm64.go delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_arm64.s delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_generic.go delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_noasm.go delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.go delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_s390x.go delete mode 100644 vendor/golang.org/x/crypto/chacha20/chacha_s390x.s delete mode 100644 vendor/golang.org/x/crypto/chacha20/xor.go delete mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519.go delete mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go delete mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s delete mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519_generic.go delete mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go delete mode 100644 vendor/golang.org/x/crypto/ed25519/ed25519.go delete mode 100644 vendor/golang.org/x/crypto/ed25519/ed25519_go113.go delete mode 100644 vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go delete mode 100644 vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go delete mode 100644 vendor/golang.org/x/crypto/internal/subtle/aliasing.go delete mode 100644 vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/armor/armor.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/armor/encode.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/canonical_text.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/errors/errors.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/keys.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/compressed.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/config.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/literal.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/ocfb.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/opaque.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/packet.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/private_key.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/public_key.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/reader.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/signature.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/userattribute.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/packet/userid.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/read.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/s2k/s2k.go delete mode 100644 vendor/golang.org/x/crypto/openpgp/write.go delete mode 100644 vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/bits_compat.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/bits_go1.13.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/mac_noasm.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/poly1305.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_amd64.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_amd64.s delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_generic.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_s390x.go delete mode 100644 vendor/golang.org/x/crypto/poly1305/sum_s390x.s delete mode 100644 vendor/golang.org/x/crypto/ssh/agent/client.go delete mode 100644 vendor/golang.org/x/crypto/ssh/agent/forward.go delete mode 100644 vendor/golang.org/x/crypto/ssh/agent/keyring.go delete mode 100644 vendor/golang.org/x/crypto/ssh/agent/server.go delete mode 100644 vendor/golang.org/x/crypto/ssh/buffer.go delete mode 100644 vendor/golang.org/x/crypto/ssh/certs.go delete mode 100644 vendor/golang.org/x/crypto/ssh/channel.go delete mode 100644 vendor/golang.org/x/crypto/ssh/cipher.go delete mode 100644 vendor/golang.org/x/crypto/ssh/client.go delete mode 100644 vendor/golang.org/x/crypto/ssh/client_auth.go delete mode 100644 vendor/golang.org/x/crypto/ssh/common.go delete mode 100644 vendor/golang.org/x/crypto/ssh/connection.go delete mode 100644 vendor/golang.org/x/crypto/ssh/doc.go delete mode 100644 vendor/golang.org/x/crypto/ssh/handshake.go delete mode 100644 vendor/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf/bcrypt_pbkdf.go delete mode 100644 vendor/golang.org/x/crypto/ssh/kex.go delete mode 100644 vendor/golang.org/x/crypto/ssh/keys.go delete mode 100644 vendor/golang.org/x/crypto/ssh/knownhosts/knownhosts.go delete mode 100644 vendor/golang.org/x/crypto/ssh/mac.go delete mode 100644 vendor/golang.org/x/crypto/ssh/messages.go delete mode 100644 vendor/golang.org/x/crypto/ssh/mux.go delete mode 100644 vendor/golang.org/x/crypto/ssh/server.go delete mode 100644 vendor/golang.org/x/crypto/ssh/session.go delete mode 100644 vendor/golang.org/x/crypto/ssh/ssh_gss.go delete mode 100644 vendor/golang.org/x/crypto/ssh/streamlocal.go delete mode 100644 vendor/golang.org/x/crypto/ssh/tcpip.go delete mode 100644 vendor/golang.org/x/crypto/ssh/transport.go delete mode 100644 vendor/golang.org/x/net/AUTHORS delete mode 100644 vendor/golang.org/x/net/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/net/LICENSE delete mode 100644 vendor/golang.org/x/net/PATENTS delete mode 100644 vendor/golang.org/x/net/bpf/asm.go delete mode 100644 vendor/golang.org/x/net/bpf/constants.go delete mode 100644 vendor/golang.org/x/net/bpf/doc.go delete mode 100644 vendor/golang.org/x/net/bpf/instructions.go delete mode 100644 vendor/golang.org/x/net/bpf/setter.go delete mode 100644 vendor/golang.org/x/net/bpf/vm.go delete mode 100644 vendor/golang.org/x/net/bpf/vm_instructions.go delete mode 100644 vendor/golang.org/x/net/context/context.go delete mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go delete mode 100644 vendor/golang.org/x/net/context/go17.go delete mode 100644 vendor/golang.org/x/net/context/go19.go delete mode 100644 vendor/golang.org/x/net/context/pre_go17.go delete mode 100644 vendor/golang.org/x/net/context/pre_go19.go delete mode 100644 vendor/golang.org/x/net/http/httpguts/guts.go delete mode 100644 vendor/golang.org/x/net/http/httpguts/httplex.go delete mode 100644 vendor/golang.org/x/net/http2/.gitignore delete mode 100644 vendor/golang.org/x/net/http2/Dockerfile delete mode 100644 vendor/golang.org/x/net/http2/Makefile delete mode 100644 vendor/golang.org/x/net/http2/README delete mode 100644 vendor/golang.org/x/net/http2/ciphers.go delete mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go delete mode 100644 vendor/golang.org/x/net/http2/databuffer.go delete mode 100644 vendor/golang.org/x/net/http2/errors.go delete mode 100644 vendor/golang.org/x/net/http2/flow.go delete mode 100644 vendor/golang.org/x/net/http2/frame.go delete mode 100644 vendor/golang.org/x/net/http2/go111.go delete mode 100644 vendor/golang.org/x/net/http2/gotrack.go delete mode 100644 vendor/golang.org/x/net/http2/headermap.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/encode.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/huffman.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/tables.go delete mode 100644 vendor/golang.org/x/net/http2/http2.go delete mode 100644 vendor/golang.org/x/net/http2/not_go111.go delete mode 100644 vendor/golang.org/x/net/http2/pipe.go delete mode 100644 vendor/golang.org/x/net/http2/server.go delete mode 100644 vendor/golang.org/x/net/http2/transport.go delete mode 100644 vendor/golang.org/x/net/http2/write.go delete mode 100644 vendor/golang.org/x/net/http2/writesched.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_priority.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_random.go delete mode 100644 vendor/golang.org/x/net/idna/idna10.0.0.go delete mode 100644 vendor/golang.org/x/net/idna/idna9.0.0.go delete mode 100644 vendor/golang.org/x/net/idna/punycode.go delete mode 100644 vendor/golang.org/x/net/idna/tables10.0.0.go delete mode 100644 vendor/golang.org/x/net/idna/tables11.0.0.go delete mode 100644 vendor/golang.org/x/net/idna/tables12.00.go delete mode 100644 vendor/golang.org/x/net/idna/tables9.0.0.go delete mode 100644 vendor/golang.org/x/net/idna/trie.go delete mode 100644 vendor/golang.org/x/net/idna/trieval.go delete mode 100644 vendor/golang.org/x/net/internal/iana/const.go delete mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr.go delete mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go delete mode 100644 vendor/golang.org/x/net/internal/socket/empty.s delete mode 100644 vendor/golang.org/x/net/internal/socket/error_unix.go delete mode 100644 vendor/golang.org/x/net/internal/socket/error_windows.go delete mode 100644 vendor/golang.org/x/net/internal/socket/iovec_32bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/iovec_64bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/iovec_stub.go delete mode 100644 vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go delete mode 100644 vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_bsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_openbsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go delete mode 100644 vendor/golang.org/x/net/internal/socket/msghdr_stub.go delete mode 100644 vendor/golang.org/x/net/internal/socket/norace.go delete mode 100644 vendor/golang.org/x/net/internal/socket/race.go delete mode 100644 vendor/golang.org/x/net/internal/socket/rawconn.go delete mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go delete mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_msg.go delete mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go delete mode 100644 vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go delete mode 100644 vendor/golang.org/x/net/internal/socket/socket.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_bsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_bsdvar.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_const_unix.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_darwin.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_dragonfly.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linkname.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_386.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_386.s delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_arm.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_arm64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mips64le.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_mipsle.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_s390x.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_linux_s390x.s delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_netbsd.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_posix.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_solaris.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_solaris_amd64.s delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_stub.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_unix.go delete mode 100644 vendor/golang.org/x/net/internal/socket/sys_windows.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_386.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go delete mode 100644 vendor/golang.org/x/net/internal/socks/client.go delete mode 100644 vendor/golang.org/x/net/internal/socks/socks.go delete mode 100644 vendor/golang.org/x/net/internal/timeseries/timeseries.go delete mode 100644 vendor/golang.org/x/net/ipv4/batch.go delete mode 100644 vendor/golang.org/x/net/ipv4/control.go delete mode 100644 vendor/golang.org/x/net/ipv4/control_bsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/control_pktinfo.go delete mode 100644 vendor/golang.org/x/net/ipv4/control_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/control_unix.go delete mode 100644 vendor/golang.org/x/net/ipv4/control_windows.go delete mode 100644 vendor/golang.org/x/net/ipv4/dgramopt.go delete mode 100644 vendor/golang.org/x/net/ipv4/doc.go delete mode 100644 vendor/golang.org/x/net/ipv4/endpoint.go delete mode 100644 vendor/golang.org/x/net/ipv4/genericopt.go delete mode 100644 vendor/golang.org/x/net/ipv4/header.go delete mode 100644 vendor/golang.org/x/net/ipv4/helper.go delete mode 100644 vendor/golang.org/x/net/ipv4/iana.go delete mode 100644 vendor/golang.org/x/net/ipv4/icmp.go delete mode 100644 vendor/golang.org/x/net/ipv4/icmp_linux.go delete mode 100644 vendor/golang.org/x/net/ipv4/icmp_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/packet.go delete mode 100644 vendor/golang.org/x/net/ipv4/payload.go delete mode 100644 vendor/golang.org/x/net/ipv4/payload_cmsg.go delete mode 100644 vendor/golang.org/x/net/ipv4/payload_nocmsg.go delete mode 100644 vendor/golang.org/x/net/ipv4/sockopt.go delete mode 100644 vendor/golang.org/x/net/ipv4/sockopt_posix.go delete mode 100644 vendor/golang.org/x/net/ipv4/sockopt_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_aix.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreq.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreqn.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_bpf.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_bpf_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_bsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_darwin.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_dragonfly.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_freebsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_linux.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_solaris.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_ssmreq.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_stub.go delete mode 100644 vendor/golang.org/x/net/ipv4/sys_windows.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_darwin.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_dragonfly.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_386.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_arm.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_netbsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_openbsd.go delete mode 100644 vendor/golang.org/x/net/ipv4/zsys_solaris.go delete mode 100644 vendor/golang.org/x/net/ipv6/batch.go delete mode 100644 vendor/golang.org/x/net/ipv6/control.go delete mode 100644 vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go delete mode 100644 vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go delete mode 100644 vendor/golang.org/x/net/ipv6/control_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/control_unix.go delete mode 100644 vendor/golang.org/x/net/ipv6/control_windows.go delete mode 100644 vendor/golang.org/x/net/ipv6/dgramopt.go delete mode 100644 vendor/golang.org/x/net/ipv6/doc.go delete mode 100644 vendor/golang.org/x/net/ipv6/endpoint.go delete mode 100644 vendor/golang.org/x/net/ipv6/genericopt.go delete mode 100644 vendor/golang.org/x/net/ipv6/header.go delete mode 100644 vendor/golang.org/x/net/ipv6/helper.go delete mode 100644 vendor/golang.org/x/net/ipv6/iana.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp_bsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp_linux.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp_solaris.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/icmp_windows.go delete mode 100644 vendor/golang.org/x/net/ipv6/payload.go delete mode 100644 vendor/golang.org/x/net/ipv6/payload_cmsg.go delete mode 100644 vendor/golang.org/x/net/ipv6/payload_nocmsg.go delete mode 100644 vendor/golang.org/x/net/ipv6/sockopt.go delete mode 100644 vendor/golang.org/x/net/ipv6/sockopt_posix.go delete mode 100644 vendor/golang.org/x/net/ipv6/sockopt_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_aix.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_asmreq.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_bpf.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_bpf_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_bsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_darwin.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_freebsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_linux.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_solaris.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_ssmreq.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_stub.go delete mode 100644 vendor/golang.org/x/net/ipv6/sys_windows.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_darwin.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_dragonfly.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_386.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_arm.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_netbsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_openbsd.go delete mode 100644 vendor/golang.org/x/net/ipv6/zsys_solaris.go delete mode 100644 vendor/golang.org/x/net/proxy/dial.go delete mode 100644 vendor/golang.org/x/net/proxy/direct.go delete mode 100644 vendor/golang.org/x/net/proxy/per_host.go delete mode 100644 vendor/golang.org/x/net/proxy/proxy.go delete mode 100644 vendor/golang.org/x/net/proxy/socks5.go delete mode 100644 vendor/golang.org/x/net/trace/events.go delete mode 100644 vendor/golang.org/x/net/trace/histogram.go delete mode 100644 vendor/golang.org/x/net/trace/trace.go delete mode 100644 vendor/golang.org/x/sync/AUTHORS delete mode 100644 vendor/golang.org/x/sync/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/sync/LICENSE delete mode 100644 vendor/golang.org/x/sync/PATENTS delete mode 100644 vendor/golang.org/x/sync/errgroup/errgroup.go delete mode 100644 vendor/golang.org/x/sync/semaphore/semaphore.go delete mode 100644 vendor/golang.org/x/sys/AUTHORS delete mode 100644 vendor/golang.org/x/sys/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/sys/LICENSE delete mode 100644 vendor/golang.org/x/sys/PATENTS delete mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s delete mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go delete mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s delete mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go delete mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go delete mode 100644 vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go delete mode 100644 vendor/golang.org/x/sys/unix/.gitignore delete mode 100644 vendor/golang.org/x/sys/unix/README.md delete mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/aliases.go delete mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/constants.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dirent.go delete mode 100644 vendor/golang.org/x/sys/unix/endian_big.go delete mode 100644 vendor/golang.org/x/sys/unix/endian_little.go delete mode 100644 vendor/golang.org/x/sys/unix/env_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go delete mode 100644 vendor/golang.org/x/sys/unix/fdset.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ioctl.go delete mode 100644 vendor/golang.org/x/sys/unix/mkall.sh delete mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh delete mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/race.go delete mode 100644 vendor/golang.org/x/sys/unix/race0.go delete mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go delete mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go delete mode 100644 vendor/golang.org/x/sys/unix/str.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.1_12.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_386.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/unix/timestruct.go delete mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/windows/aliases.go delete mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/empty.s delete mode 100644 vendor/golang.org/x/sys/windows/env_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/eventlog.go delete mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/mkerrors.bash delete mode 100644 vendor/golang.org/x/sys/windows/mkknownfolderids.bash delete mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go delete mode 100644 vendor/golang.org/x/sys/windows/race.go delete mode 100644 vendor/golang.org/x/sys/windows/race0.go delete mode 100644 vendor/golang.org/x/sys/windows/security_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/service.go delete mode 100644 vendor/golang.org/x/sys/windows/str.go delete mode 100644 vendor/golang.org/x/sys/windows/syscall.go delete mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm.go delete mode 100644 vendor/golang.org/x/sys/windows/zerrors_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/zknownfolderids_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go delete mode 100644 vendor/golang.org/x/text/AUTHORS delete mode 100644 vendor/golang.org/x/text/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/text/LICENSE delete mode 100644 vendor/golang.org/x/text/PATENTS delete mode 100644 vendor/golang.org/x/text/cases/cases.go delete mode 100644 vendor/golang.org/x/text/cases/context.go delete mode 100644 vendor/golang.org/x/text/cases/fold.go delete mode 100644 vendor/golang.org/x/text/cases/icu.go delete mode 100644 vendor/golang.org/x/text/cases/info.go delete mode 100644 vendor/golang.org/x/text/cases/map.go delete mode 100644 vendor/golang.org/x/text/cases/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/cases/tables11.0.0.go delete mode 100644 vendor/golang.org/x/text/cases/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/cases/trieval.go delete mode 100644 vendor/golang.org/x/text/internal/internal.go delete mode 100644 vendor/golang.org/x/text/internal/language/common.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/compact.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/language.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/parents.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/tables.go delete mode 100644 vendor/golang.org/x/text/internal/language/compact/tags.go delete mode 100644 vendor/golang.org/x/text/internal/language/compose.go delete mode 100644 vendor/golang.org/x/text/internal/language/coverage.go delete mode 100644 vendor/golang.org/x/text/internal/language/language.go delete mode 100644 vendor/golang.org/x/text/internal/language/lookup.go delete mode 100644 vendor/golang.org/x/text/internal/language/match.go delete mode 100644 vendor/golang.org/x/text/internal/language/parse.go delete mode 100644 vendor/golang.org/x/text/internal/language/tables.go delete mode 100644 vendor/golang.org/x/text/internal/language/tags.go delete mode 100644 vendor/golang.org/x/text/internal/match.go delete mode 100644 vendor/golang.org/x/text/internal/tag/tag.go delete mode 100644 vendor/golang.org/x/text/language/coverage.go delete mode 100644 vendor/golang.org/x/text/language/doc.go delete mode 100644 vendor/golang.org/x/text/language/go1_1.go delete mode 100644 vendor/golang.org/x/text/language/go1_2.go delete mode 100644 vendor/golang.org/x/text/language/language.go delete mode 100644 vendor/golang.org/x/text/language/match.go delete mode 100644 vendor/golang.org/x/text/language/parse.go delete mode 100644 vendor/golang.org/x/text/language/tables.go delete mode 100644 vendor/golang.org/x/text/language/tags.go delete mode 100644 vendor/golang.org/x/text/runes/cond.go delete mode 100644 vendor/golang.org/x/text/runes/runes.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go delete mode 100644 vendor/golang.org/x/text/secure/precis/class.go delete mode 100644 vendor/golang.org/x/text/secure/precis/context.go delete mode 100644 vendor/golang.org/x/text/secure/precis/doc.go delete mode 100644 vendor/golang.org/x/text/secure/precis/nickname.go delete mode 100644 vendor/golang.org/x/text/secure/precis/options.go delete mode 100644 vendor/golang.org/x/text/secure/precis/profile.go delete mode 100644 vendor/golang.org/x/text/secure/precis/profiles.go delete mode 100644 vendor/golang.org/x/text/secure/precis/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/secure/precis/tables11.0.0.go delete mode 100644 vendor/golang.org/x/text/secure/precis/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/secure/precis/transformer.go delete mode 100644 vendor/golang.org/x/text/secure/precis/trieval.go delete mode 100644 vendor/golang.org/x/text/transform/transform.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/composition.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/forminfo.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/input.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/iter.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/normalize.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/readwriter.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/tables11.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/transform.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/trie.go delete mode 100644 vendor/golang.org/x/text/width/kind_string.go delete mode 100644 vendor/golang.org/x/text/width/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/width/tables11.0.0.go delete mode 100644 vendor/golang.org/x/text/width/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/width/transform.go delete mode 100644 vendor/golang.org/x/text/width/trieval.go delete mode 100644 vendor/golang.org/x/text/width/width.go delete mode 100644 vendor/golang.org/x/xerrors/LICENSE delete mode 100644 vendor/golang.org/x/xerrors/PATENTS delete mode 100644 vendor/golang.org/x/xerrors/README delete mode 100644 vendor/golang.org/x/xerrors/adaptor.go delete mode 100644 vendor/golang.org/x/xerrors/codereview.cfg delete mode 100644 vendor/golang.org/x/xerrors/doc.go delete mode 100644 vendor/golang.org/x/xerrors/errors.go delete mode 100644 vendor/golang.org/x/xerrors/fmt.go delete mode 100644 vendor/golang.org/x/xerrors/format.go delete mode 100644 vendor/golang.org/x/xerrors/frame.go delete mode 100644 vendor/golang.org/x/xerrors/go.mod delete mode 100644 vendor/golang.org/x/xerrors/internal/internal.go delete mode 100644 vendor/golang.org/x/xerrors/wrap.go delete mode 100644 vendor/google.golang.org/genproto/LICENSE delete mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/status/status.pb.go delete mode 100644 vendor/google.golang.org/grpc/.travis.yml delete mode 100644 vendor/google.golang.org/grpc/AUTHORS delete mode 100644 vendor/google.golang.org/grpc/CODE-OF-CONDUCT.md delete mode 100644 vendor/google.golang.org/grpc/CONTRIBUTING.md delete mode 100644 vendor/google.golang.org/grpc/GOVERNANCE.md delete mode 100644 vendor/google.golang.org/grpc/LICENSE delete mode 100644 vendor/google.golang.org/grpc/MAINTAINERS.md delete mode 100644 vendor/google.golang.org/grpc/Makefile delete mode 100644 vendor/google.golang.org/grpc/README.md delete mode 100644 vendor/google.golang.org/grpc/attributes/attributes.go delete mode 100644 vendor/google.golang.org/grpc/backoff.go delete mode 100644 vendor/google.golang.org/grpc/backoff/backoff.go delete mode 100644 vendor/google.golang.org/grpc/balancer.go delete mode 100644 vendor/google.golang.org/grpc/balancer/balancer.go delete mode 100644 vendor/google.golang.org/grpc/balancer/base/balancer.go delete mode 100644 vendor/google.golang.org/grpc/balancer/base/base.go delete mode 100644 vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go delete mode 100644 vendor/google.golang.org/grpc/balancer_conn_wrappers.go delete mode 100644 vendor/google.golang.org/grpc/balancer_v1_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go delete mode 100644 vendor/google.golang.org/grpc/call.go delete mode 100644 vendor/google.golang.org/grpc/clientconn.go delete mode 100644 vendor/google.golang.org/grpc/codec.go delete mode 100644 vendor/google.golang.org/grpc/codegen.sh delete mode 100644 vendor/google.golang.org/grpc/codes/code_string.go delete mode 100644 vendor/google.golang.org/grpc/codes/codes.go delete mode 100644 vendor/google.golang.org/grpc/connectivity/connectivity.go delete mode 100644 vendor/google.golang.org/grpc/credentials/credentials.go delete mode 100644 vendor/google.golang.org/grpc/credentials/go12.go delete mode 100644 vendor/google.golang.org/grpc/credentials/internal/syscallconn.go delete mode 100644 vendor/google.golang.org/grpc/credentials/internal/syscallconn_appengine.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls.go delete mode 100644 vendor/google.golang.org/grpc/dialoptions.go delete mode 100644 vendor/google.golang.org/grpc/doc.go delete mode 100644 vendor/google.golang.org/grpc/encoding/encoding.go delete mode 100644 vendor/google.golang.org/grpc/encoding/proto/proto.go delete mode 100644 vendor/google.golang.org/grpc/go.mod delete mode 100644 vendor/google.golang.org/grpc/go.sum delete mode 100644 vendor/google.golang.org/grpc/grpclog/grpclog.go delete mode 100644 vendor/google.golang.org/grpc/grpclog/logger.go delete mode 100644 vendor/google.golang.org/grpc/grpclog/loggerv2.go delete mode 100644 vendor/google.golang.org/grpc/install_gae.sh delete mode 100644 vendor/google.golang.org/grpc/interceptor.go delete mode 100644 vendor/google.golang.org/grpc/internal/backoff/backoff.go delete mode 100644 vendor/google.golang.org/grpc/internal/balancerload/load.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/binarylog_testutil.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/env_config.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/method_logger.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/sink.go delete mode 100644 vendor/google.golang.org/grpc/internal/binarylog/util.go delete mode 100644 vendor/google.golang.org/grpc/internal/buffer/unbounded.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/funcs.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/logging.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/types.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/types_nonlinux.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/channelz/util_nonlinux.go delete mode 100644 vendor/google.golang.org/grpc/internal/envconfig/envconfig.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpclog/grpclog.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/event.go delete mode 100644 vendor/google.golang.org/grpc/internal/grpcutil/target.go delete mode 100644 vendor/google.golang.org/grpc/internal/internal.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/dns/go113.go delete mode 100644 vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go delete mode 100644 vendor/google.golang.org/grpc/internal/status/status.go delete mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/bdp_estimator.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/controlbuf.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/defaults.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/flowcontrol.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/handler_server.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_client.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/http2_server.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/http_util.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/log.go delete mode 100644 vendor/google.golang.org/grpc/internal/transport/transport.go delete mode 100644 vendor/google.golang.org/grpc/keepalive/keepalive.go delete mode 100644 vendor/google.golang.org/grpc/metadata/metadata.go delete mode 100644 vendor/google.golang.org/grpc/naming/dns_resolver.go delete mode 100644 vendor/google.golang.org/grpc/naming/naming.go delete mode 100644 vendor/google.golang.org/grpc/peer/peer.go delete mode 100644 vendor/google.golang.org/grpc/picker_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/pickfirst.go delete mode 100644 vendor/google.golang.org/grpc/preloader.go delete mode 100644 vendor/google.golang.org/grpc/proxy.go delete mode 100644 vendor/google.golang.org/grpc/resolver/resolver.go delete mode 100644 vendor/google.golang.org/grpc/resolver_conn_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/rpc_util.go delete mode 100644 vendor/google.golang.org/grpc/server.go delete mode 100644 vendor/google.golang.org/grpc/service_config.go delete mode 100644 vendor/google.golang.org/grpc/serviceconfig/serviceconfig.go delete mode 100644 vendor/google.golang.org/grpc/stats/handlers.go delete mode 100644 vendor/google.golang.org/grpc/stats/stats.go delete mode 100644 vendor/google.golang.org/grpc/status/status.go delete mode 100644 vendor/google.golang.org/grpc/stream.go delete mode 100644 vendor/google.golang.org/grpc/tap/tap.go delete mode 100644 vendor/google.golang.org/grpc/trace.go delete mode 100644 vendor/google.golang.org/grpc/version.go delete mode 100644 vendor/google.golang.org/grpc/vet.sh delete mode 100644 vendor/google.golang.org/protobuf/AUTHORS delete mode 100644 vendor/google.golang.org/protobuf/CONTRIBUTORS delete mode 100644 vendor/google.golang.org/protobuf/LICENSE delete mode 100644 vendor/google.golang.org/protobuf/PATENTS delete mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/decode.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/doc.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/prototext/encode.go delete mode 100644 vendor/google.golang.org/protobuf/encoding/protowire/wire.go delete mode 100644 vendor/google.golang.org/protobuf/internal/descfmt/stringer.go delete mode 100644 vendor/google.golang.org/protobuf/internal/descopts/options.go delete mode 100644 vendor/google.golang.org/protobuf/internal/detrand/rand.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/defval/default.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/doc.go delete mode 100644 vendor/google.golang.org/protobuf/internal/encoding/text/encode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/errors/errors.go delete mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go112.go delete mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go113.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/any_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/api_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/doc.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/duration_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/empty_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/field_mask_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/source_context_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/struct_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/timestamp_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/type_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldnum/wrappers_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/fieldsort/fieldsort.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/build.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go delete mode 100644 vendor/google.golang.org/protobuf/internal/filetype/build.go delete mode 100644 vendor/google.golang.org/protobuf/internal/flags/flags.go delete mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go delete mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go delete mode 100644 vendor/google.golang.org/protobuf/internal/genname/name.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/api_export.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/checkinit.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_extension.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_field.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_message.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_tables.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_list.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/convert_map.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/decode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/encode.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/enum.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/extension.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_export.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_file.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/legacy_message.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/merge_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/validate.go delete mode 100644 vendor/google.golang.org/protobuf/internal/impl/weak.go delete mode 100644 vendor/google.golang.org/protobuf/internal/mapsort/mapsort.go delete mode 100644 vendor/google.golang.org/protobuf/internal/pragma/pragma.go delete mode 100644 vendor/google.golang.org/protobuf/internal/set/ints.go delete mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings.go delete mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_pure.go delete mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go delete mode 100644 vendor/google.golang.org/protobuf/internal/version/version.go delete mode 100644 vendor/google.golang.org/protobuf/proto/checkinit.go delete mode 100644 vendor/google.golang.org/protobuf/proto/decode.go delete mode 100644 vendor/google.golang.org/protobuf/proto/decode_gen.go delete mode 100644 vendor/google.golang.org/protobuf/proto/doc.go delete mode 100644 vendor/google.golang.org/protobuf/proto/encode.go delete mode 100644 vendor/google.golang.org/protobuf/proto/encode_gen.go delete mode 100644 vendor/google.golang.org/protobuf/proto/equal.go delete mode 100644 vendor/google.golang.org/protobuf/proto/extension.go delete mode 100644 vendor/google.golang.org/protobuf/proto/merge.go delete mode 100644 vendor/google.golang.org/protobuf/proto/messageset.go delete mode 100644 vendor/google.golang.org/protobuf/proto/proto.go delete mode 100644 vendor/google.golang.org/protobuf/proto/proto_methods.go delete mode 100644 vendor/google.golang.org/protobuf/proto/proto_reflect.go delete mode 100644 vendor/google.golang.org/protobuf/proto/reset.go delete mode 100644 vendor/google.golang.org/protobuf/proto/size.go delete mode 100644 vendor/google.golang.org/protobuf/proto/size_gen.go delete mode 100644 vendor/google.golang.org/protobuf/proto/wrappers.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/type.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go delete mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go delete mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/methods.go delete mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go delete mode 100644 vendor/google.golang.org/protobuf/runtime/protoimpl/version.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go 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 delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/.gitignore delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/.travis.yml delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/DCO delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/LICENSE delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/MAINTAINERS delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/Makefile delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/README.md delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/appveyor.yml delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/fs.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/go.mod delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/go.sum delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/helper/chroot/chroot.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/helper/polyfill/polyfill.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/osfs/os.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/osfs/os_posix.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/osfs/os_windows.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/util/glob.go delete mode 100644 vendor/gopkg.in/src-d/go-billy.v4/util/util.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/.gitignore delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/.travis.yml delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/CODE_OF_CONDUCT.md delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/COMPATIBILITY.md delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/CONTRIBUTING.md delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/DCO delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/LICENSE delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/MAINTAINERS delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/Makefile delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/README.md delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/appveyor.yml delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/blame.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/config/branch.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/config/config.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/config/modules.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/config/refspec.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/go.mod delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/go.sum delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/internal/revision/parser.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/internal/revision/scanner.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/internal/revision/token.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/internal/url/url.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/object_walker.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/options.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/buffer_lru.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/cache/object_lru.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/error.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/filemode/filemode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/config/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/config/decoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/config/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/config/encoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/config/option.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/config/section.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/diff/patch.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/diff/unified_encoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/gitignore/dir.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/gitignore/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/gitignore/matcher.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/gitignore/pattern.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/decoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/encoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/idxfile.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/idxfile/writer.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/decoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/encoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/index.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/index/match.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/objfile/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/objfile/reader.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/objfile/writer.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_index.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/encoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/error.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/fsobject.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/object_pack.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/packfile.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/parser.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/patch_delta.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/scanner.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/pktline/encoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/format/pktline/scanner.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/hash.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/memory.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/blob.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/change.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/change_adaptor.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_bfs_filtered.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_ctime.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/commit_walker_file.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/difftree.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/file.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/merge_base.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/object.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/patch.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tag.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/tree.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/object/treenoder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs_decode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/advrefs_encode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/capability/capability.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/capability/list.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/report_status.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/shallowupd.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/sideband/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/sideband/demux.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/sideband/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/sideband/muxer.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/srvresp.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/ulreq.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/ulreq_decode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/ulreq_encode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq_decode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/updreq_encode.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/uppackreq.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/uppackresp.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/reference.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/revision.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/revlist/revlist.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/index.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/object.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/reference.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/shallow.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/storer/storer.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/client/client.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/file/client.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/file/server.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/git/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/receive_pack.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/http/upload_pack.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/internal/common/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/internal/common/server.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/loader.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/server/server.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/auth_method.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/plumbing/transport/ssh/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/prune.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/references.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/remote.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/repository.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/status.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/config.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/deltaobject.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_rewrite_packed_refs.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/dotgit_setref.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit/writers.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/index.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/module.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/object.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/reference.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/shallow.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/filesystem/storage.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/memory/storage.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/storage/storer.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/submodule.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/binary/read.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/binary/write.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/diff/diff.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/ioutil/common.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/change.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/difftree.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/doc.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/doubleiter.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/filesystem/node.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/index/node.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/internal/frame/frame.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/iter.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/noder/noder.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/utils/merkletrie/noder/path.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree_bsd.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree_commit.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree_linux.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree_status.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree_unix_other.go delete mode 100644 vendor/gopkg.in/src-d/go-git.v4/worktree_windows.go delete mode 100644 vendor/gopkg.in/warnings.v0/LICENSE delete mode 100644 vendor/gopkg.in/warnings.v0/README delete mode 100644 vendor/gopkg.in/warnings.v0/warnings.go delete mode 100644 vendor/gopkg.in/yaml.v2/.travis.yml delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE.libyaml delete mode 100644 vendor/gopkg.in/yaml.v2/NOTICE delete mode 100644 vendor/gopkg.in/yaml.v2/README.md delete mode 100644 vendor/gopkg.in/yaml.v2/apic.go delete mode 100644 vendor/gopkg.in/yaml.v2/decode.go delete mode 100644 vendor/gopkg.in/yaml.v2/emitterc.go delete mode 100644 vendor/gopkg.in/yaml.v2/encode.go delete mode 100644 vendor/gopkg.in/yaml.v2/go.mod delete mode 100644 vendor/gopkg.in/yaml.v2/parserc.go delete mode 100644 vendor/gopkg.in/yaml.v2/readerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/resolve.go delete mode 100644 vendor/gopkg.in/yaml.v2/scannerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/sorter.go delete mode 100644 vendor/gopkg.in/yaml.v2/writerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/yaml.go delete mode 100644 vendor/gopkg.in/yaml.v2/yamlh.go delete mode 100644 vendor/gopkg.in/yaml.v2/yamlprivateh.go delete mode 100644 vendor/modules.txt diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore deleted file mode 100644 index 0cd38003..00000000 --- a/vendor/github.com/BurntSushi/toml/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -TAGS -tags -.*.swp -tomlcheck/tomlcheck -toml.test diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml deleted file mode 100644 index 8b8afc4f..00000000 --- a/vendor/github.com/BurntSushi/toml/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - tip -install: - - go install ./... - - go get github.com/BurntSushi/toml-test -script: - - export PATH="$PATH:$HOME/gopath/bin" - - make test diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE deleted file mode 100644 index 6efcfd0c..00000000 --- a/vendor/github.com/BurntSushi/toml/COMPATIBLE +++ /dev/null @@ -1,3 +0,0 @@ -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md) - diff --git a/vendor/github.com/BurntSushi/toml/COPYING b/vendor/github.com/BurntSushi/toml/COPYING deleted file mode 100644 index 01b57432..00000000 --- a/vendor/github.com/BurntSushi/toml/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 TOML authors - -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/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile deleted file mode 100644 index 3600848d..00000000 --- a/vendor/github.com/BurntSushi/toml/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -install: - go install ./... - -test: install - go test -v - toml-test toml-test-decoder - toml-test -encoder toml-test-encoder - -fmt: - gofmt -w *.go */*.go - colcheck *.go */*.go - -tags: - find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS - -push: - git push origin master - git push github master - diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md deleted file mode 100644 index 7c1b37ec..00000000 --- a/vendor/github.com/BurntSushi/toml/README.md +++ /dev/null @@ -1,218 +0,0 @@ -## TOML parser and encoder for Go with reflection - -TOML stands for Tom's Obvious, Minimal Language. This Go package provides a -reflection interface similar to Go's standard library `json` and `xml` -packages. This package also supports the `encoding.TextUnmarshaler` and -`encoding.TextMarshaler` interfaces so that you can define custom data -representations. (There is an example of this below.) - -Spec: https://github.com/toml-lang/toml - -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) - -Documentation: https://godoc.org/github.com/BurntSushi/toml - -Installation: - -```bash -go get github.com/BurntSushi/toml -``` - -Try the toml validator: - -```bash -go get github.com/BurntSushi/toml/cmd/tomlv -tomlv some-toml-file.toml -``` - -[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml) - -### Testing - -This package passes all tests in -[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder -and the encoder. - -### Examples - -This package works similarly to how the Go standard library handles `XML` -and `JSON`. Namely, data is loaded into Go values via reflection. - -For the simplest example, consider some TOML file as just a list of keys -and values: - -```toml -Age = 25 -Cats = [ "Cauchy", "Plato" ] -Pi = 3.14 -Perfection = [ 6, 28, 496, 8128 ] -DOB = 1987-07-05T05:45:00Z -``` - -Which could be defined in Go as: - -```go -type Config struct { - Age int - Cats []string - Pi float64 - Perfection []int - DOB time.Time // requires `import time` -} -``` - -And then decoded with: - -```go -var conf Config -if _, err := toml.Decode(tomlData, &conf); err != nil { - // handle error -} -``` - -You can also use struct tags if your struct field name doesn't map to a TOML -key value directly: - -```toml -some_key_NAME = "wat" -``` - -```go -type TOML struct { - ObscureKey string `toml:"some_key_NAME"` -} -``` - -### Using the `encoding.TextUnmarshaler` interface - -Here's an example that automatically parses duration strings into -`time.Duration` values: - -```toml -[[song]] -name = "Thunder Road" -duration = "4m49s" - -[[song]] -name = "Stairway to Heaven" -duration = "8m03s" -``` - -Which can be decoded with: - -```go -type song struct { - Name string - Duration duration -} -type songs struct { - Song []song -} -var favorites songs -if _, err := toml.Decode(blob, &favorites); err != nil { - log.Fatal(err) -} - -for _, s := range favorites.Song { - fmt.Printf("%s (%s)\n", s.Name, s.Duration) -} -``` - -And you'll also need a `duration` type that satisfies the -`encoding.TextUnmarshaler` interface: - -```go -type duration struct { - time.Duration -} - -func (d *duration) UnmarshalText(text []byte) error { - var err error - d.Duration, err = time.ParseDuration(string(text)) - return err -} -``` - -### More complex usage - -Here's an example of how to load the example from the official spec page: - -```toml -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Tom Preston-Werner" -organization = "GitHub" -bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." -dob = 1979-05-27T07:32:00Z # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it - -# Line breaks are OK when inside arrays -hosts = [ - "alpha", - "omega" -] -``` - -And the corresponding Go types are: - -```go -type tomlConfig struct { - Title string - Owner ownerInfo - DB database `toml:"database"` - Servers map[string]server - Clients clients -} - -type ownerInfo struct { - Name string - Org string `toml:"organization"` - Bio string - DOB time.Time -} - -type database struct { - Server string - Ports []int - ConnMax int `toml:"connection_max"` - Enabled bool -} - -type server struct { - IP string - DC string -} - -type clients struct { - Data [][]interface{} - Hosts []string -} -``` - -Note that a case insensitive match will be tried if an exact match can't be -found. - -A working example of the above can be found in `_examples/example.{go,toml}`. diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go deleted file mode 100644 index b0fd51d5..00000000 --- a/vendor/github.com/BurntSushi/toml/decode.go +++ /dev/null @@ -1,509 +0,0 @@ -package toml - -import ( - "fmt" - "io" - "io/ioutil" - "math" - "reflect" - "strings" - "time" -) - -func e(format string, args ...interface{}) error { - return fmt.Errorf("toml: "+format, args...) -} - -// Unmarshaler is the interface implemented by objects that can unmarshal a -// TOML description of themselves. -type Unmarshaler interface { - UnmarshalTOML(interface{}) error -} - -// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. -func Unmarshal(p []byte, v interface{}) error { - _, err := Decode(string(p), v) - return err -} - -// Primitive is a TOML value that hasn't been decoded into a Go value. -// When using the various `Decode*` functions, the type `Primitive` may -// be given to any value, and its decoding will be delayed. -// -// A `Primitive` value can be decoded using the `PrimitiveDecode` function. -// -// The underlying representation of a `Primitive` value is subject to change. -// Do not rely on it. -// -// N.B. Primitive values are still parsed, so using them will only avoid -// the overhead of reflection. They can be useful when you don't know the -// exact type of TOML data until run time. -type Primitive struct { - undecoded interface{} - context Key -} - -// DEPRECATED! -// -// Use MetaData.PrimitiveDecode instead. -func PrimitiveDecode(primValue Primitive, v interface{}) error { - md := MetaData{decoded: make(map[string]bool)} - return md.unify(primValue.undecoded, rvalue(v)) -} - -// PrimitiveDecode is just like the other `Decode*` functions, except it -// decodes a TOML value that has already been parsed. Valid primitive values -// can *only* be obtained from values filled by the decoder functions, -// including this method. (i.e., `v` may contain more `Primitive` -// values.) -// -// Meta data for primitive values is included in the meta data returned by -// the `Decode*` functions with one exception: keys returned by the Undecoded -// method will only reflect keys that were decoded. Namely, any keys hidden -// behind a Primitive will be considered undecoded. Executing this method will -// update the undecoded keys in the meta data. (See the example.) -func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { - md.context = primValue.context - defer func() { md.context = nil }() - return md.unify(primValue.undecoded, rvalue(v)) -} - -// Decode will decode the contents of `data` in TOML format into a pointer -// `v`. -// -// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be -// used interchangeably.) -// -// TOML arrays of tables correspond to either a slice of structs or a slice -// of maps. -// -// TOML datetimes correspond to Go `time.Time` values. -// -// All other TOML types (float, string, int, bool and array) correspond -// to the obvious Go types. -// -// An exception to the above rules is if a type implements the -// encoding.TextUnmarshaler interface. In this case, any primitive TOML value -// (floats, strings, integers, booleans and datetimes) will be converted to -// a byte string and given to the value's UnmarshalText method. See the -// Unmarshaler example for a demonstration with time duration strings. -// -// Key mapping -// -// TOML keys can map to either keys in a Go map or field names in a Go -// struct. The special `toml` struct tag may be used to map TOML keys to -// struct fields that don't match the key name exactly. (See the example.) -// A case insensitive match to struct names will be tried if an exact match -// can't be found. -// -// The mapping between TOML values and Go values is loose. That is, there -// may exist TOML values that cannot be placed into your representation, and -// there may be parts of your representation that do not correspond to -// TOML values. This loose mapping can be made stricter by using the IsDefined -// and/or Undecoded methods on the MetaData returned. -// -// This decoder will not handle cyclic types. If a cyclic type is passed, -// `Decode` will not terminate. -func Decode(data string, v interface{}) (MetaData, error) { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr { - return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v)) - } - if rv.IsNil() { - return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v)) - } - p, err := parse(data) - if err != nil { - return MetaData{}, err - } - md := MetaData{ - p.mapping, p.types, p.ordered, - make(map[string]bool, len(p.ordered)), nil, - } - return md, md.unify(p.mapping, indirect(rv)) -} - -// DecodeFile is just like Decode, except it will automatically read the -// contents of the file at `fpath` and decode it for you. -func DecodeFile(fpath string, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadFile(fpath) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// DecodeReader is just like Decode, except it will consume all bytes -// from the reader and decode it for you. -func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadAll(r) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// unify performs a sort of type unification based on the structure of `rv`, -// which is the client representation. -// -// Any type mismatch produces an error. Finding a type that we don't know -// how to handle produces an unsupported type error. -func (md *MetaData) unify(data interface{}, rv reflect.Value) error { - - // Special case. Look for a `Primitive` value. - if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { - // Save the undecoded data and the key context into the primitive - // value. - context := make(Key, len(md.context)) - copy(context, md.context) - rv.Set(reflect.ValueOf(Primitive{ - undecoded: data, - context: context, - })) - return nil - } - - // Special case. Unmarshaler Interface support. - if rv.CanAddr() { - if v, ok := rv.Addr().Interface().(Unmarshaler); ok { - return v.UnmarshalTOML(data) - } - } - - // Special case. Handle time.Time values specifically. - // TODO: Remove this code when we decide to drop support for Go 1.1. - // This isn't necessary in Go 1.2 because time.Time satisfies the encoding - // interfaces. - if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { - return md.unifyDatetime(data, rv) - } - - // Special case. Look for a value satisfying the TextUnmarshaler interface. - if v, ok := rv.Interface().(TextUnmarshaler); ok { - return md.unifyText(data, v) - } - // BUG(burntsushi) - // The behavior here is incorrect whenever a Go type satisfies the - // encoding.TextUnmarshaler interface but also corresponds to a TOML - // hash or array. In particular, the unmarshaler should only be applied - // to primitive TOML values. But at this point, it will be applied to - // all kinds of values and produce an incorrect error whenever those values - // are hashes or arrays (including arrays of tables). - - k := rv.Kind() - - // laziness - if k >= reflect.Int && k <= reflect.Uint64 { - return md.unifyInt(data, rv) - } - switch k { - case reflect.Ptr: - elem := reflect.New(rv.Type().Elem()) - err := md.unify(data, reflect.Indirect(elem)) - if err != nil { - return err - } - rv.Set(elem) - return nil - case reflect.Struct: - return md.unifyStruct(data, rv) - case reflect.Map: - return md.unifyMap(data, rv) - case reflect.Array: - return md.unifyArray(data, rv) - case reflect.Slice: - return md.unifySlice(data, rv) - case reflect.String: - return md.unifyString(data, rv) - case reflect.Bool: - return md.unifyBool(data, rv) - case reflect.Interface: - // we only support empty interfaces. - if rv.NumMethod() > 0 { - return e("unsupported type %s", rv.Type()) - } - return md.unifyAnything(data, rv) - case reflect.Float32: - fallthrough - case reflect.Float64: - return md.unifyFloat64(data, rv) - } - return e("unsupported type %s", rv.Kind()) -} - -func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if mapping == nil { - return nil - } - return e("type mismatch for %s: expected table but found %T", - rv.Type().String(), mapping) - } - - for key, datum := range tmap { - var f *field - fields := cachedTypeFields(rv.Type()) - for i := range fields { - ff := &fields[i] - if ff.name == key { - f = ff - break - } - if f == nil && strings.EqualFold(ff.name, key) { - f = ff - } - } - if f != nil { - subv := rv - for _, i := range f.index { - subv = indirect(subv.Field(i)) - } - if isUnifiable(subv) { - md.decoded[md.context.add(key).String()] = true - md.context = append(md.context, key) - if err := md.unify(datum, subv); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - } else if f.name != "" { - // Bad user! No soup for you! - return e("cannot write unexported field %s.%s", - rv.Type().String(), f.name) - } - } - } - return nil -} - -func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if tmap == nil { - return nil - } - return badtype("map", mapping) - } - if rv.IsNil() { - rv.Set(reflect.MakeMap(rv.Type())) - } - for k, v := range tmap { - md.decoded[md.context.add(k).String()] = true - md.context = append(md.context, k) - - rvkey := indirect(reflect.New(rv.Type().Key())) - rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) - if err := md.unify(v, rvval); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - - rvkey.SetString(k) - rv.SetMapIndex(rvkey, rvval) - } - return nil -} - -func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - sliceLen := datav.Len() - if sliceLen != rv.Len() { - return e("expected array length %d; got TOML array of length %d", - rv.Len(), sliceLen) - } - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - n := datav.Len() - if rv.IsNil() || rv.Cap() < n { - rv.Set(reflect.MakeSlice(rv.Type(), n, n)) - } - rv.SetLen(n) - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { - sliceLen := data.Len() - for i := 0; i < sliceLen; i++ { - v := data.Index(i).Interface() - sliceval := indirect(rv.Index(i)) - if err := md.unify(v, sliceval); err != nil { - return err - } - } - return nil -} - -func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { - if _, ok := data.(time.Time); ok { - rv.Set(reflect.ValueOf(data)) - return nil - } - return badtype("time.Time", data) -} - -func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { - if s, ok := data.(string); ok { - rv.SetString(s) - return nil - } - return badtype("string", data) -} - -func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { - if num, ok := data.(float64); ok { - switch rv.Kind() { - case reflect.Float32: - fallthrough - case reflect.Float64: - rv.SetFloat(num) - default: - panic("bug") - } - return nil - } - return badtype("float", data) -} - -func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { - if num, ok := data.(int64); ok { - if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { - switch rv.Kind() { - case reflect.Int, reflect.Int64: - // No bounds checking necessary. - case reflect.Int8: - if num < math.MinInt8 || num > math.MaxInt8 { - return e("value %d is out of range for int8", num) - } - case reflect.Int16: - if num < math.MinInt16 || num > math.MaxInt16 { - return e("value %d is out of range for int16", num) - } - case reflect.Int32: - if num < math.MinInt32 || num > math.MaxInt32 { - return e("value %d is out of range for int32", num) - } - } - rv.SetInt(num) - } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { - unum := uint64(num) - switch rv.Kind() { - case reflect.Uint, reflect.Uint64: - // No bounds checking necessary. - case reflect.Uint8: - if num < 0 || unum > math.MaxUint8 { - return e("value %d is out of range for uint8", num) - } - case reflect.Uint16: - if num < 0 || unum > math.MaxUint16 { - return e("value %d is out of range for uint16", num) - } - case reflect.Uint32: - if num < 0 || unum > math.MaxUint32 { - return e("value %d is out of range for uint32", num) - } - } - rv.SetUint(unum) - } else { - panic("unreachable") - } - return nil - } - return badtype("integer", data) -} - -func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { - if b, ok := data.(bool); ok { - rv.SetBool(b) - return nil - } - return badtype("boolean", data) -} - -func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { - rv.Set(reflect.ValueOf(data)) - return nil -} - -func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { - var s string - switch sdata := data.(type) { - case TextMarshaler: - text, err := sdata.MarshalText() - if err != nil { - return err - } - s = string(text) - case fmt.Stringer: - s = sdata.String() - case string: - s = sdata - case bool: - s = fmt.Sprintf("%v", sdata) - case int64: - s = fmt.Sprintf("%d", sdata) - case float64: - s = fmt.Sprintf("%f", sdata) - default: - return badtype("primitive (string-like)", data) - } - if err := v.UnmarshalText([]byte(s)); err != nil { - return err - } - return nil -} - -// rvalue returns a reflect.Value of `v`. All pointers are resolved. -func rvalue(v interface{}) reflect.Value { - return indirect(reflect.ValueOf(v)) -} - -// indirect returns the value pointed to by a pointer. -// Pointers are followed until the value is not a pointer. -// New values are allocated for each nil pointer. -// -// An exception to this rule is if the value satisfies an interface of -// interest to us (like encoding.TextUnmarshaler). -func indirect(v reflect.Value) reflect.Value { - if v.Kind() != reflect.Ptr { - if v.CanSet() { - pv := v.Addr() - if _, ok := pv.Interface().(TextUnmarshaler); ok { - return pv - } - } - return v - } - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - return indirect(reflect.Indirect(v)) -} - -func isUnifiable(rv reflect.Value) bool { - if rv.CanSet() { - return true - } - if _, ok := rv.Interface().(TextUnmarshaler); ok { - return true - } - return false -} - -func badtype(expected string, data interface{}) error { - return e("cannot load TOML value of type %T into a Go %s", data, expected) -} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go deleted file mode 100644 index b9914a67..00000000 --- a/vendor/github.com/BurntSushi/toml/decode_meta.go +++ /dev/null @@ -1,121 +0,0 @@ -package toml - -import "strings" - -// MetaData allows access to meta information about TOML data that may not -// be inferrable via reflection. In particular, whether a key has been defined -// and the TOML type of a key. -type MetaData struct { - mapping map[string]interface{} - types map[string]tomlType - keys []Key - decoded map[string]bool - context Key // Used only during decoding. -} - -// IsDefined returns true if the key given exists in the TOML data. The key -// should be specified hierarchially. e.g., -// -// // access the TOML key 'a.b.c' -// IsDefined("a", "b", "c") -// -// IsDefined will return false if an empty key given. Keys are case sensitive. -func (md *MetaData) IsDefined(key ...string) bool { - if len(key) == 0 { - return false - } - - var hash map[string]interface{} - var ok bool - var hashOrVal interface{} = md.mapping - for _, k := range key { - if hash, ok = hashOrVal.(map[string]interface{}); !ok { - return false - } - if hashOrVal, ok = hash[k]; !ok { - return false - } - } - return true -} - -// Type returns a string representation of the type of the key specified. -// -// Type will return the empty string if given an empty key or a key that -// does not exist. Keys are case sensitive. -func (md *MetaData) Type(key ...string) string { - fullkey := strings.Join(key, ".") - if typ, ok := md.types[fullkey]; ok { - return typ.typeString() - } - return "" -} - -// Key is the type of any TOML key, including key groups. Use (MetaData).Keys -// to get values of this type. -type Key []string - -func (k Key) String() string { - return strings.Join(k, ".") -} - -func (k Key) maybeQuotedAll() string { - var ss []string - for i := range k { - ss = append(ss, k.maybeQuoted(i)) - } - return strings.Join(ss, ".") -} - -func (k Key) maybeQuoted(i int) string { - quote := false - for _, c := range k[i] { - if !isBareKeyChar(c) { - quote = true - break - } - } - if quote { - return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" - } - return k[i] -} - -func (k Key) add(piece string) Key { - newKey := make(Key, len(k)+1) - copy(newKey, k) - newKey[len(k)] = piece - return newKey -} - -// Keys returns a slice of every key in the TOML data, including key groups. -// Each key is itself a slice, where the first element is the top of the -// hierarchy and the last is the most specific. -// -// The list will have the same order as the keys appeared in the TOML data. -// -// All keys returned are non-empty. -func (md *MetaData) Keys() []Key { - return md.keys -} - -// Undecoded returns all keys that have not been decoded in the order in which -// they appear in the original TOML document. -// -// This includes keys that haven't been decoded because of a Primitive value. -// Once the Primitive value is decoded, the keys will be considered decoded. -// -// Also note that decoding into an empty interface will result in no decoding, -// and so no keys will be considered decoded. -// -// In this sense, the Undecoded keys correspond to keys in the TOML document -// that do not have a concrete type in your representation. -func (md *MetaData) Undecoded() []Key { - undecoded := make([]Key, 0, len(md.keys)) - for _, key := range md.keys { - if !md.decoded[key.String()] { - undecoded = append(undecoded, key) - } - } - return undecoded -} diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go deleted file mode 100644 index b371f396..00000000 --- a/vendor/github.com/BurntSushi/toml/doc.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Package toml provides facilities for decoding and encoding TOML configuration -files via reflection. There is also support for delaying decoding with -the Primitive type, and querying the set of keys in a TOML document with the -MetaData type. - -The specification implemented: https://github.com/toml-lang/toml - -The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify -whether a file is a valid TOML document. It can also be used to print the -type of each key in a TOML document. - -Testing - -There are two important types of tests used for this package. The first is -contained inside '*_test.go' files and uses the standard Go unit testing -framework. These tests are primarily devoted to holistically testing the -decoder and encoder. - -The second type of testing is used to verify the implementation's adherence -to the TOML specification. These tests have been factored into their own -project: https://github.com/BurntSushi/toml-test - -The reason the tests are in a separate project is so that they can be used by -any implementation of TOML. Namely, it is language agnostic. -*/ -package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go deleted file mode 100644 index d905c21a..00000000 --- a/vendor/github.com/BurntSushi/toml/encode.go +++ /dev/null @@ -1,568 +0,0 @@ -package toml - -import ( - "bufio" - "errors" - "fmt" - "io" - "reflect" - "sort" - "strconv" - "strings" - "time" -) - -type tomlEncodeError struct{ error } - -var ( - errArrayMixedElementTypes = errors.New( - "toml: cannot encode array with mixed element types") - errArrayNilElement = errors.New( - "toml: cannot encode array with nil element") - errNonString = errors.New( - "toml: cannot encode a map with non-string key type") - errAnonNonStruct = errors.New( - "toml: cannot encode an anonymous field that is not a struct") - errArrayNoTable = errors.New( - "toml: TOML array element cannot contain a table") - errNoKey = errors.New( - "toml: top-level values must be Go maps or structs") - errAnything = errors.New("") // used in testing -) - -var quotedReplacer = strings.NewReplacer( - "\t", "\\t", - "\n", "\\n", - "\r", "\\r", - "\"", "\\\"", - "\\", "\\\\", -) - -// Encoder controls the encoding of Go values to a TOML document to some -// io.Writer. -// -// The indentation level can be controlled with the Indent field. -type Encoder struct { - // A single indentation level. By default it is two spaces. - Indent string - - // hasWritten is whether we have written any output to w yet. - hasWritten bool - w *bufio.Writer -} - -// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer -// given. By default, a single indentation level is 2 spaces. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - w: bufio.NewWriter(w), - Indent: " ", - } -} - -// Encode writes a TOML representation of the Go value to the underlying -// io.Writer. If the value given cannot be encoded to a valid TOML document, -// then an error is returned. -// -// The mapping between Go values and TOML values should be precisely the same -// as for the Decode* functions. Similarly, the TextMarshaler interface is -// supported by encoding the resulting bytes as strings. (If you want to write -// arbitrary binary data then you will need to use something like base64 since -// TOML does not have any binary types.) -// -// When encoding TOML hashes (i.e., Go maps or structs), keys without any -// sub-hashes are encoded first. -// -// If a Go map is encoded, then its keys are sorted alphabetically for -// deterministic output. More control over this behavior may be provided if -// there is demand for it. -// -// Encoding Go values without a corresponding TOML representation---like map -// types with non-string keys---will cause an error to be returned. Similarly -// for mixed arrays/slices, arrays/slices with nil elements, embedded -// non-struct types and nested slices containing maps or structs. -// (e.g., [][]map[string]string is not allowed but []map[string]string is OK -// and so is []map[string][]string.) -func (enc *Encoder) Encode(v interface{}) error { - rv := eindirect(reflect.ValueOf(v)) - if err := enc.safeEncode(Key([]string{}), rv); err != nil { - return err - } - return enc.w.Flush() -} - -func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { - defer func() { - if r := recover(); r != nil { - if terr, ok := r.(tomlEncodeError); ok { - err = terr.error - return - } - panic(r) - } - }() - enc.encode(key, rv) - return nil -} - -func (enc *Encoder) encode(key Key, rv reflect.Value) { - // Special case. Time needs to be in ISO8601 format. - // Special case. If we can marshal the type to text, then we used that. - // Basically, this prevents the encoder for handling these types as - // generic structs (or whatever the underlying type of a TextMarshaler is). - switch rv.Interface().(type) { - case time.Time, TextMarshaler: - enc.keyEqElement(key, rv) - return - } - - k := rv.Kind() - switch k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64, - reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: - enc.keyEqElement(key, rv) - case reflect.Array, reflect.Slice: - if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { - enc.eArrayOfTables(key, rv) - } else { - enc.keyEqElement(key, rv) - } - case reflect.Interface: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Map: - if rv.IsNil() { - return - } - enc.eTable(key, rv) - case reflect.Ptr: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Struct: - enc.eTable(key, rv) - default: - panic(e("unsupported type for key '%s': %s", key, k)) - } -} - -// eElement encodes any value that can be an array element (primitives and -// arrays). -func (enc *Encoder) eElement(rv reflect.Value) { - switch v := rv.Interface().(type) { - case time.Time: - // Special case time.Time as a primitive. Has to come before - // TextMarshaler below because time.Time implements - // encoding.TextMarshaler, but we need to always use UTC. - enc.wf(v.UTC().Format("2006-01-02T15:04:05Z")) - return - case TextMarshaler: - // Special case. Use text marshaler if it's available for this value. - if s, err := v.MarshalText(); err != nil { - encPanic(err) - } else { - enc.writeQuoted(string(s)) - } - return - } - switch rv.Kind() { - case reflect.Bool: - enc.wf(strconv.FormatBool(rv.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64: - enc.wf(strconv.FormatInt(rv.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, - reflect.Uint32, reflect.Uint64: - enc.wf(strconv.FormatUint(rv.Uint(), 10)) - case reflect.Float32: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) - case reflect.Float64: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) - case reflect.Array, reflect.Slice: - enc.eArrayOrSliceElement(rv) - case reflect.Interface: - enc.eElement(rv.Elem()) - case reflect.String: - enc.writeQuoted(rv.String()) - default: - panic(e("unexpected primitive type: %s", rv.Kind())) - } -} - -// By the TOML spec, all floats must have a decimal with at least one -// number on either side. -func floatAddDecimal(fstr string) string { - if !strings.Contains(fstr, ".") { - return fstr + ".0" - } - return fstr -} - -func (enc *Encoder) writeQuoted(s string) { - enc.wf("\"%s\"", quotedReplacer.Replace(s)) -} - -func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { - length := rv.Len() - enc.wf("[") - for i := 0; i < length; i++ { - elem := rv.Index(i) - enc.eElement(elem) - if i != length-1 { - enc.wf(", ") - } - } - enc.wf("]") -} - -func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - for i := 0; i < rv.Len(); i++ { - trv := rv.Index(i) - if isNil(trv) { - continue - } - panicIfInvalidKey(key) - enc.newline() - enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - enc.eMapOrStruct(key, trv) - } -} - -func (enc *Encoder) eTable(key Key, rv reflect.Value) { - panicIfInvalidKey(key) - if len(key) == 1 { - // Output an extra newline between top-level tables. - // (The newline isn't written if nothing else has been written though.) - enc.newline() - } - if len(key) > 0 { - enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - } - enc.eMapOrStruct(key, rv) -} - -func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { - switch rv := eindirect(rv); rv.Kind() { - case reflect.Map: - enc.eMap(key, rv) - case reflect.Struct: - enc.eStruct(key, rv) - default: - panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) - } -} - -func (enc *Encoder) eMap(key Key, rv reflect.Value) { - rt := rv.Type() - if rt.Key().Kind() != reflect.String { - encPanic(errNonString) - } - - // Sort keys so that we have deterministic output. And write keys directly - // underneath this key first, before writing sub-structs or sub-maps. - var mapKeysDirect, mapKeysSub []string - for _, mapKey := range rv.MapKeys() { - k := mapKey.String() - if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { - mapKeysSub = append(mapKeysSub, k) - } else { - mapKeysDirect = append(mapKeysDirect, k) - } - } - - var writeMapKeys = func(mapKeys []string) { - sort.Strings(mapKeys) - for _, mapKey := range mapKeys { - mrv := rv.MapIndex(reflect.ValueOf(mapKey)) - if isNil(mrv) { - // Don't write anything for nil fields. - continue - } - enc.encode(key.add(mapKey), mrv) - } - } - writeMapKeys(mapKeysDirect) - writeMapKeys(mapKeysSub) -} - -func (enc *Encoder) eStruct(key Key, rv reflect.Value) { - // Write keys for fields directly under this key first, because if we write - // a field that creates a new table, then all keys under it will be in that - // table (not the one we're writing here). - rt := rv.Type() - var fieldsDirect, fieldsSub [][]int - var addFields func(rt reflect.Type, rv reflect.Value, start []int) - addFields = func(rt reflect.Type, rv reflect.Value, start []int) { - for i := 0; i < rt.NumField(); i++ { - f := rt.Field(i) - // skip unexported fields - if f.PkgPath != "" && !f.Anonymous { - continue - } - frv := rv.Field(i) - if f.Anonymous { - t := f.Type - switch t.Kind() { - case reflect.Struct: - // Treat anonymous struct fields with - // tag names as though they are not - // anonymous, like encoding/json does. - if getOptions(f.Tag).name == "" { - addFields(t, frv, f.Index) - continue - } - case reflect.Ptr: - if t.Elem().Kind() == reflect.Struct && - getOptions(f.Tag).name == "" { - if !frv.IsNil() { - addFields(t.Elem(), frv.Elem(), f.Index) - } - continue - } - // Fall through to the normal field encoding logic below - // for non-struct anonymous fields. - } - } - - if typeIsHash(tomlTypeOfGo(frv)) { - fieldsSub = append(fieldsSub, append(start, f.Index...)) - } else { - fieldsDirect = append(fieldsDirect, append(start, f.Index...)) - } - } - } - addFields(rt, rv, nil) - - var writeFields = func(fields [][]int) { - for _, fieldIndex := range fields { - sft := rt.FieldByIndex(fieldIndex) - sf := rv.FieldByIndex(fieldIndex) - if isNil(sf) { - // Don't write anything for nil fields. - continue - } - - opts := getOptions(sft.Tag) - if opts.skip { - continue - } - keyName := sft.Name - if opts.name != "" { - keyName = opts.name - } - if opts.omitempty && isEmpty(sf) { - continue - } - if opts.omitzero && isZero(sf) { - continue - } - - enc.encode(key.add(keyName), sf) - } - } - writeFields(fieldsDirect) - writeFields(fieldsSub) -} - -// tomlTypeName returns the TOML type name of the Go value's type. It is -// used to determine whether the types of array elements are mixed (which is -// forbidden). If the Go value is nil, then it is illegal for it to be an array -// element, and valueIsNil is returned as true. - -// Returns the TOML type of a Go value. The type may be `nil`, which means -// no concrete TOML type could be found. -func tomlTypeOfGo(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() { - return nil - } - switch rv.Kind() { - case reflect.Bool: - return tomlBool - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64: - return tomlInteger - case reflect.Float32, reflect.Float64: - return tomlFloat - case reflect.Array, reflect.Slice: - if typeEqual(tomlHash, tomlArrayType(rv)) { - return tomlArrayHash - } - return tomlArray - case reflect.Ptr, reflect.Interface: - return tomlTypeOfGo(rv.Elem()) - case reflect.String: - return tomlString - case reflect.Map: - return tomlHash - case reflect.Struct: - switch rv.Interface().(type) { - case time.Time: - return tomlDatetime - case TextMarshaler: - return tomlString - default: - return tomlHash - } - default: - panic("unexpected reflect.Kind: " + rv.Kind().String()) - } -} - -// tomlArrayType returns the element type of a TOML array. The type returned -// may be nil if it cannot be determined (e.g., a nil slice or a zero length -// slize). This function may also panic if it finds a type that cannot be -// expressed in TOML (such as nil elements, heterogeneous arrays or directly -// nested arrays of tables). -func tomlArrayType(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { - return nil - } - firstType := tomlTypeOfGo(rv.Index(0)) - if firstType == nil { - encPanic(errArrayNilElement) - } - - rvlen := rv.Len() - for i := 1; i < rvlen; i++ { - elem := rv.Index(i) - switch elemType := tomlTypeOfGo(elem); { - case elemType == nil: - encPanic(errArrayNilElement) - case !typeEqual(firstType, elemType): - encPanic(errArrayMixedElementTypes) - } - } - // If we have a nested array, then we must make sure that the nested - // array contains ONLY primitives. - // This checks arbitrarily nested arrays. - if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { - nest := tomlArrayType(eindirect(rv.Index(0))) - if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { - encPanic(errArrayNoTable) - } - } - return firstType -} - -type tagOptions struct { - skip bool // "-" - name string - omitempty bool - omitzero bool -} - -func getOptions(tag reflect.StructTag) tagOptions { - t := tag.Get("toml") - if t == "-" { - return tagOptions{skip: true} - } - var opts tagOptions - parts := strings.Split(t, ",") - opts.name = parts[0] - for _, s := range parts[1:] { - switch s { - case "omitempty": - opts.omitempty = true - case "omitzero": - opts.omitzero = true - } - } - return opts -} - -func isZero(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return rv.Uint() == 0 - case reflect.Float32, reflect.Float64: - return rv.Float() == 0.0 - } - return false -} - -func isEmpty(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Array, reflect.Slice, reflect.Map, reflect.String: - return rv.Len() == 0 - case reflect.Bool: - return !rv.Bool() - } - return false -} - -func (enc *Encoder) newline() { - if enc.hasWritten { - enc.wf("\n") - } -} - -func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - panicIfInvalidKey(key) - enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) - enc.eElement(val) - enc.newline() -} - -func (enc *Encoder) wf(format string, v ...interface{}) { - if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { - encPanic(err) - } - enc.hasWritten = true -} - -func (enc *Encoder) indentStr(key Key) string { - return strings.Repeat(enc.Indent, len(key)-1) -} - -func encPanic(err error) { - panic(tomlEncodeError{err}) -} - -func eindirect(v reflect.Value) reflect.Value { - switch v.Kind() { - case reflect.Ptr, reflect.Interface: - return eindirect(v.Elem()) - default: - return v - } -} - -func isNil(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return rv.IsNil() - default: - return false - } -} - -func panicIfInvalidKey(key Key) { - for _, k := range key { - if len(k) == 0 { - encPanic(e("Key '%s' is not a valid table name. Key names "+ - "cannot be empty.", key.maybeQuotedAll())) - } - } -} - -func isValidKeyName(s string) bool { - return len(s) != 0 -} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go deleted file mode 100644 index d36e1dd6..00000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.2 - -package toml - -// In order to support Go 1.1, we define our own TextMarshaler and -// TextUnmarshaler types. For Go 1.2+, we just alias them with the -// standard library interfaces. - -import ( - "encoding" -) - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler encoding.TextMarshaler - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go deleted file mode 100644 index e8d503d0..00000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !go1.2 - -package toml - -// These interfaces were introduced in Go 1.2, so we add them manually when -// compiling for Go 1.1. - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler interface { - MarshalText() (text []byte, err error) -} - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler interface { - UnmarshalText(text []byte) error -} diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go deleted file mode 100644 index e0a742a8..00000000 --- a/vendor/github.com/BurntSushi/toml/lex.go +++ /dev/null @@ -1,953 +0,0 @@ -package toml - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" -) - -type itemType int - -const ( - itemError itemType = iota - itemNIL // used in the parser to indicate no type - itemEOF - itemText - itemString - itemRawString - itemMultilineString - itemRawMultilineString - itemBool - itemInteger - itemFloat - itemDatetime - itemArray // the start of an array - itemArrayEnd - itemTableStart - itemTableEnd - itemArrayTableStart - itemArrayTableEnd - itemKeyStart - itemCommentStart - itemInlineTableStart - itemInlineTableEnd -) - -const ( - eof = 0 - comma = ',' - tableStart = '[' - tableEnd = ']' - arrayTableStart = '[' - arrayTableEnd = ']' - tableSep = '.' - keySep = '=' - arrayStart = '[' - arrayEnd = ']' - commentStart = '#' - stringStart = '"' - stringEnd = '"' - rawStringStart = '\'' - rawStringEnd = '\'' - inlineTableStart = '{' - inlineTableEnd = '}' -) - -type stateFn func(lx *lexer) stateFn - -type lexer struct { - input string - start int - pos int - line int - state stateFn - items chan item - - // Allow for backing up up to three runes. - // This is necessary because TOML contains 3-rune tokens (""" and '''). - prevWidths [3]int - nprev int // how many of prevWidths are in use - // If we emit an eof, we can still back up, but it is not OK to call - // next again. - atEOF bool - - // A stack of state functions used to maintain context. - // The idea is to reuse parts of the state machine in various places. - // For example, values can appear at the top level or within arbitrarily - // nested arrays. The last state on the stack is used after a value has - // been lexed. Similarly for comments. - stack []stateFn -} - -type item struct { - typ itemType - val string - line int -} - -func (lx *lexer) nextItem() item { - for { - select { - case item := <-lx.items: - return item - default: - lx.state = lx.state(lx) - } - } -} - -func lex(input string) *lexer { - lx := &lexer{ - input: input, - state: lexTop, - line: 1, - items: make(chan item, 10), - stack: make([]stateFn, 0, 10), - } - return lx -} - -func (lx *lexer) push(state stateFn) { - lx.stack = append(lx.stack, state) -} - -func (lx *lexer) pop() stateFn { - if len(lx.stack) == 0 { - return lx.errorf("BUG in lexer: no states to pop") - } - last := lx.stack[len(lx.stack)-1] - lx.stack = lx.stack[0 : len(lx.stack)-1] - return last -} - -func (lx *lexer) current() string { - return lx.input[lx.start:lx.pos] -} - -func (lx *lexer) emit(typ itemType) { - lx.items <- item{typ, lx.current(), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) emitTrim(typ itemType) { - lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) next() (r rune) { - if lx.atEOF { - panic("next called after EOF") - } - if lx.pos >= len(lx.input) { - lx.atEOF = true - return eof - } - - if lx.input[lx.pos] == '\n' { - lx.line++ - } - lx.prevWidths[2] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[0] - if lx.nprev < 3 { - lx.nprev++ - } - r, w := utf8.DecodeRuneInString(lx.input[lx.pos:]) - lx.prevWidths[0] = w - lx.pos += w - return r -} - -// ignore skips over the pending input before this point. -func (lx *lexer) ignore() { - lx.start = lx.pos -} - -// backup steps back one rune. Can be called only twice between calls to next. -func (lx *lexer) backup() { - if lx.atEOF { - lx.atEOF = false - return - } - if lx.nprev < 1 { - panic("backed up too far") - } - w := lx.prevWidths[0] - lx.prevWidths[0] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[2] - lx.nprev-- - lx.pos -= w - if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { - lx.line-- - } -} - -// accept consumes the next rune if it's equal to `valid`. -func (lx *lexer) accept(valid rune) bool { - if lx.next() == valid { - return true - } - lx.backup() - return false -} - -// peek returns but does not consume the next rune in the input. -func (lx *lexer) peek() rune { - r := lx.next() - lx.backup() - return r -} - -// skip ignores all input that matches the given predicate. -func (lx *lexer) skip(pred func(rune) bool) { - for { - r := lx.next() - if pred(r) { - continue - } - lx.backup() - lx.ignore() - return - } -} - -// errorf stops all lexing by emitting an error and returning `nil`. -// Note that any value that is a character is escaped if it's a special -// character (newlines, tabs, etc.). -func (lx *lexer) errorf(format string, values ...interface{}) stateFn { - lx.items <- item{ - itemError, - fmt.Sprintf(format, values...), - lx.line, - } - return nil -} - -// lexTop consumes elements at the top level of TOML data. -func lexTop(lx *lexer) stateFn { - r := lx.next() - if isWhitespace(r) || isNL(r) { - return lexSkip(lx, lexTop) - } - switch r { - case commentStart: - lx.push(lexTop) - return lexCommentStart - case tableStart: - return lexTableStart - case eof: - if lx.pos > lx.start { - return lx.errorf("unexpected EOF") - } - lx.emit(itemEOF) - return nil - } - - // At this point, the only valid item can be a key, so we back up - // and let the key lexer do the rest. - lx.backup() - lx.push(lexTopEnd) - return lexKeyStart -} - -// lexTopEnd is entered whenever a top-level item has been consumed. (A value -// or a table.) It must see only whitespace, and will turn back to lexTop -// upon a newline. If it sees EOF, it will quit the lexer successfully. -func lexTopEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case r == commentStart: - // a comment will read to a newline for us. - lx.push(lexTop) - return lexCommentStart - case isWhitespace(r): - return lexTopEnd - case isNL(r): - lx.ignore() - return lexTop - case r == eof: - lx.emit(itemEOF) - return nil - } - return lx.errorf("expected a top-level item to end with a newline, "+ - "comment, or EOF, but got %q instead", r) -} - -// lexTable lexes the beginning of a table. Namely, it makes sure that -// it starts with a character other than '.' and ']'. -// It assumes that '[' has already been consumed. -// It also handles the case that this is an item in an array of tables. -// e.g., '[[name]]'. -func lexTableStart(lx *lexer) stateFn { - if lx.peek() == arrayTableStart { - lx.next() - lx.emit(itemArrayTableStart) - lx.push(lexArrayTableEnd) - } else { - lx.emit(itemTableStart) - lx.push(lexTableEnd) - } - return lexTableNameStart -} - -func lexTableEnd(lx *lexer) stateFn { - lx.emit(itemTableEnd) - return lexTopEnd -} - -func lexArrayTableEnd(lx *lexer) stateFn { - if r := lx.next(); r != arrayTableEnd { - return lx.errorf("expected end of table array name delimiter %q, "+ - "but got %q instead", arrayTableEnd, r) - } - lx.emit(itemArrayTableEnd) - return lexTopEnd -} - -func lexTableNameStart(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.peek(); { - case r == tableEnd || r == eof: - return lx.errorf("unexpected end of table name " + - "(table names cannot be empty)") - case r == tableSep: - return lx.errorf("unexpected table separator " + - "(table names cannot be empty)") - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.push(lexTableNameEnd) - return lexValue // reuse string lexing - default: - return lexBareTableName - } -} - -// lexBareTableName lexes the name of a table. It assumes that at least one -// valid character for the table has already been read. -func lexBareTableName(lx *lexer) stateFn { - r := lx.next() - if isBareKeyChar(r) { - return lexBareTableName - } - lx.backup() - lx.emit(itemText) - return lexTableNameEnd -} - -// lexTableNameEnd reads the end of a piece of a table name, optionally -// consuming whitespace. -func lexTableNameEnd(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.next(); { - case isWhitespace(r): - return lexTableNameEnd - case r == tableSep: - lx.ignore() - return lexTableNameStart - case r == tableEnd: - return lx.pop() - default: - return lx.errorf("expected '.' or ']' to end table name, "+ - "but got %q instead", r) - } -} - -// lexKeyStart consumes a key name up until the first non-whitespace character. -// lexKeyStart will ignore whitespace. -func lexKeyStart(lx *lexer) stateFn { - r := lx.peek() - switch { - case r == keySep: - return lx.errorf("unexpected key separator %q", keySep) - case isWhitespace(r) || isNL(r): - lx.next() - return lexSkip(lx, lexKeyStart) - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.emit(itemKeyStart) - lx.push(lexKeyEnd) - return lexValue // reuse string lexing - default: - lx.ignore() - lx.emit(itemKeyStart) - return lexBareKey - } -} - -// lexBareKey consumes the text of a bare key. Assumes that the first character -// (which is not whitespace) has not yet been consumed. -func lexBareKey(lx *lexer) stateFn { - switch r := lx.next(); { - case isBareKeyChar(r): - return lexBareKey - case isWhitespace(r): - lx.backup() - lx.emit(itemText) - return lexKeyEnd - case r == keySep: - lx.backup() - lx.emit(itemText) - return lexKeyEnd - default: - return lx.errorf("bare keys cannot contain %q", r) - } -} - -// lexKeyEnd consumes the end of a key and trims whitespace (up to the key -// separator). -func lexKeyEnd(lx *lexer) stateFn { - switch r := lx.next(); { - case r == keySep: - return lexSkip(lx, lexValue) - case isWhitespace(r): - return lexSkip(lx, lexKeyEnd) - default: - return lx.errorf("expected key separator %q, but got %q instead", - keySep, r) - } -} - -// lexValue starts the consumption of a value anywhere a value is expected. -// lexValue will ignore whitespace. -// After a value is lexed, the last state on the next is popped and returned. -func lexValue(lx *lexer) stateFn { - // We allow whitespace to precede a value, but NOT newlines. - // In array syntax, the array states are responsible for ignoring newlines. - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexValue) - case isDigit(r): - lx.backup() // avoid an extra state and use the same as above - return lexNumberOrDateStart - } - switch r { - case arrayStart: - lx.ignore() - lx.emit(itemArray) - return lexArrayValue - case inlineTableStart: - lx.ignore() - lx.emit(itemInlineTableStart) - return lexInlineTableValue - case stringStart: - if lx.accept(stringStart) { - if lx.accept(stringStart) { - lx.ignore() // Ignore """ - return lexMultilineString - } - lx.backup() - } - lx.ignore() // ignore the '"' - return lexString - case rawStringStart: - if lx.accept(rawStringStart) { - if lx.accept(rawStringStart) { - lx.ignore() // Ignore """ - return lexMultilineRawString - } - lx.backup() - } - lx.ignore() // ignore the "'" - return lexRawString - case '+', '-': - return lexNumberStart - case '.': // special error case, be kind to users - return lx.errorf("floats must start with a digit, not '.'") - } - if unicode.IsLetter(r) { - // Be permissive here; lexBool will give a nice error if the - // user wrote something like - // x = foo - // (i.e. not 'true' or 'false' but is something else word-like.) - lx.backup() - return lexBool - } - return lx.errorf("expected value but found %q instead", r) -} - -// lexArrayValue consumes one value in an array. It assumes that '[' or ',' -// have already been consumed. All whitespace and newlines are ignored. -func lexArrayValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValue) - case r == commentStart: - lx.push(lexArrayValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == arrayEnd: - // NOTE(caleb): The spec isn't clear about whether you can have - // a trailing comma or not, so we'll allow it. - return lexArrayEnd - } - - lx.backup() - lx.push(lexArrayValueEnd) - return lexValue -} - -// lexArrayValueEnd consumes everything between the end of an array value and -// the next value (or the end of the array): it ignores whitespace and newlines -// and expects either a ',' or a ']'. -func lexArrayValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValueEnd) - case r == commentStart: - lx.push(lexArrayValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexArrayValue // move on to the next value - case r == arrayEnd: - return lexArrayEnd - } - return lx.errorf( - "expected a comma or array terminator %q, but got %q instead", - arrayEnd, r, - ) -} - -// lexArrayEnd finishes the lexing of an array. -// It assumes that a ']' has just been consumed. -func lexArrayEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemArrayEnd) - return lx.pop() -} - -// lexInlineTableValue consumes one key/value pair in an inline table. -// It assumes that '{' or ',' have already been consumed. Whitespace is ignored. -func lexInlineTableValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValue) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == inlineTableEnd: - return lexInlineTableEnd - } - lx.backup() - lx.push(lexInlineTableValueEnd) - return lexKeyStart -} - -// lexInlineTableValueEnd consumes everything between the end of an inline table -// key/value pair and the next pair (or the end of the table): -// it ignores whitespace and expects either a ',' or a '}'. -func lexInlineTableValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValueEnd) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexInlineTableValue - case r == inlineTableEnd: - return lexInlineTableEnd - } - return lx.errorf("expected a comma or an inline table terminator %q, "+ - "but got %q instead", inlineTableEnd, r) -} - -// lexInlineTableEnd finishes the lexing of an inline table. -// It assumes that a '}' has just been consumed. -func lexInlineTableEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemInlineTableEnd) - return lx.pop() -} - -// lexString consumes the inner contents of a string. It assumes that the -// beginning '"' has already been consumed and ignored. -func lexString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == '\\': - lx.push(lexString) - return lexStringEscape - case r == stringEnd: - lx.backup() - lx.emit(itemString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexString -} - -// lexMultilineString consumes the inner contents of a string. It assumes that -// the beginning '"""' has already been consumed and ignored. -func lexMultilineString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case '\\': - return lexMultilineStringEscape - case stringEnd: - if lx.accept(stringEnd) { - if lx.accept(stringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineString -} - -// lexRawString consumes a raw string. Nothing can be escaped in such a string. -// It assumes that the beginning "'" has already been consumed and ignored. -func lexRawString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == rawStringEnd: - lx.backup() - lx.emit(itemRawString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexRawString -} - -// lexMultilineRawString consumes a raw string. Nothing can be escaped in such -// a string. It assumes that the beginning "'''" has already been consumed and -// ignored. -func lexMultilineRawString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case rawStringEnd: - if lx.accept(rawStringEnd) { - if lx.accept(rawStringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemRawMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineRawString -} - -// lexMultilineStringEscape consumes an escaped character. It assumes that the -// preceding '\\' has already been consumed. -func lexMultilineStringEscape(lx *lexer) stateFn { - // Handle the special case first: - if isNL(lx.next()) { - return lexMultilineString - } - lx.backup() - lx.push(lexMultilineString) - return lexStringEscape(lx) -} - -func lexStringEscape(lx *lexer) stateFn { - r := lx.next() - switch r { - case 'b': - fallthrough - case 't': - fallthrough - case 'n': - fallthrough - case 'f': - fallthrough - case 'r': - fallthrough - case '"': - fallthrough - case '\\': - return lx.pop() - case 'u': - return lexShortUnicodeEscape - case 'U': - return lexLongUnicodeEscape - } - return lx.errorf("invalid escape character %q; only the following "+ - "escape characters are allowed: "+ - `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r) -} - -func lexShortUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 4; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected four hexadecimal digits after '\u', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -func lexLongUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 8; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected eight hexadecimal digits after '\U', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -// lexNumberOrDateStart consumes either an integer, a float, or datetime. -func lexNumberOrDateStart(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '_': - return lexNumber - case 'e', 'E': - return lexFloat - case '.': - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) -} - -// lexNumberOrDate consumes either an integer, float or datetime. -func lexNumberOrDate(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '-': - return lexDatetime - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexDatetime consumes a Datetime, to a first approximation. -// The parser validates that it matches one of the accepted formats. -func lexDatetime(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexDatetime - } - switch r { - case '-', 'T', ':', '.', 'Z', '+': - return lexDatetime - } - - lx.backup() - lx.emit(itemDatetime) - return lx.pop() -} - -// lexNumberStart consumes either an integer or a float. It assumes that a sign -// has already been read, but that *no* digits have been consumed. -// lexNumberStart will move to the appropriate integer or float states. -func lexNumberStart(lx *lexer) stateFn { - // We MUST see a digit. Even floats have to start with a digit. - r := lx.next() - if !isDigit(r) { - if r == '.' { - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) - } - return lexNumber -} - -// lexNumber consumes an integer or a float after seeing the first digit. -func lexNumber(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumber - } - switch r { - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexFloat consumes the elements of a float. It allows any sequence of -// float-like characters, so floats emitted by the lexer are only a first -// approximation and must be validated by the parser. -func lexFloat(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexFloat - } - switch r { - case '_', '.', '-', '+', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemFloat) - return lx.pop() -} - -// lexBool consumes a bool string: 'true' or 'false. -func lexBool(lx *lexer) stateFn { - var rs []rune - for { - r := lx.next() - if !unicode.IsLetter(r) { - lx.backup() - break - } - rs = append(rs, r) - } - s := string(rs) - switch s { - case "true", "false": - lx.emit(itemBool) - return lx.pop() - } - return lx.errorf("expected value but found %q instead", s) -} - -// lexCommentStart begins the lexing of a comment. It will emit -// itemCommentStart and consume no characters, passing control to lexComment. -func lexCommentStart(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemCommentStart) - return lexComment -} - -// lexComment lexes an entire comment. It assumes that '#' has been consumed. -// It will consume *up to* the first newline character, and pass control -// back to the last state on the stack. -func lexComment(lx *lexer) stateFn { - r := lx.peek() - if isNL(r) || r == eof { - lx.emit(itemText) - return lx.pop() - } - lx.next() - return lexComment -} - -// lexSkip ignores all slurped input and moves on to the next state. -func lexSkip(lx *lexer, nextState stateFn) stateFn { - return func(lx *lexer) stateFn { - lx.ignore() - return nextState - } -} - -// isWhitespace returns true if `r` is a whitespace character according -// to the spec. -func isWhitespace(r rune) bool { - return r == '\t' || r == ' ' -} - -func isNL(r rune) bool { - return r == '\n' || r == '\r' -} - -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -func isHexadecimal(r rune) bool { - return (r >= '0' && r <= '9') || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') -} - -func isBareKeyChar(r rune) bool { - return (r >= 'A' && r <= 'Z') || - (r >= 'a' && r <= 'z') || - (r >= '0' && r <= '9') || - r == '_' || - r == '-' -} - -func (itype itemType) String() string { - switch itype { - case itemError: - return "Error" - case itemNIL: - return "NIL" - case itemEOF: - return "EOF" - case itemText: - return "Text" - case itemString, itemRawString, itemMultilineString, itemRawMultilineString: - return "String" - case itemBool: - return "Bool" - case itemInteger: - return "Integer" - case itemFloat: - return "Float" - case itemDatetime: - return "DateTime" - case itemTableStart: - return "TableStart" - case itemTableEnd: - return "TableEnd" - case itemKeyStart: - return "KeyStart" - case itemArray: - return "Array" - case itemArrayEnd: - return "ArrayEnd" - case itemCommentStart: - return "CommentStart" - } - panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) -} - -func (item item) String() string { - return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) -} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go deleted file mode 100644 index 50869ef9..00000000 --- a/vendor/github.com/BurntSushi/toml/parse.go +++ /dev/null @@ -1,592 +0,0 @@ -package toml - -import ( - "fmt" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -type parser struct { - mapping map[string]interface{} - types map[string]tomlType - lx *lexer - - // A list of keys in the order that they appear in the TOML data. - ordered []Key - - // the full key for the current hash in scope - context Key - - // the base key name for everything except hashes - currentKey string - - // rough approximation of line number - approxLine int - - // A map of 'key.group.names' to whether they were created implicitly. - implicits map[string]bool -} - -type parseError string - -func (pe parseError) Error() string { - return string(pe) -} - -func parse(data string) (p *parser, err error) { - defer func() { - if r := recover(); r != nil { - var ok bool - if err, ok = r.(parseError); ok { - return - } - panic(r) - } - }() - - p = &parser{ - mapping: make(map[string]interface{}), - types: make(map[string]tomlType), - lx: lex(data), - ordered: make([]Key, 0), - implicits: make(map[string]bool), - } - for { - item := p.next() - if item.typ == itemEOF { - break - } - p.topLevel(item) - } - - return p, nil -} - -func (p *parser) panicf(format string, v ...interface{}) { - msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", - p.approxLine, p.current(), fmt.Sprintf(format, v...)) - panic(parseError(msg)) -} - -func (p *parser) next() item { - it := p.lx.nextItem() - if it.typ == itemError { - p.panicf("%s", it.val) - } - return it -} - -func (p *parser) bug(format string, v ...interface{}) { - panic(fmt.Sprintf("BUG: "+format+"\n\n", v...)) -} - -func (p *parser) expect(typ itemType) item { - it := p.next() - p.assertEqual(typ, it.typ) - return it -} - -func (p *parser) assertEqual(expected, got itemType) { - if expected != got { - p.bug("Expected '%s' but got '%s'.", expected, got) - } -} - -func (p *parser) topLevel(item item) { - switch item.typ { - case itemCommentStart: - p.approxLine = item.line - p.expect(itemText) - case itemTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemTableEnd, kg.typ) - - p.establishContext(key, false) - p.setType("", tomlHash) - p.ordered = append(p.ordered, key) - case itemArrayTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemArrayTableEnd, kg.typ) - - p.establishContext(key, true) - p.setType("", tomlArrayHash) - p.ordered = append(p.ordered, key) - case itemKeyStart: - kname := p.next() - p.approxLine = kname.line - p.currentKey = p.keyString(kname) - - val, typ := p.value(p.next()) - p.setValue(p.currentKey, val) - p.setType(p.currentKey, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - p.currentKey = "" - default: - p.bug("Unexpected type at top level: %s", item.typ) - } -} - -// Gets a string for a key (or part of a key in a table name). -func (p *parser) keyString(it item) string { - switch it.typ { - case itemText: - return it.val - case itemString, itemMultilineString, - itemRawString, itemRawMultilineString: - s, _ := p.value(it) - return s.(string) - default: - p.bug("Unexpected key type: %s", it.typ) - panic("unreachable") - } -} - -// value translates an expected value from the lexer into a Go value wrapped -// as an empty interface. -func (p *parser) value(it item) (interface{}, tomlType) { - switch it.typ { - case itemString: - return p.replaceEscapes(it.val), p.typeOfPrimitive(it) - case itemMultilineString: - trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) - return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) - case itemRawString: - return it.val, p.typeOfPrimitive(it) - case itemRawMultilineString: - return stripFirstNewline(it.val), p.typeOfPrimitive(it) - case itemBool: - switch it.val { - case "true": - return true, p.typeOfPrimitive(it) - case "false": - return false, p.typeOfPrimitive(it) - } - p.bug("Expected boolean value, but got '%s'.", it.val) - case itemInteger: - if !numUnderscoresOK(it.val) { - p.panicf("Invalid integer %q: underscores must be surrounded by digits", - it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseInt(val, 10, 64) - if err != nil { - // Distinguish integer values. Normally, it'd be a bug if the lexer - // provides an invalid integer, but it's possible that the number is - // out of range of valid values (which the lexer cannot determine). - // So mark the former as a bug but the latter as a legitimate user - // error. - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Integer '%s' is out of the range of 64-bit "+ - "signed integers.", it.val) - } else { - p.bug("Expected integer value, but got '%s'.", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemFloat: - parts := strings.FieldsFunc(it.val, func(r rune) bool { - switch r { - case '.', 'e', 'E': - return true - } - return false - }) - for _, part := range parts { - if !numUnderscoresOK(part) { - p.panicf("Invalid float %q: underscores must be "+ - "surrounded by digits", it.val) - } - } - if !numPeriodsOK(it.val) { - // As a special case, numbers like '123.' or '1.e2', - // which are valid as far as Go/strconv are concerned, - // must be rejected because TOML says that a fractional - // part consists of '.' followed by 1+ digits. - p.panicf("Invalid float %q: '.' must be followed "+ - "by one or more digits", it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseFloat(val, 64) - if err != nil { - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Float '%s' is out of the range of 64-bit "+ - "IEEE-754 floating-point numbers.", it.val) - } else { - p.panicf("Invalid float value: %q", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemDatetime: - var t time.Time - var ok bool - var err error - for _, format := range []string{ - "2006-01-02T15:04:05Z07:00", - "2006-01-02T15:04:05", - "2006-01-02", - } { - t, err = time.ParseInLocation(format, it.val, time.Local) - if err == nil { - ok = true - break - } - } - if !ok { - p.panicf("Invalid TOML Datetime: %q.", it.val) - } - return t, p.typeOfPrimitive(it) - case itemArray: - array := make([]interface{}, 0) - types := make([]tomlType, 0) - - for it = p.next(); it.typ != itemArrayEnd; it = p.next() { - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - val, typ := p.value(it) - array = append(array, val) - types = append(types, typ) - } - return array, p.typeOfArray(types) - case itemInlineTableStart: - var ( - hash = make(map[string]interface{}) - outerContext = p.context - outerKey = p.currentKey - ) - - p.context = append(p.context, p.currentKey) - p.currentKey = "" - for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { - if it.typ != itemKeyStart { - p.bug("Expected key start but instead found %q, around line %d", - it.val, p.approxLine) - } - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - // retrieve key - k := p.next() - p.approxLine = k.line - kname := p.keyString(k) - - // retrieve value - p.currentKey = kname - val, typ := p.value(p.next()) - // make sure we keep metadata up to date - p.setType(kname, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - hash[kname] = val - } - p.context = outerContext - p.currentKey = outerKey - return hash, tomlHash - } - p.bug("Unexpected value type: %s", it.typ) - panic("unreachable") -} - -// numUnderscoresOK checks whether each underscore in s is surrounded by -// characters that are not underscores. -func numUnderscoresOK(s string) bool { - accept := false - for _, r := range s { - if r == '_' { - if !accept { - return false - } - accept = false - continue - } - accept = true - } - return accept -} - -// numPeriodsOK checks whether every period in s is followed by a digit. -func numPeriodsOK(s string) bool { - period := false - for _, r := range s { - if period && !isDigit(r) { - return false - } - period = r == '.' - } - return !period -} - -// establishContext sets the current context of the parser, -// where the context is either a hash or an array of hashes. Which one is -// set depends on the value of the `array` parameter. -// -// Establishing the context also makes sure that the key isn't a duplicate, and -// will create implicit hashes automatically. -func (p *parser) establishContext(key Key, array bool) { - var ok bool - - // Always start at the top level and drill down for our context. - hashContext := p.mapping - keyContext := make(Key, 0) - - // We only need implicit hashes for key[0:-1] - for _, k := range key[0 : len(key)-1] { - _, ok = hashContext[k] - keyContext = append(keyContext, k) - - // No key? Make an implicit hash and move on. - if !ok { - p.addImplicit(keyContext) - hashContext[k] = make(map[string]interface{}) - } - - // If the hash context is actually an array of tables, then set - // the hash context to the last element in that array. - // - // Otherwise, it better be a table, since this MUST be a key group (by - // virtue of it not being the last element in a key). - switch t := hashContext[k].(type) { - case []map[string]interface{}: - hashContext = t[len(t)-1] - case map[string]interface{}: - hashContext = t - default: - p.panicf("Key '%s' was already created as a hash.", keyContext) - } - } - - p.context = keyContext - if array { - // If this is the first element for this array, then allocate a new - // list of tables for it. - k := key[len(key)-1] - if _, ok := hashContext[k]; !ok { - hashContext[k] = make([]map[string]interface{}, 0, 5) - } - - // Add a new table. But make sure the key hasn't already been used - // for something else. - if hash, ok := hashContext[k].([]map[string]interface{}); ok { - hashContext[k] = append(hash, make(map[string]interface{})) - } else { - p.panicf("Key '%s' was already created and cannot be used as "+ - "an array.", keyContext) - } - } else { - p.setValue(key[len(key)-1], make(map[string]interface{})) - } - p.context = append(p.context, key[len(key)-1]) -} - -// setValue sets the given key to the given value in the current context. -// It will make sure that the key hasn't already been defined, account for -// implicit key groups. -func (p *parser) setValue(key string, value interface{}) { - var tmpHash interface{} - var ok bool - - hash := p.mapping - keyContext := make(Key, 0) - for _, k := range p.context { - keyContext = append(keyContext, k) - if tmpHash, ok = hash[k]; !ok { - p.bug("Context for key '%s' has not been established.", keyContext) - } - switch t := tmpHash.(type) { - case []map[string]interface{}: - // The context is a table of hashes. Pick the most recent table - // defined as the current hash. - hash = t[len(t)-1] - case map[string]interface{}: - hash = t - default: - p.bug("Expected hash to have type 'map[string]interface{}', but "+ - "it has '%T' instead.", tmpHash) - } - } - keyContext = append(keyContext, key) - - if _, ok := hash[key]; ok { - // Typically, if the given key has already been set, then we have - // to raise an error since duplicate keys are disallowed. However, - // it's possible that a key was previously defined implicitly. In this - // case, it is allowed to be redefined concretely. (See the - // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) - // - // But we have to make sure to stop marking it as an implicit. (So that - // another redefinition provokes an error.) - // - // Note that since it has already been defined (as a hash), we don't - // want to overwrite it. So our business is done. - if p.isImplicit(keyContext) { - p.removeImplicit(keyContext) - return - } - - // Otherwise, we have a concrete key trying to override a previous - // key, which is *always* wrong. - p.panicf("Key '%s' has already been defined.", keyContext) - } - hash[key] = value -} - -// setType sets the type of a particular value at a given key. -// It should be called immediately AFTER setValue. -// -// Note that if `key` is empty, then the type given will be applied to the -// current context (which is either a table or an array of tables). -func (p *parser) setType(key string, typ tomlType) { - keyContext := make(Key, 0, len(p.context)+1) - for _, k := range p.context { - keyContext = append(keyContext, k) - } - if len(key) > 0 { // allow type setting for hashes - keyContext = append(keyContext, key) - } - p.types[keyContext.String()] = typ -} - -// addImplicit sets the given Key as having been created implicitly. -func (p *parser) addImplicit(key Key) { - p.implicits[key.String()] = true -} - -// removeImplicit stops tagging the given key as having been implicitly -// created. -func (p *parser) removeImplicit(key Key) { - p.implicits[key.String()] = false -} - -// isImplicit returns true if the key group pointed to by the key was created -// implicitly. -func (p *parser) isImplicit(key Key) bool { - return p.implicits[key.String()] -} - -// current returns the full key name of the current context. -func (p *parser) current() string { - if len(p.currentKey) == 0 { - return p.context.String() - } - if len(p.context) == 0 { - return p.currentKey - } - return fmt.Sprintf("%s.%s", p.context, p.currentKey) -} - -func stripFirstNewline(s string) string { - if len(s) == 0 || s[0] != '\n' { - return s - } - return s[1:] -} - -func stripEscapedWhitespace(s string) string { - esc := strings.Split(s, "\\\n") - if len(esc) > 1 { - for i := 1; i < len(esc); i++ { - esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) - } - } - return strings.Join(esc, "") -} - -func (p *parser) replaceEscapes(str string) string { - var replaced []rune - s := []byte(str) - r := 0 - for r < len(s) { - if s[r] != '\\' { - c, size := utf8.DecodeRune(s[r:]) - r += size - replaced = append(replaced, c) - continue - } - r += 1 - if r >= len(s) { - p.bug("Escape sequence at end of string.") - return "" - } - switch s[r] { - default: - p.bug("Expected valid escape code after \\, but got %q.", s[r]) - return "" - case 'b': - replaced = append(replaced, rune(0x0008)) - r += 1 - case 't': - replaced = append(replaced, rune(0x0009)) - r += 1 - case 'n': - replaced = append(replaced, rune(0x000A)) - r += 1 - case 'f': - replaced = append(replaced, rune(0x000C)) - r += 1 - case 'r': - replaced = append(replaced, rune(0x000D)) - r += 1 - case '"': - replaced = append(replaced, rune(0x0022)) - r += 1 - case '\\': - replaced = append(replaced, rune(0x005C)) - r += 1 - case 'u': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+5). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) - replaced = append(replaced, escaped) - r += 5 - case 'U': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+9). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) - replaced = append(replaced, escaped) - r += 9 - } - } - return string(replaced) -} - -func (p *parser) asciiEscapeToUnicode(bs []byte) rune { - s := string(bs) - hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) - if err != nil { - p.bug("Could not parse '%s' as a hexadecimal number, but the "+ - "lexer claims it's OK: %s", s, err) - } - if !utf8.ValidRune(rune(hex)) { - p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) - } - return rune(hex) -} - -func isStringType(ty itemType) bool { - return ty == itemString || ty == itemMultilineString || - ty == itemRawString || ty == itemRawMultilineString -} diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim deleted file mode 100644 index 562164be..00000000 --- a/vendor/github.com/BurntSushi/toml/session.vim +++ /dev/null @@ -1 +0,0 @@ -au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go deleted file mode 100644 index c73f8afc..00000000 --- a/vendor/github.com/BurntSushi/toml/type_check.go +++ /dev/null @@ -1,91 +0,0 @@ -package toml - -// tomlType represents any Go type that corresponds to a TOML type. -// While the first draft of the TOML spec has a simplistic type system that -// probably doesn't need this level of sophistication, we seem to be militating -// toward adding real composite types. -type tomlType interface { - typeString() string -} - -// typeEqual accepts any two types and returns true if they are equal. -func typeEqual(t1, t2 tomlType) bool { - if t1 == nil || t2 == nil { - return false - } - return t1.typeString() == t2.typeString() -} - -func typeIsHash(t tomlType) bool { - return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) -} - -type tomlBaseType string - -func (btype tomlBaseType) typeString() string { - return string(btype) -} - -func (btype tomlBaseType) String() string { - return btype.typeString() -} - -var ( - tomlInteger tomlBaseType = "Integer" - tomlFloat tomlBaseType = "Float" - tomlDatetime tomlBaseType = "Datetime" - tomlString tomlBaseType = "String" - tomlBool tomlBaseType = "Bool" - tomlArray tomlBaseType = "Array" - tomlHash tomlBaseType = "Hash" - tomlArrayHash tomlBaseType = "ArrayHash" -) - -// typeOfPrimitive returns a tomlType of any primitive value in TOML. -// Primitive values are: Integer, Float, Datetime, String and Bool. -// -// Passing a lexer item other than the following will cause a BUG message -// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime. -func (p *parser) typeOfPrimitive(lexItem item) tomlType { - switch lexItem.typ { - case itemInteger: - return tomlInteger - case itemFloat: - return tomlFloat - case itemDatetime: - return tomlDatetime - case itemString: - return tomlString - case itemMultilineString: - return tomlString - case itemRawString: - return tomlString - case itemRawMultilineString: - return tomlString - case itemBool: - return tomlBool - } - p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) - panic("unreachable") -} - -// typeOfArray returns a tomlType for an array given a list of types of its -// values. -// -// In the current spec, if an array is homogeneous, then its type is always -// "Array". If the array is not homogeneous, an error is generated. -func (p *parser) typeOfArray(types []tomlType) tomlType { - // Empty arrays are cool. - if len(types) == 0 { - return tomlArray - } - - theType := types[0] - for _, t := range types[1:] { - if !typeEqual(theType, t) { - p.panicf("Array contains values of type '%s' and '%s', but "+ - "arrays must be homogeneous.", theType, t) - } - } - return tomlArray -} diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go deleted file mode 100644 index 608997c2..00000000 --- a/vendor/github.com/BurntSushi/toml/type_fields.go +++ /dev/null @@ -1,242 +0,0 @@ -package toml - -// Struct field handling is adapted from code in encoding/json: -// -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the Go distribution. - -import ( - "reflect" - "sort" - "sync" -) - -// A field represents a single field found in a struct. -type field struct { - name string // the name of the field (`toml` tag included) - tag bool // whether field has a `toml` tag - index []int // represents the depth of an anonymous field - typ reflect.Type // the type of the field -} - -// byName sorts field by name, breaking ties with depth, -// then breaking ties with "name came from toml tag", then -// breaking ties with index sequence. -type byName []field - -func (x byName) Len() int { return len(x) } - -func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byName) Less(i, j int) bool { - if x[i].name != x[j].name { - return x[i].name < x[j].name - } - if len(x[i].index) != len(x[j].index) { - return len(x[i].index) < len(x[j].index) - } - if x[i].tag != x[j].tag { - return x[i].tag - } - return byIndex(x).Less(i, j) -} - -// byIndex sorts field by index sequence. -type byIndex []field - -func (x byIndex) Len() int { return len(x) } - -func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byIndex) Less(i, j int) bool { - for k, xik := range x[i].index { - if k >= len(x[j].index) { - return false - } - if xik != x[j].index[k] { - return xik < x[j].index[k] - } - } - return len(x[i].index) < len(x[j].index) -} - -// typeFields returns a list of fields that TOML should recognize for the given -// type. The algorithm is breadth-first search over the set of structs to -// include - the top struct and then any reachable anonymous structs. -func typeFields(t reflect.Type) []field { - // Anonymous fields to explore at the current level and the next. - current := []field{} - next := []field{{typ: t}} - - // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} - - // Types already visited at an earlier level. - visited := map[reflect.Type]bool{} - - // Fields found. - var fields []field - - for len(next) > 0 { - current, next = next, current[:0] - count, nextCount = nextCount, map[reflect.Type]int{} - - for _, f := range current { - if visited[f.typ] { - continue - } - visited[f.typ] = true - - // Scan f.typ for fields to include. - for i := 0; i < f.typ.NumField(); i++ { - sf := f.typ.Field(i) - if sf.PkgPath != "" && !sf.Anonymous { // unexported - continue - } - opts := getOptions(sf.Tag) - if opts.skip { - continue - } - index := make([]int, len(f.index)+1) - copy(index, f.index) - index[len(f.index)] = i - - ft := sf.Type - if ft.Name() == "" && ft.Kind() == reflect.Ptr { - // Follow pointer. - ft = ft.Elem() - } - - // Record found field and index sequence. - if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct { - tagged := opts.name != "" - name := opts.name - if name == "" { - name = sf.Name - } - fields = append(fields, field{name, tagged, index, ft}) - if count[f.typ] > 1 { - // If there were multiple instances, add a second, - // so that the annihilation code will see a duplicate. - // It only cares about the distinction between 1 or 2, - // so don't bother generating any more copies. - fields = append(fields, fields[len(fields)-1]) - } - continue - } - - // Record new anonymous struct to explore in next round. - nextCount[ft]++ - if nextCount[ft] == 1 { - f := field{name: ft.Name(), index: index, typ: ft} - next = append(next, f) - } - } - } - } - - sort.Sort(byName(fields)) - - // Delete all fields that are hidden by the Go rules for embedded fields, - // except that fields with TOML tags are promoted. - - // The fields are sorted in primary order of name, secondary order - // of field index length. Loop over names; for each name, delete - // hidden fields by choosing the one dominant field that survives. - out := fields[:0] - for advance, i := 0, 0; i < len(fields); i += advance { - // One iteration per name. - // Find the sequence of fields with the name of this first field. - fi := fields[i] - name := fi.name - for advance = 1; i+advance < len(fields); advance++ { - fj := fields[i+advance] - if fj.name != name { - break - } - } - if advance == 1 { // Only one field with this name - out = append(out, fi) - continue - } - dominant, ok := dominantField(fields[i : i+advance]) - if ok { - out = append(out, dominant) - } - } - - fields = out - sort.Sort(byIndex(fields)) - - return fields -} - -// dominantField looks through the fields, all of which are known to -// have the same name, to find the single field that dominates the -// others using Go's embedding rules, modified by the presence of -// TOML tags. If there are multiple top-level fields, the boolean -// will be false: This condition is an error in Go and we skip all -// the fields. -func dominantField(fields []field) (field, bool) { - // The fields are sorted in increasing index-length order. The winner - // must therefore be one with the shortest index length. Drop all - // longer entries, which is easy: just truncate the slice. - length := len(fields[0].index) - tagged := -1 // Index of first tagged field. - for i, f := range fields { - if len(f.index) > length { - fields = fields[:i] - break - } - if f.tag { - if tagged >= 0 { - // Multiple tagged fields at the same level: conflict. - // Return no field. - return field{}, false - } - tagged = i - } - } - if tagged >= 0 { - return fields[tagged], true - } - // All remaining fields have the same length. If there's more than one, - // we have a conflict (two fields named "X" at the same level) and we - // return no field. - if len(fields) > 1 { - return field{}, false - } - return fields[0], true -} - -var fieldCache struct { - sync.RWMutex - m map[reflect.Type][]field -} - -// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. -func cachedTypeFields(t reflect.Type) []field { - fieldCache.RLock() - f := fieldCache.m[t] - fieldCache.RUnlock() - if f != nil { - return f - } - - // Compute fields without lock. - // Might duplicate effort but won't hold other computations back. - f = typeFields(t) - if f == nil { - f = []field{} - } - - fieldCache.Lock() - if fieldCache.m == nil { - fieldCache.m = map[reflect.Type][]field{} - } - fieldCache.m[t] = f - fieldCache.Unlock() - return f -} diff --git a/vendor/github.com/Microsoft/go-winio/.gitignore b/vendor/github.com/Microsoft/go-winio/.gitignore deleted file mode 100644 index b883f1fd..00000000 --- a/vendor/github.com/Microsoft/go-winio/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.exe diff --git a/vendor/github.com/Microsoft/go-winio/LICENSE b/vendor/github.com/Microsoft/go-winio/LICENSE deleted file mode 100644 index b8b569d7..00000000 --- a/vendor/github.com/Microsoft/go-winio/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Microsoft - -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/Microsoft/go-winio/README.md b/vendor/github.com/Microsoft/go-winio/README.md deleted file mode 100644 index 56800105..00000000 --- a/vendor/github.com/Microsoft/go-winio/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# go-winio - -This repository contains utilities for efficiently performing Win32 IO operations in -Go. Currently, this is focused on accessing named pipes and other file handles, and -for using named pipes as a net transport. - -This code relies on IO completion ports to avoid blocking IO on system threads, allowing Go -to reuse the thread to schedule another goroutine. This limits support to Windows Vista and -newer operating systems. This is similar to the implementation of network sockets in Go's net -package. - -Please see the LICENSE file for licensing information. - -This project has adopted the [Microsoft Open Source Code of -Conduct](https://opensource.microsoft.com/codeofconduct/). For more information -see the [Code of Conduct -FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact -[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional -questions or comments. - -Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe -for another named pipe implementation. diff --git a/vendor/github.com/Microsoft/go-winio/backup.go b/vendor/github.com/Microsoft/go-winio/backup.go deleted file mode 100644 index 2be34af4..00000000 --- a/vendor/github.com/Microsoft/go-winio/backup.go +++ /dev/null @@ -1,280 +0,0 @@ -// +build windows - -package winio - -import ( - "encoding/binary" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "runtime" - "syscall" - "unicode/utf16" -) - -//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead -//sys backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupWrite - -const ( - BackupData = uint32(iota + 1) - BackupEaData - BackupSecurity - BackupAlternateData - BackupLink - BackupPropertyData - BackupObjectId - BackupReparseData - BackupSparseBlock - BackupTxfsData -) - -const ( - StreamSparseAttributes = uint32(8) -) - -const ( - WRITE_DAC = 0x40000 - WRITE_OWNER = 0x80000 - ACCESS_SYSTEM_SECURITY = 0x1000000 -) - -// BackupHeader represents a backup stream of a file. -type BackupHeader struct { - Id uint32 // The backup stream ID - Attributes uint32 // Stream attributes - Size int64 // The size of the stream in bytes - Name string // The name of the stream (for BackupAlternateData only). - Offset int64 // The offset of the stream in the file (for BackupSparseBlock only). -} - -type win32StreamId struct { - StreamId uint32 - Attributes uint32 - Size uint64 - NameSize uint32 -} - -// BackupStreamReader reads from a stream produced by the BackupRead Win32 API and produces a series -// of BackupHeader values. -type BackupStreamReader struct { - r io.Reader - bytesLeft int64 -} - -// NewBackupStreamReader produces a BackupStreamReader from any io.Reader. -func NewBackupStreamReader(r io.Reader) *BackupStreamReader { - return &BackupStreamReader{r, 0} -} - -// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if -// it was not completely read. -func (r *BackupStreamReader) Next() (*BackupHeader, error) { - if r.bytesLeft > 0 { - if s, ok := r.r.(io.Seeker); ok { - // Make sure Seek on io.SeekCurrent sometimes succeeds - // before trying the actual seek. - if _, err := s.Seek(0, io.SeekCurrent); err == nil { - if _, err = s.Seek(r.bytesLeft, io.SeekCurrent); err != nil { - return nil, err - } - r.bytesLeft = 0 - } - } - if _, err := io.Copy(ioutil.Discard, r); err != nil { - return nil, err - } - } - var wsi win32StreamId - if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil { - return nil, err - } - hdr := &BackupHeader{ - Id: wsi.StreamId, - Attributes: wsi.Attributes, - Size: int64(wsi.Size), - } - if wsi.NameSize != 0 { - name := make([]uint16, int(wsi.NameSize/2)) - if err := binary.Read(r.r, binary.LittleEndian, name); err != nil { - return nil, err - } - hdr.Name = syscall.UTF16ToString(name) - } - if wsi.StreamId == BackupSparseBlock { - if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil { - return nil, err - } - hdr.Size -= 8 - } - r.bytesLeft = hdr.Size - return hdr, nil -} - -// Read reads from the current backup stream. -func (r *BackupStreamReader) Read(b []byte) (int, error) { - if r.bytesLeft == 0 { - return 0, io.EOF - } - if int64(len(b)) > r.bytesLeft { - b = b[:r.bytesLeft] - } - n, err := r.r.Read(b) - r.bytesLeft -= int64(n) - if err == io.EOF { - err = io.ErrUnexpectedEOF - } else if r.bytesLeft == 0 && err == nil { - err = io.EOF - } - return n, err -} - -// BackupStreamWriter writes a stream compatible with the BackupWrite Win32 API. -type BackupStreamWriter struct { - w io.Writer - bytesLeft int64 -} - -// NewBackupStreamWriter produces a BackupStreamWriter on top of an io.Writer. -func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter { - return &BackupStreamWriter{w, 0} -} - -// WriteHeader writes the next backup stream header and prepares for calls to Write(). -func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error { - if w.bytesLeft != 0 { - return fmt.Errorf("missing %d bytes", w.bytesLeft) - } - name := utf16.Encode([]rune(hdr.Name)) - wsi := win32StreamId{ - StreamId: hdr.Id, - Attributes: hdr.Attributes, - Size: uint64(hdr.Size), - NameSize: uint32(len(name) * 2), - } - if hdr.Id == BackupSparseBlock { - // Include space for the int64 block offset - wsi.Size += 8 - } - if err := binary.Write(w.w, binary.LittleEndian, &wsi); err != nil { - return err - } - if len(name) != 0 { - if err := binary.Write(w.w, binary.LittleEndian, name); err != nil { - return err - } - } - if hdr.Id == BackupSparseBlock { - if err := binary.Write(w.w, binary.LittleEndian, hdr.Offset); err != nil { - return err - } - } - w.bytesLeft = hdr.Size - return nil -} - -// Write writes to the current backup stream. -func (w *BackupStreamWriter) Write(b []byte) (int, error) { - if w.bytesLeft < int64(len(b)) { - return 0, fmt.Errorf("too many bytes by %d", int64(len(b))-w.bytesLeft) - } - n, err := w.w.Write(b) - w.bytesLeft -= int64(n) - return n, err -} - -// BackupFileReader provides an io.ReadCloser interface on top of the BackupRead Win32 API. -type BackupFileReader struct { - f *os.File - includeSecurity bool - ctx uintptr -} - -// NewBackupFileReader returns a new BackupFileReader from a file handle. If includeSecurity is true, -// Read will attempt to read the security descriptor of the file. -func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileReader { - r := &BackupFileReader{f, includeSecurity, 0} - return r -} - -// Read reads a backup stream from the file by calling the Win32 API BackupRead(). -func (r *BackupFileReader) Read(b []byte) (int, error) { - var bytesRead uint32 - err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx) - if err != nil { - return 0, &os.PathError{"BackupRead", r.f.Name(), err} - } - runtime.KeepAlive(r.f) - if bytesRead == 0 { - return 0, io.EOF - } - return int(bytesRead), nil -} - -// Close frees Win32 resources associated with the BackupFileReader. It does not close -// the underlying file. -func (r *BackupFileReader) Close() error { - if r.ctx != 0 { - backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx) - runtime.KeepAlive(r.f) - r.ctx = 0 - } - return nil -} - -// BackupFileWriter provides an io.WriteCloser interface on top of the BackupWrite Win32 API. -type BackupFileWriter struct { - f *os.File - includeSecurity bool - ctx uintptr -} - -// NewBackupFileWriter returns a new BackupFileWriter from a file handle. If includeSecurity is true, -// Write() will attempt to restore the security descriptor from the stream. -func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWriter { - w := &BackupFileWriter{f, includeSecurity, 0} - return w -} - -// Write restores a portion of the file using the provided backup stream. -func (w *BackupFileWriter) Write(b []byte) (int, error) { - var bytesWritten uint32 - err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx) - if err != nil { - return 0, &os.PathError{"BackupWrite", w.f.Name(), err} - } - runtime.KeepAlive(w.f) - if int(bytesWritten) != len(b) { - return int(bytesWritten), errors.New("not all bytes could be written") - } - return len(b), nil -} - -// Close frees Win32 resources associated with the BackupFileWriter. It does not -// close the underlying file. -func (w *BackupFileWriter) Close() error { - if w.ctx != 0 { - backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx) - runtime.KeepAlive(w.f) - w.ctx = 0 - } - return nil -} - -// OpenForBackup opens a file or directory, potentially skipping access checks if the backup -// or restore privileges have been acquired. -// -// If the file opened was a directory, it cannot be used with Readdir(). -func OpenForBackup(path string, access uint32, share uint32, createmode uint32) (*os.File, error) { - winPath, err := syscall.UTF16FromString(path) - if err != nil { - return nil, err - } - h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0) - if err != nil { - err = &os.PathError{Op: "open", Path: path, Err: err} - return nil, err - } - return os.NewFile(uintptr(h), path), nil -} diff --git a/vendor/github.com/Microsoft/go-winio/ea.go b/vendor/github.com/Microsoft/go-winio/ea.go deleted file mode 100644 index 4051c1b3..00000000 --- a/vendor/github.com/Microsoft/go-winio/ea.go +++ /dev/null @@ -1,137 +0,0 @@ -package winio - -import ( - "bytes" - "encoding/binary" - "errors" -) - -type fileFullEaInformation struct { - NextEntryOffset uint32 - Flags uint8 - NameLength uint8 - ValueLength uint16 -} - -var ( - fileFullEaInformationSize = binary.Size(&fileFullEaInformation{}) - - errInvalidEaBuffer = errors.New("invalid extended attribute buffer") - errEaNameTooLarge = errors.New("extended attribute name too large") - errEaValueTooLarge = errors.New("extended attribute value too large") -) - -// ExtendedAttribute represents a single Windows EA. -type ExtendedAttribute struct { - Name string - Value []byte - Flags uint8 -} - -func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) { - var info fileFullEaInformation - err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info) - if err != nil { - err = errInvalidEaBuffer - return - } - - nameOffset := fileFullEaInformationSize - nameLen := int(info.NameLength) - valueOffset := nameOffset + int(info.NameLength) + 1 - valueLen := int(info.ValueLength) - nextOffset := int(info.NextEntryOffset) - if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) { - err = errInvalidEaBuffer - return - } - - ea.Name = string(b[nameOffset : nameOffset+nameLen]) - ea.Value = b[valueOffset : valueOffset+valueLen] - ea.Flags = info.Flags - if info.NextEntryOffset != 0 { - nb = b[info.NextEntryOffset:] - } - return -} - -// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION -// buffer retrieved from BackupRead, ZwQueryEaFile, etc. -func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) { - for len(b) != 0 { - ea, nb, err := parseEa(b) - if err != nil { - return nil, err - } - - eas = append(eas, ea) - b = nb - } - return -} - -func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error { - if int(uint8(len(ea.Name))) != len(ea.Name) { - return errEaNameTooLarge - } - if int(uint16(len(ea.Value))) != len(ea.Value) { - return errEaValueTooLarge - } - entrySize := uint32(fileFullEaInformationSize + len(ea.Name) + 1 + len(ea.Value)) - withPadding := (entrySize + 3) &^ 3 - nextOffset := uint32(0) - if !last { - nextOffset = withPadding - } - info := fileFullEaInformation{ - NextEntryOffset: nextOffset, - Flags: ea.Flags, - NameLength: uint8(len(ea.Name)), - ValueLength: uint16(len(ea.Value)), - } - - err := binary.Write(buf, binary.LittleEndian, &info) - if err != nil { - return err - } - - _, err = buf.Write([]byte(ea.Name)) - if err != nil { - return err - } - - err = buf.WriteByte(0) - if err != nil { - return err - } - - _, err = buf.Write(ea.Value) - if err != nil { - return err - } - - _, err = buf.Write([]byte{0, 0, 0}[0 : withPadding-entrySize]) - if err != nil { - return err - } - - return nil -} - -// EncodeExtendedAttributes encodes a list of EAs into a FILE_FULL_EA_INFORMATION -// buffer for use with BackupWrite, ZwSetEaFile, etc. -func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) { - var buf bytes.Buffer - for i := range eas { - last := false - if i == len(eas)-1 { - last = true - } - - err := writeEa(&buf, &eas[i], last) - if err != nil { - return nil, err - } - } - return buf.Bytes(), nil -} diff --git a/vendor/github.com/Microsoft/go-winio/file.go b/vendor/github.com/Microsoft/go-winio/file.go deleted file mode 100644 index 0385e410..00000000 --- a/vendor/github.com/Microsoft/go-winio/file.go +++ /dev/null @@ -1,323 +0,0 @@ -// +build windows - -package winio - -import ( - "errors" - "io" - "runtime" - "sync" - "sync/atomic" - "syscall" - "time" -) - -//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx -//sys createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) = CreateIoCompletionPort -//sys getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) = GetQueuedCompletionStatus -//sys setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) = SetFileCompletionNotificationModes -//sys wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult - -type atomicBool int32 - -func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 } -func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) } -func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) } -func (b *atomicBool) swap(new bool) bool { - var newInt int32 - if new { - newInt = 1 - } - return atomic.SwapInt32((*int32)(b), newInt) == 1 -} - -const ( - cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 - cFILE_SKIP_SET_EVENT_ON_HANDLE = 2 -) - -var ( - ErrFileClosed = errors.New("file has already been closed") - ErrTimeout = &timeoutError{} -) - -type timeoutError struct{} - -func (e *timeoutError) Error() string { return "i/o timeout" } -func (e *timeoutError) Timeout() bool { return true } -func (e *timeoutError) Temporary() bool { return true } - -type timeoutChan chan struct{} - -var ioInitOnce sync.Once -var ioCompletionPort syscall.Handle - -// ioResult contains the result of an asynchronous IO operation -type ioResult struct { - bytes uint32 - err error -} - -// ioOperation represents an outstanding asynchronous Win32 IO -type ioOperation struct { - o syscall.Overlapped - ch chan ioResult -} - -func initIo() { - h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff) - if err != nil { - panic(err) - } - ioCompletionPort = h - go ioCompletionProcessor(h) -} - -// win32File implements Reader, Writer, and Closer on a Win32 handle without blocking in a syscall. -// It takes ownership of this handle and will close it if it is garbage collected. -type win32File struct { - handle syscall.Handle - wg sync.WaitGroup - wgLock sync.RWMutex - closing atomicBool - socket bool - readDeadline deadlineHandler - writeDeadline deadlineHandler -} - -type deadlineHandler struct { - setLock sync.Mutex - channel timeoutChan - channelLock sync.RWMutex - timer *time.Timer - timedout atomicBool -} - -// makeWin32File makes a new win32File from an existing file handle -func makeWin32File(h syscall.Handle) (*win32File, error) { - f := &win32File{handle: h} - ioInitOnce.Do(initIo) - _, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff) - if err != nil { - return nil, err - } - err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE) - if err != nil { - return nil, err - } - f.readDeadline.channel = make(timeoutChan) - f.writeDeadline.channel = make(timeoutChan) - return f, nil -} - -func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) { - // If we return the result of makeWin32File directly, it can result in an - // interface-wrapped nil, rather than a nil interface value. - f, err := makeWin32File(h) - if err != nil { - return nil, err - } - return f, nil -} - -// closeHandle closes the resources associated with a Win32 handle -func (f *win32File) closeHandle() { - f.wgLock.Lock() - // Atomically set that we are closing, releasing the resources only once. - if !f.closing.swap(true) { - f.wgLock.Unlock() - // cancel all IO and wait for it to complete - cancelIoEx(f.handle, nil) - f.wg.Wait() - // at this point, no new IO can start - syscall.Close(f.handle) - f.handle = 0 - } else { - f.wgLock.Unlock() - } -} - -// Close closes a win32File. -func (f *win32File) Close() error { - f.closeHandle() - return nil -} - -// prepareIo prepares for a new IO operation. -// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning. -func (f *win32File) prepareIo() (*ioOperation, error) { - f.wgLock.RLock() - if f.closing.isSet() { - f.wgLock.RUnlock() - return nil, ErrFileClosed - } - f.wg.Add(1) - f.wgLock.RUnlock() - c := &ioOperation{} - c.ch = make(chan ioResult) - return c, nil -} - -// ioCompletionProcessor processes completed async IOs forever -func ioCompletionProcessor(h syscall.Handle) { - for { - var bytes uint32 - var key uintptr - var op *ioOperation - err := getQueuedCompletionStatus(h, &bytes, &key, &op, syscall.INFINITE) - if op == nil { - panic(err) - } - op.ch <- ioResult{bytes, err} - } -} - -// asyncIo processes the return value from ReadFile or WriteFile, blocking until -// the operation has actually completed. -func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) { - if err != syscall.ERROR_IO_PENDING { - return int(bytes), err - } - - if f.closing.isSet() { - cancelIoEx(f.handle, &c.o) - } - - var timeout timeoutChan - if d != nil { - d.channelLock.Lock() - timeout = d.channel - d.channelLock.Unlock() - } - - var r ioResult - select { - case r = <-c.ch: - err = r.err - if err == syscall.ERROR_OPERATION_ABORTED { - if f.closing.isSet() { - err = ErrFileClosed - } - } else if err != nil && f.socket { - // err is from Win32. Query the overlapped structure to get the winsock error. - var bytes, flags uint32 - err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags) - } - case <-timeout: - cancelIoEx(f.handle, &c.o) - r = <-c.ch - err = r.err - if err == syscall.ERROR_OPERATION_ABORTED { - err = ErrTimeout - } - } - - // runtime.KeepAlive is needed, as c is passed via native - // code to ioCompletionProcessor, c must remain alive - // until the channel read is complete. - runtime.KeepAlive(c) - return int(r.bytes), err -} - -// Read reads from a file handle. -func (f *win32File) Read(b []byte) (int, error) { - c, err := f.prepareIo() - if err != nil { - return 0, err - } - defer f.wg.Done() - - if f.readDeadline.timedout.isSet() { - return 0, ErrTimeout - } - - var bytes uint32 - err = syscall.ReadFile(f.handle, b, &bytes, &c.o) - n, err := f.asyncIo(c, &f.readDeadline, bytes, err) - runtime.KeepAlive(b) - - // Handle EOF conditions. - if err == nil && n == 0 && len(b) != 0 { - return 0, io.EOF - } else if err == syscall.ERROR_BROKEN_PIPE { - return 0, io.EOF - } else { - return n, err - } -} - -// Write writes to a file handle. -func (f *win32File) Write(b []byte) (int, error) { - c, err := f.prepareIo() - if err != nil { - return 0, err - } - defer f.wg.Done() - - if f.writeDeadline.timedout.isSet() { - return 0, ErrTimeout - } - - var bytes uint32 - err = syscall.WriteFile(f.handle, b, &bytes, &c.o) - n, err := f.asyncIo(c, &f.writeDeadline, bytes, err) - runtime.KeepAlive(b) - return n, err -} - -func (f *win32File) SetReadDeadline(deadline time.Time) error { - return f.readDeadline.set(deadline) -} - -func (f *win32File) SetWriteDeadline(deadline time.Time) error { - return f.writeDeadline.set(deadline) -} - -func (f *win32File) Flush() error { - return syscall.FlushFileBuffers(f.handle) -} - -func (f *win32File) Fd() uintptr { - return uintptr(f.handle) -} - -func (d *deadlineHandler) set(deadline time.Time) error { - d.setLock.Lock() - defer d.setLock.Unlock() - - if d.timer != nil { - if !d.timer.Stop() { - <-d.channel - } - d.timer = nil - } - d.timedout.setFalse() - - select { - case <-d.channel: - d.channelLock.Lock() - d.channel = make(chan struct{}) - d.channelLock.Unlock() - default: - } - - if deadline.IsZero() { - return nil - } - - timeoutIO := func() { - d.timedout.setTrue() - close(d.channel) - } - - now := time.Now() - duration := deadline.Sub(now) - if deadline.After(now) { - // Deadline is in the future, set a timer to wait - d.timer = time.AfterFunc(duration, timeoutIO) - } else { - // Deadline is in the past. Cancel all pending IO now. - timeoutIO() - } - return nil -} diff --git a/vendor/github.com/Microsoft/go-winio/fileinfo.go b/vendor/github.com/Microsoft/go-winio/fileinfo.go deleted file mode 100644 index ada2fbab..00000000 --- a/vendor/github.com/Microsoft/go-winio/fileinfo.go +++ /dev/null @@ -1,61 +0,0 @@ -// +build windows - -package winio - -import ( - "os" - "runtime" - "syscall" - "unsafe" -) - -//sys getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = GetFileInformationByHandleEx -//sys setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) = SetFileInformationByHandle - -const ( - fileBasicInfo = 0 - fileIDInfo = 0x12 -) - -// FileBasicInfo contains file access time and file attributes information. -type FileBasicInfo struct { - CreationTime, LastAccessTime, LastWriteTime, ChangeTime syscall.Filetime - FileAttributes uint32 - pad uint32 // padding -} - -// GetFileBasicInfo retrieves times and attributes for a file. -func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) { - bi := &FileBasicInfo{} - if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { - return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} - } - runtime.KeepAlive(f) - return bi, nil -} - -// SetFileBasicInfo sets times and attributes for a file. -func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error { - if err := setFileInformationByHandle(syscall.Handle(f.Fd()), fileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil { - return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err} - } - runtime.KeepAlive(f) - return nil -} - -// FileIDInfo contains the volume serial number and file ID for a file. This pair should be -// unique on a system. -type FileIDInfo struct { - VolumeSerialNumber uint64 - FileID [16]byte -} - -// GetFileID retrieves the unique (volume, file ID) pair for a file. -func GetFileID(f *os.File) (*FileIDInfo, error) { - fileID := &FileIDInfo{} - if err := getFileInformationByHandleEx(syscall.Handle(f.Fd()), fileIDInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil { - return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err} - } - runtime.KeepAlive(f) - return fileID, nil -} diff --git a/vendor/github.com/Microsoft/go-winio/go.mod b/vendor/github.com/Microsoft/go-winio/go.mod deleted file mode 100644 index b3846826..00000000 --- a/vendor/github.com/Microsoft/go-winio/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/Microsoft/go-winio - -go 1.12 - -require ( - github.com/pkg/errors v0.8.1 - github.com/sirupsen/logrus v1.4.1 - golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b -) diff --git a/vendor/github.com/Microsoft/go-winio/go.sum b/vendor/github.com/Microsoft/go-winio/go.sum deleted file mode 100644 index babb4a70..00000000 --- a/vendor/github.com/Microsoft/go-winio/go.sum +++ /dev/null @@ -1,16 +0,0 @@ -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/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go deleted file mode 100644 index dbfe790e..00000000 --- a/vendor/github.com/Microsoft/go-winio/hvsock.go +++ /dev/null @@ -1,305 +0,0 @@ -package winio - -import ( - "fmt" - "io" - "net" - "os" - "syscall" - "time" - "unsafe" - - "github.com/Microsoft/go-winio/pkg/guid" -) - -//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind - -const ( - afHvSock = 34 // AF_HYPERV - - socketError = ^uintptr(0) -) - -// An HvsockAddr is an address for a AF_HYPERV socket. -type HvsockAddr struct { - VMID guid.GUID - ServiceID guid.GUID -} - -type rawHvsockAddr struct { - Family uint16 - _ uint16 - VMID guid.GUID - ServiceID guid.GUID -} - -// Network returns the address's network name, "hvsock". -func (addr *HvsockAddr) Network() string { - return "hvsock" -} - -func (addr *HvsockAddr) String() string { - return fmt.Sprintf("%s:%s", &addr.VMID, &addr.ServiceID) -} - -// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port. -func VsockServiceID(port uint32) guid.GUID { - g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3") - g.Data1 = port - return g -} - -func (addr *HvsockAddr) raw() rawHvsockAddr { - return rawHvsockAddr{ - Family: afHvSock, - VMID: addr.VMID, - ServiceID: addr.ServiceID, - } -} - -func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) { - addr.VMID = raw.VMID - addr.ServiceID = raw.ServiceID -} - -// HvsockListener is a socket listener for the AF_HYPERV address family. -type HvsockListener struct { - sock *win32File - addr HvsockAddr -} - -// HvsockConn is a connected socket of the AF_HYPERV address family. -type HvsockConn struct { - sock *win32File - local, remote HvsockAddr -} - -func newHvSocket() (*win32File, error) { - fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1) - if err != nil { - return nil, os.NewSyscallError("socket", err) - } - f, err := makeWin32File(fd) - if err != nil { - syscall.Close(fd) - return nil, err - } - f.socket = true - return f, nil -} - -// ListenHvsock listens for connections on the specified hvsock address. -func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) { - l := &HvsockListener{addr: *addr} - sock, err := newHvSocket() - if err != nil { - return nil, l.opErr("listen", err) - } - sa := addr.raw() - err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa))) - if err != nil { - return nil, l.opErr("listen", os.NewSyscallError("socket", err)) - } - err = syscall.Listen(sock.handle, 16) - if err != nil { - return nil, l.opErr("listen", os.NewSyscallError("listen", err)) - } - return &HvsockListener{sock: sock, addr: *addr}, nil -} - -func (l *HvsockListener) opErr(op string, err error) error { - return &net.OpError{Op: op, Net: "hvsock", Addr: &l.addr, Err: err} -} - -// Addr returns the listener's network address. -func (l *HvsockListener) Addr() net.Addr { - return &l.addr -} - -// Accept waits for the next connection and returns it. -func (l *HvsockListener) Accept() (_ net.Conn, err error) { - sock, err := newHvSocket() - if err != nil { - return nil, l.opErr("accept", err) - } - defer func() { - if sock != nil { - sock.Close() - } - }() - c, err := l.sock.prepareIo() - if err != nil { - return nil, l.opErr("accept", err) - } - defer l.sock.wg.Done() - - // AcceptEx, per documentation, requires an extra 16 bytes per address. - const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{})) - var addrbuf [addrlen * 2]byte - - var bytes uint32 - err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o) - _, err = l.sock.asyncIo(c, nil, bytes, err) - if err != nil { - return nil, l.opErr("accept", os.NewSyscallError("acceptex", err)) - } - conn := &HvsockConn{ - sock: sock, - } - conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0]))) - conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen]))) - sock = nil - return conn, nil -} - -// Close closes the listener, causing any pending Accept calls to fail. -func (l *HvsockListener) Close() error { - return l.sock.Close() -} - -/* Need to finish ConnectEx handling -func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) { - sock, err := newHvSocket() - if err != nil { - return nil, err - } - defer func() { - if sock != nil { - sock.Close() - } - }() - c, err := sock.prepareIo() - if err != nil { - return nil, err - } - defer sock.wg.Done() - var bytes uint32 - err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o) - _, err = sock.asyncIo(ctx, c, nil, bytes, err) - if err != nil { - return nil, err - } - conn := &HvsockConn{ - sock: sock, - remote: *addr, - } - sock = nil - return conn, nil -} -*/ - -func (conn *HvsockConn) opErr(op string, err error) error { - return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err} -} - -func (conn *HvsockConn) Read(b []byte) (int, error) { - c, err := conn.sock.prepareIo() - if err != nil { - return 0, conn.opErr("read", err) - } - defer conn.sock.wg.Done() - buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} - var flags, bytes uint32 - err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil) - n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err) - if err != nil { - if _, ok := err.(syscall.Errno); ok { - err = os.NewSyscallError("wsarecv", err) - } - return 0, conn.opErr("read", err) - } else if n == 0 { - err = io.EOF - } - return n, err -} - -func (conn *HvsockConn) Write(b []byte) (int, error) { - t := 0 - for len(b) != 0 { - n, err := conn.write(b) - if err != nil { - return t + n, err - } - t += n - b = b[n:] - } - return t, nil -} - -func (conn *HvsockConn) write(b []byte) (int, error) { - c, err := conn.sock.prepareIo() - if err != nil { - return 0, conn.opErr("write", err) - } - defer conn.sock.wg.Done() - buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))} - var bytes uint32 - err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil) - n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err) - if err != nil { - if _, ok := err.(syscall.Errno); ok { - err = os.NewSyscallError("wsasend", err) - } - return 0, conn.opErr("write", err) - } - return n, err -} - -// Close closes the socket connection, failing any pending read or write calls. -func (conn *HvsockConn) Close() error { - return conn.sock.Close() -} - -func (conn *HvsockConn) shutdown(how int) error { - err := syscall.Shutdown(conn.sock.handle, syscall.SHUT_RD) - if err != nil { - return os.NewSyscallError("shutdown", err) - } - return nil -} - -// CloseRead shuts down the read end of the socket. -func (conn *HvsockConn) CloseRead() error { - err := conn.shutdown(syscall.SHUT_RD) - if err != nil { - return conn.opErr("close", err) - } - return nil -} - -// CloseWrite shuts down the write end of the socket, notifying the other endpoint that -// no more data will be written. -func (conn *HvsockConn) CloseWrite() error { - err := conn.shutdown(syscall.SHUT_WR) - if err != nil { - return conn.opErr("close", err) - } - return nil -} - -// LocalAddr returns the local address of the connection. -func (conn *HvsockConn) LocalAddr() net.Addr { - return &conn.local -} - -// RemoteAddr returns the remote address of the connection. -func (conn *HvsockConn) RemoteAddr() net.Addr { - return &conn.remote -} - -// SetDeadline implements the net.Conn SetDeadline method. -func (conn *HvsockConn) SetDeadline(t time.Time) error { - conn.SetReadDeadline(t) - conn.SetWriteDeadline(t) - return nil -} - -// SetReadDeadline implements the net.Conn SetReadDeadline method. -func (conn *HvsockConn) SetReadDeadline(t time.Time) error { - return conn.sock.SetReadDeadline(t) -} - -// SetWriteDeadline implements the net.Conn SetWriteDeadline method. -func (conn *HvsockConn) SetWriteDeadline(t time.Time) error { - return conn.sock.SetWriteDeadline(t) -} diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go deleted file mode 100644 index d6a46f6a..00000000 --- a/vendor/github.com/Microsoft/go-winio/pipe.go +++ /dev/null @@ -1,510 +0,0 @@ -// +build windows - -package winio - -import ( - "context" - "errors" - "fmt" - "io" - "net" - "os" - "runtime" - "syscall" - "time" - "unsafe" -) - -//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe -//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW -//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW -//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo -//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW -//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc -//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile -//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb -//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U -//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl - -type ioStatusBlock struct { - Status, Information uintptr -} - -type objectAttributes struct { - Length uintptr - RootDirectory uintptr - ObjectName *unicodeString - Attributes uintptr - SecurityDescriptor *securityDescriptor - SecurityQoS uintptr -} - -type unicodeString struct { - Length uint16 - MaximumLength uint16 - Buffer uintptr -} - -type securityDescriptor struct { - Revision byte - Sbz1 byte - Control uint16 - Owner uintptr - Group uintptr - Sacl uintptr - Dacl uintptr -} - -type ntstatus int32 - -func (status ntstatus) Err() error { - if status >= 0 { - return nil - } - return rtlNtStatusToDosError(status) -} - -const ( - cERROR_PIPE_BUSY = syscall.Errno(231) - cERROR_NO_DATA = syscall.Errno(232) - cERROR_PIPE_CONNECTED = syscall.Errno(535) - cERROR_SEM_TIMEOUT = syscall.Errno(121) - - cSECURITY_SQOS_PRESENT = 0x100000 - cSECURITY_ANONYMOUS = 0 - - cPIPE_TYPE_MESSAGE = 4 - - cPIPE_READMODE_MESSAGE = 2 - - cFILE_OPEN = 1 - cFILE_CREATE = 2 - - cFILE_PIPE_MESSAGE_TYPE = 1 - cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2 - - cSE_DACL_PRESENT = 4 -) - -var ( - // ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed. - // This error should match net.errClosing since docker takes a dependency on its text. - ErrPipeListenerClosed = errors.New("use of closed network connection") - - errPipeWriteClosed = errors.New("pipe has been closed for write") -) - -type win32Pipe struct { - *win32File - path string -} - -type win32MessageBytePipe struct { - win32Pipe - writeClosed bool - readEOF bool -} - -type pipeAddress string - -func (f *win32Pipe) LocalAddr() net.Addr { - return pipeAddress(f.path) -} - -func (f *win32Pipe) RemoteAddr() net.Addr { - return pipeAddress(f.path) -} - -func (f *win32Pipe) SetDeadline(t time.Time) error { - f.SetReadDeadline(t) - f.SetWriteDeadline(t) - return nil -} - -// CloseWrite closes the write side of a message pipe in byte mode. -func (f *win32MessageBytePipe) CloseWrite() error { - if f.writeClosed { - return errPipeWriteClosed - } - err := f.win32File.Flush() - if err != nil { - return err - } - _, err = f.win32File.Write(nil) - if err != nil { - return err - } - f.writeClosed = true - return nil -} - -// Write writes bytes to a message pipe in byte mode. Zero-byte writes are ignored, since -// they are used to implement CloseWrite(). -func (f *win32MessageBytePipe) Write(b []byte) (int, error) { - if f.writeClosed { - return 0, errPipeWriteClosed - } - if len(b) == 0 { - return 0, nil - } - return f.win32File.Write(b) -} - -// Read reads bytes from a message pipe in byte mode. A read of a zero-byte message on a message -// mode pipe will return io.EOF, as will all subsequent reads. -func (f *win32MessageBytePipe) Read(b []byte) (int, error) { - if f.readEOF { - return 0, io.EOF - } - n, err := f.win32File.Read(b) - if err == io.EOF { - // If this was the result of a zero-byte read, then - // it is possible that the read was due to a zero-size - // message. Since we are simulating CloseWrite with a - // zero-byte message, ensure that all future Read() calls - // also return EOF. - f.readEOF = true - } else if err == syscall.ERROR_MORE_DATA { - // ERROR_MORE_DATA indicates that the pipe's read mode is message mode - // and the message still has more bytes. Treat this as a success, since - // this package presents all named pipes as byte streams. - err = nil - } - return n, err -} - -func (s pipeAddress) Network() string { - return "pipe" -} - -func (s pipeAddress) String() string { - return string(s) -} - -// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout. -func tryDialPipe(ctx context.Context, path *string) (syscall.Handle, error) { - for { - select { - case <-ctx.Done(): - return syscall.Handle(0), ctx.Err() - default: - h, err := createFile(*path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0) - if err == nil { - return h, nil - } - if err != cERROR_PIPE_BUSY { - return h, &os.PathError{Err: err, Op: "open", Path: *path} - } - // Wait 10 msec and try again. This is a rather simplistic - // view, as we always try each 10 milliseconds. - time.Sleep(time.Millisecond * 10) - } - } -} - -// DialPipe connects to a named pipe by path, timing out if the connection -// takes longer than the specified duration. If timeout is nil, then we use -// a default timeout of 2 seconds. (We do not use WaitNamedPipe.) -func DialPipe(path string, timeout *time.Duration) (net.Conn, error) { - var absTimeout time.Time - if timeout != nil { - absTimeout = time.Now().Add(*timeout) - } else { - absTimeout = time.Now().Add(time.Second * 2) - } - ctx, _ := context.WithDeadline(context.Background(), absTimeout) - conn, err := DialPipeContext(ctx, path) - if err == context.DeadlineExceeded { - return nil, ErrTimeout - } - return conn, err -} - -// DialPipeContext attempts to connect to a named pipe by `path` until `ctx` -// cancellation or timeout. -func DialPipeContext(ctx context.Context, path string) (net.Conn, error) { - var err error - var h syscall.Handle - h, err = tryDialPipe(ctx, &path) - if err != nil { - return nil, err - } - - var flags uint32 - err = getNamedPipeInfo(h, &flags, nil, nil, nil) - if err != nil { - return nil, err - } - - f, err := makeWin32File(h) - if err != nil { - syscall.Close(h) - return nil, err - } - - // If the pipe is in message mode, return a message byte pipe, which - // supports CloseWrite(). - if flags&cPIPE_TYPE_MESSAGE != 0 { - return &win32MessageBytePipe{ - win32Pipe: win32Pipe{win32File: f, path: path}, - }, nil - } - return &win32Pipe{win32File: f, path: path}, nil -} - -type acceptResponse struct { - f *win32File - err error -} - -type win32PipeListener struct { - firstHandle syscall.Handle - path string - config PipeConfig - acceptCh chan (chan acceptResponse) - closeCh chan int - doneCh chan int -} - -func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (syscall.Handle, error) { - path16, err := syscall.UTF16FromString(path) - if err != nil { - return 0, &os.PathError{Op: "open", Path: path, Err: err} - } - - var oa objectAttributes - oa.Length = unsafe.Sizeof(oa) - - var ntPath unicodeString - if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil { - return 0, &os.PathError{Op: "open", Path: path, Err: err} - } - defer localFree(ntPath.Buffer) - oa.ObjectName = &ntPath - - // The security descriptor is only needed for the first pipe. - if first { - if sd != nil { - len := uint32(len(sd)) - sdb := localAlloc(0, len) - defer localFree(sdb) - copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd) - oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb)) - } else { - // Construct the default named pipe security descriptor. - var dacl uintptr - if err := rtlDefaultNpAcl(&dacl).Err(); err != nil { - return 0, fmt.Errorf("getting default named pipe ACL: %s", err) - } - defer localFree(dacl) - - sdb := &securityDescriptor{ - Revision: 1, - Control: cSE_DACL_PRESENT, - Dacl: dacl, - } - oa.SecurityDescriptor = sdb - } - } - - typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS) - if c.MessageMode { - typ |= cFILE_PIPE_MESSAGE_TYPE - } - - disposition := uint32(cFILE_OPEN) - access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE) - if first { - disposition = cFILE_CREATE - // By not asking for read or write access, the named pipe file system - // will put this pipe into an initially disconnected state, blocking - // client connections until the next call with first == false. - access = syscall.SYNCHRONIZE - } - - timeout := int64(-50 * 10000) // 50ms - - var ( - h syscall.Handle - iosb ioStatusBlock - ) - err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err() - if err != nil { - return 0, &os.PathError{Op: "open", Path: path, Err: err} - } - - runtime.KeepAlive(ntPath) - return h, nil -} - -func (l *win32PipeListener) makeServerPipe() (*win32File, error) { - h, err := makeServerPipeHandle(l.path, nil, &l.config, false) - if err != nil { - return nil, err - } - f, err := makeWin32File(h) - if err != nil { - syscall.Close(h) - return nil, err - } - return f, nil -} - -func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) { - p, err := l.makeServerPipe() - if err != nil { - return nil, err - } - - // Wait for the client to connect. - ch := make(chan error) - go func(p *win32File) { - ch <- connectPipe(p) - }(p) - - select { - case err = <-ch: - if err != nil { - p.Close() - p = nil - } - case <-l.closeCh: - // Abort the connect request by closing the handle. - p.Close() - p = nil - err = <-ch - if err == nil || err == ErrFileClosed { - err = ErrPipeListenerClosed - } - } - return p, err -} - -func (l *win32PipeListener) listenerRoutine() { - closed := false - for !closed { - select { - case <-l.closeCh: - closed = true - case responseCh := <-l.acceptCh: - var ( - p *win32File - err error - ) - for { - p, err = l.makeConnectedServerPipe() - // If the connection was immediately closed by the client, try - // again. - if err != cERROR_NO_DATA { - break - } - } - responseCh <- acceptResponse{p, err} - closed = err == ErrPipeListenerClosed - } - } - syscall.Close(l.firstHandle) - l.firstHandle = 0 - // Notify Close() and Accept() callers that the handle has been closed. - close(l.doneCh) -} - -// PipeConfig contain configuration for the pipe listener. -type PipeConfig struct { - // SecurityDescriptor contains a Windows security descriptor in SDDL format. - SecurityDescriptor string - - // MessageMode determines whether the pipe is in byte or message mode. In either - // case the pipe is read in byte mode by default. The only practical difference in - // this implementation is that CloseWrite() is only supported for message mode pipes; - // CloseWrite() is implemented as a zero-byte write, but zero-byte writes are only - // transferred to the reader (and returned as io.EOF in this implementation) - // when the pipe is in message mode. - MessageMode bool - - // InputBufferSize specifies the size the input buffer, in bytes. - InputBufferSize int32 - - // OutputBufferSize specifies the size the input buffer, in bytes. - OutputBufferSize int32 -} - -// ListenPipe creates a listener on a Windows named pipe path, e.g. \\.\pipe\mypipe. -// The pipe must not already exist. -func ListenPipe(path string, c *PipeConfig) (net.Listener, error) { - var ( - sd []byte - err error - ) - if c == nil { - c = &PipeConfig{} - } - if c.SecurityDescriptor != "" { - sd, err = SddlToSecurityDescriptor(c.SecurityDescriptor) - if err != nil { - return nil, err - } - } - h, err := makeServerPipeHandle(path, sd, c, true) - if err != nil { - return nil, err - } - l := &win32PipeListener{ - firstHandle: h, - path: path, - config: *c, - acceptCh: make(chan (chan acceptResponse)), - closeCh: make(chan int), - doneCh: make(chan int), - } - go l.listenerRoutine() - return l, nil -} - -func connectPipe(p *win32File) error { - c, err := p.prepareIo() - if err != nil { - return err - } - defer p.wg.Done() - - err = connectNamedPipe(p.handle, &c.o) - _, err = p.asyncIo(c, nil, 0, err) - if err != nil && err != cERROR_PIPE_CONNECTED { - return err - } - return nil -} - -func (l *win32PipeListener) Accept() (net.Conn, error) { - ch := make(chan acceptResponse) - select { - case l.acceptCh <- ch: - response := <-ch - err := response.err - if err != nil { - return nil, err - } - if l.config.MessageMode { - return &win32MessageBytePipe{ - win32Pipe: win32Pipe{win32File: response.f, path: l.path}, - }, nil - } - return &win32Pipe{win32File: response.f, path: l.path}, nil - case <-l.doneCh: - return nil, ErrPipeListenerClosed - } -} - -func (l *win32PipeListener) Close() error { - select { - case l.closeCh <- 1: - <-l.doneCh - case <-l.doneCh: - } - return nil -} - -func (l *win32PipeListener) Addr() net.Addr { - return pipeAddress(l.path) -} diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go deleted file mode 100644 index 58640657..00000000 --- a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go +++ /dev/null @@ -1,235 +0,0 @@ -// Package guid provides a GUID type. The backing structure for a GUID is -// identical to that used by the golang.org/x/sys/windows GUID type. -// There are two main binary encodings used for a GUID, the big-endian encoding, -// and the Windows (mixed-endian) encoding. See here for details: -// https://en.wikipedia.org/wiki/Universally_unique_identifier#Encoding -package guid - -import ( - "crypto/rand" - "crypto/sha1" - "encoding" - "encoding/binary" - "fmt" - "strconv" - - "golang.org/x/sys/windows" -) - -// Variant specifies which GUID variant (or "type") of the GUID. It determines -// how the entirety of the rest of the GUID is interpreted. -type Variant uint8 - -// The variants specified by RFC 4122. -const ( - // VariantUnknown specifies a GUID variant which does not conform to one of - // the variant encodings specified in RFC 4122. - VariantUnknown Variant = iota - VariantNCS - VariantRFC4122 - VariantMicrosoft - VariantFuture -) - -// Version specifies how the bits in the GUID were generated. For instance, a -// version 4 GUID is randomly generated, and a version 5 is generated from the -// hash of an input string. -type Version uint8 - -var _ = (encoding.TextMarshaler)(GUID{}) -var _ = (encoding.TextUnmarshaler)(&GUID{}) - -// GUID represents a GUID/UUID. It has the same structure as -// golang.org/x/sys/windows.GUID so that it can be used with functions expecting -// that type. It is defined as its own type so that stringification and -// marshaling can be supported. The representation matches that used by native -// Windows code. -type GUID windows.GUID - -// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122. -func NewV4() (GUID, error) { - var b [16]byte - if _, err := rand.Read(b[:]); err != nil { - return GUID{}, err - } - - g := FromArray(b) - g.setVersion(4) // Version 4 means randomly generated. - g.setVariant(VariantRFC4122) - - return g, nil -} - -// NewV5 returns a new version 5 (generated from a string via SHA-1 hashing) -// GUID, as defined by RFC 4122. The RFC is unclear on the encoding of the name, -// and the sample code treats it as a series of bytes, so we do the same here. -// -// Some implementations, such as those found on Windows, treat the name as a -// big-endian UTF16 stream of bytes. If that is desired, the string can be -// encoded as such before being passed to this function. -func NewV5(namespace GUID, name []byte) (GUID, error) { - b := sha1.New() - namespaceBytes := namespace.ToArray() - b.Write(namespaceBytes[:]) - b.Write(name) - - a := [16]byte{} - copy(a[:], b.Sum(nil)) - - g := FromArray(a) - g.setVersion(5) // Version 5 means generated from a string. - g.setVariant(VariantRFC4122) - - return g, nil -} - -func fromArray(b [16]byte, order binary.ByteOrder) GUID { - var g GUID - g.Data1 = order.Uint32(b[0:4]) - g.Data2 = order.Uint16(b[4:6]) - g.Data3 = order.Uint16(b[6:8]) - copy(g.Data4[:], b[8:16]) - return g -} - -func (g GUID) toArray(order binary.ByteOrder) [16]byte { - b := [16]byte{} - order.PutUint32(b[0:4], g.Data1) - order.PutUint16(b[4:6], g.Data2) - order.PutUint16(b[6:8], g.Data3) - copy(b[8:16], g.Data4[:]) - return b -} - -// FromArray constructs a GUID from a big-endian encoding array of 16 bytes. -func FromArray(b [16]byte) GUID { - return fromArray(b, binary.BigEndian) -} - -// ToArray returns an array of 16 bytes representing the GUID in big-endian -// encoding. -func (g GUID) ToArray() [16]byte { - return g.toArray(binary.BigEndian) -} - -// FromWindowsArray constructs a GUID from a Windows encoding array of bytes. -func FromWindowsArray(b [16]byte) GUID { - return fromArray(b, binary.LittleEndian) -} - -// ToWindowsArray returns an array of 16 bytes representing the GUID in Windows -// encoding. -func (g GUID) ToWindowsArray() [16]byte { - return g.toArray(binary.LittleEndian) -} - -func (g GUID) String() string { - return fmt.Sprintf( - "%08x-%04x-%04x-%04x-%012x", - g.Data1, - g.Data2, - g.Data3, - g.Data4[:2], - g.Data4[2:]) -} - -// FromString parses a string containing a GUID and returns the GUID. The only -// format currently supported is the `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` -// format. -func FromString(s string) (GUID, error) { - if len(s) != 36 { - return GUID{}, fmt.Errorf("invalid GUID %q", s) - } - if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { - return GUID{}, fmt.Errorf("invalid GUID %q", s) - } - - var g GUID - - data1, err := strconv.ParseUint(s[0:8], 16, 32) - if err != nil { - return GUID{}, fmt.Errorf("invalid GUID %q", s) - } - g.Data1 = uint32(data1) - - data2, err := strconv.ParseUint(s[9:13], 16, 16) - if err != nil { - return GUID{}, fmt.Errorf("invalid GUID %q", s) - } - g.Data2 = uint16(data2) - - data3, err := strconv.ParseUint(s[14:18], 16, 16) - if err != nil { - return GUID{}, fmt.Errorf("invalid GUID %q", s) - } - g.Data3 = uint16(data3) - - for i, x := range []int{19, 21, 24, 26, 28, 30, 32, 34} { - v, err := strconv.ParseUint(s[x:x+2], 16, 8) - if err != nil { - return GUID{}, fmt.Errorf("invalid GUID %q", s) - } - g.Data4[i] = uint8(v) - } - - return g, nil -} - -func (g *GUID) setVariant(v Variant) { - d := g.Data4[0] - switch v { - case VariantNCS: - d = (d & 0x7f) - case VariantRFC4122: - d = (d & 0x3f) | 0x80 - case VariantMicrosoft: - d = (d & 0x1f) | 0xc0 - case VariantFuture: - d = (d & 0x0f) | 0xe0 - case VariantUnknown: - fallthrough - default: - panic(fmt.Sprintf("invalid variant: %d", v)) - } - g.Data4[0] = d -} - -// Variant returns the GUID variant, as defined in RFC 4122. -func (g GUID) Variant() Variant { - b := g.Data4[0] - if b&0x80 == 0 { - return VariantNCS - } else if b&0xc0 == 0x80 { - return VariantRFC4122 - } else if b&0xe0 == 0xc0 { - return VariantMicrosoft - } else if b&0xe0 == 0xe0 { - return VariantFuture - } - return VariantUnknown -} - -func (g *GUID) setVersion(v Version) { - g.Data3 = (g.Data3 & 0x0fff) | (uint16(v) << 12) -} - -// Version returns the GUID version, as defined in RFC 4122. -func (g GUID) Version() Version { - return Version((g.Data3 & 0xF000) >> 12) -} - -// MarshalText returns the textual representation of the GUID. -func (g GUID) MarshalText() ([]byte, error) { - return []byte(g.String()), nil -} - -// UnmarshalText takes the textual representation of a GUID, and unmarhals it -// into this GUID. -func (g *GUID) UnmarshalText(text []byte) error { - g2, err := FromString(string(text)) - if err != nil { - return err - } - *g = g2 - return nil -} diff --git a/vendor/github.com/Microsoft/go-winio/privilege.go b/vendor/github.com/Microsoft/go-winio/privilege.go deleted file mode 100644 index 9c83d36f..00000000 --- a/vendor/github.com/Microsoft/go-winio/privilege.go +++ /dev/null @@ -1,202 +0,0 @@ -// +build windows - -package winio - -import ( - "bytes" - "encoding/binary" - "fmt" - "runtime" - "sync" - "syscall" - "unicode/utf16" - - "golang.org/x/sys/windows" -) - -//sys adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges -//sys impersonateSelf(level uint32) (err error) = advapi32.ImpersonateSelf -//sys revertToSelf() (err error) = advapi32.RevertToSelf -//sys openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) = advapi32.OpenThreadToken -//sys getCurrentThread() (h syscall.Handle) = GetCurrentThread -//sys lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) = advapi32.LookupPrivilegeValueW -//sys lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW -//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW - -const ( - SE_PRIVILEGE_ENABLED = 2 - - ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300 - - SeBackupPrivilege = "SeBackupPrivilege" - SeRestorePrivilege = "SeRestorePrivilege" -) - -const ( - securityAnonymous = iota - securityIdentification - securityImpersonation - securityDelegation -) - -var ( - privNames = make(map[string]uint64) - privNameMutex sync.Mutex -) - -// PrivilegeError represents an error enabling privileges. -type PrivilegeError struct { - privileges []uint64 -} - -func (e *PrivilegeError) Error() string { - s := "" - if len(e.privileges) > 1 { - s = "Could not enable privileges " - } else { - s = "Could not enable privilege " - } - for i, p := range e.privileges { - if i != 0 { - s += ", " - } - s += `"` - s += getPrivilegeName(p) - s += `"` - } - return s -} - -// RunWithPrivilege enables a single privilege for a function call. -func RunWithPrivilege(name string, fn func() error) error { - return RunWithPrivileges([]string{name}, fn) -} - -// RunWithPrivileges enables privileges for a function call. -func RunWithPrivileges(names []string, fn func() error) error { - privileges, err := mapPrivileges(names) - if err != nil { - return err - } - runtime.LockOSThread() - defer runtime.UnlockOSThread() - token, err := newThreadToken() - if err != nil { - return err - } - defer releaseThreadToken(token) - err = adjustPrivileges(token, privileges, SE_PRIVILEGE_ENABLED) - if err != nil { - return err - } - return fn() -} - -func mapPrivileges(names []string) ([]uint64, error) { - var privileges []uint64 - privNameMutex.Lock() - defer privNameMutex.Unlock() - for _, name := range names { - p, ok := privNames[name] - if !ok { - err := lookupPrivilegeValue("", name, &p) - if err != nil { - return nil, err - } - privNames[name] = p - } - privileges = append(privileges, p) - } - return privileges, nil -} - -// EnableProcessPrivileges enables privileges globally for the process. -func EnableProcessPrivileges(names []string) error { - return enableDisableProcessPrivilege(names, SE_PRIVILEGE_ENABLED) -} - -// DisableProcessPrivileges disables privileges globally for the process. -func DisableProcessPrivileges(names []string) error { - return enableDisableProcessPrivilege(names, 0) -} - -func enableDisableProcessPrivilege(names []string, action uint32) error { - privileges, err := mapPrivileges(names) - if err != nil { - return err - } - - p, _ := windows.GetCurrentProcess() - var token windows.Token - err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token) - if err != nil { - return err - } - - defer token.Close() - return adjustPrivileges(token, privileges, action) -} - -func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error { - var b bytes.Buffer - binary.Write(&b, binary.LittleEndian, uint32(len(privileges))) - for _, p := range privileges { - binary.Write(&b, binary.LittleEndian, p) - binary.Write(&b, binary.LittleEndian, action) - } - prevState := make([]byte, b.Len()) - reqSize := uint32(0) - success, err := adjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(len(prevState)), &prevState[0], &reqSize) - if !success { - return err - } - if err == ERROR_NOT_ALL_ASSIGNED { - return &PrivilegeError{privileges} - } - return nil -} - -func getPrivilegeName(luid uint64) string { - var nameBuffer [256]uint16 - bufSize := uint32(len(nameBuffer)) - err := lookupPrivilegeName("", &luid, &nameBuffer[0], &bufSize) - if err != nil { - return fmt.Sprintf("", luid) - } - - var displayNameBuffer [256]uint16 - displayBufSize := uint32(len(displayNameBuffer)) - var langID uint32 - err = lookupPrivilegeDisplayName("", &nameBuffer[0], &displayNameBuffer[0], &displayBufSize, &langID) - if err != nil { - return fmt.Sprintf("", string(utf16.Decode(nameBuffer[:bufSize]))) - } - - return string(utf16.Decode(displayNameBuffer[:displayBufSize])) -} - -func newThreadToken() (windows.Token, error) { - err := impersonateSelf(securityImpersonation) - if err != nil { - return 0, err - } - - var token windows.Token - err = openThreadToken(getCurrentThread(), syscall.TOKEN_ADJUST_PRIVILEGES|syscall.TOKEN_QUERY, false, &token) - if err != nil { - rerr := revertToSelf() - if rerr != nil { - panic(rerr) - } - return 0, err - } - return token, nil -} - -func releaseThreadToken(h windows.Token) { - err := revertToSelf() - if err != nil { - panic(err) - } - h.Close() -} diff --git a/vendor/github.com/Microsoft/go-winio/reparse.go b/vendor/github.com/Microsoft/go-winio/reparse.go deleted file mode 100644 index fc1ee4d3..00000000 --- a/vendor/github.com/Microsoft/go-winio/reparse.go +++ /dev/null @@ -1,128 +0,0 @@ -package winio - -import ( - "bytes" - "encoding/binary" - "fmt" - "strings" - "unicode/utf16" - "unsafe" -) - -const ( - reparseTagMountPoint = 0xA0000003 - reparseTagSymlink = 0xA000000C -) - -type reparseDataBuffer struct { - ReparseTag uint32 - ReparseDataLength uint16 - Reserved uint16 - SubstituteNameOffset uint16 - SubstituteNameLength uint16 - PrintNameOffset uint16 - PrintNameLength uint16 -} - -// ReparsePoint describes a Win32 symlink or mount point. -type ReparsePoint struct { - Target string - IsMountPoint bool -} - -// UnsupportedReparsePointError is returned when trying to decode a non-symlink or -// mount point reparse point. -type UnsupportedReparsePointError struct { - Tag uint32 -} - -func (e *UnsupportedReparsePointError) Error() string { - return fmt.Sprintf("unsupported reparse point %x", e.Tag) -} - -// DecodeReparsePoint decodes a Win32 REPARSE_DATA_BUFFER structure containing either a symlink -// or a mount point. -func DecodeReparsePoint(b []byte) (*ReparsePoint, error) { - tag := binary.LittleEndian.Uint32(b[0:4]) - return DecodeReparsePointData(tag, b[8:]) -} - -func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) { - isMountPoint := false - switch tag { - case reparseTagMountPoint: - isMountPoint = true - case reparseTagSymlink: - default: - return nil, &UnsupportedReparsePointError{tag} - } - nameOffset := 8 + binary.LittleEndian.Uint16(b[4:6]) - if !isMountPoint { - nameOffset += 4 - } - nameLength := binary.LittleEndian.Uint16(b[6:8]) - name := make([]uint16, nameLength/2) - err := binary.Read(bytes.NewReader(b[nameOffset:nameOffset+nameLength]), binary.LittleEndian, &name) - if err != nil { - return nil, err - } - return &ReparsePoint{string(utf16.Decode(name)), isMountPoint}, nil -} - -func isDriveLetter(c byte) bool { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') -} - -// EncodeReparsePoint encodes a Win32 REPARSE_DATA_BUFFER structure describing a symlink or -// mount point. -func EncodeReparsePoint(rp *ReparsePoint) []byte { - // Generate an NT path and determine if this is a relative path. - var ntTarget string - relative := false - if strings.HasPrefix(rp.Target, `\\?\`) { - ntTarget = `\??\` + rp.Target[4:] - } else if strings.HasPrefix(rp.Target, `\\`) { - ntTarget = `\??\UNC\` + rp.Target[2:] - } else if len(rp.Target) >= 2 && isDriveLetter(rp.Target[0]) && rp.Target[1] == ':' { - ntTarget = `\??\` + rp.Target - } else { - ntTarget = rp.Target - relative = true - } - - // The paths must be NUL-terminated even though they are counted strings. - target16 := utf16.Encode([]rune(rp.Target + "\x00")) - ntTarget16 := utf16.Encode([]rune(ntTarget + "\x00")) - - size := int(unsafe.Sizeof(reparseDataBuffer{})) - 8 - size += len(ntTarget16)*2 + len(target16)*2 - - tag := uint32(reparseTagMountPoint) - if !rp.IsMountPoint { - tag = reparseTagSymlink - size += 4 // Add room for symlink flags - } - - data := reparseDataBuffer{ - ReparseTag: tag, - ReparseDataLength: uint16(size), - SubstituteNameOffset: 0, - SubstituteNameLength: uint16((len(ntTarget16) - 1) * 2), - PrintNameOffset: uint16(len(ntTarget16) * 2), - PrintNameLength: uint16((len(target16) - 1) * 2), - } - - var b bytes.Buffer - binary.Write(&b, binary.LittleEndian, &data) - if !rp.IsMountPoint { - flags := uint32(0) - if relative { - flags |= 1 - } - binary.Write(&b, binary.LittleEndian, flags) - } - - binary.Write(&b, binary.LittleEndian, ntTarget16) - binary.Write(&b, binary.LittleEndian, target16) - return b.Bytes() -} diff --git a/vendor/github.com/Microsoft/go-winio/sd.go b/vendor/github.com/Microsoft/go-winio/sd.go deleted file mode 100644 index db1b370a..00000000 --- a/vendor/github.com/Microsoft/go-winio/sd.go +++ /dev/null @@ -1,98 +0,0 @@ -// +build windows - -package winio - -import ( - "syscall" - "unsafe" -) - -//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW -//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW -//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW -//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW -//sys localFree(mem uintptr) = LocalFree -//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength - -const ( - cERROR_NONE_MAPPED = syscall.Errno(1332) -) - -type AccountLookupError struct { - Name string - Err error -} - -func (e *AccountLookupError) Error() string { - if e.Name == "" { - return "lookup account: empty account name specified" - } - var s string - switch e.Err { - case cERROR_NONE_MAPPED: - s = "not found" - default: - s = e.Err.Error() - } - return "lookup account " + e.Name + ": " + s -} - -type SddlConversionError struct { - Sddl string - Err error -} - -func (e *SddlConversionError) Error() string { - return "convert " + e.Sddl + ": " + e.Err.Error() -} - -// LookupSidByName looks up the SID of an account by name -func LookupSidByName(name string) (sid string, err error) { - if name == "" { - return "", &AccountLookupError{name, cERROR_NONE_MAPPED} - } - - var sidSize, sidNameUse, refDomainSize uint32 - err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse) - if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { - return "", &AccountLookupError{name, err} - } - sidBuffer := make([]byte, sidSize) - refDomainBuffer := make([]uint16, refDomainSize) - err = lookupAccountName(nil, name, &sidBuffer[0], &sidSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse) - if err != nil { - return "", &AccountLookupError{name, err} - } - var strBuffer *uint16 - err = convertSidToStringSid(&sidBuffer[0], &strBuffer) - if err != nil { - return "", &AccountLookupError{name, err} - } - sid = syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(strBuffer))[:]) - localFree(uintptr(unsafe.Pointer(strBuffer))) - return sid, nil -} - -func SddlToSecurityDescriptor(sddl string) ([]byte, error) { - var sdBuffer uintptr - err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil) - if err != nil { - return nil, &SddlConversionError{sddl, err} - } - defer localFree(sdBuffer) - sd := make([]byte, getSecurityDescriptorLength(sdBuffer)) - copy(sd, (*[0xffff]byte)(unsafe.Pointer(sdBuffer))[:len(sd)]) - return sd, nil -} - -func SecurityDescriptorToSddl(sd []byte) (string, error) { - var sddl *uint16 - // The returned string length seems to including an aribtrary number of terminating NULs. - // Don't use it. - err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil) - if err != nil { - return "", err - } - defer localFree(uintptr(unsafe.Pointer(sddl))) - return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(sddl))[:]), nil -} diff --git a/vendor/github.com/Microsoft/go-winio/syscall.go b/vendor/github.com/Microsoft/go-winio/syscall.go deleted file mode 100644 index 5cb52bc7..00000000 --- a/vendor/github.com/Microsoft/go-winio/syscall.go +++ /dev/null @@ -1,3 +0,0 @@ -package winio - -//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go deleted file mode 100644 index e26b01fa..00000000 --- a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go +++ /dev/null @@ -1,562 +0,0 @@ -// Code generated by 'go generate'; DO NOT EDIT. - -package winio - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - modws2_32 = windows.NewLazySystemDLL("ws2_32.dll") - modntdll = windows.NewLazySystemDLL("ntdll.dll") - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - - procCancelIoEx = modkernel32.NewProc("CancelIoEx") - procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") - procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") - procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") - procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult") - procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") - procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") - procCreateFileW = modkernel32.NewProc("CreateFileW") - procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") - procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") - procLocalAlloc = modkernel32.NewProc("LocalAlloc") - procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") - procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb") - procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U") - procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") - procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") - procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") - procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW") - procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW") - procLocalFree = modkernel32.NewProc("LocalFree") - procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength") - procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") - procSetFileInformationByHandle = modkernel32.NewProc("SetFileInformationByHandle") - procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") - procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf") - procRevertToSelf = modadvapi32.NewProc("RevertToSelf") - procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") - procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") - procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") - procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") - procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW") - procBackupRead = modkernel32.NewProc("BackupRead") - procBackupWrite = modkernel32.NewProc("BackupWrite") - procbind = modws2_32.NewProc("bind") -) - -func cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) { - r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(file), uintptr(unsafe.Pointer(o)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0) - newport = syscall.Handle(r0) - if newport == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func getQueuedCompletionStatus(port syscall.Handle, bytes *uint32, key *uintptr, o **ioOperation, timeout uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(port), uintptr(unsafe.Pointer(bytes)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(o)), uintptr(timeout), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err error) { - r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(h), uintptr(flags), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) { - var _p0 uint32 - if wait { - _p0 = 1 - } else { - _p0 = 0 - } - r1, _, e1 := syscall.Syscall6(procWSAGetOverlappedResult.Addr(), 5, uintptr(h), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(bytes)), uintptr(_p0), uintptr(unsafe.Pointer(flags)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) { - r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(o)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(name) - if err != nil { - return - } - return _createNamedPipe(_p0, flags, pipeMode, maxInstances, outSize, inSize, defaultTimeout, sa) -} - -func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(pipeMode), uintptr(maxInstances), uintptr(outSize), uintptr(inSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0) - handle = syscall.Handle(r0) - if handle == syscall.InvalidHandle { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(name) - if err != nil { - return - } - return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile) -} - -func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) - handle = syscall.Handle(r0) - if handle == syscall.InvalidHandle { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procGetNamedPipeInfo.Addr(), 5, uintptr(pipe), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(outSize)), uintptr(unsafe.Pointer(inSize)), uintptr(unsafe.Pointer(maxInstances)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) { - r1, _, e1 := syscall.Syscall9(procGetNamedPipeHandleStateW.Addr(), 7, uintptr(pipe), uintptr(unsafe.Pointer(state)), uintptr(unsafe.Pointer(curInstances)), uintptr(unsafe.Pointer(maxCollectionCount)), uintptr(unsafe.Pointer(collectDataTimeout)), uintptr(unsafe.Pointer(userName)), uintptr(maxUserNameSize), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func localAlloc(uFlags uint32, length uint32) (ptr uintptr) { - r0, _, _ := syscall.Syscall(procLocalAlloc.Addr(), 2, uintptr(uFlags), uintptr(length), 0) - ptr = uintptr(r0) - return -} - -func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) { - r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0) - status = ntstatus(r0) - return -} - -func rtlNtStatusToDosError(status ntstatus) (winerr error) { - r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0) - if r0 != 0 { - winerr = syscall.Errno(r0) - } - return -} - -func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) { - r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0) - status = ntstatus(r0) - return -} - -func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) { - r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0) - status = ntstatus(r0) - return -} - -func lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(accountName) - if err != nil { - return - } - return _lookupAccountName(systemName, _p0, sid, sidSize, refDomain, refDomainSize, sidNameUse) -} - -func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) { - r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func convertSidToStringSid(sid *byte, str **uint16) (err error) { - r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(str)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(str) - if err != nil { - return - } - return _convertStringSecurityDescriptorToSecurityDescriptor(_p0, revision, sd, size) -} - -func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision uint32, sd *uintptr, size *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procConvertStringSecurityDescriptorToSecurityDescriptorW.Addr(), 4, uintptr(unsafe.Pointer(str)), uintptr(revision), uintptr(unsafe.Pointer(sd)), uintptr(unsafe.Pointer(size)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procConvertSecurityDescriptorToStringSecurityDescriptorW.Addr(), 5, uintptr(unsafe.Pointer(sd)), uintptr(revision), uintptr(secInfo), uintptr(unsafe.Pointer(sddl)), uintptr(unsafe.Pointer(sddlSize)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func localFree(mem uintptr) { - syscall.Syscall(procLocalFree.Addr(), 1, uintptr(mem), 0, 0) - return -} - -func getSecurityDescriptorLength(sd uintptr) (len uint32) { - r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0) - len = uint32(r0) - return -} - -func getFileInformationByHandleEx(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func setFileInformationByHandle(h syscall.Handle, class uint32, buffer *byte, size uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procSetFileInformationByHandle.Addr(), 4, uintptr(h), uintptr(class), uintptr(unsafe.Pointer(buffer)), uintptr(size), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { - var _p0 uint32 - if releaseAll { - _p0 = 1 - } else { - _p0 = 0 - } - r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) - success = r0 != 0 - if true { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func impersonateSelf(level uint32) (err error) { - r1, _, e1 := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(level), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func revertToSelf() (err error) { - r1, _, e1 := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func openThreadToken(thread syscall.Handle, accessMask uint32, openAsSelf bool, token *windows.Token) (err error) { - var _p0 uint32 - if openAsSelf { - _p0 = 1 - } else { - _p0 = 0 - } - r1, _, e1 := syscall.Syscall6(procOpenThreadToken.Addr(), 4, uintptr(thread), uintptr(accessMask), uintptr(_p0), uintptr(unsafe.Pointer(token)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func getCurrentThread() (h syscall.Handle) { - r0, _, _ := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) - h = syscall.Handle(r0) - return -} - -func lookupPrivilegeValue(systemName string, name string, luid *uint64) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(systemName) - if err != nil { - return - } - var _p1 *uint16 - _p1, err = syscall.UTF16PtrFromString(name) - if err != nil { - return - } - return _lookupPrivilegeValue(_p0, _p1, luid) -} - -func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint64) (err error) { - r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16, size *uint32) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(systemName) - if err != nil { - return - } - return _lookupPrivilegeName(_p0, luid, buffer, size) -} - -func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint16, size *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(systemName) - if err != nil { - return - } - return _lookupPrivilegeDisplayName(_p0, name, buffer, size, languageId) -} - -func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procLookupPrivilegeDisplayNameW.Addr(), 5, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), uintptr(unsafe.Pointer(languageId)), 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { - var _p0 *byte - if len(b) > 0 { - _p0 = &b[0] - } - var _p1 uint32 - if abort { - _p1 = 1 - } else { - _p1 = 0 - } - var _p2 uint32 - if processSecurity { - _p2 = 1 - } else { - _p2 = 0 - } - r1, _, e1 := syscall.Syscall9(procBackupRead.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesRead)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func backupWrite(h syscall.Handle, b []byte, bytesWritten *uint32, abort bool, processSecurity bool, context *uintptr) (err error) { - var _p0 *byte - if len(b) > 0 { - _p0 = &b[0] - } - var _p1 uint32 - if abort { - _p1 = 1 - } else { - _p1 = 0 - } - var _p2 uint32 - if processSecurity { - _p2 = 1 - } else { - _p2 = 0 - } - r1, _, e1 := syscall.Syscall9(procBackupWrite.Addr(), 7, uintptr(h), uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(unsafe.Pointer(bytesWritten)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(context)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) { - r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) - if r1 == socketError { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/vendor/github.com/NYTimes/gziphandler/.gitignore b/vendor/github.com/NYTimes/gziphandler/.gitignore deleted file mode 100644 index 1377554e..00000000 --- a/vendor/github.com/NYTimes/gziphandler/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.swp diff --git a/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/NYTimes/gziphandler/.travis.yml deleted file mode 100644 index 94dfae36..00000000 --- a/vendor/github.com/NYTimes/gziphandler/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: go -go: - - 1.x - - tip -env: - - GO111MODULE=on -install: - - go mod download -script: - - go test -race -v diff --git a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md b/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md deleted file mode 100644 index cdbca194..00000000 --- a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -layout: code-of-conduct -version: v1.0 ---- - -This code of conduct outlines our expectations for participants within the **NYTimes/gziphandler** community, as well as steps to reporting unacceptable behavior. We are committed to providing a welcoming and inspiring community for all and expect our code of conduct to be honored. Anyone who violates this code of conduct may be banned from the community. - -Our open source community strives to: - -* **Be friendly and patient.** -* **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. -* **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. -* **Be respectful**: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. -* **Be careful in the words that we choose**: we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. -* **Try to understand why we disagree**: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. - -## Definitions - -Harassment includes, but is not limited to: - -- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation -- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment -- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle -- Physical contact and simulated physical contact (eg, textual descriptions like “*hug*” or “*backrub*”) without consent or after a request to stop -- Threats of violence, both physical and psychological -- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm -- Deliberate intimidation -- Stalking or following -- Harassing photography or recording, including logging online activity for harassment purposes -- Sustained disruption of discussion -- Unwelcome sexual attention, including gratuitous or off-topic sexual images or behaviour -- Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others -- Continued one-on-one communication after requests to cease -- Deliberate “outing” of any aspect of a person’s identity without their consent except as necessary to protect others from intentional abuse -- Publication of non-harassing private communication - -Our open source community prioritizes marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding: - -- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’ -- Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you” -- Refusal to explain or debate social justice concepts -- Communicating in a ‘tone’ you don’t find congenial -- Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions - - -### Diversity Statement - -We encourage everyone to participate and are committed to building a community for all. Although we will fail at times, we seek to treat everyone both as fairly and equally as possible. Whenever a participant has made a mistake, we expect them to take responsibility for it. If someone has been harmed or offended, it is our responsibility to listen carefully and respectfully, and do our best to right the wrong. - -Although this list cannot be exhaustive, we explicitly honor diversity in age, gender, gender identity or expression, culture, ethnicity, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected -characteristics above, including participants with disabilities. - -### Reporting Issues - -If you experience or witness unacceptable behavior—or have any other concerns—please report it by contacting us via **code@nytimes.com**. All reports will be handled with discretion. In your report please include: - -- Your contact information. -- Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please -include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link. -- Any additional information that may be helpful. - -After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse. - -### Attribution & Acknowledgements - -We all stand on the shoulders of giants across many open source communities. We'd like to thank the communities and projects that established code of conducts and diversity statements as our inspiration: - -* [Django](https://www.djangoproject.com/conduct/reporting/) -* [Python](https://www.python.org/community/diversity/) -* [Ubuntu](http://www.ubuntu.com/about/about-ubuntu/conduct) -* [Contributor Covenant](http://contributor-covenant.org/) -* [Geek Feminism](http://geekfeminism.org/about/code-of-conduct/) -* [Citizen Code of Conduct](http://citizencodeofconduct.org/) - -This Code of Conduct was based on https://github.com/todogroup/opencodeofconduct diff --git a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md b/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md deleted file mode 100644 index b89a9eb4..00000000 --- a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md +++ /dev/null @@ -1,30 +0,0 @@ -# Contributing to NYTimes/gziphandler - -This is an open source project started by handful of developers at The New York Times and open to the entire Go community. - -We really appreciate your help! - -## Filing issues - -When filing an issue, make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -## Contributing code - -Before submitting changes, please follow these guidelines: - -1. Check the open issues and pull requests for existing discussions. -2. Open an issue to discuss a new feature. -3. Write tests. -4. Make sure code follows the ['Go Code Review Comments'](https://github.com/golang/go/wiki/CodeReviewComments). -5. Make sure your changes pass `go test`. -6. Make sure the entire test suite passes locally and on Travis CI. -7. Open a Pull Request. -8. [Squash your commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) after receiving feedback and add a [great commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). - -Unless otherwise noted, the gziphandler source files are distributed under the Apache 2.0-style license found in the LICENSE.md file. diff --git a/vendor/github.com/NYTimes/gziphandler/LICENSE b/vendor/github.com/NYTimes/gziphandler/LICENSE deleted file mode 100644 index df6192d3..00000000 --- a/vendor/github.com/NYTimes/gziphandler/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2016-2017 The New York Times Company - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/NYTimes/gziphandler/README.md b/vendor/github.com/NYTimes/gziphandler/README.md deleted file mode 100644 index 6259acac..00000000 --- a/vendor/github.com/NYTimes/gziphandler/README.md +++ /dev/null @@ -1,56 +0,0 @@ -Gzip Handler -============ - -This is a tiny Go package which wraps HTTP handlers to transparently gzip the -response body, for clients which support it. Although it's usually simpler to -leave that to a reverse proxy (like nginx or Varnish), this package is useful -when that's undesirable. - -## Install -```bash -go get -u github.com/NYTimes/gziphandler -``` - -## Usage - -Call `GzipHandler` with any handler (an object which implements the -`http.Handler` interface), and it'll return a new handler which gzips the -response. For example: - -```go -package main - -import ( - "io" - "net/http" - "github.com/NYTimes/gziphandler" -) - -func main() { - withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/plain") - io.WriteString(w, "Hello, World") - }) - - withGz := gziphandler.GzipHandler(withoutGz) - - http.Handle("/", withGz) - http.ListenAndServe("0.0.0.0:8000", nil) -} -``` - - -## Documentation - -The docs can be found at [godoc.org][docs], as usual. - - -## License - -[Apache 2.0][license]. - - - - -[docs]: https://godoc.org/github.com/NYTimes/gziphandler -[license]: https://github.com/NYTimes/gziphandler/blob/master/LICENSE diff --git a/vendor/github.com/NYTimes/gziphandler/go.mod b/vendor/github.com/NYTimes/gziphandler/go.mod deleted file mode 100644 index 80190127..00000000 --- a/vendor/github.com/NYTimes/gziphandler/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/NYTimes/gziphandler - -go 1.11 - -require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/NYTimes/gziphandler/go.sum b/vendor/github.com/NYTimes/gziphandler/go.sum deleted file mode 100644 index 4347755a..00000000 --- a/vendor/github.com/NYTimes/gziphandler/go.sum +++ /dev/null @@ -1,7 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/NYTimes/gziphandler/gzip.go b/vendor/github.com/NYTimes/gziphandler/gzip.go deleted file mode 100644 index c112bbdf..00000000 --- a/vendor/github.com/NYTimes/gziphandler/gzip.go +++ /dev/null @@ -1,532 +0,0 @@ -package gziphandler // import "github.com/NYTimes/gziphandler" - -import ( - "bufio" - "compress/gzip" - "fmt" - "io" - "mime" - "net" - "net/http" - "strconv" - "strings" - "sync" -) - -const ( - vary = "Vary" - acceptEncoding = "Accept-Encoding" - contentEncoding = "Content-Encoding" - contentType = "Content-Type" - contentLength = "Content-Length" -) - -type codings map[string]float64 - -const ( - // DefaultQValue is the default qvalue to assign to an encoding if no explicit qvalue is set. - // This is actually kind of ambiguous in RFC 2616, so hopefully it's correct. - // The examples seem to indicate that it is. - DefaultQValue = 1.0 - - // DefaultMinSize is the default minimum size until we enable gzip compression. - // 1500 bytes is the MTU size for the internet since that is the largest size allowed at the network layer. - // If you take a file that is 1300 bytes and compress it to 800 bytes, it’s still transmitted in that same 1500 byte packet regardless, so you’ve gained nothing. - // That being the case, you should restrict the gzip compression to files with a size greater than a single packet, 1400 bytes (1.4KB) is a safe value. - DefaultMinSize = 1400 -) - -// gzipWriterPools stores a sync.Pool for each compression level for reuse of -// gzip.Writers. Use poolIndex to covert a compression level to an index into -// gzipWriterPools. -var gzipWriterPools [gzip.BestCompression - gzip.BestSpeed + 2]*sync.Pool - -func init() { - for i := gzip.BestSpeed; i <= gzip.BestCompression; i++ { - addLevelPool(i) - } - addLevelPool(gzip.DefaultCompression) -} - -// poolIndex maps a compression level to its index into gzipWriterPools. It -// assumes that level is a valid gzip compression level. -func poolIndex(level int) int { - // gzip.DefaultCompression == -1, so we need to treat it special. - if level == gzip.DefaultCompression { - return gzip.BestCompression - gzip.BestSpeed + 1 - } - return level - gzip.BestSpeed -} - -func addLevelPool(level int) { - gzipWriterPools[poolIndex(level)] = &sync.Pool{ - New: func() interface{} { - // NewWriterLevel only returns error on a bad level, we are guaranteeing - // that this will be a valid level so it is okay to ignore the returned - // error. - w, _ := gzip.NewWriterLevel(nil, level) - return w - }, - } -} - -// GzipResponseWriter provides an http.ResponseWriter interface, which gzips -// bytes before writing them to the underlying response. This doesn't close the -// writers, so don't forget to do that. -// It can be configured to skip response smaller than minSize. -type GzipResponseWriter struct { - http.ResponseWriter - index int // Index for gzipWriterPools. - gw *gzip.Writer - - code int // Saves the WriteHeader value. - - minSize int // Specifed the minimum response size to gzip. If the response length is bigger than this value, it is compressed. - buf []byte // Holds the first part of the write before reaching the minSize or the end of the write. - ignore bool // If true, then we immediately passthru writes to the underlying ResponseWriter. - - contentTypes []parsedContentType // Only compress if the response is one of these content-types. All are accepted if empty. -} - -type GzipResponseWriterWithCloseNotify struct { - *GzipResponseWriter -} - -func (w GzipResponseWriterWithCloseNotify) CloseNotify() <-chan bool { - return w.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -// Write appends data to the gzip writer. -func (w *GzipResponseWriter) Write(b []byte) (int, error) { - // GZIP responseWriter is initialized. Use the GZIP responseWriter. - if w.gw != nil { - return w.gw.Write(b) - } - - // If we have already decided not to use GZIP, immediately passthrough. - if w.ignore { - return w.ResponseWriter.Write(b) - } - - // Save the write into a buffer for later use in GZIP responseWriter (if content is long enough) or at close with regular responseWriter. - // On the first write, w.buf changes from nil to a valid slice - w.buf = append(w.buf, b...) - - var ( - cl, _ = strconv.Atoi(w.Header().Get(contentLength)) - ct = w.Header().Get(contentType) - ce = w.Header().Get(contentEncoding) - ) - // Only continue if they didn't already choose an encoding or a known unhandled content length or type. - if ce == "" && (cl == 0 || cl >= w.minSize) && (ct == "" || handleContentType(w.contentTypes, ct)) { - // If the current buffer is less than minSize and a Content-Length isn't set, then wait until we have more data. - if len(w.buf) < w.minSize && cl == 0 { - return len(b), nil - } - // If the Content-Length is larger than minSize or the current buffer is larger than minSize, then continue. - if cl >= w.minSize || len(w.buf) >= w.minSize { - // If a Content-Type wasn't specified, infer it from the current buffer. - if ct == "" { - ct = http.DetectContentType(w.buf) - w.Header().Set(contentType, ct) - } - // If the Content-Type is acceptable to GZIP, initialize the GZIP writer. - if handleContentType(w.contentTypes, ct) { - if err := w.startGzip(); err != nil { - return 0, err - } - return len(b), nil - } - } - } - // If we got here, we should not GZIP this response. - if err := w.startPlain(); err != nil { - return 0, err - } - return len(b), nil -} - -// startGzip initializes a GZIP writer and writes the buffer. -func (w *GzipResponseWriter) startGzip() error { - // Set the GZIP header. - w.Header().Set(contentEncoding, "gzip") - - // if the Content-Length is already set, then calls to Write on gzip - // will fail to set the Content-Length header since its already set - // See: https://github.com/golang/go/issues/14975. - w.Header().Del(contentLength) - - // Write the header to gzip response. - if w.code != 0 { - w.ResponseWriter.WriteHeader(w.code) - // Ensure that no other WriteHeader's happen - w.code = 0 - } - - // Initialize and flush the buffer into the gzip response if there are any bytes. - // If there aren't any, we shouldn't initialize it yet because on Close it will - // write the gzip header even if nothing was ever written. - if len(w.buf) > 0 { - // Initialize the GZIP response. - w.init() - n, err := w.gw.Write(w.buf) - - // This should never happen (per io.Writer docs), but if the write didn't - // accept the entire buffer but returned no specific error, we have no clue - // what's going on, so abort just to be safe. - if err == nil && n < len(w.buf) { - err = io.ErrShortWrite - } - return err - } - return nil -} - -// startPlain writes to sent bytes and buffer the underlying ResponseWriter without gzip. -func (w *GzipResponseWriter) startPlain() error { - if w.code != 0 { - w.ResponseWriter.WriteHeader(w.code) - // Ensure that no other WriteHeader's happen - w.code = 0 - } - w.ignore = true - // If Write was never called then don't call Write on the underlying ResponseWriter. - if w.buf == nil { - return nil - } - n, err := w.ResponseWriter.Write(w.buf) - w.buf = nil - // This should never happen (per io.Writer docs), but if the write didn't - // accept the entire buffer but returned no specific error, we have no clue - // what's going on, so abort just to be safe. - if err == nil && n < len(w.buf) { - err = io.ErrShortWrite - } - return err -} - -// WriteHeader just saves the response code until close or GZIP effective writes. -func (w *GzipResponseWriter) WriteHeader(code int) { - if w.code == 0 { - w.code = code - } -} - -// init graps a new gzip writer from the gzipWriterPool and writes the correct -// content encoding header. -func (w *GzipResponseWriter) init() { - // Bytes written during ServeHTTP are redirected to this gzip writer - // before being written to the underlying response. - gzw := gzipWriterPools[w.index].Get().(*gzip.Writer) - gzw.Reset(w.ResponseWriter) - w.gw = gzw -} - -// Close will close the gzip.Writer and will put it back in the gzipWriterPool. -func (w *GzipResponseWriter) Close() error { - if w.ignore { - return nil - } - - if w.gw == nil { - // GZIP not triggered yet, write out regular response. - err := w.startPlain() - // Returns the error if any at write. - if err != nil { - err = fmt.Errorf("gziphandler: write to regular responseWriter at close gets error: %q", err.Error()) - } - return err - } - - err := w.gw.Close() - gzipWriterPools[w.index].Put(w.gw) - w.gw = nil - return err -} - -// Flush flushes the underlying *gzip.Writer and then the underlying -// http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter -// an http.Flusher. -func (w *GzipResponseWriter) Flush() { - if w.gw == nil && !w.ignore { - // Only flush once startGzip or startPlain has been called. - // - // Flush is thus a no-op until we're certain whether a plain - // or gzipped response will be served. - return - } - - if w.gw != nil { - w.gw.Flush() - } - - if fw, ok := w.ResponseWriter.(http.Flusher); ok { - fw.Flush() - } -} - -// Hijack implements http.Hijacker. If the underlying ResponseWriter is a -// Hijacker, its Hijack method is returned. Otherwise an error is returned. -func (w *GzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - if hj, ok := w.ResponseWriter.(http.Hijacker); ok { - return hj.Hijack() - } - return nil, nil, fmt.Errorf("http.Hijacker interface is not supported") -} - -// verify Hijacker interface implementation -var _ http.Hijacker = &GzipResponseWriter{} - -// MustNewGzipLevelHandler behaves just like NewGzipLevelHandler except that in -// an error case it panics rather than returning an error. -func MustNewGzipLevelHandler(level int) func(http.Handler) http.Handler { - wrap, err := NewGzipLevelHandler(level) - if err != nil { - panic(err) - } - return wrap -} - -// NewGzipLevelHandler returns a wrapper function (often known as middleware) -// which can be used to wrap an HTTP handler to transparently gzip the response -// body if the client supports it (via the Accept-Encoding header). Responses will -// be encoded at the given gzip compression level. An error will be returned only -// if an invalid gzip compression level is given, so if one can ensure the level -// is valid, the returned error can be safely ignored. -func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error) { - return NewGzipLevelAndMinSize(level, DefaultMinSize) -} - -// NewGzipLevelAndMinSize behave as NewGzipLevelHandler except it let the caller -// specify the minimum size before compression. -func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler, error) { - return GzipHandlerWithOpts(CompressionLevel(level), MinSize(minSize)) -} - -func GzipHandlerWithOpts(opts ...option) (func(http.Handler) http.Handler, error) { - c := &config{ - level: gzip.DefaultCompression, - minSize: DefaultMinSize, - } - - for _, o := range opts { - o(c) - } - - if err := c.validate(); err != nil { - return nil, err - } - - return func(h http.Handler) http.Handler { - index := poolIndex(c.level) - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Add(vary, acceptEncoding) - if acceptsGzip(r) { - gw := &GzipResponseWriter{ - ResponseWriter: w, - index: index, - minSize: c.minSize, - contentTypes: c.contentTypes, - } - defer gw.Close() - - if _, ok := w.(http.CloseNotifier); ok { - gwcn := GzipResponseWriterWithCloseNotify{gw} - h.ServeHTTP(gwcn, r) - } else { - h.ServeHTTP(gw, r) - } - - } else { - h.ServeHTTP(w, r) - } - }) - }, nil -} - -// Parsed representation of one of the inputs to ContentTypes. -// See https://golang.org/pkg/mime/#ParseMediaType -type parsedContentType struct { - mediaType string - params map[string]string -} - -// equals returns whether this content type matches another content type. -func (pct parsedContentType) equals(mediaType string, params map[string]string) bool { - if pct.mediaType != mediaType { - return false - } - // if pct has no params, don't care about other's params - if len(pct.params) == 0 { - return true - } - - // if pct has any params, they must be identical to other's. - if len(pct.params) != len(params) { - return false - } - for k, v := range pct.params { - if w, ok := params[k]; !ok || v != w { - return false - } - } - return true -} - -// Used for functional configuration. -type config struct { - minSize int - level int - contentTypes []parsedContentType -} - -func (c *config) validate() error { - if c.level != gzip.DefaultCompression && (c.level < gzip.BestSpeed || c.level > gzip.BestCompression) { - return fmt.Errorf("invalid compression level requested: %d", c.level) - } - - if c.minSize < 0 { - return fmt.Errorf("minimum size must be more than zero") - } - - return nil -} - -type option func(c *config) - -func MinSize(size int) option { - return func(c *config) { - c.minSize = size - } -} - -func CompressionLevel(level int) option { - return func(c *config) { - c.level = level - } -} - -// ContentTypes specifies a list of content types to compare -// the Content-Type header to before compressing. If none -// match, the response will be returned as-is. -// -// Content types are compared in a case-insensitive, whitespace-ignored -// manner. -// -// A MIME type without any other directive will match a content type -// that has the same MIME type, regardless of that content type's other -// directives. I.e., "text/html" will match both "text/html" and -// "text/html; charset=utf-8". -// -// A MIME type with any other directive will only match a content type -// that has the same MIME type and other directives. I.e., -// "text/html; charset=utf-8" will only match "text/html; charset=utf-8". -// -// By default, responses are gzipped regardless of -// Content-Type. -func ContentTypes(types []string) option { - return func(c *config) { - c.contentTypes = []parsedContentType{} - for _, v := range types { - mediaType, params, err := mime.ParseMediaType(v) - if err == nil { - c.contentTypes = append(c.contentTypes, parsedContentType{mediaType, params}) - } - } - } -} - -// GzipHandler wraps an HTTP handler, to transparently gzip the response body if -// the client supports it (via the Accept-Encoding header). This will compress at -// the default compression level. -func GzipHandler(h http.Handler) http.Handler { - wrapper, _ := NewGzipLevelHandler(gzip.DefaultCompression) - return wrapper(h) -} - -// acceptsGzip returns true if the given HTTP request indicates that it will -// accept a gzipped response. -func acceptsGzip(r *http.Request) bool { - acceptedEncodings, _ := parseEncodings(r.Header.Get(acceptEncoding)) - return acceptedEncodings["gzip"] > 0.0 -} - -// returns true if we've been configured to compress the specific content type. -func handleContentType(contentTypes []parsedContentType, ct string) bool { - // If contentTypes is empty we handle all content types. - if len(contentTypes) == 0 { - return true - } - - mediaType, params, err := mime.ParseMediaType(ct) - if err != nil { - return false - } - - for _, c := range contentTypes { - if c.equals(mediaType, params) { - return true - } - } - - return false -} - -// parseEncodings attempts to parse a list of codings, per RFC 2616, as might -// appear in an Accept-Encoding header. It returns a map of content-codings to -// quality values, and an error containing the errors encountered. It's probably -// safe to ignore those, because silently ignoring errors is how the internet -// works. -// -// See: http://tools.ietf.org/html/rfc2616#section-14.3. -func parseEncodings(s string) (codings, error) { - c := make(codings) - var e []string - - for _, ss := range strings.Split(s, ",") { - coding, qvalue, err := parseCoding(ss) - - if err != nil { - e = append(e, err.Error()) - } else { - c[coding] = qvalue - } - } - - // TODO (adammck): Use a proper multi-error struct, so the individual errors - // can be extracted if anyone cares. - if len(e) > 0 { - return c, fmt.Errorf("errors while parsing encodings: %s", strings.Join(e, ", ")) - } - - return c, nil -} - -// parseCoding parses a single conding (content-coding with an optional qvalue), -// as might appear in an Accept-Encoding header. It attempts to forgive minor -// formatting errors. -func parseCoding(s string) (coding string, qvalue float64, err error) { - for n, part := range strings.Split(s, ";") { - part = strings.TrimSpace(part) - qvalue = DefaultQValue - - if n == 0 { - coding = strings.ToLower(part) - } else if strings.HasPrefix(part, "q=") { - qvalue, err = strconv.ParseFloat(strings.TrimPrefix(part, "q="), 64) - - if qvalue < 0.0 { - qvalue = 0.0 - } else if qvalue > 1.0 { - qvalue = 1.0 - } - } - } - - if coding == "" { - err = fmt.Errorf("empty content-coding") - } - - return -} diff --git a/vendor/github.com/NYTimes/gziphandler/gzip_go18.go b/vendor/github.com/NYTimes/gziphandler/gzip_go18.go deleted file mode 100644 index fa9665b7..00000000 --- a/vendor/github.com/NYTimes/gziphandler/gzip_go18.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build go1.8 - -package gziphandler - -import "net/http" - -// Push initiates an HTTP/2 server push. -// Push returns ErrNotSupported if the client has disabled push or if push -// is not supported on the underlying connection. -func (w *GzipResponseWriter) Push(target string, opts *http.PushOptions) error { - pusher, ok := w.ResponseWriter.(http.Pusher) - if ok && pusher != nil { - return pusher.Push(target, setAcceptEncodingForPushOptions(opts)) - } - return http.ErrNotSupported -} - -// setAcceptEncodingForPushOptions sets "Accept-Encoding" : "gzip" for PushOptions without overriding existing headers. -func setAcceptEncodingForPushOptions(opts *http.PushOptions) *http.PushOptions { - - if opts == nil { - opts = &http.PushOptions{ - Header: http.Header{ - acceptEncoding: []string{"gzip"}, - }, - } - return opts - } - - if opts.Header == nil { - opts.Header = http.Header{ - acceptEncoding: []string{"gzip"}, - } - return opts - } - - if encoding := opts.Header.Get(acceptEncoding); encoding == "" { - opts.Header.Add(acceptEncoding, "gzip") - return opts - } - - return opts -} diff --git a/vendor/github.com/alphadose/gotty/LICENSE b/vendor/github.com/alphadose/gotty/LICENSE deleted file mode 100644 index e93081f8..00000000 --- a/vendor/github.com/alphadose/gotty/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2017 Iwasaki Yudai - -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/alphadose/gotty/backend/localcommand/doc.go b/vendor/github.com/alphadose/gotty/backend/localcommand/doc.go deleted file mode 100644 index 47cc2b73..00000000 --- a/vendor/github.com/alphadose/gotty/backend/localcommand/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package localcommand provides an implementation of webtty.Slave -// that launches a local command with a PTY. -package localcommand diff --git a/vendor/github.com/alphadose/gotty/backend/localcommand/factory.go b/vendor/github.com/alphadose/gotty/backend/localcommand/factory.go deleted file mode 100644 index dc7f1744..00000000 --- a/vendor/github.com/alphadose/gotty/backend/localcommand/factory.go +++ /dev/null @@ -1,48 +0,0 @@ -package localcommand - -import ( - "syscall" - "time" - - "github.com/alphadose/gotty/server" -) - -type Options struct { - CloseSignal int `hcl:"close_signal" flagName:"close-signal" flagSName:"" flagDescribe:"Signal sent to the command process when gotty close it (default: SIGHUP)" default:"1"` - CloseTimeout int `hcl:"close_timeout" flagName:"close-timeout" flagSName:"" flagDescribe:"Time in seconds to force kill process after client is disconnected (default: -1)" default:"-1"` -} - -type Factory struct { - command string - argv []string - options *Options - opts []Option -} - -func NewFactory(command string, argv []string, options *Options) (*Factory, error) { - opts := []Option{WithCloseSignal(syscall.Signal(options.CloseSignal))} - if options.CloseTimeout >= 0 { - opts = append(opts, WithCloseTimeout(time.Duration(options.CloseTimeout)*time.Second)) - } - - return &Factory{ - command: command, - argv: argv, - options: options, - opts: opts, - }, nil -} - -func (factory *Factory) Name() string { - return "local command" -} - -func (factory *Factory) New(params map[string][]string) (server.Slave, error) { - argv := make([]string, len(factory.argv)) - copy(argv, factory.argv) - if params["arg"] != nil && len(params["arg"]) > 0 { - argv = append(argv, params["arg"]...) - } - - return New(factory.command, argv, factory.opts...) -} diff --git a/vendor/github.com/alphadose/gotty/backend/localcommand/local_command.go b/vendor/github.com/alphadose/gotty/backend/localcommand/local_command.go deleted file mode 100644 index 4beca86d..00000000 --- a/vendor/github.com/alphadose/gotty/backend/localcommand/local_command.go +++ /dev/null @@ -1,132 +0,0 @@ -package localcommand - -import ( - "os" - "os/exec" - "syscall" - "time" - "unsafe" - - "github.com/kr/pty" - "github.com/pkg/errors" -) - -const ( - DefaultCloseSignal = syscall.SIGINT - DefaultCloseTimeout = 10 * time.Second -) - -type LocalCommand struct { - command string - argv []string - - closeSignal syscall.Signal - closeTimeout time.Duration - - cmd *exec.Cmd - pty *os.File - ptyClosed chan struct{} -} - -func New(command string, argv []string, options ...Option) (*LocalCommand, error) { - cmd := exec.Command(command, argv...) - - pty, err := pty.Start(cmd) - if err != nil { - // todo close cmd? - return nil, errors.Wrapf(err, "failed to start command `%s`", command) - } - ptyClosed := make(chan struct{}) - - lcmd := &LocalCommand{ - command: command, - argv: argv, - - closeSignal: DefaultCloseSignal, - closeTimeout: DefaultCloseTimeout, - - cmd: cmd, - pty: pty, - ptyClosed: ptyClosed, - } - - for _, option := range options { - option(lcmd) - } - - // When the process is closed by the user, - // close pty so that Read() on the pty breaks with an EOF. - go func() { - defer func() { - lcmd.pty.Close() - close(lcmd.ptyClosed) - }() - - lcmd.cmd.Wait() - }() - - return lcmd, nil -} - -func (lcmd *LocalCommand) Read(p []byte) (n int, err error) { - return lcmd.pty.Read(p) -} - -func (lcmd *LocalCommand) Write(p []byte) (n int, err error) { - return lcmd.pty.Write(p) -} - -func (lcmd *LocalCommand) Close() error { - if lcmd.cmd != nil && lcmd.cmd.Process != nil { - lcmd.cmd.Process.Signal(lcmd.closeSignal) - } - for { - select { - case <-lcmd.ptyClosed: - return nil - case <-lcmd.closeTimeoutC(): - lcmd.cmd.Process.Signal(syscall.SIGKILL) - } - } -} - -func (lcmd *LocalCommand) WindowTitleVariables() map[string]interface{} { - return map[string]interface{}{ - "command": lcmd.command, - "argv": lcmd.argv, - "pid": lcmd.cmd.Process.Pid, - } -} - -func (lcmd *LocalCommand) ResizeTerminal(width int, height int) error { - window := struct { - row uint16 - col uint16 - x uint16 - y uint16 - }{ - uint16(height), - uint16(width), - 0, - 0, - } - _, _, errno := syscall.Syscall( - syscall.SYS_IOCTL, - lcmd.pty.Fd(), - syscall.TIOCSWINSZ, - uintptr(unsafe.Pointer(&window)), - ) - if errno != 0 { - return errno - } else { - return nil - } -} - -func (lcmd *LocalCommand) closeTimeoutC() <-chan time.Time { - if lcmd.closeTimeout >= 0 { - return time.After(lcmd.closeTimeout) - } - - return make(chan time.Time) -} diff --git a/vendor/github.com/alphadose/gotty/backend/localcommand/options.go b/vendor/github.com/alphadose/gotty/backend/localcommand/options.go deleted file mode 100644 index 72af01f3..00000000 --- a/vendor/github.com/alphadose/gotty/backend/localcommand/options.go +++ /dev/null @@ -1,20 +0,0 @@ -package localcommand - -import ( - "syscall" - "time" -) - -type Option func(*LocalCommand) - -func WithCloseSignal(signal syscall.Signal) Option { - return func(lcmd *LocalCommand) { - lcmd.closeSignal = signal - } -} - -func WithCloseTimeout(timeout time.Duration) Option { - return func(lcmd *LocalCommand) { - lcmd.closeTimeout = timeout - } -} diff --git a/vendor/github.com/alphadose/gotty/pkg/homedir/expand.go b/vendor/github.com/alphadose/gotty/pkg/homedir/expand.go deleted file mode 100644 index 724a2034..00000000 --- a/vendor/github.com/alphadose/gotty/pkg/homedir/expand.go +++ /dev/null @@ -1,13 +0,0 @@ -package homedir - -import ( - "os" -) - -func Expand(path string) string { - if path[0:2] == "~/" { - return os.Getenv("HOME") + path[1:] - } else { - return path - } -} diff --git a/vendor/github.com/alphadose/gotty/pkg/randomstring/generate.go b/vendor/github.com/alphadose/gotty/pkg/randomstring/generate.go deleted file mode 100644 index b5062ce5..00000000 --- a/vendor/github.com/alphadose/gotty/pkg/randomstring/generate.go +++ /dev/null @@ -1,18 +0,0 @@ -package randomstring - -import ( - "crypto/rand" - "math/big" - "strconv" -) - -func Generate(length int) string { - const base = 36 - size := big.NewInt(base) - n := make([]byte, length) - for i, _ := range n { - c, _ := rand.Int(rand.Reader, size) - n[i] = strconv.FormatInt(c.Int64(), base)[0] - } - return string(n) -} diff --git a/vendor/github.com/alphadose/gotty/server/asset.go b/vendor/github.com/alphadose/gotty/server/asset.go deleted file mode 100644 index ff62dbe2..00000000 --- a/vendor/github.com/alphadose/gotty/server/asset.go +++ /dev/null @@ -1,379 +0,0 @@ -// Code generated by go-bindata. -// sources: -// bindata/static/css/index.css -// bindata/static/css/xterm.css -// bindata/static/css/xterm_customize.css -// bindata/static/favicon.png -// bindata/static/index.html -// bindata/static/js/bundle.js -// bindata/static/js/gotty-bundle.js -// DO NOT EDIT! - -package server - -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 -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _staticCssIndexCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4c\xc8\x41\x0a\x02\x31\x0c\x05\xd0\xbd\xa7\xf8\x20\xee\x66\x31\x6e\xeb\x69\xd2\xc9\x90\x84\xb6\xa9\x94\x88\x88\x78\x77\xc1\x22\xcc\xf2\x3d\x8d\x56\x17\xe4\xce\xaf\x05\xe7\xd8\x47\x33\xa7\x8a\xf7\x09\x00\x32\x6d\x45\x46\x7f\x38\x27\xe4\x4a\x5b\xb9\xfd\x5a\x77\x13\x8d\x84\xeb\xba\x5e\xe6\x3c\x8d\x43\x8f\x71\x27\x66\x73\x49\xf8\x47\xa3\x21\xe6\xd3\x9f\x6f\x00\x00\x00\xff\xff\xd7\x5b\x0e\xbd\x74\x00\x00\x00") - -func staticCssIndexCssBytes() ([]byte, error) { - return bindataRead( - _staticCssIndexCss, - "static/css/index.css", - ) -} - -func staticCssIndexCss() (*asset, error) { - bytes, err := staticCssIndexCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/css/index.css", size: 116, mode: os.FileMode(436), modTime: time.Unix(1503381631, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _staticCssXtermCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x9d\x5d\x93\xda\x48\xb6\xb5\xef\xfd\x2b\x32\xdc\x17\x6d\x3b\xa0\x0a\x89\x6f\x26\xe2\x8d\xa0\xcb\x54\x9b\x77\xca\xe0\xa8\xc2\xe3\xe9\xcb\x04\xa5\x0a\xb9\x41\x62\x24\x51\x1f\x33\x31\xff\xfd\x44\x4a\x99\x85\x2b\x37\x5a\xb9\x3d\x73\x8e\xb9\xe8\x36\xd4\x5a\x5b\x12\xa9\x07\x69\x79\x19\x5f\x7e\xf8\xf0\x46\x7c\x10\x4f\xa5\xca\xf7\x17\xdf\x8b\x49\xfd\x7f\x2d\x91\xa4\xa2\xdc\x2a\xb1\xce\xb3\xc7\x42\xe5\xfa\x47\xae\xb2\xc3\x73\x9e\xdc\x6f\x4b\xf1\x6e\xf3\x5e\x84\x9d\xa0\xd7\x0e\x3b\xc1\xa0\x25\xee\xb2\x63\xbe\x51\x37\x32\xc9\xc5\x97\x3c\x79\x90\xa5\x12\x57\xd9\xfe\x20\xd3\x67\xf1\xee\xf1\xf1\xf1\xa2\xa8\x5e\xdf\xc9\x24\xbf\xd8\x64\x7b\xf1\xee\xf3\x7c\x25\x6e\x92\x8d\x4a\x0b\xf5\xfe\xac\x71\xa8\x8d\xbb\x2d\x71\xb5\xcd\x93\xa2\xcc\x0e\x5b\x95\x8b\xff\xaf\xe2\x38\x57\xcf\x54\xbd\x2d\xcb\x43\x31\xb9\xbc\xbc\x4f\xca\xed\x71\xad\x27\x5c\x6e\xb6\xdf\xbf\x5f\x9a\x1d\x7a\x23\xaa\xfd\xfb\xa2\xf2\x7d\x52\x14\x49\x96\x8a\xa4\x10\x5b\x95\xab\xf5\xb3\xb8\xcf\x65\x5a\xaa\xa8\x25\xe2\x5c\x29\x91\xc5\x62\xb3\x95\xf9\xbd\x6a\x89\x32\x13\x7a\xeb\x0f\x2a\x2f\xb2\x54\x64\xeb\x52\x26\x69\x92\xde\x0b\x29\x36\xd9\xe1\x59\xfb\x65\xb1\x28\xb7\x49\x21\x8a\x2c\x2e\x1f\x65\xae\x84\x4c\x23\x21\x8b\x22\xdb\x24\xb2\x54\x91\x88\xb2\xcd\x71\xaf\xd2\x52\x96\x7a\x64\x9c\xec\x54\x21\xde\xe9\x03\xfa\xf6\xce\x28\xde\xbe\xaf\xe6\x44\x4a\xee\xb4\xa1\x39\xde\xf6\x55\xf1\x98\x94\xdb\xec\x58\x8a\x5c\x15\x65\x9e\x6c\xb4\x8d\x7e\x53\x36\xbb\x63\xa4\xb7\xc4\xbe\xbc\x4b\xf6\x89\x19\xa2\xe5\xd5\x61\xd4\xfb\xac\xad\x8f\x85\x6a\x55\x1b\xdc\x12\xfb\x2c\x4a\x62\xfd\x5f\x55\xed\xdf\xe1\xb8\xde\x25\xc5\xb6\x25\xa2\x44\xbb\xaf\x8f\xa5\x6a\x89\x42\x3f\x59\x1d\xd7\x96\xde\x9b\xcb\x2c\x17\x85\xda\x55\x1b\xb7\xc9\x0e\x89\x2a\xea\x9d\x3e\x6d\x63\xf5\x63\x7a\xd0\x41\x1f\xdc\xd2\x1c\xae\x42\x3f\xf3\xb8\xcd\xf6\xaf\xf7\x27\xa9\xb6\x2a\x3e\xe6\x69\x52\x6c\x55\x25\x8b\x32\x51\x64\xd5\xdc\xef\x6a\x53\xea\x67\xb4\x22\xce\x76\xbb\xec\x51\xef\xe3\x26\x4b\xa3\x44\xef\x5a\x31\x31\xef\xe2\x6a\xab\x84\x5c\x67\x0f\xaa\xda\xad\x7a\xcd\xa4\x59\x99\x6c\xea\xe3\x5f\xbd\x23\x87\xd3\x3b\x6d\x5e\x2a\xb6\x72\xb7\x13\x6b\x65\x0e\x9f\x8a\x44\x92\x6a\x37\xfd\xac\xdd\xb3\x5c\x6f\x46\x51\xca\xb4\x4c\xe4\x4e\x1c\xb2\xbc\x9a\xeb\xee\xf1\x85\xdd\x8e\x4f\x33\x71\xb7\xbc\x5e\x7d\x9b\xde\xce\xc4\xfc\x4e\x7c\xb9\x5d\xfe\x6d\xfe\x71\xf6\x51\xbc\x9d\xde\x89\xf9\xdd\xdb\x96\xf8\x36\x5f\x7d\x5a\x7e\x5d\x89\x6f\xd3\xdb\xdb\xe9\x62\xf5\x87\x58\x5e\x8b\xe9\xe2\x0f\xf1\xd7\xf9\xe2\x63\x4b\xcc\xfe\xfe\xe5\x76\x76\x77\x27\x96\xb7\xda\x6d\xfe\xf9\xcb\xcd\x7c\xf6\xb1\x25\xe6\x8b\xab\x9b\xaf\x1f\xe7\x8b\xdf\xc5\x6f\x5f\x57\x62\xb1\x5c\x89\x9b\xf9\xe7\xf9\x6a\xf6\x51\xac\x96\xd5\x4c\xe3\x36\x9f\xdd\x69\xbf\xcf\xb3\xdb\xab\x4f\xd3\xc5\x6a\xfa\xdb\xfc\x66\xbe\xfa\xa3\xa5\xbd\xae\xe7\xab\x85\x76\xbe\x5e\xde\x8a\xa9\xf8\x32\xbd\x5d\xcd\xaf\xbe\xde\x4c\x6f\xc5\x97\xaf\xb7\x5f\x96\x77\x33\x31\x5d\x7c\x14\x8b\xe5\x62\xbe\xb8\xbe\x9d\x2f\x7e\x9f\x7d\x9e\x2d\x56\x17\x62\xbe\x10\x8b\xa5\x98\xfd\x6d\xb6\x58\x89\xbb\x4f\xd3\x9b\x1b\x3d\x4d\xdb\x4d\xbf\xae\x3e\x2d\x6f\xf5\x86\x8a\xab\xe5\x97\x3f\x6e\xe7\xbf\x7f\x5a\x89\x4f\xcb\x9b\x8f\xb3\xdb\x3b\xf1\xdb\x4c\xdc\xcc\xa7\xbf\xdd\xcc\xea\x69\x8b\x3f\xc4\xd5\xcd\x74\xfe\xb9\x25\x3e\x4e\x3f\x4f\x7f\x9f\x55\xaa\xe5\xea\xd3\xac\xda\x49\xfd\x93\xf5\x66\x8a\x6f\x9f\x66\xfa\x59\x3d\x75\xba\x10\xd3\xab\xd5\x7c\xb9\xd0\xfb\x73\xb5\x5c\xac\x6e\xa7\x57\xab\x96\x58\x2d\x6f\x57\x2f\xea\x6f\xf3\xbb\x59\x4b\x4c\x6f\xe7\x77\xfa\xc8\x5c\xdf\x2e\x3f\x57\x7b\xaa\x8f\xee\xf2\x5a\xff\xd4\x7c\xa1\xa5\x8b\x59\x6d\xa4\x8f\xfc\xeb\x37\x68\x79\x5b\xfd\xfe\xeb\xdd\xec\xc5\x53\x7c\x9c\x4d\x6f\xe6\x8b\xdf\xef\xc4\x7c\xe1\xbe\xa1\xf6\x4d\x5e\xe6\xc9\x7d\x92\xca\xdd\xee\x59\xc4\x59\xfe\xa7\x8a\x44\x9c\x6b\x7c\xe9\x53\xaf\x5a\x15\xf2\x58\x6e\xb3\xfc\xd7\x1f\x97\xdc\x7b\xbd\x52\x85\x10\xd7\x72\x9d\xeb\xa5\xf7\x9b\xda\xed\x64\x1e\xfd\x5a\x88\xef\xf2\x41\x16\x9b\x3c\x39\x94\xe2\xa1\x0c\x3a\x1d\xed\x29\xbe\x17\xbb\x24\x3d\x3e\x19\x91\x26\xd9\xe4\xf2\x72\x5d\x6b\x2e\xb2\xfc\xfe\xd2\xfc\xc0\x65\xfd\x03\x04\x94\x81\x3b\xa8\xfe\x39\x7d\x9a\x64\x66\xeb\x45\xa4\x8a\xe4\x3e\x15\xb9\xda\xcb\x24\x2d\x2e\xaa\x17\x35\x1b\xab\x17\x93\xb2\x50\xbb\xd8\x8c\x97\x85\x58\x2b\x95\x0a\xf5\x54\xaa\x34\xaa\xcf\x51\x73\xca\xd4\x9f\x0a\xe2\xea\x6e\x2e\x36\x59\xa4\x8a\x96\x90\xfb\x2c\xbd\xaf\x85\x59\xa9\x01\x1d\x2b\x59\x1e\x73\x55\xe8\xc3\x77\xf9\xe6\xcd\x65\x75\x0c\xc5\x47\x15\xcb\xe3\xae\x14\x45\xf9\xbc\x53\xd5\x3e\x3f\x9d\xc0\x7c\xf9\xe6\xcd\xc5\xcb\xa6\xfc\xeb\x8d\x10\x42\xac\xe5\xe6\xcf\xfb\x3c\x3b\xa6\x51\x7b\x93\xed\xb2\x7c\x22\x7e\xe9\x74\x3a\x7f\xa9\x5e\xb3\x4f\xc4\x71\x5c\x3f\x11\x67\x69\xd9\x8e\xe5\x3e\xd9\x3d\x4f\xc4\x26\x3b\xe6\x89\xca\xdb\xa9\x7a\x6c\xd9\xdf\x68\xf0\xa5\x59\x71\x90\x1b\xf5\xa3\xa2\xde\xd2\x76\xa1\xca\x32\x49\xef\x8b\x89\x78\xbb\x4b\xee\xe5\x5b\x61\xe6\x1c\xb2\xa2\xc2\xce\x44\xe4\x6a\x27\xcb\xe4\xc1\x88\x8f\x85\xca\xdb\x85\xda\xa9\x4d\x39\x11\x69\x96\x9a\xa7\xdb\xfb\xa2\xdd\xf4\xd2\xa3\x5a\xff\x99\x94\xe7\x5e\xfe\xf7\x0f\xfb\x7e\x11\x67\x9b\x63\xd1\x3a\x3d\x31\xa9\x9e\x30\x87\x24\x3b\x96\xbb\x24\x55\xe7\x84\xe2\xa2\x3a\x9a\xed\xad\xda\x69\xf8\x1a\xc1\x69\xfb\xe5\xba\xc8\x76\xc7\xd2\x6c\x4d\x99\x1d\x26\x7a\x1f\x9b\x1d\xda\xa5\x7a\x2a\x65\xae\xa4\x71\xd2\x6f\xa2\xfe\xf5\x41\x7c\x9a\x5e\xfd\x75\xa2\x17\x44\x9c\x3c\x89\xf9\xec\xd7\x42\xac\x77\x49\xfa\x67\x85\xe9\x63\x5e\x64\xb9\xfd\xc1\xcf\x9a\xce\x2f\x36\xfa\x23\xca\x30\xb4\xd8\xe4\x7a\x71\x59\xca\xcb\x5c\xec\x54\x5c\xb6\x44\xa1\x9f\x90\x65\xf5\x6c\x6d\xa5\x3f\xa1\xd3\xac\x14\x0f\x49\x91\xac\x77\x1a\xba\x95\xf5\x25\xdc\xb9\xec\x20\x37\x49\xf9\x3c\xb1\x6f\xa2\x36\x9f\x88\xf6\x78\x3c\x1e\xab\xfd\xeb\xfd\xd7\xff\xff\x98\x44\xe5\xf6\xe5\x77\x5b\xa5\xcf\xaa\x97\xdf\xfe\xb3\x9d\xa4\x91\x7a\x9a\x88\x76\x60\x9e\xb9\xfc\xf0\x41\x7c\xc9\xd5\x83\x4a\x4b\xf1\x98\xcb\xc3\x41\xef\x78\x51\xef\xca\xfc\xf3\x4c\xc8\xc3\x41\xc9\xbc\x10\xf2\x5e\x9f\x64\xf5\xce\xbc\x1c\x04\xbb\x73\x59\x9e\xeb\xcf\x39\xbb\x07\x76\x8f\x1e\xb7\x49\xa9\xda\xd5\x22\xd5\xef\xb1\xb6\x37\xbb\xf4\xa0\xf2\x78\x97\x3d\x4e\xc4\x36\x89\x22\x95\xd6\xcf\xe6\xaa\x48\xfe\x79\x7e\x35\xd8\xb7\xcd\x9c\x28\x49\xba\x55\x79\x52\x9a\x9d\x57\x4f\x65\x3b\x52\x9b\x2c\x97\xf5\xe1\x3b\xa7\x9f\x6c\xf5\x4c\xeb\x52\xbd\x19\x13\x71\xc8\x92\xb4\x54\x79\x83\xcd\x31\x8d\x54\xae\xd7\xa7\xeb\x65\x16\x56\x92\x3e\xc8\x5d\x12\xb5\xf5\x6a\x39\x6b\xaf\x1d\xd9\x9b\x58\x9f\x29\x93\x34\x2b\xdf\x19\xff\xda\xa6\x5d\xf1\xa5\xfd\xb2\x31\xef\x1b\x7f\x64\x2d\xf3\xf7\xe2\xc5\xcf\xbc\xd6\x0c\x9f\x17\xd6\xbc\xa2\xd1\x8f\x9b\x54\x4f\xaa\xb6\xab\xd1\xf8\xe5\x14\x0e\x0e\x4f\xa2\xc8\x76\x49\xf4\x83\xb3\x79\xb1\x9d\xc5\x71\xa1\xf4\x9a\x0d\x0e\x4f\x7f\x69\xd8\x9e\x32\x97\x69\x71\x90\xb9\x4a\xcb\x73\x5b\xf1\x9f\x1f\x92\x7a\x07\x5e\xbf\x5a\x9d\xe1\xed\x2c\xe5\x1f\xae\x57\x9b\x77\x6e\x25\xbe\x7a\x2f\xcf\x6f\x0a\x99\xd6\xc2\x92\x97\x1d\x6c\xda\xcc\x73\x38\xff\xf7\xcf\x6f\xc6\x64\xb2\x56\x71\x96\xab\xff\x78\x73\xac\xc1\xcb\x49\x9a\x96\x2a\x2d\x27\xe2\xed\xdb\xfa\x58\x45\x49\x71\xd8\xc9\xe7\x89\x58\xef\xb2\xcd\x9f\xee\x47\xd1\x6b\xda\x35\xad\xd4\xff\x62\xbf\xcc\x66\xfd\x08\xc9\x75\x56\x96\xd9\xde\x41\xea\x6b\x80\x56\x6b\xd5\x33\x95\x7d\x48\xd0\xbc\xfc\x15\xa1\x2d\xb0\x39\xe3\xd7\x32\x6f\x5c\xdd\xcc\x05\xff\xb3\xef\xfd\xff\xd6\x3c\xde\x89\xf6\x5f\xec\xff\xff\xdd\x9e\xfe\xfc\x3e\xd9\x15\xfc\xe3\xc5\xc9\x26\xdb\xdb\x53\xa0\xfd\x90\xa8\x47\x22\x3e\x77\x7d\x78\x7d\x7d\xed\x9c\x51\xa7\x2b\xb2\xa6\x13\xaa\xf1\x43\xf8\xe5\x5a\x20\xf0\x6d\xdb\x85\xdc\x68\xb8\x98\x4d\x74\xcf\xe6\x73\x17\x5d\x5a\xa5\x6f\x35\x5f\xae\xb6\xc4\x32\x15\xcb\x3b\xf1\xf7\xfa\x4e\x36\x29\x44\xae\xfe\x71\x4c\xf2\xea\x8e\x55\x64\x79\xa4\x2f\xb3\xb3\xdc\x5e\x4e\x65\xfa\xae\x56\xe6\x55\x5a\x51\x5d\x7f\x88\xf8\xa8\xef\x56\xb2\x83\xfc\xc7\x51\xd9\xcb\x0b\x74\x45\x6d\xaf\x30\xda\xcf\x13\x63\x78\x7e\x43\x1f\x93\x48\xb5\x37\x5b\xf9\x23\x8b\xed\x6b\x69\x96\xef\xf5\x9b\xbc\x95\xb9\xbb\xeb\x49\x5a\x7d\xb0\x81\x23\x90\x67\x8f\xbe\xab\xd6\x57\x14\x40\x97\xb0\x95\xd7\xff\x13\x51\xf2\x70\x3a\x9e\x37\x49\xaa\x8a\x0a\xb5\x26\xc1\x29\x0e\x32\x2d\xea\xb0\x40\x3d\x95\x22\xd5\x37\x33\x22\xdb\xc8\xea\xee\xad\xba\xd7\xd3\x6f\xbd\xbe\x69\x3a\x24\xa5\x12\x6b\xa5\x45\xd5\xf1\x96\x7b\x55\x43\x4f\xbc\xfb\xa5\x1b\x0e\xdf\xc3\xcb\xb7\x73\xdb\x57\x1f\xe0\xf6\x0f\x97\xd7\xd5\x05\x6e\xb2\xab\x2e\x5b\xed\x25\xde\x39\xa5\x3e\xb6\xed\xbd\x92\x85\xbe\x6b\x51\x3b\xb5\xd7\x97\xa1\xf0\x58\x37\xb9\xfb\x0f\xf4\xcb\x15\xf3\xab\x8f\x6a\x95\xca\xf5\x4e\xb5\xf7\xd9\xb1\x50\xed\xea\x32\xb8\x38\x1d\xe4\x6f\x5b\x95\x8a\xea\x25\x61\x5e\x92\xb9\x12\xb5\x24\x12\xef\xd4\xfd\x85\x28\xf7\xc7\xa7\xf7\x2d\xa1\xaf\xa0\xf3\x97\xa4\xa7\x28\x65\x1a\xc9\x3c\xb2\x57\x98\xf6\xf2\xdf\x1c\x58\x7b\x81\x18\xd5\xb7\x90\x0d\x07\xb5\xba\xa9\xd2\x57\xd3\xbc\x7b\x1f\xb2\xa2\x7e\x3c\xbf\x5f\xdf\x47\x5c\x74\xed\xf1\xaa\xb6\xce\xec\x36\xba\x0d\x3b\x6d\xcc\x69\x11\xfe\xfc\x27\xf8\xe9\xd6\xb9\xf6\x57\xf6\x08\xd4\x80\x2b\xe8\x5d\x34\xd9\x90\x75\xb6\x8b\xcc\xfc\xea\x8e\xf7\xd1\x7c\x5c\xea\xe7\xcf\x6f\xfa\xe9\x33\xfa\x5f\x3f\x77\x9d\x6f\x27\x56\xcc\x6f\xd0\x56\x2f\x36\xdc\x77\x56\x0b\xf3\x67\xcf\x07\x7d\x1c\xda\x9d\xd7\x77\x3b\xbf\x84\xaa\xdb\xeb\x0e\x1a\x36\xef\xde\x11\x9d\x39\xfc\x48\x5f\x8b\x03\x67\xe2\x66\xd3\x21\xb7\x03\x64\x62\xd0\x3c\x11\xe9\x6b\x71\xe8\x4c\xec\xa9\xb1\xec\xf8\xf6\x31\x6c\x9e\x88\xf4\xb5\xb8\xeb\xee\x63\x4f\xfa\xf7\xb1\x0b\xf6\x11\xe8\x6b\x71\xcf\x99\xd8\xed\x0d\xfa\xb2\xe7\x99\xd8\x6b\x9e\x88\xf4\xb5\xb8\xef\x4c\x1c\xf6\xfb\x9d\xe1\xda\x33\xb1\xdf\x3c\x11\xe9\x6b\xf1\xc0\x99\xd8\x19\x8c\x47\x63\xe9\x99\x38\x00\x99\x18\xd0\xd7\xe2\xa1\x33\x31\xea\x46\xc3\x0d\xb9\xbe\x72\x26\x0e\x9b\x27\x22\x7d\x2d\x1e\x39\x13\xfb\xfd\xfe\xb0\xdf\xf5\x4c\x1c\x35\x4f\x44\xfa\x5a\x3c\x76\x26\xaa\x38\x1c\x87\x63\xcf\xc4\x71\xf3\x44\xa4\x37\x27\xb3\x0b\x9d\x91\x54\x61\xd7\xb7\x58\x03\x40\x1d\x64\x60\xd4\x2e\x76\xe2\x8d\x1a\xf7\x7c\x6f\x65\x00\xb8\x83\x0c\x8c\xda\x05\xcf\x30\x1c\xc7\xde\xe5\x13\x00\xf2\x20\x03\xa3\x76\xd1\x23\xa3\x61\x2c\x47\xbe\x99\x80\x3d\xc8\xc0\xa8\x29\x7c\x54\xa8\x42\xdf\x4c\x48\x9f\x66\x03\xa3\x76\xf1\xa3\xf4\xaf\x8d\x6f\x26\xe0\x0f\x32\x30\x6a\x02\xa0\x0e\xe7\xa3\x0b\x11\x08\x18\x18\xb5\x8b\x20\x2d\xe8\x7b\xd7\x10\x60\x10\x32\x30\x6a\x17\x42\x5a\x32\x1a\xfa\x66\x02\x0a\x21\x03\xa3\x76\x31\xa4\x25\xd2\xbb\x9f\x80\x43\xc8\xc0\x7c\xc4\xbb\x1c\xd2\x92\xc8\xb7\x9f\x21\xe0\x10\x32\x30\x6a\x97\x43\x5a\x42\x6f\xd9\xdd\x99\x80\x43\xc8\xc0\xa8\x5d\x0e\xe9\x05\xe0\x5d\xb7\x21\xe0\x10\x32\x30\x6a\x97\x43\x5a\xe2\x5d\xb7\x21\xe0\x10\x32\x30\x6a\x97\x43\x5a\xe2\x5d\xb7\x21\xe0\x10\x32\x30\x6a\x97\x43\x5a\xe2\x5d\xb7\x21\xe0\x10\x32\x30\x6a\xca\xa1\x7e\xec\x5f\xb7\x90\x43\xcd\x06\x46\x4d\x39\xd4\x3f\x13\x35\xb9\x33\x21\x87\x9a\x0d\x8c\x9a\x72\x68\x34\xf4\xaf\x5b\xc8\xa1\x66\x03\xa3\xa6\x1c\x1a\x0d\xfd\xeb\x16\x72\xa8\xd9\xc0\x5c\xf8\x53\x0e\x8d\x86\xde\x75\xdb\x85\x1c\x6a\x36\x30\x6a\xca\xa1\xd1\xd0\xbb\x6e\xbb\x90\x43\xcd\x06\x46\x4d\x39\x34\x1a\x7a\xd7\x6d\x17\x72\xa8\xd9\xc0\xa8\x29\x87\x46\x43\xef\xba\xed\x42\x0e\x35\x1b\x18\x35\xe5\x90\xf4\xf3\xb6\x0b\x39\xd4\x6c\x60\xd4\x94\x43\xd2\xcf\xdb\x2e\xe4\x50\xb3\x81\x51\x53\x0e\x49\x3f\x6f\xbb\x90\x43\xcd\x06\x46\x4d\x39\x24\xfd\xbc\xed\x42\x0e\x35\x1b\x18\x35\xe5\x90\xf4\xf3\xb6\x0b\x39\xd4\x6c\x60\xd4\x94\x43\xd2\xcf\xdb\x2e\xe4\x50\xb3\x41\xad\xee\x51\x0e\x45\x7e\xde\xf6\x20\x87\x9a\x0d\x8c\x9a\x72\x28\xf2\xf3\xb6\x07\x39\xd4\x6c\x60\xd4\x94\x43\x91\x9f\xb7\x3d\xc8\xa1\x66\x03\xa3\xa6\x1c\x8a\xfc\xbc\xed\x41\x0e\x35\x1b\x18\x35\xe5\x50\xe4\xe7\x6d\x0f\x72\xa8\xd9\xc0\xa8\x29\x87\x22\x3f\x6f\x7b\x90\x43\xcd\x06\x46\x4d\x39\x14\xfb\x79\xdb\x83\x1c\x6a\x36\x30\x6a\xca\xa1\xd8\xcf\xdb\x1e\xe4\x50\xb3\x81\x51\x53\x0e\xc5\x7e\xde\xf6\x20\x87\x9a\x0d\x8c\x9a\x72\x28\xf6\xf3\xb6\x07\x39\xd4\x6c\x50\xab\xfb\x94\x43\xb1\x9f\xb7\x7d\xc8\xa1\x66\x03\xa3\xa6\x1c\x8a\xfd\xbc\xed\x43\x0e\x35\x1b\x18\xb5\xcb\x21\x7d\x53\xe5\x5d\xb7\x7d\xc0\x21\x64\x60\xd4\x2e\x87\xb4\xc4\xbb\x6e\xfb\x80\x43\xc8\xc0\xa8\x5d\x0e\x69\x89\x77\xdd\xf6\x01\x87\x90\x81\x51\xbb\x1c\xd2\x12\xef\xba\xed\x03\x0e\x21\x03\xa3\x76\x39\xa4\x25\xfe\x75\x0b\x38\x84\x0c\x8c\xda\xe5\x90\x96\xf8\xd7\x2d\xe0\x10\x32\x30\x6a\x12\x52\xc7\x8c\x3c\xa1\x8f\x52\x6a\x60\x60\xd4\x2e\x87\xb4\xc4\xbf\x6e\x01\x87\x90\x41\xad\x1e\xb8\x1c\xd2\x02\xef\xba\x1d\x00\x0e\x21\x03\xa3\x76\x39\xa4\x25\xde\x75\x3b\x00\x1c\x42\x06\x46\x4d\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x40\x39\xc4\xc8\x13\x06\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x48\x39\xc4\xc8\x13\x86\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\x44\x39\xc4\xc8\x13\x46\x90\x43\xbe\x3c\x61\xe4\x72\x48\x5f\x9c\xfa\xd7\x2d\xe0\x10\x32\x30\x6a\x97\x43\x5a\xe2\x5f\xb7\x80\x43\xc8\xa0\x56\x8f\x49\x7f\x68\xc8\xc8\x13\xc6\xa8\x3f\x04\x0c\x8c\xda\xe5\x90\x96\x78\xd7\xed\x18\x70\x08\x19\x18\xb5\xcb\x21\x2d\xf1\xae\xdb\x31\xe0\x10\x32\x30\x6a\x97\x43\x5a\xe2\x5d\xb7\x63\xc0\x21\x64\x60\xd4\x2e\x87\xf4\x0d\x8e\x77\xdd\x8e\x01\x87\x90\x81\x51\xbb\x1c\xd2\x12\xef\xba\x1d\x03\x0e\x21\x03\xa3\x76\x39\xa4\x25\xfe\x75\x0b\x38\x84\x0c\x8c\xda\xe5\x90\x96\xf8\xd7\x2d\xe0\x10\x32\x30\x6a\xca\x21\x46\x9e\x30\x86\x1c\xf2\xe5\x09\x63\xca\x21\x46\x9e\x30\x86\x1c\xf2\xe5\x09\x41\x87\x82\x88\x11\x28\x9c\x64\x67\xa7\xfa\x12\x85\xa0\x43\x51\xc4\x88\x14\x4e\xb2\x86\xa9\x9e\x4e\x58\x87\xc2\x88\x11\x2a\x9c\x64\x0d\x53\x3d\xad\xb0\x0e\xc5\x11\x23\x56\x38\xc9\x1a\xa6\xe2\xf5\x1b\x74\x28\x90\x18\xc1\xc2\x49\xd6\x30\x15\xaf\xe0\xa0\x43\x91\xc4\x88\x16\x4e\xb2\x86\xa9\xbe\x35\x4c\xa1\xc4\x08\x17\x4e\xb2\xb3\x53\x7d\xe9\x42\xd0\xa1\x58\x62\xc4\x0b\x27\x59\xc3\x54\xdf\x1a\xa6\x60\x62\x04\x0c\x27\x59\xc3\x54\xdf\x1a\xa6\x68\x62\x44\x0c\x27\x59\xc3\x54\xcf\x1a\xa6\x25\xeb\x21\x23\x64\x08\x60\xcb\x1a\x38\x58\x39\x65\x13\x23\x66\x08\x50\xcf\x1a\x39\x58\x39\x65\x13\x23\x68\x08\x50\xd3\x1a\x39\x58\x39\x65\x13\x23\x6a\x08\x50\xd7\x1a\x39\x58\x39\x65\x13\x23\x6c\x08\x50\xdb\x1a\x39\x58\x39\x65\x13\x23\x6e\x08\x50\xdf\x1a\x39\x58\x39\x65\x13\x23\x70\x08\x50\xe3\x1a\x39\x58\x39\x65\x13\x23\x72\x08\x50\xe7\x1a\x39\x58\x39\x65\x13\x23\x74\x08\x50\xeb\x1a\x39\x58\x39\x65\x13\x23\x76\x08\x50\xef\x1a\x39\x18\x39\x29\x5e\x6b\x8d\x7f\x0d\xa3\xe6\x35\x72\xb0\x72\xca\x26\x46\xf4\x10\xa0\xee\x35\x72\xb0\x72\xca\x26\x46\xf8\x10\xa0\xf6\x35\x72\xb0\x72\xca\x26\x46\xfc\x10\xa0\xfe\x35\x72\xb0\x72\x97\x4d\x92\x53\x68\x08\x50\x03\x1b\x39\x58\xb9\xcb\x26\xc9\xa9\x34\x04\xa8\x83\x8d\x1c\xac\xdc\x65\x93\xe4\x94\x1a\x02\xd4\xc2\x46\x0e\x56\xee\xb2\x49\x72\x6a\x0d\x01\xea\x61\x23\x07\x2b\x77\xd9\x24\x39\xc5\x86\x00\x35\xb1\x91\x83\x95\xbb\x6c\x92\x9c\x6a\x43\x80\xba\xd8\xc8\xc1\xc8\x49\x19\x5b\x72\xca\x0d\x01\x6a\x63\x23\x07\x2b\x77\xd9\x24\x39\xf5\x86\x00\xf5\xb1\x91\x83\x95\xbb\x6c\x92\x9c\x82\x43\x80\x1a\xd9\xc8\xc1\xca\xc9\x5f\x51\xe3\x54\x1c\x02\xd4\xc9\x46\x0e\x56\x4e\xd9\xc4\x08\x25\x02\xd4\xca\x46\x0e\x56\x4e\xd9\xc4\x88\x25\x02\xd4\xcb\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\x33\x1b\x39\x58\x39\x65\x13\x27\x97\x40\xdd\x6c\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\xb5\xb3\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xcf\x46\x0e\x46\x4e\x0a\xda\x92\x53\x78\x08\x50\x43\x1b\x39\x58\x39\x65\x13\x27\x97\x40\x1d\x6d\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\xb5\xb4\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xd3\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\x53\x1b\x39\x58\x39\x65\x13\x27\x97\x40\x5d\x6d\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\xb5\xb5\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xd7\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\x63\x1b\x39\x58\x39\x65\x13\x27\x97\x40\x9d\x6d\xe4\x60\xe4\xa4\xb4\x2d\x39\x25\x88\x00\xb5\xb6\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xdb\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\x73\x1b\x39\x58\x39\x65\x13\x27\x97\x40\xdd\x6d\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\xb5\xb7\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xdf\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\x83\x1b\x39\x58\x39\x65\x13\x27\x97\x40\x1d\x6e\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\xb5\xb8\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xe3\x46\x0e\x46\x4e\x8a\xdc\x11\xa7\x18\x11\xa0\x26\x37\x72\xb0\x72\x97\x4d\x11\xa7\x1a\x11\xa0\x2e\x37\x72\xb0\x72\x97\x4d\x11\xa7\x1c\x11\xa0\x36\x37\x72\xb0\x72\x97\x4d\x11\xa7\x1e\x11\xa0\x3e\x37\x72\xb0\x72\x97\x4d\x11\xa7\x20\x11\xa0\x46\x37\x72\xb0\x72\x97\x4d\x11\xa7\x22\x11\xa0\x4e\x37\x72\xb0\x72\x97\x4d\x11\xa7\x24\x11\xa0\x56\x37\x72\xb0\x72\xf2\x0d\x48\x9c\x9a\x44\x80\x7a\xdd\xc8\xc1\xca\x5d\x36\x45\x9c\xa2\x44\x80\x9a\xdd\xc8\xc1\xca\x5d\x36\x45\x9c\xaa\x44\x80\xba\xdd\xc8\xc1\xc8\x49\xb9\x3b\xe2\x94\x25\x02\xd4\xee\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\xbf\x1b\x39\x58\x39\x65\x13\x27\x97\x40\x0d\x6f\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\x75\xbc\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xf2\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\xcf\x1b\x39\x58\x39\x65\x13\x27\x97\x40\x4d\x6f\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\x75\xbd\x91\x83\x95\x53\x36\x71\x72\x09\xd4\xf6\x46\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\xdf\x1b\x39\x18\x39\x29\x7c\x47\xac\xbe\x04\x6a\x7c\x23\x07\x2b\xa7\x6c\xe2\xe4\x12\xa8\xf3\x8d\x1c\xac\x9c\xb2\x89\x93\x4b\xa0\xd6\x37\x72\xb0\x72\xca\x26\x4e\x2e\x81\x7a\xdf\xc8\xc1\xca\x29\x9b\x38\xb9\x04\x6a\x7e\x23\x07\x2b\xa7\x6c\xe2\xe4\x12\xa8\xfb\x8d\x1c\xac\x9c\xb2\x89\x93\x4b\xa0\xf6\x37\x72\xb0\x72\xca\x26\x4e\x2e\x81\xfa\xdf\xc8\xc1\xca\x29\x9b\x38\xb9\x04\x6a\x80\x23\x07\x2b\xa7\x6c\xe2\xe4\x12\xa8\x03\x8e\x1c\x8c\x9c\x94\xc0\x23\x56\x5f\x02\xb5\xc0\x91\x83\x95\x53\x36\x71\x72\x09\xd4\x03\x47\x0e\x56\x4e\xd9\xc4\xc9\x25\x50\x13\x1c\x39\x58\x39\x65\x13\x27\x97\x40\x5d\x70\xe4\x60\xe5\x94\x4d\x9c\x5c\x02\xb5\xc1\x91\x83\x95\x53\x36\x71\x72\x09\xd4\x07\x47\x0e\x56\xee\xb2\x29\x66\xf5\x25\x50\x23\x1c\x39\x58\xb9\xcb\xa6\x98\xd5\x97\x40\x9d\x70\xe4\x60\xe5\x2e\x9b\x62\x56\x5f\x02\xb5\xc2\x91\x83\x95\xbb\x6c\x8a\x59\x7d\x09\xd4\x0b\x47\x0e\xb5\x3c\x24\xbd\xf0\x98\xd3\x97\x08\x51\x2f\x1c\x39\x58\x39\xf9\x8a\x5b\x4e\x5f\x22\x44\xbd\x70\xe4\x60\xe5\x2e\x9b\x62\x4e\x5f\x22\x44\xbd\x70\xe4\x60\xe5\x2e\x9b\x62\x4e\x5f\x22\x44\xbd\x70\xe4\x60\xe5\x2e\x9b\x62\x4e\x5f\x22\x44\xbd\x70\xe4\x60\xe5\x2e\x9b\x62\x4e\x5f\x22\x44\xbd\x70\xe4\x60\xe5\x94\x4d\x9c\x2f\x99\x44\xbd\x70\xe4\x60\xe5\x94\x4d\x9c\xaf\x99\x44\xbd\x70\xe4\x60\xe5\x94\x4d\x9c\x2f\x9a\x44\xbd\x70\xe4\x60\xe5\x94\x4d\x9c\xaf\x9a\x44\xbd\x70\xe4\x60\xe4\xa4\x17\x1e\x73\xfa\x12\x21\xea\x85\x23\x07\x2b\xa7\x6c\x62\xe4\x12\x21\xfc\xfe\x6d\x6f\x5f\x22\x24\xbd\xf0\x98\xd3\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x58\x39\x65\x13\x23\x97\x08\x51\x2f\x1c\x39\x18\x39\xe9\x85\xc7\x9c\xbe\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xca\x29\x9b\x18\xb9\x44\x88\x7a\xe1\xc8\xc1\xc8\x49\x2f\x3c\xe6\xf4\x25\x42\xd4\x0b\x47\x0e\x56\x4e\xd9\xc4\xc8\x25\x42\xd4\x0b\x47\x0e\x56\x4e\xbe\x20\x77\xa4\x1f\xde\xa9\xe8\x1b\x72\x81\x83\x95\xbb\x6c\x0a\x42\xfd\xf0\x4e\x05\x6c\x42\x0e\x56\xee\xb2\x29\xd8\xe8\x87\x77\x2a\x60\x13\x72\xb0\x72\x97\x4d\xe1\x40\x3f\xbc\x53\x01\x9b\x90\x83\x95\xbb\x6c\xea\x76\xf4\xc3\x3b\x15\xb0\x09\x39\x58\xb9\xcb\xa6\xae\xd4\x0f\xef\x54\xc0\x26\xe4\x60\xe5\x2e\x9b\x7a\xd5\x2f\xef\x54\xc0\x26\xe4\x60\xe5\x2e\x9b\x7a\x4a\x3f\xbc\x53\x01\x9b\x90\x83\x91\x93\x5e\x78\x7f\xa4\x1f\xbe\xa9\xa8\x17\x8e\x1c\xac\xdc\x65\x53\xb5\x00\xbd\xe7\x2b\xea\x85\x23\x07\x2b\x77\xd9\x34\xd8\xe8\x87\x77\x2a\x60\x13\x72\xb0\x72\x97\x4d\xc3\x81\x7e\x78\xa7\x02\x36\x21\x07\x2b\x27\x7f\xd7\xb7\xc2\xa8\x77\x2a\xfa\xbb\xbe\xc0\xc1\xca\xc9\xdf\xf5\x95\xfa\xe1\x9d\x8a\xfe\xae\x2f\x70\xb0\x72\x97\x4d\xe3\x9e\x7e\x78\xa7\x02\x36\x21\x07\x2b\x77\xd9\x34\x56\xfa\xe1\x9d\x0a\xd8\x84\x1c\xac\x9c\x74\x2f\xab\x03\xe4\x9d\x8a\xba\x97\xc0\xc1\xca\x5d\x36\xad\x43\xfd\xf0\x4e\x05\x6c\x42\x0e\x46\x4e\x7a\xe1\xeb\x8d\x7e\xf8\xa6\xa2\x5e\x38\x72\xb0\x72\xf2\xaf\x4c\x56\x27\xb9\x77\x2a\xfa\x77\x26\x81\x83\x95\x93\x3f\xa7\xeb\xe8\x87\x77\x2a\xfa\x73\x3a\xe0\x60\xe5\xe4\xcf\xe9\xa4\x7e\x78\xa7\xa2\x3f\xa7\x03\x0e\x56\xee\xb2\xa9\xfa\x98\xf2\x9e\xaf\xa8\x17\x8e\x1c\xac\xfc\xec\x3f\xfb\xe6\x3d\x5f\x51\x2f\xfc\xe4\xf0\x3f\x01\x00\x00\xff\xff\xa8\x8d\x33\x24\xc6\x8b\x00\x00") - -func staticCssXtermCssBytes() ([]byte, error) { - return bindataRead( - _staticCssXtermCss, - "static/css/xterm.css", - ) -} - -func staticCssXtermCss() (*asset, error) { - bytes, err := staticCssXtermCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/css/xterm.css", size: 35782, mode: os.FileMode(436), modTime: time.Unix(1503381631, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _staticCssXterm_customizeCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x8e\x41\x6b\xe3\x30\x10\x85\xef\xfe\x15\x83\x21\xb0\x0b\x96\x71\x16\xcc\x2e\xca\x69\xa1\xed\x2d\xa7\x94\xde\xc7\xf6\x38\x55\x23\xcd\x08\x49\x4e\xed\x96\xfc\xf7\xe2\xda\x69\xf3\x0b\x7a\x19\xde\x1b\x3d\xbd\x6f\xca\x44\xc1\x19\x46\x0b\xef\x19\x00\x40\x2f\x9c\x54\x8f\xce\xd8\x49\x43\x7e\x47\x2f\xf8\x34\xc0\x01\x39\xc2\x5e\x58\xf2\x02\xf2\xfb\x33\x85\x28\x7c\xf5\x0f\x81\x68\x96\x05\xec\x89\xad\x14\xf0\xb8\x16\x16\xe0\x84\x25\x7a\x6c\xa9\x80\xfc\xbf\xf7\x96\xe0\x30\xb9\x46\x6c\xcc\x77\xd9\x25\xcb\xca\x71\x66\x2b\x39\x53\xb0\x38\xfd\x30\x7f\x66\x35\x12\x3a\x0a\x2a\x60\x67\x86\xa8\x61\x5b\xfb\x71\xf7\x7d\x44\x34\x6f\xa4\x61\x1c\x95\xc5\x70\xa4\xe5\xa1\x15\x2b\x41\x43\x63\xb1\x3d\xad\x1d\xd8\x9e\x8e\x41\x06\xee\x34\xbc\x3e\x9b\xb4\x06\xc5\x63\x6b\xd2\xa4\xa1\x2a\xff\xd6\xcb\xca\x63\xd7\x19\x3e\xce\xab\x3f\xe4\xa0\x2a\xeb\xcf\xf9\xa5\xd7\x94\x44\x93\x8c\xb0\x06\x6c\xa2\xd8\xe1\x5a\x98\xc4\x6b\xa8\xab\xcd\xe2\x2c\xf5\xe9\xc6\xa6\x80\x1c\x7b\x09\x4e\x2f\xd2\x62\xa2\x5f\xaa\xae\x36\x05\xcc\xf3\xf7\x92\x1a\x22\x05\x15\xc9\x52\x9b\x34\xb0\x30\xdd\x7c\x5e\x99\xeb\xd9\xb0\xfd\x57\xb9\x08\x84\x91\x94\xe1\x5d\x76\xf9\x08\x00\x00\xff\xff\xa9\x5f\x6b\xf4\x26\x02\x00\x00") - -func staticCssXterm_customizeCssBytes() ([]byte, error) { - return bindataRead( - _staticCssXterm_customizeCss, - "static/css/xterm_customize.css", - ) -} - -func staticCssXterm_customizeCss() (*asset, error) { - bytes, err := staticCssXterm_customizeCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/css/xterm_customize.css", size: 550, mode: os.FileMode(436), modTime: time.Unix(1503469811, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _staticFaviconPng = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x00\x5f\x03\xa0\xfc\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x20\x00\x00\x00\x20\x08\x03\x00\x00\x00\x44\xa4\x8a\xc6\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\x79\x71\xc9\x65\x3c\x00\x00\x01\xa4\x50\x4c\x54\x45\x1c\x1c\x1c\x2e\x2e\x2e\x1a\x1a\x1a\x25\x25\x25\x26\x26\x26\x24\x24\x24\x4e\x4e\x4e\x5f\x5f\x5f\x20\x20\x20\x1e\x1e\x1e\x1f\x1f\x1f\x22\x22\x22\x1d\x1d\x1d\x21\x21\x21\x3b\x3b\x3b\x19\x19\x19\x16\x16\x16\x2c\x2c\x2c\x29\x29\x29\x28\x28\x28\x27\x27\x27\x2b\x2b\x2b\x2a\x2a\x2a\x2d\x2d\x2d\x2f\x2f\x2f\x00\xac\x3a\x00\xa9\x3a\x60\x60\x60\x3a\x3a\x3a\x00\xae\x3b\x05\x9a\x38\x5e\x5e\x5e\x25\x24\x24\x52\x52\x52\x18\x18\x18\x39\x39\x39\x55\x55\x55\x5c\x5c\x5c\x5d\x5d\x5d\x37\x37\x37\x32\x32\x32\x50\x50\x50\x61\x61\x61\x5b\x5b\x5b\x4f\x4f\x4f\x58\x58\x58\x53\x53\x53\x59\x59\x59\x30\x27\x2d\x28\x1e\x24\x56\x56\x56\x54\x54\x54\x14\x14\x14\x2f\x2c\x2e\x17\x17\x17\x1b\x1b\x1b\x44\x44\x44\x35\x35\x35\x33\x33\x33\x4a\x4a\x4a\x36\x36\x36\x38\x38\x38\x20\x62\x36\x34\x34\x34\x30\x30\x30\x31\x31\x31\x23\x24\x24\x75\x75\x75\x2a\x22\x27\x20\x55\x32\x2e\x2b\x2d\x27\x1f\x24\x2e\x2a\x2d\x29\x26\x28\x62\x62\x62\x25\x21\x24\x26\x25\x25\x26\x2e\x29\x2b\x28\x2a\x20\x60\x36\x1f\x3b\x29\x2d\x25\x2b\x1f\x53\x32\x11\x70\x32\x25\x24\x25\x1d\x4f\x2e\x25\x29\x27\x1f\x52\x31\x00\xb1\x3b\x27\x2e\x2a\x77\x77\x77\x28\x2f\x2b\x2a\x31\x2d\x00\xb6\x3c\x23\x23\x23\x28\x25\x27\x2f\x2e\x2f\x11\x71\x32\x5a\x5a\x5a\x14\x66\x30\x30\x28\x2d\x2e\x25\x2c\x22\x5a\x35\x1e\x51\x2f\x2e\x31\x2f\x29\x21\x26\x2a\x3e\x31\x25\x26\x26\x2b\x32\x2d\x1c\x4f\x2d\x2c\x24\x2a\x30\x26\x2c\x28\x20\x25\x57\x57\x57\x00\xae\x3a\x27\x25\x26\x2a\x27\x29\x2c\x29\x2b\x25\x2d\x28\x00\xaf\x3b\x2c\x34\x2f\x22\x23\x23\x27\x1e\x24\x29\x30\x2c\x2b\x33\x2e\x04\xa0\x3a\x26\x23\x25\x1a\x50\x2d\x1f\x51\x30\x00\xb5\x3b\x00\xb3\x3b\x2b\x23\x28\x03\xa0\x39\x11\x6e\x31\x05\x99\x38\x1d\x50\x2f\x00\xb4\x3c\x2d\x2a\x2c\x63\x63\x63\x2f\x2b\x2e\x63\xda\xc5\x2e\x00\x00\x01\x51\x49\x44\x41\x54\x38\xcb\x85\xcc\xd5\x76\xc2\x40\x14\x40\xd1\x0b\x24\x78\x25\x81\x00\x2d\x69\x53\xdc\xdd\x1d\xea\xee\xee\xee\xee\xee\xde\x9f\x6e\xf2\x3c\x0c\xec\xe7\xb3\x0e\xcc\x72\x46\x19\x96\x91\x6b\x03\x2e\xc9\xd6\x62\xb1\x49\x1b\xfc\xb2\x54\x2c\x18\x0c\xae\x8b\xca\xa1\x58\x37\xf4\xb2\xdd\xbb\xf9\xa1\xfc\xe6\xf6\xb2\x01\xa5\x67\x8d\xe0\xb6\x1c\x75\xbc\x5c\xbd\x3e\x5c\xc7\xca\x1d\x2c\x42\xb0\x31\x7a\xda\xd8\xd0\x7c\xff\x87\x09\x8c\xb9\x91\xa9\x26\x3e\xd8\xef\xd4\xa3\x98\x9c\x0c\x64\x8e\xc3\x67\x21\x98\xff\xa1\x50\x3a\x07\xc7\x07\x6f\x5b\x42\x70\x77\xc1\xa0\x68\x3e\xe0\xb2\xed\x5f\x42\x30\x37\xa8\x43\x69\xb2\x76\xb0\xa7\x76\x26\x84\x60\xe6\x9c\x46\x69\x53\x36\xb0\x15\x8e\x0f\xf8\xe0\x73\xa0\x47\x83\x22\x0a\x1e\xb0\xa5\x6f\x9f\x16\xa6\xbf\xdf\x2f\x97\xb4\x28\x49\xda\x03\x1e\x67\xdf\xf0\xca\xc7\xd8\xda\xe4\x19\x81\x22\x9d\xab\x10\x70\xb6\x3e\x86\x42\xa1\xae\xfe\xbd\xb2\x81\x0f\x02\xa5\x9b\x16\xc1\xb8\xa4\x8c\xc5\x12\x1f\x14\x55\x24\x96\xaa\xe8\x83\x13\x91\x5c\x85\x25\x17\x85\x21\xac\x57\xd6\x60\x29\xf5\x56\x08\x53\x0a\x39\x96\x82\xb2\x82\x95\x51\x2b\xb1\xd4\x8c\x15\x22\x3a\x50\x60\x81\x2e\x02\x7e\x3a\xa1\xc6\x4a\xd0\x7e\x30\xd1\x62\xc0\x12\x0b\x81\xa6\x52\xa0\x31\x55\x09\xb4\x26\x70\x11\x66\x31\x96\x59\xeb\xaa\x16\x78\xf9\x20\x5e\x87\x15\x27\xbc\xe0\x25\xa3\xf5\x58\x51\x52\x0a\x19\x03\x29\xc1\x22\x0d\x19\xb0\x4b\x2b\xb2\xff\x03\x80\x64\x51\xf1\x29\x1a\xc2\x9c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\x01\x00\x00\xff\xff\xb0\xaa\xd3\x73\x5f\x03\x00\x00") - -func staticFaviconPngBytes() ([]byte, error) { - return bindataRead( - _staticFaviconPng, - "static/favicon.png", - ) -} - -func staticFaviconPng() (*asset, error) { - bytes, err := staticFaviconPngBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/favicon.png", size: 863, mode: os.FileMode(436), modTime: time.Unix(1503381631, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _staticIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x91\x51\x6a\xc3\x30\x0c\x86\xdf\x77\x0a\xcd\xef\x8b\x2f\xa0\xe4\x2a\x25\xb5\x95\x44\xad\x63\x07\x4b\x09\xcd\x4a\xef\x3e\x3c\xb7\x30\xe8\x60\xa3\x4f\x16\xfa\xbf\xef\xc7\xd8\xf8\xee\x93\xd3\x7d\x21\x98\x74\x0e\xdd\x1b\xd6\x03\x00\x27\xea\x7d\x19\x00\x50\x59\x03\x75\xd7\x2b\x34\xdf\x13\xdc\x6e\x68\xeb\xae\xe6\x81\xe3\x19\x32\x85\xd6\xb0\x4b\xd1\x40\xe9\x6b\x0d\xcf\xfd\x48\x76\x89\xa3\x81\x29\xd3\xd0\x9a\xa1\xdf\x4a\xde\x94\xd5\x93\x29\xba\x07\x92\x89\x48\x1f\x78\x63\x9d\x88\xe5\xe8\xe9\xd2\x38\x11\x03\xf6\xdf\xd2\x45\x29\xcf\x2f\x49\x07\xb7\x8a\xa6\x99\x3f\xe9\x87\x8e\xf6\xf1\x18\x78\x4c\x7e\xbf\x37\x7a\xde\x80\x7d\x6b\x8a\xc6\xb1\x0f\xa6\x43\xeb\x79\xbb\xa7\xe2\x32\x2f\x0a\x92\x5d\xe9\xef\x57\x9d\x0e\x9a\xce\x14\x9b\x93\x14\xb0\xc6\xbf\xb2\x2e\xc5\x81\xc7\xbf\xb9\x93\xd8\x31\xa9\xee\x1f\xc7\x35\xfa\x40\x4f\x02\xda\x7a\x59\xb4\xf5\x4f\xbf\x02\x00\x00\xff\xff\x92\x6e\x9e\x42\xeb\x01\x00\x00") - -func staticIndexHtmlBytes() ([]byte, error) { - return bindataRead( - _staticIndexHtml, - "static/index.html", - ) -} - -func staticIndexHtml() (*asset, error) { - bytes, err := staticIndexHtmlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/index.html", size: 491, mode: os.FileMode(436), modTime: time.Unix(1503385310, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _staticJsBundleJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xeb\x73\x1b\x49\xf2\x20\xf6\x79\xf9\x57\xa4\x38\x77\x83\x86\x08\x82\x00\xf8\x90\x44\x0a\xd2\x42\x04\x39\xd2\x8e\x5e\x47\x72\x76\x76\x8f\xc3\x1f\xb7\xd0\x5d\x00\x5a\x6a\x74\x63\xbb\x1b\x24\xb1\x23\xce\x27\xdb\x11\xfe\xe8\x2f\x0e\x7f\xb8\x08\xbf\xce\xfe\xdd\x39\x1c\x8e\xb3\xe3\xe2\xc2\x0e\x9f\xed\x88\x9d\x7f\xcc\x51\x59\xef\xee\x6a\x00\xd4\x63\x67\x7e\x71\x0b\xcd\x48\x40\x3d\xb2\xb2\xb2\x32\xb3\xb2\xaa\xb2\xb2\xb6\xee\xe3\x67\x0b\xbc\xe1\x2c\xf6\xf3\x30\x89\xbd\x49\x12\xcc\x22\x9a\xd5\xe1\x47\xd8\xda\x82\x6b\x3a\x98\x12\xff\xfd\xb3\x24\xc9\xb3\x3c\x25\xd3\x35\x55\xe3\x37\x5b\x5b\x70\x36\xa6\xc0\xcb\x83\x4f\xfc\x31\x35\x72\xaf\x48\x0a\x61\x9c\xe5\x24\x8a\x68\xf0\x8a\xc3\x84\x2e\xfc\x78\x7b\xa0\x0a\x95\x61\xa5\xf4\xcf\xb3\x30\xa5\x20\x91\x31\x4a\xc8\x24\xb8\xbc\x14\x38\x5d\x8a\xd2\x97\x97\x02\xe7\x17\x41\x1d\x7e\x74\x41\x67\xe0\x0f\xc7\xd4\x7f\x0f\xe1\x50\xe2\x1b\x66\x10\xc6\x25\xac\x7f\x13\x0e\xbd\x22\xd6\xe7\x12\xfa\x85\x09\x1e\x7e\xf3\x9b\xdf\xa4\x34\x9f\xa5\x71\xa9\x9b\xba\x42\x93\xde\x4c\x93\x34\xcf\x0e\xcc\x6a\xb7\x45\xcc\x52\x4a\x72\x0a\x04\x62\x7a\x2d\xb1\xf3\x48\x1c\xc0\x74\x96\x43\x98\x43\x18\xe7\x09\xe4\x63\x41\xe2\xba\x59\x9b\x11\x59\xd4\xe8\x2e\x40\x83\xd1\xdd\x42\x3c\xdc\x07\x99\xd9\xb0\x32\xa2\x7d\x18\x92\x28\xa3\x76\xaa\xe8\xc5\x3e\xfc\x68\xe1\xee\x1e\x4a\xd6\xa5\xa3\x1b\xea\xcf\x72\x8a\x58\x0b\xfc\x1c\x43\xfa\x9b\x49\x89\x5e\x3e\x89\x22\x31\x9a\x92\x76\x0d\x01\x41\xfe\xab\xd3\x1d\x9c\x50\xaf\x44\xe9\x38\x22\x23\x13\x1f\x92\x41\x94\x90\x80\x06\x65\x84\x9a\x11\x74\x21\x4f\x67\xb4\x12\xd8\x09\x1f\x78\x06\x4e\x60\x03\xc9\xd0\x80\x6e\x16\x17\x4c\x62\x23\x6f\x32\xc4\x6d\xb9\x15\x5b\x32\x58\x9d\xcc\x24\x66\x06\xc9\xe0\x1d\xf5\x73\xf0\x34\x09\x44\xce\xe5\xa5\xc9\x20\x0e\x0a\x35\x27\xd0\x95\x60\xaa\x44\xb1\xd4\x60\x49\x4e\x5c\x80\x7d\x07\x0f\x56\xb5\x10\x06\x34\xce\xc3\x7c\xae\xd8\x02\x86\x49\x0a\x6c\xf4\xc3\x78\x04\x63\x92\x4e\x92\x78\x0e\xe1\x84\xd3\xf6\x3a\xcc\xc7\x5c\x02\x92\x34\x65\xfd\xf6\x93\x38\xa7\x37\xf9\x12\x84\x42\xe8\x2a\xf8\xde\x15\x89\x66\x94\x29\x35\x31\x1e\xf8\xfb\x00\x2a\xd5\x51\x40\x87\x61\x4c\x61\x44\xf3\x9c\xa6\x36\x9a\x12\x3d\x31\x96\x4b\xb0\x08\x4c\x2c\x14\xef\xc6\x64\x42\x1b\x02\x7a\x41\xad\x84\x43\xef\x9e\x0b\x50\x62\xd7\xae\x17\xb5\xd1\x1b\xe4\x89\x26\x47\xfc\x6d\x9a\x4c\x69\x9a\xcf\x8b\x2d\xda\x55\x7e\xe3\x27\xf1\x30\x1c\xcd\x52\x32\x88\xa8\x53\xf4\x7f\x43\xe3\xd9\x84\x8a\x7c\x26\x13\x85\xec\x11\xcd\xf7\x45\x37\xac\x8c\xdb\x7a\xa5\xce\xab\x24\xf9\x88\xe6\x7d\x3a\x24\xb3\x28\x3f\x42\xa4\x0b\xcc\x91\x4c\xa6\x24\x0f\x07\x61\xc4\xf8\x06\x59\x22\x4e\xe2\x4d\x39\x18\x82\xa5\x97\x0c\x46\x6c\x0e\x06\xaf\x52\x20\x23\x53\xa9\x62\xd0\xa5\x9c\xc0\xd7\x5f\x4b\xf1\xbd\xbc\xa4\x19\x67\x6d\x78\x6a\xf5\x57\xa1\xaa\x3b\xe1\x19\xdc\xc6\xab\x9f\xd7\x02\x9e\x55\xbb\x38\x80\x5b\xd8\xaf\x84\xc0\x9b\xe0\x54\xc8\xca\x70\x2c\xb6\x85\xdf\xb8\xd9\xce\xe3\xbd\x68\x40\x8d\xd4\x14\xa7\x1d\x38\x34\x13\xcf\x3a\x58\x65\x84\x04\x8b\x4d\xd3\x24\x4f\xf2\xf9\x94\x36\xc7\x24\x7b\x73\x1d\x4b\x66\x43\xf5\xbd\x64\x04\x12\x73\x04\xb8\x1a\x6b\xc0\x54\x00\x30\x7a\xba\x4a\x53\xe5\xfa\x0b\x04\x5a\x23\x33\x9d\x0d\xa2\xd0\xbf\x9c\x92\x7c\x7c\x79\xb9\x04\xdd\x29\x74\x61\x7d\xbd\x0a\xe6\xcb\x84\x04\x40\xe3\x3c\x9d\xab\x69\x25\x0e\x64\x0f\xca\xea\x41\x64\xb8\x2c\x18\x57\xdb\xcc\x5e\x6a\xef\x9a\x63\x76\xab\x94\xfb\xa7\x7f\x8c\xae\x78\xe7\x6b\x5b\xf7\xa1\x05\x22\xad\x6c\x0d\x36\x60\xe1\xa4\x0b\x3f\xae\xad\xad\xcf\x32\x0a\x59\x9e\x86\x7e\xbe\x7e\xb0\xb6\xb6\x44\x19\xad\x6b\x41\x5a\x6f\xc0\x8f\x5c\x1b\x73\x05\x03\x4c\x75\x30\x29\x3c\x4c\x26\xd3\x24\x0b\x19\x1a\xcf\x69\x34\xa5\xe9\x65\x1b\xba\x4e\xe2\xb5\xf7\x44\x95\xa3\x2b\x1a\xe7\x47\x93\x90\x31\x74\x75\x69\x51\xf8\xf7\x21\xbd\x66\xe8\x54\x16\xec\x6c\x4b\x4c\xa2\x70\x3a\x48\x48\x1a\x54\x16\xdd\x6e\xc9\xa2\x61\xea\xcf\x22\x92\xbe\x0c\xb3\x6a\xc0\xdb\x1d\x89\x6f\xe6\x93\x29\x3d\xa5\x7f\x9e\xd1\xd8\xa7\x59\x35\x26\xa2\xfc\x8b\x78\x3a\xcb\x9f\x93\x38\x88\x16\xf5\xef\x81\x28\xfd\x96\xa4\xd9\xa2\x72\x8f\x44\xb9\x13\x1a\x07\x34\x5d\x50\xb2\x23\x7b\xf7\x32\x8c\xdf\x87\xc3\x70\x11\xd0\x87\xa2\xe8\x29\x8d\x28\xb2\xd0\x2b\x12\x93\xd1\x22\xe0\x72\x3c\x0e\xc7\x24\x7d\x45\x49\x36\x4b\x69\x35\xe5\x64\xe1\x67\x69\x72\x9d\xa1\x8e\x76\x15\x93\x48\xbc\x4a\x66\x59\x35\x30\xd9\xff\x20\xf1\x67\x13\x1a\xe7\xd0\x05\x8f\xa9\x9a\x64\x08\xd7\x61\x1c\x24\xd7\x70\xaf\x0b\xb5\x59\xcc\x99\x38\xa8\xd5\xe1\xa9\xc8\x68\xaa\x2a\xfb\x10\xcf\xa2\x88\xc3\xf9\xfe\xe4\xc5\xd9\xd1\xe5\xb3\xef\x8e\x8f\x8f\x4e\x2e\xdf\xf6\xbe\x3b\x3d\xba\x3c\x7b\x7e\x72\x74\xfa\xfc\xcd\xcb\x3e\x74\x61\xd7\x2a\xd5\x3b\x3b\x7c\x7e\x79\xfa\xe2\x5f\x1e\x41\x17\xb6\x5b\x2d\x41\x82\xef\x4e\x4e\xdf\x9c\x5c\x3e\x7b\xf9\xe2\xf5\xb7\x97\x2f\x5e\x9f\x1d\x9d\xfc\xbe\xf7\x12\xba\xb0\xc7\x0a\xa8\x09\xe2\x8c\xa6\x93\x30\x26\x91\x97\x4c\xd9\x6f\xb6\x54\x5b\x03\x00\x60\x10\x32\x1a\x0d\x99\xf5\x3a\x0e\xb3\x03\x4c\x0c\x87\xe0\xdd\xf3\xd8\x6f\x6e\x9c\xc5\x3e\xeb\x9f\x04\x51\x97\x75\xd9\x47\xa8\x27\xb6\x0c\x51\x4d\x90\x74\x84\x1d\xcd\xce\x5b\x17\x0d\xd0\xbf\xda\xd6\xaf\xce\x45\x9d\xb7\x76\x8b\x7f\x33\x24\x9a\x03\x35\x42\x62\xac\x0e\x74\x9e\xcf\xd0\x60\x56\xb6\x6c\x47\xa4\xf0\x22\xb6\x14\x37\xcd\x9f\x5c\xed\xb3\xde\xd4\x75\xf7\xc4\x98\x09\x6a\x40\xb7\xdb\x85\x5a\x3c\x9b\x0c\x68\x5a\x33\xbb\xa7\xf2\x8d\x34\xf6\xf1\x93\x28\xdb\x07\xab\xa3\x56\x3e\xc3\x7e\xdf\xee\xba\x95\x3f\xe6\xf2\xb8\x6f\xd1\x43\x95\xb8\x35\x09\xa3\x51\x90\xdf\x3e\x7c\xc0\x25\x31\xcb\x14\x2a\xf3\x3d\x9d\x67\x9e\xa2\x8b\x30\x18\xb2\x7a\x73\x98\xa4\x47\xc4\x1f\x2b\xd5\x0c\xde\x7b\x3a\x37\xfb\xc7\x48\x21\xc0\x9e\xbf\xa7\xf3\x0b\xe8\x76\x91\x39\xeb\x85\xfe\xda\x65\xf4\x10\x98\xe9\x07\x56\x0d\x06\x59\x16\xe3\xd5\xee\x75\x8d\x8a\x12\x47\xcc\x2a\xb6\xb6\xa0\x45\x47\x4b\xb7\x6b\xe5\x6f\x8c\x63\x64\xd5\x32\x8e\xb7\x06\x23\x88\xdc\xa6\x9f\x44\x49\x9a\x35\x23\x1a\x8f\xf2\x31\xf2\xc3\x43\x07\x23\x88\x62\x1a\xaa\xac\xe7\x27\xb1\x4f\x72\x3d\x06\x97\x22\x3d\x8b\x42\x9f\x7a\x0f\xeb\x16\xaf\xd3\x28\xa3\x4b\x1a\x6f\xef\x7d\xbe\xd6\xdb\x7b\x77\x6f\xbe\x75\x97\xe6\x79\x33\xad\x06\x6c\x76\xea\xcb\x28\x81\x85\x1a\x6e\x08\x9b\x9d\xbb\x23\xfa\x19\x47\xa9\xbd\x77\x17\xe4\x98\x42\xa9\x6a\xe8\x40\x97\x28\x89\xaf\x91\x37\x25\x29\x9f\x42\x64\xed\x41\x12\xcc\x99\x78\xcb\xdf\xa2\xc0\x87\x0f\xe0\xa9\xd9\xe3\xa9\x9a\x7b\x9a\x23\x9a\x1f\x45\x14\xd5\xc7\xb3\xf9\x19\x19\xbd\x26\x13\xea\xd5\x18\x90\x5a\xfd\xbc\x75\x21\x26\x9a\xfa\x81\x85\x6f\x01\xdb\xcc\x6c\x6f\x44\x93\x09\xcd\xd3\xf9\x79\xeb\xc2\xa8\xc4\x94\x99\x51\x09\x7f\xba\x2a\xb5\xcd\x4a\x32\x15\xba\x70\xae\x9a\x6e\x68\x80\x17\x65\x11\x14\x4a\xd1\x1c\x50\x4e\xc2\xd8\xab\x05\x24\x67\x4b\x92\x62\xd1\xd2\x80\xcc\x07\x24\xa3\xd0\x85\x96\x81\xca\x3c\x08\xb3\x69\x21\xed\xa6\x58\xa6\xf0\xdb\x9f\xa5\x59\x92\x9e\xe6\x24\x2f\x42\xe3\x39\xcf\xc3\x20\xa0\xb8\x32\x64\xeb\x5f\x8b\xc2\xf1\x15\x4d\xf3\xa3\x24\x32\x12\xff\x3c\xa3\x33\x06\xa7\x56\x33\x12\x33\x3f\x4d\xa2\xe8\x2c\x29\xa2\xc6\xd3\x9f\x25\x79\x9e\x4c\xc4\xb4\xcc\x69\xbe\x09\x6d\x0b\x8f\x2c\x4f\x26\xdf\xd2\x39\xce\x75\xc2\xc0\x83\xae\xb0\x2d\x0a\xe8\x3e\x8b\xc2\xf8\xfd\x8b\x38\xa7\xe9\x15\x89\xca\x85\xc8\x74\x1a\x85\x3e\x61\xb4\xfd\x96\xce\xa7\x24\x70\x74\xcc\x28\x73\x88\x30\x1d\x65\x92\x34\x1c\x85\xf1\xab\x24\xa0\x8e\xcc\x30\xce\x68\x9a\x57\x64\x5e\xa7\x64\x4a\xd2\x64\x16\x07\xa2\x00\xdf\x4b\x53\xf9\x71\x92\x4e\x5c\x98\xfb\x63\x66\xb0\xe6\xe5\x8c\x51\x75\x4e\x44\xaf\xd0\x90\x68\x95\xe1\x30\x3e\x3f\x67\xe5\x4d\x56\x0e\xa8\xff\x32\xf1\x49\x9e\xa4\x26\x03\xb5\x5b\x68\x29\x1a\x49\x57\x79\xa7\xe5\x48\xdc\x2e\x27\xf2\xde\x14\x53\x27\xec\x37\x8e\xa6\xa9\x24\x32\x1a\x07\xc7\x89\x3f\x33\xd3\x66\xf9\xb0\x58\x39\x1b\xa5\xc5\xa4\x59\x7a\x73\x95\x17\x13\x29\x57\x18\x56\xd7\xc3\x28\x48\x69\x6c\x4a\x3c\x1d\xa6\x34\x1b\x9f\xe6\x24\xcd\xcb\xc9\x47\x71\x60\x36\x4c\xae\x68\xf0\x87\x62\xc2\x1f\x8b\x09\x87\x49\x94\x59\xa0\x48\x40\x06\x91\x63\xa4\xaf\xd3\x30\x77\xe7\x04\x74\xd8\xcb\x73\xc6\x77\x5e\x0b\x1e\x3f\x46\xdd\xff\x01\xbc\xce\xee\x03\xf6\xeb\x91\xf8\xb1\xc7\x7e\xb4\xea\xb6\x08\x88\x7a\x26\x18\x5b\x0f\x93\x09\x0e\xfd\x85\x5d\x8d\x69\xdf\xb7\x2c\xb3\xc0\x2d\xd3\x94\x0e\xc3\x9b\xa2\x40\x4f\x93\x2c\x77\x24\x87\xc6\x02\x8c\x71\x23\xbd\x2e\xac\xc9\x9a\xe6\x4f\xd3\x50\x95\xc8\x65\xaa\xa2\x5c\x9e\x35\xf9\x17\xaf\xd4\x00\xd7\xb0\x75\x8b\xd2\x7c\xa5\xa6\x54\x89\xfc\xfd\xe1\x43\x51\x32\xb2\xc2\xfa\x4b\x56\x29\xa5\x97\xab\x46\x72\x95\x27\xeb\xe8\x04\x56\x98\x5e\x9b\xeb\xc0\xa6\xfa\xee\xd5\x0b\x23\x4f\x9f\xcd\x86\x43\x84\x62\x8d\x05\x66\xbd\x88\xdf\xa6\xc9\x28\xa5\x59\xe6\x50\x20\x37\xc9\x70\x78\x4a\xe3\xfc\x2c\x39\x24\xb9\x3f\xfe\x6e\xea\x54\x32\x61\x4e\x4f\xf3\x64\x3a\xa5\x2e\x0d\x97\xcd\xd2\x34\x19\x91\x9c\x5e\x8e\xc3\xd1\xb8\x38\x8c\x51\x18\xe3\x69\x14\xeb\x8b\xbd\x62\x6f\x9a\x3f\x3d\x43\x87\x0f\x88\xff\x5e\x74\x10\x8f\xb6\x4c\x6d\xce\x93\xaf\xc7\x61\x44\xc1\x0b\x37\x37\x4b\xb3\x1e\xb6\xd7\x9c\xce\xb2\x31\x07\x39\x88\x48\xfc\xfe\x65\x18\x53\xcf\xb6\x43\x70\x35\xe3\x1a\xa5\x12\xc4\x62\x81\x66\x46\x73\x4e\x6e\x4f\xb7\x58\x9e\x52\x73\x32\xb0\xf5\x51\x3e\x9b\x32\x22\x66\xd6\xe0\xcd\x32\x9a\x9e\x62\xaf\xc3\x78\xa4\x89\x7b\xbb\x16\xc6\x63\x9a\x86\xb9\x5e\x9f\x34\x16\x2d\xd6\xea\x07\x6b\xca\x3a\xd3\xfb\x78\x34\x25\x19\x15\x32\xac\xd7\x32\xb2\x83\x62\x0d\xea\x59\x4a\xe2\x6b\xf8\xa9\x75\xd3\x1e\x0e\x51\x2b\x58\x6a\xe0\x6b\xe0\x19\x07\x6b\xb7\x46\x63\x39\x89\x47\xc9\xa1\x34\xe7\xce\x11\x70\xed\xab\x0e\xdd\xde\xd9\xde\xab\x35\xc4\x4f\xdf\x6f\xb5\x5a\x2d\xf5\x73\x87\x3e\x22\x2d\x23\x77\x87\x98\xb9\xdb\x3b\x7b\xbb\x64\x47\xfd\x7c\xb0\xbb\xdb\x7a\x30\x50\x3f\x5b\x7b\x8f\x1e\x3e\x22\xea\x67\xb0\x1d\x3c\xf0\x87\xea\xe7\xee\xee\xee\x83\xdd\x6d\xf5\x93\x0e\x3b\x8f\x3a\x8f\xd4\xcf\x87\x84\x76\xb6\x35\xe4\xa1\x4f\x1f\xed\xe8\xba\x0f\x3a\x8f\x86\x06\x28\x12\x3c\x18\x92\x87\x06\x56\xb4\x43\x3b\x1a\x32\xfb\xf8\xb5\xb5\x0b\x83\x14\xca\xa8\xf5\xca\xb4\x66\x7c\xac\xf2\x5d\xc4\x13\xd6\x72\xbd\x01\x28\xc4\xad\x9b\x56\xab\x01\xad\x9b\xdd\x21\xfb\xfb\xe1\x03\xf6\x37\xc1\xef\x01\x7e\x1f\x0e\x2f\x1a\x10\x0a\x5b\x50\x6b\xd9\x61\x92\x82\x77\x00\x21\x3c\x86\x4e\x7b\xef\x00\xc2\x8d\x0d\xcb\xce\x9f\xe5\x5e\x7a\xee\x85\xb0\x05\xdb\x7b\x75\xf8\xe7\xb0\x07\x1f\xa0\x75\xd1\x00\x91\x58\x48\x0b\xd9\x2f\x7b\xbb\xa1\xa2\xad\x9d\x52\x53\xac\x17\x0f\x61\x03\x42\xb8\x0f\xed\xd6\x81\x8d\x42\x03\xd8\x7f\x16\x60\x45\x32\x51\x60\xd4\x80\x81\x09\x4f\xac\x29\x50\xae\x6b\x5f\xd5\x60\x03\xc6\xf4\xc6\x4b\xeb\xe2\xcb\x48\x7e\x19\xd4\xdd\x60\x59\x9e\x6f\x01\x84\x2e\xf8\xcd\x3c\x39\xcd\xd3\x30\x1e\xf1\x7d\x4d\x85\x3c\x97\x0c\x5f\xae\x98\x1e\x43\x07\x9e\x42\xad\xc5\x9a\xf5\x61\x1f\x7c\xb3\x09\x59\x58\xac\x60\x6e\xeb\x9e\x29\x8c\x97\xe5\x51\xb7\x96\x47\x66\xd9\xab\x65\x1c\x94\xcc\x72\xd4\xf0\x0d\x07\x2f\xf1\x94\x06\x1f\x21\x51\xa0\x3c\x50\xbb\x65\xa6\xc0\x92\xd0\x05\x9c\x30\x5f\xc4\xb9\xc7\x21\x9d\x87\x17\xcd\x6c\x36\xc8\x04\x79\xea\x0d\xb0\x48\x94\xcc\x72\x3e\x18\xe7\x2a\x89\x7d\x78\x65\x78\xf2\x04\x57\xe2\x5f\x23\xa7\x36\x2a\x4a\x3c\x74\x17\xe0\xf9\x3c\x47\x65\xd8\x5c\x28\x48\x9e\xcc\xf2\x12\xbd\xe5\x06\x89\xda\x7a\xe2\xbd\xd9\x2f\x11\x4a\xa8\x60\x3a\xa1\xfb\xa0\xce\x8a\x1a\xa2\x8a\x5c\x8b\xa8\x73\x3a\x2c\x4c\xd3\x09\x5b\x2a\xee\x43\xed\x86\x7d\x17\xa5\xe5\x8a\x6d\x1f\xce\x1f\xb6\x1a\xd0\xd9\x11\x7b\x56\xc6\x0a\xc2\x02\x23\x97\x48\xf3\x88\x41\x1a\x44\x89\xff\x5e\x40\xba\x0a\xb3\x19\x89\x9e\xd1\xc8\x6e\x77\x9a\x4c\xdf\xc4\xa5\x54\x3d\x55\xee\x43\xbb\xd5\x6a\xa9\x54\x4a\xd9\x62\x24\xb3\x0a\x07\x74\x30\x1b\xd9\x58\xe0\x26\x20\xb7\x9a\xed\xa2\x61\xc6\xcc\xc8\xd3\x3c\x08\x63\x2b\x63\x96\xd1\xe3\x28\xb9\x3e\x4c\xe2\x3c\x2d\x52\x86\x0c\xd8\xcc\xf6\x7d\x18\xe4\xe3\x7d\x78\x68\x4d\x10\xc6\x56\xa0\x99\x3c\x64\xa6\xb9\x5a\x64\x50\xe2\x8f\xbd\x8a\xdd\xb8\x06\x38\xb7\xe1\xec\x4d\xb2\xaa\x2d\xb2\x03\xab\x6c\xb3\x6a\x3f\xae\x50\xe7\xd6\x3d\x9d\x4a\x9c\x2b\xa7\x52\x3e\xef\xd3\x9b\x9c\xa4\x94\xf0\xe2\x5e\x61\xbe\xd4\xd0\x46\x34\x7f\x83\xe8\x58\x10\xdf\xd3\x79\x03\xe4\x01\xba\x32\x54\xee\xb1\x74\x08\xe3\x32\xc6\x75\xdb\x5c\x49\x93\x6b\xb4\xb4\x8e\xd2\x34\x49\xbd\xda\xeb\x44\x2c\xfd\xf9\x21\x2e\x03\xb2\xce\x94\x18\xfb\xb2\x01\xb5\xf5\x5a\xd9\x24\xe2\x1b\xbc\xe6\x1e\x8c\xde\x86\xb4\x36\xe8\x4b\x9b\xd9\xa5\x3a\x0e\x91\x65\x65\x24\x91\x9d\x54\xc9\x7e\x75\x54\xc9\xae\xc3\xdc\x1f\x97\xb6\x80\x7d\x92\x51\xa8\x69\x29\xac\xed\x5b\x5a\x8c\xe1\x87\x08\xc3\x63\x6d\xbc\xba\x36\x6c\xd1\xaf\x28\x63\xa6\x5f\xed\x94\xe6\x39\xb3\x02\xf3\x31\x35\xc4\x9b\xf7\x1b\x22\x66\xbf\xe7\x63\xc2\x5d\x61\xf8\x9e\x3b\x24\x43\xdc\x32\x87\xda\x41\x09\x2e\x83\xb9\xd1\x85\x75\x6f\x1d\x36\x8c\xcd\x90\x0d\x58\xaf\x43\x98\x41\x9c\xe4\x40\xa2\x28\xb9\xa6\x41\x73\xbd\x5c\xdb\x4f\xe2\x2c\x89\x68\xf3\x9a\xa4\xb1\x37\xc9\x46\xf5\x72\x11\x31\xa2\xc6\x6a\x40\x7e\x6e\x4b\x94\x70\xb3\x93\x35\xa0\xce\x2a\xdc\x98\x17\xb3\xf0\x93\xea\x0a\x92\x90\x64\x92\xcc\xd8\x5a\xe6\x2c\x0d\x27\xc6\x8a\x4a\xc3\xd8\x14\xce\x28\x95\x10\x62\x4a\x83\xec\x84\x2f\xd8\xf1\x90\x4a\xef\x84\x6d\xda\xe0\xf5\x6a\xb9\xf8\x31\x9a\xcd\xd3\x70\x82\xdb\x01\x9e\x59\x77\x51\x3d\xb9\x13\xf7\x8a\xe4\xe3\xe6\x84\xdc\x78\x46\xaa\x8d\x41\x63\x31\x02\x72\xfb\xae\x00\xc8\xd1\x95\x6a\x40\x6c\x20\x4c\x8a\x54\xd1\x1e\x0a\x5b\x1d\x5e\xab\x61\x6f\xc0\x55\xc0\xbf\x2d\xa5\x96\x53\x0c\x6a\x4e\xc8\xcd\x4b\xb1\x87\x5d\x35\x8e\x7c\xf3\x48\x1c\x37\x37\xb3\x79\xec\xf3\xd5\x55\x2f\xa5\xc4\xab\x2f\xe2\xd3\x41\x4a\xc9\xfb\xe2\x2a\x4e\xce\x14\x46\x6b\x65\x5e\xb6\xb2\x17\xaa\x0b\xc3\x26\x28\xe8\x0b\xb9\x46\x3c\xd4\x25\x98\xdd\xc5\x39\xfe\xa0\x0a\xd1\x22\x64\xb4\x2a\x5c\x90\xc5\xf6\x55\xd3\x8f\x48\x96\xb1\xf5\x76\x33\x4f\x46\xa3\x88\x7a\xeb\x68\xca\x6c\xf2\xea\x9b\x19\xab\xbf\xc9\xb4\x7c\xca\x28\xbe\x2e\x94\x2e\x3f\xe7\x53\xc9\xb5\x02\x42\x77\x6f\x61\x40\x52\x1b\xf6\x80\xa4\x45\xa8\xce\x6e\x9a\x96\x46\x05\x05\x0b\xab\x6c\xe7\xf0\xba\xe7\x9e\x94\x66\x4c\x54\xed\x21\x70\xce\xf7\x15\xa3\x65\xb2\x86\xb9\x83\x5c\x69\x03\x94\x40\x58\xad\xd1\x98\x59\x62\x81\xd5\x68\x25\x99\x6b\x16\x99\x07\xc8\x62\x0d\x90\x20\xcc\xfd\xb9\x88\x92\xd4\x6e\x55\xee\x70\x7b\xc6\x01\x5f\xa1\x71\xa8\x3a\xf4\x86\xc5\x3b\xe6\x19\xcd\x15\xf4\x32\x1d\xe5\x07\x4f\xaa\xef\xd2\xb5\xcd\x24\x36\xf9\xe5\xb6\xe1\x3e\xcf\xaf\x2f\x1e\xf0\x05\xa4\xa8\x1e\xf6\x32\x9a\x29\x9d\x24\x57\xcb\xd0\x54\x73\x9a\x83\x4e\x96\xa2\x60\x38\x29\x92\x55\xd6\x58\x89\xf8\x7a\xb3\xd1\xa6\xc0\x20\x14\x7b\xe3\x56\x2f\x19\xf6\x12\x93\x24\xc6\x9f\xca\x98\x6d\x40\x0d\xcd\xd9\x9a\x69\x8d\xd3\xab\xe2\x99\x38\xd6\x51\x3b\xef\xc5\x51\x56\xb9\x5e\xc9\x19\xa7\x79\xd8\x6a\x1e\x9d\x1e\x32\xf3\xeb\xfc\x85\x35\xb2\x6b\x56\xed\x32\xf1\x49\x10\x78\x02\x37\x93\x28\xd8\xd4\x38\xb9\xe6\xa3\xeb\x15\xb3\x9c\xa2\x8e\x67\x35\x73\x4e\x07\x5d\xbe\xb4\x64\x61\xf9\x05\x70\x74\x12\xe6\x9e\xa2\xd0\x8f\x98\xc8\xea\xec\xe3\x37\x75\x70\x7e\x5b\xa9\x08\x06\xd1\x6c\xe1\x26\x9d\xbd\xb2\x60\xa5\x8b\x0b\x0b\x36\xa6\xcf\x8a\x50\x96\x0c\x29\x83\xb3\x60\x44\x05\xa5\xf8\x8c\x8e\x3f\xe6\x0d\x9e\x38\x37\xe8\xf3\xd9\xc6\xfd\xcd\x9d\xc6\x5d\x0a\x9d\x7b\xe8\x17\x48\xf6\x8a\xa3\xac\x65\xa7\x30\xca\x82\x68\x1f\x31\xc8\x61\x1c\xe6\xdf\x44\xc9\xa0\x42\xbb\x30\xf5\x7a\x89\xde\x43\xa6\x7e\x65\xa9\x08\xdf\x4c\xb4\x46\x9d\xad\xf6\xcd\xe3\x8f\xb2\x98\x57\xe6\x32\x86\x31\x33\x19\x8f\x18\x3a\xae\x01\x35\x3f\x99\xce\x0b\x2c\x42\xe3\xbc\x28\xf7\x97\xc5\x83\xb8\x22\x0b\x70\x36\x76\x0d\xaf\xe1\xf0\xd7\x64\x8d\xc9\xf3\x1c\x6c\x87\xb3\x5b\x83\x93\xa5\xbc\x53\xaf\x09\x2e\x29\x35\x25\x59\x4e\x05\x88\xef\x53\x32\x9d\x52\x5b\x20\x24\xf6\x52\xae\xcc\xd6\xcd\xba\x66\xf3\xdc\xd3\xd5\x24\x8f\x21\x42\x58\xa9\xd6\x70\x35\x5c\x49\xd3\xe5\x75\x94\x4c\x09\xcf\xae\x66\x98\x1d\x87\x29\x1d\x26\x37\xd6\x76\x6e\x09\x32\x8e\x40\x90\x5c\xc7\x8b\x87\x4c\x36\x81\x19\xcd\xc1\x2c\xcf\xd9\x7a\xbb\x0b\x1d\x97\x7d\x6f\x92\x28\x0d\x47\xe3\xfc\x30\x0a\xfd\xf7\x05\x3a\x5d\x16\xe8\xb2\x70\xc0\xca\x4c\x70\x5b\xf6\x5f\x59\xd4\x4d\x71\x27\x61\x42\xe3\xd9\xf2\x8e\x7e\x19\xfc\x6f\xcb\x3b\x27\xf6\x78\xbd\x0c\xe3\xd9\x92\xd1\x22\xb3\x1b\x9f\xe1\xf2\x51\x83\xd5\x85\xf6\xb2\xd1\x62\x0a\xf2\x8c\xde\xe4\x6c\xed\xf3\x1d\x33\xde\xf1\x50\x5b\xcc\x88\x9f\x7b\xe0\x8a\x73\x11\xd3\x4a\x4b\xe7\x22\x4d\x8b\xf7\x74\xee\xe0\xdb\xa2\x9e\x51\x2e\x3c\xc4\xcf\xc3\x2b\x2a\xbc\x78\xe0\x1e\xd7\x8d\xab\x2b\x1d\x6c\xfc\x3d\x9d\xf7\x93\xeb\x98\x35\x23\x3a\xd1\xc0\xa3\x73\x43\x6e\x4b\x38\x4e\x53\x9a\x2d\x33\x82\x3e\x37\x92\x6f\x59\x9b\x77\xc2\x72\x36\x5d\x82\xe2\xbd\x6b\x92\xbd\x4a\xe2\x00\x0f\x93\xbf\xa5\xf3\x37\x71\xc4\xfd\x61\x58\x59\xe7\xf4\xcd\x37\x33\x0b\x93\xe6\xed\x02\x84\x0c\x1d\xb9\x7c\x6c\xef\x32\x1e\x36\xe0\x65\x03\x52\x41\x44\x50\x5b\x05\x7c\x0d\xaa\xce\xac\x97\xb6\xe9\x6b\x57\x79\x34\x21\x6b\xc2\x24\xf2\x8b\x2e\xf4\xcd\x62\x49\x14\x0b\xcf\x5d\xb8\xbe\x52\x83\xb3\x69\x40\x70\xe6\x58\xde\x22\x2f\xfa\xe9\x4d\xd2\x38\x58\xa9\x3d\x1a\x07\xab\x34\x86\xb9\x49\xec\xd5\x84\x59\x59\x0d\x9b\x77\xc0\xb8\x98\x20\x5d\xf6\x3e\xb2\x19\xcd\x20\x01\xc9\x49\x89\x45\xd0\xd5\x4c\xf8\x57\x70\x6f\x2d\x2c\xd7\xc4\x91\x6b\x00\x7e\xa7\x71\xb0\x82\x8d\x97\xd1\x34\x3f\x49\xae\x2d\xdd\x97\x26\xd7\xe6\xc6\xb5\xd8\x64\x4f\x85\xdb\x3b\xbf\x5a\x63\x6f\xa9\x23\x00\xa5\x49\x7c\xbc\xb7\x2a\x28\xe0\xd5\x82\xf0\xaa\x56\x76\x38\x48\xf9\xe1\x0c\x09\x63\x9a\x32\x23\x97\xc6\xc1\xe1\x38\x8c\x02\x6c\xdd\xe1\xb8\xc4\xcf\xef\x74\xa6\x30\x89\xd2\xe4\xba\xaa\x73\xc9\x94\xda\xfb\xf2\xdc\xd1\xb2\x01\x43\xd3\xec\xaf\xb6\x63\x8d\xcd\x03\x75\x50\x19\x84\x57\xb6\xd7\x0e\x77\xed\xd4\x2e\x9c\x46\xba\x36\x8e\xee\x19\xa9\x0b\xf7\xfa\x65\x2f\xe4\x7d\xe7\x0c\x88\x84\x2d\xd7\x14\x0e\x52\x0a\x03\x43\x6e\x21\xf3\x0a\xcd\xe4\x3a\xa6\x69\x5f\x8e\x89\x38\x6b\xf8\x7d\x48\xaf\x4d\x67\x2b\x7d\xc1\xa1\xb2\xaa\x51\x1c\x3d\x57\xbb\x76\xd5\x65\xfe\xa9\x07\xa5\xbd\x88\x12\x84\x6a\x7e\xa9\xd8\xc2\xc0\x55\xb4\x5c\xd0\xac\x52\x96\x9f\x80\xae\x5a\x70\x13\x0f\x5a\x37\x6b\xf2\x28\x02\x7f\xd6\x0f\x3e\x72\x2f\xad\xd4\x64\x46\xf3\x5e\x9e\xa7\xe1\x60\x96\x53\xaf\x96\x13\xa6\x21\xe8\x4d\xad\x61\xfb\xb3\xc9\x5d\xe1\x23\x45\xb4\x55\xe9\x55\xa8\xe9\xee\xa2\x2c\xe4\x24\x8a\x29\x8e\x2e\x90\xae\xd6\xf4\xc6\xf5\x47\xa0\xaa\x2b\xbb\xb1\xe5\xe7\x4b\x9b\x4c\xe1\x2f\xec\x6a\x25\xe2\xba\x81\xba\xcb\x15\x4e\x69\xa2\x3b\xe0\x5e\xae\x5c\x81\xbb\x2c\xb7\x1a\xa9\xcb\x60\x2d\x3f\x3f\x43\x6b\xde\x01\x57\x4b\xd9\x3a\xb1\x64\x2b\x81\xd5\x10\x34\x61\xb9\x14\x75\xd1\xab\x4f\xf9\x08\x36\x49\x9e\x13\x7f\x7c\x96\xf4\x93\x89\x32\x3b\x1b\x76\x65\x13\xe0\x18\x27\xc9\x8f\xe9\x6e\xa1\xa6\xbb\xc7\xbc\xd0\x8a\x9d\x2e\x40\x34\xeb\x48\x4b\x64\x01\x7e\xb2\x48\xcd\x55\x6f\x11\x76\x9b\x8b\x6b\xda\x9a\x84\xcc\xf2\x44\xdc\x83\xaf\x35\xa0\x96\x0c\x87\x2b\xd7\x22\xd3\x30\x27\x51\xf8\x17\x7a\x87\x8a\xd9\x94\x46\x91\x3f\xa6\xb8\x22\xac\xe1\xc1\xaa\xbb\x5a\x4e\x06\x2f\x98\x86\x2b\xb8\xd7\xaa\x7c\x12\x04\x68\xcd\x33\x12\xd0\x98\xa6\x9e\x63\xf3\xd6\x9c\x35\xf9\xf6\x7b\xe5\x1e\x26\x4e\xdb\xb7\x85\xdd\x96\x65\x2d\x96\xf6\x16\x2b\x1a\x74\x6c\xa7\x55\xb7\x57\x64\xc3\x12\x57\x49\x84\xec\xcb\x1b\xca\x4a\x64\x93\xf5\x1d\xb8\xbe\x50\xb3\xc8\x57\x46\x36\x6a\xff\xaa\xba\xdc\x36\x95\x3e\xb0\xe5\xab\xb6\xcd\x52\x5a\x71\x9b\xc9\x85\x4d\xd9\x65\x79\x29\x75\x0a\x10\x6c\x5d\x43\xd2\xd3\xf0\x2f\x14\x4f\x10\x97\xcf\x90\x78\x8c\xb7\x50\x43\x94\x1b\x77\xb4\x20\x00\x18\x1e\x6a\xea\xd4\xb8\xe4\xa7\x86\x39\xca\xbc\xf6\xca\x46\x9b\x30\xb5\x4a\x0d\xd3\xf2\x14\xeb\xeb\xfb\xaf\x72\x58\xcc\x1b\xb1\x4d\xe3\x57\x51\xaf\x2e\xd0\x5b\x06\x54\x5c\x7c\xe0\xe5\x88\xf0\x2f\xd4\x1f\x93\x78\x44\x83\xc5\xd2\x20\xd6\x3b\x26\x91\xd4\x19\xe6\x6d\x55\x2b\x13\x81\xa3\x6b\x06\x17\x1d\xd3\x57\xaf\x9b\xf2\xab\xc7\x0d\x70\xd7\x7c\xdf\xa8\xb2\x22\x1a\xa5\xc6\x2b\x9c\xe5\x59\x9b\xfa\x96\x73\x53\x7e\x2d\xf9\xe7\x3b\x9c\xe6\x59\xd5\xf2\x5d\xe6\x66\x31\xc9\x44\x1f\xfd\x02\x1a\xe5\x29\x79\x31\xba\x25\x8f\xee\x55\x97\x8a\x97\x56\x6f\xd5\x7d\x0f\x09\x6e\xd9\x92\x71\x31\x02\x31\xbd\xd6\x96\x4d\xc3\xda\x39\xbb\xc9\xcb\x58\x28\xdd\x2b\xb7\x30\x58\xc2\x41\x55\x21\xe5\x8c\x56\x91\xcf\x5b\x76\x32\x1c\xc3\x8d\x9b\x8b\x45\x0e\x96\x4b\x46\xf7\xa6\xa1\x3a\x3a\xaa\x1f\xd8\x00\x4b\x36\x66\x69\xf2\xf8\xac\xcd\x2d\xf1\x49\x11\x7a\x45\x1e\xcd\x98\x67\xe0\x62\x9d\x2e\x8e\x84\x2a\xfd\xdf\xd0\x85\x8b\x66\x19\x19\xe1\x4e\xd2\x1f\x93\x19\x04\x61\x80\x2e\x56\x53\x82\x5e\x5b\x14\xfe\x84\x40\xfe\xa4\x2e\x2e\x43\x18\xc3\x9f\x2a\x96\xd8\x5e\xfd\x4f\xcd\x1f\x62\xc3\xa7\x4b\x02\xdf\xe8\x42\xed\xcc\x05\x2c\x4e\xae\x41\x79\xbe\xe6\x09\xfc\x29\x4f\x67\xf4\x4f\x30\x98\xe5\x80\xdc\x18\xc6\x23\xee\xeb\x86\xa6\x50\xf3\x5d\x06\xdb\xcd\x16\x54\xb4\x10\xe6\x70\x1d\x46\x91\x04\x88\xf0\xd0\x18\xf9\x53\xd3\xa8\x61\x7b\x88\xf1\xea\x06\x7b\xa9\xc3\x52\x75\x17\x49\xef\x94\x0f\x8b\x87\x84\x38\x04\x16\x87\xde\xaa\xad\xa9\xc2\xce\x7f\x69\xbf\xdc\xe1\xa0\xc0\xd9\xc2\x9c\xbd\x46\x34\xd7\x42\x5a\x47\xef\xe8\x88\x4c\x33\xbc\xce\xa2\x2a\x34\xc3\xec\x50\xa6\x37\x20\xcc\x4e\x98\xd6\x66\x5d\xe0\x5c\x60\xd4\xe9\x42\x6d\x90\x24\x11\x25\x71\x0d\x9e\xc2\x3d\x9d\xb3\x6f\x40\x63\xd5\xb0\x28\xc2\xa9\xd9\x07\xa6\xf7\x04\x78\xa7\x23\x44\x49\x56\x6f\xcb\x42\xc9\x96\xb8\xb8\x9d\x6f\xe9\x7e\x6e\x52\x31\x1e\xaa\x15\x76\xa8\xa2\x84\x04\xbd\x20\x28\xf8\x55\x12\x96\xd2\xc0\x60\x50\x78\xe9\xc6\xdc\xa3\x4a\x6d\x57\xbb\x05\x01\x55\x3a\x3b\x75\x6f\xbd\xb9\xb5\x0e\x1b\x80\x00\x61\x03\x6a\x5b\x35\xf9\xab\x7c\xb4\x63\x88\x96\x08\xfd\xc4\xc8\x24\xb1\x72\xb9\x96\x8a\xb6\xbc\xf3\x5a\x73\x0b\x81\x66\x1a\xbe\xdd\xda\x85\xd1\x9b\x05\x67\x4a\x92\x7b\x29\xdf\x25\x3a\x24\x31\x93\x56\x46\x24\x20\x32\xbe\x0c\x13\x98\x64\x96\x03\x61\x36\xdb\x24\x89\x7f\x77\x0a\x49\x0a\x27\x1c\x95\xdf\x9d\x02\x8d\xaf\xc2\x34\x89\xad\x3d\x24\x70\x3a\x46\x56\xf9\x9f\xb8\xe6\xfc\x6a\xc7\x13\x97\x01\x85\x0a\x9c\xcd\x7a\x68\xae\x29\x14\xd6\x9b\x7c\xcd\x73\x1d\x06\x74\x93\xd5\xfb\xf1\x1a\x7d\xb3\x95\x2f\xa8\x69\x44\x60\x16\xdc\x87\x0e\x6c\xc0\xfa\xf4\xe6\xe0\x76\x1d\x36\x2c\xa6\xf4\x24\x38\x7e\xff\x72\x45\x80\x12\x58\xbd\x0a\x1a\xea\xe1\x27\x10\x84\x57\x3f\x8e\x69\x38\x1a\xe7\x6e\x68\x3c\x4f\x83\xab\x74\xa1\x90\x12\x51\x79\xb8\x8e\xb7\x57\x6d\x85\x62\xed\x48\xe2\x59\x02\xea\x84\xed\x8e\x30\x4c\x25\x9c\x8c\xc6\xc1\x33\x3c\x7a\x2b\x9c\x2f\x30\xb8\xfc\x4c\xae\x01\xd3\xc4\xf0\x89\x92\x07\x75\x30\xa2\xb9\xae\xa9\xf3\xa7\x09\x1b\x6a\x11\x35\x85\x29\xa8\x13\x72\xfd\x6c\x9e\xd3\xc3\x24\x49\x83\xcc\xa3\x57\x1c\xb9\x82\x55\xc3\x43\x7a\x68\xea\xc8\x14\xbc\x24\x2e\xcb\x67\x05\xef\x8c\x7b\xd3\x24\xab\x5b\x63\x50\x3c\x74\x62\xdd\xe3\xe7\x3f\x46\x5f\x0c\x28\xd2\xa9\x91\x5e\x35\x93\x2b\x9a\xa6\x61\x40\xcf\x98\x7a\xfb\xf0\x01\xe8\x15\x6a\xba\xa2\x22\xe3\xee\x7a\xfa\x3c\xda\xf6\xd5\x43\x02\x28\x6a\xf3\x36\x0f\x4a\x25\x0a\x1e\x80\x05\xb0\xb3\xe9\x42\xa0\x72\x08\x57\x02\x78\x3d\xa6\x34\x72\x80\x2b\x54\xb8\x35\x14\x8a\xc5\x1a\xaf\x92\x2b\x5a\xc9\x18\xd0\x95\x68\x15\x58\xe4\x57\xc5\x02\x02\xd7\x0d\x9b\x72\x8b\x18\xa3\x40\x07\x1a\xfb\x49\x40\xd1\x04\x6e\x80\x3f\x2e\x1d\x39\xf2\x55\x8e\xb8\x81\xed\x3a\xe0\xf6\x79\x68\x8a\xce\xee\x6e\xbd\x34\x10\x42\xa7\xa2\x4d\x8d\xc7\x16\x45\x8f\x65\x01\xe0\x09\xb4\x3b\x0f\xca\xd5\x19\x68\x96\x63\xd7\xd1\xd0\xfc\xb1\xd3\xf5\xa8\x30\x69\x14\x11\x6d\xed\x38\x9a\x5a\x15\xd3\xc7\x88\xa9\xe3\x04\xbf\x02\x2b\x28\x39\x2c\x3b\xb0\xb3\x28\xe1\xc6\x4f\x91\x83\x65\x97\x45\xc4\xc0\xfb\xe6\xb0\x05\x1f\x38\xac\x27\xa0\x62\xa1\x54\x15\x7e\x28\x0b\x7f\x0d\xad\x9b\xed\xe3\x62\xf1\x62\xb4\x19\x87\x10\x95\xf9\xac\xc0\x42\xc8\x41\x3a\x30\x40\x91\x78\x82\x83\xbf\xee\xc2\xb6\xdd\xf6\x34\xc9\x9a\x37\xb0\x59\xd6\x09\x2c\x63\xee\xca\xc0\x50\x55\x24\x27\xd0\x2d\xc7\x0d\x33\x5d\xd6\x3a\x3b\xb5\xf2\xe0\x1a\x2e\x1a\xad\x32\xfd\x11\x2c\x33\xb3\xdb\x85\xaa\xca\x34\xb2\x5c\x3c\xaa\xeb\x6f\xaf\x50\xbf\xb3\xa0\xfe\xee\x0a\xf5\xb7\xab\xf8\xbb\x5c\xb5\xba\xa1\x56\xad\x2c\x76\x98\xf1\xd3\x39\x33\xdb\xf8\xe8\x6c\x40\xad\x21\x7f\xe1\x2d\x9c\x8b\x1f\xd2\x42\x3d\x1c\x7e\x74\x23\xc4\x65\xf9\xc1\x42\x75\x76\x5b\xe6\x1c\x1d\x8f\xe2\x0b\x72\xce\x72\x06\x50\x93\x42\xe7\xa3\xc6\x5f\x55\xdf\xf9\xa8\xe1\x57\xd5\xf7\x3e\x6a\xf4\x55\xf5\xed\xaa\xb1\x59\x28\x2f\xb5\x12\xc0\x0d\x01\xd2\x91\x51\x3b\x70\x15\xb7\x10\x84\xa7\xb0\x03\xfb\x2e\x2a\x57\x55\xc7\x81\xbb\x53\xe9\x9b\xd5\x51\x63\xc5\xa7\x6c\x19\xfd\xe1\x43\x05\x4e\x5f\x5f\x17\xaf\x39\xac\xc0\xb8\x3a\x20\x49\x91\x71\xef\xce\x9f\x58\x63\x63\xc3\x51\xba\x98\xb8\xea\x90\xaa\x21\xe4\x74\x31\x25\xfa\xc0\x92\xe8\x57\x1f\xd1\x75\x19\x9e\xe5\xd3\x3b\xbe\x62\x77\x1e\x3b\x07\xd6\x93\x5c\xf7\x35\x6c\xd7\x15\xeb\xa9\xb4\x9f\xb6\x61\x5f\xfc\xaa\xc3\x26\x6c\x3b\xe4\xee\xf3\x70\x58\x15\xf7\xba\xf1\xab\x4d\x6a\xb0\x8f\x74\x5f\x99\xf0\xc6\xc4\x77\x6e\xc4\x8b\xb3\x6c\x3b\xd1\xd1\x8a\x5c\xec\xd0\xa2\x4c\xd3\x77\x7c\xc5\x41\x79\xc5\xf8\x88\x5f\xd4\x6f\x0e\xd3\x64\xc2\x56\xcc\x87\x49\x40\x85\x2b\x37\xcf\xe1\x3b\xae\x15\xd7\xff\xad\x45\x58\xc5\xf2\x2d\x1b\x87\xc3\xbc\x01\x13\x8a\x06\x6c\x9e\x46\x18\x06\xfd\xcb\x2e\x82\x94\x3e\xa5\x57\xd2\xb5\xf3\x1e\xf7\x3d\x77\x1a\x6e\x4f\x61\x43\x15\x74\x16\xd8\x67\x80\xae\xc7\xa1\x3f\x5e\x08\x87\xc3\x52\x45\x37\xa1\x5d\x59\x6c\xbf\xe0\x09\x2f\x3f\x4a\x44\xb5\xcb\xeb\xab\xd3\x17\x47\x55\x37\x04\x55\x47\xcd\xd9\x0d\x9e\x42\x4b\x49\x0e\x26\xed\xc0\x53\x68\xab\xa4\x72\xab\xe5\xeb\x81\x1f\xb1\x48\xac\x9a\xc4\x16\x82\xeb\xbf\x79\x85\x9a\x88\x1f\x89\x2c\x19\xca\x80\xe6\x24\x8c\xe0\x31\xb4\x2a\x86\x71\x6f\xa7\x62\xf8\xf6\x76\x3f\xc7\xb2\xd5\x40\x05\xcb\xf4\x69\x94\x93\x3f\xc2\x93\x2f\x82\x8f\x11\x3e\x92\x49\x10\x6f\x16\xbf\x7e\x4b\xe7\x72\x86\x36\xb7\x9a\x51\xbd\xd0\xab\x26\xfb\xc6\x8b\x3c\xb4\x8b\x30\xe1\xe3\x45\xd8\x37\x5e\xa4\xbd\x57\x00\x93\xe0\xe6\x2d\xb6\xf8\x81\x03\xfd\x80\x15\x0f\x5c\x6b\x86\x4e\xc5\x9a\x81\x41\xf9\xba\x5b\xa8\x57\x58\x00\xea\xd5\xab\x11\x7f\xcc\x05\xa8\x6b\xe2\xa7\x81\xa8\xd1\xf0\xb6\x3b\x4c\x57\xb3\xa2\x8f\x1f\x43\xa7\x5e\x57\x53\x67\x69\xf3\xd0\x4c\x56\x7b\xe1\x34\x5a\xe0\xe2\xef\x5e\x6f\x9b\x57\x32\x16\x4e\x01\xf6\x06\x57\x41\x43\x97\x36\xa4\x57\xa0\x6c\x51\x4b\x76\xb5\x44\x16\x27\x66\x77\xcb\x06\x35\x8c\x40\xb6\x76\x19\x87\xc5\x60\x8e\x91\x05\x2b\x89\xc5\x32\x40\x9d\xe7\x72\x84\x26\xc9\x15\xad\x35\xd4\x36\x4e\x71\xe3\x04\xeb\xc8\xa8\x75\xa5\xf8\xae\x15\x30\x6d\x07\xec\xd9\xb4\x30\x3e\xab\x74\x7d\xb5\x4e\x29\x44\x86\xc3\xbb\xf6\x6e\x69\x55\xec\xc4\x6c\xea\xa8\xb2\x6c\x58\xc0\x38\xad\xb0\x87\x69\x51\xcd\x5b\xed\x90\x8c\x9c\xce\xb5\xdb\x67\xe5\x72\x45\x50\x39\xa0\x56\xe9\x0f\x1f\xa0\xb0\xc5\xe0\xcc\x36\xd6\x91\x1f\x25\x52\x9f\x9b\x06\x77\x15\x74\xd6\x43\x79\x41\x3e\x89\xbf\x67\x2d\x7c\x3c\x82\x79\x32\xf3\xc7\xd2\x11\xfe\xcb\x61\x79\xc6\x9a\xe1\x81\x14\x3e\x0d\x55\x21\x0f\x5f\x18\x53\xb9\x1f\xbc\x3a\xa2\xee\x33\x8d\x80\x66\x79\x9a\xcc\xab\xcf\x84\x8c\x78\x90\xae\xa8\x7d\x15\x59\x97\x78\xf9\x47\xc6\xe4\x51\xc9\x63\x15\x6c\xd1\x3e\x76\xbf\x2d\x40\x2d\x9d\xb0\xc8\x12\xea\x8e\xb3\xf4\x4b\xfe\xfa\x6b\xdb\x0b\x90\xbb\xe8\xbc\x4e\x02\x5a\x3a\xfe\x2d\x17\x11\x57\x3c\x2b\x3d\x79\xaa\xaf\xf1\xcb\xe8\x1d\x1a\x49\xe1\x93\x41\xe3\xc0\x3a\xe3\x34\xbd\x39\x4a\x18\x29\x37\x0f\xbc\x1b\x20\x22\x60\x98\x90\x16\xa3\x51\xbe\x51\xb0\x2a\x46\xca\xbf\xd3\x44\x09\x7d\xa4\x64\x38\x44\xac\x8c\x0e\x53\x5d\x06\xa1\xe4\x2b\x05\x65\x57\x51\xfe\x6d\x7e\x92\x5c\x7b\x61\xf9\x68\xb9\x2a\x3e\x81\xba\x41\xed\x64\x41\xed\x89\x6f\xc4\xfd\x2d\xd1\xd1\x8e\x09\xdc\x3e\x28\x52\x59\xdc\x2f\x66\x3f\xe6\xc2\x45\x63\xbe\x84\xb6\xdc\x3f\xc4\xc2\x29\xcc\xf8\x15\xca\xc0\x3c\xf1\xc3\xbb\x0c\x45\xda\x52\x2b\x12\xb6\x91\xaa\xc2\x8b\x54\x04\x95\xd4\xc1\x5c\xda\xc5\x6b\x44\x18\x9f\x65\x73\xd3\x9e\x69\x78\x0e\x06\x5c\xb9\x87\x7b\x81\xae\x11\xc2\x7c\xb3\xa6\xb9\x3f\xae\x61\xcb\xdd\x19\x4d\x72\x2b\x72\x64\x09\x63\x19\xfd\x45\x43\x30\x8d\x49\x7e\xbd\x44\xe7\x59\x21\x82\x54\xbc\x64\x56\x6a\xb3\x10\x49\x19\x36\x85\x07\x93\x11\x6d\x59\x63\x86\x70\xbb\x8e\xc0\x3b\x77\x08\xd3\xa9\x7c\x6c\x1a\xa0\xc7\x74\xd1\x59\xbe\x01\x2f\x9b\x62\x50\xbd\x34\xb9\x6e\x80\x74\xf7\xb9\x0b\x64\x1d\x14\x54\x05\x99\x2e\x8d\x9c\x1e\x59\xa4\xdc\x82\x91\x2d\xf2\xc4\x8a\xe3\xb7\xd2\x38\xda\xdc\x62\x7f\x2b\x13\xa4\x3c\xd2\xaa\x83\x0d\xe5\x08\x65\xb0\x1c\x77\x4c\x40\x0f\x95\x02\x3d\x4c\x6f\x93\x8a\x52\x9c\x29\xca\x6e\x29\xca\xa9\x4b\x77\xac\x3a\x30\x0a\x96\xed\xf3\xbe\x1b\xfe\x78\x61\x36\x6d\x40\x36\x9b\xe2\x81\x2a\xa7\xde\x91\x79\x61\x16\xef\x5f\xb2\x5a\x8f\xab\x06\x8d\xd3\xd3\x35\x68\x0b\x6e\x62\x96\xc6\xcb\xe1\xd9\xa4\xd6\x8a\xd8\xc2\x86\x39\x7c\x4f\xcc\xf1\x2b\x89\x42\x45\x08\xd8\xa2\x16\xe0\x60\xbb\xc0\xfe\x2d\x28\x35\xd1\xca\xa2\x46\x16\xeb\x03\xed\x96\xa3\xcb\x16\x28\x68\x41\x69\x15\x85\xe6\xde\x82\x31\x59\x89\x0d\x0a\xbd\x5d\xe0\xb3\xb7\x88\x61\xde\x92\x51\xc1\x83\x66\x4a\x46\xf4\x30\x99\x69\x6c\x0c\x46\x65\xec\xa5\x0b\xc0\x7d\xf0\xec\xb6\x96\x34\x76\x96\xf0\x20\xf4\x55\xe1\x81\x74\x1b\x9b\x2b\x73\xfc\x59\xa2\x02\xd8\x2f\x07\x6b\x48\xf5\xe6\x2a\x42\x55\xb6\xdd\x4c\xff\x56\x6d\xde\xf1\xe0\xc6\x5c\x39\x1b\x47\x6d\xc5\x40\x6e\x4d\x3b\x22\x24\x33\xf6\xb8\x66\x2b\xc7\x94\x96\x76\xa0\x09\x5e\x46\x75\xeb\x2e\x7c\xcc\xc7\x11\x8d\xb9\x6a\xb7\xb8\x7f\xb8\x5d\x9c\x96\x5d\xd1\xad\x5d\x1e\x89\xf7\x34\x76\x46\xb4\xec\x45\x58\x3b\x84\xa3\x1c\x6c\x5b\x37\x05\x8b\xc2\x27\x65\x34\x3f\x0b\x27\x34\x99\xe5\xcb\x42\x24\x85\x71\x4c\xd3\xef\x59\x3b\x96\x7b\xe0\x12\x6b\x49\xd7\xaa\x74\x8d\xe2\x5d\x64\x34\x92\x3a\xc2\xec\xb4\x98\x45\x5a\x8d\xd2\x8b\x4a\xa2\x65\x11\x8f\x5b\x43\xa9\xa0\x93\x71\xbc\x60\x94\xc5\x4d\x3c\xb3\x43\xac\x18\xb3\xee\xd0\xbf\x80\x43\x52\xf7\x45\xdf\x35\xc0\xcf\x1a\xe0\x8f\x1b\xe0\x27\x01\x6d\x40\xc4\x26\x7b\x7f\x7c\x89\x5e\x67\x0d\x6d\xf2\x59\x2c\xeb\x64\xc9\x32\xba\x38\x2f\x2c\x1a\x77\xe7\xc4\xb1\x94\x2f\x8b\xe1\xef\x2a\x79\xb3\x10\x4c\xf1\xd6\x69\x2a\xa3\x09\xaa\x54\xb9\xdb\x9c\x3e\x8a\x03\x47\x09\xe4\x40\x61\x87\x63\x1e\x0f\x92\xcf\xff\x29\x9e\xaa\x9b\x05\x32\x9a\xa3\xfd\xee\x61\xed\x62\xa1\x92\x1d\x30\x2f\x96\xb0\x8c\x7c\xb3\x1b\x8d\x22\xd6\x6e\x73\x6c\xb9\x04\x7e\x39\xe1\xd2\xb7\x48\xab\xad\xcf\x85\x71\xf6\xab\xc4\x12\x2b\x45\xf1\x0a\x0a\xd9\xe3\x2e\x13\x50\xfb\x21\xfd\xa1\xe4\xd9\xab\x01\xf2\xdb\x80\x87\xf2\x81\x93\x20\xb9\x8e\x9f\x3b\x96\xf4\xbe\xa3\x80\xa9\x0b\x0c\x57\xf6\x6a\x88\x1e\x46\x11\xed\x1f\xbd\x3d\x39\x3a\xec\x9d\x1d\xf5\xf1\x35\x46\x74\x1b\x1f\x50\xe0\x0b\xf7\x00\xb2\x24\x89\x9b\xf0\x36\xa2\x6c\x8a\x9a\x65\x14\x0a\xf0\xcc\x27\x58\x18\xc0\x38\xcb\x29\x09\xa4\x97\xf9\x02\x0f\x73\x24\xcd\x22\x60\xce\x3e\xae\x48\xb7\xc2\xc3\x30\x0e\xc2\x99\x25\x6c\x17\xdd\x0a\x18\xce\xf4\x05\x41\x01\x9f\xcf\xa7\x34\xcd\xe9\x4d\xfe\x32\x8c\xdf\xbb\x50\x29\xbc\xf9\xa3\xe7\x30\xe7\xde\x41\xe9\x56\xbc\xf0\x77\xe6\x1d\x07\x02\x63\xd9\x1e\xb0\xfa\xf2\x99\x35\x18\xd0\x61\x92\x52\x33\x7c\x32\x8d\xd9\xb0\xfb\xf8\xee\xb0\xe3\xde\xbc\xde\x6e\xa8\xe8\x84\x67\xbf\x40\xf4\x91\xb6\x9e\x01\xfb\xf7\x24\x0a\x03\xfe\xba\x8e\x70\xfb\xb6\x87\xcc\xe1\xd9\xfe\x79\x08\x75\xa5\x1a\x56\x0e\xe7\x9f\x8b\x5e\xe5\x3e\x79\x05\x9f\xf6\x8f\xa3\x5b\x4a\x47\x61\x96\xd3\x94\x8d\xc7\x2b\x36\xe7\x14\x98\x2a\xa5\x23\x7a\xd3\x90\xa3\xaf\x5e\x8d\x5a\x6d\x7f\x0a\x35\x07\x07\xfa\x22\x28\xbd\x66\xe2\x6a\xbb\xb2\xbd\x8a\xc9\x63\x41\x4c\x59\xf9\x64\xaf\x6c\x7f\xb1\xe2\x0d\xe8\x32\x4a\x28\x40\xab\xf5\xbd\x9c\xeb\x6e\xc3\x80\xeb\xb4\x21\x56\xe8\xe9\xe2\xfd\xba\x31\xc9\x4e\x8d\xfb\x2f\x8b\xc3\x09\x96\x2e\x50\x99\xb5\x17\x44\x2d\xff\x84\x16\x54\xc2\x19\xde\x55\x5b\x10\x95\x73\x71\x23\x6e\xe8\x76\xc5\xea\xc8\xeb\xbc\x62\x2f\x5a\x10\xe4\xb3\x02\xf3\x5e\x14\x55\x83\x15\xf1\x8b\x0a\xf1\xe6\x4a\x1c\xe4\x9e\x23\xa4\xcd\xe9\xcc\x45\x30\xcc\xf4\x44\xab\xc2\x71\x3f\xc6\xbd\x65\xe0\x0c\x72\x69\xde\x6f\x13\x7b\xb7\xa5\xd8\x3b\x22\x60\x93\x88\xb4\xe3\x2c\x53\x2f\x46\x8a\x72\x6c\x8b\x19\x4b\x52\xa7\xc5\x6c\xad\x78\xcb\xf7\x9d\x16\xf5\xcf\x69\xee\xe1\x8e\x2f\xcd\x66\x91\xb2\x8e\xe9\x15\x89\x66\x24\xa7\x8c\x9e\x96\x69\xae\x0f\x5f\x70\xdb\x12\x2b\xb1\x6e\x23\x95\x2b\x57\x97\x4e\xb3\x4f\x3f\x8c\x54\xb9\x23\xb4\x1a\xfc\xf6\x32\xf8\x25\x2a\x18\xb0\xf5\xb6\x40\x79\xc5\xac\x77\x0c\xca\x85\x4b\x3a\x94\x0f\xb7\x3c\xa1\xb2\xa2\x61\xe9\x46\xc3\xec\x6c\x1c\xa6\xc1\x4b\x7a\x45\xa3\x53\x5c\xbd\xe5\x78\x83\xa6\xc0\x13\x12\xa4\x63\xc5\x2d\x30\xe1\x0d\x95\x8f\x0c\x96\xb4\x7f\x4f\x53\x74\x85\xf6\x8c\xcd\x27\x1d\x8a\x4c\x31\x80\x9d\x5b\x6b\x80\x86\x5d\x2c\x55\x0e\x28\x8b\xc9\x62\x02\x33\x86\x59\xe4\x2e\x26\xa9\x5b\x8b\x54\xb2\x6c\x85\x5e\xb1\x98\xde\xb8\xe0\x86\xcd\x59\xaf\x74\xb0\xcf\x7b\x3a\xdf\x07\xbd\x0f\xae\x57\x49\x8a\x23\x8c\x6c\x4e\x42\x2d\x5b\x93\x84\x07\x8c\xcb\x0a\x2e\x3e\x8f\x1f\x43\x0b\xd0\x09\x8e\x44\x32\xa1\xcd\x13\xa4\xff\xce\xe3\xc7\xd0\xe1\x29\xd2\xe9\xe7\xf1\x63\xe9\x7e\x65\xf8\xd5\xbd\xa7\xf3\xc3\xc2\xe1\x20\x7a\x3a\x3d\x2c\x3f\xae\x60\x20\xe0\xda\x3c\x37\x45\xce\x2d\x70\xcf\x4e\x57\xf2\xb4\xb2\x3d\xce\x96\x83\xed\x1f\xbd\xb4\x01\xb8\xe2\x98\x3f\xfa\x02\xfd\x91\xce\x92\xff\xd2\xf1\x18\xc4\x67\xe8\xd7\xf3\xb3\xa2\x6b\x8e\x21\xc0\xa5\xbd\xae\xaa\x8e\xb7\xb7\xf7\xef\xd8\xee\xe1\xc9\xe7\x68\xb7\xf3\xe0\xae\xed\x1e\x9d\x1e\x7e\x8e\x86\xb7\x1f\x94\x87\x5a\xc9\xd1\xa7\x0d\x74\x1b\xdd\xab\x35\x34\xd8\x80\x76\x9d\xe5\xf4\x1d\x1c\x50\x9a\x86\x96\xc1\xde\xee\xd7\xaa\x7c\x39\x2d\x14\xc5\xf1\x9d\x76\x02\x25\x7e\x1d\x9e\x2e\x84\x3e\xa8\xc1\xfe\xb2\xe6\x77\x5d\x9d\xb8\x5d\xc0\xc1\xf6\x11\x46\xe9\xd5\xd5\x4f\x22\xf5\x9b\x22\x32\x2b\x5d\xc4\x5a\x7d\x24\x17\x83\x77\xb2\x95\x43\x83\x7c\x69\xb6\x3a\xfc\x2c\x6c\x75\xf8\xc5\xd8\x6a\xb8\x0a\x5b\xb9\x3a\xf1\x8b\xb1\x55\x11\x99\xcf\xcc\x56\x8b\xc1\x3b\xd9\xca\x31\xd1\x7e\x69\xb6\xea\x7d\x16\xb6\xea\xad\xc6\x56\xcb\xd8\xc3\x85\xcc\x2f\xc6\x1e\x45\x64\x3e\x33\x7b\x2c\x06\xef\x62\x8f\x9d\xd6\xdf\x9e\x3d\x9e\x7d\x16\xf6\x78\xf6\x79\xd8\xc3\x85\xcc\x2f\xc6\x1e\x45\x64\x3e\x33\x7b\x2c\x06\xef\x64\x8f\xdd\x32\x7b\xdc\x33\x17\x0a\x5f\x7f\x0d\xf7\xf4\xa2\xe0\xd3\x18\xa6\xf3\xd3\xdd\xf1\xdb\xfb\x62\xec\xbb\x5d\xc5\xbe\x8b\xb1\xfc\xe4\x41\xda\xbe\x3b\x15\xb6\x17\x52\xe1\x4b\x88\xf0\xf3\xaa\x9b\xc6\x15\x52\xf1\x09\x32\xe1\x6a\xea\x13\xba\x54\x04\xe7\xa4\xa7\x83\xeb\xbf\x2c\x3d\x8f\xff\x76\xf4\x74\x35\xf5\x09\x5d\x2a\x82\x73\xd2\x73\xfb\x63\x17\xc7\x96\xd3\xd8\xa6\x57\xb5\x85\x0e\x9f\x5f\x0c\x77\x3f\x42\x0c\x77\x3e\x4b\x37\x1d\x6e\x9b\x5f\xa8\x8f\x7b\x77\xef\x63\xbb\xdd\xf9\xdb\x1b\x0c\x6f\xbf\xa8\xc6\x7d\xb3\x18\xbc\x9b\x0a\x0e\x8e\xfe\xd2\x54\xf8\x17\x5f\x96\x0a\x8b\xc1\xbb\xa9\xe0\x60\xf8\x2f\x4d\x85\x93\x2f\x4b\x85\xc5\xe0\xdd\x54\x58\x38\x5b\x7c\x19\x2a\x9c\x7e\x59\x2a\x2c\x06\xef\xa6\xc2\x97\xb3\xc4\xda\xbb\xbf\x90\x29\xd6\xfe\x88\x49\xa0\xdd\xfe\x82\xdb\x83\x0f\x7e\x29\x42\x3c\xf8\x18\x42\x7c\xc1\x9d\x87\x87\xbf\x14\x21\x1e\x7e\x0c\x21\xbe\xe0\xce\xde\xa3\x5f\x8a\x10\x8f\x3e\x82\x10\x9d\x2f\xb7\xd9\xd0\x69\xfd\x42\x84\xe8\xb4\x3e\x86\x10\xed\x2f\x47\x88\xca\x39\xe3\x4b\x13\xa2\xfd\x31\x84\xf8\x72\xd6\x64\xe7\x97\x5a\xc0\x77\x3e\x62\x05\xdf\xee\x7c\x39\x83\xb2\xb3\xf3\x4b\x11\x62\xe7\x4e\x84\x10\xc1\x89\x9d\x6b\x28\x79\xe8\x2c\xb6\x9b\x8a\xdb\x4f\xe2\x90\x5a\xfc\x12\xe7\xd1\x2e\xaa\x09\x70\xe2\x50\x1a\x9e\x74\x61\x6f\x97\x55\x33\xd2\x1e\x77\xe1\x51\xc9\x1f\xdc\xd9\x79\x47\xf8\x1a\x13\xf8\x26\xec\xed\x38\x6e\xda\x97\xe3\x9d\xa8\xc5\xbe\x51\x19\x03\xfe\x38\x1f\x6f\x5c\x09\x0d\xd7\xeb\xef\xab\x35\xfc\xa4\x0b\xbb\xed\x32\x49\x76\x77\x3f\x0f\x49\x76\xdb\xb0\x01\x9d\x07\x9f\x44\x97\xdd\xbd\x8f\xc6\xa5\xfd\x89\x4d\x77\xda\x8f\x3e\xba\xed\x4f\x6d\xba\xf3\xf1\x5c\xd9\x79\xf8\x89\x4d\x3b\x1f\xa6\x5c\xad\xe9\x47\x4b\x9b\xae\xd8\x60\xbf\x57\x3e\x2f\x14\x7c\x69\x8b\x7b\x41\x37\xfc\xad\xa4\x7f\x81\xea\x5b\x22\x05\x1b\x4c\xb2\x3f\x65\x3c\xda\x8f\x56\xd3\x0c\x8b\xb4\xf3\x9f\x96\x9e\x7b\x54\x61\xf0\xa4\x0b\x3b\x0f\x1d\x1a\xc2\x19\xfa\xf4\x2e\x38\xd9\x9a\x62\x67\x39\xcf\x2e\x3a\x99\x29\xf1\x4d\x79\x9e\x30\x18\xe7\x4e\x7c\xc3\x86\x60\xaf\x52\x1f\x1a\xce\xa6\xc2\xb7\xf4\x2e\x9d\x30\xe6\x44\x71\xaf\x5b\x86\x4b\x67\x34\x5c\xe0\x3e\x3f\x42\xcf\x3d\xcb\xa3\x6c\x64\xf9\xbf\x8e\x22\x51\x60\x64\xf8\xb9\xe1\x7b\x26\x54\x39\x57\x8a\x9f\xd9\xf9\xe8\x62\x51\x53\x87\xaa\x96\xd1\x58\x03\x44\x6d\xfb\xfa\x84\x86\x08\x5d\x59\x42\xbb\x69\x5a\x98\x75\xbb\x50\xbe\xf5\xae\x31\xb4\x2a\x57\xb9\x4b\xcb\x77\x41\x17\xb8\xd6\xbd\xa7\xf3\x02\x02\x7f\x3b\xff\xdd\x62\x9c\x10\x69\xde\x08\x2d\x61\xc2\xe1\xe2\x62\x64\x3a\xfd\x50\x55\xc0\xb7\x2e\x8f\x0d\xe7\x84\x20\x18\x77\x31\x80\x7b\xf2\xa2\x9c\xd1\x64\xf9\x2a\xbc\x82\x89\x95\x4a\x10\x97\x93\x01\x35\x3b\x83\xf2\xe1\x03\x78\x9e\x96\xc9\x0f\x96\x73\xe1\x87\x0f\x96\x48\x32\x81\x5d\xe4\xa0\xba\x0a\xfd\xab\xa7\x28\xed\xdd\x69\x3b\x8e\xca\x87\x68\x1d\x6e\xa3\xa6\x73\xe9\xdd\xbd\x4a\xcb\xee\xa4\xe8\x78\x56\x25\x70\x78\xf1\xcf\x7d\xa1\xcc\xe9\x34\xad\x27\x4f\x0c\x58\x62\x12\x67\xf5\xab\x73\x12\x57\xfc\xc1\xe1\x1c\x94\x4b\x61\x86\xf1\xd6\x2e\xf0\xeb\x75\x8e\xf8\x03\xbc\xe4\x06\xbf\x01\x5a\x19\xf0\x9f\x56\x78\xf0\xeb\x2e\x5d\x85\xd9\x8c\x44\xcf\x68\x14\xd5\x0b\x43\x7e\x50\x4d\x11\x3e\x66\xf2\x69\xc9\x7c\x1e\xd1\xe6\x20\x49\x03\x9a\x1e\x26\x11\x06\x42\xa9\x5d\x8f\xc3\x5c\xbe\xe8\xb1\x94\x48\xfc\xad\xb3\x45\xe0\xf4\xd3\xc3\xed\x56\xf1\xae\xf5\x34\x99\xbe\x89\xed\x0e\x60\xba\x0a\xc9\xe6\xa6\x4d\x94\x8c\x96\x90\x26\xa0\x83\xd9\xc8\x4d\x15\xf3\x6a\x00\xbe\x83\xda\x14\x57\xf1\x98\xa4\x39\x33\x58\x7b\xd5\x14\x26\xe9\x88\xa9\xd8\x5e\x9a\x92\xb9\xc9\xab\x51\xe8\xd3\xa6\x4f\xa2\xc8\x93\x0f\xd9\x58\x2f\x44\x39\xda\x10\x01\x3f\x5d\xd9\x0d\x6c\xa6\xda\xad\x3a\x4d\x97\x06\xb1\xf9\xbc\x24\xc1\x16\xbf\x38\x51\xb0\x95\x8f\x27\x4b\x4a\xb3\xf0\x2f\xb6\x6b\xf9\x4d\x03\xe6\x26\x6d\xc2\xec\x35\x79\xed\xdd\xd4\x59\x4f\xf9\xf7\xb9\x43\x85\x16\xb5\xf6\x5c\x86\xa3\x18\xd1\xfc\x0d\xde\xeb\x92\x91\x1f\x06\xc4\x7f\x5f\xab\x3b\xee\xf5\xbb\xca\x31\x5c\x4c\xd0\x78\x33\x3c\x8c\x69\x03\x68\xd4\x80\x90\x5f\x07\x1f\x37\x80\x04\xc1\x59\xf2\x47\x3d\x56\x37\x3a\x0c\x8d\x9f\x44\x78\x95\x7f\xae\x93\xf0\x81\x84\xa5\x5d\xb8\x81\xc7\x66\x00\xee\x1b\x1d\xbc\x88\x77\xd0\xca\x9d\xeb\xdc\x77\x60\xb4\xac\x2b\xbc\x83\xc7\x70\x63\x79\xb6\x8f\xa1\x0b\xe7\x82\xf3\x86\xbd\x3c\x4f\x1b\x50\x83\x5a\x03\xda\x46\xe4\xdd\x10\x1c\xd1\x74\x74\xb6\xb8\x78\x1f\x6e\x6e\x16\xf5\xb2\xc8\x31\xea\x8e\x68\xee\x85\x75\x79\x7f\xba\x80\x8c\x35\x16\x56\xf9\x65\x4f\x11\x94\xe2\x15\x21\xc1\xbb\x70\x63\x4e\x71\x34\x9f\x4d\x4f\xf3\x64\x9a\x79\xaa\x48\xbd\x40\x2d\x7c\xf4\x0f\x93\xf8\x60\xea\x30\x23\x92\x7a\x96\xb9\x5d\x7a\xcc\xa5\x44\x94\x77\x1b\x1b\xc5\x4a\x50\x19\x0a\xea\x31\xcc\x55\xcc\x96\x62\x00\x95\x52\x4d\x7e\xc5\xe9\x89\x11\x2a\xc0\x86\xe5\x0a\xad\x34\xe7\x2f\x14\xb1\x8e\xe1\x8e\xda\x82\xf5\x80\x33\x70\x90\xfc\x70\x18\xc5\x60\xdd\x65\x14\x45\x48\x98\xca\xe5\x29\x54\x06\xa0\x32\x3f\xe5\x45\x5e\xc5\xb2\x6f\x41\x77\xaa\x43\x3d\xb9\xde\x94\x58\xb4\xde\xd1\x36\xb8\x7c\xc2\x5c\x8f\x5e\x25\x33\x97\x9e\x8c\x2c\xc3\xbe\xad\xb6\x4c\x25\x2f\x6d\x6e\xc2\x93\x55\x79\xe9\xc9\x5d\x78\xa9\x50\xd3\xcd\x38\x8b\xf9\x45\x10\x38\x99\x2e\x5f\x3f\x3a\x7a\x58\x02\x67\xc5\x1b\x73\x97\x60\x2c\xe3\x2a\xf1\x51\x83\xe7\xa0\x2b\x58\x02\xae\x2a\x94\x02\x85\x98\xb0\xef\xd1\xa8\xe2\xb5\x93\x24\xce\xc3\xb8\x78\x59\x83\x37\x51\x15\x6e\x90\x46\xab\xeb\x3b\xf4\xbe\xe9\x42\x71\x9d\x38\x87\x27\x5d\xbb\x67\x22\xb9\x0b\x73\xed\xac\xa3\xa7\x1b\x2e\xd8\x8e\xf2\x1b\x5d\x6b\x7a\x2b\x84\xc6\xb8\x61\xcd\xdc\x94\xaa\xb1\xd9\xea\xa6\xd8\x8c\x75\xed\x72\x5a\x78\x3d\xd8\x0c\xde\x65\xe3\xa8\x96\xd6\x8b\x9e\x1d\x5d\xe5\x95\x45\x1e\xc6\x16\xba\x46\x48\x71\x61\x23\x24\x13\x9a\xa7\x73\x35\x1f\xf2\xc7\x8c\x14\x9c\x8b\xd2\x62\x8a\xdb\x2d\x85\x77\x83\xf9\x12\x8f\xd5\xdd\x87\x1b\x8c\x04\x93\xed\xc3\x7c\x41\x78\x4d\x23\x70\x89\x65\x02\x59\xf6\xcf\x5c\xbd\x4a\x6b\xc4\x2d\x29\x58\xe3\x85\xc8\x2c\xf3\x83\xb2\x1d\x64\x84\x38\x71\xd6\xe5\x11\x5b\xe6\x55\xa8\x4e\xc8\x4d\x19\x4f\x6b\xf3\xa4\x80\x43\xab\x3c\x36\x46\x50\x18\xed\x31\x56\xb9\x71\x23\x26\x6c\x3b\xc8\xa2\x65\x18\xca\x10\xf3\xc5\x6b\xc0\xdc\x1e\xce\xc9\x20\x3b\x0f\x2f\x4a\x2a\x53\xc5\x9e\x49\xe9\x15\x6b\xc1\x19\x8e\x12\x2a\x02\xad\x30\xa0\x46\xd8\x52\x09\xd0\x8a\x47\x56\x7c\x4d\x18\xcd\x30\x08\x99\x1c\x15\x2d\xd2\x9c\x0c\x18\x0a\xdf\x87\x41\x3e\x76\xd8\xa4\xa2\x0b\x85\xab\xbd\x6e\x8a\xc9\xee\xd8\xb6\xb4\x49\xaf\x1b\xb5\xed\x62\xd9\x94\x5c\x5c\x39\x70\x31\xdb\x18\x04\xdc\xdc\xbc\xb9\x60\x56\xc6\x0d\xce\xe5\xaa\xa2\xb5\x21\x70\xa3\x02\xcc\xb1\xae\xaa\x32\x4f\x0d\x73\xcc\x8c\xf0\xbf\x0f\xcc\xb2\x6d\x89\xe0\xfb\x37\x55\x2c\x10\xd3\x9b\xfc\x0b\x74\x68\x63\x43\x76\xc8\x18\x9e\xbf\x69\xc7\x68\x4a\x32\x7a\x82\x8f\x0a\x56\xad\x7b\xe4\x32\xc3\x36\xbe\x99\x41\x6c\xcd\xcf\x73\xf3\x2e\x3d\x2b\xb3\x78\x51\xc1\xa0\x1a\x46\x3f\xe2\xc1\xcc\x7e\xaf\x5e\x30\xfc\x05\x07\xdf\xd8\x1c\x7c\x63\xc7\x78\x65\xed\x9d\xdf\xf0\x8d\xd2\x92\x92\x37\x43\x32\xcd\x17\x2c\x8a\x49\x46\x5f\xd2\xe1\xaf\x96\x10\xea\xa5\x1a\xc1\x47\x37\xf6\x3a\xe7\x33\x90\x00\x63\x46\x54\xee\x0b\x18\x9d\xb4\x43\x83\xcd\xcb\x91\xc0\xca\xdd\x34\x28\x96\xd1\x5c\xcd\x8c\x15\x34\xe4\x3f\xea\xe6\x7c\x69\x07\xab\xb5\xa6\xe3\x42\x24\x46\x13\x51\x3b\x4d\xff\xb6\x22\x08\xb7\x57\x7a\x6e\x7d\xb9\xe9\xbe\x5a\xcc\x46\xf8\xf8\x48\xa0\x9c\x47\x39\x0b\x3a\x66\x68\xcd\x40\x28\xd1\xac\xf1\xea\xc1\x56\xe8\x17\xc2\x3a\xa5\x66\x40\x58\x83\xf3\x49\x9e\xf3\xe8\x4d\x69\x51\xf7\x18\x2c\x6b\xa8\x1f\x73\x2d\x7f\x50\xe0\x74\x62\xae\xef\x1b\x52\xa8\xce\x2f\x1a\xe6\x04\xc6\xf7\x5b\x0a\x98\x48\x4e\x6f\xaa\x1c\xe8\x6a\x7c\x57\x98\xf9\x1c\x7a\x23\x2c\x0b\x8d\xd0\xb9\x2c\xbb\x52\x58\xc6\x45\xc2\x15\xa2\xbe\xd8\x94\xaa\x96\x6e\x83\x66\x55\x1b\x20\x15\xa1\x0c\x6d\x7b\x84\xd9\x7e\xe6\x80\xc5\x64\xa2\x54\x15\xcb\x7b\x4d\x26\xd4\x9a\x51\x3c\x2c\xb1\x01\xb5\x5a\xbd\x19\xc6\x01\xbd\x79\x33\x14\x40\x50\x9e\xab\x9a\x75\x45\x46\x37\x77\xd6\x4b\xa1\x31\x83\x30\x23\x83\x88\x9e\xe6\x41\x18\x2f\xdf\x69\x32\xa4\xb7\x3a\x6e\x8a\x65\xbc\xdb\x31\x53\x4a\x61\x2e\x18\x6e\x35\xf1\x20\xd2\xe2\x3e\x9d\x85\x79\x64\x8b\x43\xce\x52\x6c\xf1\x42\x98\x98\xce\x64\x16\xf3\x2b\x07\x88\x11\xb5\xda\x48\x9d\x9b\x71\xac\xe5\x32\xa9\xbc\xfe\x28\xaf\x82\xcc\x0d\x0a\xa3\xb8\xe7\x8e\x17\x68\x1b\x0e\xe5\xc5\x91\x84\x56\x1d\x42\xfe\x8a\xa6\x19\x7d\x51\xd9\x19\xc6\x6c\xef\x4a\x3d\x51\x1b\x8c\x3a\x5c\xb2\x5b\xa3\xe2\x42\x56\x3c\xe1\x9c\x79\x6a\x99\xaf\xf9\xa0\xa0\x42\x1b\x50\x8a\x38\xae\xe7\x95\xea\xea\x5a\x5d\x63\xc8\x91\xa5\x71\x1b\x8b\x51\x9e\x97\x95\xb4\x22\x3d\x57\x1b\xed\xf3\xe5\xe4\x2e\x1e\x10\x5b\x4c\x23\x85\x4a\x2c\xb4\x0b\xbb\x85\x56\x11\xb1\xf7\xa8\xb5\x9f\xd6\xc2\x15\xa1\xf9\x78\x51\x77\x7c\x3e\x5d\x57\x45\x50\x7a\x11\xe7\x34\xbd\x22\x7a\x6f\xa2\x9c\xc5\xeb\xa9\x6e\xe2\x5e\x3e\x5f\x9a\x9a\xa8\x5a\x9b\xfa\x77\x0b\x1b\x68\xd4\x73\xe1\x55\x89\xd2\xca\xb3\xb4\x7a\xce\x22\x9b\xc7\x3e\x8f\xe8\xdc\x4b\x29\xa9\x3e\x6e\x62\xeb\xa8\x45\x23\x88\x96\x3f\x17\x3d\xbd\x9a\xba\x3d\x58\x53\xc5\xc5\x1b\x1d\x0c\x98\x11\x10\xce\x27\xd3\x7c\x96\x52\xeb\xa4\x86\x1f\x98\x84\x19\xfe\xeb\xd1\xa8\x5e\xda\x14\x3e\xa7\xd1\x85\xcd\x92\xcd\x61\x92\x1e\x11\x7f\x6c\x9c\xd0\xc9\xa7\x24\xac\xca\xfc\x8c\x8e\x04\xfc\x29\xda\x97\x61\x96\xd3\x98\xa6\x9e\x1b\x2b\xf8\xf0\x41\x9c\xe7\x8b\xc6\x18\x75\x8c\x1e\x0d\x87\x2b\x74\x89\x46\x62\xdb\xe9\xae\x2d\x1a\x2d\x19\x91\x85\x86\x49\xea\xd3\xf2\xc1\x16\x2f\xc1\x5f\x33\xc1\xe3\x71\xab\x9c\x7b\x5e\xa2\x57\xb8\xa4\xa5\x71\xde\xe7\xae\x96\x52\xd5\xd2\xab\x66\x96\x27\xd3\xb7\x69\x32\x25\x23\x22\x23\xad\x41\xe9\x30\xdd\xc0\x30\x8c\xc7\x34\x0d\xf3\xcc\xc3\x9d\xbc\x06\xf0\x4d\x37\xd9\xbe\x2a\x36\xf4\xca\x0e\x1d\x49\x9c\xe5\xe9\xcc\xcf\xf1\xf0\x0e\xab\x5b\x06\x8f\xe6\x41\xe8\x0a\xb0\x3a\x89\x97\xc4\x4a\x56\xb9\x98\x5e\xc3\xb0\x80\x20\x37\x05\x92\xc1\xbb\x06\xe8\x78\x54\xd2\x58\x4e\x06\xef\xac\x93\x17\xf7\xa9\x0b\xa3\x77\x32\x78\x87\xb6\x55\xb7\x0b\xc5\xed\x48\x41\x9d\xd0\x61\x73\x6d\xb6\x6d\x6c\xca\xce\x0b\x34\x9d\xa0\xdb\x80\x81\x58\xae\xca\x7c\x2b\x22\x66\xd0\x74\xf2\x09\x1e\x70\x1f\x3e\x28\x74\x4b\xa0\x4e\xbf\x0f\xe3\x80\x29\x8a\x22\xc0\x6a\x78\x96\xcb\x0a\x27\x7c\x17\xb4\xa3\x84\x2b\x6c\x97\xd9\x21\x07\x95\xec\x0e\x7f\xfd\x35\xbf\x5c\x2e\xfd\xac\xb8\x13\x88\x72\x3b\x83\x9d\x07\x28\x25\xce\xad\xb4\xdc\x1f\xcb\xc3\x77\xfd\xc3\xd0\x46\x3a\xd1\x4b\xdb\x0d\x18\xb5\x1b\x30\x68\x9b\xb4\x1f\x13\x7c\x5f\xc6\x4b\xdb\x18\xeb\x6a\xaf\x0e\x1f\xc0\x1b\xe1\x8f\x87\xec\xfb\xc0\x38\x28\xd4\xc0\x9a\x97\x3e\xf1\xc7\xf4\x9c\xd5\xbe\x70\x6d\x9e\x99\x61\x2c\xcb\x35\x4a\xe7\xa0\x41\x38\x1c\x42\x17\x5e\xc4\xc3\x30\x0e\xf3\x39\x5b\x54\x40\x17\x36\xdb\x2a\x56\xb6\xdf\x80\xb4\xd3\x80\x51\xa7\x01\x83\x4e\x03\x58\xf9\x83\xe2\x42\x41\x11\xe8\xca\x67\x2d\xaa\x23\xc6\xe2\xb2\xc1\x87\x6e\xa9\xec\x79\x68\x9c\x54\xa6\x1d\x26\xa1\xe7\x2d\x23\x69\xc4\x93\xcc\xf3\xcc\x01\x4f\xea\x18\x49\xa2\x1b\x46\xaf\x83\x30\xcb\x99\xca\x32\xa8\x6f\xf6\xa4\xf0\x44\x1b\xaf\xef\x0a\xcc\x8d\xf4\x08\xed\x8d\xfc\xca\xc7\x0b\x15\xa8\xc7\x9c\xb2\x25\x60\x02\x4f\x4d\xc5\xaa\x66\x6e\xcb\xbc\x5b\xc5\x04\x5d\x88\x42\xc6\xa6\xa5\x7c\xb1\xc9\xe9\x20\x8a\x1d\xb2\xd5\x4d\x20\x7b\x55\xf6\x8a\xe4\xe3\xe6\x34\xb9\xf6\xb6\x5b\x70\x1f\x99\x76\x13\xd2\x4e\xbd\x61\xbe\x0f\xbd\xa1\x4b\xed\x3e\x62\xa5\x46\xac\xd4\xa8\xba\x54\xbb\xcd\x4a\x0d\x58\xa9\x01\x2f\x65\xcf\xe8\x94\xcd\xb7\xa8\x4f\xc3\x1c\xe7\xb0\x24\x36\x27\x26\xa6\x52\xc5\xac\x5c\xf4\x91\x00\x23\xcf\xd3\x95\x1d\x9b\x18\x2d\xce\xc2\x86\x7a\x2e\x72\x2d\xab\xce\x2d\x30\x3f\x89\x1b\xc0\xd5\x33\x3a\x0e\x24\x83\x77\x3a\x6c\xbe\x46\xfb\x9a\x64\xaf\x92\x98\xdf\x7d\xf8\x96\xce\xdf\xc4\x11\x37\xbe\x0c\xb7\x40\x81\x65\xd1\xcd\x76\xcf\xd4\xa0\xc5\xcc\x07\x8b\x32\x1f\x5a\xda\xff\x3d\x9d\x67\x8c\x3c\x26\xb5\xde\x0c\xde\x51\x1f\x9d\x62\xb3\x12\xb5\x8c\x3c\x4f\x77\x4a\xf8\x2e\xa2\xc3\x59\x66\xbc\xe6\x8b\xf4\x7b\x4f\xe7\x10\x22\x9d\x8b\xf3\x97\x00\x66\x45\x94\x7d\x73\x1d\xb3\xc9\x9e\xa6\xf9\x9c\x93\x12\x47\xf5\x3d\x9d\x97\x82\xd8\xb2\xb6\xf8\x6e\x91\x76\x5a\xab\x10\x08\x56\xd4\xd2\xcf\x48\xe5\xa3\x49\x98\xe7\x68\xfa\x9a\x3f\x2f\xdb\x56\xae\x61\x81\x4a\xc3\x82\xc9\x9f\xf8\x6a\xe4\x62\xf0\xd8\x24\x36\x53\x50\x82\x13\x26\xc0\x86\x7d\x2e\x02\xba\xf1\x2f\x07\x6b\x93\x24\x98\x45\xb4\x49\x6f\x98\x09\x9c\x19\x6a\xef\x60\x6d\x6d\x6b\xeb\x2b\xc8\x92\x59\xea\xd3\x57\x64\x3a\x0d\xe3\xd1\x77\x27\x2f\xbb\x37\x38\x5d\xbe\xcb\x9a\x13\x32\x5d\x5b\x5b\xdb\xba\x7f\xff\xfe\x16\xdc\xd6\x1b\x6b\x5b\xf7\xa1\x0d\xf7\xb7\x44\x8a\xb2\x3e\x3d\xde\x42\x03\x44\x13\x0d\xb8\xbc\xbc\xa6\x83\x29\xf1\xdf\x5f\xa6\xf4\xcf\xb3\x30\xa5\x97\x97\x8c\xb6\x6b\xeb\xb3\x8c\x42\x96\xa7\xa1\x9f\xaf\x1f\xac\xad\x89\xd1\xe1\xe1\x19\xe5\x98\x78\x0a\xca\xfa\xe5\x25\xcd\x5e\x21\xec\xf5\x06\xfc\x08\x57\x24\x9a\xd1\x7d\xb4\xb6\xd1\x3a\x3d\x58\x63\x5c\x51\x20\xb4\xc3\x6b\x4d\xa5\x98\x45\xcb\xb6\x99\x7e\x45\xce\xfa\xf9\xe1\x83\x3a\x9e\xe1\x23\x6e\x42\x31\x38\xab\x10\xda\x97\x9b\xbc\x91\xb0\x80\xab\x1a\x3b\x67\xc5\x2e\x0a\x4d\x8a\xc4\x0f\x1f\xac\x37\xab\xcb\x25\x38\x6b\xaa\x26\x04\x8e\x07\x0b\x91\x44\x86\x59\x05\x4b\x6d\x6d\x5b\x6d\x16\x45\x64\xf1\xd3\xdb\xc9\xe0\x9d\xb3\x6f\x07\x56\x29\x97\x49\x0a\x0b\x9d\x81\x0a\xa6\xa9\xc4\x9f\x91\x8c\x27\x37\x55\x92\x99\xef\x3a\x96\x67\x0d\x8b\xf7\x40\xc2\x46\x29\xae\x86\xab\x8b\xe0\x3a\x3e\x5f\x48\x75\xbe\x24\xea\x45\x91\x5c\x10\x65\xa5\x41\x28\x92\x7e\x39\xe5\x03\x1a\xd1\x9c\x2e\x24\xee\x2a\xb8\x25\xc5\x29\xb8\x9a\x25\xcc\xd5\x6d\x11\x9b\x8f\x73\x01\x94\x1f\xbe\x91\x30\x1c\x8a\xc6\xad\xd7\xd8\xc1\xdc\xcb\xe5\x48\x19\xfe\x81\xca\x1f\xb0\x3c\x32\x49\x6c\x70\x81\xaa\x7b\xe0\x30\xd3\xb3\x66\x12\x17\x9b\x5e\x4c\x35\x3a\x09\xf3\x85\x63\x68\xd0\xc3\x14\x62\x35\xdd\x5f\x8a\x43\x8b\x4b\x36\xe1\x2b\xb2\xa8\x69\xff\xd2\xf1\x00\x22\x03\x77\x7e\x19\xc2\x26\xb4\x99\xc6\x50\x95\xce\x2f\xc3\xd2\x98\xc3\xdf\x4e\x82\xef\x68\xc1\x00\x97\x39\x26\xa3\x4b\x47\x71\xf1\x18\x44\x2b\x09\x93\x39\xca\x95\xfa\xf5\xd6\x5a\xf0\xdb\x93\xf3\x2d\x9e\x0d\x89\x49\x69\xd1\xb4\x5e\x35\x9d\x5a\xe8\xbb\x67\xd5\xce\xaf\x68\x56\x65\x43\x79\xd8\x3a\x58\x33\x26\xd2\x43\xb5\x12\x39\x6c\x35\x5f\x7f\xf7\x12\xba\x50\xfb\xe1\xa6\xd5\x12\x8e\xde\x87\xad\xe6\xe9\x9b\xe7\x22\xb1\x6d\x24\x9e\xfd\x41\x24\x76\x74\xe2\x91\x4a\xdc\x36\x12\xdf\x9c\x89\xc4\x1d\x23\xf1\xf5\xbf\x10\x89\xbb\x3a\xb1\x77\xf8\xad\x48\xdc\xd3\x89\xcf\x8e\x24\x4a\x0f\x8c\xc4\x53\x91\xf6\x50\xa7\x3d\x97\xcd\x3c\xd2\x69\x2f\x8f\x45\x1a\xd1\x69\xbf\x97\xe5\x06\x3a\xed\x58\x96\xf3\x75\xda\xe1\x89\x48\x0b\x4c\x52\x88\x34\x6a\xa4\xbd\x10\x69\x43\x9d\xd6\x7f\x79\xc4\x13\xdb\x06\x1d\xfb\x87\x6d\x91\xd8\x36\x13\x3b\x22\xb1\x63\x26\x6e\x8b\xc4\x6d\x33\x71\x47\x24\x1a\x74\x7c\xdd\x13\x24\x6b\x1b\x74\x3c\xfd\xe3\x6b\x91\xb8\x67\x8e\xcd\x33\x91\x68\xd0\xf1\xb0\x27\x4b\x1a\x84\x3c\x7a\x25\xd2\x0c\x42\x9e\x7e\x27\x6b\x1b\x94\x3c\x3a\x3d\x14\x89\x26\x29\xc5\xd0\xb4\x0d\x52\x7e\x23\xd3\x0c\x52\x9e\xc8\x34\x83\x94\xdf\xc9\x34\x83\x94\xa7\x6f\x79\x5a\xc7\xa4\xa4\xe4\x89\x07\xac\xe0\x6d\xdd\x3b\x6c\x41\x57\xca\x52\xf3\xb0\x85\x57\x70\x8c\x9f\x6c\x7d\x5a\x47\xa3\xb2\x42\x8a\xed\xab\x7b\x15\x82\xbc\xfd\x2b\x12\x64\xd5\xb9\xe7\xbd\x93\xd3\xa3\xb3\x53\xb1\x04\x97\xc9\xfd\xa3\xe3\xde\x77\x2f\xcf\x2e\x45\xb6\x49\x1c\x51\xe1\xbc\xf6\xac\x76\x51\x86\x73\x5e\x6b\xd5\x2e\x54\x70\xf6\xda\x9f\x6a\xfb\x50\xfb\x61\xd6\xd9\xf5\xf7\x6a\x3c\x00\x7b\x8d\xc8\xa4\x47\x1d\x99\x34\xe0\x49\xad\x56\xeb\x91\x4c\xf2\x55\x92\x2f\x93\x02\x95\x14\xc8\x24\xaa\x92\x88\x4c\x1a\xca\xa4\x41\x4b\x26\x8d\x54\x52\x5b\x26\x8d\x05\x12\x3b\x9d\x1d\x99\x14\x2a\x58\x03\x99\xf4\x4e\xa2\xda\x7e\x28\x93\xde\xab\x24\x05\x3e\x92\x49\x1a\xd5\x89\x2a\xa5\xc0\xc7\x32\x69\x5b\x95\x4a\x44\xd2\xf6\x40\x61\x3f\x55\x49\x0a\x89\x3f\x2b\xf0\xaa\xc5\x54\x95\x52\xb0\x32\x95\xa4\x88\x93\x2b\x24\x54\xa9\x99\x4c\xd2\xdd\xbe\x52\x78\xa9\xa4\x6b\x55\x4a\x55\xbc\x51\x48\xa8\x41\x9b\x8b\xa4\xce\x9e\xaa\xf8\x17\x95\xb4\x2b\x93\x7e\x14\x54\xdd\xf6\x15\xf6\x1f\x54\x29\x95\x74\x2b\x69\x4f\xb6\x65\xd2\x4f\x6a\xd0\x1e\xd4\xd6\x6e\x5d\x8c\xd6\x33\x19\xed\x2b\x56\xfc\xaf\xff\x63\x45\xd1\x67\x58\x94\x3b\x62\x96\x73\x77\x5c\x80\x04\x1a\xbf\xc5\x9f\xff\xaf\xfc\x79\xce\x7e\x86\xef\xe4\xcf\x1f\x7e\xc0\xec\xff\x47\xfe\xbe\x60\x3f\x3f\x58\x7d\xff\xeb\xbf\xb1\xfa\x3d\xb4\xba\xfc\xd7\xff\x68\x75\xf7\xaf\xff\xbe\x02\xff\x43\x86\x21\x16\x2c\xe7\xed\x1a\xd8\x6b\x1c\x7f\xfe\xcf\x6a\xfa\xc1\x03\x81\xe7\xcf\xff\xb5\x99\x86\xb8\xfe\xfc\x9f\x9b\x49\xff\x80\x49\xff\xca\x4c\x42\x01\xfe\xf9\xdf\x9a\x49\xd8\xad\x9f\xff\xb5\x99\x84\x5d\xfb\xf9\x3f\x98\x49\xd8\xbf\x9f\xff\x27\x33\x09\xfb\xf8\xf3\x7f\xac\x49\xab\xaa\xdc\x97\x93\x65\x23\xf1\xf3\x7f\x67\x8d\xc4\x5f\xff\x9d\x3d\x12\x3f\xff\xa3\x35\x12\x7f\xfd\x47\x6b\x28\x54\x37\x04\xbe\xff\x97\x35\x16\x3f\xff\x1b\x7b\x2c\xfe\x4d\xc5\x58\xfc\x0b\x13\x47\x17\x52\x3f\xff\x0f\x0b\x91\xfa\xf9\x7f\x91\x3f\x39\xb9\xff\x37\xf9\x93\x93\xfa\xdf\x7f\x3c\xca\x3f\xff\xdf\x15\x28\x7f\x5b\x42\x59\x53\xc6\xe6\x96\x22\xa7\x08\x94\xff\x95\x8d\xd4\xbf\xb6\x91\xfa\x0f\x36\x52\x36\x4f\xff\xfc\xdf\x56\x20\xf5\xc7\xa5\x52\xf7\x8f\x77\x19\x6b\x4d\xa9\x3f\xd9\x94\xfa\xd1\x1e\x22\x8e\xf2\xff\xb1\x90\x8e\xff\x6b\x05\xca\x47\x0b\xc4\x70\xaf\x28\x86\xbf\x2d\x8b\x21\xa7\xf5\x7f\xe1\x90\xcc\xff\xe6\x63\x25\xf3\x5f\x97\x25\xf3\x7f\x2e\x4b\xe6\xff\xf9\xc9\x92\xf9\x2f\xef\x3a\x5a\xff\x7d\x61\xb4\xfe\x2b\x5b\x32\xff\x3f\x5b\x49\xfe\x3b\x7b\x78\xfe\x77\x7b\x78\xfe\xb1\x62\x3c\x9e\x2f\x18\x8f\x07\xee\xf1\xf8\x2f\xcb\xe3\xf1\x4f\x52\x53\x76\x4b\xe3\xa1\x39\xde\xa9\x94\xfe\xed\xc7\x29\xa5\x4b\x5b\x3e\x9c\x3a\xea\x4e\xea\x80\xeb\x28\xb7\x19\x2d\xa2\x27\x54\xd9\xcf\x3b\x9f\x64\x3f\x6f\xdd\xbf\xbf\x06\xf7\xe1\xc5\x64\x2a\x5c\x91\x20\x1f\xcb\x47\x3a\x61\x42\xf3\x71\x12\x34\x20\x1f\x13\xf9\x00\x22\xe5\x05\xe4\x8d\x0b\xc8\x13\x20\xf0\x3d\x1d\x9c\x26\xfe\x7b\x9a\x33\x4b\x9c\x92\x49\x93\x81\xfc\x2d\xc7\x01\x70\x6b\x7c\x8b\x04\x41\x12\x67\x5b\x1c\x88\xf8\x07\x4b\x45\xa1\x4f\xe3\x8c\xc2\xab\x17\x67\x6b\xac\x27\xe6\x22\x9a\x17\xe3\x0b\x69\xdc\xe1\x4b\xf5\xed\xf4\xad\xfb\x9c\x31\xee\xc3\x61\x32\x99\x24\xf1\xef\x4e\x81\xc6\x57\x61\x9a\xc4\xac\x1b\x22\x6f\x0b\xff\x2d\xed\xe6\x73\xb8\x9e\x83\x26\x5e\x8b\xbb\x48\xdd\x1a\xd1\x41\xe6\x53\x9a\x0c\x81\x2f\x29\xf0\x04\x5b\x22\x58\x2b\xe3\x72\xc2\x01\x35\xdf\x65\x10\x66\x40\xae\x48\x18\x91\x41\x44\x2d\x74\x38\x24\xef\xbc\xd6\x6c\x6e\x35\x9b\x5b\x48\x9f\xda\x45\x43\x60\x65\x36\x5f\x84\xfe\x36\x22\x61\x0c\xe2\x50\xbe\xb2\xbb\xa2\x77\xd7\x78\x5e\xdf\x94\x27\x17\x1c\x2e\x5b\xd5\x69\xfa\xfe\x41\x3b\x4f\xd6\xf4\x3a\xaa\x76\xb0\xb6\xc6\x77\xb2\x34\xc5\xd8\x2a\x68\x8d\xa1\x82\xb8\xdc\x87\x9e\xc9\x0c\xa3\xf0\x8a\xc6\x16\x4b\xe8\xd4\x0c\xf9\xa2\x89\xb5\x78\xd5\xdf\x4e\x49\x4a\x26\xf0\x23\x36\x7e\x8b\xd5\x60\x13\xce\x0a\x4c\x35\x90\x4c\x48\x83\x6a\x80\x0a\x96\x62\xc0\x5b\x91\x2f\x20\x8a\x1f\x8c\x49\x39\x47\x33\x38\xfe\x2c\x4d\x69\x9c\xab\xe6\x0a\xb0\x06\x49\x12\x51\x12\xdf\xc2\x20\x0c\xc2\x94\x3f\x01\x48\x22\xd8\x84\xef\xc7\x34\x1f\xd3\xd4\xe6\xff\x6c\x9c\xcc\xa2\x00\x30\xe8\x42\x40\x72\xc2\x61\x2d\xfd\x88\x2e\x09\xfc\x48\x06\xd7\x34\xaa\x46\x04\x5f\x3d\xa6\x41\x01\x87\x94\xc6\x01\x4d\xc3\x78\x04\xc9\x10\xc2\xd8\x4f\x26\xec\xfb\x6a\x48\x08\xb4\xc7\x64\x8a\xef\x93\xc6\x59\x4e\xe2\x3c\x9a\x43\x92\x02\x13\x75\x98\x90\x9b\x70\x32\x9b\x2c\x07\x34\x4c\xf9\xf2\x7e\xce\x90\x68\x1b\x38\x4d\x69\x0a\xed\xd6\x24\xe3\x9d\x62\x9c\x29\xd5\xb5\x18\x8a\xa2\x13\x6f\x43\x50\xa3\x61\x13\xbe\xa1\xba\x2f\xa5\xcd\x1e\x97\xae\x92\xd0\x42\x7a\x17\x6a\xea\x19\xb3\x5a\x1d\x9e\xf2\x55\xfe\xbe\x5d\x4c\x78\xbc\xd1\x74\xd2\x14\x63\xd1\x15\x68\x20\xbf\x8b\xac\xcb\x61\x34\xcb\xc6\xfc\xf1\x69\xa7\x87\x9b\x28\xc7\x5f\x6a\xe6\x55\x78\x2f\x39\x57\xf2\x9a\x6a\xaf\xb6\xaa\x80\x75\x2b\x0e\x00\xef\x25\xc8\xc0\x12\x55\x75\x58\xfe\x72\xc8\x58\xca\x02\x7f\x6b\xf5\x6f\x3a\xcb\xc6\x67\x89\xa3\x83\xa6\x87\xb3\xd0\xc1\x55\xbd\x33\x8f\xeb\xaa\x3a\xa8\xc2\x79\xf0\x72\xb7\x25\x5f\xd1\x6a\xca\x98\xf5\xac\x90\x1b\xa5\x11\x32\x62\x68\x18\xbb\xe2\x46\x6f\x47\x34\x7f\xa5\x1e\xb8\x76\x45\xfd\xe1\x3d\x2d\xf2\x9d\x9b\x5c\x1e\xbd\x6a\x5a\xcf\xa6\xbb\x3b\xc5\x59\xa3\x54\xd6\x81\x1d\x53\x25\x7d\xfe\x40\x7e\xd5\x38\x08\x1d\x88\xef\xcd\x1b\xf0\x24\x1c\x91\x5d\x72\x62\xac\x89\x17\xb4\x6b\x8d\x12\x21\xea\xa2\x2a\xf6\xdb\x14\x90\x02\x87\x27\xb1\xf2\x2c\xb7\xb1\x55\x8e\x14\x8b\x31\xf0\xa3\x24\x53\xed\x07\x94\x8d\xb3\x78\x62\xd4\xd0\x00\xd2\x4b\xb9\x12\x0a\x46\xbc\x58\x0d\x4a\x61\xde\xea\xd3\xea\x79\x6b\x98\x26\x93\xd2\x44\xf3\x31\x13\x17\xc7\x88\x06\x6e\x88\x77\x9b\xba\x10\x04\x0f\xb8\x94\x27\x02\xb2\x39\x8b\x2d\xd7\xd0\xf6\x34\x67\x2a\x62\x01\xad\x4a\x11\x2b\xf7\x5d\x1c\xf8\xe1\xb0\x7a\xe4\x8d\xd1\x32\xf4\xb1\x4c\x28\x2b\x62\x43\xdd\xee\xdb\xea\x96\xf1\x9f\xdd\xba\x62\x03\x97\x93\xec\x62\x8e\x36\x18\x52\x9e\xfc\xea\x96\x1d\xcc\x61\x19\x35\x45\x2b\xc1\x65\x85\x38\x98\xe3\xef\x96\xc8\x3f\x01\x4b\x04\x25\xb8\xf4\xfa\xbf\x25\x08\x2b\xda\x22\xd2\x11\xcc\x32\x6d\xc4\xf9\xec\x32\x10\xcb\xd4\x53\x89\x03\x17\xa8\x93\x5f\x5c\xa7\x14\x49\xea\xd0\x2d\xb6\x5c\x17\x28\xc7\xcb\x5b\x94\x33\x08\x64\x17\x3e\x58\xbb\x65\x4a\xc7\x5e\x06\xef\x7e\x8e\x65\xf0\x71\x68\x90\xdb\x4f\xa2\xd9\x24\xce\x80\xc4\x01\x06\x12\x90\xa2\x12\x84\x13\x1a\x67\x61\x12\x67\xc8\xee\x79\x06\xfd\x37\xaf\xd4\xd5\x81\x35\x40\x48\x5f\x7d\x05\xbd\xe9\x34\x4d\xc4\x32\x77\x13\x4e\x30\x14\xc1\x59\x3a\x8b\x7d\x82\x3e\x28\x0c\xd0\x55\x98\xf1\x8b\x02\xb6\x28\x73\x2f\x76\x09\x12\xc6\x14\x6f\x2a\x0f\xe6\x76\xa9\x34\xb9\x16\x59\xb2\xd1\x4d\x38\xe4\x38\x7f\x64\x43\xd7\x61\x90\x8f\x4b\xed\xf8\x63\x92\x12\x3f\xa7\x29\x6b\x82\x17\xf1\xd0\x0f\x01\x82\x30\x9b\x46\x64\xbe\x0f\x61\x8c\x97\x19\x49\x5e\xc6\x90\x51\x2f\x97\xc8\x30\x62\x71\x08\xd7\x61\x5e\xe0\xb9\xfb\x10\xcf\x26\x03\x9a\x32\x24\x05\xe9\xeb\xd5\x1b\x09\xc3\x30\x67\xff\x2f\xdd\x42\x18\x86\xf9\xe7\xdf\x3f\x18\x86\xf9\xaf\x6d\xf3\x80\xf5\xf3\x93\x77\x0e\x58\xbf\xee\xb6\x6d\xe0\xdc\x25\x90\x32\x3d\x4d\x93\x69\x92\xd1\x6f\x74\x68\x0f\xf7\xb5\x4d\xee\x75\xc3\xf4\x87\x14\x22\xce\x97\x47\xc5\x0b\x3a\x42\x0d\x18\xab\x18\xfc\x9b\x21\x61\xd5\x38\xcd\xe7\x78\xa3\x51\xf4\x65\x44\xf3\xc3\x64\x32\x9d\xe5\x34\xc0\x1c\x6f\x41\x5b\x7a\xbb\xd1\x4a\x7f\x4e\x45\xb0\x80\x29\xc1\x4b\x81\xb9\x57\x6e\x90\xb5\x23\x8f\x9c\x7f\x4f\xa2\x19\xf5\x6a\x5c\x3c\x6b\xf5\x2a\xb0\x18\x75\x02\xba\xdc\xa5\x7a\x42\x6e\xbc\x56\xe3\x8e\x2d\x5c\xcb\xb8\x15\x9b\xd0\x7e\x60\x34\x43\xef\x4e\x89\x72\xed\xb7\x24\x08\xc2\x78\xf4\x7b\x5c\x80\x29\xbc\xe8\x62\x8c\xa6\xbc\xd2\x66\x9e\x4c\x19\x5e\x1b\x77\xae\x38\xc0\x2b\x85\x16\xd1\x6c\x7c\x9e\x27\x1f\x83\x4f\x2a\x86\xe2\x23\x30\x8a\xe8\xd0\x1e\x44\x25\x9b\x26\x5f\x94\xb8\x65\xb3\x4c\x47\x07\x08\xc9\x03\x0e\xc6\x28\x02\x78\x9e\x18\x00\xfc\x24\xce\x49\xc8\x3d\xf5\x70\x18\xd3\xe4\xfa\x50\xa6\x19\xcf\xba\xcf\xd0\x25\xe2\x24\xb9\x76\x95\x6b\x0e\xc3\x34\x93\x8d\x62\xdc\x23\xbb\x01\x1a\xeb\x15\xb8\x86\xd4\x0c\xe3\x98\xa6\xcf\xcf\x5e\xbd\x34\x4a\xcb\x59\x82\x77\x5e\x67\x30\x9d\xe3\x28\x86\x3d\x34\x1b\x8b\x8c\x52\x32\x1a\x90\x5c\x5a\xe8\x96\x79\xf4\x4c\x31\xf1\x40\x17\x6a\x7c\xea\x91\x91\x38\x1d\x28\xb2\x42\xdf\xd7\x0e\x60\x6b\x4b\x68\x7a\x8d\x03\x3a\xe2\xf1\x48\x46\xcc\x50\x44\x59\x6a\x00\x89\xf2\x71\x32\x1b\x8d\x21\x89\x61\x92\xc4\x49\x36\x25\x3e\x57\xc2\x36\xf2\x36\x49\x46\x34\x7f\x96\xcc\x62\x36\x4c\x87\x51\x48\xe3\xfc\x84\xfa\xb9\x57\x6f\x22\xd0\x12\x76\xa5\x6e\x70\x04\x4f\xe8\x15\x4d\x73\xc0\x5c\x18\xd0\x61\x92\x52\xf0\x49\xe4\xcf\x22\x92\x33\x0c\xb9\x3e\x69\x40\x16\xc6\x3e\x4e\xed\x73\xbc\x8b\x42\xd3\xe6\x9a\x63\x0c\x56\x43\x90\xc3\x5c\x48\x3f\x8b\x13\xc4\x98\x88\x9b\xb8\x4a\x94\x8a\x22\xb1\x55\xc4\x46\x2c\xc8\xc4\xf5\xdc\x72\x3d\x4e\xd3\xad\x02\x91\xe5\xea\xd2\x88\x0f\xf5\x23\x0f\xef\xc4\x03\x44\xf1\x08\x4f\xec\x6f\xdb\x21\x51\x73\x90\xb4\x21\xe5\xac\x34\x2c\xba\xa1\x16\x02\x08\x18\x2d\x55\x4c\x64\xbc\x8a\xb1\x62\x95\x55\x0a\x9b\x25\x3c\x42\x95\xca\x15\x21\xad\xd4\x4f\x0c\x41\xa9\xe7\x31\x8e\x65\xd1\x8e\x5e\x34\x87\x56\x98\xd2\x25\x6c\xc7\x61\x66\xd8\xd2\xc5\x16\x8a\xf4\xa8\x80\xca\x6c\x83\x02\xa4\x15\xac\xf2\xbd\xcf\x62\x95\xcf\xa2\x28\xf3\x53\x4a\x63\x40\xeb\x0f\xc5\x56\xde\xb8\xa8\xb6\x10\x55\x2d\xe3\xab\xd3\x5e\x34\xcd\x45\x55\xf2\x0b\x58\x8d\x0a\xf6\xaf\xce\x78\xd4\xbd\xfe\x74\x1b\x52\xf7\xf2\x33\x98\x92\x6a\x65\x7c\x96\x8c\x46\x11\x75\x6c\xdb\xd5\x32\xa3\x49\x46\x74\xda\xbc\xcb\x76\x5d\xce\xe1\x32\x10\x60\xc0\xa8\xd8\xff\x30\x5a\xda\x94\x28\x19\x69\xa8\x4e\x90\x5b\x12\xb6\x8c\x19\x82\xc7\xef\x6a\x97\x76\xde\x78\xab\x8c\xaf\x4f\x79\xcd\xf2\x1e\x5c\x91\x13\x39\x81\x86\xb1\xa1\x76\x04\x7f\x18\x08\x14\xf7\xda\xa4\x3a\x1a\xc6\xea\x76\xb0\x34\x7b\xfd\x88\x64\xd9\xcb\x30\xc3\x30\xc1\xcc\x18\xc8\xbc\x9a\x86\xc4\xec\xa4\xa7\x50\xe3\x7b\x6e\x35\xd8\x87\x1a\x09\xa4\x97\xa9\xc1\xa1\xf7\xca\x58\x8a\xc6\x64\x55\xab\x8a\x5d\xc2\x80\x68\xec\x7f\x97\xf0\x3b\x1f\xc6\x17\x36\x6a\xd5\xba\x4c\xd3\x35\x2b\xd3\xb5\x8c\x6b\xd5\x70\x88\x6d\x88\xa2\x58\xac\xaa\xf4\x1e\x7c\x0e\xa5\x77\x36\x0e\x33\xa1\x43\x60\x9a\x26\x57\x61\x40\x33\x71\x20\x9f\xa1\x02\xe4\x7b\x4d\xcc\x2a\x20\x85\xe3\x78\xf1\x2b\x48\x9c\x07\xf3\x95\x0a\x53\x55\xd3\xdf\xfe\x7e\x42\xff\xf7\x13\xfa\xbf\x9f\xd0\xff\x27\xb3\x2f\xae\xf4\xa1\x94\xff\xde\xdf\x8f\xea\xff\x7e\x54\x8f\x9f\x5f\xef\x51\x3d\x53\x83\x01\x3f\x2f\xff\xdd\xe9\x9b\xd7\x4d\x5c\x59\xaa\x93\x76\x45\x0e\x0f\x0b\x9d\xb7\x2e\x18\xbb\xad\x67\x79\x90\xcc\xf2\x75\x28\xde\x21\x75\x9d\xf9\x3b\x4f\xfd\x11\x58\xfb\xc2\xbc\x7f\x57\x8e\xaa\x6d\x70\x9a\xa3\xfc\x82\x6e\xdf\xd1\x07\x00\xfb\x9d\xe1\x4b\x35\xe1\x70\xee\x9d\xd7\xb2\x3c\x08\x63\x11\xfd\xed\xa2\x5e\x77\xf1\x51\x46\xf3\xd3\xe2\xbb\x0f\x6c\xb9\xba\x6a\x0b\x34\xbf\x14\xf1\x97\xd9\x3f\xb8\x98\x15\x5f\xd9\x32\xb7\xd4\xe8\x2f\xea\x93\x60\x15\x55\x71\xa3\x2d\x3a\xd4\x97\xe1\x69\x79\x2e\x28\x05\xd9\xff\x2c\x2e\x0c\x2b\x82\xfb\xbb\x2f\x43\xb5\x2f\x43\x81\x84\x7f\x77\x6a\xf8\xbb\x53\xc3\x7f\x62\xc6\x5b\x69\x2d\xbc\xc0\x88\xfb\x38\xef\x86\x02\xc4\xbf\xbb\x39\xd0\x85\x6a\x67\xa1\xbf\x43\xa1\xe2\x27\x38\x3e\x3c\xfc\x15\xdd\x9f\x65\xb6\xd8\x37\x4c\x89\x85\xfe\x65\x1b\xba\xae\x56\xbd\xed\x1d\x51\x30\xcc\x5e\x63\xfc\x23\xa5\x5b\x63\x72\x15\x8e\x08\xc6\xf9\xab\x5c\x12\x88\xc8\x82\xac\xfe\x2c\xa3\x69\x6f\xc4\x58\xa7\x8b\x4f\x54\xe1\x7b\x88\x4f\xa1\x16\x27\x01\x6e\x59\x29\x70\x4d\x55\x92\x57\x9c\x46\x24\x1f\x26\xe9\x64\x69\x3d\x59\x50\x5f\x35\x09\xb3\xe3\x30\xa5\xc3\xe4\x06\xba\x70\xef\xde\x4f\x0a\xb0\x8a\x24\x5c\x13\xf9\xb5\xba\x59\xe9\xd5\xe9\x8b\xa3\xca\x1a\x2c\xb3\x86\x6f\x6b\xb9\xf3\xcf\xd2\x30\xa0\x71\x5e\x80\x48\x7c\xe8\x6a\x5a\xeb\x4d\xbc\xf3\xda\x2b\xe2\x87\x71\x9e\x64\xe3\x5a\x03\xd8\x8f\x17\x71\x4e\x23\xf1\xfd\xed\xdb\x43\xf1\x6d\xef\xe1\xb7\xb5\x8b\x86\xa2\x85\x05\xfc\xc5\x94\x04\xd0\x35\xe8\xc4\x86\x23\x7c\x4b\x82\x9a\x5d\x6a\x9c\x60\x04\xeb\x62\x39\x96\x5c\xb3\xbb\x2f\x83\x07\x56\xa0\x2c\xb2\x19\x6a\xdf\x87\x71\x7b\x4f\x7c\xd9\xee\x88\x2f\x87\x47\x95\xb8\xbe\x0c\xe3\xd9\x8d\x81\x84\xa6\x1b\xe6\xd4\xea\xf0\x04\xa3\x3a\xbb\xef\xd6\x3c\x13\x01\x0e\xdd\x57\x6b\x1e\xfd\x8a\x44\x4b\xe9\x15\x3c\xc3\x4f\xd2\x20\x3b\xa1\x11\xc9\xc3\x2b\x7a\x96\x88\xf3\x5b\x0f\x63\x75\x34\xa0\x10\xd8\x94\x07\x60\xe4\xae\x0e\x23\xfa\x07\xd7\xcb\x9f\x0b\x1c\x2b\x6e\xf0\xf9\x4e\x55\x5b\x87\x16\x9b\x5b\x19\xe2\x65\x1a\x11\x7f\x48\x3a\x14\x7d\xfd\xb5\xf2\x2d\xba\xd7\xed\xf2\x77\x10\x83\xc4\xc7\x20\x2c\xea\x4b\xc9\xcd\x03\xe0\x06\x36\xbb\xca\xa3\x2a\x19\x0e\x33\x9a\xbf\xa4\x43\xe3\x7d\xaf\x79\xb9\xc0\x59\x32\xd5\xf9\xb2\xd5\x2e\xd4\x78\xee\x5b\x3c\x5d\xaf\x41\x18\xab\xbc\xa7\x05\x00\xbc\x08\xec\x83\xd3\x33\xc4\xa4\x8b\x20\xd7\xf9\x4d\x03\xe6\x17\x07\x6b\xb7\x8a\x1d\xab\xc7\x06\xba\x0b\x06\xce\x35\xba\x72\x30\xad\x53\x7d\x30\x9e\xe0\xc1\x67\x6e\x0e\x93\x99\x2a\x84\xdf\xc2\xec\x14\x9f\x12\x0e\x13\xeb\xdc\xc0\x47\x98\x0b\x91\x70\x35\xa8\xce\x6c\x59\x0d\x5c\x3b\x73\x57\x15\x9f\x86\x91\xe7\xe9\xe4\x0d\xa6\x48\x55\xc3\xf0\xd4\xc4\x93\x9f\x80\xc3\x16\x74\x60\x1f\x5a\xf5\xba\x38\xe2\xb5\x72\xed\x76\xda\x76\x3b\x3a\xd5\xae\x39\xb6\x8f\x95\x0b\x28\x4e\xc2\xd8\x53\x6e\x35\x2a\xb7\x01\xed\xba\x26\x1c\x3e\xab\x55\xd1\xb4\xab\x7e\x5b\xd4\x97\xe4\x36\xea\xcb\xe8\xf7\x58\xd0\xc9\x12\x26\xf1\xed\x01\x3f\x21\xd7\xcf\xe6\x39\xfd\x84\x71\x5f\x3c\xd4\x1f\x07\xf2\xc0\x52\x01\x8a\x82\xb6\x02\x50\x84\xe1\xc9\x37\xb0\xd1\x85\xed\x0e\xff\x31\x37\x7f\x08\xfa\xfc\x08\x37\xf8\x30\xd3\x1c\x5f\x65\x2a\xd0\xc9\xa2\x03\xef\x80\x95\x54\xa5\xc4\x5f\x25\xb3\x8c\x56\x05\xdf\x6b\xfd\x8a\x74\x38\xa3\xda\x80\xa4\xb4\xc2\x32\x6a\x4b\xcb\xe8\x39\xae\xc7\x17\x07\xe6\xc3\x32\xa8\x68\x4b\x81\xf2\x58\x22\x70\xf5\xa8\x35\x22\x6b\xb7\x39\x16\x37\x26\x30\x9a\xf3\x69\x9e\xa4\x7c\x63\x2d\xa6\xd7\x3c\x3f\x0a\x07\x4d\x91\xdc\x7c\x45\x27\x49\x3a\xf7\x8a\x71\xe0\x05\x6a\xaa\x0a\x07\x29\xcf\x30\x9c\xc5\xb9\x67\x15\x1d\x66\x5e\x1d\xa3\xd5\xaf\xb3\xe5\xdc\x26\x8d\xfd\x24\x08\xe3\xd1\x7a\x03\xd6\x53\x72\xbd\xee\xac\x19\x50\x3f\x49\x49\x2e\x42\xce\x63\x6f\x0b\xc5\xc2\xc4\x7c\xed\xa1\x19\x26\x3c\xc4\x9f\x13\x1a\x2e\xc4\xa2\xe8\x5b\x3a\x1f\x24\x24\x0d\xec\x97\x03\xf8\xf7\xe7\x05\x03\x3f\x8c\x87\x49\xc5\x3e\xb2\xc1\xd4\xbe\x74\xbb\x95\x51\xe7\xd9\x2f\xe9\x9c\xa2\x63\xac\xdf\x5a\xa1\xb3\xdc\x0d\x26\xb3\x7c\x3a\xcb\x17\x6c\xfc\x19\xc1\xee\x44\x8f\x5d\x71\x84\x0b\x1d\x4f\xf8\x36\xe4\x77\x67\xc7\xed\x3d\xcf\xba\x82\x54\x08\x1c\xe6\x46\x2a\x1b\x27\xd7\xae\x7d\x58\xb1\x53\xd1\x80\x9c\xef\xf0\x96\x58\x71\xa2\x2a\x89\x6f\x07\x76\x2f\x78\x35\xd7\x23\x95\x16\xf2\xac\xfd\x37\x57\x34\x8d\xc8\xbc\xdc\x66\x79\x4b\xd5\xf9\xc0\xe1\x72\x80\x48\xc3\x3b\xd1\x85\x6f\xdf\xb8\x28\x63\x76\x67\x6b\x8b\x2d\x3b\x53\x0a\x61\x06\x71\x02\xe3\x30\xa0\xb2\xed\x3a\x5b\xf3\x01\xc3\x86\x6f\x58\x90\x09\x95\x94\xe2\x2e\xd2\x2d\xc8\xa8\xef\x62\x65\xbb\x0f\x26\xb1\x1b\xd0\xb2\x03\xf2\x95\x46\x93\xe6\xdc\xe0\x5e\xf2\xf2\x87\xdd\xa2\x5d\xcb\x93\x6f\x80\x2c\xe7\x1d\x2e\xfc\x34\xc5\x20\x50\x56\x6b\xa8\x1f\x8b\x21\x00\x2f\x59\x93\xd6\x6b\xdc\xec\x63\x86\xb8\xe5\xd5\x1c\x11\xfd\xdf\xd3\xd2\x33\x92\x97\x95\x5a\x08\x43\xe3\x22\xa8\xf3\xf7\x74\x6e\xed\xcc\xaf\xd2\xad\x24\x7e\x11\x17\x05\xd5\x27\xfc\xcd\xe2\x12\x01\xc3\xa4\x99\xc4\xbf\x3f\xfb\x96\xce\xb3\x3c\x4d\xde\xd3\x85\xe2\xcd\x3e\x12\x52\x49\x56\x4b\xda\x0f\xf7\xe7\xf9\x2b\xf5\x9f\x0a\x75\x49\x7f\x4f\xca\x0f\x45\xbb\x3a\x5c\x3d\x86\x9a\x14\x72\xba\x70\x81\x34\x95\xa7\x7b\x34\xe5\xc5\x8c\xae\xd4\xbb\x07\x8e\x42\xc2\x3f\x51\x3f\x12\x52\x22\x82\xdd\xd2\xdd\xa8\x11\x50\xe2\xe7\xe1\x15\xc9\xab\xa5\xbe\x6a\xe0\xcd\x73\xc3\x8a\x51\x74\x17\x71\x90\xcd\x51\x10\x11\x9d\xc5\x55\x53\x5d\x95\x1e\xab\x7a\x7d\x05\xf4\xa3\x21\x86\xaa\xbb\xdb\xf4\xea\x6e\x13\x0f\x54\x16\xb7\xb9\x52\x5f\xc4\x24\x8c\xe0\x8b\xa1\x27\xa5\x21\x25\x32\x8b\xb6\xe1\xaf\x29\x32\x33\xc6\x90\x4c\xe2\x98\x2f\xa1\x8e\x89\x9f\x27\xe8\xee\xb9\xc8\x06\x2c\x95\xf7\x66\x69\xd4\x00\xa4\xb1\xf3\xd5\xa3\x59\x1a\x41\x17\x66\x69\x91\x69\x54\x0d\xe8\xea\xda\x65\xe3\xa8\xd4\x9e\x39\x9c\x29\x5d\x24\x0d\x72\x87\x81\x5e\x1b\x50\x3c\x89\x54\xa3\x80\x86\x4b\x01\x0b\x08\x25\x1c\x8a\x63\xee\x22\xa2\xa3\x92\x4d\xef\x95\x09\xbd\x8c\xc2\xc2\xbc\x67\xfd\x54\xdb\xd3\xc5\x3a\x26\x61\x35\x64\x53\xd7\x4e\x0b\xae\x6b\x05\x6b\x22\x4e\x72\x74\xfc\xca\x93\x20\x41\x5f\xb0\x6b\x3a\xd0\x87\x37\x36\xd9\x9c\x0d\xac\x20\x7b\x68\xdc\x63\x39\xcf\x35\x1a\x4e\xb0\x78\x4c\xb3\x68\x12\xd2\x90\x1d\x77\xd7\x97\x00\x0f\xb3\x37\x8b\xc8\xa2\x8c\x62\x04\x9f\x52\x12\xcc\x4f\x73\xe4\xc8\xae\x1e\x89\xe6\xe1\x9b\xd7\xaf\x8f\x0e\xcf\x5e\xbc\xfe\xc6\x8c\xc6\x6f\xa3\x56\x55\xf7\xcd\xdb\xa3\xd7\xee\x48\xc0\xc6\xdb\xb0\x60\x99\xa1\xf6\x73\x38\x46\x3f\xdd\xc3\x1e\x97\x7a\x58\x69\x51\x20\xa6\x49\x5c\xe2\x14\x5c\xea\x57\xce\xfb\x4b\x66\xb9\x0a\xac\x4e\xa8\x4f\xc3\xab\xe5\x33\xbf\x89\xd8\xc4\xe9\xb5\xb1\x08\x37\xbe\x97\xb8\x82\x65\x52\x81\xe5\x61\x89\xa7\x97\xe1\x58\x96\x82\x4f\xa2\x5e\x49\x41\x55\x6b\x26\x4b\x25\x95\xe7\xa5\x5f\x53\x6c\x63\xe3\x56\x81\x9a\x22\xce\xd7\xaf\xe9\x20\xcf\xe7\xeb\x46\xa8\xd3\x49\x36\x42\x83\xf8\xbb\xf8\x7d\x9c\x5c\xa3\x83\x6f\xab\x56\xce\x66\xe9\x6d\x3b\xfd\x2d\x37\x7a\x6a\x1d\x3b\x99\x1b\x39\xd2\xe4\x61\x05\xb6\xed\x02\xa2\xa5\x37\x72\xc1\x5c\x6c\x4f\x67\x14\x1b\x4c\x9c\x0d\x9e\x16\x97\x45\xc5\x06\x4f\x8b\x2b\x99\xda\x4e\xa9\xc0\x09\xf5\xf9\xc0\xb2\xec\xdd\x1a\x9f\x67\xbe\xa7\x83\xb3\xb3\x3f\x2e\x99\x63\x78\x21\xe1\xac\xe0\x17\x27\x2c\x1e\xee\xbb\x01\x64\x96\x8f\xcf\x92\xf7\x34\x76\x1a\x4b\xe2\x8a\x57\x61\x76\x2f\x01\xe3\x57\x7a\x8a\x33\xa2\x55\x47\x04\x62\x67\xff\x14\x73\x24\x06\x2c\x5b\x7e\x3f\x28\x1a\x8b\x9a\x0a\x9b\xed\xb2\x21\xc1\xfb\xba\xea\x8c\x57\xbd\xa2\xe0\xfb\x9d\x86\x54\xb9\xfb\x2b\x8c\x13\x53\x80\xf1\x1c\x30\x8c\x47\xe8\x6e\x67\x27\x2b\xe4\x85\xdb\x9a\x9d\x8b\xcf\xa2\x57\xa2\x0a\xfc\xde\x9c\xd4\x4f\x5c\xa3\x3b\x46\xdd\xfc\xe0\x4b\x5e\x34\x9d\xbc\xe0\x5b\x4d\x97\xa6\x41\x3d\x4c\x3c\xc7\xf3\x0a\x46\x0b\x2e\xef\xac\x72\x13\xec\xd3\x93\xc1\xef\xf7\x45\x13\xc8\x50\xee\xa2\x72\x58\x55\x51\x99\x50\x2e\x7f\x5b\x77\x20\xc8\xc9\xc8\xe4\xf7\xb9\xe3\xd9\x54\x3f\x89\x26\xb3\xaa\x25\x5e\x55\x1f\xab\x35\xc3\x06\xac\xd4\x7f\x0e\x54\xec\xd3\x49\x14\x2a\x4b\xea\x7b\x65\xce\x22\xce\x5e\xdf\x96\x93\x8c\xc1\x94\x0b\x68\xcf\x22\x8c\xf3\xf1\x0c\x23\xdf\x93\x9c\xa1\x77\x15\x55\x4a\x61\xdd\xea\x6c\x13\x95\xae\xc1\x80\x21\xfb\xfd\x11\x34\xe7\xca\x7b\x03\x78\x7d\x47\xdf\x1d\x69\x4a\xbe\xa0\xcb\xc4\x46\xbe\x44\xb9\x44\x1c\x96\x20\xc2\x66\x0b\x57\xfb\x0d\xc0\xa7\xad\xda\xad\x56\xab\x90\x5d\x44\xcd\x92\x4f\x61\xdb\x78\x8b\x37\x4e\x40\xdd\x32\x9f\x47\x09\x9e\x8d\xb3\x52\xfc\x99\x0e\xcf\xf5\x00\x4a\x76\x1d\xe6\xfe\x98\x03\x3b\x6f\x95\x1e\x90\x50\xa8\x90\x8c\x42\x69\xca\xda\xaf\xe4\x4a\x73\x68\xb1\xa8\x17\x50\x3f\x09\xe8\x77\x27\x2f\x0e\x93\xc9\x34\x89\x69\x9c\x7b\xc5\xc7\x44\x26\x64\x2a\x9e\x12\xc9\x93\x81\x27\xba\x50\x6f\x98\x02\x59\x85\x9f\xfc\x08\xd3\xa6\xf6\xcf\x6b\xb0\x01\x5e\xad\xd5\x62\xff\xfa\x4d\x7f\x4c\xd2\xc3\x24\xa0\xbd\xdc\x6b\xd5\x9b\x79\xc2\x37\x30\xbc\xf6\x5e\xbd\x2e\x68\xb3\xd9\x71\x10\x47\x0f\x4c\xf3\x5d\x12\xc6\x5e\xad\x56\x77\x89\x93\xfc\x14\x9e\x6b\x5b\x44\x3f\x36\xb3\x57\x53\xef\x0e\x80\x6c\x5b\x60\xa5\x01\x29\xec\x8f\x4a\x3a\x7f\x96\x7e\xd9\x96\x47\x35\x3a\xc8\xa3\x96\x89\x62\xb8\x44\x2f\xc7\xc8\xee\x8d\xd1\xa2\x67\x00\xfd\x6c\x3d\x52\xa6\xd2\xe2\xfe\x90\x59\x9e\x98\x56\xd5\x9d\x7a\xe4\x27\x71\x96\x44\xb4\x19\x25\x23\x6f\xfd\x28\x26\x83\x88\x19\x9b\x6a\x86\xdf\x87\x75\xd8\x28\xb4\xb0\x01\xeb\x90\xb1\x5f\x41\xb6\xbe\x94\x56\xa6\xa1\x63\x81\xb9\x33\x91\x6e\x57\xd7\x59\xb8\xd2\x59\xa2\x45\xf1\x46\x82\xd2\xb8\x4a\x13\x2f\x9e\x2e\xf4\xae\xa6\xcb\xea\x30\xb9\x43\x9f\x07\x79\xeb\xc6\xb2\x06\x31\x0b\xd6\xf5\x09\x84\xf9\x61\x2b\xf4\x22\xd5\x1c\x07\x3f\xf2\x53\x34\xc3\xf8\x24\x22\xaf\x12\x2c\x9f\x43\x6c\xb2\x29\xc3\x6a\x15\xe3\x70\x41\xcf\x71\xa7\x74\x51\x59\xb4\x0f\xab\x0a\xdc\x36\x4a\x7c\xe3\x9c\xb2\xe0\x4e\x0c\xc1\x4c\x4c\xf7\x19\x41\x09\x19\xb9\x21\x51\x6d\xbc\x9a\x37\x59\x8a\x43\x50\x8d\x83\xb5\x51\x04\x8b\x17\xc8\xdc\xf8\x2f\x2e\x8e\xd5\x1a\x49\x66\x97\x97\xc5\xbf\xa6\x97\x42\x96\x1c\xe5\xb3\x01\xe5\x27\xea\x09\x09\x7a\x41\x90\xc4\xde\xfa\x30\xcc\xd7\x45\xcd\x3f\xac\x70\xc0\xff\x07\xe7\x01\xff\x92\xd3\x15\xe7\xd1\xbf\xeb\xdc\xbe\xb4\x83\xaf\x37\x6c\x58\xe5\x66\x72\x1d\xd3\xb4\x2f\x5d\xb5\xb8\x88\x48\x47\xa1\xf5\x20\xbc\x2a\x1d\xd7\x8b\xfa\xfc\xde\xee\x6b\x32\x61\x90\xd6\xf1\xe6\xe4\x66\xc2\x0f\x29\xd7\xdd\x35\xb4\x78\x77\x5a\xad\x56\x69\x21\xc9\x6c\xe1\x97\xfa\x4d\xb2\x6a\xce\x35\x84\x74\x18\x96\x44\xd4\x54\x5e\xe2\x89\x7b\xfe\x74\xbd\xbb\xa0\xa9\xe0\x84\x55\x63\x40\xe0\x3b\xbf\x1b\xb0\x7e\xc3\xa6\x8f\x72\x3e\x1a\xe6\x52\xd4\xed\x6e\x2e\x38\xcb\x93\x37\x54\xd6\x99\x40\xaf\x37\x96\x76\xd5\xa6\x4d\xb1\x1f\xe2\x72\x69\xe9\xe6\xc9\x3a\xaf\x56\x84\x5f\x05\xd3\x52\x3c\xb7\xce\x63\x1f\xd4\x3f\x8c\x69\x1a\x28\x1e\x0e\xa7\x8a\xa2\xd7\xf4\xc7\x38\x55\x28\xc2\x5b\x6e\x15\x8a\xdc\x4e\x85\x53\x6c\x77\x05\xdf\x0a\x0d\x55\xdf\xdb\x72\x6d\x51\x17\x41\x7f\x8c\x87\xc4\x12\x59\x96\x12\x95\xd3\x9b\xfc\x90\x47\x60\x71\xf9\x51\x28\xb9\x6f\xe2\x6d\x83\x00\xa3\xf8\x58\x0e\x01\xc6\xa8\xa9\x5d\x72\x83\x2b\x4b\x6f\x3c\xda\xb7\x19\x4b\xa5\x5d\x1b\xdd\xab\x38\x73\x98\x40\xee\x32\x99\x5f\xea\x1e\xf2\x43\x48\xde\xc3\xcb\x8a\x2e\x02\x9f\x67\xab\xbc\x43\x16\x8e\xe2\x6a\xfe\x1c\x45\x22\x0a\x47\x51\xee\xcd\xde\xd5\x03\xe2\xa4\x42\xa9\x1f\x15\xdd\xb0\xb0\x2d\x71\xdb\x1d\x3c\x38\x94\xbf\x6d\x2e\xca\xe2\xbf\xab\xb0\xf4\x8a\x8e\x1b\x8b\x45\xee\x2e\x6e\x12\x4a\x03\x32\xa9\xb3\x34\xd4\x9d\xbc\x19\x56\x91\xd7\x95\xdd\x19\x6c\xc4\x1c\xca\x73\x29\x6a\x42\x6b\xe1\xd7\xa2\xab\xc1\x2a\xa8\xae\xea\x6b\xa0\xae\xb4\x71\xf2\xb9\x75\x35\xcb\x16\x9d\x70\x16\x18\x44\xb3\xb4\x70\xe0\x57\x16\x92\xcf\xe1\x2c\x80\x4a\x66\x49\x4b\x8b\x8f\x29\xc5\x0c\xe7\xba\x42\xa7\xc7\xc9\x31\xab\x55\x38\x1a\x66\x79\x9a\xcc\xdd\xbe\x05\x7f\x70\xf9\x16\x48\x1b\xee\x0f\x6e\xdf\x82\x4f\x7b\x96\xc3\x36\x56\xb7\xb6\x78\x38\x90\x61\x18\x51\xb8\x26\x19\x8c\x58\x3f\x48\x4e\x03\x18\xcc\x21\x0a\x07\x41\x92\x6f\x0d\xc2\x78\xcb\x4f\x62\x9f\xe4\xcd\x6c\xdc\x64\x75\x5e\xe4\x30\x26\x19\x0c\x30\xa8\x0d\x49\xdf\xd3\x00\x52\x4a\x82\xcd\x24\x8e\xe6\x78\x6c\x3c\x4f\x66\x29\x64\x64\x48\xf3\x79\x13\xe0\x84\xe4\x63\x9a\xae\xa1\xb7\x1a\x89\x81\x06\x61\x0e\x61\x0e\xfc\x56\x57\x34\x6f\xc0\x34\xa2\x6c\x15\x3f\x49\x82\x70\x38\x87\x24\xa6\x22\x9e\x28\x43\x15\x7d\x72\x59\x5d\x86\x63\xd6\x6c\x32\x04\xd8\x4f\x81\xdc\xbb\x6c\x2b\x0a\x07\xcd\x77\x59\x29\xed\x72\x9a\x44\xf3\x61\x18\x45\xce\x4c\x3f\x89\x92\x34\x73\x66\x0d\x9d\xa9\x42\x91\x5e\x4e\x48\x4c\x46\x78\xb1\xc3\xd1\xa2\xd2\x6a\x0b\x8b\xa5\x94\xf7\xca\x99\x99\x09\x2f\xd9\x05\x79\x97\xfe\x38\x4d\x26\x8b\x8b\x44\x89\x4f\xdc\x3d\x97\x25\x26\xe8\x86\xeb\x2c\x92\xd3\x2c\x5f\xd8\x83\x59\x3e\x7c\x68\x67\xe4\xe3\x30\x0d\x2e\xa7\x24\xcd\xe7\x5b\xd7\x3e\xfa\xde\x63\xc9\x6b\x5f\x94\x43\x77\x5e\x56\x9f\xfb\xf5\xba\x12\x2f\x87\x29\x51\xdd\x2a\x64\xbd\x17\x3e\x3a\x8b\x73\x2f\x07\x21\xc6\xa1\xcb\x96\x14\x7b\x4f\xe7\x13\x32\x5d\x5e\x68\x4a\xf2\x9c\xa6\xb1\xbb\x60\x32\x65\xa2\x57\xd1\x14\xee\x23\xa5\x8b\xf2\x2e\xf1\xf2\x55\x38\x0c\x69\x5a\x05\xa3\x8a\x9d\x8a\xe5\x66\x83\x6c\x36\x70\xe7\xf1\x30\x43\x95\x79\x49\x14\x31\x85\xe1\xce\x57\xb7\x14\x17\xe6\x5e\x86\x49\x55\x81\x9b\xfc\x92\xe4\x79\x1a\x0e\x66\x39\xad\xe8\xe3\x55\x45\xdb\x57\xf9\xa5\x8a\xd7\x77\x59\x39\x56\x5c\xdd\xf1\xbc\x35\x96\x7f\xfa\xe6\xbb\x93\xc3\x23\x38\x7e\xf1\xf2\x68\xdf\xa9\x22\x0e\x93\xe9\x1c\x03\x76\xe2\xe6\x74\xa7\xd5\xee\xe0\xcd\xce\x43\x26\x51\xe1\x6c\x02\x6f\x4e\xf1\x90\x8a\xe9\x06\xe8\x45\x11\x60\xd9\x0c\xd8\xd4\x94\x5e\xd1\x00\xd5\xdf\x77\x99\x50\x50\x61\x26\xf4\x13\xf8\xcc\x44\x0b\x33\x18\xb1\x25\x69\xcc\xd5\x27\x81\x67\xa7\xfd\x4d\x1e\x72\x51\x86\x3a\xc2\x07\x8f\x7c\x12\xc3\x80\xeb\xb4\x64\x16\x07\x10\xc6\xe8\xa3\xfb\xf2\xc5\xe1\xd1\xeb\xd3\x23\x54\x74\xcd\xb5\xb5\xb5\x35\x23\x04\x51\x14\x0e\xe0\x9e\x7d\x75\x71\x8d\xcd\x32\x69\x72\x8d\x2b\xef\xa3\x34\x4d\x52\xaf\xf6\x4d\x94\x0c\x48\x04\xeb\x51\x38\x58\x87\x04\x37\x22\x80\x44\xe8\x77\x02\xf4\x26\xcc\xf2\xac\x59\xab\x1f\xac\xe1\x56\x01\x03\x29\xa2\xfb\x88\xc8\x50\xaf\xc8\x94\xf5\x6b\x3d\xa0\xcc\xdc\xa7\xb1\x3f\x5f\x87\x3c\x81\xf3\x75\xde\xc9\xf5\x06\x34\x9b\xcd\x0b\x19\xea\xe9\x88\xf8\x63\xd0\x45\x31\xe8\x91\x6c\x33\x26\x13\x7c\xb7\xfc\x3d\x45\x5c\x9a\xc3\x6c\xbd\x01\x12\x0c\x2b\xc9\xfa\x3b\x4b\x23\xa4\x07\x03\xc6\xe1\x64\x90\x70\x52\x70\x30\x4d\x8c\x0a\xc5\xea\xa7\xb3\x98\x99\xdd\x7d\xd9\x5a\x48\xb3\xcb\x02\xf2\x6c\x12\x06\x0c\x5a\xc6\xa7\xc4\x8c\xd3\x3a\xa6\x3c\x8a\xd0\x80\x42\x18\x5f\x25\x6c\xaa\x0a\x78\x50\xce\x28\x1c\xa4\x24\x9d\x43\x18\x87\x79\x48\xa2\xf0\x2f\x04\x37\x9c\xcc\xde\xc9\x0b\x5d\x62\x80\x58\xc9\x43\x61\x80\x65\x97\x40\xd2\x94\x60\xb7\xc3\x3c\xa3\xd1\x10\x08\xe4\xd7\xc9\xa6\xac\x83\xb9\x18\x66\x5a\x5e\xd4\x6a\x71\x12\x65\xe3\x04\x23\x71\x22\x12\x01\xcd\xfc\x34\x1c\xa0\xcf\x15\xeb\xf7\x75\xcc\xe3\x54\xcb\xe6\x20\x4d\x66\x79\x18\xd3\x06\xcc\x32\x3a\x9c\x45\x0c\x1e\x9b\x60\x03\x3a\x98\x8d\x46\x61\x3c\x6a\x82\x82\xdf\x96\x84\x95\x46\xa2\xa2\x85\x26\x64\xa1\x0b\xfc\x41\x74\x49\xc2\x13\xea\xe3\x05\x19\x02\x82\xde\xc6\xf0\x4a\xba\xa0\xb9\xc0\x19\x58\xa0\x04\xd7\x63\x1a\xb3\x19\x1f\xae\x49\x8c\x77\xf6\xe9\xcd\x34\xa5\x99\x80\xb3\x59\x00\x04\x7c\xc0\xfd\x64\x32\x65\x46\x07\xcb\x6d\x02\xb3\x28\xd0\x87\x9d\xd1\x3a\x67\x25\xe5\xa0\x11\x0c\x96\xb6\x39\x8c\x68\x30\xa2\x81\x1a\xb4\x6c\x9e\xe5\x74\x02\x49\xaa\x99\x07\x81\xe7\x29\xf1\xdf\xd3\x14\x21\xd6\x32\x78\x37\xcb\x72\xe1\x22\x9f\x27\x30\x21\xef\x29\x33\x3c\xa6\x49\x96\x85\x83\x88\xf2\xdb\xdb\x83\x19\xd2\x5e\x00\xca\xd0\x3b\x9e\xad\x36\xd3\x59\x1c\x63\x10\xb4\x28\xe2\x54\xe5\x11\x00\x91\x0a\x6f\x34\x9b\x67\x40\x52\x0a\xd9\x94\xfa\x4c\x95\x07\x40\x32\x31\xb6\x59\x13\xe0\x38\x49\x81\xde\x90\xc9\x34\xa2\xcc\x72\xe1\x95\xd9\x07\x99\x3a\x0f\xe8\xd4\xab\xb1\xaf\xdc\x1a\xa9\x35\x00\x7f\xe9\xc5\xd1\x2b\xae\xf6\x31\x32\x5d\xb9\x61\xe4\x6d\x46\xb3\x01\x85\x34\x49\x84\xd5\xc6\x40\xd4\x9a\x00\x7f\x4c\x66\x30\x21\x73\x36\x4a\x5c\x55\x61\x6f\xfd\x88\xa1\x4b\x0a\x64\x4b\x62\x20\xf1\xdc\x10\x3b\x3e\xd4\x14\x7c\x0c\xe8\x0a\xd3\x34\x19\xa5\x64\x82\xf0\x18\x77\x21\xfe\x34\xce\x66\x29\x3d\x29\x8b\xa6\x57\x07\xc2\x38\x9c\xa4\xf9\x6c\x0a\x21\xc6\xc6\x4c\xd2\x80\xa6\xc8\x1c\x58\x4b\xbc\xfc\xc6\x14\x6c\x91\xd5\x42\x9a\xc1\x98\x5c\x51\x61\x5e\x52\x85\x8f\xbc\x9d\xcf\xc9\x7b\x0b\x57\x24\xbd\x44\x6f\x92\x37\xcc\x60\x4c\x61\x92\xa4\x52\x73\x64\xee\x01\xd1\xfa\x84\x91\xde\xb0\xff\x3d\x09\x4b\x47\x8c\xe4\xca\x0a\xef\xca\xe7\xe9\x5c\x06\xf7\x28\x28\x5c\x11\xb1\xcd\x27\x78\x26\x4b\x6f\xcc\xeb\x72\x59\x4e\xfc\xf7\x78\x64\x8a\x01\x5f\x9b\xf8\xbb\x99\x4d\xa3\x30\xf7\x6a\x3f\x88\x68\x83\xe8\x75\xf9\x22\x86\x53\x32\x24\x69\xd8\x10\xf1\x21\xb2\x59\x84\x51\x79\x0d\x10\xd7\x61\x14\x01\xda\xd7\x48\x9b\x8e\xd4\x4d\xfc\x15\x01\xe4\x5f\x0e\x8c\x19\x40\x57\x61\x30\x23\x91\xec\x36\x32\xe8\x30\x49\x27\xcc\x98\x09\x44\x5c\x5f\x1a\xe7\xd1\x9c\x07\xf7\xc5\x28\x22\xaa\xa5\x66\x44\xe3\x51\x3e\x86\x27\x5d\xd8\x36\xa3\x8a\xe0\x34\xd7\x35\x50\x3a\xef\x5c\x34\x53\x3a\x8d\x88\x4f\xbd\xad\x7f\xf8\x21\xbb\x4f\xf2\x1f\xb2\x8d\xad\x06\xd4\x64\xd7\x0a\x81\x8b\x5c\x30\xda\x05\x18\x23\x3e\x81\x31\x59\xfb\xad\x05\x6a\x4d\x04\x27\x61\xca\xcf\xc3\x4b\xfe\xd0\x85\xd6\x01\x84\xf0\x18\x88\x74\x40\x11\xb8\x1f\x40\xb8\xb1\x61\x0e\xc5\x94\x60\x50\x65\x55\xee\x3c\x14\xd7\x0a\x59\xd7\x31\x93\x47\xd2\xf0\xd9\x54\x8b\x88\xe9\x9e\x2b\x76\x69\xe2\xd3\x04\x5e\x14\x0e\x1a\x08\xd0\xdd\x49\x3c\x58\x44\x47\x28\xbe\x40\x74\x4c\x5c\xe7\xac\xf6\x85\x5c\x2b\x62\xb4\x4b\x92\xce\xeb\x6a\xed\xb8\x52\x75\xa1\xba\x55\x0d\x7e\x39\x8d\x93\xd8\xa2\x99\x31\x45\x1e\xa1\xe8\x65\x4b\x64\x8f\x71\xcb\x84\xe6\x0d\x8c\x29\x12\x03\xbd\xf1\x29\x1a\xba\x7c\x76\x49\x93\x6b\x3d\x47\x5e\xd1\x74\x0e\xb3\x78\x42\x73\xc7\x8c\xc1\x59\x76\x40\x21\x4a\x46\x23\x1d\xca\xef\x77\xa7\xea\xec\x14\xe0\xc5\x50\x4c\x07\x6c\x01\x98\xe3\xca\xcf\xb6\x28\x38\x70\x54\x5f\x08\x2e\x25\x61\x46\x2d\xb4\xb4\x50\x57\xea\xa3\x4b\x53\xd2\xb5\x84\x4f\x49\x96\xd1\x80\x91\x1a\x9d\x6c\x4d\xe6\x12\x3c\x01\x55\xb6\x87\x25\xe7\x48\x73\x34\x3f\xba\x95\x15\xcc\x31\x67\x95\xb8\x02\xef\x62\x43\x52\x27\x70\xd3\x4c\xeb\x04\xa2\x76\xd8\x78\x9c\xec\x9b\x1c\x6a\x7c\x6b\xa2\x26\x67\x7a\x21\x2e\x42\x6f\x03\xaf\x75\x9d\xa4\xef\x69\x0a\x61\x5e\xcb\x24\x34\xa6\xb3\x69\x00\x35\x66\xa7\xd4\x9a\x0a\x8b\x64\xf0\x0e\xba\x20\xc2\x45\xc2\x87\x0f\x78\x8f\x5e\x70\x8f\x4b\xd0\x10\x6b\x97\x90\x09\x36\xf6\xb0\xc0\x79\x78\xc1\x68\x97\x0c\xde\xd5\xcd\x5d\x15\x39\xea\xd7\x24\x8d\xbd\xda\xab\x30\xcb\x98\x8a\x5b\xaf\x61\xd8\xfc\x7c\x0c\x1b\x50\x43\xd3\x90\xcd\x6a\x38\x93\xd5\x1a\x06\x6d\x8d\xbd\x15\x35\x6e\x86\xf7\x33\x14\xcf\xbf\x45\x24\x23\x10\x7d\x4c\x06\xef\xce\x25\x72\x17\x05\x95\x82\xa8\x73\xa0\x75\xa7\x96\xaf\x1d\x93\x90\x91\xcf\xc1\xe3\xfe\x98\xfa\xef\xd9\xb8\xdd\x9a\x66\xd4\x28\xcc\x72\x8a\xd2\x63\x1b\x97\x96\x41\x26\xa7\xd8\x8a\x22\x5c\x10\xa5\xcd\x1a\xc6\x90\x22\xd8\x94\x97\xe2\xd3\x29\xb3\xbc\x50\x7a\x84\x65\xe7\xd5\xd1\x1c\xe5\x75\x98\x65\xc8\x8c\x58\xb5\xc7\xc5\x05\x48\xb8\x5c\x13\x60\xe4\x8f\x28\xe0\xa4\x4a\x73\x9a\x36\x78\x48\x1b\x06\x0f\xed\x54\x55\xcf\xb6\x9e\xd1\xda\x0b\x73\x34\xe0\x22\x9a\x53\x34\x7f\x19\x94\xdc\xb4\x5b\xcb\x06\x75\x71\xf6\x66\xa3\x01\x3d\x61\x0d\x73\x33\x78\x9a\x33\xcc\x30\xc3\x61\x02\x4b\x73\x73\xc8\x8d\x3e\xc0\x38\x55\xd2\x0a\x36\x5b\x50\xa2\x2e\xbf\xd4\x6f\xb5\x49\xbc\x80\xe2\xac\xa3\xa9\x18\x3b\x0e\x50\x9e\x18\xc9\x12\xb7\xdc\x26\x92\xb0\x14\xe9\x0c\xc3\x42\xd4\x7f\x11\x5b\xc1\xcf\x3d\xbe\x20\xb2\xb7\x81\xcb\xf6\x38\x57\xe2\xe7\x76\x61\x7e\x81\x50\x86\x01\x10\x89\x16\xc3\xbd\x90\xfd\xe1\x61\xac\x85\x8d\x6c\x59\xec\x38\xf6\x25\xd3\x4b\x20\xeb\x62\x6d\x6b\x26\x20\x71\x80\x6c\x81\x2c\x80\x96\xa2\x51\xb5\x8a\x7f\x65\xfb\x2f\xec\x7c\xc6\x5b\xd9\x3c\xf6\xc7\x69\x12\x27\x33\x66\x24\x9f\x69\x9c\xe5\x22\x80\xaf\x58\x99\x0a\x62\xd6\x2b\xc3\x0d\x57\x3e\xb8\x44\x8a\x91\xb6\x6a\xd0\x0c\x86\x2f\x70\x9a\x56\xf9\xb7\xb2\x16\x6b\xca\x1c\x6e\xd1\x23\xce\xd3\x45\x3c\x25\x97\x49\x4e\x77\x33\xd9\x7d\x06\x7d\x9a\x5f\x46\xc9\xe8\x58\x42\xee\xc5\xc0\x37\x87\x48\x64\x35\x97\x51\x4e\x48\x54\x98\x76\x73\x29\x8d\x70\xdb\x35\x4a\x46\xf2\x24\x8e\x59\xec\xf6\xca\xcd\xe4\x28\xde\xa3\x46\xb1\x6d\x3d\xbd\x71\x33\xa2\xcc\x64\x2a\xc4\x2f\x4b\x7e\xcd\x66\x95\xd2\xec\xc8\x75\x22\xe3\x21\xae\xeb\xed\x98\x98\x29\xf5\xd1\x98\x9a\x37\xb3\x71\x38\x34\x0e\xc4\x59\xa5\x22\x3a\x4a\x3b\x17\x32\xbc\x1a\x6b\x7e\x1f\x98\xfa\x4f\xa9\x7f\xde\xd2\xf7\x64\xd9\xcf\xf6\x85\x87\xfb\x06\x4d\x12\x91\x74\xe2\x49\x54\xeb\x6e\xa3\x8b\xd3\xc2\x2b\xbd\x79\x60\x6c\xa0\x08\x06\xb8\x67\xc5\x70\x76\x6b\x7b\x39\x35\x25\x8c\x44\x57\x24\x0a\x03\x65\x39\xee\x0b\x38\x62\xa6\x5e\x6c\x75\x78\xbc\x90\x71\x1c\x29\xbb\xc1\xdd\x98\x6e\x0f\x16\xef\x58\x15\x37\xb0\xf5\xd6\x55\xa7\xd5\x7e\xf0\x6b\xdd\xb6\x2a\x44\x93\x16\x2a\xea\xb7\x2c\x97\x35\x72\x15\xd2\x6b\x78\x2b\x3a\xc6\xe3\x8d\x1f\x9d\x76\x5a\xed\xbd\x0d\x18\x52\x92\xa3\x7d\x7a\x4d\xd5\x56\xc2\x2c\xa3\x5c\x04\xf8\xe6\x5f\x3e\xcd\xf6\xb7\xb6\x02\x7a\x45\xa3\x64\x4a\xd3\xe6\x24\xf9\x4b\x18\x45\xa4\x99\xa4\xa3\x2d\x1a\x6f\x7e\x77\xba\x15\x24\x7e\xb6\xf5\x3d\x1d\x6c\xfd\x8e\x5c\x91\x53\x9c\x54\xb6\x4e\xe4\x72\x7a\x8b\xef\x8f\x5d\xf2\x55\x74\xb6\xc5\x1d\x2c\xb6\xa6\x24\x38\x65\x8b\x55\xdc\x70\xbb\xc7\x13\xcd\x97\x32\x44\x36\x97\x82\xca\x6c\x53\x8c\x72\x92\x8e\x68\xfe\x12\x85\x87\xad\x16\xc4\x0d\x5c\x15\x34\x7c\x8b\x59\xbe\x78\x2f\x9f\x6f\x03\x31\xa5\x28\xb6\xe9\xa2\x24\x1e\x01\x8d\x93\xd9\x68\xdc\x30\xee\xe3\x41\x90\xdc\xe3\xec\x6a\x80\x86\x4d\xb1\x4e\x10\x26\x99\x12\x5d\xab\xd0\xe3\x2e\xb4\xea\x4a\xb6\x70\x1a\x11\x9e\x25\xe2\xd9\x0d\x63\x29\xa4\xae\x0a\x77\xbb\xa0\xf6\x1a\x65\x65\x23\x1b\x6a\x50\xb3\x8c\x55\x74\xc3\x64\x3d\x9a\x92\x80\x75\x67\xc2\x96\xb0\xd3\x88\x62\x34\x98\x0c\x7b\xd5\x74\xa3\xf7\x44\xc3\x95\xea\xc6\xd1\x9e\x2e\x93\xd2\x29\x25\xb9\x67\x03\xd9\x2a\x03\x11\x31\x74\xcc\xe3\x36\x5d\x86\x3b\x11\xb7\x1a\x16\x39\xeb\xda\xe7\xc6\x7c\x90\xe4\xf6\x4b\x33\xdf\x51\x1c\x54\xb3\xde\x51\x1c\x54\x33\xde\x91\x75\x2d\xf2\xef\x6c\xf7\xeb\x64\x3b\xb3\xdb\xb8\xda\x59\xcc\x85\x8a\xed\x16\xcf\x0e\xd6\x09\xe6\x3f\x9d\x63\x0d\xf7\xfc\xf0\x9a\xad\xcd\xa6\xc4\xc7\x8d\x2a\xc0\xae\xc1\x2c\x0f\xa3\x30\x0f\xa9\xb1\x6f\xc7\xfb\x5c\xd8\xf9\x3f\x0e\xd3\x2c\x67\x6b\xc5\x09\xb3\xcd\xe3\x18\x4f\xa3\x47\xb3\x88\xbf\x62\x90\xd2\x8c\x3f\xa9\x79\x4d\x6b\x29\x85\x51\x22\x18\x9b\xa1\x81\x18\x8a\xe3\x6f\x61\x3d\xae\x2d\x8b\x02\xfb\xec\xa4\x77\x78\x04\x7f\x7c\xf3\xdd\xc9\xe9\xd1\xcb\xe3\x55\x6a\x00\x40\xe3\xa7\x9f\x7e\xfa\xa9\xb9\x4a\xc9\x0f\x4f\x2e\x1f\xc3\x4f\x3f\xad\x50\x74\xfb\x4f\x9b\x9b\x9b\xb5\xcd\xad\x55\xc0\x6e\xef\xb3\xcf\x0f\x57\x3f\x2c\x2f\xdb\x4d\xba\xbc\x70\x63\x85\xc2\xf0\x01\x44\x61\x2c\xbd\xa0\xc2\xd9\xf3\x23\x38\x39\xfa\xe6\xbb\x97\xbd\x13\x38\xfa\xc3\xdb\x93\xa3\xd3\xd3\x17\x6f\x5e\x9f\x2e\x6f\xa2\x77\x72\x04\x87\x6f\x5e\xbd\x78\xfd\x8d\xb1\x68\x4e\x69\x0d\x23\xde\x5c\x93\x39\x2e\x4f\xd9\xca\x9f\xab\xb0\x93\x23\x88\xc2\x9c\xa6\x24\x62\xeb\x02\xd0\x8a\xb8\x09\x70\x1c\xde\x70\x4e\xbd\x1e\xcf\x21\x48\xe2\x1a\x6e\x3d\xcd\x93\xd9\x53\x80\x37\x63\x5c\xe6\x00\x89\xb2\x84\x9f\x18\x58\x2d\xa0\xcf\x1e\x5b\x34\x73\xc5\x80\x50\x82\x84\x66\x71\x8d\x9f\x58\xa4\xd3\x94\x22\x34\x9a\xf9\x64\x4a\x8d\xc5\x4f\x96\x53\x12\x34\x98\x4d\x93\xe5\x49\x32\xe5\xdb\x60\x61\x06\x6a\xdf\xb3\x0e\x4c\x18\xde\x17\x99\xbc\x99\x52\x3c\xe2\x5a\x43\x55\x77\x78\x7a\x0a\x63\x7a\xc3\x25\xa3\x01\x5f\x9d\x7c\xf3\x8c\xe9\xb5\x31\xbd\x69\xef\xed\xc3\xd6\x57\xde\x39\xd9\x1c\xb6\x36\x1f\x5d\xd4\x5d\xdf\xb6\xc2\xc6\x5a\x05\x9c\x93\x6f\xbe\x79\x26\x41\x75\x76\x2c\x50\x3f\x76\x6e\xeb\xd5\x3f\x6c\x98\xe9\x68\x20\x61\xa6\xa3\x81\x97\xa6\x69\x63\x34\x1a\x35\x06\x83\x41\x9d\x01\x4f\x47\x83\x7d\x34\xb1\x4f\xe8\xe8\xe8\x66\xea\x09\x4d\xeb\xd5\xfe\x61\x2b\xbb\x9f\x8e\x06\x5b\xd9\xfd\x2d\x6f\x2b\xbb\xef\x6d\x05\x3f\xb6\x1b\xdb\xb7\xf5\xad\xec\x7e\xa3\xf8\xbb\x06\x1b\x72\x35\x51\x2b\xe4\x6d\xb1\xbf\xfe\x59\x4d\x66\xd7\xf5\xa6\xf2\x0f\x5b\x5b\xa3\x06\xd4\x7e\xf8\xa1\x56\x6f\x40\x2d\xac\xd5\x57\xc3\xba\x41\x08\x91\x98\x93\x85\xa8\x93\xad\xec\xbe\x85\xd9\xd2\x7e\x14\x7e\x9b\x95\xbd\xa7\xfb\x22\x7b\xc3\x7b\xba\xbf\xd5\xdc\x0a\x36\xea\x4f\x59\xa1\xfa\x47\xf4\xf0\x28\xc4\x90\xd3\x27\xdf\x3c\x63\x4b\x99\x93\x6f\x9e\xf5\x44\x87\x6e\x16\x77\xe8\xe9\xdf\xa6\x47\x4f\x3f\xa2\x4b\xbd\x18\xfe\xd0\x6e\xc3\x3a\xe3\xa7\x20\x08\x82\x2d\xf5\xd7\x3a\x77\xa4\x67\x3d\xbc\x69\xb7\x91\xdf\xf0\x40\x81\x7d\xd3\x7c\xdb\x6e\xec\xdc\xd6\x7f\xd8\x5a\x9a\x90\xdd\xff\x67\x9a\xbf\x8f\xe2\x51\x14\x66\x63\x31\x2b\xc5\x64\x82\xad\xb0\x7f\xf7\x61\xeb\x9c\x6c\xfe\xe5\x82\xfd\xd5\xda\x7c\xf4\x43\x76\xb1\xb1\xd5\x30\x77\x66\x0e\x93\x18\xdf\x5d\x24\x92\xdd\xbc\x20\x08\x1a\xe2\xff\xba\x80\x88\x88\x33\x2d\x92\x00\xe1\xfd\x33\xd2\xd5\x89\x23\x8e\x25\x83\x62\x64\x8a\x3d\xc2\x51\x9c\xa4\x7c\x83\x5d\xec\xf0\x64\x24\x0e\x73\xb6\xfe\xc7\xe7\x2b\xc6\x24\x0e\x22\xb1\x49\xa6\x8e\xb6\x6b\x41\x10\xd4\x70\x6b\x03\xef\xf6\x89\xd3\xfb\x98\xc2\x60\x9e\x53\x81\x92\x3e\x43\x0b\x63\x08\xa8\x1f\x4e\x30\x62\x75\xc5\x61\x1c\xab\x81\x36\x87\x8d\x23\x43\xcb\xe7\x64\xb0\x37\xd5\x64\x4d\x56\xa7\xd0\x69\xc6\xaf\xf1\x2c\x8a\x98\xd5\xc6\x4c\x08\x9e\xe8\x63\xe8\x73\x7e\xde\xa9\xf7\x66\x10\x32\xdf\xfc\xb1\xd5\xe7\x68\x70\x96\x30\xb8\xd6\x29\x9f\xf2\x2e\x55\xdb\x32\x99\x4f\x22\xea\xa9\x67\x3f\xae\xa0\x0b\x9e\x8a\xd3\x79\xd5\x80\xce\xee\x6e\x1d\xee\x43\x67\xf7\x81\x7d\x11\xd1\xf2\xe3\xe3\x7b\x15\x7f\x99\x92\x80\x55\xd9\x11\x0f\x2e\x59\x1b\x31\x7c\x34\x27\x24\xf7\xc7\x9e\xad\xe5\x19\xaa\x37\x58\xc5\x3e\x0b\xb2\x62\xe7\xea\x2d\xc0\x1a\x63\xe9\x1a\x6c\x08\xcc\x49\x3a\x3f\x6f\x5f\x30\xbb\xb2\xb6\x65\xa7\x76\x9c\xa9\xdb\x17\xf6\x6e\xb5\x66\xd1\x88\x8e\x88\x3f\x57\x63\x71\x45\x8b\xac\x29\x79\xb8\xd9\x6c\xd6\x5d\x3c\x7a\x36\xa6\x73\xc8\xc9\x7b\x6e\x91\x0f\x93\x74\xb2\xcf\x92\xdb\x1d\x18\x84\xf9\x3e\x4e\x5a\x7a\x5e\xdf\x7c\x02\x5f\x9d\xb4\x5a\xad\x6f\x5a\xad\xd6\xb3\x56\xab\xc5\x4a\x76\x76\x64\x49\x9c\x96\xcc\x92\x27\xad\xd6\x37\xdf\xb4\x5a\xcf\x9e\xf1\x92\xdb\x7b\xaa\xe4\xc9\x37\xac\xec\x33\x5d\xf2\xa4\xf5\xcd\x37\xdf\xb4\x9e\x3d\x7b\x86\x25\x77\x1e\xea\x92\xac\x28\x2b\xfb\x4c\x60\x9b\x51\x14\x20\x86\xed\x24\xc9\x72\xc8\xc2\x51\x1c\x0e\x43\x9f\xc4\x39\xab\xa4\x66\x71\xf5\xe6\xb9\x90\x3a\xdc\xfd\x0d\x92\x6b\xdc\xd4\xe3\x48\xab\x97\x53\x49\x5e\xcb\x70\x77\x95\x51\x2b\x9b\x4d\xb9\x4f\x67\x91\x3b\x6f\xda\xed\xe7\xf4\xe6\x2c\x61\x85\x4c\x06\xd5\x0f\x9e\xdd\xbb\x6a\xe2\x09\x7a\xf6\x7d\x98\x8f\xbd\xda\x57\xb5\xba\x83\x2b\x50\x3f\x31\x9e\x9c\xf2\x9d\x5f\x4a\x02\x66\x9e\x7c\x05\xc9\x70\xc8\x94\x14\xe3\xe6\xab\x66\x36\x1b\x64\x79\xea\x89\x65\x09\xbe\x06\x8b\x5e\x04\x33\x11\x51\x23\x0b\xff\x82\x16\x0b\xb6\x7b\xbe\xdd\x80\xbd\x06\x3c\x6a\x40\xbb\x73\xa1\x62\x5e\x5f\xa9\xe5\x4d\xb7\x0b\x9b\x6d\x37\x83\x6a\xc8\x71\x12\x6f\x32\x33\x83\xd3\x4b\x82\xbe\x12\xec\xbf\x75\xfe\x0f\x42\xdd\x6e\x85\xae\x5e\x89\x6e\x4d\xa3\x30\x17\x9e\x17\x68\xf5\x27\x33\x0c\xd6\x8f\x67\x6e\xdc\xc1\x5a\x62\x05\x5b\xb0\x7d\x20\xb2\x52\xb3\xcb\x2d\xfe\x72\x4c\x5d\x66\x8e\xcc\x4c\x96\x53\xc8\x1f\x14\xf3\x99\xe8\x98\xc5\x38\x6a\xaf\x93\x74\x22\xf6\xdb\x13\x68\xef\x49\x5e\xd1\x4a\x25\x4e\xd2\x49\x7b\xcf\xd6\x2a\xea\x61\xda\xab\x06\x14\xf5\x07\xef\x4f\x17\x3a\xf0\x14\xae\x60\x5f\x09\xc9\xd6\x96\x00\x6f\x3a\x81\xcb\xc2\x6d\x2c\xfc\xf8\x31\xec\xf0\x1a\x5b\x5b\xf0\xb0\x58\xf6\x0a\x9e\x3c\x01\x6f\x07\xee\xf3\x37\x78\x60\x13\x3a\xf5\xfa\x01\x96\xed\xec\x30\x35\xbb\xdd\x11\x55\x6e\xd7\x2c\x6d\x26\xf8\x14\xbd\x98\xce\x12\x66\x3c\x78\xe7\x69\x03\x46\x0d\x18\x5c\x34\x27\x64\xea\xf1\x2e\xd6\x2b\x94\x49\x69\x1e\xbb\x8b\x12\xc1\xba\xbc\xd6\x84\xcc\xd1\x0b\xc8\x84\xc7\x8f\x47\xf8\xe9\x34\x53\x29\x62\xca\x18\x2a\xad\xc3\xc0\x30\x25\x39\x1e\x8f\xc7\x5b\xea\x2f\x71\xdc\x6c\xcc\x79\x02\xb1\x0c\x22\x9a\x65\xdc\x37\x79\x07\x82\x70\x14\xe6\x19\x84\xb9\x38\x01\x98\x92\x20\xa0\x01\x63\x3e\x36\xd8\x3b\xe8\xa2\x21\x66\x8d\x40\xe9\x80\x61\x88\x4e\x62\xea\x50\x8d\x4d\xa2\xcb\x67\xca\x22\x89\x56\x99\x29\x8b\xb3\xeb\x67\x98\x29\x6f\xda\xed\x2a\x45\x54\x35\x4b\x6e\x6d\xc1\x5b\xc2\x89\x22\x54\x22\xc6\x14\xd5\x74\x1c\x26\xb3\x54\x90\x12\x4f\x78\xc2\x0c\xc4\x9b\xe7\xe0\x4d\xd3\x64\x40\x06\x91\x98\xe5\xb6\xb6\x00\xb5\x02\xcd\xc4\xcb\xbb\xc2\x75\x2b\x08\x87\xc3\xd0\x9f\x45\x48\xf6\x8c\xf0\xd3\x20\x6e\xdd\xa0\xa6\xc5\xc2\x90\x51\x3a\xc9\x20\x4f\x24\x28\x92\xa6\x78\xba\xc9\xe6\x33\x31\x72\x9c\x24\xc2\x4b\x26\x86\x29\x4d\xf1\x49\x01\xbe\x5d\x90\x4c\x06\x61\x2c\x8e\x54\x87\x12\xc8\x88\x4c\x26\x8c\x4f\x52\xf1\xea\x48\x43\x50\x9c\x6f\x50\xe4\x29\x89\x33\xee\x4e\x83\x79\x0c\xf2\x9f\x67\x24\xce\xd5\x81\xa7\xda\x70\x52\xfa\x89\x49\xab\x3e\x44\x61\xca\x8d\xf3\x89\x60\xb6\x29\x51\x0c\x86\x84\x1b\xcc\x81\x6f\x37\x49\xbf\x40\xe5\x0a\xdb\x04\x58\x1f\xae\xc3\x80\xfa\xc9\x84\x66\x1a\xde\xfa\x70\x38\x1c\xae\x37\x01\x4e\x7d\x82\x37\xd1\x91\x33\x09\x28\x25\xac\x76\x76\x84\x4b\x33\x6b\xa3\xb3\xfb\x40\x3a\x12\x64\x64\x42\x35\x34\x92\x81\x3f\xcb\x73\xfe\x44\xcd\x50\x99\x85\x4d\x80\xef\x29\x64\xef\xc5\x6c\x33\x09\x83\x20\x62\xcb\x5a\x3a\x45\x22\xa0\xb3\x5d\x90\xcc\xd4\xa3\x97\x22\x3e\xad\x81\xbd\xbd\x1d\xa8\x35\x22\x6c\x80\xa9\x15\x6f\xdd\x24\xec\x14\x48\x38\x09\x23\x92\x42\x40\x49\x04\x6c\xc1\xde\x04\x94\xa8\x29\x09\x32\xc8\xaf\x13\x4e\x5c\x35\x65\x17\x48\xaa\xe1\xa0\xc1\xeb\xb1\xe1\x65\x3c\x0e\xb3\xa9\x20\x4d\x9d\x51\x13\x59\xad\xb0\x73\xc4\xcb\x85\x39\x9a\x01\x1a\x0e\xa7\x78\x3c\xbf\x26\x73\x5c\xee\xfb\x24\xe6\x24\x91\xa1\xdc\xc6\x4c\x5a\xc3\x11\x86\x96\x51\x8b\x15\x27\x39\x96\x93\x62\xdb\x22\xc5\xd9\x38\xa5\xd4\xee\x2f\x13\x0c\x71\x72\x2f\xe4\xa0\xc4\x54\x43\xc4\x04\x6b\x35\x35\x2c\xda\x1c\x35\xa1\xdd\x1a\x4a\x1e\x63\xdf\x87\x32\x1f\xed\x09\x36\x58\x72\x8e\xec\xd8\x68\xb2\x61\x41\xea\x70\xc5\x38\xa6\xd0\x31\x16\x14\x4d\x73\xca\x43\x1b\x3b\x4d\x66\x71\xe0\x15\x3a\x0e\x5b\x48\x7e\x97\x0d\xed\xb6\x9f\xf9\x82\xcf\xb6\xa0\xb5\xa2\xe2\xf1\x6e\x84\x7d\x84\x16\x2e\x17\xde\xa6\x41\x58\xa7\xa5\xe5\x9a\x0f\x0d\xbb\xcd\xbb\x12\x7d\xa7\x51\x46\x2b\x2b\xb0\xc9\x0a\xe7\x4f\x51\x1c\x7b\x84\x67\xa7\x53\xb9\xf9\xdb\x36\x0f\xf8\x2b\xe6\x5e\x56\x83\xcd\xba\xc8\x7b\xee\x49\x37\xe3\x17\x67\x84\x1f\x24\xd3\xe7\x35\x61\x47\xd7\xec\x35\x23\xce\xc4\xf9\x98\x86\xa9\x9a\x88\x85\x5b\xb1\x7a\xc6\x17\x7d\xe0\xf8\xea\x52\xcd\x1b\x6c\x82\xc3\xf5\x79\x93\xcf\xa3\x62\xaa\x21\xb1\xf0\x40\x55\x05\x1b\x7a\xf2\x14\x2b\xfa\x80\x4f\x0f\x6c\xa2\x72\xcf\x8a\x1f\xb8\xeb\xe1\x63\xfe\xeb\xc9\x2d\xf4\xe4\x4c\x6a\x4c\xf0\xa9\xf0\xb8\x4e\x86\x3a\x95\xeb\x7e\x6b\x86\x73\xcd\x9d\x25\xf8\xe8\xc7\xa1\x7a\xa6\x1a\x50\xf6\xaa\x3d\x43\x8e\xd9\x90\xb3\x36\x8d\x19\x92\xa4\x23\x7d\xd6\x8e\xfb\x70\xe2\xb4\xdd\x60\x4c\x4c\x3e\xd0\x65\x3a\x3b\xce\x32\x9d\x1d\xee\x7d\x26\x27\x5b\x81\x98\x37\xd6\x0e\xa5\x8c\x4d\xc7\xf4\xc6\xd0\x00\x3b\x5a\x03\x30\x25\xdf\x65\x7f\xab\x1d\x14\x6c\x58\xdf\x25\xf4\xc6\x0d\x10\xc6\x9b\xe3\x42\xf4\xfa\x57\xeb\xb0\x01\xa9\xf8\x7f\x24\xfe\x1f\xb0\xff\x95\x37\x95\x75\xf7\x5a\x0b\x24\x6b\x93\x8b\x24\x76\xa3\xae\x8f\x82\x4c\x97\xc6\xa2\x71\x6f\x2d\x65\x3d\xee\x00\x26\x34\x00\x5f\xcd\x72\x35\xb0\x01\xb5\x06\x18\x7b\x49\x76\xa9\xce\x4a\xa5\xb6\x75\xa9\x7a\xed\xc0\xf4\xf8\x22\xe9\xa8\xd2\xeb\xb3\xc2\xc9\xd4\xed\xf9\x46\xd2\xd1\x79\x78\xc1\x23\xdf\xe1\xb0\xf1\x04\xd3\x19\xc1\xf4\x56\x60\xed\x5a\x65\xb5\x5a\x10\x54\x21\xe9\x68\x35\xf9\x56\x66\x34\x13\x5d\x4b\xae\xdd\x92\xaf\x36\xa5\x87\xe2\x05\x34\x12\xe3\xfe\xa6\x06\xc2\x1d\x90\x49\x34\x1d\x13\x18\x86\x34\x0a\xb4\xd3\x27\x90\x6b\x32\xff\xf5\xe9\x07\x45\x83\xb2\x92\x30\x95\x1b\x67\x5b\xa1\x30\xbe\xa0\xa6\xc0\x5d\xa7\xe7\x28\x8f\x65\x4d\x51\x12\x70\x36\x6b\x19\x9e\xa4\xda\x63\x47\x40\xf3\x53\xe2\xbf\x67\x73\x87\x9c\xde\x96\xc8\x96\x29\x5a\x5f\x31\xb9\x32\xf6\xa5\x3c\xcf\x12\x8c\xd6\x45\x9d\x2d\x1d\x99\x6c\xd8\xe1\x6a\x4b\x1f\xaf\x20\x9c\x58\x0f\x1e\xde\xb1\x5e\x47\xd4\x6b\xd5\xed\x6d\xb4\x06\xec\xd5\xff\x89\xca\xe5\x19\x11\xce\x70\xdc\x47\xc8\xcf\x32\x21\x6d\x78\x7e\x1d\xe2\x48\xe3\xb2\x83\x55\xc6\x05\x22\x5f\x01\xa7\xa3\x01\xe3\x20\x26\x79\xf6\xd2\xf7\x04\xdb\xc9\x96\x2c\xe8\x70\x73\x01\x77\x1f\xca\x4b\x39\x95\x55\x58\xce\x05\x74\xa8\x77\x96\x02\x3a\x5c\xb8\xb5\xe4\x98\xf8\x10\x80\x72\xa9\x72\x6c\x5f\x36\x73\x9a\xe5\x58\xca\x02\x15\xd0\xa1\xb9\x75\xe9\xb4\x8b\x38\x68\xe7\x8e\xe4\x36\xa3\xd3\x0e\x58\x57\xaa\x4c\x32\x0a\xcd\xc5\x65\xb5\x44\x0c\xc3\x7e\xb2\xc5\x71\x6e\x38\xc9\xa1\xaa\xeb\x9a\xce\x6e\xf0\x84\x59\xd7\x4f\x81\x4f\x1f\xb0\x0f\xed\x03\x7b\xf3\x95\xe0\x94\xc5\x85\x48\x4d\x3f\xc0\x85\xc3\xfe\xdd\x31\x7f\x63\x4b\x62\x1e\x32\x7a\xfb\xe6\x8a\xa6\xfc\x74\x51\xab\x5e\x7f\x4c\xe2\x98\x46\x4c\x89\xf1\x8e\x6e\x21\xb3\x60\xbf\x4a\xdd\xcc\x68\xde\x13\xbd\x50\x7d\x4c\x47\x83\x06\x87\xe5\xf2\x07\xac\xd2\x2e\xa2\xc7\x5d\x5e\x73\x25\xa3\xd4\x1e\xb9\x57\xe1\x0d\x5b\x77\xd3\xd4\xa7\x71\x4e\x46\xb8\xe8\x24\x90\x87\xe8\xc1\x1e\xa1\x3f\x1d\x1b\x3b\x18\x90\x8c\x56\xf4\x66\x12\x5a\xba\x93\x95\x6c\x20\x84\x86\x84\x6b\xf5\xa8\x5d\xd1\x25\x56\x4f\xed\xea\x91\x74\xde\xa9\x28\xc7\x20\xd7\x0f\xaa\x2e\x96\xec\x1c\xc0\xc6\x46\x68\xaa\xe8\x20\x1c\x0e\xb9\xf3\x63\x87\x29\x97\x4d\xc4\x41\x5d\x27\x11\x3f\xe4\x4b\x5f\x85\xd5\x8d\xc8\x65\xc6\x08\x82\xb9\xaf\x7a\x54\xd4\x34\xd5\xf4\x6e\xdb\x04\xe7\x7b\xa4\x25\x1e\x51\x32\xa2\xe6\xc2\x30\xcf\xf4\xc6\x97\x32\x04\xde\xc4\x90\xcd\x7c\x9f\x66\x59\x03\x48\x49\xd0\xe4\xfd\x0d\x8e\x14\x3a\x94\x1f\x73\xbd\x25\x66\x3f\xc3\x5a\x60\xd0\x64\xf9\x8c\xbf\xdc\xdb\x2e\x8d\xad\xa4\xba\x39\xc0\x98\xa5\x75\x13\x67\x0a\x53\x3b\xb1\x5e\xd5\xea\xe5\x69\x92\x97\xac\x3a\x4f\x21\xc6\x74\x69\x2c\x07\xc1\xe5\xb6\xaa\xd4\xfb\xbc\x62\x6a\x58\xb5\xd1\x3b\xb4\xa9\x6e\xec\xb4\x17\xa3\xc1\x98\x42\x5e\x9c\xa0\xdc\x3d\xf5\x90\xcd\x05\xf1\x0f\xb5\x1c\x90\x9e\xdc\x85\x96\x93\xd1\x10\x59\x6e\x10\x2c\xdb\x9a\x45\x5f\x7b\x21\x94\x96\x45\x69\xcd\x4b\xaf\xf5\x35\xc7\x3c\x0d\xa7\x53\x1a\x30\x96\xc2\xdd\x30\x7e\xfd\x4c\xdb\x47\x79\x02\x51\x72\x4d\x53\x9f\x64\xe2\x7e\x0f\x63\x11\xde\x0c\x5a\x7c\xe2\xcc\xa1\x21\x26\xb9\x4c\x73\x97\xe9\xae\x1e\x89\xcb\xbc\x06\x96\x79\x82\xab\xbe\x09\x7f\x9d\x8d\xd5\x0c\x68\x1a\x5e\x99\x0f\x88\x67\x79\xe2\xbf\x67\xbd\x13\x1b\xc0\xcd\xfc\x26\x37\x7d\x7b\xdc\x77\x10\xce\xe4\x09\x83\x6a\x67\xe9\x26\x2c\x6e\x0d\x66\xd3\x04\x63\x0d\x54\x10\xce\x9e\x97\xe5\x6c\x57\xbc\x13\xa0\x39\x5f\x0c\x85\xa5\xa5\xd8\x3f\x48\xfc\xaa\xf9\x59\x97\xc0\x4b\x03\x17\xa8\xc9\x62\x1e\x23\x0d\x0f\xaa\xf3\xe4\x25\x1b\x8e\x43\x22\x83\xe8\x7d\xb9\xa6\xf4\xe9\x7d\xb6\x81\xc7\xf7\xb5\x2f\xd0\x60\x15\x77\x9f\xa9\xe1\xe7\x43\x39\x25\x11\xcd\xf3\xf2\x40\x60\x99\x43\xf6\xfd\x2d\x2f\x61\xcf\x0b\xd2\xde\x59\x03\xf0\xce\x71\x63\x8d\xc2\x7a\xef\xf5\xe9\x0b\x68\xef\xad\xe3\x0d\x5e\x00\xa8\x7d\xd5\xc2\x0f\x9b\xd8\xbf\x3a\x3c\x54\x5f\x77\x8e\x1e\xf5\x5a\x7b\x3c\x75\xa7\x87\xa9\xa2\xfc\xf6\xce\xde\x6e\x6f\x07\x73\x1e\xec\xee\xb6\x1e\x3c\xc3\xaf\xad\xbd\x47\x0f\x1f\xf5\xf0\x6b\x7f\xbb\xff\xe0\xf0\x58\x95\xdf\xdd\xdd\x7d\xb0\xbb\x8d\x39\x47\xc7\x9d\x47\x9d\x47\xbc\x7c\xeb\x59\xaf\xcd\x53\x8f\x0f\x8f\x1e\xed\xe8\xf2\x0f\x3a\x8f\x8e\x59\x75\x96\xd3\x69\xb5\x0e\x9f\xc9\xf2\xbb\xcf\xfa\x1c\x0a\xfb\x1c\xd6\x1a\x6a\x97\x8e\x75\x6c\xef\x66\x4f\x50\xcb\x9f\x0d\x78\x68\x95\x52\xf7\xd8\x97\xdd\x63\xf5\xf5\xe1\x03\xf5\xb5\xa7\x53\xfb\x3a\xf5\x58\x23\xc5\x2a\x2a\x28\xbb\xc7\x0a\xca\xee\xb1\x82\xb2\x7b\xdc\xd3\xa9\x7d\x9d\x6a\x41\x79\xf8\x40\x41\x79\xf8\x40\x41\x79\xf8\x40\x41\x79\xf8\xa0\xa7\x53\xfb\x3a\xd5\x82\xd2\xd3\xb8\xf4\x34\x2e\x3d\x8d\x4b\x4f\xe3\xd2\xd3\xb8\xf4\x6c\x5c\xfa\x1a\x97\xbe\xc6\xa5\xaf\x71\xe9\x6b\x5c\xfa\x1a\x97\xbe\x8d\xcb\xb1\xc6\xe5\x58\xe3\x72\xac\x71\x39\xd6\xb8\x1c\x6b\x5c\x8e\x39\x2e\x92\x47\x8e\xd5\x20\xb1\xaf\x02\x0c\xfb\x2a\xc0\xb0\xaf\x3d\x9d\xda\xd7\xa9\x06\x32\x6c\x5c\x14\x14\x35\x48\xec\x8b\x82\xa2\x06\x89\x7d\xed\xeb\x54\x0b\x8a\x1a\x24\xf6\x55\x41\x51\x83\xc4\xbe\xf6\x74\x6a\x5f\xa7\x5a\x50\x7a\x1a\x97\x9e\xc6\xa5\xa7\x71\xe9\x69\x5c\x7a\x1a\x97\x9e\x8d\x4b\x5f\xe3\xd2\xd7\xb8\xf4\x35\x2e\x7d\x8d\x4b\x5f\xe3\xd2\xb7\x71\x39\xd6\xb8\x1c\x6b\x5c\x8e\x35\x2e\xc7\x1a\x97\x63\x8d\x8b\x3d\x48\x8c\x2c\x02\x0c\xfb\x2a\xc0\xb0\xaf\x02\x0c\xfb\xda\xd3\xa9\x7d\x9d\x6a\x20\xc3\x28\xaa\xa0\xa8\x41\x62\x5f\x15\x14\x35\x48\xec\x6b\x5f\xa7\x5a\x50\xd4\x20\xb1\xaf\x0a\x8a\x1a\x24\xf6\xa5\xa7\x53\xfb\x3a\xd5\x82\xd2\xd3\xb8\xf4\x34\x2e\x3d\x8d\x4b\x4f\xe3\xd2\xd3\xb8\xf4\x6c\x5c\xfa\x1a\x97\xbe\xc6\xa5\xaf\x71\xe9\x6b\x5c\xfa\x1a\x97\xbe\x8d\xcb\xb1\xc6\xe5\x58\xe3\x72\xac\x71\x39\xd6\xb8\x1c\x6b\x5c\xec\x41\xea\x69\x49\xea\x69\x49\xea\x69\x49\xea\x69\x49\xea\x69\x49\xea\xd9\x92\xd4\xd3\x92\xd4\xd3\x92\xd4\xd3\x92\xd4\xd3\x92\xd4\xd3\x92\xd4\xb3\x25\xa9\xa7\x25\xa9\xa7\x25\xa9\xa7\x25\xa9\xa7\x25\xa9\xa7\x25\xa9\x67\x4b\x52\x4f\x4b\x52\x4f\x4b\x52\x4f\x4b\x52\x4f\x4b\x52\x4f\x4b\x52\xcf\x96\xa4\x9e\x96\xa4\x9e\x96\xa4\x9e\x96\xa4\x9e\x96\xa4\x9e\x96\xa4\x9e\x2d\x49\x3d\x2d\x49\x3d\x2d\x49\x3d\x2d\x49\x3d\x2d\x49\x3d\x2d\x49\xbd\x82\x24\xf5\xb5\x24\xf5\xb5\x24\xf5\xb5\x24\xf5\xb5\x24\xf5\xb5\x24\xf5\x6d\x49\xea\x6b\x49\xea\x6b\x49\xea\x6b\x49\xea\x6b\x49\xea\x6b\x49\xea\xdb\x92\xd4\xd7\x92\xd4\xd7\x92\xd4\xd7\x92\xd4\xd7\x92\xd4\xd7\x92\xd4\xb7\x25\xa9\xaf\x25\xa9\xaf\x25\xa9\xaf\x25\xa9\xaf\x25\xa9\xaf\x25\xa9\x6f\x4b\x52\x5f\x4b\x52\x5f\x4b\x52\x5f\x4b\x52\x5f\x4b\x52\x5f\x4b\x52\xdf\x96\xa4\xbe\x96\xa4\xbe\x96\xa4\xbe\x96\xa4\xbe\x96\xa4\xbe\x96\xa4\x7e\x41\x92\x8e\xb5\x24\x1d\x6b\x49\x3a\xd6\x92\x74\xac\x25\xe9\x58\x4b\xd2\xb1\x2d\x49\xc7\x5a\x92\x8e\xb5\x24\x1d\x6b\x49\x3a\xd6\x92\x74\xac\x25\xe9\xd8\x96\xa4\x63\x2d\x49\xc7\x5a\x92\x8e\xb5\x24\x1d\x6b\x49\x3a\xd6\x92\x74\x6c\x4b\xd2\xb1\x96\xa4\x63\x2d\x49\xc7\x5a\x92\x8e\xb5\x24\x1d\x6b\x49\x3a\xb6\x25\xe9\x58\x4b\xd2\xb1\x96\xa4\x63\x2d\x49\xc7\x5a\x92\x8e\xb5\x24\x1d\xdb\x92\x74\xac\x25\xe9\x58\x4b\xd2\xb1\x96\xa4\x63\x2d\x49\xc7\x5a\x92\x8e\x2d\x49\x12\xb6\xdf\x28\xa5\x73\x7e\x8e\x9d\x92\xc9\xd4\x30\xfd\x1e\xb2\x3f\x58\xaf\xdd\x61\x7f\xf8\xd7\x43\xf6\x07\xbf\x76\xf6\xd8\x1f\xfc\xba\xdd\x62\x7f\xf8\xd7\x1e\xfb\xa3\x30\xdd\xc1\x0f\xe6\xec\x1c\xb1\x3f\x7c\x72\x7c\xc8\xfe\xe0\x57\x04\xc2\x61\xef\x1d\xb2\x3f\xf8\xf5\xc1\x1e\xfb\xa3\xd5\x3b\x22\xc3\x55\x76\x8f\xfd\xc1\xaf\x8f\x76\xd8\x1f\xfe\xf5\x88\xfd\xe1\xea\x02\x4b\xe0\xd7\x67\x1d\xf6\x47\x41\x79\x76\xc8\xfe\x60\x0e\xb6\xc4\x71\xef\xb7\xd8\x1f\xfe\xb5\xc7\xfe\xe0\x57\xc4\x95\xc3\x46\x8b\xf9\x08\x9d\x93\x2f\xea\xf6\x3a\xc3\x9f\xa5\x29\x55\x5b\x5a\x62\xa5\xd1\x90\x51\x85\xe6\xfc\x2c\x63\x96\xd1\x14\xf7\xf1\x46\x8e\x53\x02\xbf\x72\x01\x52\x5a\x9f\xd8\x57\x64\x02\xe9\x0b\x47\x7c\x3f\x49\x03\xe1\x90\x60\xad\x7d\x4b\x0b\xdf\x72\xcb\xaf\x45\xf0\x09\xb6\xf4\x5c\x27\x51\xe8\xd3\x41\x34\xa3\xeb\xfb\xe8\x57\xed\x75\x76\x5a\x0d\xe8\xec\x3c\xe4\xae\xaf\xeb\x0d\x2c\x14\xe7\xe1\x9f\x67\xf4\x7a\x1c\xe6\xba\xdc\x2e\x2b\xb7\xbd\xdb\x80\x4e\xdb\x55\xae\xad\x0b\xb2\x32\xdb\x8f\x58\xc1\x47\x8e\x82\x1d\x55\x70\x9b\x35\xda\xd9\x6e\x40\xa7\xb5\xe3\x28\xb8\xad\x0a\xb6\x76\x1b\xd0\x7e\xd4\x69\x40\xfb\xc1\x9e\xa3\xe0\x8e\x2c\xd8\x66\xad\xb6\xb7\xdb\x0d\x68\x77\x5a\xb2\xe0\x9f\x67\x64\x42\xd2\x30\x56\x3d\x69\x77\x1e\x60\x67\x19\x82\x9d\x52\xa9\xf6\x6a\xc5\x54\x2f\xda\x6d\xd6\x0b\xd6\x95\xf6\xa3\x87\xa5\x62\xaa\x0f\xed\x56\x87\xf5\x93\x75\xe4\x41\x19\x35\xd5\x83\x3d\xec\x00\xfb\xab\xad\x7a\xfa\x97\x59\x5a\x18\x2d\x44\x4a\x8f\x16\x2b\xd0\x5e\x5a\x42\xd3\xbd\xb3\x23\x30\xee\x6c\x3f\x34\x4b\x68\x64\x1f\x6d\x0b\x64\x3b\x2d\x0b\x86\x41\xe9\xb6\x44\x74\x5b\x0e\xf2\x80\x86\x23\x03\x51\x56\x1b\xff\x52\x43\x31\x08\xb3\x3f\x1b\x8c\x87\x38\x76\x90\x70\x7b\x56\x89\xf6\xf2\x22\x05\x26\x6a\x6f\x37\xa0\xfd\x70\xdb\x2a\x52\x60\x9f\x87\xac\xc8\xee\x43\xab\x48\x81\x71\x3a\xac\x5c\xeb\x81\x2c\x12\x11\xff\xbd\x2c\xd0\x6a\x00\xfb\x4f\x67\xc5\xfe\x98\x06\x24\x9a\x24\x71\x50\x60\x7c\x8b\x6a\xa6\xa4\x71\x18\x7a\x54\x58\x5e\x7b\x51\x66\xa7\x90\xa9\x46\x8b\x65\x6e\x17\x32\xad\x26\x77\xec\x4c\x63\x8c\xa2\x19\xbd\x0a\x93\x88\xe6\xba\xeb\x0f\x1b\xb0\xc3\xc6\xbb\xa3\x48\x9c\x26\xd7\xb1\xca\xdf\xdb\x6d\xc0\x4e\x87\xfd\x6f\x66\xdb\x63\xb4\xb7\xc3\xfe\x37\xf3\xed\x01\xda\x7d\xc4\xfe\x37\xf3\xed\xd1\xd9\x6d\xb3\xff\xcd\x7c\x7b\x68\x18\x51\xb7\x55\x07\x67\x69\x34\xbf\x4e\x12\x4d\xf8\x0e\x53\x0d\x0f\x77\x58\x47\x4b\x85\x0a\xcc\xd4\x66\x7c\xbb\x5b\x2a\x65\xa3\xdb\x7e\xf4\xe0\xff\x67\xef\xdf\xbb\xdb\xb8\x91\x84\x71\xf8\x7f\x7f\x0a\xd8\x4f\x36\x24\x6d\x8a\x12\x65\x59\xbe\x64\x94\x79\x34\x8e\x33\xeb\x3d\x8e\x93\x8d\x9d\xcd\xbb\x47\xd1\x78\x41\x36\x48\x76\xd4\x6c\x30\x8d\x6e\x49\x9c\xd8\xef\x67\xff\x1d\x54\x15\x80\x02\xba\x79\x71\x92\x99\x9d\x99\x27\x73\xc6\x8a\xd4\x5d\x8d\x46\x17\x0a\x85\xba\xd7\x50\x8c\x4f\x5a\x50\x09\x49\x3d\x3e\x02\xa2\x49\xa1\x12\xaa\x1a\x3f\x1a\x8a\x27\x0e\x68\x2a\x33\x55\x73\xa2\x78\xfa\x08\xc8\x72\x28\xc6\xa7\x47\x29\x4c\x60\x45\x8f\x8e\xdd\x66\x7a\xd4\x1a\x29\x70\x22\xbb\x4a\xc7\xc7\x4f\x39\xa5\x78\xa8\xb0\xb7\x01\x59\xf6\x03\x03\xc9\x78\x28\x3f\x75\xd8\x2d\x0f\x4f\x38\xe9\x4c\x17\xb2\xaa\x2b\xd5\x98\x0e\x46\x7a\xd4\x82\xe9\x60\xa3\x6d\xa0\x0e\x26\xda\x06\xea\x60\xa1\x6d\xa0\x36\x03\x0d\x30\x7a\xaa\x0b\xc9\x0e\xb2\xb1\x5d\x36\x3b\xcc\xc3\x16\x4c\x4c\x2c\x30\xf5\x87\xa7\x29\x50\x42\x2b\x76\xea\x0f\x1f\xa6\x40\x09\xa9\xc0\xd4\x9f\xa6\x40\x31\xa5\xc0\xd4\x3d\x8c\xae\x64\xd1\x9e\xcd\x93\x23\x7e\x3f\x99\xee\xf8\x64\x28\x9e\x9c\x72\x80\x64\xaa\x47\xa7\xe9\x08\xf1\x34\x9f\x8e\xed\x2c\xf8\xfd\x64\x86\x96\x0d\x3c\x0e\xf7\xcb\x19\x58\xff\x39\x3d\x8f\x8f\x2c\x76\x4f\x80\x08\x39\xa4\xc9\x8b\xab\x78\x27\x82\xc8\x71\x7c\x94\xc0\x8c\xf7\x01\x4a\xb8\xff\xc3\xe3\x88\x98\x09\x28\xfe\xb4\x63\x98\xd7\xe3\x74\x4a\xa9\xe8\x70\xca\x45\x87\xe9\x5a\x96\x8c\x91\x26\x87\xaa\xbd\x3b\xde\x7e\x9b\x33\xf0\xe4\xc0\xb5\xb7\x39\x0b\x4f\x4e\x5b\x7b\x9b\x33\xf1\xe4\xa8\xcd\x64\x75\xd5\x3e\x5a\xe2\xfb\xc9\xec\x3b\x46\x98\xeb\x22\x53\x65\x15\x18\x29\xf1\x50\xfb\x63\xdc\x05\x97\xd0\xdb\x13\xe0\x5d\x5d\x80\x09\xdd\x3d\xb6\xdc\xe4\xa4\x0b\x30\xd9\x26\x27\x70\x0c\x77\x01\x26\x0b\x75\x34\x1e\x8a\x27\x1c\xae\x92\xeb\x70\x62\x59\x08\xfa\x11\xc1\x28\x15\x61\xe4\x88\x1d\xe9\x04\xb0\x73\x90\xab\x85\xbc\xca\x03\xbe\x9e\x3a\xc9\xc2\x8b\x0d\x16\x68\x29\xe7\xaa\xac\x65\x34\xe5\xd6\xfa\xe8\x22\xbf\x56\xd1\x9c\x9e\xa0\xfc\xc1\xf6\x58\x0c\x17\xd0\x0f\xec\x04\xf7\xfc\x71\x27\x68\xe0\xac\x4f\xbc\x78\x7a\x74\xd2\x09\x1a\xf8\xeb\xa9\xe3\xaf\x4f\x8f\x3a\x21\xc3\x1a\x8c\x1d\x41\x9d\x72\x3a\xd1\x95\xd5\x7f\x62\x1a\x39\x49\x70\x8c\x30\x1d\x7c\xb6\x0d\xd4\xc1\x67\xdb\x40\x1d\x7c\xb6\x0d\xd4\xe6\xb3\x31\xcc\x74\x91\x87\x3d\xf0\xe8\xe1\x50\x80\xae\x13\xe3\x0b\x80\xc2\xa9\x06\xac\xf2\x98\x6f\xf8\x00\x15\x90\xff\xd8\xca\x3e\xd1\xbe\x0f\x50\x01\xef\x8f\x4e\xdc\x1b\xdb\x63\x85\xa9\x1f\x9d\x0c\x45\x7c\x22\x5b\xa8\x4a\x65\x29\x99\xf1\x6f\x33\x20\xa2\x06\x44\x82\x10\x0c\x62\x0b\xa7\x1b\xa3\x64\x44\x88\xe3\x13\x90\xa7\x2d\xd6\x4f\x1e\x76\xc0\x8d\x63\x45\x01\xd6\xf0\x69\x17\x20\x23\x43\xc7\x02\xc7\x4f\x8e\x3a\x00\x19\x32\x1e\x39\x3d\x29\xc2\xac\x03\x64\xf8\x78\xe4\x98\x5a\x84\x36\x63\x0f\x56\xce\x1b\x1f\x1f\x5b\x32\x4d\xf1\x06\x60\x9c\x6b\x9c\x3c\x1e\x8a\xc7\x4f\xed\xbf\x2e\x28\x26\x8a\x8d\x5b\xac\x3e\x82\x64\xe2\xd8\xb8\xc5\xf5\x23\x48\x26\x92\x8d\x5b\x07\x40\x04\x19\xc4\xb2\xe3\x4e\x46\x4e\x80\x6a\xfb\xc7\xd4\x4d\xf5\x53\xa3\x73\xa3\xa2\x63\xe7\xd4\xfe\xe0\x60\x89\x7a\x60\x4f\xe0\x23\x10\x9c\x1d\x8c\x9a\xe4\xb2\x64\x74\x77\x6c\x25\x5c\x2b\x9b\x04\x08\xb5\x5a\xe5\x65\x72\xde\x83\x5c\xf0\x38\x01\x19\xef\x01\x93\xf0\x01\xfb\xef\x61\x0a\x93\xb0\x81\x53\xe0\x17\x09\x4c\x7a\x84\x30\x59\xc8\x82\x98\xab\x75\x72\xa4\xc2\x26\x67\xcb\x1c\x80\xc6\x7b\x41\xf1\xe3\x1f\x58\x01\x23\x84\x00\xc5\xa5\x00\x60\x05\x8c\x08\x02\x54\x24\x0c\x1c\xc5\x6c\x20\x5f\x46\xc7\x1f\x32\xc2\x47\xd1\xc6\xb0\x20\x6a\x3b\x88\xce\xe6\xb1\x28\xf7\x10\x56\xe3\x24\xfa\x38\x0f\x34\xde\x0b\x2a\x2c\xdd\x13\x12\x2c\x18\x0a\x3c\x54\x58\x3c\x90\x3c\x4e\x23\x14\x78\xa8\xb0\x7c\xa7\x43\xf1\xf8\x09\xc7\xc0\x2c\xaf\xd4\xa4\xca\x83\xba\x0e\xd8\x7e\x08\x0c\x33\x05\x89\x29\xce\x52\xf7\xc9\x93\x14\x26\xa6\x38\xfb\x71\x27\xad\x71\x62\x8a\xb3\x70\x0f\x5b\xe3\xc4\x14\x77\x6c\x3f\xcc\x89\xe7\xb3\xc2\x8a\xd7\x89\x85\x0d\xb8\x0a\x98\xe3\x1c\x61\xce\x74\xa5\x4c\x1d\x31\x67\x3a\x03\xd8\xb7\xcd\x65\x5e\x9a\x89\xae\x74\x50\x88\x8f\x40\x6c\xe6\xb2\xf3\x7c\xa1\x4d\x1d\xbf\x0f\x84\xeb\xd8\xf2\x67\xe5\xad\x44\x61\x66\xfa\x96\xbd\x9b\xea\xd3\xc9\xed\x44\x34\xb7\x72\x1a\xbf\x9d\x6a\xd0\x0f\xe3\xdb\xa9\xea\xfc\x38\xbe\x1d\x09\xab\xc7\xc0\x09\x4e\x2d\xf2\x8f\x53\x98\x44\xbe\xb0\xa7\x94\x67\x19\x9b\x84\x54\x7b\x42\x05\x94\x6e\x10\x50\xe1\x9b\x9f\xa6\x40\x29\x67\x01\x56\xe6\x80\xf8\xd6\x7c\x0a\xfc\x02\x7f\xb0\xfb\x47\xb1\x1c\xcf\x6f\x85\x7d\x36\x14\xf6\xff\xfc\x96\x7f\x0c\x29\x8b\x51\x17\xde\x3e\x4a\x28\x2b\x3a\xb4\x00\x64\xcc\xf7\x27\xfe\xe3\xb7\x3d\x86\x1e\x8e\x87\x02\xff\xf1\xdb\x1e\x37\x56\xac\xc0\x7f\xfc\xb6\xc7\x8a\xd5\xaa\xf0\x1f\xbf\xfd\xc8\xdf\x7e\x92\xec\x1f\xb8\x7d\xea\xcf\xb2\xf1\x50\xe0\x3f\x7e\xfb\xb1\xbf\xfd\x10\xcd\x57\x27\xd1\xbb\x9f\xf8\xdb\xa7\x43\x81\xff\xf8\xed\xa7\xfe\xf6\x93\x84\x07\x44\x47\xf8\xa3\xa1\xb0\xff\xe7\xb7\x3c\x4e\xd1\x64\xc5\xcc\x56\x70\xdb\x23\x14\x64\x3a\xf8\xc7\x6f\x87\x91\x4f\x87\x02\xff\xf1\xdb\x1e\xa1\x68\x2f\x63\x36\x33\xb8\x1d\x8c\x1c\x63\x14\x69\x4e\xa3\x77\x7b\x84\xa2\x35\x8e\x59\xe4\xe0\xb6\x47\xe8\xe9\xe9\x50\xe0\x3f\x7e\xfb\x31\xb7\xa0\xe0\x3f\x7e\xdb\x23\xf4\xf1\x78\x28\xf0\x1f\xbf\xed\x11\xfa\xf8\x64\x28\xf0\x1f\xbb\xed\xbf\xeb\xc9\x50\x3c\x09\x8a\x1b\xdc\xf2\x08\x7d\x6c\x65\x16\xf8\xc7\x6f\x7b\x84\xa2\x38\xc3\x44\x1a\xb8\x7d\xcc\x25\x23\xfc\xc7\x6f\x87\x17\x9f\x0c\x05\xfe\xe3\xb7\x83\x5c\x65\xc5\x17\xf8\xc7\x6f\x7b\x84\x5a\x35\x0f\xff\xf1\xdb\x1e\xa1\x4f\x8f\x87\x02\xff\xf1\xdb\x1e\xa1\x4f\x4f\x86\x02\xff\xf1\xdb\x1e\xa1\x4f\x1f\x0f\x05\xfe\xe3\xb7\x3d\x42\x9f\x3e\x1d\x0a\xfc\xc7\x6e\x33\x29\x18\x25\x99\x31\xe7\x19\x27\x47\xe1\xf6\x31\x29\x45\xe3\x23\x3e\xb9\x93\xf1\x36\x51\x00\x20\x82\x1c\x6b\x35\x52\xf7\x83\x43\x3c\x8c\xd5\x41\xfa\xc1\x21\x98\xc2\x78\x0c\xba\x2a\x57\x58\x01\xe2\x51\x80\x78\x44\xb6\xd2\xf1\x38\x9a\xc7\x69\x80\x78\x4c\x47\xc2\x78\x1c\xcd\xe3\x71\x90\xa3\x41\xb3\x39\xe2\x36\x1c\x80\x78\x12\x20\x8e\x41\xf7\xe1\x0a\x10\x40\x3c\x0d\x10\x8f\x9c\x27\xe0\x98\xcf\x23\x4c\x14\x2c\xa3\xf6\x1f\xbf\x1b\x30\x6e\x75\x59\xf7\x83\x43\x04\x8c\x83\xc4\x44\x3f\x38\x44\xc0\x38\xa8\x69\xf4\x83\x43\x04\x8c\x3f\x04\xe5\xe7\x11\xb7\x78\x03\x04\x3b\x89\x40\x42\xc2\x1f\x1c\x22\x7c\xc8\xc9\x11\xe9\xe7\xe3\x93\x68\x1e\xa7\xb1\x1a\x48\x3f\x38\x44\xc0\xf8\x09\xe8\xf8\x8f\xb8\xb5\x1c\x20\x9e\x44\xfa\x83\xfb\xc1\x21\x02\xc6\x41\x1f\xa5\x1f\x0c\x22\x4c\x03\x0e\x5e\x66\x6a\x82\xbb\x47\x91\xc2\xee\x7e\x70\x08\xa6\xb3\x59\x7d\x80\x7e\x70\x88\x80\x71\xb0\xc0\xd3\x0f\x0e\xc1\x8c\x23\x56\x85\xa4\x1f\x1c\x82\x89\xa5\x76\x0a\xf4\x83\x43\x04\x8c\x5b\xae\xeb\x7e\x70\x88\xf0\xa9\xa7\x20\xd3\xe0\x0f\x0e\x11\x30\x6e\x79\xaf\xfb\xc1\x21\x02\xc6\xc1\xda\x46\x3f\x38\x44\xc0\xf8\xe3\x53\x70\xa5\x72\x7f\xaa\x85\x08\x2f\x71\x7a\x16\x9f\xc3\xe3\x80\x71\xcb\x87\xdd\x0f\x0e\x11\x30\xfe\xc4\x4e\x90\x7e\x70\x08\x66\x10\x38\x71\x3e\x9b\x88\x27\x3f\x0e\x18\x7f\x62\x27\x48\x3f\x38\x44\xc0\x38\x9a\xdf\xf0\x07\x87\x08\x18\xb7\xba\x99\xfb\xc1\x21\x02\xc6\x2d\x67\x76\x3f\x38\x44\x40\xc6\xd3\x53\xf0\x3f\x72\x27\x24\x40\x04\x8c\x3f\x05\xcb\x3d\xfe\xe0\x10\x4f\x83\xf0\x38\x26\x61\xf8\xf8\x88\xcf\xe3\x49\x00\x40\xed\x37\xe2\x5b\x4f\x82\x00\x77\x04\x7a\xe1\x09\xb7\x4a\x01\x04\x33\x09\x82\x47\x07\x7f\x70\x88\x20\xe5\x1e\x3d\x05\x55\x9f\xeb\xfb\x00\x11\x44\x5c\xcb\xa0\xdd\x0f\x0e\x71\x12\x20\xec\x14\xe8\x07\x87\x78\x14\x20\xec\x14\xe8\x07\x87\x38\x0d\x10\x18\x1a\xc0\xe3\x03\x00\xe2\x71\x50\x5f\xc0\x91\x85\x3f\x38\x44\x40\x17\xb8\xb0\xe9\x07\x87\x08\x18\x07\xb7\x13\xfd\x60\x10\x01\xe0\xa1\x55\x46\xed\x3f\x7e\x37\x60\x1c\xfc\x68\xf4\x83\x43\x04\x8c\x83\xdb\x81\x7e\x70\x08\xa6\x57\x78\x87\x70\xc4\xa5\x9f\x06\x8c\x3f\x7c\x0c\x8e\x12\xee\x2d\x01\x88\x80\x71\x0c\xcf\x88\x94\x42\x80\x08\x18\x07\xb7\x1f\xfd\xe0\x10\x01\xe3\xc1\x17\x1f\x71\xe9\xa7\x01\xe3\x27\x76\x0a\xf4\x83\x43\x04\x8c\x83\x5e\x4a\x3f\x38\x44\x40\x28\x38\x29\xe9\x87\x87\x88\x4d\xee\x91\x1f\x30\x36\x25\x76\xde\x6d\x39\x50\xa2\xbb\x2d\xff\x49\x74\xb7\xe5\x3e\x89\xee\xae\x55\x51\xe8\x9b\x88\x67\xa2\x41\x20\x7c\xbe\xda\xa1\xb7\xa9\xcd\x7a\x9b\xda\xac\xb7\xa9\xed\x7a\x9b\xda\xad\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xac\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xcd\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xae\xb7\xa9\xed\x7a\x9b\xda\xaa\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\xad\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xaa\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\xad\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xaa\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\xad\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x9d\x7a\x9b\xda\xa9\xb7\xa9\x1d\x7a\xdb\x42\x97\x6a\x9d\xa9\x9b\xf8\x6b\x30\x22\xef\x28\x81\xe9\x8a\x3c\x6f\x01\x75\x05\x9f\x7b\x0a\x70\x40\x1d\xf1\xe7\x21\xac\xc4\x01\x75\x86\xa0\x8f\x3d\x50\xdd\x0a\x3c\x40\x21\xe9\xc9\x51\x0c\x92\x86\x4e\x1e\x75\xc0\x74\x44\x4f\x8e\x4f\x1f\xc7\x30\x49\x00\xe5\x29\x38\xc3\x63\x90\xd8\x3b\x68\x0f\x2b\x9f\x28\x90\x97\x59\x12\x4b\x01\xa3\x70\x99\xd4\x83\x24\x33\x86\xd9\x1c\x9d\xa6\x50\xf1\x9c\x23\x01\xd4\xc3\xc4\x73\x7e\xc2\xe3\x93\x3d\x4c\x7b\xd2\xfe\x80\xcd\xaf\x75\xb5\xee\x50\x51\xfd\xa2\x03\xc0\x78\x27\x44\x1a\xc5\x19\xd1\x04\x40\xa4\x21\x9c\x11\x41\x00\x44\x1a\xbf\x19\x51\x43\x14\xab\x87\xd4\xf9\x30\x12\x9b\x00\x20\x8d\x38\x3d\xe5\x62\x13\x40\xa4\x13\x3d\xe2\x02\x1e\x40\xa4\xa9\x2a\x4f\xb8\x38\x0c\x10\xe9\x44\xad\xaa\xe5\x10\x5a\xc8\x6b\x55\x66\xaa\x0a\xaf\x71\x53\x0d\x7b\xd6\xc1\x4c\x8a\xc6\x2c\x92\x19\x1f\x71\x06\x11\x01\xa6\xdf\xb6\x19\x32\xcd\xca\x39\xe1\x0c\x34\x82\x4c\xbf\xf5\x21\x84\x93\x77\x41\x76\xe5\xe5\x78\x0f\x7b\x21\x6f\xca\x38\xe8\x0c\xde\xf9\x88\x05\xf0\x15\x6a\xa9\xcb\xe9\x22\x9f\xcd\x58\x08\x5b\x08\x92\xf0\x7a\x0f\x87\x4b\xc9\x6e\x23\x60\xba\xa8\x0f\xb9\xac\xc1\x01\x53\x22\x04\x51\xb2\x6b\xc4\xf4\x73\x1f\x73\xad\xa9\xc8\xe7\x8b\x28\xf0\x1f\x4d\x4e\x10\xec\xe2\xd5\x09\x0f\x14\xc7\x19\x62\x32\x95\xb7\x00\x79\xa8\x38\xce\x10\x33\xa9\xbc\xd2\xe0\xa1\xe2\x38\x43\x48\xa3\x62\x18\x71\x50\x71\x9c\xa1\xe3\xad\x1c\x2a\x8e\x48\x07\xfd\x03\xa2\x7a\x8e\xa3\x37\xf2\xa8\x63\xa4\xa2\xd8\x7c\xe5\x81\xc6\x7b\x41\x25\x52\x50\x1c\x4d\xe7\xa1\x98\xec\xd9\x0e\xa5\xf6\x50\x27\xb1\x36\x19\x87\xd1\x01\x54\x3b\xc6\x04\x37\xc3\x98\xeb\x7c\x31\x64\x9a\xf6\x76\xba\x79\xd0\x74\x8b\x1d\x6d\x1e\x35\xdd\x63\x47\x2d\x52\xda\x14\x7b\x62\x25\x1f\xaf\x1c\xc4\x90\xb1\xc9\x93\x09\x06\xe3\x78\x12\x2c\x60\x05\xd2\x65\xdc\x8f\x18\x28\x0a\x17\x75\x67\x7a\x38\xfb\x1c\xd4\xee\xa1\xda\x07\x36\x44\x39\x7a\x3e\xef\x81\x92\x03\xf0\x31\xe8\x20\x8f\x52\xa8\xe4\xd0\x3e\x3d\xe6\xfa\x94\x87\x4a\xe3\xce\x31\x69\x21\x85\x8a\x71\x0b\xa9\x3a\x47\xd1\xdc\x93\xf0\x5a\x98\xd7\x69\x14\x5e\xcb\xc0\xc6\x7b\xc2\x25\x5f\x00\x31\xf1\xe3\x93\x36\x5c\xf2\x0d\x76\xe5\x9f\x3e\x69\x83\xc5\x1f\xf1\xe4\x31\x33\x20\x22\x54\x12\xfc\xfb\xf0\x98\xa2\x15\x43\xa2\x22\xc2\xc5\xf1\x91\x63\x4c\x74\x3b\x8d\x0e\x29\x06\x37\x8e\xb4\xd6\x63\x30\x73\xc7\xfb\x3b\x8d\x92\x1c\x9f\x9e\x38\x0a\x89\xb7\x78\x1a\x28\x09\x91\xb5\x40\x25\xc9\x2e\x4f\x63\x25\x41\x1c\x3b\x7e\xd8\xda\x92\xad\x18\xe1\xf1\x43\x67\xe7\x4a\xe7\x98\x86\x09\x8f\xc7\x3e\x4f\xe4\xd1\xc3\x0e\x48\xb5\x07\x64\xad\x54\x11\x1f\x05\x4e\x53\x3d\x4e\xe8\xc1\x41\x26\x91\xff\xc7\x6d\x66\xe9\x41\x93\xc8\xff\xf1\x51\x1b\x9d\x0e\x34\x8e\xfc\x07\xb5\x3f\x45\xa8\x03\x4d\x42\xff\x3b\x70\x9a\x72\x17\x2f\xf4\x1d\x9f\xb4\xc1\xba\x84\xc3\x2e\xb8\x2e\x11\xf1\xa8\xe3\xb5\x5d\x82\xe2\x93\xa3\x36\x5c\x97\xb8\xc8\x50\xbe\x8c\xf3\x31\x1e\xb9\xc3\x84\x11\x78\xa9\xca\x98\x83\x92\x58\x49\x00\x49\xe6\x07\x7a\xb4\xf8\x62\x11\xc0\x78\x27\x44\xfc\xe9\xd1\x2a\x12\x44\xfc\xd1\x91\xa0\x43\x10\xf1\xe7\x46\x19\x28\x4b\x59\xe9\xc0\xb9\x80\x02\x4f\xac\xc2\x70\x1a\xdd\x8f\xa7\xf9\xe8\x98\x5b\x8e\x10\x22\x09\x95\x7d\xc2\x55\x24\x84\x88\xa7\x09\x5b\xd7\x9f\x12\x08\x91\x84\xc9\x72\x05\x69\xa9\xb2\xbc\x59\x76\xe4\x70\x77\xa4\x53\x23\x6c\x47\xc6\x6d\x40\x0b\x40\x24\xf9\x1e\x4f\x4e\x51\x07\x0a\xc7\x12\x07\x8b\xc5\x94\xf1\x51\xc4\x22\x38\x60\x2c\xa9\x3c\x7d\x14\x2d\x18\x83\x8b\x65\x95\x98\x89\x71\xb8\x58\x5a\x79\xf4\x28\x5a\x3c\x80\x5b\x35\xd5\xaa\x08\x18\x39\x79\xec\x58\xd8\xb8\x0b\x8e\xf1\xe3\x31\xd9\xb1\xd3\x0f\x41\x40\x66\x5c\x85\xed\x31\x6e\x7f\x09\x02\x32\xab\xf6\x63\x0a\x4a\x4f\x3f\x05\x01\x03\x3f\x7e\x88\x3e\xa8\xf4\x4b\xd2\x23\x08\x8e\x46\xb0\x53\x7a\x6b\x3d\x01\xb6\x18\x37\x70\xa2\xa3\x93\xf6\x1c\xcd\xaa\xca\xcb\x79\xdb\x01\x8d\x51\xf6\x11\x68\x2b\x31\xe2\xf1\xb1\xb7\xb8\xc5\x90\x98\x1b\xc1\x73\x6e\x9e\x82\x3d\x8c\x2b\x84\xcb\x3c\x2b\x53\x61\x1f\x19\x36\x17\xe2\x96\x79\x59\x4f\x2b\x25\x97\xb1\xb1\x87\x94\x16\x0f\x64\xea\x75\xa5\x4d\x47\xce\xfc\xb1\xf7\x72\x78\xa0\x8e\xb4\xf9\x0e\xa8\x8e\xcc\xf9\x20\x00\x7a\xa8\xae\xe4\x79\x6f\x11\xf6\x50\x5d\xf9\xf3\xde\x2e\xb7\xd4\xd3\xa9\x34\x79\xd9\x9e\x55\x18\xa9\x94\xd7\xf2\x47\xdd\x11\x05\x7f\x1c\x89\x6d\x0c\x2c\xfd\xc8\x4d\x70\x69\x1c\xfa\x63\xee\x00\x60\x70\x69\x40\x7a\xa4\x14\x30\xb8\xf4\x53\xc7\xcc\x2f\x58\xca\xeb\x75\xcc\x72\x82\x52\x64\xef\x75\x64\x6a\xfa\xfb\xba\xc8\x0a\x39\x65\x5f\xff\xd0\x99\xfc\xfc\x99\x02\x09\x78\x59\x25\x27\x81\xf9\x41\x7a\xfa\x31\xcb\x89\xf7\x30\x4c\x73\x74\x39\x82\xa7\xc7\x29\x10\x53\x1c\x9d\x56\xf5\xe8\x49\x0a\x14\xeb\x8d\xf1\x39\xe8\x81\x3a\xd2\xb1\xbc\x86\xdf\x95\x0e\x78\xca\xa2\x34\x3a\x53\x01\xdb\x00\x89\x38\x6c\x27\x13\x03\x24\x4b\xf8\xf0\x61\x0a\x90\x88\xf1\x47\xe9\x7d\x6e\x7f\x03\x84\x3d\xed\x80\x18\xef\x06\x89\x67\x7a\xda\x9a\x68\xcb\xf4\xf6\xa8\xf5\xb1\x2d\xcb\xdb\xc3\xc7\x1c\x84\x1f\x5c\x98\xff\x80\x0c\xff\x24\x82\x48\x50\xfa\x70\xcc\x79\x4a\x7a\x5a\x01\x52\xc1\x66\xef\x39\x58\x72\x50\x1d\x7b\x57\x73\x70\x82\xa4\x67\x94\x9d\x2a\x72\x76\x77\xf8\xaf\x64\xa1\x36\xe8\xd3\xa8\x61\x1c\x71\xc0\x48\x9d\x44\x5b\x34\x14\x6a\x38\x4e\x81\xc6\x31\x55\xc2\x07\x7a\x76\xee\xa1\x8e\xb7\xa9\xa6\x1e\xea\x61\x6c\x7a\x42\x2d\xaa\x05\x15\x82\x0d\x5c\xe2\xcd\x13\x0e\xd3\x3a\x3c\xc6\x8f\x1f\xb5\x2c\x15\x11\x20\xf3\xb6\x3d\x6e\x59\x3e\x22\x48\xb6\x4f\xdb\x25\x5b\x22\x48\xb6\x59\xdb\x16\x90\x08\xf2\x24\x12\xa1\x12\x2b\x88\x85\x6c\x9d\x71\xe0\xf3\xc1\x20\x80\x93\xc7\x5d\x80\x29\xbd\x1d\x71\x27\x67\x04\x99\x92\x1d\xac\x71\xe7\xcb\x53\xea\x3b\x49\x69\xcb\x43\xb6\x89\xd0\x9b\x0e\x56\x72\x25\xd7\xf2\x66\x91\xaf\x12\x2b\x0d\x1c\xda\x1e\x4a\xc9\xe9\x62\xd5\xcc\x66\x31\x10\x3a\x52\x1f\xa5\x40\x69\xfe\x53\x37\x54\x7a\xfc\x44\x5e\x5d\x0f\x95\x1e\x3e\x8f\xb8\x15\xc2\x43\xa5\x49\x51\x4f\xb9\x19\x62\xa5\xaa\xa6\xcd\xff\xbc\x23\xbb\x6d\x5c\x41\xfb\x1f\xbf\x9f\x66\xf5\x8f\xb9\x41\xb7\xcb\xa4\xf2\x94\x3b\x7f\xbb\xac\x29\x8f\xb8\x3f\xbe\xc3\x90\x02\x5f\xe0\xef\x17\x4d\x10\x82\x80\x22\x4e\x21\x71\x6d\xcc\xee\xa7\x53\x7c\x1c\x6d\x99\xa2\x59\xa6\x05\x07\x22\x81\xd0\x02\xa4\x79\x5c\x91\x5e\x60\x01\xd2\x1c\xae\xe3\x68\x5f\xe8\x9b\x2c\xa9\x73\x81\x56\x8d\x13\x7e\x50\x27\x02\xb9\xfd\x0c\x70\x33\x9e\xc4\x00\x8c\x85\x51\x06\x22\xfb\x96\x44\x04\xb7\xa8\x3c\x89\x3f\x26\x91\xbd\x8f\x29\xfb\x90\x7d\x4d\x2c\x74\x83\x6e\x13\x99\x25\xd3\xf3\x8e\x1d\x88\xad\xdd\x1c\xdf\x6b\x29\xa5\xec\x5e\x4b\x1d\x65\xf7\x5a\x8a\xa8\xbf\xa7\xcd\x3a\x2e\x37\x44\x59\xe7\xdc\x09\xe3\x81\x3a\xd2\xfa\x82\x9d\xd0\x43\x75\xe4\xf5\x05\x63\x80\x87\xea\x48\xec\x0b\x19\xe7\x1e\xaa\x23\xb3\x2f\xc4\x5b\x55\x7a\x2d\x23\x43\xce\xa9\x3f\x28\x8f\x5b\x30\x63\xae\x5c\x60\xbd\x9b\x47\x2d\x20\x3f\xf5\xd3\xc7\xe4\x94\x0c\x0b\xef\x81\x42\xb4\xe1\x13\x52\x34\xdb\x33\x0a\x31\x9c\x4f\x51\x12\x09\xab\x6f\x64\x96\x15\x2a\x46\x7a\xab\xfc\x4c\x6a\xd8\xf4\xd6\x7e\x2f\x6a\x74\xda\x34\x4f\x8e\x38\x7e\x3a\xcd\x99\xf6\x74\xf0\xea\x7d\xa7\x21\xd3\x9e\x34\x4f\xe2\xd7\x24\x3c\xfe\x74\x28\x1e\x3d\xf6\x00\x65\x16\x93\xd0\xb1\xdd\x30\x60\x4c\xf4\xd6\x8c\x54\xc1\x3c\x39\x75\x47\xf9\xe3\x04\x62\xcc\x4f\x7b\x12\x2f\x9e\x26\x30\xfe\x8b\x1e\xfb\xda\x1a\x3e\x46\xaa\x55\xd0\xe0\xf4\xb1\x17\x2d\x52\x98\x93\xad\xd3\x31\x0b\x55\xc4\x15\x80\x48\x2f\x78\x92\xc0\xa4\x4e\xbe\x4e\xa0\xd4\xf9\xf0\x94\x1b\x1b\x1d\x50\xea\x76\x78\xcc\x7d\x62\x0e\xa8\xc3\x93\x19\xdc\x18\x26\x57\x65\x29\x23\x16\xf8\xe4\x78\x28\xbc\xcf\x11\xef\x77\x08\x0c\x5e\x5e\x40\x88\x0e\x41\xc1\x5b\xad\x11\xa2\x43\x40\x08\x34\x01\x10\x6d\xc1\x20\x60\x65\xa3\x2d\xdb\x6b\x54\x2d\x33\x36\xb3\x77\x27\x30\x81\x5d\x03\x9f\x85\x13\x36\x7d\x15\xab\x62\xf5\x84\x82\xc9\xc2\xb6\x4d\xed\xd6\xe0\xda\x18\x47\x27\x50\xdb\xf2\x61\xa7\xf2\x34\x3a\xc6\x3c\x0c\x9b\xb4\x3d\x4f\xc7\x51\x81\x02\x0f\xc5\xa6\x0d\x81\xa6\x91\xfb\xd0\x43\x3d\x8c\x34\xbc\x27\x4f\x3b\x5f\x18\x66\x6e\x17\xea\xa8\x35\xf1\xd8\x82\x7e\xec\x98\x89\x17\xc9\x3b\xea\x6c\x3c\x7d\xd2\xf2\x1a\x74\xd4\xd8\x78\xf2\xa8\xe5\x32\xe8\xa8\xaf\x01\x86\xac\xd8\xd4\xd6\xae\xad\x81\x0b\x13\x5b\xb6\x3b\x8c\xfa\x1d\x93\x2f\x5b\x76\xef\xc8\x75\x6f\xef\x77\xb9\xa5\x23\x80\x0e\x77\x74\x50\xc8\x2c\x40\x87\x1b\x3a\xa8\x63\x16\xa0\xcb\xfd\xec\x25\xe6\x4d\xd6\xb0\x47\x3c\xde\x95\x01\xb5\xd2\x32\x3a\xa1\x5a\xe9\x19\xa1\xe8\x06\x83\x6a\xa5\x69\x84\x98\x66\x06\xd5\x4a\xd7\xf0\x71\xec\x2d\x7f\xc9\x63\x1f\x88\xeb\x8f\xf5\xb6\xa7\xe4\xe9\x53\x8a\x53\x64\xf4\xd3\xf2\x91\x60\x4d\xd1\x78\xbf\xb6\xbc\x23\x60\x13\x3a\x89\x44\xac\xb6\x5f\x04\x7c\xeb\x47\x11\xe5\xd7\xcc\x13\x4e\xf1\x45\x3c\xf8\xa4\x96\x2d\x8f\xe0\x23\x16\x26\x5f\xcb\xf4\xe4\xb4\xaf\xf0\x3a\x44\x2d\xd3\x63\x33\x92\xfb\x6b\x59\xb6\xad\x1e\x5e\xa0\xaa\x17\xb9\xa9\x0b\x56\x11\xef\xd4\x95\x31\xf1\x55\x47\x09\x24\x35\xb7\x45\xba\x2a\xc1\xa4\x16\xc5\x48\x6a\x21\x98\xd4\x9e\x18\xb9\x9a\x08\x26\x35\xb1\x45\x3b\xb1\xd6\x4b\x59\xeb\x68\x36\x4f\x9f\xb2\x63\x03\xef\x8f\x77\x01\x24\xe1\x51\xc7\xec\x58\x41\x80\x78\xa2\x76\xe9\xfd\xa9\x82\x00\x49\x60\xd4\x09\x3b\x55\x5a\xa6\x80\x53\x1f\xed\x78\xd4\x82\x89\x76\x58\x5c\xda\xb1\xad\xff\x1f\xb5\x0a\x3b\xb6\x35\xff\xa3\x56\x59\xc7\xb6\xce\x7f\xd4\xaa\xea\x18\x57\xfb\x09\x22\x5a\x78\x53\xdb\x1e\x60\x19\x25\xd8\x70\x3c\x0b\xdc\x60\x0a\x00\xb7\xa2\x67\x73\x1b\xac\x00\x10\xbd\x7d\xd2\x02\x4a\x2c\x65\x51\x72\xc0\x06\xdd\xdf\x7e\x99\xcf\x23\xb9\x59\x28\x19\xbe\xeb\x24\x18\x8b\x9f\x72\x80\x34\x7c\x63\xcc\xa3\x96\x01\x22\xa5\x6e\x88\xbe\x3e\xe1\x10\x29\x6d\x9f\xf2\x8f\x06\x88\x94\xb2\x4f\x39\x0f\xec\xaa\x01\x13\x91\x03\x00\x98\xa5\xbe\xea\x2a\xae\xeb\x25\xab\x4d\xfe\xd7\xa3\xe8\x7e\x87\xe3\x35\x06\xe8\xf0\xb8\xc6\x00\x1d\xae\xd6\x18\xa0\xc3\xc7\x1a\x03\x24\xc6\x3e\x6e\x5c\xbe\xf3\xe1\xb3\x3b\x87\x87\xe2\xcd\xd7\xdf\x7d\xfb\xfc\x85\xf8\xf2\xe5\xab\x17\xcf\x44\x91\x4f\x32\x5d\x1f\xfe\x68\x0e\x8b\x7c\xf2\x6e\x36\xfa\xd1\x58\x90\xe7\x7a\xb5\xae\xf2\xf9\xa2\x16\xfd\xe9\xc0\x9e\x84\xc7\x50\xac\xfb\xf9\xa2\xd2\xcb\xbc\x59\x8a\xaf\xdf\x88\xf3\xa6\x5e\xe8\xca\x8c\xc4\x79\x51\x08\x80\x35\xa2\x52\x46\x55\xd7\x2a\x1b\xd9\x31\xbe\x33\xa1\x4f\xba\xd1\x4d\x35\x55\x62\xaa\x33\x25\x72\x23\xe6\xfa\x5a\x55\x25\xb6\xd1\x96\xe2\x4f\x6f\xbe\x38\x30\xf5\xba\x50\xa2\xc8\xa7\xaa\x34\x4a\xd4\x0b\x59\x43\xcb\xef\x89\xb2\x23\xcd\x74\x53\x42\x47\xd4\x7a\xa1\xc4\xab\x97\xcf\x5f\xbc\x7e\xf3\x82\x2a\x72\xdf\xe9\x35\x06\x3b\x69\x4d\xeb\x5e\x28\xef\xfd\xe7\x4a\x4e\xc4\x44\xce\xed\x04\x9a\x3a\x2f\xf2\x7a\xed\x5b\x45\xb1\x0a\xe2\x33\x71\x26\x7e\xe6\x6d\xbd\x2a\x25\x6b\x25\xa4\x68\xca\xfc\xa7\x46\x09\x55\x36\xcb\xb8\x7b\xd7\xff\x35\xcd\x6a\x55\x29\x63\xc4\xcf\x45\x5e\xd6\xcf\x17\x6a\x7a\x65\x3e\x6c\x6c\x87\x75\x2e\x16\xcd\x52\x96\x62\x56\xe5\xaa\xcc\x8a\x35\x5e\x9d\x41\x5b\xcb\x49\x33\x9f\x53\xa7\xc5\xd0\x18\xeb\xeb\xc9\x8f\x6a\x5a\x7f\x10\xe7\xd1\x14\x00\x1f\x37\xba\xec\xd5\xd0\x77\x4e\x56\x4a\xa8\x9f\x1a\x59\x08\x68\x4c\xb7\xae\x17\x79\x39\x87\x1e\x6b\xec\xd3\x46\x53\xf8\x98\x17\xf6\xf9\xce\x3e\x59\x87\x87\xe2\x7b\x25\x2c\xfa\xa4\xc0\x16\xa2\x42\xc3\xdb\x85\x34\xa2\xd4\x61\x50\x61\x16\xd0\x31\x73\x62\xa1\xa9\xdf\xf9\x52\x1c\x1c\x88\x1b\x25\x6e\x64\x59\x43\xd7\x68\x3b\x9c\x5b\x8a\x72\x2e\x56\x55\xbe\xcc\xeb\xfc\x5a\x19\xea\xb0\x59\xac\x47\x42\xfc\xa9\xa9\xe9\xc3\x55\x65\xb0\xc5\x5d\x5e\x4e\x8b\x26\x53\x42\x37\xd8\x32\x6c\xc4\xfa\x52\xa9\x1b\x9a\x18\xce\x3a\xea\x51\xf5\x2d\x36\xc8\x12\xd7\xb2\xca\xe5\xa4\x50\xa2\x52\x33\x55\xa9\x72\x0a\x3d\xb9\x85\x64\x7d\x2c\x2d\xf8\x7f\x11\x18\x76\x5e\xd3\xd8\x49\x6d\xa6\xab\xa5\xf8\xb7\x2f\xbf\x7b\xfd\xfc\xed\xcb\xaf\x5f\xf7\xff\xeb\xfc\xdb\xd7\xe7\x5f\xbd\x18\x8c\x84\x70\xd7\x2c\xb1\xca\x52\xe8\x95\xc5\x9d\x2c\xec\x48\xca\x4c\xe5\x4a\x85\xf6\xb3\x76\x09\x56\xab\x62\xed\x6a\xc7\x47\xe4\xf2\xa5\xae\x84\xba\x95\xcb\x55\xa1\xb0\x71\x2e\x2e\x0d\x75\xf7\xfa\x2f\x59\x99\xfe\xbd\x7f\xeb\xdb\x2d\x5b\xe7\xe5\x7c\x30\x14\xff\xa6\x4a\xbb\x49\xbe\xfb\xf6\xe5\x73\xd7\x60\x10\x3f\xde\x6e\xf1\xfb\x9d\xad\x61\x7f\x16\xee\xf9\x67\xe2\xde\xbf\x5b\x1e\xb0\x19\x16\x9b\x8c\x3d\x13\xf7\xfe\xac\xf5\xbc\x50\x0f\xee\x61\x33\x6a\x98\xeb\xf7\x76\x39\x2a\x65\x9a\xa2\xb6\x18\xc4\xa1\x86\x02\x21\xff\xed\xf8\x4f\xf7\x38\x71\xb1\x2f\xe0\xd4\x65\xea\x6a\x68\x97\xc4\x20\x89\xd1\x42\x9a\xba\x0a\x0d\xcd\xfe\xad\x7f\x21\x0f\xfe\x7a\x79\x7f\xf0\x43\xbf\x7f\xf1\x97\x1f\x06\x97\x0f\x06\x3f\x0c\x0e\xe7\x39\x6b\xb0\x0d\x2d\x01\x87\x62\x56\xc2\x58\x81\x62\x5d\x3f\xc0\x7a\xbd\x52\x7a\x06\xef\xb9\x20\x80\x4b\x71\x76\x26\x7a\x4d\x09\xdd\x62\x55\xd6\x1b\xf8\x76\xba\xd0\x70\x59\xf4\xbe\xc3\x56\x79\x9e\x5e\xb0\xd3\x1f\x3d\x4d\x8d\xb4\xb1\x39\x61\x05\x7d\xf9\xf9\xd8\xfe\xb6\x7d\xf9\xac\x74\xcd\xd7\x22\x2c\x8c\x3c\x7b\x89\x9a\x82\x5f\x53\x47\x82\x0d\xb0\x17\xb3\xf2\xb2\x5f\x5d\xfb\xb6\x85\xd4\x29\x11\xdf\xc3\x07\x4a\xbe\x22\x21\x42\xfc\x98\x59\xe9\x87\xb9\x13\xb7\x41\xac\xae\xa9\x0b\x62\xbc\x87\xbe\x74\xd3\xe0\x0c\xd7\xee\x62\x6a\x21\xcd\xa7\x4c\x44\xf2\xbc\xc8\x55\x59\x1b\x80\x95\x59\x86\x44\xef\x7a\x0c\xd6\x5a\xa8\xdb\x5a\x95\x59\x07\x99\x0f\x36\x50\x4f\xc0\x05\xf5\x50\xf0\x1b\xe0\x59\xf8\x75\xc8\xaf\xfb\x8d\xf1\xac\xe3\x1a\x40\x02\x72\xfe\xfd\xed\x57\xaf\x9e\x45\x94\xc9\xdb\x5e\x2e\xe5\x8a\xde\x07\x8d\x2d\xfe\xd0\x7b\x26\x7a\x9f\x16\xf5\x67\xd4\xe9\x42\x88\xde\xe7\x70\x69\xce\x2f\x7d\x0a\x97\xe4\x72\xc5\xae\xdd\x83\x6b\x3f\x35\x9a\x01\xde\xeb\xdd\xb3\x17\xff\xcf\xc3\xa7\x9f\xf5\x10\xef\x71\xa7\xf6\x68\x3f\x5c\xfc\xe1\xf3\x4f\x7f\xb8\xf7\x43\xef\xf2\x70\xce\xb7\xc0\x40\xfc\xec\xc0\x97\x72\x75\xb1\xbc\xa4\xb6\xf1\x1f\xf8\x02\xfe\x59\xd5\xc0\x73\x5c\x87\x47\x39\x9d\xaa\x55\xad\x32\xf1\xdd\x4b\x51\xc8\x72\xde\xc8\x79\x68\x54\xee\x0e\x28\xff\x0e\xec\x06\xfd\x41\x4c\x65\x51\x4c\xe4\xf4\xca\xd3\x83\x5d\xc8\xbc\xbc\xd6\x57\x0a\xe9\xc0\xbe\x02\x19\x83\x19\x09\x2b\x08\x38\xf6\x02\x23\xaa\x5a\x55\xc0\x27\xfd\x34\x0a\x0d\xcd\x50\xec\xde\xe1\x87\xed\x68\xae\xea\x73\x98\xe1\x2b\x37\xb7\xa8\x79\x29\x4d\x23\x74\x71\xdc\xf4\xd4\x68\x6a\xe5\x10\xf5\xa6\x59\xad\x74\x55\xab\xac\xef\x3b\x9a\xe2\x8d\x51\x3e\x7e\x52\x76\x3c\x17\x5e\xf1\x59\xda\x95\xd4\xa8\xfa\x6d\xbe\x54\xba\xa9\xfb\x7e\x42\x7c\xff\xb9\x27\xfb\x17\xa5\xbc\xce\xe7\xb2\xd6\xd5\xc8\x61\x38\xac\xe5\x01\xb4\x6a\x7c\xd7\x1b\x5c\x86\x1d\x6d\xe5\xb3\xb0\x70\xfb\x7e\x12\x47\x4c\xc4\x4b\x6f\xf2\x32\xd3\x37\x04\x2e\x3e\xfd\x94\x7f\x72\xb4\xb9\xbf\x91\x15\x1c\xed\x3f\x35\xaa\x5a\xbb\x63\x99\xba\x93\x2e\xa4\x59\x44\x2d\x42\x6b\x79\x65\x8f\x46\xd1\x54\x45\xfa\x40\x38\x29\x7b\x76\x41\xc7\x67\x70\xc0\x7d\x6a\x7f\x3f\xc6\xdf\x7b\x42\x96\x99\x1d\x6a\xea\x7a\xeb\xb3\xfe\xdc\x24\x52\xf0\x13\xf7\x67\xa0\x8c\xf1\x33\xd1\xc3\xc7\x87\xf0\xf7\xb1\xff\x5b\x7c\x18\x51\x63\x7d\x49\xad\xf5\x41\x6a\x92\xab\x95\xb2\xc7\xcd\xb2\x29\xea\x7c\x55\x28\x51\xe7\x4b\x3c\xec\xed\xc8\x7c\xd6\x43\xa1\x4b\x7b\x20\x23\xa1\x16\xd2\xd4\xd4\xf9\x1b\x24\x0e\x1c\xc7\x3d\x87\x74\x9d\x34\x67\x2d\x33\xd7\xdf\xde\x4a\x0b\x2b\x69\x2c\x4b\xb4\x2c\xb8\x99\x2f\x44\xa6\x52\xa6\x23\x26\x6a\xa6\x2b\x25\x26\xca\xa2\x4c\x66\x99\x02\x74\x90\x40\x40\x47\x2a\x22\x62\x53\xf3\x54\x98\x3e\x49\x61\xd8\x7e\xb3\xa2\x7e\x34\xd0\xf1\x18\xbb\xbf\xe6\xb5\xc0\x66\xbe\xb8\x2d\xa5\xdb\x86\x85\x92\xd0\xbd\xa6\xf7\xc7\x1e\x76\x11\xee\xfd\xb1\xe7\x1b\x08\xe7\xf3\x52\x57\xbc\xbb\xf9\x6c\x04\x43\xfe\x27\x20\x8c\x91\x19\x9b\x42\xd8\x82\xec\x62\xd4\x48\xf8\x8f\xae\xcd\x39\x9f\xf8\x99\x88\xc0\x9b\x89\xa9\x2b\xe8\xc9\x7b\x87\x9d\xac\x3f\x7f\xf0\x7f\xaf\x64\x0e\xe2\x43\xf4\xd4\xaa\xc8\xeb\x7e\xef\x53\xec\x77\xda\xd5\x47\x1a\x9e\xea\xea\x52\xef\x86\x14\x67\x08\x73\x91\x5f\xba\xe1\xce\x7a\xb4\x21\xab\xeb\x8b\xf6\xfa\xf5\x2d\xf8\xc5\xd1\xe5\xe0\x52\x9c\x75\x2c\x2f\xde\x1e\x5f\xb6\x3a\x4b\xdb\x63\x35\xda\xd4\xdf\x7d\xfb\x8a\x63\x74\x25\xeb\x45\x07\x37\xfb\xee\xdb\x57\x1d\x1c\x8c\x1f\x10\xb4\xa7\xab\xa6\xb4\x34\x4e\xcf\xe0\x70\xbc\x71\xab\xbd\xd0\x9e\xc1\xaf\x66\x25\xf4\xda\xf6\x15\x7a\x41\xdc\x09\xb9\x90\xcb\x95\xdf\xa8\x79\x59\xab\xb9\xaa\x40\x28\x16\x66\xa5\xa6\xf9\x2c\x57\x99\x80\xe0\x9b\x94\xf4\x09\xf6\x83\xb8\x06\x8a\xc7\x1d\x5a\x6b\x4b\xb3\x53\x3b\x28\xd2\x6c\x1b\x7c\x99\x97\xf0\xc0\x32\x2f\xf3\x65\xb3\xa4\x43\x0f\x74\x00\x2f\x7b\x77\x3c\x25\x6f\xf1\x29\x79\xbb\xf1\x29\xaf\x39\xc1\x37\x31\xb4\x5d\x0f\xed\xdb\x86\xf6\xe1\xb0\x9e\xd7\xe2\x0f\xf6\x6a\xb4\x70\xcb\xbc\xfc\xcc\xdf\xfe\x1c\xe0\xa3\xdb\xf2\x96\x75\x95\xbe\x8e\x10\xf9\x4a\xcd\x6a\xb1\x92\x99\x90\xa2\x6c\x96\x13\x87\x44\xc4\x2b\x35\xd3\x87\x6d\xef\x76\xfb\x5f\x55\xa5\x5b\x87\x3b\xf2\x8d\xf7\xfe\xb3\x69\x28\xfb\xe5\x61\xd4\x95\xdc\x80\x5a\x7a\x8d\x85\xce\x94\xc9\x2b\x95\xd1\xa5\xcd\xdd\x9b\x57\xc0\xee\xdc\xe0\xd2\x44\x9a\x97\x43\xe8\x5f\xed\x77\x71\x25\x14\xa0\x87\x34\x78\x44\x94\x4e\xe1\x03\x88\xc1\x68\x25\xb3\x37\x96\xed\xf4\x11\x74\x28\x7a\x47\xbd\x54\x11\xc4\x4e\xdf\x8e\x65\x4e\x75\x59\xcb\xbc\x04\x4e\xec\x8e\x0f\x9c\x9c\x6b\xb3\x2d\xa6\x0b\x59\xc9\x69\xad\x82\x58\x0b\x87\xe0\x52\xd5\x0b\x9d\x89\xa5\xcc\x61\x04\xfc\x14\x59\xe7\x53\x31\x95\xd3\x85\xd7\x1a\x0b\x59\xcd\x95\xa9\x85\x5c\xea\xa6\x84\x93\x0d\x4d\x48\x76\x68\x50\x10\xaf\x55\x25\x2a\xf5\x53\xa3\x4c\x0d\x7d\xde\x5f\xd6\xa4\x41\x5b\xfd\xdd\x09\xd8\xb5\x16\x73\x55\xaa\x0a\xec\x0d\x76\xe3\x18\x59\xaa\x62\x2d\x16\xcd\x5c\x85\xa1\xa1\x13\xbc\x1f\x7d\xe3\x0e\xea\x58\xb7\xae\xd9\x8d\xba\x4e\x9e\x73\x87\xb8\xd0\x85\x9c\x3e\xd4\x7f\x03\x23\x02\x26\xca\x7d\xef\xc7\xe5\x4b\xcb\x97\x14\xb8\x1e\x4e\xed\x0f\x67\xe2\x28\xda\x0a\xbd\x9e\x3f\x06\x66\xe2\x0c\x94\x88\x78\x50\xb7\x8f\xee\xce\x46\xe1\x0b\x70\x08\x7e\x45\x9c\x89\x5e\xd0\x6e\x71\xd0\x9b\x45\x5e\x28\xff\xea\xcf\x23\xf8\x11\x9f\x60\x32\xd4\x83\xb3\xe8\xef\x94\xdd\x47\xc3\xd0\xe9\x76\xe4\x89\x18\x89\x52\x10\x55\xbe\x28\x4d\x53\x91\x21\x4b\x06\x63\x41\x6e\x40\x92\x24\x05\x0b\xec\x14\x53\x55\x59\x6a\x03\x69\x46\x14\xf9\x32\xf7\x32\xc2\x9b\x7c\x69\xc5\x9c\xc6\xc8\xb9\x12\x85\xd6\x57\x56\xcd\xba\x52\x88\xab\x91\x83\x02\x5d\xab\x52\xf3\xdc\xd4\xaa\x7a\x59\xe6\x35\x1d\x34\xb2\x90\xd5\xb2\xaf\x4b\x7b\x69\xe0\x95\x7c\x20\x74\x10\x0d\x0a\x6d\x37\xc8\x8d\xac\x4a\xd6\xf8\x8e\xba\xe3\x5b\xc4\xe3\x93\xfd\x81\x9d\x73\xa9\x6b\x52\x08\xdc\xc4\xed\x58\x8f\x84\x51\x53\x5d\x66\x7e\x17\xbd\x9c\x89\xb5\x6e\x7a\x56\x64\x52\x95\x15\xf5\xec\xc8\xc6\x1e\x2e\x7a\x65\x29\x1d\x54\x0b\x8b\x91\xa5\x5c\x83\xc8\x29\x0a\x5d\xc2\x71\xb1\x90\x65\x18\xce\x0e\x02\xe2\xa4\x2c\x41\xf6\x12\x52\x64\x0d\x3d\x9e\x5b\x1e\x5b\x14\xb9\x03\x95\x06\xe6\xed\x0c\x34\x34\x44\x50\x4c\xe2\xa9\xb9\xe1\x9c\x70\x9b\xa9\xb2\xb6\x27\x94\x95\x06\x4d\xad\x24\xb4\xe2\x97\x41\x21\x72\xeb\x36\x84\xef\x2a\x0a\x31\x57\x35\x8a\x5d\x37\x95\x15\x23\x2b\xb7\x87\x75\x25\x2a\x59\x2f\xdc\xa7\x48\x61\xf2\x72\x5e\x28\x07\x36\x12\xe2\x85\x9c\x2e\x60\x60\x42\xb5\x1d\x24\x3c\x7c\x83\xb6\x17\xe2\x64\xf8\x54\x26\xae\x55\x65\xec\x47\xd3\x7e\xf4\xd3\xba\x81\x1d\x5e\x6b\x3b\x86\x14\x66\x21\xe1\x4f\x54\x5f\x40\x41\xcb\x8d\x5d\x35\x2b\x3c\x4d\xa5\x51\x46\xdc\x2c\x54\xa5\x00\x01\x64\xaf\x13\x8a\xd3\x67\x6d\xcf\x14\x53\xdb\xe1\x74\xa9\x10\x07\x46\x01\xf3\x70\xef\x84\x01\x1d\x09\x90\xb8\x2b\xdd\x3b\x85\xba\x5d\xe5\x55\xd0\x34\x71\x5b\x03\x01\x7a\xf3\x07\x92\x63\x6f\xa6\xea\xe9\x82\x64\x61\x90\xc9\xbc\x51\x4c\xeb\x11\xdc\x44\x0b\x68\xdf\x91\xef\x9b\x66\x3a\x55\xc6\x0c\x86\xc2\x5d\xf9\x52\xe6\x45\x53\xa9\x40\xd3\x2d\xc5\xf6\x3e\x57\x6a\x2d\x53\xe4\xc6\x3a\x8b\x5c\xb0\x10\x96\x38\x62\x7a\x12\x7e\xb0\xc4\xf4\x6e\x69\xc4\xd7\x8e\xa6\xc2\xf1\x11\x91\x9e\x1d\x4b\xe6\x5e\xf8\xaf\x64\x6e\x17\xdd\xc9\xe4\x7e\x78\x21\xbe\x50\x33\x09\x46\x35\x23\x1e\x1d\x1d\x1d\x89\xbe\xa7\xf4\x41\x7c\xae\xba\x69\x7e\xb0\xe4\xea\x3f\x00\x54\xeb\xf0\x05\x0b\xe5\x14\x17\x14\x22\x82\x62\x33\xf1\x7a\xb9\xbd\xef\x88\xc8\x8d\x83\x2a\x44\x3c\xaa\xd3\x32\x36\x8e\xe9\x06\x9c\xa8\x78\x0e\xb2\xf6\xa7\x97\x01\x3b\x6d\xfa\xb6\x48\xef\x77\x94\xd0\x52\xf5\x87\x84\x6b\xe4\xc6\x60\x97\xb1\xfa\x00\x2d\xc0\xfb\xf7\xe2\x91\xb8\x2f\xc6\x47\x47\x47\x9f\xd1\x6d\x53\xdb\xb9\x3b\x9a\x9a\xab\xfa\x8d\xbd\xe0\x74\x0c\x9a\x7e\x5b\x83\x87\x3e\xad\xb9\x11\xba\xa9\x55\xd5\xc5\x8d\xf3\xe5\x52\x65\xb9\xac\x15\x98\xa9\x5f\xd6\x3d\x23\x60\xcb\xd4\x5a\x4c\xe5\xaa\x6e\x80\xda\x4b\x75\xe3\x46\x33\x53\xbd\x42\x3b\xbe\x45\x9b\xdb\x06\xce\xb6\x38\x8a\xba\xc3\xf6\xe8\x76\x2f\xd8\xaa\x73\xe3\x76\xed\x64\x8d\xf6\x33\x37\x44\xe0\x38\x56\x09\x05\x3e\x81\x23\x85\xcd\x4f\x2c\xc5\xab\x3c\xee\xd1\xb3\x1d\x46\x0c\x0b\x0b\x8a\xf4\x99\xb7\xa0\xfa\x41\xcf\xce\x44\x0f\x89\xa1\x37\x10\x7f\x44\xb0\x67\x81\x74\xd0\x46\x1a\x0c\xc8\xe2\x0c\xff\xf3\x47\xd1\xef\xa1\xed\x11\x8d\xb4\xcf\xe0\x58\x27\x8b\x09\x1e\x25\x23\x7b\xc2\xf4\x7b\x8c\x10\x9e\x25\x6c\x23\xc3\x11\xfa\x4b\x23\x0e\x61\xb1\x07\xe2\x81\xe8\x19\x3f\x6a\x3a\x60\xa1\xe7\x7d\xa0\x03\x7f\x27\x60\xa0\x6c\x8a\x82\x4c\x9d\x43\xb1\x34\x03\xb2\xbb\xd9\x4f\x27\xbc\xfd\xd9\xf3\xdc\x8d\xa6\x27\x26\xa5\x74\xda\x82\xc0\x04\x8d\xaf\xe4\x97\x85\x98\x16\x4a\x56\x6e\x05\x1c\xc4\x67\x0c\xa0\x6b\xa2\x91\xbd\x36\x68\x80\x0e\xf5\xe0\x5b\xe8\x5b\xf0\xa1\x90\xd5\xbc\x59\xaa\xb2\x36\xc1\xba\x14\x99\x17\x99\x6d\xbc\x73\x65\xe3\x6f\x4b\x11\x12\xdb\x28\xd3\xbb\x89\xed\x6c\xd0\xef\x94\xc2\x6b\xde\xd1\xd7\x1e\x76\xb8\x61\xe5\xcc\xee\x3b\x73\x95\xaf\x56\xdd\x72\xf9\xac\x72\xb6\xc2\x54\x1a\x87\x63\xa7\x56\x65\x86\x32\xb3\x13\x9f\x23\x17\x1a\x98\x7b\x50\xd0\xc6\xd9\x1b\x21\x41\x42\xc1\xb3\x24\x3a\xdc\x4b\x01\x66\xcf\xa1\x98\xa8\xa9\x6c\xc0\xd7\x18\xc4\x1e\x44\x94\x95\x08\x8c\x90\x16\xcc\x88\xc9\xda\x0e\x94\x11\x0b\xc7\x4d\x29\x2d\x7f\xb0\x32\xd1\x0d\xf8\xe5\xd0\x0b\xe6\x26\x7f\x2e\xea\xf5\x2a\x9f\xca\x02\x11\xb0\x04\x2f\xaa\x95\xde\x40\x78\x63\x72\x5b\x4c\xd1\xbd\x37\xda\x7e\xb1\xfd\x9a\x9b\x7c\x7a\x05\xf6\x26\x2b\xaa\xc9\xb5\x98\xca\xa5\xea\x0d\x53\x9e\x37\x70\xa7\xa7\xe5\x0e\x9b\xfe\xf7\x5a\xd7\xf9\xd4\x7d\xe3\x72\x29\xc5\x5f\x22\x39\x10\xdc\x7a\xab\x2a\x2f\xd1\x8c\xbc\x54\x06\x64\x4d\x12\x06\x7f\x34\x6e\x86\x43\x31\xd3\x45\xa1\x6f\xc8\x63\xeb\xac\x7a\xa4\x9d\x80\x60\x53\xa2\xde\x4e\x53\xd7\xa2\x52\xd7\x4a\x16\xd4\x4d\xd9\x12\x72\x72\x58\xe3\xda\xe3\x61\x8b\x26\xaa\x2f\x81\x06\x80\x65\xea\xf6\xd1\x8b\x84\x84\x74\x42\xa2\x0f\x90\x3c\x3c\x8a\x56\x69\x21\xa7\x75\x23\x0b\xd1\x73\x38\xea\xe1\x12\xd8\xa3\xae\xb8\xb1\x8b\xd9\x61\x0b\x73\xb0\x9c\x1d\xa4\x73\x0a\xc7\x53\x34\xd3\xb3\xf6\xe4\xff\xd8\xbe\xf4\x40\x1c\x8b\x67\xe2\xd8\x6b\x3b\xf0\x21\x40\x83\x70\xa9\xae\xd6\xc4\x43\xd0\xc5\x63\x0f\xd3\x17\x55\xa5\xab\x3e\x19\xa9\xa7\xd2\x4a\x4c\x7d\x75\xeb\x78\x4d\x18\x40\x9c\x09\x75\x3b\x42\xf4\x92\xa1\xeb\x87\xb2\x17\xcc\x54\xfe\x75\xb4\x0f\xd0\xf8\x96\x58\xd5\xf8\x64\xd1\xc0\x16\x5e\xd0\x65\x65\x63\x03\x5e\xe4\xe2\x20\x7a\xfe\xd2\x1e\x42\xfe\xe9\x8b\xfc\x32\x98\xc6\xff\xf2\x83\xb9\x2f\xeb\x1f\xcc\x83\xc3\xa1\xe8\xf5\x5a\xa6\x34\x36\x6a\xc4\x57\xbe\xc8\xaf\xf3\x4c\xa1\x90\x5f\xdf\x68\x22\x08\x34\xd1\xce\x0a\xad\x2b\xc3\xbd\x13\x43\xd1\x94\x85\x32\xee\x9a\xd5\xe4\x33\x74\x4e\xd8\xab\x60\x93\x05\xf1\xdc\xea\x11\xd3\x4a\x65\xd0\x61\xdc\x2c\x2d\x91\x80\xcc\x33\xb4\x82\xa1\xa3\x68\xa3\x44\x1e\x18\x0a\x6c\x21\x95\x17\xce\x63\xef\x84\xec\xc6\xa8\x59\x53\x58\x09\x1b\xb9\x9f\x33\x84\x58\xe1\xa1\x6a\xca\xa9\xb4\xfa\xb3\x5c\xad\x2a\x7d\x9b\x2f\x25\x3a\xba\xc0\x45\x62\x15\x1f\x3b\x10\x1a\x9a\xf1\xbc\x37\x5a\x64\xda\xb2\x80\x2c\xbf\xce\x41\xf4\x77\xfe\x17\xa3\xfc\xa7\xaf\x73\x55\x58\xcd\x27\xf8\x6a\xdd\xa7\x80\xd2\x54\x68\xa3\xd0\x74\x74\xb3\xb0\x3c\x0d\x1f\xdb\xb4\xfd\xca\x66\x89\xfc\xbd\xeb\x66\xa6\x4a\xbd\xcc\x4b\x7f\xdb\xc9\xa9\x74\x9f\xed\x22\xb3\x94\x55\xfd\xa5\x5d\x0f\x5c\xb0\xc4\xd8\x83\xaf\x18\x0a\x3e\x62\xd8\x54\xd7\xb2\x80\x13\x91\xc0\xc4\x21\x07\x73\x92\x1f\xe1\x5e\x9c\x89\xaf\x64\xbd\x18\xd9\x3f\xfb\xd7\xb2\x18\x38\x33\x81\xbb\x7f\x00\xc3\xfd\x41\x8c\x8e\x8e\x8e\xc6\x8e\x66\xdd\xa1\x8a\x30\x2d\xe7\x0f\xdd\x86\x81\x81\xa8\xfc\xc8\x2d\x6f\x9b\x14\x95\x2c\x33\xbd\xf4\x96\x4e\xd0\xe1\xc1\xbe\x29\xfa\x10\xcb\x60\xf2\x6b\x35\xd8\x84\x6e\x67\xbb\xb4\xbc\xd4\xd4\x7c\x10\xa0\x58\x67\x26\x6d\x3f\x47\xd6\xcb\x45\x3e\x5f\x6c\x7f\x30\x59\x23\x71\xee\x26\x4c\x84\x39\x51\xf5\x8d\x52\x60\xa9\x14\x9f\xda\x71\x23\xbf\x2c\x80\xbe\x2c\x6b\xbe\x7e\xb1\xe5\xb3\x8d\x2b\xf8\x15\x9f\xec\x0f\xc4\x7d\xd1\xb7\x93\x3d\x80\x17\x3c\x10\xe3\x81\x95\xe6\xc0\x2c\xba\x33\xf8\x88\x8e\x9f\x77\x4b\x59\xca\xb9\xaa\xfe\x45\x42\x91\xbe\xc2\xaf\xfa\x0a\x3f\x4a\x4c\x0b\x69\x8c\x58\xc8\x32\x2b\x14\x8a\x36\x55\x29\xf1\xb4\xcb\xff\xaa\x32\x12\x41\xbc\x28\xf4\x5a\xd7\xea\x19\xf7\xf1\x89\xdc\x94\xbd\x5a\x98\x66\x36\xcb\xa7\x39\x3a\x9f\x40\x90\x41\xc9\x02\x0e\xc5\xf1\xc8\xa2\xa8\x52\x3d\xcb\x25\x26\x0d\x78\xf1\xc8\xca\x4f\xe6\x97\x2b\x05\x4e\xba\xa6\x94\xd7\x32\x2f\x50\x27\x29\x45\x8e\xc7\xeb\x33\x16\x3d\xb2\xa8\xeb\x95\x79\x76\x78\x38\xad\x26\xcd\x7c\x34\xd5\xcb\xc3\xf1\xc3\xa3\xe3\xa3\x23\x07\x72\x0c\xaf\xb2\x07\x3f\x88\x7c\x16\xa9\x4b\xb9\x06\xe1\x68\xa2\xc4\x4a\x4e\xaf\xe4\x5c\x65\xb8\x4b\x9e\xe3\x14\x20\x44\xc0\x32\x37\x3f\xdf\x87\xdd\x83\xc0\x00\x15\x3a\xb6\x2d\xa9\x54\xb2\x5a\x27\x43\xd6\x8b\xbc\xca\x0e\x2c\xd4\x9a\x4d\xba\xeb\x45\x7c\x57\xc1\xe9\xf4\x21\x78\xc8\xc5\x2b\xe7\xb8\xf6\x57\x6a\x2d\x0a\x2d\xb3\xa1\x5b\x6a\x5d\x65\x60\xdc\x51\xfe\x3d\x21\x28\xca\x02\x82\xa1\xf7\xb5\xba\x51\x95\x93\xa2\x8c\x0b\x9f\x10\xba\xb0\xcf\xea\x52\x99\x91\x10\x3d\x55\xf6\x44\x6e\xbc\x99\xa0\x81\xb8\x57\x2b\x2f\x16\x6b\x74\x1d\x3a\x9b\xd6\x2c\xaf\x4c\xed\xa7\x64\x99\x5c\x5e\x3b\x63\x9c\x2c\x2a\x25\xb3\xb5\x58\x59\x32\x47\xd9\x13\xf7\x70\x42\x6d\xdc\x30\xeb\xbe\x0d\xf7\x31\x18\x11\xfd\xb5\x77\x56\xa7\xf6\xbe\xe8\xa5\x5c\xf5\x49\x57\xf0\x8f\xab\x82\x45\x24\xa8\xa2\xc3\xe7\x0d\x01\x0a\xc4\x8d\x93\xd1\x47\xf6\x1c\xbe\xfd\x7a\xd6\xb7\x5f\x3f\xb0\x3a\xc9\xc1\x78\x40\x42\x4f\x0c\xd8\x94\x66\x91\xcf\x6a\x04\x44\x01\xc9\x42\x78\x9c\xa2\x08\xc3\x98\xf2\x79\x96\x79\xb9\x15\x82\x7f\x72\x8a\x68\xd1\x91\x48\xeb\x78\x4a\x87\xd3\x3b\xf5\x51\x1b\x0a\xd1\x5b\x4a\x22\x3d\x22\x27\x37\x87\xd1\x8f\x46\x97\xb8\xe7\x85\x78\xa3\xc0\xe8\xf2\x07\xb7\x4f\x32\x75\xad\x0a\x6d\xf5\x73\xda\xb3\x76\xcb\x78\x42\x34\x87\x76\x0b\x1f\xb8\x91\x3e\xdf\xb4\x6e\xa3\x55\xa5\x6b\x6d\x55\xb9\x91\xcc\xb2\xaf\xc2\xc7\xfb\xe5\xc8\xd4\x8c\x16\xd2\x0b\x73\x57\x6a\x6d\xa9\x35\xdc\xc1\x83\x33\x53\x33\xf0\x6a\xce\xcc\xc5\x95\x5a\x5f\x32\x55\xf1\x6e\xa6\x66\x23\x58\xc5\x05\x90\x28\x8b\x5c\x8a\x90\x0e\xcf\xe1\x18\xee\x1a\xe9\xd8\xfc\x10\x05\x3d\xc4\x45\xe5\xdd\xfb\xe4\xf5\xf9\x57\x2f\x3e\xb9\x27\xf8\xf0\x28\xcc\xdc\xfb\x64\x7c\x6f\x28\x54\x3d\x1d\xed\xf9\x2e\x4f\x6a\x4c\x91\x3e\xfc\xe1\x13\x0c\x23\xbb\xf8\xcb\x0f\xe6\x87\x4f\x2e\x1f\x0c\x7e\xf8\xe4\x30\x9f\x0f\x19\x48\x38\xbf\x86\x22\x0e\x21\x8b\xb4\x60\x8f\x98\x08\x13\x17\x10\x8a\x58\xeb\x57\xfa\x46\x55\xcf\xa5\x51\xfd\xc1\xe5\x68\xaa\xad\x22\x5a\x73\x85\xfe\x03\x69\xe2\x1f\x52\x59\xe1\x95\x96\x19\xdb\xc5\x81\xcd\xfa\xfd\xec\x28\x73\xd2\xd8\xa3\x60\x53\x5c\xc0\x4a\xd6\xf6\x84\x10\xe7\x10\x9a\xe1\xfe\x8a\x7c\x5c\x16\xa1\x64\xe1\x05\xf7\x14\x04\xdf\x38\xfe\x02\x66\x1a\x62\x55\x73\x3d\xda\x1c\x07\x34\x74\xd1\x40\xba\x7c\xae\x97\xab\x42\xd5\x2a\x8a\x07\x9a\x28\xef\xb9\xb0\xa2\xae\xe5\x79\xcc\xda\x99\x1b\x08\x4c\xb5\x4f\x91\x2e\x66\x85\x75\x52\xa1\xa5\x9b\x19\x71\x59\x83\x26\x5d\x2b\x36\x83\x18\x2f\xf3\x02\x03\x26\xec\xff\xa2\xd8\x21\x30\x59\x06\x2c\x46\xe1\x46\xe4\xdd\x39\x1a\x8a\x52\xd3\x53\x46\xdc\xa8\x4a\x85\x91\x80\x2d\xef\xde\x62\xb3\xbc\xcc\xce\xcb\xcc\x2e\x59\xd7\x56\x83\x05\x26\xcc\x0f\x19\x7a\x82\x00\x5b\xb0\x70\xa6\x94\xa1\x4d\xb5\xd5\x01\x50\x99\x03\x58\x98\x95\x38\x13\x17\x97\xee\x12\x22\x80\x2e\xdd\x09\x94\x2b\x74\xe9\xe2\x83\xdc\x3b\xfb\xa6\x96\xb5\x27\x65\xbb\x89\xa3\x0b\x22\x0c\x1f\xb8\x39\x32\xd4\x41\xe7\x96\xf5\xaf\xde\x04\x1e\xb8\x45\x80\x88\x3d\x68\xa0\xc2\xbe\x56\xb7\x3e\x96\x69\xc3\xab\x02\xe2\xfa\x38\xc9\x21\xbd\x3d\xda\x42\x84\x92\x64\xc8\x76\x08\x83\x3b\x39\xd8\x9a\xe1\xa1\x43\xcc\xe2\x5b\x1f\x0d\xdc\xf7\x4b\x17\x4e\xc0\xe1\x9d\x6e\x73\x49\x1b\xe1\xa3\x49\x5e\x66\x30\xf2\xd0\xea\x73\xea\x17\x3e\x3a\x93\x85\x41\x8f\x85\xf8\x10\xae\x0f\x9c\x05\x20\x45\x5f\xca\x48\xfc\xf1\x37\xab\xf4\x52\xc8\xae\xa3\x68\x37\x99\x17\xdb\xe8\xbb\xa9\x0a\x4b\xdb\xe4\x6d\x41\xbb\xbc\x2e\xc1\x10\x11\xe8\xfc\x76\x61\x25\x8a\x52\xdd\x88\xff\xdf\x57\xaf\xfe\xbd\xae\x57\xdf\xa2\x87\xb8\x8f\x1f\x72\xbb\xa8\x46\xba\x84\xc5\x2d\x3b\xa2\x4e\x90\x8c\x2c\x90\xa5\xd9\xc6\x88\xbb\x67\xe2\xf8\xe8\x28\x0e\xed\xe5\xef\xf5\x98\x66\x17\xd9\xf3\x83\xcf\xe2\x28\xd7\x88\x62\x81\x16\xd8\xd9\xd9\xff\x8f\x37\x5f\xbf\xc6\xc0\x27\x18\xa2\x52\x66\xa5\x4b\xa3\xde\xaa\x5b\xf4\x8e\xc2\x12\xd2\xe7\xf7\xbb\x17\x0a\xbe\x6f\xa5\xca\x7e\xef\xcf\x2f\xde\xf6\x86\x16\x67\x00\x08\x53\x52\x65\xd6\x32\x89\xe2\x59\xf8\xc9\x78\x34\x1a\x7d\x52\xf2\x00\x75\x1f\x55\xa9\x0a\x05\x06\x5d\x27\x7b\xc8\x6a\x4e\x96\xc7\x4d\x07\xc2\xd2\xcc\x5d\xb4\x3e\x3b\x05\xb8\xa8\x63\x79\xaa\xb3\x14\xb3\x97\x8e\x3a\x24\x60\x78\x1d\x9a\x92\x92\xc1\xfc\x00\x68\x9e\xd8\x48\x5e\xad\xed\x16\x69\x8e\x66\x0e\x46\xeb\x38\x1a\x7c\x69\xe6\x41\x7a\xfc\xe1\x93\xfe\x0f\xd9\x83\x01\x8f\x7d\x15\xf6\xc4\x06\x81\xb1\x65\x8e\xb7\x63\x5d\xc0\x2d\x71\x20\xc6\x97\x9d\x41\xcd\xdf\xa8\xea\x20\x2f\x4d\x2d\x4b\xd0\xf2\x56\x6b\x8b\xdb\xd6\x34\xf7\xd8\x2f\x1d\x9f\x06\xef\xdb\x07\x0b\xa9\xd1\xc0\x1f\xf6\x98\x01\x32\xf4\x16\xce\x62\x4d\x73\x83\xb3\xdc\xd9\xf7\x45\xad\xf5\x16\x02\x80\x43\xbd\x9b\x08\xe0\x16\x11\x13\x33\xe7\xce\x55\xdd\xb5\xfe\x76\x63\x01\x0d\x78\x5f\xa7\xdc\x93\x18\x5a\xd3\xb2\x43\x39\x2b\xb9\x1f\xcd\xc7\x74\xd1\xfa\xe5\x34\x31\xfa\x04\x54\x66\xdc\x79\x0d\xaa\xf5\x48\x90\x2b\xc1\x44\x9f\x00\xe0\x93\xb5\xb3\xc3\xef\xb1\x7a\x73\x55\x27\xa4\xe8\x11\x0f\x9f\x3c\xe4\x33\x66\xfe\x47\x27\xdf\x92\x22\xe3\xa7\x5a\xc6\x72\xaa\x23\x4d\x37\xc1\xb3\x44\x8c\xa5\xe7\xf0\x40\x8f\x4e\x42\x3b\x6a\x14\x79\x07\x6a\xbd\x63\x76\x61\xbc\x24\x94\x99\x3e\xd4\x4d\x68\xc0\xe5\x78\x7a\x28\x6c\x97\xd8\xf7\xe6\x92\x06\x08\x0c\xdd\x6d\x61\x9c\x68\x87\x39\xff\x11\x5f\xce\x24\xb3\x42\xfc\xd1\x2f\xe0\x33\x0e\x97\x1c\xe3\x30\x33\x87\xed\x38\x0a\x2e\xc1\xf1\xdd\xbe\xa7\x43\xb7\x71\xf5\x0c\xd9\x12\x85\x45\xfa\xfb\x67\xe2\xc2\xfd\x7e\xc9\x5d\xbe\x1b\x8e\x7e\x7a\x53\x58\xf5\x84\x55\x54\xda\xb2\x7b\x21\x8b\xc2\xed\x99\x7b\x16\xdf\xf7\xc4\xa2\x5e\x16\x42\xd6\x75\x95\x4f\x9a\xda\x9e\xbb\xce\xec\xe3\x5c\x57\x99\x5e\x8a\x59\x25\xe7\x4b\x15\x3c\x3f\x6f\xc1\xe8\x2c\x0b\x71\xa3\xab\x2b\xb1\x90\xab\x95\x2a\x21\x3e\x79\x85\xef\x79\x39\x7e\x52\x9e\xbb\x31\xf7\x20\xe1\xae\xc7\x62\x25\x50\x2f\x03\xe5\x96\x3a\x83\xbb\x99\x5e\x8e\x30\xa0\x56\x15\x6a\x5a\xeb\xea\xbc\x28\xfa\xbd\x0b\xfb\x5d\x97\xa4\x52\x77\x45\xd5\xc2\xe3\x91\xbd\x3f\x9c\xa3\x5d\x13\xe9\xc3\x03\x17\xf9\x65\x37\x4a\x19\x2e\x3d\x1a\x9d\x2d\x25\xc4\x85\xda\x31\x38\xf6\xc0\xc0\x15\xe0\x49\x6f\x21\x6e\x24\xa4\xb0\x87\xb8\x0b\xa4\x46\x35\xe3\x4a\x39\x05\x43\x5e\xa9\x92\x1c\x43\x13\xc5\x06\x01\x4d\xc2\xbb\xd3\x79\x5c\x37\x67\x2e\x3c\x86\xc9\x82\xb1\x37\x89\x05\x44\x35\xde\x7b\x77\x4f\xf4\xed\x36\xa8\xcc\x54\x57\x6a\x60\x5f\x3d\x14\x79\x6d\x88\xcb\xa1\x2f\xc0\x59\x6f\xc0\xd7\xa0\x6e\xeb\xe7\xa8\x33\x3a\xf2\xa2\xf3\xde\xbd\xec\x2b\x3e\x03\xb0\x32\xc2\x79\x6d\x39\xa6\x86\x68\x22\x46\x82\xba\x0c\xd6\x09\x1a\x06\xe5\x08\xf4\x50\xae\x2a\x35\xcb\x6f\xd1\x7d\x58\x2f\x84\x14\x99\x2e\x0a\x59\x09\x93\xcf\xcb\x91\xe0\x89\x68\xdc\x05\xf9\x87\x49\x53\xd7\xba\x14\x79\x76\xd6\xb3\x22\xcc\x01\xfe\xdd\x8b\xf3\xc7\xec\xb2\x9c\xf5\x7e\xbe\x27\xab\x5c\x1e\x14\x72\xa2\xa0\x70\xca\x27\x79\x76\x6f\x68\xd1\xf2\x4c\xdc\x7b\xf3\xe2\xf5\x17\xef\xfe\xf4\xdd\xdb\xb7\x5f\xbf\x7e\xf7\xea\xfc\x4f\x2f\x5e\xdd\xfb\x90\x8c\xf1\xf9\x1f\x0e\x71\xec\xcf\xd9\x7a\x87\x01\x63\x4e\xef\x62\xd7\xad\x4e\xd9\xd4\x88\xd4\xe8\x1d\xe7\xdf\xbe\x3c\xa7\x17\x8d\xc8\x4c\x8a\x7e\x4e\x59\x13\xe9\x65\x9c\xf0\x6e\xec\x0a\xda\xed\x48\x5e\x64\xf0\x26\xc9\x0a\xa2\xb9\x1c\xd0\xd0\x65\x31\xb0\x98\x7d\x4a\x68\xc0\x87\xbe\xfb\xe6\x9b\x17\xdf\xbe\x3b\x7f\xfd\xc5\xbb\xef\x5e\x7f\xf1\xe2\x5b\x01\x76\xe2\x5f\xb8\x8d\x23\xff\x88\xce\x42\x46\xe6\x73\x7c\x23\x7e\x44\xa1\x6f\x54\x75\x20\xcb\xec\x20\x93\x66\xa1\xcc\xbd\x94\xac\x21\xcb\x02\x1f\xbc\x97\x4c\xef\x9e\x9f\x1f\x8f\xdb\x69\xca\x2b\xca\x84\xea\xcc\x45\xf2\xb6\xbc\x51\xad\xbf\x5b\xad\x9c\xe9\x23\xe8\x65\xb0\x41\xcf\x70\xdf\xce\x55\x1d\xb8\x41\xcf\xde\xe9\x79\x6f\xcc\xdd\x70\xa6\x39\xe1\x3c\xf2\x75\xd2\x38\x4c\x28\x87\x07\x36\x78\x3c\xdd\x71\xa6\x40\x03\xe8\x3d\x97\xe5\x0f\xbd\x1a\x13\x23\x30\xf8\xc4\x4e\xa7\x96\xf3\xd7\x96\x76\x1e\x88\xde\xff\xf1\x17\xf3\xcc\xfe\x8d\x27\x9e\x7f\x83\x73\xb5\xaa\x5b\xef\x85\x3c\x3c\x44\x45\x0b\xe2\xf3\x82\xdc\x61\x18\xaf\x22\xe6\x15\xb3\x28\x33\xea\xb0\xc0\xc1\x8b\x78\xe4\x91\x82\xc9\x70\x7a\x54\x3d\x24\x70\xa3\xea\x1a\x3d\x8a\x2e\x68\xae\xae\xad\x8e\x75\xa5\xd6\x2c\x74\xc5\x1d\xb7\x67\x30\x34\x99\xf1\x68\x74\xbb\xb1\xef\x9d\xcd\xb4\xbe\x37\x14\x95\x3a\x70\x11\x0d\x5e\xee\xcf\xa2\x9d\x35\xf2\x42\x03\x8d\x19\x25\x75\x9c\xf5\x06\x41\x86\xb0\x1f\x73\x26\x3c\x58\x48\xe6\x20\x41\x65\xd3\x9c\x3e\xdc\x89\xa6\xf6\x09\x4e\x6d\x2a\x8b\x69\x53\xc8\x5a\xb5\xc4\xba\xed\x53\xfa\xc4\xe5\x99\xf0\x37\x22\x1d\xb7\x89\xb0\x35\x59\x88\x24\x7a\x67\x17\xff\x4a\xad\x9d\xc8\x64\x67\x96\xa3\xe8\x5d\x38\x2b\x9d\x33\x35\x72\x94\xb3\xa8\xe4\x7e\x2c\x2d\xd9\xc9\xe2\x42\x9d\xc1\x6e\x71\x91\x51\x40\x86\x8c\xe9\x03\xfa\xf0\x11\x2b\x00\x72\x30\xc3\xe7\x6d\xc7\x1a\x5a\xd8\xe0\x73\xdc\xee\x29\x5b\xf9\xe5\xfd\x17\x73\x96\x3d\xd7\xa5\xa9\xab\xc6\x8a\x2d\xb0\xad\x2c\x63\xfd\xc6\x7f\xac\xf3\x6a\xe0\xb9\xcc\xc2\x85\x94\x9d\x32\x5e\x14\x19\x48\x60\xf6\x0c\x5c\xa9\xca\xe4\xa6\x06\x2d\x69\x21\x4b\x72\xeb\x18\x4c\xfa\x30\xb5\xae\x9c\xb6\x5c\xea\x3a\x9f\xad\xc9\x9c\x69\x99\x4d\xb3\x04\x73\xf5\x42\x95\x62\xc5\xd4\x76\x1c\xc5\x4b\x0a\x75\x1c\x9c\xe4\xce\x9e\x89\x9c\x5e\x41\xe0\x73\xad\x2b\x8b\x3a\xf2\x12\x19\x1f\xdf\xa3\x43\xa0\xf0\xbf\xbf\xfd\xea\xd5\x23\x3b\x18\x4d\x67\x28\x26\x0d\x8c\x52\xd9\xc3\x51\x95\xbd\x5a\xc8\x72\x0d\x89\xf5\x18\xc9\x4b\xef\x58\x6a\x10\x23\x84\x78\x49\xf9\x79\x4d\x8d\xe1\xbc\x64\xff\x24\xf7\x99\x74\x6e\x3f\xb9\xca\xf1\xdb\xed\x94\xcc\xba\x9c\x1e\x00\x12\x2c\x4d\x1f\xa2\xf8\x02\x19\x53\x28\x26\xdd\xa8\x5e\x06\x21\x4d\x14\x30\xd1\x4a\x5a\xb3\xab\xf2\x06\x27\x3c\xba\xff\xc1\xa3\x12\xf3\xd6\xf0\x77\x12\x9d\x6a\x8d\x05\x06\xc0\x11\x89\x78\xf1\xfe\x33\x3b\x97\x8d\xaa\x24\x8a\x33\x71\x30\x10\x5d\x4b\xa2\xc0\x2c\xcb\x0e\x8b\xc4\xed\xde\x94\xac\x2a\x7a\x87\xbd\x90\xf2\x11\x15\x33\xc0\x83\xdd\x28\x3b\x81\x5a\x89\x42\x5d\xab\x02\x6c\x31\x8b\x5c\x55\xb2\x9a\x2e\xd6\x3e\x93\x3e\xf7\xb1\xed\x73\x4d\x01\xf3\x0b\x79\x4d\x24\x7f\x95\x97\x19\xed\x99\x72\x8e\x56\xeb\x55\xa5\xaf\x73\xb0\x72\xda\xf5\xc1\xa9\x27\xae\x43\xe0\x73\x4e\x5c\xeb\x1d\xf6\xf0\xc1\x52\xd7\xec\xe1\xbc\x76\x3a\x2f\x10\xaf\x85\xf2\x12\x47\x7b\x63\x44\x99\xf8\x44\x50\x01\x9b\xcc\xf1\xe7\x96\xe9\xcc\x2d\xd8\x67\xc9\x9d\xaf\x27\xc0\x11\xaa\x77\x8e\x0b\xea\x92\x56\xfc\x39\x6c\x82\x77\x2d\x2b\xa6\x05\xca\xcd\xf9\xb4\xce\xaf\x95\x7d\x0a\x4c\x9e\x7e\x58\x69\xaf\xcb\x5a\xf5\x19\x74\x5d\x51\xee\x08\x42\xba\xa4\x40\x5c\xe5\x33\x4e\x06\xef\xdf\xdb\x2f\xf7\xc2\x05\x5e\x1d\xa9\x32\xa3\x53\xe2\xd0\x9d\x12\x04\xff\xe0\x0c\xe1\xef\x78\x05\x86\xc6\xc4\x5f\xe2\x1b\xdf\xaa\xa9\xae\x32\x70\x81\x62\x78\x14\x72\xfd\x42\x4f\x64\xe1\xd0\x00\x77\xc9\x3c\x0f\xb7\xa7\x8b\xbc\xc8\xbe\x94\x96\x51\xe5\xca\x3f\x8b\x92\xc4\x57\x72\x05\xce\xe4\xdc\xd4\x07\x70\x62\xd5\x5a\xfc\xbc\xc4\x8b\xf0\x1c\x4c\xc3\xb9\x24\xcd\x07\x7c\xea\xdc\xf2\x12\x90\xcd\xc5\xe1\x21\x5e\x62\xaf\x7a\x95\x9b\x1a\x5f\x73\xc7\x05\xfc\xf5\x56\x95\xb6\xcc\xf4\x20\xcf\x4c\xef\x19\xbb\x21\x44\x4f\x97\xaa\xf7\x4c\xb4\x08\x64\xc8\x61\xea\x1b\xbd\x0b\xc6\x4d\x07\xce\xf5\x21\x9f\x99\x10\xbd\x59\xa5\x27\x1d\xef\x8e\x9e\xa1\xdf\x3e\xdc\xe9\xfe\x96\xd8\x95\xfb\x9d\x01\x31\x0b\x22\x22\x0a\x2c\xa8\x91\x97\x59\x3e\x45\xa9\x81\x38\x9f\x8b\x2e\x45\xae\x45\x6a\x55\xd8\xff\xb4\xb7\x48\x0b\x44\xa5\x10\x8c\xe6\x35\xe4\x46\xa1\x41\x03\x9f\x25\x83\x46\x30\xc6\x86\x51\x1c\xc3\x7b\xf1\x53\x23\xa1\x76\x4c\xad\x4c\x6d\x84\x9c\xcb\xbc\x34\x35\x1e\x8d\x38\xc8\x57\xdf\xbd\x79\x0b\x2c\xae\x77\x76\x76\xd6\x13\xba\x12\xbd\xbb\xf6\x17\x64\x52\x72\x3a\x6d\x2c\x67\xd9\xb2\x67\x99\xa2\xf0\xc5\x8b\x2f\xcf\xbf\x7b\xf5\xf6\xdd\x7f\x9d\xbf\xfa\xee\x85\x0f\x72\x0f\x65\x5c\xfa\x3d\x82\x00\x35\xde\xf9\xbf\x4b\x40\xd2\x75\x9e\x35\xb2\xe8\xf8\x84\xf8\x70\x04\xb5\x17\x5e\x4c\xa1\xe7\xaa\x83\x00\x20\x51\x24\x64\xac\x95\xca\x27\x9b\x60\xd8\x0a\xd6\x7f\xc9\xf2\x4a\x4d\xeb\x62\xbd\xed\xdb\x70\x6b\xa5\xe5\x67\x86\x6e\x21\xfe\xcb\xa2\x90\x71\x25\x16\x5a\xee\xf7\x21\x07\x45\xbf\xb0\xff\xd3\xc3\x10\x4d\x38\x18\xb8\x16\x21\xd3\x43\x6a\xb7\x9f\x69\x3b\xf3\x40\x02\x74\x22\x7a\x93\xb1\xc5\x4d\xbc\x22\x56\x32\xa8\x29\x7f\x66\x29\xaf\x20\x3c\x10\xa2\x0d\xaf\x55\x35\xd1\x66\xeb\x2a\x23\x26\x36\x2f\xb6\xb7\x2c\xef\x4d\x20\xdc\xd1\x80\xc9\x5f\x3c\x73\x09\xe9\xcf\xe7\x6c\x61\x74\x62\x6e\xf8\x4e\x21\x99\x68\x63\x79\x08\x8a\x88\x74\x29\xf5\x9d\x93\xfb\x20\x1c\x46\xa3\x3c\x1b\x9f\x87\xe2\xea\x48\x60\x70\x36\x65\x39\x4d\x55\x7e\x8d\x7a\x40\xa9\x6e\x5c\xe0\x65\x6a\xbc\x0e\x13\x1d\x86\x94\x9a\x0c\xa2\x1e\xdd\x07\x90\x22\xdf\x3e\x06\xa5\x09\xae\x62\xf3\x51\xab\x22\xb3\xcc\xb1\xfc\x28\x20\x98\xae\x31\x5a\xf5\x94\x34\x5a\x35\x66\x11\x20\x62\x8e\x56\x56\x7e\x6d\xca\x80\x2a\x1f\xdc\xbf\x01\xf5\x0c\xab\xe7\x16\x11\xd7\xb9\x6e\x0c\x78\x0a\x70\x30\x9e\xd5\xf3\x31\x5f\x57\xa9\xa5\xbe\x56\xbb\x3f\xd0\x99\x06\x93\x0f\x75\x41\x3c\xec\x5b\xf1\x40\xce\xc5\xe7\x3e\xbd\x33\x79\xc6\xac\xac\x6e\xd0\xcf\x87\x62\x9c\xd4\x9e\x81\x44\x30\x6f\x91\xf3\x1a\x47\xcc\xc1\xf6\xfe\xb4\xc4\xdc\x1f\xf2\x4f\x3b\x18\xc4\x59\x17\x8b\xe0\x3e\xca\xc3\xbf\xf4\x29\x8f\x9a\xd2\x90\x3f\x39\x1c\xd9\x13\xc0\x19\xc7\x5b\x8c\x69\x90\xa4\x56\xb4\x00\xda\x09\x1a\x1d\xcc\xed\x4c\xf4\x5c\x62\x1c\x8f\xa9\xf9\xde\x57\xd9\x0a\x19\x82\xcf\xbf\xfe\xe6\xbf\xdd\x4e\x89\x4f\x35\xa3\xf1\xac\x6c\x8c\xe5\x72\x53\x59\x86\x81\x96\x3a\xcb\x67\x6b\xf2\xe8\x54\x72\x6d\x4f\x2b\x92\xd3\xed\x19\xa8\x9b\x1a\x79\x82\x73\xfb\x44\x03\x8f\xe2\x2f\x64\x96\x1b\xf8\xd5\x65\x4e\xac\xfb\x1d\xc8\x89\x0c\x03\x9b\x51\x14\x47\x84\xb7\x16\x2e\x22\x9f\x37\xb5\x5e\xb5\x38\x1a\x49\x54\x74\xe0\x57\x4c\x0f\xb3\xb2\x6e\xc2\xef\x9e\xa3\xad\xc7\xaa\x70\x6d\xd1\xde\xdc\x58\x71\xad\xa9\x21\x1f\xb2\xeb\x0d\x56\xf1\x28\x51\x91\x33\xda\xe9\x49\x70\x70\x66\x50\xa6\xcd\xd2\x23\xa8\x95\xb9\xca\x84\x9c\xd8\xa1\xf2\xaa\x52\x85\xba\xb6\x4b\xc9\xa6\xb2\x5b\x2c\xc8\x94\x13\x9e\xbb\x29\xfc\x6e\x2c\x7a\x0f\x3a\x93\x09\x7a\xaf\x75\x2d\xdc\x38\x59\x6f\x2f\x99\x9d\x10\x97\xb0\x8d\x7e\xa7\x9a\x30\x48\x56\xc7\x6a\x36\xbb\x56\xc0\xe5\xe4\x06\x06\x17\x3e\x35\xdb\xb4\xb8\x28\x9d\xa0\xa9\xdc\xe3\x25\xc7\x54\x14\x14\xe4\x7c\xee\xd0\x48\x88\xff\xf6\x0b\x42\x52\x0c\xa5\xe0\x5a\x20\x59\x0b\x88\x16\x94\x45\xfe\x57\xca\x4d\xce\xad\x70\x22\x21\x38\x33\xaf\x7b\x26\x89\xce\xa4\xf8\x27\x3c\x5d\xbc\x49\x7f\x1a\x4c\x16\xfb\xad\xe7\xf6\xd5\xdc\x6b\x31\xcf\x29\xfc\x73\xe7\x82\xd6\x55\xd3\x5e\x4f\x76\xc8\xed\xb3\x98\xdf\x2a\x32\x92\x4d\x92\xe5\xa4\xf4\x47\xc3\x77\x88\x5f\xdc\xff\xf6\x32\xa4\xc8\xa8\x46\x98\xb6\xcb\xd8\x8d\x75\xa8\x4a\x51\xc1\x2f\x2e\x84\x0d\x8b\x2e\x40\x4e\xf2\x8c\xd3\x01\xf9\xa0\x51\xb5\xef\xd8\x9a\x20\x64\x2c\x75\x99\xd7\x94\x9d\xc9\xec\x0e\x7c\xe6\x44\x8c\x43\xcb\x31\x83\xc0\x0b\xea\x77\x9b\x56\x96\x1a\x93\xa5\x4b\xf8\x88\x28\x8a\xd4\x5b\xd7\x2b\x35\x6d\x2a\x93\x5f\x2b\x38\xa9\x65\x66\xa2\xd7\xd9\xa1\x82\xf2\x17\xcf\xd9\x10\xcd\xdd\xa8\xa2\xe8\x1e\xdb\x92\xab\x59\x97\xd3\x45\xa5\x4b\xdd\x98\x21\xf1\x2c\x3f\x53\xfb\xbe\x36\x92\x86\x2e\x93\xfe\xfe\xb2\x31\xf5\x7d\x4c\x57\x76\x49\xab\xbb\x84\x90\xfe\x00\x2d\x31\x5e\xa4\xf4\x5e\xfd\x59\x47\x99\xb0\x90\x41\x2c\x7d\x28\xdf\x42\x86\xa8\xc0\x6c\xbf\xbd\x61\x1f\x7f\xe3\x6d\x13\x51\x42\x56\x9c\xa3\x09\x96\x02\x55\x66\x79\x39\x7f\x6e\xb1\x5a\xa9\x12\x7c\x99\x49\xfc\x1c\xdc\xf3\x71\x67\xfc\x8c\x3f\x38\x68\x3d\x7e\x26\x8e\xc4\xa7\x9f\x46\x1f\xed\xce\x75\x7e\xad\x1f\x27\x58\x81\x07\xf2\x8c\x52\x0d\x47\xf6\xaf\x7e\xcb\xb4\x30\xd8\x1d\x52\xcd\xed\x14\x0f\x84\x2a\xa2\xf0\xa3\x24\xb0\x1a\x0c\x27\x83\xc8\x35\x02\x29\x84\xdf\x30\x5b\xa5\xc5\x24\xfa\x3d\xd8\xc8\x8c\x4b\x38\x66\x30\x57\xf5\xcb\x5a\x2d\x4d\xdf\xce\x9c\x15\xa0\xcb\xed\xc5\x38\x79\x18\xc7\x78\x85\x71\x97\x67\x7c\x5c\xe7\x37\x76\x01\x59\x2d\x8f\x48\x3c\x98\x4f\xfb\x01\x75\x0d\x6e\x32\x07\x82\x88\x73\x95\xaf\xd4\xda\x19\xf4\xf9\x04\x06\x09\xb0\x52\xd9\x9b\x75\x39\x15\x67\xa2\x1f\x05\x6c\x70\x8b\xc3\xa7\x9f\x6e\x08\xde\x13\x22\x95\x62\xae\x51\x35\xbd\x7b\xb6\xf1\x09\xd1\x25\xf7\xf0\x45\x87\x18\xe2\xcb\x48\x84\x19\x0c\x42\xd0\x5a\x87\x05\xaa\xe3\x09\x28\x45\x19\x04\x48\x47\xbd\xee\x73\xe3\xa0\xe6\x84\xa2\x1f\x3c\x88\x72\x8f\x61\xd5\xd7\xe5\xf4\xb9\xc3\x08\x29\xe3\xc9\x2e\x19\xf0\xb4\x64\xf7\x5f\x16\xa1\xf7\x31\xdb\x26\xaa\xab\x17\x01\x90\x48\x18\xd3\x38\xcf\xfb\x03\xe3\x8c\x90\x9d\x16\x8d\xdc\x78\x55\xc8\x08\x29\x22\x9b\x82\xd3\x27\xad\xb2\x68\xbf\x0c\x32\xb3\xd0\x6e\x41\x62\x5b\xc7\x90\x9d\xb5\x7b\xdf\x6e\xd4\x48\x5d\x8d\x0d\xe7\xa6\x46\xba\x04\x93\x0a\xaf\xc0\x40\xbb\xd9\x69\x36\x6d\x3d\x95\x2a\x47\xdc\x54\x79\x5d\x43\xf0\x02\x9d\x7c\x6e\x6f\xb6\xa7\x46\x0a\xc9\xfb\x89\xd6\x85\x92\xe5\x7b\xe4\x3a\xef\x21\x56\xe6\x7d\xd9\x14\xc5\x07\xda\x56\x6f\x5b\x8a\x01\x16\x13\x72\x94\x10\x7f\xcd\xb9\xab\x21\xcc\xeb\x80\x56\x8a\xb2\x4b\xd0\xf9\x09\x11\x11\x50\x35\xe2\x5a\x16\xb9\x67\xf2\xa9\x92\xf0\xcb\x0d\x09\xab\xfa\x5d\x50\x7b\x7d\x50\xd8\x96\xb3\xa6\xc3\x96\xb1\xd1\xcc\xe0\xc6\xdb\x6d\x6d\xd8\x60\x66\x70\x03\xfc\x0a\x6b\x03\x17\xe9\x2d\x75\x07\x88\x56\x38\x2e\x92\x34\x4d\x16\xc3\x5f\x91\x94\xed\x86\x77\xd5\xf4\x9c\x71\x6d\x03\x1f\x71\xda\x39\xc2\x45\x61\xd3\x88\x2e\xaa\x4b\xd2\x67\x2f\x6b\x17\xc6\xdc\xf5\x16\x11\x38\xa4\x15\x50\xb7\xa9\xeb\xed\x17\xb9\x53\x2d\xfa\x42\xf6\xda\x48\x54\x8d\x80\xba\x98\x85\x2f\x0c\xb9\x4a\x43\x6d\x7d\x3d\x1e\x4f\x4e\x96\x11\x6d\x48\x0b\xf3\xfe\x96\xf3\xd2\xe9\xc9\x33\xf1\xf0\xc0\xc5\xdc\x60\x52\x83\xab\xe8\x53\x2f\x2a\xe5\xe3\x71\xbc\xa1\x0a\x9e\x4a\xa2\x97\x2c\x99\x5d\x40\xcc\x90\x5b\x56\xfa\x96\x4b\x46\x3e\xc8\xa1\xdc\x38\xfb\xd9\x42\x36\x93\x55\x9a\x31\x04\x9f\x95\x64\x0d\xb1\x10\x30\x07\xd1\x95\xf5\xed\xd4\xf5\x68\x7c\x3f\xe6\x45\x7e\x79\x71\x74\xe9\x79\x30\xfc\x3d\x4e\xfe\x3e\xbe\x6c\x67\xd4\x3a\x2e\x5f\x62\x7e\x9d\xca\x7c\x8e\x48\x2a\x2a\x07\xb5\x3d\xbd\x01\x36\xed\x2c\x9f\xc1\xdf\x35\xea\xfe\x3f\x36\xa6\x06\x2e\x0a\x51\xb5\x6c\x19\x59\x58\x17\x6a\x79\x54\xcc\x46\x41\x75\x26\x18\x1a\x2b\x7e\xfb\x08\x62\xc8\x00\x6b\x8b\xec\xee\x08\x58\x2a\x59\x46\x05\xab\x88\x85\x71\x8f\x33\xb3\xcf\xb7\x3e\x0b\xd9\xcd\x5c\xd5\x58\x27\x0b\x58\xab\x74\x26\x54\x67\x53\xe8\x55\x0a\xf4\x92\x8a\x2a\xff\xe9\x0a\xce\x0c\xb2\x55\xc8\x52\xf8\xe8\xcc\xb6\x8a\x11\x57\xaf\x4f\xce\x39\x8b\xed\xd7\x58\xa7\xde\x17\xa6\xe7\x99\x3a\x53\x3a\xe4\xfd\xd7\x5a\xbc\x86\x32\x43\x54\xa2\x3e\x6f\xdb\x96\x39\x96\x54\x78\x0d\x1d\x98\x53\x70\x49\xb7\xa9\x1c\x63\xdc\x3a\x8f\x4a\xef\xab\xad\x35\x65\x13\x25\x14\xe3\x46\xa3\x45\xcc\xe8\x2c\x80\xda\x0f\x46\xe3\xf3\x79\x69\x31\x7d\x28\xb3\xec\x10\x6d\x1a\xa1\x2e\x19\x2e\x14\xd6\x03\x5b\x73\x7e\x9f\xa2\x02\x62\xf3\x56\x58\xb7\x8f\x52\x58\xdb\xe6\x5b\xe6\x1d\x5c\x8b\xf3\xa4\x70\x92\x93\x1a\xd2\x32\x80\xde\xd3\x4c\xa4\xe7\x92\x02\x8c\x8a\xd7\x41\x89\x19\x8d\xec\xc7\x4d\x4f\xbc\x3b\xa1\x3e\xb3\xdd\x13\xdb\xa2\x28\xe8\xb8\x73\x4b\x99\x79\x1a\xb0\xdc\x1c\xde\xdb\x5e\xa7\x8f\x3a\xe5\x98\x7a\x16\x9f\x71\x8e\x2a\x86\x11\xba\xe8\x80\x3b\x3c\xec\x12\x01\xc1\xeb\xae\x8b\xac\x8b\x00\xd8\xca\xdf\xd9\xc4\xaf\xc2\x2b\x2f\x2e\x37\x25\xf2\x38\x13\x76\xe9\xe5\xe4\x96\xc7\x7b\xe8\xe7\x8e\xb6\xcd\x2e\x8f\xf0\x85\x03\xb9\x84\x58\xee\xf0\x81\x9f\x75\xf8\x42\x23\xe0\xc4\x2b\xea\xbd\x3b\x96\xf0\x88\xb9\xec\xf6\xe2\x7c\xe9\x69\x11\x1d\xd9\xe2\x9c\xf9\x86\x3c\x15\x62\x8c\x32\x2c\xb9\xba\x56\xd5\x3a\x39\x71\x50\xe0\x91\xc6\x40\xb9\x22\x67\x73\x60\xf6\x34\x5d\xc6\x22\x9f\xeb\x5e\xb1\x94\x2b\x71\x2e\xc8\xe5\xcd\x9d\xb3\x18\x4d\x37\x65\x65\xc2\xe2\x17\xb8\x97\x26\xef\x91\xe5\x56\x37\x63\xa7\xff\x26\x3a\xfc\x10\x09\x43\x3b\xa5\x60\x6a\x23\xcc\x7c\xfa\xa9\x20\x9b\x3c\x5d\xb8\x7b\x26\x7a\xee\xc9\xde\x06\x0b\xdc\xcb\x12\x58\x35\x1e\xdd\xcf\xe8\x49\xd3\x0b\x8a\x3a\x5e\x61\x3e\x91\x34\xa0\x00\xfd\x46\x04\x16\x62\xe1\xed\x0c\xd3\xb8\x49\x7f\x58\x3b\xcd\xd6\x7f\x86\x0b\xa0\x8f\x54\xde\xc8\xf2\x30\xf0\x59\xb6\xc9\x17\xb8\xac\x80\xb0\x3c\xac\x92\xd7\x67\x77\xee\x6c\xd3\x50\xb9\x58\xb6\x94\x2b\xbc\xda\x71\xbc\xe7\x66\x25\x9d\x9b\x07\x09\x55\x04\x0f\xac\xb3\x8a\xa5\xd3\x30\x2c\xc0\x8a\xe2\x98\xa8\xc8\x4a\x6c\xbe\x85\x9a\x52\xdc\x60\xe4\x6c\x4d\x06\xb2\xf6\x29\x63\x1f\x8c\xf3\x10\xe8\xbb\x5a\x15\xf9\x14\x4d\x8e\x90\x34\x69\x81\xac\x3e\x8c\x22\x62\x63\x54\xd5\x35\x09\x38\xf7\x78\x67\x04\xf2\x16\xf8\x23\x3e\xeb\x94\x0f\xc0\x79\x00\xb2\x08\x84\x8c\xdf\x81\x4a\x8d\x85\x65\xcf\xc8\x76\x87\xb8\xe9\x30\x22\x1b\x55\x1a\x73\x93\xd7\xd3\x85\x3b\xd4\x99\x48\x43\x36\x96\xbd\x36\x00\x86\xb2\x9d\x17\x45\xdb\xba\xdc\xa2\xa2\x36\xb1\x70\x61\x0f\x47\x22\xde\xd7\xf7\xd1\x8f\xd1\x02\xbf\xd6\xee\xb8\xdc\xb0\xbc\x94\x2d\xf1\xab\x35\x6e\x52\x4c\x11\xe1\x1f\x83\x09\x9a\x7f\x77\x07\x9c\x8f\xd1\xa2\xee\x92\x1a\xd5\xcd\x0e\x76\x6f\x26\xa8\x61\x13\x1b\x76\x48\xc7\x99\x2b\x97\x40\xd9\x25\x94\x77\xf3\x8e\xee\x3c\x8d\x14\xec\x22\xbf\x24\x9d\x2b\x32\x42\x6d\x7c\x17\x4d\x28\x78\x6f\x3b\x14\x81\x14\xc6\xbe\x83\x8f\x3e\x24\xdd\x95\x22\xc3\x12\x82\xf1\x0d\x96\xbc\x74\xd1\x21\xeb\x39\x09\x04\x69\x07\xa1\xec\x01\xc9\x33\x45\x7c\x50\xe0\x22\x2f\x93\xc4\x70\xe8\xd7\x23\xad\x34\x43\x06\x18\xac\xaa\x41\xd1\x02\xb2\xa9\xf5\x81\x13\xb9\x40\xb6\x49\x45\x1f\xbb\xdf\xed\x3b\xd1\x7d\x54\xd1\x04\x9c\xcc\x85\x45\x69\x2b\xa3\x60\x87\xc7\xb1\x7d\x56\x94\x6a\xa0\x6c\xd4\x4e\x81\x1b\xea\x9d\xf8\x2f\x03\xce\x86\xa8\x71\xa2\x97\x57\x40\x2c\x13\xd9\x18\x26\x09\x5f\xff\x75\x84\x0b\x50\x38\xb0\xa7\x12\x69\x9d\x4e\x30\xda\x38\x4a\x9e\x85\x31\x72\xc0\x94\xbe\x56\x55\x95\x67\x38\x1d\x8f\x2d\x1a\x63\xf7\xde\xc3\x6f\x41\x55\x8d\x97\x20\xf1\xe2\x97\x9b\xfb\x66\x21\x6c\xc7\xff\x70\xda\x2c\x5c\x21\x33\x3c\x5e\xdb\xcb\x67\x9f\xf9\xfb\x9f\x71\x63\x43\xee\xed\x21\x79\xe6\xea\xb8\x65\x21\xb8\xdb\x0a\x91\x2e\xda\xc1\x82\xde\x0d\x05\x4b\x3a\x36\xff\x17\x0d\x9e\x2c\x84\x69\xdc\xf9\x7e\xa5\x43\xfe\x41\x36\x68\x67\x03\x1e\x1e\x8a\x6f\xf2\xe9\x95\xaf\x2b\x35\x74\xe4\x78\x72\x90\xe5\xf3\xbc\x16\x0b\x75\xcb\xeb\x14\x73\xe9\x9c\xe2\xff\xd0\x33\x4f\x35\xaf\xef\xe6\x99\x78\xff\x5e\x74\x7f\x40\xc8\xb4\xce\x42\x5b\x22\x57\xf2\xa9\x3f\x1e\x8a\xa3\xdb\xd9\x6c\x36\x1b\x8c\x6a\x4d\x65\xd8\xc7\xa7\xde\x1c\xcc\x9e\xf9\xeb\x4a\x66\xfd\x3c\x1b\x8a\x93\x70\x97\x10\x6b\x17\x35\x58\x7f\x3d\x72\x81\x32\x2d\x26\x10\x11\x1d\x19\xff\x80\xba\x10\xc7\xba\x5d\xa4\x26\x29\x3c\xc7\xda\x01\xfc\x51\x1f\x54\x1a\x1c\x25\x2d\x90\x4a\x19\x55\x9f\x17\x05\x8f\x45\xed\x14\xc6\x2f\xf2\xcc\x4b\xef\xf4\x30\x52\x51\x46\x51\x3f\x34\x01\x34\xad\x33\xb2\xb3\x53\x33\x51\x4d\xda\x78\x8c\x48\xbc\x07\x45\x54\xb6\x4d\x03\x9e\x05\x38\x66\x82\xa0\xa6\x03\xd6\x4b\x1d\x96\x03\x41\x15\x52\x03\x71\xe3\x7c\x34\xd0\x9c\x33\xf4\xc6\xec\xc5\x9e\xf8\x49\xcc\x58\x55\x92\x1b\x8c\x77\x42\x41\x46\x54\xac\x3b\x59\x4d\x9e\x31\xb6\xf7\xf2\x8b\x7d\x3d\x82\x76\xbc\x2d\xac\x84\x73\x01\xfb\xbd\x9c\x0f\xc0\x63\x31\xac\x5d\x2f\x00\x4b\xc9\x60\x2f\x2e\x22\xce\xd2\xad\x15\x62\xa0\xa2\x3d\x66\xa1\xe2\xd8\x27\x7f\x4a\x77\x11\x0a\x6d\x84\x4c\x41\xdd\x95\xed\x14\xd9\xdd\xfd\x60\xd3\x61\x1a\xce\x11\x26\x8f\x21\x1f\x67\xe9\x8e\x6c\x7d\x75\xe5\x0f\x0c\x57\x6d\x0a\x65\x9b\xda\xbb\x3c\xaa\x50\xec\xd5\xe7\x47\xdd\x61\x55\x52\xc9\xe1\x50\x11\xab\x94\xa5\x50\xb7\x53\xb5\x42\x4f\xf6\x4c\x94\x3a\x81\x04\xdb\x11\x46\xbc\xff\x82\x83\x13\x6a\xab\xe6\xe5\xbe\x24\xe7\x61\xee\xc7\x49\xeb\x91\x54\x11\xcf\xaf\x95\xc0\x1e\xd9\x45\x08\x49\x98\xbe\xbe\x17\x4d\x3b\xca\xdc\x44\xd0\x1d\xb9\xe9\xa8\xe6\x79\x2c\x74\x78\x37\x07\x3b\x44\xd3\x80\xb4\xf8\x80\x62\xe2\xa9\x1b\x2c\xe2\xbf\x29\x09\x7a\x81\xb8\x9f\x67\x58\x58\x8e\x80\x06\x5c\x25\xdd\x9d\x46\xbe\x4b\x2f\xbd\x97\x9e\xa2\xf7\xf8\xf1\xea\x0e\x53\xcf\x60\x93\x44\xf4\x0f\x29\xef\xb5\x33\x6c\xed\x9e\xe7\x51\x56\x9a\xd3\xb8\xa6\xca\x57\x49\xac\x6f\x34\xcc\xc1\xa4\x06\x26\xac\xed\x00\x9b\x89\x55\x3a\xe2\x40\x28\x02\xb7\x6c\x74\xb8\x5d\xa3\x0a\xba\x50\x15\x0b\x84\xd4\x7b\x43\x71\x0f\x19\x9e\xfd\xd5\x32\xf3\x7b\x53\xbd\x5c\xea\xf2\x9e\xdd\x20\x2b\x55\xd5\xb9\xf2\xae\x07\xba\xb2\xa6\x6a\x72\x52\xf0\x14\x83\x03\x94\xe3\xfe\xa7\xae\x1a\xf5\x3f\x71\xfe\xef\x10\x99\x40\x54\x89\x58\x8a\x33\x71\xd1\xc3\x27\x6f\x7b\x43\x41\xbf\xae\x7b\x97\x04\x30\x61\x00\x78\x95\x6e\x58\xa4\x79\x4b\x99\xe9\xcb\xa1\x98\x0c\xc4\xd9\xe7\x3e\xf9\xf7\x67\x14\xbf\x9f\x89\x9f\x85\x1f\xff\x19\xc4\x25\x89\x0f\x43\x3a\x2d\xec\xdd\x0f\x43\x81\x9f\xca\x20\xd7\x1e\xd2\xca\x0a\x21\x6b\xd8\x0e\x48\x16\xdc\x8c\x21\x46\x48\x63\x1a\x57\xe3\xf0\x7f\xe4\xff\xd8\x9d\xc9\x53\x06\xb8\x0e\x11\xf9\x7c\x2e\x90\x5d\x5c\x7e\x10\x12\x7b\x04\x69\x53\x83\x39\x95\x1e\x6a\x2d\xfe\xa6\xc7\x27\xe2\xbc\xa4\x72\x7f\x1b\x9e\x6b\xf5\x79\x2d\x79\x08\x66\xfc\x69\x87\x88\x10\xbe\xf4\x5b\xd8\x4b\xbc\x10\x9c\xb5\xe0\x9a\xfc\x1c\x35\xe1\x82\xad\xe3\x56\xe6\xc3\xf0\x4e\x38\xba\xd9\x05\xbf\x20\xf0\xf7\x87\x8d\x7a\xa3\xec\x52\x14\x2d\x17\x98\xf8\x93\x52\x5e\xe4\x97\x2d\x31\xb4\xba\x1e\xe1\x2b\x2e\xec\xed\x4b\x16\xaf\xd6\xaa\x1e\x55\x5d\x8f\x60\xb6\x5d\x90\x6e\xbb\x77\x4d\x6d\xb2\x69\x6a\xfd\xc9\x45\x7e\x69\xf9\x97\x1b\x79\x60\xe5\x66\x7e\x15\xa7\xe6\x0d\x68\x56\xee\xc9\x4b\x1f\x89\x51\x5d\x93\x68\x92\x5d\x4c\x92\x29\x75\xb5\x08\x73\x81\x91\x14\xc3\x95\xff\x55\xb1\x7e\x89\x1b\xce\x6e\xc3\x5c\x01\x3e\x49\x85\x88\xd9\x0e\x06\x8f\x07\xb1\x0e\xa5\x9a\x56\x9f\x17\x1c\xa3\xce\xb1\xd1\xd0\x5a\x2c\x73\x03\x4d\x7c\x43\xec\x59\x99\x61\xfc\x98\xdb\x27\xad\x38\x32\x3b\x20\xd8\xb2\x5c\x60\x02\x44\x0c\x60\xf4\x21\x0b\x62\x83\x7d\x07\xc5\xd8\xa0\xa9\x4b\xe8\xb3\x17\xfb\x63\xb1\xab\xc4\x44\x91\xb4\xf3\x4b\x8e\x7c\x13\xd0\xd8\x1d\x72\xf0\x8b\x62\xd7\xec\xa8\x77\x3a\x0a\xda\xed\x75\xa6\x47\x91\x35\x5b\x7c\x1d\x69\x28\xdb\xb6\x58\xb6\x76\x28\x1b\x99\x3a\x7f\xfb\x48\x36\xca\x53\x6f\x71\x2d\x72\x16\x28\x71\x1f\xdd\xd9\xf7\x31\xeb\x51\xf2\x48\xe8\x51\x6c\xde\x7a\xb9\x51\x88\x0e\xef\xa1\x82\x34\x9e\x04\x6b\x57\x28\x3e\xc4\xd5\x5a\x84\x12\xa1\xb9\x77\x99\x1a\x09\x1a\x06\xc7\xc1\x60\xc2\xf4\xb8\x2a\x33\x96\xdd\x99\xe5\x66\x2a\x2b\x14\x29\x61\x7a\xba\xc8\x70\x6a\xad\x50\xbd\x4e\x39\x27\x69\x5b\xb8\x0f\xd3\xed\x07\x0c\x0c\xe9\x75\x9b\x8d\x6d\x01\x76\x53\x2f\x43\xd0\x9e\x03\xd8\x45\x7e\xc9\x6b\x02\xe0\x0c\x5e\x42\x31\xac\x33\x7a\x5b\xaa\x98\x50\x5e\x3d\x07\x0d\x99\x1a\xc2\x3d\x44\x7a\x0a\x07\x43\x95\x25\x38\x18\xb6\x6b\x24\x71\x98\xe0\xaf\xd0\xe4\xfd\xfb\xf8\x18\x51\x1b\xd6\xa4\xb0\x11\x64\x31\x83\x78\x4e\xd9\xd6\x3b\x0d\x30\x6c\x24\x62\xe7\xf8\xb7\x8f\x71\xdb\xc3\x9a\x20\xc4\x47\x5b\x0d\xf0\xa1\x8d\x01\x7a\x89\x7d\xc2\xfb\x34\xfa\xf1\xbe\x4f\x4b\x25\x76\xd1\x15\x2d\x6a\x07\x4d\xed\xd6\x2e\xf1\x59\x7b\x9c\x45\xe1\x39\x77\x53\x06\xd3\xc9\x5b\x36\x87\xfa\x45\xfa\xaa\x81\x82\x68\xb1\x4f\x37\x87\xbc\x7d\x54\x13\xc0\x37\xd3\x3e\xc6\x32\xee\x4b\x6a\x05\xf6\xe5\x2d\x87\x01\x6a\x6e\xd8\x11\x82\x2a\xe3\x77\x7b\x4a\x5b\x1e\x88\x78\x6a\x60\x25\xd8\xd7\x54\x61\xe2\x2c\xa4\xff\x1d\x4f\x43\x47\xee\xc6\xcb\x5a\x2d\xfb\x71\x84\x71\x80\x0f\x31\x62\x71\xe4\xe9\xdd\xad\x79\x52\x5d\x4f\x6c\x4a\xbd\xfc\x08\x8f\x12\xd1\x47\x94\xd3\x6f\x84\x4b\x69\xac\x17\x2a\xaf\xda\x94\xb2\xe7\xd2\x74\x7a\xc5\x90\x63\xa1\x23\x2f\x54\x60\x75\xfb\x6a\xab\xc2\xcd\x58\xf5\xfe\xaa\x33\xdf\xb4\x89\xfe\x1c\xca\xb7\x71\x85\x35\xb2\x53\x75\xef\xfe\x9d\x0e\x3d\x1f\x39\xbe\x2b\xda\x78\xfb\x9a\xef\x1d\xb2\xbc\x89\x0c\x84\x77\xe1\x81\xf9\x94\x95\x54\xf9\xf0\xcb\x42\xea\xe3\x58\xfa\x8e\x24\x3c\x16\x51\x9f\xd6\xf4\xdc\xba\x5b\x30\x1e\x1e\x41\xdc\x9c\x67\xba\xb2\x8a\x77\xbf\x4d\xcc\x1b\xc3\x98\x5d\x5b\x24\xab\xc4\x5a\x1e\x75\xa3\x5d\x01\xb2\x20\xa8\xd8\x33\x2d\xc7\x50\x96\x52\xd7\x07\xea\xa7\x46\x16\xcc\x3c\x37\xd1\xf5\x82\x57\x2d\xf3\x45\xc0\xcc\x54\x16\xb2\x82\xd8\x05\xb4\xfb\xea\xe5\xca\x02\xc0\x00\xb1\xf1\xc1\x0e\xe5\x1a\x99\x40\x8e\x97\xe8\x97\x9a\xd9\x3b\x06\x43\x2c\x4a\x72\x93\x1b\xdf\x04\xce\xce\x39\x62\xc3\xae\xc0\x99\x15\xe8\x0b\xe8\x13\x8a\x45\xa7\x6f\x42\x7e\xe2\x74\xa1\xa6\x57\xf6\x43\x23\x06\x0f\x79\x20\xc1\x75\x2b\xbe\x65\x9d\x12\xa1\x0b\xa4\xeb\xa1\x06\x43\xd0\x57\xa0\xf4\x7d\xeb\xbe\xfc\x46\x61\x50\x9f\x43\x16\xe4\xa0\xdf\xc1\x26\xdb\xd4\xdc\x67\xc2\xc2\x00\x53\x26\x7f\xdf\xaa\xf6\xe7\xc1\x9c\x47\x6f\x49\xed\x81\x93\x0d\x30\x7b\xc4\x3a\xe5\xb3\x59\xb7\xce\x7d\x78\xe8\x8c\xac\x16\x30\x09\x57\x1c\x0a\xd7\x42\xce\xae\xa2\x2b\xee\x2f\x0c\x76\xfe\x5c\x55\xf9\x32\x07\x1d\x0b\x03\x6d\x50\x71\x25\xd3\x9a\x1c\xc0\x6e\x75\x7f\x4e\xac\xfe\x4a\x1b\xe0\x6e\xff\xf0\x2f\x7d\x6f\x6a\xf3\xc1\xe2\x14\x3b\x8e\x07\x5e\x9a\xd3\x2a\x07\x83\xa4\x5b\x4a\x97\x3a\x2b\xe1\x9d\x93\xd8\x88\x86\x47\x71\x3b\x15\x35\x09\x9d\xec\x20\x26\xdf\x39\xc7\x34\x13\x68\x8c\x61\x15\xd3\x8e\xfc\x28\xee\xf9\xf5\x2a\x51\xa6\x95\x6b\x86\x50\xab\x6a\x9f\xe2\x10\xae\x3d\x10\xe6\xf7\x01\x5d\x82\x34\x51\x64\x49\x18\xbb\x10\xdf\xa3\x52\x28\x6b\x57\xc7\x71\xd8\x19\xe5\x80\xf6\x3b\x8c\xe7\x73\xe9\x9e\x1f\x17\xe2\xe0\x3d\xd7\xb0\x7d\x5a\x0d\x60\xee\x7f\xb0\x87\xff\x7f\xf9\x98\x7e\x2b\x09\xc4\x58\x76\x1e\xc1\x8f\x0d\x16\x8e\x62\xc0\xdb\x25\x1a\xdc\x5b\xff\xfe\xf2\x4b\x50\x38\xec\x36\x71\xa2\x09\x4f\x15\x66\xb3\x63\x75\xd6\xbe\x88\xd0\xb2\x90\xd0\x27\x25\xf0\x9d\xa8\x4e\xf4\x87\x5f\x2e\xf8\xb8\x5e\x92\x50\xc3\x05\x4b\x43\xfa\xb0\x36\x8a\xec\x46\x4e\xd5\xde\x16\x54\x5c\xc9\x32\x00\xda\xd0\x5e\x8e\x4a\xca\x5c\xb8\xef\xfb\xac\x6b\xde\xbb\x1e\xb9\xb3\x4d\xde\xda\x73\xe3\x76\xc5\xd2\xa7\x84\xdd\x19\xed\x07\xc4\x7d\xf0\xb9\x60\x55\xa5\x08\x3f\x6b\x5f\xa3\x38\xd0\x70\x94\x96\xb1\x67\x58\x69\x44\xb8\x71\xbd\x69\x17\x16\x97\xe6\x9f\xb1\x78\xb9\x8e\xfc\x07\x08\xca\x5f\xca\x15\xe4\xa0\xb5\x45\xd2\x37\x1d\x0a\x4b\xba\xe6\xff\x0b\xfa\x8a\xfd\xb4\xb6\xba\x62\x92\x42\xcf\xf7\x79\x42\x90\x3f\xda\x2c\xd4\x5e\x59\x3f\x6e\x7d\x92\xe4\x9f\xb4\x65\xfe\x56\xc3\x58\x5b\x27\xfa\xdf\xe4\x2e\x64\x09\xda\x18\x83\x95\x70\x1f\x07\xca\x59\x4e\x1a\x9e\xe9\xa5\xeb\x8f\xe0\x57\xdd\xea\x53\xbc\xed\x23\xd1\xd4\x60\x9e\x66\x87\x16\xc7\x46\xdf\x90\xbd\xf3\x51\x5a\xda\xbe\x9a\x63\x30\x1c\x7e\xaf\x7c\x1e\xf2\x52\x96\x40\xbf\xc2\xa8\x32\xf3\x11\x52\x78\x32\x52\xec\xa5\x8b\xf1\xf7\xd1\x0d\x50\xf5\xec\x46\x05\xe3\xa0\x4b\x9b\x56\xd7\x50\xe3\x16\xc2\x80\x67\x39\xb6\xe0\xe5\x23\xb9\x0e\x9e\x37\xaa\x77\xad\x7c\x4b\x24\xe2\xf8\x38\x1c\x13\x0a\x68\x25\x8c\xb6\x47\x3f\x0e\x6a\x94\x62\x81\x96\x61\x2a\x22\x53\x85\x5c\x43\x36\x05\x96\xc3\xc0\xc1\x22\x2c\x36\x65\x9d\xbb\xf6\x96\x6c\xba\x43\x62\x15\x68\x51\x67\x6d\x85\x29\x5e\x55\x42\xe6\x06\x7d\x2c\xf6\xdf\x64\xde\x74\x57\x0a\x21\x94\xdc\x70\x05\xb7\xde\xa6\x68\x04\x0c\xb2\x16\xdc\x46\x53\xff\x2c\x43\x81\xd3\x72\x3a\x85\xb8\x21\x58\x8e\x4c\xad\x60\x41\x4a\x1c\x4d\x0a\x96\x4c\x1e\x8d\x6b\xdf\xc9\x0c\x39\xdb\x54\x1d\x6a\xab\x33\x14\x47\xf1\xb1\xf2\x67\x55\xc7\x75\x5d\xf6\xc9\xb8\xec\xe6\x66\xf3\x7d\x4d\x2f\xf3\x7f\x04\xc3\x8b\x73\xf9\x44\x2c\xa5\x23\x56\xa3\x28\x44\xa9\xcb\x03\x77\xe6\x46\xb9\x4c\x26\xa9\x72\x1d\xc9\xcc\x18\xd6\x87\xa1\x3d\xa5\x32\xb5\xda\x54\x4c\xc0\x57\x12\xd8\x8d\x39\x75\xbb\xd2\x55\x7d\x6e\xfe\xc3\xe8\xb2\xdb\x3a\x82\x0e\xc3\x0f\xdd\x91\xe8\x5b\x4d\x0e\x9b\x12\xb1\xb9\x07\xd0\x65\x11\x52\x3f\x9c\xc8\xa0\x92\x78\x12\xa2\x7a\xf5\x9d\x26\x75\x7a\xa8\xcb\xf8\x19\x1b\xd5\x09\x10\x4c\xea\xee\xae\x9b\x0b\xda\x26\x7e\xce\xb3\x67\x10\x8a\xf1\xa3\xd1\xe5\xb3\x24\xa2\xa8\x74\xd1\x44\x11\xfa\xfa\x83\x0f\x83\xc4\x9c\x9c\x78\x31\xf7\xa5\x46\x87\xc0\x6e\xe9\xb4\x4b\x38\x6d\x7d\x45\x38\xdb\xe2\x1a\x3a\x91\xb1\xa5\xdb\x49\xf9\x72\x69\xbf\xc9\x11\xe2\xa4\xd0\x93\x38\x8d\xc3\xf0\x92\x2d\x21\x38\x14\x5c\x94\x1c\x1f\x6d\xa1\x88\x62\x5c\x7f\x2b\xda\xcd\x61\xa2\x5f\x56\x7a\x99\x52\xaf\x5d\xb4\x0d\x51\xef\xe1\xd6\xbe\x44\x9a\x1a\xf8\xec\x08\xf1\x5a\x6d\x24\x46\xfb\xc4\x7e\xd4\x88\xe6\xbe\xcb\x11\x05\xaa\x26\x6f\xb6\x58\xe8\x72\xa9\x90\x85\xb1\x0c\xb1\x61\xee\xd1\xe0\x46\x61\xcf\x0e\x58\xb8\xed\xc6\x71\x43\xec\xae\x13\xd6\xa0\xf9\x78\x88\xb8\xe9\x7a\x3a\x59\x8b\x7e\xf4\x4d\x80\xf2\xed\x3b\xc3\x47\xc6\xe1\x2b\x03\x8a\x37\x35\x58\x7b\xce\x9a\x91\xe9\xb2\x2b\x50\xb1\x5d\xb9\x77\x4f\x05\xa3\x9d\xfa\xd5\x15\xa8\xc5\xab\xa9\x46\x55\x15\x98\xc3\x73\xc3\x7c\xa5\xd3\x4b\xb8\xf8\xf0\x91\x53\x8c\xab\xb1\x7e\xac\x16\x14\x19\x84\xf3\xdb\xb8\x07\xd3\x95\x5a\x8f\x0a\x69\xea\x97\xe4\x4c\x64\x80\xf6\xb0\xb7\x1c\xe8\x68\xb0\xc1\x91\xf6\x21\x78\x28\xdb\xf5\x3b\xda\x15\x43\x22\x27\xe3\xb6\x2c\x26\x5e\x10\x0d\x3a\xa5\xe7\x4b\xb0\x0a\xf6\x8a\xa2\xab\xd6\x16\x06\x82\x82\x5e\x23\x21\x79\xd6\x05\x25\x90\x4d\x6c\xd4\x0a\xea\x48\x26\xbf\x9b\x4b\x87\xef\x74\xf6\x99\x33\xaf\x44\x8e\x62\x41\x7e\x73\xee\x47\x9b\x37\x43\x2f\xe3\xb4\x5c\x1d\x41\x77\xb2\xfc\x64\xe0\xfe\xb5\xce\x33\x10\xc9\xe2\x85\x06\xdd\x24\x49\xd4\x48\x95\x92\x28\x74\x2f\x7c\x56\x14\xb7\x27\xde\xbf\xe7\xb7\xce\x80\x3b\x70\xb6\xd6\xad\x72\x74\x7d\x81\xe7\x08\x31\x2b\xd8\x4f\x39\x62\x1e\xdb\x6d\xce\x25\xc6\x39\xb6\x97\x54\xaf\x14\xd6\x3a\xff\x17\x29\xa4\xfe\x86\x57\xba\x92\xa5\x7d\x95\xfb\xc2\xa4\x6e\xba\xdd\x1f\x8d\x41\xad\xcd\x8a\xa5\xff\x21\xaf\xe5\x9b\x69\x95\xaf\xa0\xce\x6d\x39\x67\xdb\x68\xaa\x8b\x42\x4d\xed\xd1\x9d\x35\x98\x5a\x2f\x26\x0d\x45\xc2\x9a\x5a\xad\xc8\x0d\xe1\x7a\x66\xe4\x25\x5a\x4a\x54\x95\x63\x32\x73\xcf\xb2\x35\x8f\x68\x99\x65\xfd\xd1\x68\x34\xc0\x2e\xfd\x26\x34\x53\x85\xde\x17\xff\xd7\xc1\xdd\xa3\x4a\xb3\xf9\x35\xe6\xc2\xb8\x75\x9b\xe4\xe5\x21\x36\x57\x1c\x99\x05\xab\x6a\x55\xea\x32\x9f\xca\x42\x34\x46\x61\x4e\xbe\x69\x59\x9e\x29\xcf\xd3\x97\xc8\x8e\x2b\x80\x91\xa2\xbb\xd6\x4d\xe5\x71\x46\xed\x36\xec\xf7\xd8\xfd\x05\x03\xeb\xa2\x80\x1e\xed\x8c\x65\x7b\xf0\x33\x6a\x78\x46\x18\x7f\xf7\x4c\xfc\xfc\x21\xed\x5a\x2b\xfd\xfd\xad\x16\xe3\x24\x35\xdf\x3f\x23\x78\x89\x35\x57\x1a\x1d\xda\xda\x52\x2c\x3e\xcc\x94\x4d\x13\x05\x34\x3f\x27\xd7\x4b\xd0\x2c\x24\x66\x51\x43\x7f\xe5\xce\x28\x6a\x70\x4e\x9c\x8b\x25\xb8\x68\xec\xef\xe9\x64\xc0\x8d\x71\xaf\x92\x37\xf7\x30\xbe\x9b\xec\x7a\x94\x72\x39\x29\x5a\x36\xed\x4c\xd6\x92\x99\xa4\xe8\xf0\xe6\xf8\x88\x11\x6a\x89\xa5\x6d\x45\xb2\x73\x19\xc2\x58\xc8\x80\xa2\x27\x02\xf2\xbd\x40\x4c\x16\xc0\xf5\x4a\x3d\xc3\x67\xe1\x6f\x7b\xf7\x19\x5a\x52\x30\x4c\x42\xd6\xf2\x19\xfc\xc4\xa0\xc7\x58\x83\xab\x72\x05\xf1\x4f\x7e\xa9\x89\x59\x45\x3d\xa0\xe8\x16\x7c\x65\xee\x53\x2f\xa8\x83\xcf\x3d\x7b\xf9\x5e\x08\xdf\xf5\x1f\x6f\x65\x71\x0b\x16\x69\x7e\x7b\x79\x11\xfc\x1b\x3b\x5a\xbd\xc5\x61\xee\xc1\x93\xa0\x77\x34\x69\xf3\x63\xba\x66\xd5\xa5\xae\xd9\xf1\xc9\x62\x59\x75\x77\x2c\xeb\x3d\x8b\xe2\x7b\x43\x71\xcf\xce\xd4\x85\x33\x47\xdf\x1e\x45\xb4\xfa\x85\xeb\xd0\xe5\x87\xad\x4f\xe0\x51\xf1\x4e\x6c\xd8\xb0\xfc\x3b\xe2\xd2\xbb\x0e\xb9\x38\x38\xdd\xab\xfe\x6e\xcc\xa0\xf8\x6f\x8c\x41\xef\x2c\x69\xba\x95\x3e\xbb\x09\x2d\xa2\xa5\x7f\x22\x9a\xb8\xff\xa1\xbd\x15\xba\xd7\xfa\x0b\xbb\x49\xfe\x1f\x5c\xef\x91\x45\xc9\x8e\x45\x07\x73\x10\xf2\xa3\xa6\x6a\xd5\x2b\xfa\xc7\x5e\xfe\xf3\x30\x71\xa1\x4a\x2b\xf8\x64\xe2\x5a\x55\x06\x6c\xc0\x3b\xf9\x3d\x11\xc6\x77\x55\xb1\x2f\x6d\xa0\xd4\xee\xcf\xdf\x74\xb4\x4d\xcf\x7e\x16\x96\xab\x07\x13\xb6\x4b\xed\x1f\x84\xd3\xee\x81\xe8\x0d\xa3\xab\x7e\xe5\xb6\x8b\x94\xce\x92\xfe\xaf\x21\x51\x5a\x95\xd6\xac\x24\x65\x92\x41\x80\xc2\x52\x95\x35\x55\xcf\xd1\x33\xd7\x6e\x07\x8c\xe0\x2b\x6d\x4c\x3e\x29\xd6\x62\x5a\xe8\x26\x3b\x98\xc8\xe9\x95\x22\x31\xd1\x97\xb6\xc3\x15\x0f\xd5\x3e\x4b\x75\x43\x21\x3f\xfd\xc1\x9e\xa8\x7d\x47\x4d\x32\xff\x35\x30\x4c\x1f\xe3\x0c\x02\x13\x69\x54\x26\x20\x2c\x82\x92\x43\x4a\x2c\x02\x8b\x3d\x32\x66\xd2\x95\x45\xa0\x2e\x44\x15\x5a\x10\xac\xb8\xe5\xd3\x8a\xb0\x42\x75\xd4\xaf\x27\x5d\xba\xd6\x52\x8c\x9e\x63\xcf\xa0\x76\x33\x99\x76\x03\x99\x77\x1d\x1d\x64\x74\x47\xcf\x94\xf8\xd3\x46\xce\x1f\x0a\x05\xde\x5e\x01\xd1\xb8\x5a\xc4\xfe\xd6\xe6\xa0\x2a\x32\xa5\x50\xff\x0a\x87\xae\xf8\xb3\x58\x54\xbf\xbb\x6f\xb0\x00\x7a\xce\x0b\x48\xc4\x9f\x9c\xd8\x80\x70\x1a\x1c\x0f\xbe\x66\xb0\xac\x94\x0c\x4e\x06\xd0\xd9\xa3\x2f\xbc\x70\x00\x97\xde\x5e\xeb\x30\xb6\xb9\xba\x4b\x5a\xf5\x41\x77\xd7\x7b\xe0\x8e\x6c\x1d\xd5\x7a\xa0\xe9\x75\x45\x55\xfa\x0e\x11\x3c\x01\xc2\x95\x13\xda\x50\x9f\xbb\x95\x55\xb1\x94\xab\xc1\x87\x50\x47\x28\x8a\xc6\xe9\xca\xa7\xc0\x61\xef\xf8\xca\x5c\x89\x81\x6b\x23\xf2\x37\x74\x61\x88\x2b\x00\xa7\x28\x02\xab\x7d\x77\xd0\x31\x6f\xc3\x90\x86\xf0\xfc\xa6\x3d\x18\x36\x7e\xd1\xe6\xce\x0b\xed\xb2\xc6\xed\xce\x0b\xef\x7c\x5c\x7f\x54\x3f\x95\xa7\x1d\x77\x91\xc4\xe6\xe6\x0b\x5f\x60\x24\x38\xd4\x7c\xc2\x10\x00\x57\xc3\x8d\xf1\xe7\xdf\x82\x04\x30\xe4\xfc\xce\xf6\x82\xd0\x1b\xb1\x06\x99\xec\xdb\xeb\x40\x47\x5b\x0b\x1f\x60\x8e\xfc\xbd\x83\xd4\x5b\x4e\xcc\x6f\x83\x53\xb6\x15\x54\x26\x03\x4f\xa9\xd5\x72\x97\x47\xd3\xfe\xd7\x65\x29\x37\xab\x2d\x15\x52\x07\xfb\xa3\xd5\x87\x38\x39\xcc\x4e\x94\xb2\xe2\x2a\xca\x8f\xfb\xa0\x96\xca\x3e\x73\xe4\x42\x18\xcc\x36\xec\x5a\x29\x2a\x06\x42\x21\xa8\xb3\xa1\x87\x89\xa2\x88\x38\xc2\x5a\xfc\x85\xea\x6e\x42\xd4\xaf\xef\xe9\xbb\x0b\x65\x60\xcc\xfe\x38\x84\x19\xc8\x5d\xda\x86\xb2\xbd\x70\x66\x12\xa4\x99\xbd\xb0\x66\x52\xb4\xc5\xe1\x45\x94\x08\x5f\x6e\xda\x80\x5d\x54\xe5\xac\x30\x5e\x5a\x9f\x28\x32\x35\xec\x11\x02\x14\x60\x37\x04\x02\x19\x55\x41\x91\x7e\xe5\x13\xdd\x41\xa2\xf0\x91\x40\xd3\xa9\x5a\xd5\x2d\xdb\xce\xaf\xca\xc0\x73\x2f\x32\xaa\x8e\x12\xf0\x78\x1f\x07\x6c\xba\xa7\xe3\x5a\xf6\xf6\x01\x8a\xd8\x05\xc6\xe6\xca\x7f\xdd\x09\x7d\x88\x2a\xd7\xc5\xc0\x55\x23\xce\xb1\xac\x54\xd4\x6d\x00\xc2\x52\x57\x19\xb8\x33\x59\x84\x04\x6f\x72\xb5\x91\x3a\xcc\x86\x1d\xc5\x8a\xf8\xb6\x79\xbd\x9e\xfc\xe8\xdb\xce\xe9\xc9\x8f\xe0\x3c\x08\x25\xbf\x53\x52\x32\xaa\xee\xeb\xc9\x8f\xc9\x60\x2d\x6a\xf2\xbb\x8e\xa8\x7e\x33\x55\x75\x46\xf0\x5d\xa9\xf5\x21\x3d\x89\xa1\x62\xc9\x00\xbf\xaf\xb5\x5b\x6b\x13\xb7\x50\x4a\x17\xa6\x83\x19\xec\xb1\x82\xae\x20\x0c\x56\xcd\x8f\xf3\x6e\xf7\x3b\x6a\x20\x8a\x0f\x52\x93\x7f\xfb\xe5\xa2\xba\xa9\xbf\x72\xc5\xdc\x68\xae\x46\xdf\xdf\x7e\xc5\x42\x34\x5b\x6b\x83\xee\x5a\x33\x7c\xb4\x03\xb6\x6b\xd9\xfc\xde\x83\x93\x6e\xeb\xea\x6d\x3a\xf6\x7e\x5f\xbe\x6d\xcb\xd7\x71\xfa\xee\xbf\x80\x29\xf0\xfe\x46\x9c\x77\xf0\x21\xff\x22\x86\x86\x9b\xbc\xcc\xf4\xcd\x08\x3e\xe9\xcd\xc7\x5b\x1b\x20\x7d\x22\x36\x38\xfc\x0a\x6b\xc3\x2b\xa0\x90\x56\xe4\x59\xb7\x29\xa1\x6d\x7d\xe8\xf8\x16\x0b\x46\x97\x65\x96\xbd\xb8\x56\x65\xed\x6d\x0c\x3d\x7a\xb4\x37\x74\x65\x7e\xdf\x38\x32\xf9\x3b\x9a\x1b\xe0\x9b\xbb\xc2\x39\x22\x6b\x03\xb3\x2e\x78\xc3\xc2\x79\xa5\xe4\x6e\x93\xc2\xe1\xa1\xf8\x8f\x37\x68\xcd\x36\xad\xf2\x4b\xa1\x75\x1b\x10\x1b\xd4\xb0\xb1\x30\xcb\x55\xbd\xa6\x26\x0d\x23\xf1\x46\x0b\x4a\xee\xc2\xe1\x74\x59\xac\xa9\xee\x21\x19\x83\x7d\xe9\xa6\xba\x6a\xea\xc5\x7a\x14\xea\xa1\x63\x32\x3e\x1b\x6e\x18\x0a\x94\x53\xfc\x69\x99\x61\xc5\x5f\x88\x0a\x2b\x75\x0d\x5d\x34\xec\xe8\x3e\x5b\xdf\xaa\xdc\xce\xf3\xaf\x46\x3e\x62\xfb\x8f\xbc\xf3\x5c\xb8\x3e\x10\xcf\x18\xd4\x67\xa1\x20\x41\x18\xc2\x07\x2d\x24\x43\x84\x50\xf4\x67\x0c\xca\x0d\xa1\x83\x78\x76\xa1\x46\x24\x9e\xa1\x01\xc6\xbd\xed\x59\x98\x2b\x39\x14\x69\x8c\x67\x7e\x02\x5b\xab\xa7\xfc\x32\x5b\x8f\xfe\x67\xb3\xf2\xa4\x34\xff\x4f\x6f\xe4\x49\x3f\xe8\x77\x1b\xcf\x1e\x36\x9e\x14\x69\xbf\x9b\x78\x7e\x2b\x13\x4f\x8a\xd9\xfd\x2c\x3c\xbc\x11\x57\xcb\x6e\x01\xc9\x1f\x57\x6a\xcd\xda\x8f\xa1\x3b\xf5\xda\xfb\x50\x11\x15\xbe\x61\x69\x5d\xad\x59\xd8\x2c\x0e\xcb\xb8\x6d\x68\xfd\x22\x84\xa5\xb0\x7a\xba\x10\xee\x98\xa3\xe0\x3e\x4c\xc0\x98\x4a\x2b\x8e\xe2\x79\xc3\xe4\x4a\x48\xac\x73\x3e\xc9\x5a\x34\x65\x38\x33\x58\x54\x33\x23\x00\xbf\x7b\xe1\x70\xc7\x40\x56\x9c\x44\x8b\x1c\xfe\x15\xec\x57\x7b\xd0\xc3\x4e\xeb\xd5\xc6\x90\xff\x1c\x83\x39\x5d\x74\xbd\x38\x10\x63\x7b\x80\x7d\x8e\x07\xd9\xc1\x01\xaf\x87\x60\x77\x04\x42\xfb\x10\xfb\x7d\x29\x2d\xf1\xdc\x6f\x24\xb5\x98\xd8\x20\xf0\x9d\x8e\xe7\x0d\x04\xd7\x4d\x72\xbf\x92\xe8\xe2\x37\x5f\xc7\xf1\x89\x1d\xc1\x8d\x80\xc0\x76\x61\xd0\x7d\x69\xb7\xba\x6e\x13\xee\xef\x06\xc4\x7f\x4a\xa3\x52\xba\x3f\x3f\xda\x7e\xd8\xb2\x2c\xb9\x4d\x34\x4c\x5b\x13\xe2\x2e\xd8\x7c\x66\xee\x7b\x62\xfe\x6e\x5c\xfc\xfb\xd1\xc1\x3e\xb6\xc5\x34\xc0\x5f\x4f\x7e\x8c\x34\x86\xbd\x88\xc3\x99\x9d\x07\xed\x96\x6c\xbf\x84\x46\x7e\x37\x5f\xfe\x0d\x68\xe2\x57\x5b\x2f\xdb\x92\xdc\xaf\x5c\xdf\xdf\xed\x9c\x7f\xdb\x75\x8e\x0b\xb8\x56\x9d\x0b\xdd\x59\x8a\xb5\x5a\x6f\x34\x20\x74\xd1\x84\xac\xd6\x17\xf9\xe5\xaf\xdb\xfa\xfb\x19\x50\x97\x6a\xa9\xab\xf5\xbf\x88\x05\xf5\x65\x79\x80\xdf\x13\xac\x2a\xbf\x24\x4e\x0b\xe0\xed\x78\xbf\xc8\x72\xfa\x15\xce\xe0\x17\x9b\x4e\x37\x35\x1a\xfb\x87\x34\x1f\xe1\xc7\xfe\x2b\xd9\x8f\x5a\x5f\xf4\xbb\x01\x69\x0f\x03\x52\x0b\x6b\x7b\x58\x90\x2c\xc2\x94\x37\xe4\xa6\x52\x53\x6c\x4a\x27\x86\xa9\x9c\x4a\xf7\x73\x30\xf3\x46\x80\x70\x7f\xc8\x6c\xbd\x2e\xf1\xee\x83\xe7\xa5\x5d\xfb\x2d\x66\xa7\xc9\xc6\xfd\xc5\xf6\xe1\x4e\x0b\x71\x94\x00\xc7\xbc\x1b\x43\x97\x1d\xf8\xbb\xf9\x6c\x1b\x5d\xfd\x4a\xfb\x19\x35\xb4\xff\xdd\x6e\xf6\xcf\x66\x37\xdb\x44\x08\xff\x78\x86\x33\x22\xb1\xdf\x0d\x66\xbf\x1b\xcc\xfe\x5f\x30\x94\xb4\x36\xe6\x2f\x8b\xb8\x0b\xb5\xbf\xba\x37\x53\xfb\xaa\xdb\x21\xa9\x41\xcd\xd7\x13\x0b\xb2\x45\x97\xd8\xd0\x2e\x21\xf6\x0c\xa7\xf8\x4f\x20\x0e\xfc\x6e\x19\xfc\x07\x24\xf8\x7d\x4c\x83\x9c\x2c\xb7\x5b\x0a\x3f\x5e\xd2\x75\x16\xc3\x0f\xed\xaa\x71\x9b\x36\x8c\x37\x32\x7e\xd6\xc1\xb7\xff\x57\xc8\xfe\x37\xb3\x84\xfd\x6e\xe9\xfc\x4d\x69\xfc\xa3\x4c\x9d\xbc\xa3\x41\xb7\xe0\xfd\xbb\x99\xf3\x1f\x7b\x91\x7f\x63\x3b\x67\x27\x41\xa0\x8d\xf3\xf2\x6f\x68\xe3\xac\x95\xa9\xdf\x51\x0d\xb3\x7f\x11\x0b\xe7\xff\xb5\x77\xed\x4b\xae\x73\x75\x23\x58\x51\x98\xa6\xcc\x6b\x61\x3f\xd8\x8a\xaf\xb3\x4a\x2e\xd5\x8d\xae\xae\x60\x91\x78\x51\x49\x59\x7a\x29\x56\xf2\xeb\xf6\xc9\xb8\x4b\x95\x7d\x91\xeb\x2a\x8a\x05\xb9\x2d\xed\xbc\x55\xa6\xfe\x8a\x75\x35\xad\x54\x01\xa4\x06\x76\x56\x68\x82\x77\x8e\x65\x26\x97\x7a\x49\xfd\xb0\xf2\xba\x67\xa0\xba\x62\xa8\x53\x03\x25\x32\x4d\x5e\xce\x0b\x85\xef\x41\x52\x06\xc8\x4a\x49\xa3\x4b\x39\x29\xd6\xc2\x2c\x25\x76\xa5\xea\x9f\xfd\xff\xc7\x57\xa2\xc8\x4b\x65\x05\x23\xfb\x5e\x1c\x54\x14\xba\x16\x4a\x9a\x1c\x37\x88\x6b\xb0\xac\x4b\x1a\x16\x4a\xdd\x40\xc5\x18\xfb\x7d\x76\xa4\x85\xac\x4a\x65\x0c\x56\xb9\xcf\x41\xd8\x60\x0f\x1a\x75\xad\xca\xa8\xaa\xb9\x2e\x0a\x7d\x63\x51\x4a\x1f\x88\x75\xe2\x29\xb7\x9e\xb5\xea\x4b\x71\x73\x80\x75\x16\xb4\xae\xc9\x04\x6d\x27\xad\xca\xba\x5a\xaf\x74\x5e\xe2\xb6\x87\x92\x6e\xa0\x6d\x28\xab\x99\x35\x68\x4c\x6e\x0f\x36\x7a\xa5\xe7\xe2\x40\xbc\xd2\xf3\xb9\x85\xb6\x94\x98\x63\x76\x7e\x07\xec\x9b\x26\xaf\x95\x38\x10\xe7\x0e\xdd\x2e\xb1\xdf\x2d\x70\xc7\x33\xf6\x77\x78\x84\x96\xc4\xc2\x6e\x01\xfd\xb6\x29\xc5\x81\xc0\x2b\x48\x19\xea\x56\x4d\x1b\xf7\x26\x09\xbc\x6c\xc7\x2b\xbf\x55\xa6\x29\x5a\x2f\xb5\xfb\xac\x29\xa8\xb8\xa8\xe7\xf9\x16\x89\x54\xc1\x84\xb6\x8a\x27\x76\xb1\xc8\x55\x25\xab\xe9\x62\x8d\x64\x71\xa5\xd4\x4a\x55\xae\x90\x41\xa1\xe7\x1b\xca\xb6\x74\x60\x18\xf9\xbd\x7d\xc4\xb3\xfa\xae\x75\x08\xe3\xc1\x26\x7a\xa5\xe7\xc6\xf5\x30\x67\xbb\x91\x1a\x22\x59\x9e\xa6\x97\x79\x1d\x99\x4c\x39\x99\x24\xf6\xd1\x42\xcf\x99\x81\xdc\xce\xe5\xcc\xcf\x0a\x0b\x7c\x75\xcd\x09\xea\x99\x76\xf7\x72\x77\x94\xe5\xf0\xe7\x5b\xa9\xc3\x0d\xc7\x1a\x37\xe8\x01\xc0\x71\x6f\x59\xfd\x18\x3c\x36\x57\x76\x23\x60\xe3\x76\x3b\x88\x01\x82\x33\xaa\x6e\x56\xfd\xc1\xd0\xe1\x65\x55\x29\xb9\x9c\x14\xaa\x4f\xfb\x15\x40\xa7\xd2\xee\x20\x2a\x52\x15\xa6\x51\x35\xe5\x48\x20\xd3\x71\xcb\x6c\xa8\x57\x3c\x13\xe3\xd3\x0f\xbf\x0f\x4c\x77\x24\xc4\x4b\xcb\x0a\x54\x59\xe7\x95\x2a\xd6\xa2\x59\xb9\xe5\x60\xb3\xbb\x01\x3f\x4f\xdd\xf3\x66\x47\xe8\x98\x81\x3d\xd2\xda\xab\xd2\xea\x98\xee\x88\x3e\xb5\x66\x53\x81\x3e\xb2\xa9\x74\xad\x0e\x3d\x49\x85\x79\xe9\xa1\x2d\x05\x08\xfd\x7a\x49\x63\xf4\x34\x0f\x05\x3c\x5b\x8b\xe6\x25\x05\xcf\xb5\x9f\x53\x9d\xe1\xa5\x5c\xf3\x46\xf1\xc8\xe1\xec\xc9\x09\x1e\xb0\xd5\xaa\xd2\xab\x0a\xda\x0e\xba\x8f\xd9\x85\x04\x5d\xd2\x67\x3c\x77\xc2\x09\x43\x44\x8d\xb7\x06\xa8\xd2\x24\xb1\xf9\x6a\xa6\xa1\x3e\x34\x4c\x7c\xf7\x27\xe5\x06\x68\x61\xc7\x5e\x45\xd6\xf1\x81\x78\x85\xab\x67\x63\x7f\x8d\x88\x5c\x89\x66\x35\xd5\x4b\x28\x13\x4d\x44\xe4\xd8\x5a\x4a\xe8\xd3\x5b\x6c\x66\xa8\xcb\x5a\xdd\x46\xc3\x84\x15\xd9\x85\x24\x0b\xf7\x0d\x11\x3d\xc7\x0f\x4e\x6d\x28\x80\x58\xda\x28\x72\xe5\xa7\xf7\xc4\xd0\x2c\x2f\x73\xb3\x68\xbb\xf9\x7e\x31\x8e\x68\xc0\xec\xef\x87\x23\x6d\xea\xbd\x91\xf4\x05\xc8\x33\x98\xca\x01\x33\x76\x5c\x44\xe8\xa6\x5e\x35\xac\x0e\xf3\x8d\x38\xff\xe6\xa5\xef\xf9\xe1\x9b\xf1\x50\x2b\x11\xc7\x8e\x89\x79\x0b\xa1\x46\xf3\x91\xf8\x5e\x09\xd3\xac\xa0\xa8\x6e\x5e\xce\x34\x71\x2f\xe8\x61\x37\x18\x0a\x05\xf5\xa5\xed\x2f\xf5\x74\x34\x1a\xa1\xf9\xb4\xc8\xaf\xfc\x68\x23\x7a\x88\x00\xb6\x31\x51\x7a\xfd\xdb\xd6\x54\x40\xac\xd7\x8d\xe5\xd7\x45\x61\xcf\xab\x39\xb2\xc6\x4a\x37\xf3\x85\x3f\x64\xde\xb8\x6a\x72\xd0\x8c\x5b\x18\xa9\x97\x0a\xbe\x97\x3e\xcf\xd4\xb2\xcc\x64\x95\xf9\xc1\xcf\xbf\x79\xd9\xbd\x16\xaf\xe0\x48\x89\xb9\x18\x3e\x73\x46\xff\xe5\xc1\x2a\x56\x4f\x39\xc3\xce\x44\xde\x04\x97\x61\x5d\xa8\x5e\xcf\x5f\xc1\x22\x77\xef\xba\x2e\xbe\xa9\xe5\xf4\xea\x1d\x76\xcd\xc4\x14\x93\xe7\x72\x55\x37\x15\x7e\x2e\x5f\x19\x10\x8d\x04\xc8\x46\x60\xa2\x82\x45\x06\xa9\x5a\x02\x69\x41\x1f\x22\x28\x48\x68\x1f\x33\x94\xfe\x82\x25\x08\x8b\xf5\x48\xd8\xc5\x74\xed\x8e\x26\x4a\xb8\x06\x84\xd8\x9a\xd2\x28\x45\x45\x13\x47\xbe\x34\xbe\x2c\x8c\x86\xb2\xc8\xc6\x75\x99\xb6\x43\x01\x56\x6b\x2d\xac\xc8\x68\xdf\xa6\x2a\x23\xfa\x40\x2c\x37\xca\xe3\x1f\x29\x64\x30\x72\xdf\x4a\xdf\xf0\x8e\x0e\x6b\xfa\xd3\xa2\xe2\xa2\x57\xe8\x79\x6f\x28\x7a\x99\x9a\x34\xf0\x8b\xa5\x19\xfb\x5f\x3b\x86\xfd\x2f\x50\x59\xef\xd2\x37\xb1\xea\x17\xea\x5a\x15\x03\x71\xf6\x39\xa9\x4e\x85\xaa\xc5\xd2\xcc\xbf\xc1\x4a\x82\x0e\xc7\x42\x98\x9b\x1c\x5c\x00\x04\xef\x7b\x94\x59\xbc\xd1\xeb\x9e\x45\xd7\xe0\x8d\xf1\x25\x7c\xf9\x33\xef\x00\xe0\xef\x81\x71\x47\xb5\xfe\x6e\xb5\x52\xd5\x73\x69\x54\x7f\x40\x2d\x1b\x43\x31\xe3\x49\xa5\xe4\x55\x54\xa3\xd5\x7e\x7b\x2d\x34\x92\x59\x84\x9c\x0b\x18\xf0\x32\xd8\xa6\xe8\xc2\x06\x38\x71\x26\xfa\xa3\xd1\x48\x56\x73\xc3\x90\xc1\x0a\xa7\x5a\xe2\x0c\xd5\x6e\x03\x69\x3e\x38\x8b\xa9\xf2\x01\xfb\xaa\x07\xc2\x8e\x37\xfa\x51\xe7\x65\xbf\x27\x7a\xf0\x41\x3f\x94\xfe\x83\xec\xb4\x47\x72\xb5\x2a\xd6\xfd\x68\x4a\x43\x78\xcc\x19\xac\x40\x5f\xf5\x5d\x53\xbf\xaf\xe4\xea\x70\x92\x97\xa8\x98\xcf\x2b\xdd\xac\xfc\xf6\x02\x6a\xbb\xe8\xc1\x45\xbb\xd6\xf0\xcb\x73\x5d\x14\x72\x65\x54\xc6\x17\x1d\xee\xb0\xef\x24\x34\xfe\x19\x86\x4b\x11\x04\xc0\x1c\x91\x78\x61\x03\x9c\x45\x64\x21\x27\xaa\x38\xeb\xf5\x22\x4c\xe2\xe8\x78\x2f\xea\xf2\xf9\x91\xe8\x85\x01\x12\x4c\xa6\x7c\x41\x88\xde\xa8\x52\x2b\x25\xeb\xfe\x83\x07\x2d\xfe\xd0\x81\x59\x8e\x80\x17\x65\x96\x7e\xdb\x68\x4e\x37\x3c\xbf\x99\xef\x82\xb4\x78\x60\xdf\xef\x87\x76\xed\xfb\xb6\x4c\xf9\xe0\xa0\x7b\xca\xad\x22\x94\xd0\xc8\x0d\x05\x6f\xf8\x80\xaa\x99\xd6\xba\x62\x16\x23\x68\xda\x8b\xcd\x72\x17\xaa\xca\x6b\xb0\x5c\xdd\x81\x9e\xd1\x1d\x5a\x9c\x3b\x52\xbe\x33\x2a\xee\x1b\x07\x02\x5d\x4b\xcc\x27\x41\x9c\x5a\x76\x81\x60\x1c\x77\xb7\xb7\x63\x61\x89\xc7\x62\x2d\xf2\x32\xaf\xc9\xad\xd5\x3d\x59\x6f\x98\x0a\x03\xfe\xb7\x6e\xc0\x78\x51\x2f\x14\x58\xa7\x98\x94\xe9\x35\x00\x90\xf6\x83\xf4\x2f\x96\xaa\x5e\xe8\xcc\x40\x01\x52\x35\x55\xc6\xc8\x6a\x0d\x30\x32\xe3\x5a\xc1\x1d\xec\x19\x17\xbd\xd0\x2b\xd7\xd7\xb2\x12\x5f\xad\x2d\x7e\x0c\x15\x24\xeb\xc4\x57\xbf\x47\x40\x3d\xbb\x3c\xf4\x2c\x5d\x8a\xcd\xf5\xb0\xab\x42\x18\x0f\xca\xf1\xf7\x9d\x17\xf5\x8d\xaa\x0d\x9d\x80\xf9\x5f\xb1\xe7\xdc\x2d\xfe\x9a\xcf\x44\x5e\x0b\x75\x9b\x9b\xda\xf8\x1e\x71\xad\x26\x4d\xe3\x23\x36\x18\x16\x5e\xf5\x47\xb9\x2b\xa8\xee\x9a\x1c\x4d\x6f\x87\xe2\x67\x3b\xf6\x33\x31\x3e\x82\x3e\x05\xf7\x69\x2b\x6c\x9c\xff\x6a\x97\x94\xc9\x3f\xc5\x4a\x0a\xa0\x87\x8b\xbe\xba\x86\x8e\x6e\x53\xbb\x08\xb3\xa6\x10\xba\x54\x66\x00\xda\x82\xc9\x33\x75\xa0\x66\x33\x10\x48\x2c\xa1\x15\xb9\xa9\x87\xc2\x68\x36\x52\xa5\x88\xe2\xf2\xda\xc9\xf5\x10\x82\xc4\x8d\x05\x4e\x6f\xc5\x7a\xfc\x10\xdd\x86\x97\x37\x7a\x0e\xec\x97\x07\x4b\xe1\x7d\xce\x6e\x0a\xac\x52\x2f\xce\x44\xee\xc7\xf9\xd0\x42\xcf\xe1\xa1\xf8\x93\x34\xf9\x54\xa4\xc6\x2c\x5f\x61\x98\xe1\x50\x66\x99\xfd\xa5\xdf\x5b\xe9\xd5\x01\x9a\x29\x7b\xc3\x1d\x48\x64\xb3\x19\xad\xf4\xaa\xcf\x48\x4b\x88\xd0\x46\x30\x37\x56\x7a\x57\x15\x6e\x1d\x99\x17\xd4\x99\xce\x4e\x05\x0e\x5b\xd8\x89\xa6\xd6\x2b\x48\xe0\x1d\x85\x11\xc8\xe4\x81\x4f\xbf\xf8\xcf\x7e\x78\x1d\xce\x70\xc8\x48\xf1\x00\x1d\xed\xf1\xfb\xcf\x49\x45\xb0\xf2\x69\x5e\x66\xf9\x94\x56\x69\x21\x8d\xd3\xd5\x27\x6b\x90\x66\xbc\xda\x8d\x9b\xb2\x3d\x09\x0b\xde\x1f\x04\x74\x0f\x22\x44\xbf\x91\xd0\xfe\xb0\x65\x37\xdc\x8a\x6a\x80\x3e\xf8\x28\x84\x5b\x42\x31\xaa\x98\x11\x2f\x8f\x3f\x18\x12\x88\x9d\x51\x3e\x8d\xb1\x74\x40\x5d\x78\xb5\x23\xc6\x78\x85\x2b\x11\x5e\xdb\x8f\x27\x18\x89\x68\x8f\xf0\xff\xbd\xcc\x6b\x31\x3e\x3a\x5a\x9a\xd0\x6b\xd3\x2e\xbd\xac\x2a\xb9\x16\x14\x5c\xe2\xb9\xa9\xbc\x0a\xc6\x63\x75\x0b\x18\x65\xeb\xd0\x11\x36\x31\xb4\x63\x27\xab\xbe\x93\x24\x1d\x19\xc0\x89\x13\xd4\xc8\x52\xa9\xcc\x08\x59\x62\x5c\xeb\xb1\x9f\x33\x6b\xa9\x9f\xd0\x35\x99\x51\x7c\x53\xc7\x4a\x81\xbe\x64\xd1\x72\x68\xc9\x9c\xf2\xef\xcb\x21\x19\x53\x59\xd7\xd4\x5a\x47\xc3\xa1\xd7\x23\x5f\x2a\x68\x40\xd5\xa6\xbd\x4a\xfd\xd4\x28\x03\x9f\xdf\x3f\xa6\x2f\x6e\x51\x61\x5b\xcf\x72\x3e\x3c\x38\xfd\x5e\x77\x95\x5c\x0d\x87\x63\xb7\x4e\x84\x16\x53\x5e\x56\xd1\x0d\x45\x7e\x0e\x77\x22\xda\xf3\x11\xec\x1d\xf4\xa4\x27\x5c\xb7\x22\xec\x9e\x95\x21\xd8\x9f\xdc\x25\xeb\x27\x7a\x16\x26\x4d\x05\x6c\xdd\xe9\xd0\xac\xfa\x60\x27\x22\xb9\xda\xbe\x78\xd3\x73\x74\x97\xf6\x1b\x55\x58\x6d\x8b\x12\x74\xdf\xc3\x67\xb9\xb1\x3a\xd2\xd6\x67\x18\x8c\x7f\x6e\xae\xea\xad\xcf\xd0\xfd\x14\x9e\x5a\xb4\x6c\x7d\xc6\xc2\xf8\xe7\x6a\xba\x10\xc2\xa4\xfd\xe5\xaf\xe4\xea\x9d\x8f\xec\x80\xab\xfe\x6c\x0c\xdd\x89\xf1\xb0\xea\x77\xbf\xd0\xc3\x0f\xfc\x10\x5c\x04\xda\x30\x4f\x58\xa3\xee\x01\x9d\xc8\xa2\x0c\x85\x32\xd7\xba\x8a\x9a\x4f\xd9\x0b\x91\xb4\x08\x08\xd1\xb3\x0d\xe6\xfb\x30\xde\xd0\x99\xbc\xc9\x0b\xb8\x50\x6b\x71\xa3\x98\x0f\x62\x33\x49\xb3\x59\xb9\x8a\x9f\x51\x99\x7b\xd8\x17\xd0\x0a\x60\xab\xf4\xf9\x36\x1c\x18\xb8\xc1\x57\x39\x5a\x7f\xad\x1c\xc6\x5e\xe1\x9c\xa0\x6b\xec\x49\x00\xf8\xdf\x3a\xbd\x40\xb2\x91\x31\xf1\x35\xd6\x90\x57\xa6\xfe\x92\x2e\x87\x7a\x1b\xee\xbe\x8f\x0f\x76\xf4\xc0\x9b\x83\xf5\xbe\x68\xa0\xbe\x7d\x4d\x5b\x1f\x0b\xc9\xf7\xc4\x03\xe1\x1e\xf7\x11\x42\x35\xbe\x7f\x93\xe5\x96\xcc\xb6\x1b\x66\xe5\x75\x0f\x37\x89\x0b\x07\x78\x49\x9b\x3f\x82\x00\x6a\x46\xf2\xb0\x7f\xa6\x41\xdd\x76\x35\xa1\xac\x34\x6e\xba\xcc\xcb\x55\x9b\xd0\x17\xef\xe0\x7f\x5e\x14\x3a\x6b\x5a\xa1\xe7\xfd\xde\x17\xfc\xeb\xc3\x1b\x47\xb3\xa6\x28\xda\xcd\x7b\xfe\x0c\x11\x83\x9d\xde\x2c\xd7\xc6\xd0\x9e\x4f\x76\xf6\xbf\x19\x35\x77\x9d\x3d\x1e\xa7\xe9\xd1\x93\x29\x93\x57\x6c\x2d\x43\x25\xee\xae\x49\xbb\xda\xec\x70\x0e\xd2\x53\xa0\x65\xf8\x32\x2d\xa4\x80\xdc\x48\x13\xba\x39\x08\xf4\x22\x6f\x23\x95\xc0\xb4\x5b\x64\x12\x79\x30\x36\x50\x73\x1b\xe7\x25\x09\x37\x1d\x0c\x0c\xb5\xb4\x4e\x4b\xf6\xdf\x87\xad\xc4\x27\x4e\x12\xc4\x94\x7e\x28\x6c\xca\x56\xc8\x5c\xe8\x83\x20\xb4\xf7\xca\xa0\x7a\xed\xe8\x6a\x28\x56\x8d\x13\xa8\x55\x68\x1a\x41\xbd\x9f\x49\xab\xaf\x99\xc1\x9c\xab\x8e\xa0\xff\x42\xd0\x0a\xd3\x1f\x8d\xc8\x72\x98\xaa\x55\x90\x83\xd6\x78\x87\x35\x48\xc9\xcb\x5a\x95\x19\xa2\x69\xa2\x7c\xdb\x77\xef\xe0\xc6\x39\xf6\x8c\xd7\xc5\x09\xbf\x28\x89\x21\x0d\x85\xd6\xd6\xc6\x0b\xa5\x91\xa7\x2c\x9f\x2e\x40\x29\x9c\x28\xa7\xdf\x67\xb0\x02\x60\x92\x76\x51\x2e\xb1\x1b\x60\x24\xc4\x97\xba\xf2\xe2\x2c\x73\x8b\x7f\xb5\x4e\x4e\xdc\x1d\xda\x77\xa2\x1e\x9b\x5d\xfa\x31\xc9\xa8\x89\x57\x02\xdb\x3f\xf7\xec\x63\xbd\xb0\x36\x35\x52\x92\xd3\xa5\x9c\xaf\x00\x03\x6f\xdc\x72\x79\x25\x9e\x54\x7e\xde\x81\x3f\x79\x76\x0e\xdc\xa7\x43\xfb\xdf\xe4\x0a\xd8\xd7\x85\xd2\x7a\xd0\x53\x48\x70\xc5\x52\x60\x86\x25\x40\xcb\x70\x0e\x79\x5f\x67\x8a\xd3\xd4\x25\xc7\x6a\x17\x11\x83\xd7\xd5\x7d\xb3\x55\x27\x54\x46\xe5\xa5\x08\x37\x48\x61\x33\x1e\xdb\x84\x5d\x1e\x0c\xef\x31\xe0\x3a\xa8\x24\x44\xb1\x65\x8f\x46\xe4\xd0\xd5\x32\xda\x2e\xbb\xfb\xea\x34\xa9\xda\x92\x7c\x7c\x8f\xec\xa0\x57\x60\xec\x84\xfb\x96\xa8\xfe\x28\xa6\xb7\xf6\xda\x33\x0f\x7d\x71\x75\xd9\x6e\x23\x4d\xac\x06\x3c\x06\xb4\x5f\xa6\xe8\x9b\x23\x3c\x36\xab\x0e\x35\xc2\x05\x88\xb8\xe5\x4f\xea\x8e\x39\x0d\x2f\x30\x38\x29\x4a\x7d\xa0\x57\xd8\xcb\x36\xd9\xb1\x76\x30\xcb\xf6\xf3\x4a\x19\x61\xf4\x52\x89\xab\xbc\xcc\xec\x20\x70\xfb\xe0\x06\xbc\x3e\x76\xe3\xa0\x31\x00\xa2\x56\x2c\xdb\x29\x24\x76\x92\xc8\xb4\xc8\x3d\xb7\x00\x7f\x38\x6c\x75\x70\x80\xe8\x0a\x1c\x44\xb5\x72\xcb\xd4\xc9\xcd\x40\x51\x44\x30\x5a\x7c\x3b\x94\x04\x63\x51\x4e\xce\x14\xf0\xd9\x00\x7b\x77\x3d\xf2\x00\x1b\xf0\x45\xb2\x5c\x33\xef\x1c\x33\x80\xa0\x63\x1e\xb6\x57\x78\xaf\xef\x47\x83\x64\x96\xe5\x66\x2a\x2b\xcb\xd8\xc0\x30\x08\x47\x80\x2e\x03\x19\x12\xd7\xb7\x34\xe0\xf6\x69\xa5\x96\x44\xfe\x51\xe4\xd2\x79\x89\xd6\x2c\x81\xd6\x2c\x63\x55\x4d\xf8\xdb\x2d\x48\xc7\xc7\xa3\xe5\x64\xa2\x44\x9e\xa9\xe5\x4a\xd7\xaa\xc4\xb3\x9a\xb1\xb4\xa1\xdd\x04\x6b\xdd\xf4\x2a\x25\x64\x96\xd9\xd7\x7e\xf1\xf5\x57\xa2\xd4\x19\x75\x9f\x12\x99\x9e\x36\x4b\xe8\xb1\xb0\xb4\x1a\xbe\x69\x2a\x40\xd9\x2c\xaf\x30\xee\x08\x85\x6d\xd4\xc6\xd5\xba\x07\xcd\xef\x6a\xdf\x1c\xb9\x06\x9b\x90\x20\x76\x06\x47\xdd\xd0\x45\x11\xd6\x0b\xb5\x14\x95\x04\x8d\xbd\x5e\xc8\x12\x89\xa5\x41\xb7\xd5\x32\xee\x37\x65\xc7\x9c\xea\xa6\xac\x69\xad\xf3\x0a\xd7\x94\xc5\x0a\x92\xfa\xb0\xaa\xf4\x44\x4e\xb0\xa3\x79\xa1\x66\xf6\xfb\x17\x96\xe6\x20\x6e\xcd\x2e\x1f\xc9\x1f\xbc\x4f\x97\x45\x6e\x28\x59\x17\x18\x85\x9c\xe8\xaa\x66\xab\x92\x85\x08\x1c\xce\xd6\x7e\x5b\xaf\xf2\x7e\xe7\xca\xde\x1b\x3d\xd3\x62\x55\xa9\x03\x24\x0f\xd8\xf4\x7f\xc7\x5d\xce\xdf\xbc\xdf\x1e\x07\x89\x80\xf2\x53\x1a\x8a\xc6\xc1\xc6\x62\x52\x4c\x9a\x72\xba\xb0\xc3\x4e\x74\x5e\xa8\x6a\x55\x48\x17\x9f\x73\x58\x2b\x59\x65\xfa\xa6\xa4\x78\xc5\x12\x77\x53\x6e\xbc\xe0\xe0\x96\xdc\xfc\x0d\xd6\xfc\x1f\x39\x8e\x23\xa5\xa6\x9d\x36\xf6\x8f\x22\x2c\x6d\x6a\x5c\x5f\x8b\xff\x03\xbb\x00\xbf\x13\xd7\x3f\x0a\x71\xfd\x1d\x02\x60\x5a\xc4\xf5\x31\x21\x30\xf8\x7a\x51\xa9\x55\xa5\x8c\x3d\x4c\xa1\xbf\x23\x8f\x99\xcc\x63\x15\x65\xd4\x6a\x23\xe9\x8e\x4f\xf0\x07\x54\xb5\x8f\x8e\xdc\x66\x95\xf1\xca\x03\xe0\x82\x1f\x31\xea\x5a\x55\x3e\x84\xdd\x9b\xcd\xe0\xbc\x9e\xac\xc5\x42\x96\x2d\x35\xb9\xf3\x45\x64\xb1\x7d\x0e\xc1\xb1\x6f\x63\xb1\x04\x23\x66\x83\x88\xdb\x92\x63\x47\x3b\xb5\x70\x8c\x88\x0f\xba\x78\xce\x5c\x15\x43\x38\x27\x31\xe6\x97\x34\x38\xbe\xfa\x34\x09\x67\x35\x68\xa7\x06\x74\xd3\xda\x90\x96\x6a\xf0\x21\xb2\x71\x44\xb9\xb0\x2c\x9c\x91\x52\x07\xe2\x80\x4c\x38\x6d\x85\xd7\xf7\xc8\x7b\x23\x05\x45\xcb\x7a\x89\x45\x62\xbc\x81\x1b\x2e\xa1\xc9\xb6\xf2\xdd\xda\x37\x6d\x22\x4d\x0d\x04\x61\x75\x36\x5a\x6f\x40\xf6\x06\x32\x15\xc4\xca\xb6\xac\x61\xec\xc1\x86\xa4\xd3\xfb\x87\x77\xb8\x4d\x1c\x49\xe1\x8c\xd1\x05\x06\x59\xf0\x17\x6c\x58\xd6\x8e\x15\xed\x58\x4a\xfe\x46\x4f\x2c\x67\xb1\x49\x2b\x7a\x1b\x35\x24\xed\x78\xdd\xc7\xbc\xca\xd9\xae\xa2\x4f\x63\xe6\xfc\x07\xa2\x77\xc1\x4d\x6b\xf6\xc2\x65\xcf\x05\x98\xa4\xa9\xd4\x10\xc8\x19\x51\xcd\x88\x7f\x93\x5b\x1c\xe7\x7f\x70\x7f\x47\x36\x8e\x17\x10\xae\xad\xe2\xfd\xc4\x0d\x0d\x53\x5f\x5b\xb9\x6d\x5e\x4b\x68\x71\xc8\xd9\x8a\xec\x8a\x65\xa0\xe0\xd1\x0e\x49\xd5\x7e\x4a\x5e\xef\xcb\x36\xf6\x66\xe9\x9b\x2d\xa7\xf6\x77\x9e\xef\x12\xc7\xf4\xe2\x68\x14\x00\xe7\x73\xb2\xed\x1a\xa0\x4d\xcb\x0a\xff\xab\x55\x41\x76\x2a\x38\x3f\x25\x14\x58\xd8\x6e\xc4\x1f\xc5\x0e\x22\xbf\x42\x14\x6a\x44\xee\x2f\xa0\x87\xe1\x1d\xb1\xed\x7f\x17\xee\x90\xa0\x67\x28\xf6\x76\x34\xbd\xa5\x0c\x3e\x9f\x17\x7e\xcb\x9b\x2d\xaa\x5b\xbf\x5a\x1d\x06\x3b\x44\x2b\x5c\x72\xf1\xbd\x2e\xf0\x87\x95\xae\x0e\x0e\xd1\x2a\x2f\xeb\xa2\xec\xf7\x80\x61\x54\x32\x07\x0e\xc5\x6a\x59\xa3\xd5\x56\xdd\xf2\x56\xd7\xea\x76\x64\x6a\x9f\x38\x94\x5e\xe5\xb3\x83\x74\xad\xb8\x6f\x75\xf4\x5a\xf7\x0c\x05\x71\xfd\x50\xf6\x06\x83\x2d\x0d\xab\x3b\x9f\x1d\x24\x99\xed\xd1\xf7\x39\x5f\xa8\xfd\xbc\x77\x6e\x71\xbe\x3c\x7f\xf9\xea\xc5\x17\x43\x0c\x85\x6c\x57\x78\xfe\x8e\x84\xa4\xe9\x42\x6b\x7b\xe6\x46\x09\x10\x98\x26\xd3\x94\xa8\xae\x71\x1d\xdd\x14\xf9\x7c\x51\x17\x6b\xb1\xd4\xd0\xc5\xb9\xbc\x56\x65\xae\xca\xba\x7d\xb0\xe2\x89\x6d\xd4\xc6\x78\xa1\x0d\x11\xeb\xfd\xc1\x8e\x4d\xf5\x81\x3b\x29\x3d\x0b\xf7\x09\x3e\x1d\x56\x5c\x77\xe6\xb8\x5d\xbd\x41\x54\x3a\xf7\x87\x52\x94\x34\x00\x09\x39\x6e\x8f\x1a\x77\xd4\x31\x59\x93\x9d\x90\x16\x89\xdb\x8d\x95\xba\x82\x80\x87\xeb\x3c\x6b\x64\xc1\x82\x89\x36\x6f\xfe\x24\x8a\xbf\xd3\x99\x1b\x1d\x01\x0c\x05\x69\xee\x86\xb7\xa2\xb5\x4f\x96\x90\xde\x11\xf9\x80\xf9\xe0\x6f\x16\xba\xaa\xa7\x4d\xed\x58\x49\x32\x7a\xcf\x88\x42\xcf\x93\xa1\x31\x21\x84\x0d\x69\xaf\xb4\x8f\x2d\x77\xd6\xbb\x25\xd8\x2f\x47\x22\xce\xd2\xc0\xd1\x16\xfa\xc6\xeb\x0b\x76\x75\x30\xa8\xcc\x67\x67\x6c\x48\xcb\x20\x4f\x68\x3c\xf7\xe9\xad\x38\xb3\x84\xf1\xfe\xbd\x4b\x7e\x8e\x0f\x76\xf2\x87\x86\x19\xa0\xb5\x44\x95\x60\xcf\x80\x80\x82\x99\xcc\x8b\xa6\x6a\x8d\xec\x2e\x87\xb6\x86\x7b\x8d\x8c\x14\x99\x8c\xb5\x8a\xdc\xa5\x29\x5e\xa1\xd1\x36\x47\xb0\xa9\x65\x55\xab\x0c\x9c\x34\x50\x38\x1f\xad\xfc\x0b\x69\xca\x5e\x8d\x25\x4d\x08\x44\xac\xa1\xd9\x6b\x24\xf4\xd8\x3b\x5f\x48\x88\x3d\xb0\x0f\x6f\x78\x61\x5e\x8a\x65\x5e\x14\xb9\x51\x53\x5d\x66\xc6\x1b\x91\xc2\x2c\x6a\xad\xaf\x78\x18\x07\x9f\x0e\x0e\x16\xe6\xe4\x4b\x38\x75\x4c\x28\x6b\x2a\x54\x3d\x37\xcd\x67\xa9\x21\x45\x6b\x6a\x79\x54\x74\xf4\x46\x08\x88\xe6\x46\xaf\x25\x2c\xe0\x50\xf6\xcd\x42\xbc\x2c\x43\x66\x6b\xa6\x6a\x7b\x80\x83\x32\xe9\x96\x33\x68\xaa\x20\x2b\x14\x0a\xfa\xa1\xfb\x12\x32\x35\x24\xf4\x09\xf0\x45\x84\x44\x98\x88\xe2\xb0\xfc\x11\xc9\x2b\x5d\xdf\xf4\xba\x59\x4e\x50\xb5\x5c\xca\xdb\x7c\xd9\x2c\x03\x89\x89\x78\x27\x85\xe8\xad\x1b\xe7\x45\x10\x25\x3e\x9d\xd3\x5e\xa9\x94\x9c\x2e\x70\x8b\xcc\xc4\x91\x45\x08\x65\x7e\x71\x3b\xa8\x3b\x19\x8c\xa2\x4c\x48\xb2\xa7\x42\xe2\xcb\x50\xa8\x6b\x55\xd2\x8a\xcd\x50\x8b\xb7\x13\x4a\xbe\x6b\x29\x6f\xbf\x0c\x24\x7f\x94\x2c\x53\xd5\x50\x2b\x08\x96\x5d\x25\xd0\x6b\xa4\x64\x55\xac\xc5\x44\x4d\x65\x83\x19\xac\xb2\x14\x4d\xa9\x6e\x57\x38\x15\x4b\x5e\x79\x87\x70\xbe\x92\x65\x3e\x0d\x79\x00\x28\x96\xba\xf8\x85\x95\x2a\x33\x9f\xc2\xe8\x98\x6f\x60\x84\xff\xd9\xa8\x46\xf9\x86\xa3\xec\xc8\x04\xbe\x8f\x8e\x07\xe2\xfe\x21\xad\x0c\x91\xd3\x1f\xa0\x9a\xc4\x23\x99\x82\x05\x1a\xc5\x48\x3b\x12\xb8\x70\x10\x9b\x5b\xf9\x3e\x3b\x23\xcf\x5f\xbd\x7a\xf7\xf6\xc5\x9b\xb7\x6f\x28\xd4\x63\x46\xa7\xe6\x8b\xb2\x59\xf6\x7b\x7f\x90\x45\x01\x16\x13\xf3\x79\x6f\x90\x06\x4d\x70\xc5\x9b\xf3\xd0\x8d\xca\x7f\xfb\xed\x38\xdb\x2e\x87\x2c\xcb\xbd\x08\xc8\x6b\x85\x0c\xec\xfb\x86\x56\x5c\x13\xe6\x0d\x30\xbd\x4e\xaf\xea\x77\x2b\x59\xd7\xaa\x2a\x43\x79\x0a\xba\x40\xc9\x0c\xee\xaf\xf7\xef\x71\x5e\x1e\x75\xae\x13\x07\xbe\xeb\x39\x18\x9d\x81\x1a\x43\x58\x00\xb9\x60\x99\xd2\xc3\x7c\xb3\xd4\x2b\xc0\xbb\x75\x7e\xc4\xc8\xd0\x1f\xc5\x1f\xfc\xb3\x3e\x93\xfc\xc7\x90\x49\xce\x42\x0e\x1c\xd8\xc5\x8f\x14\x0c\x7f\x78\x28\x5e\x6b\x47\x2a\x37\xaa\x57\x59\x91\xc2\x12\xe7\xbd\xbb\x67\x67\xf7\xb8\x0d\xdd\x5e\xb9\x27\x8c\xe6\xa0\x4b\x2b\x3a\x83\xb1\x01\x87\xb2\x4b\x1b\x08\xe5\x0d\x18\x19\x3c\xbb\xe3\x63\x79\xd7\x57\x59\x1b\x67\x5b\xa1\x7e\x2d\x5e\x00\x76\x68\xbc\x7b\x76\x96\xe0\x31\x16\x89\x1d\x1c\x93\x88\xbf\x55\xf3\x17\xb7\x2b\x2e\x12\x43\xbb\x75\x82\x04\x42\x01\xea\xf0\x2a\xed\x60\xc0\xb4\x08\x3b\xb1\xbc\x64\xc5\x9c\x50\x46\x76\x91\x20\x41\x0f\xbe\x7b\x26\x22\x52\xd8\xf0\x38\x97\x98\xc9\x59\xeb\xa8\xd9\xd1\x28\x50\x59\xa0\x8a\x07\x0f\xd2\xfe\xeb\xec\x66\xe2\x7a\x2f\xd0\x67\x53\x82\x68\x07\x52\x31\xee\xf6\x5a\x8b\x39\x62\x1c\x8f\x1d\xe3\x72\x37\xc3\x63\x4e\x17\x87\xb4\x2f\xa0\x10\x7c\xde\xae\x90\x86\xe4\x72\x48\x42\xd7\x37\x9b\xc2\x38\xde\x23\xa2\x3f\xf8\x0d\xf0\x0d\xfd\xb7\x89\xd8\x52\xf0\x37\x01\x42\x5e\xce\xc4\x16\xfe\x32\x64\x1c\x4b\x56\x31\xa3\x72\x8f\x4b\xdf\x8d\x07\x9a\xf9\x78\x8e\x82\xe2\xcf\xad\x9c\x82\x86\x60\x89\x53\xc1\x41\xd1\x3d\x06\x4e\xde\x8d\x01\x2f\x74\x04\x0d\x43\xe2\x7d\xd4\x61\xb3\x8c\xe1\xc0\x05\xa4\xe4\x25\xc5\x9f\x94\xfe\x50\x94\x19\x9e\x07\xd2\x7d\x02\x4c\x09\x4c\x7f\x28\xda\x28\x9f\xce\x1f\x62\x3d\xe1\xe0\x61\xca\xc1\xfe\x1c\xf1\x1b\xcf\x78\x3c\xc7\x6a\x31\xa7\x16\xb7\xd9\x50\x87\x62\x67\x98\x5e\x47\x91\x0a\x3e\xb6\x4b\x73\x61\x9c\x74\x43\x2c\x61\x18\xf3\x22\xbf\xdc\xa1\xbf\xd3\xff\xdc\x57\x45\x95\x2f\xee\xb2\xd7\x47\x41\xa5\x56\x0d\x80\x8c\xb3\xde\x6b\xcd\x57\x56\x65\x34\x63\x08\x4d\xad\xf2\x5a\x55\xb9\x44\xe5\xbb\xf5\x82\x1d\x1b\xef\xdf\xb5\xbe\x52\x19\xa9\x05\xd4\xa2\x4b\x97\x90\x1d\xe6\xb2\xb5\x59\x6a\x72\xce\x04\x37\xb4\x37\x78\xdd\x1f\xd3\x38\x80\xa7\x82\x95\x27\xc4\x4e\xcc\xb5\x68\xca\xa9\x6c\xe6\x8b\x2d\xa6\x99\x98\x2a\x74\xf9\x1d\x3d\xf1\xc2\x8d\xff\xae\x75\x9c\x2d\x95\x31\x72\xae\x86\x50\xef\x61\x08\x25\x22\x2c\xf6\x08\xa9\x74\xd7\x97\x60\xed\xb9\x11\xf7\xb1\x82\xf4\x06\xe2\xec\x4c\x1c\x89\xf7\xef\x69\x55\x5b\xa3\x99\x5a\xd6\x8d\x79\x46\xa2\x4b\x6f\x40\xf5\x5c\x99\xe1\x88\x24\x58\x19\x87\x93\x5b\xee\x46\x17\xac\x7c\xd7\x1f\x90\x55\xaf\xd2\x4b\x21\x43\x69\x5a\x21\xbe\xb7\x27\x93\x1b\xcc\x39\x8b\xe7\x1a\x36\xb5\x95\x9a\x65\x81\x8a\x79\x5e\xa7\xc6\xfd\xd8\x8c\x81\x2f\x08\x27\x9b\xf4\x96\x9b\xbc\xc6\xdc\x49\x2b\x84\x19\x39\xb3\xda\xa1\xf9\xa9\x51\xc5\x94\x62\xb6\x90\x08\xdc\x97\xdf\x09\x56\x21\x51\x57\x78\x2c\x04\x0a\x6e\x4b\xdd\xad\x0e\x68\x6c\x51\xa0\x16\xa2\x5f\x0f\x30\x80\xb6\x9e\x1f\x39\xe1\xf4\x85\x9d\xc6\x57\xf8\xe0\xbb\x41\x6c\x99\x23\xa5\x6e\x29\xd7\x10\xdf\x0e\x29\xb5\xf6\xe3\x50\xbc\x5d\xc8\x32\x2b\xac\xf0\xeb\xfd\x4c\x09\xa6\x9c\x09\x35\xcc\x93\xbe\xc9\xb2\x14\x90\xf6\xcf\x44\x0f\x77\x41\x2f\x14\x0e\x6d\x4f\x15\x89\xc1\x37\x81\x8b\x6f\x7e\xf3\xe2\xf5\x17\x2f\x5f\xff\x19\xf1\xe1\x06\x85\xdc\x6f\x1c\xd3\xef\x74\xcc\x3a\x0e\x78\x09\xd3\xb6\x18\x82\x27\x1f\x88\x5e\x10\xb7\x61\xc3\xb7\xb9\x4e\xc7\x14\xd2\x38\xca\xd6\x4b\xdd\xba\x3c\x10\xbd\x21\xbc\x0d\x4a\xa8\x3c\x10\xbd\x67\xf6\x0f\xd8\x59\x61\xae\xf1\xd8\x31\xb5\x75\x00\xa4\x06\xb4\xc0\x93\x48\xab\x68\x67\xc6\x5b\x56\xe4\x75\x2d\xae\x4f\xc6\x65\x88\xd3\x58\xc2\x7a\xbd\xca\x2d\xb1\xaf\x45\xa5\x0e\xaa\xa6\x34\x22\xaf\x21\x99\x44\x46\xd5\x90\x86\x11\x1b\x2b\x54\xed\xfc\x29\x5f\x7c\xfd\x95\xd5\x56\x27\x79\x91\xff\x15\x8d\x22\x66\xa1\xab\xfa\xa0\x56\xd5\x12\x14\x72\xdd\xd4\x51\xd2\x84\xcb\x86\xca\xd4\xb4\x90\x15\xf3\x27\x31\x33\x4c\x48\xaf\xe0\x72\xc7\x44\xeb\x42\xc9\x12\x73\xc4\xcd\x55\xbe\xa2\xd4\x0f\x08\x03\xa9\x1a\x45\x19\x44\x74\xd1\x1e\xfd\x57\xf9\x6a\x45\x51\x32\xa9\xd3\x0a\x38\x33\xc3\x8d\xc8\x97\x4b\x95\xe5\xb2\x56\x90\x1e\x0d\x28\x22\xdb\x3b\xc8\x08\xce\xb7\x0b\x4c\xc7\x32\x91\x3c\x0e\x17\xdb\x5e\x1c\xa2\x8b\x5b\x27\x45\x22\xda\xbc\x3a\xf9\xcc\x10\x93\x7c\xb7\xf3\x4e\x70\x7f\xe4\x4e\x04\x81\x4d\x0e\x02\x08\xc4\xac\x48\x4b\x95\x73\x55\x61\x55\x1c\x9f\x39\x33\x1a\x8d\x86\xe2\x68\x00\x46\x89\xa5\x5c\x4f\x3c\x07\x5d\xc1\x31\x47\xe6\x13\xbb\xd0\xe0\x3a\xbd\x91\x6b\x96\x99\x59\x57\xf9\x1c\x6c\x9f\xa0\x8c\xd7\x14\xc4\xa3\xdc\x53\xaa\xcc\xdc\x68\xbe\x04\x54\x0d\x59\x3a\x46\x8b\x1b\x05\x7d\x1b\x29\xd7\x9c\xea\x95\xa3\x83\xdd\xa8\xba\x2e\x94\x00\xff\x38\x11\x8c\x6e\x2a\x37\x14\x7e\xe1\xd4\x52\x43\xb3\x82\xf8\xc9\x38\x17\xa8\xc6\x9e\x98\x29\x86\xe3\x72\x91\x43\x20\x1a\x12\xc0\x13\x5e\x96\xda\x77\xfa\xa5\xba\x11\x5f\xc8\x5a\xf5\x07\x03\x71\x90\xd8\xa3\x62\x8e\x34\x8f\x12\x65\xfd\x65\x28\x7e\xc0\x6c\x66\xae\x8a\xae\xe5\x4e\x78\x1e\x0e\x3b\x59\x53\x64\xb2\xe3\x0f\x61\xd0\x91\x7d\x68\xd3\x53\x4b\xf3\x56\xbf\x41\x2b\x18\x31\x19\xf7\x45\x03\xc6\x99\x4c\xb3\x5c\xca\x2a\xff\xab\x22\x0d\x33\x91\x67\x98\x1d\x28\x35\xd7\xb6\x31\x8c\xb8\xdd\xd2\x76\x74\x83\x73\xcc\xc5\xb7\xb1\xa2\x2e\xad\x72\x2d\xbf\xd8\xcd\x85\x21\xba\x96\x11\xfe\xd8\x98\x3a\xf8\x80\x5b\xb5\xd9\x77\x6d\x58\x7c\x53\x57\x51\x97\x6e\x4f\x58\x0b\x5f\x35\xaf\xe7\xe1\x23\x18\xc8\xdc\xeb\x09\x31\xb8\xb7\x42\xe4\x43\x02\x5c\xdf\x6e\xf2\x5f\xb5\x0f\x46\x6f\xaf\x62\xdd\x53\x4b\xe1\x47\xde\x70\x20\x0a\xe6\x6e\xfa\xa3\xf0\xbf\x3e\x13\xea\x76\x10\x65\x80\x93\xb1\xab\x25\xdd\x54\xe9\x29\x4f\x17\xbe\x39\x7f\xf3\xe6\xc5\x17\x83\xae\xc9\x46\x8f\xc0\x4b\xbc\xee\x4d\xb7\xfc\x8e\xfc\x5c\x3c\x3a\x3a\x1a\x74\x09\xfd\x6f\x0a\x7d\xe3\xcc\x4d\xfa\x2a\xc8\x49\xd1\x66\x48\x86\x1b\xc4\x5b\x95\xef\xe0\xce\xaf\x39\xf3\x5f\x83\xe7\x74\x84\x7c\xbf\x57\xc1\x0e\x45\x94\xc1\x30\x46\x07\xbd\xb3\x36\xe1\xee\x8a\x0c\x0d\x9b\x5e\x46\xa8\xe3\x2f\x5b\xb1\x24\x2a\xf6\xaa\xc8\xb3\xd7\x26\x89\xab\xd2\xb2\x55\xda\x25\x4e\x28\xb7\x98\xaa\x3a\x44\x1f\xaa\x62\xd1\x4d\x24\xed\x25\x8b\x73\x06\x3a\xc9\x03\xee\x54\x4d\xf9\x5a\xdd\xd6\x24\x6f\xff\x26\x2c\x23\x6c\x74\x12\xfd\xef\x30\x6b\x77\x46\xa9\x98\x21\x9d\x93\xee\xd0\x99\xcd\xdd\xf9\x8d\x69\x40\x22\x22\x63\xaa\x3d\xa2\xa0\x4e\xdb\xa4\x99\xcf\xd7\x21\xcc\xd3\x39\x77\x5c\x6c\x28\xbd\x01\xd4\x3f\x8c\x2f\xc3\x99\x96\x42\xdd\x5a\x8d\x03\xa5\x90\x52\xc8\xb9\xcc\x4b\xd2\x5e\xca\x38\x3d\x98\xb7\xd9\x40\xbf\x27\x1c\xe1\x50\x7c\x85\xea\xf4\x40\xc0\xb0\x77\x6a\x14\xd2\xd4\x42\x4e\x23\xe9\x1c\x6b\xc1\xc8\x06\xca\xef\xc1\xb9\x8d\x7d\x40\xec\x80\x88\x23\x3a\xb4\x29\xf2\xcd\x1f\xdc\x50\x48\x0b\x0a\x2c\x05\x3b\x2d\x56\x69\xf0\xb1\xb6\x08\x7c\x07\x2a\x03\x5a\x45\xa1\x0a\x68\x75\xce\x00\xd0\xd6\xac\x42\x61\x50\xa3\x48\x25\xf3\x90\xe8\x0d\x12\x84\x1d\x0b\x32\x63\x21\xdf\xbe\x5e\x40\xda\x04\xa5\x63\x3b\x15\xae\x25\xc1\xbe\x2c\x21\x82\x1a\xa3\x93\x2a\x75\xe0\xd6\x32\x68\xde\xe7\xaf\xbe\x3f\xff\xef\x37\x62\xa9\xaf\x95\x81\x5c\x5b\xe7\x49\x75\xb3\x5c\xe5\x45\x4b\xc2\xfc\x5b\x9c\x2d\xad\xb8\xab\x42\xd6\xea\x0d\xee\xed\xb7\x58\x8c\xc8\xfe\x1a\xbb\xa9\x64\x5d\xab\xe5\xaa\x26\xed\x4c\x4d\x75\x95\x45\xde\x64\xf0\x74\xc9\x6a\x73\x22\xd3\xe6\xf3\xeb\x5b\xd5\x75\x82\xb1\xb3\x67\xc8\x66\x18\x57\xd7\x73\x1c\xe4\x95\xac\x83\xc6\xec\x0b\x4d\xfd\x22\x16\xc2\x5e\xe5\x4b\x1e\x51\x4a\x34\xac\x70\xc1\x5e\x05\xca\xa8\x5b\x3f\x74\xfe\xa0\x03\x11\x4a\x5b\x66\xba\x99\x14\xea\x60\x05\x96\x7a\x08\xdf\xc6\xe1\xe8\xf6\x32\x37\x8d\x89\x72\x9c\x2d\xb1\x60\xe1\x27\x6c\x45\x53\x66\xea\xd6\x95\x43\x21\xbe\xea\x2c\x17\x8c\xb5\x42\x23\x1a\x00\xfd\xfc\x4c\x1c\x75\x31\x63\x57\xe5\xdf\x02\x85\x4a\xff\xdb\xcf\x86\xb8\x01\x36\x06\x3f\x88\x12\xc2\x01\x28\x64\xd1\x5e\xf8\xa9\x51\xcd\x86\xa4\xec\xf6\x7a\x73\x06\xdb\x4e\xec\xf2\x4a\x39\x72\xe8\xf7\xef\xc5\xdd\xd4\x8f\x82\xb2\xe6\xa0\xc5\xd3\xdb\x72\x35\x3b\x28\x5b\x1e\xb7\x4f\x3f\xed\x16\x61\x3f\x3f\x6b\x79\xe7\x36\xc9\x30\x5f\xc5\xce\x46\x8a\xd8\x27\xff\xe1\x10\xa3\x5f\x79\x59\xd0\x51\xaf\xe3\x24\xea\x9e\x35\x9d\x48\x87\x87\xe2\x1b\xa5\xae\x9c\xd2\x52\xeb\x15\x0e\x06\xe9\x08\x68\xf0\x71\x35\x8a\xd1\xeb\x5a\x61\x79\x33\xd2\x4c\x90\xc4\x26\xba\xa9\x71\x2c\x64\xa5\x43\xe6\x30\xa1\x4a\xc6\x59\x6e\xea\xa6\x9a\xc0\x4b\xf2\xd2\xef\x20\x12\x78\xed\x57\xe5\x54\x18\xd9\x0e\x43\x7c\x99\x46\xc0\xea\x01\xf8\xc2\xaa\x29\x21\x46\x10\x62\x90\x23\x1f\x4f\xbc\x86\x17\x47\x97\xde\xef\x44\xf2\x46\x87\xab\xf7\x8f\x5d\x26\x0a\x84\x7f\xc6\xa4\x7f\x2f\xd7\xa2\xf9\x15\xee\x5b\xba\xe9\xc7\xe9\x21\x14\x3a\xc0\x62\x14\x07\xb1\xcf\x06\x6e\x24\xb5\x92\xda\x8a\x53\xfb\x56\x3f\x19\x36\x84\x04\xfa\x07\xdc\x47\xba\x1a\x3f\x0c\xba\x9f\x4a\xe3\xa9\xe0\xfd\xa1\x5b\xa0\xa6\xc2\x0e\x49\xe5\x4e\xcc\xd8\x21\x4f\x58\xa9\x6b\x64\x46\xde\xd2\x68\x71\x45\xe7\x69\x08\xde\xe9\xa4\x6d\x6f\xaa\x75\x86\x63\x18\x1e\x59\xe9\x2f\x93\xc0\xc5\x76\x7a\x6f\xab\xba\xb1\xbe\x92\xa0\xdb\x3b\xc9\x78\xc5\x85\x56\xa4\x40\x47\x32\x33\xde\xa4\x74\x66\x0c\xd6\x13\xcc\xe1\xd5\xad\x1b\xb9\x32\x48\xed\xb7\xa4\xab\x45\xfa\xd1\x7e\x0f\xc4\x6f\x24\xf6\x66\x16\xf9\xac\xee\xff\x2a\x3d\xca\x55\x66\xb5\xc4\xe1\xa6\xf2\x2b\xf5\xa9\x0e\xfd\xe3\x6f\xb3\xce\xf1\x6e\xaf\x9a\x72\x23\x2a\x0e\x0f\x05\x87\x72\x56\x31\x84\x83\x6f\x0f\xfe\x0c\x14\x72\xa9\xa1\xd6\x12\x85\xae\x28\x0c\x29\x74\xdd\x99\xeb\x1a\x52\x18\xa0\x12\xca\x52\x49\x2c\x9a\x5d\x81\xe3\xb1\xae\xe0\x30\x77\xe7\x5e\x9d\x96\xe9\xee\xde\x4b\x3b\xd7\xa8\x6a\xca\xdf\x5c\xdd\xed\x38\xb7\xbd\x9f\x8f\x87\x52\x79\x3b\x06\x2b\x31\x15\x99\xe0\x9b\xb2\x65\x72\x35\x50\x8c\x5b\x4c\x65\x09\xc9\x6f\xc6\x34\x14\x50\x85\xc6\x4b\xae\xde\x30\xdb\xaf\x8f\x7e\x66\xb2\x7b\x69\x6a\x25\xb3\x21\x58\x9a\xd0\x8a\xc7\x63\xa4\x31\x79\xd1\x05\x31\xdb\x0f\xf7\x61\x43\xdb\x6d\xc8\x7e\x10\x30\x05\x16\x7a\x4e\x49\x28\xe8\x73\x4e\x52\x50\xa8\xfa\xe6\x5a\x2c\xe4\x6a\x65\x45\x37\x92\xc8\x21\x3e\x53\xcf\x7d\x76\x2c\xe9\x7d\x9b\x23\x09\x47\x42\xfc\x69\xed\xd3\x80\x28\xea\x89\xb2\xac\x5d\x69\x84\x21\x89\xe6\x14\x2c\x73\x9d\xab\x1b\xe5\x2b\xc7\x77\x14\x9e\xd6\x33\x8c\xd6\x9a\x54\xfa\xc6\xa8\xca\xf0\x84\x23\xba\x46\xe9\x9e\xb9\x81\xf0\xab\x6a\xc9\x27\x0b\x6a\x98\x0b\x72\xc1\xfa\xcc\xdf\x2b\xcc\x3f\x47\x8f\x30\x66\x0e\x92\x14\xa0\x51\x79\x41\xf3\xa5\x97\x12\x68\xa9\xed\x41\xba\xc2\xca\x62\x3e\x11\x75\x16\x27\x19\x0e\x05\x26\x76\x16\x4a\x62\xc2\xa3\x9f\x22\xaa\x4b\x33\x30\xe4\x96\x2e\xc8\x13\x23\x2b\x7c\x06\x91\x8f\xff\xcb\xcb\x0d\x45\xa2\x85\xae\xda\x27\x1e\x2f\x27\x7b\x07\x2a\xe3\x51\xca\x17\xac\x3d\xc6\x48\x25\x61\x76\x28\x9a\x7d\x84\xc0\xba\xa1\x09\xa8\xb7\x9f\xf6\xbe\x25\xc1\xc7\x9b\x75\x5a\xf2\xaa\x77\xf7\xf4\xcd\xa0\xb7\xc1\xa2\x49\x8c\xb3\xed\x2e\x65\x06\xe2\xcf\x3a\xc3\x0e\xbd\x15\xf8\xb3\x3d\xec\x18\x5f\xea\x6a\x29\xeb\x38\x1a\x51\x1a\xcb\xc5\xa6\x14\x26\x40\x57\xf7\xc5\x10\xb7\x61\x71\x54\x2d\x0d\xf7\xf8\x4f\x8d\x38\x13\xfd\xa5\x11\x87\x62\x7c\x74\x74\x34\x18\xd5\xfa\xcb\xfc\x56\x65\xfd\x63\x98\xb5\xf7\x6d\x4f\x8d\xc5\x95\xe9\xc5\x75\x76\x68\x0f\xbb\x5e\x88\xce\x48\x04\x46\xe2\xf5\xde\x01\x0a\xce\xa6\xbc\x45\xf1\x48\x14\x82\x9d\x4d\x73\x12\xf8\xae\x96\x39\xec\x2c\x40\xc3\xdc\xb3\x40\x28\xee\xf1\x8b\xfc\xb2\xc3\xb5\xc7\x3a\xb1\xf9\x09\xb6\x55\xa1\xee\x30\x83\xb7\xc1\xd1\xef\xb8\xe4\xb3\xad\x04\xda\x71\xfc\x78\x92\xc5\x6c\x63\xa8\x1c\xe6\x15\x99\xf8\x90\x41\x63\x00\xf1\x56\x67\x8d\x98\xc5\xa1\x76\x1d\x39\x6d\x2e\x3e\x5e\x65\xed\x10\x85\x21\xf0\x1e\x3c\xd7\x79\xc3\x15\x48\xcd\xd6\x25\x6c\x77\x4d\x75\x33\x58\x32\xe6\x79\x88\xbb\xf2\xce\x1d\x4c\x63\x0a\xb9\x58\x39\xf0\x01\xab\xaa\x91\x46\xe5\xdc\x64\x60\x3c\xa3\xce\x1e\xe2\x7e\xc8\x9b\xcc\x32\xe7\x3d\x37\x51\xc0\x20\xf0\xf4\x60\x0c\xa1\xc9\x87\xba\x6a\x94\xb7\x4d\x95\x29\xa8\x3a\x38\xd6\x17\xa4\xd2\x93\xbe\x06\xa8\x17\x0e\x0e\x56\x95\xd6\x33\x71\x53\xd9\x03\x89\x42\xe6\x9d\x05\x0e\xcc\x52\xac\x30\xed\x56\x3b\x11\xed\x00\xcc\x0e\xb0\x62\x80\x3d\x36\x5c\xfc\x7c\xc8\x42\x8b\xd3\x03\x22\xf7\x61\x68\xe4\xb0\x35\x0d\x90\xb2\x00\x61\x7c\xb4\x20\x47\x19\x63\xce\xac\x86\x61\x10\xce\x18\x55\x84\x78\x2f\xff\x26\x17\x10\xb6\xf5\x93\xf0\x7b\x42\x64\x2f\xaa\x3b\xdb\x07\x6c\xb3\x07\xaf\x26\xa4\x35\xf0\x63\xbd\xa0\x9d\x4b\xb0\x0b\x81\x09\xe6\xd2\xa4\x02\xcc\x5d\xa0\xdf\xda\xc1\xd9\x3b\xd0\xb7\xfd\x33\x5b\xc9\x78\x2e\x6e\x73\x43\x76\xc1\x47\x0e\xc9\x22\x36\x37\x44\xb9\xdf\x28\x1f\x29\x0f\xbe\xf5\xa2\xf0\xc5\x48\x9d\x15\x8f\x85\x98\xdf\x28\xd8\xd3\x2c\xb2\xfc\x6f\x11\x5b\xff\x77\x8b\xab\x77\x87\x13\x99\x4e\xa3\x84\xd5\x4e\x72\x70\xae\x14\xfc\x8b\x82\x4b\x9c\xbd\xf1\xbc\x8c\xa3\x76\x92\xaf\x02\x6b\x3a\x14\x9f\x24\xdd\xa2\xd6\x62\xae\x4a\x55\x49\x88\x50\xc0\x21\x3b\xe3\x6e\xfc\xfc\x19\xfb\xfe\x46\x53\x7d\x10\xea\x11\xe8\x32\x13\x69\x8a\xdb\x76\x10\x3b\x5f\xe9\x0b\xc4\x99\xe8\x51\x40\x79\xef\xb3\xdd\x4f\xe1\x99\x28\xec\x53\xf8\xeb\x3e\x0f\xa1\xd3\x09\x1e\xa2\xb0\x2d\x9e\x17\xe9\xb4\x2c\x28\x83\x56\x76\x3b\x70\x45\x1f\xb4\x0e\x5d\x81\xe4\x39\x00\x2e\xae\x4a\xa8\xf8\x51\x6a\x8c\x3a\xd5\x33\x57\xa7\x04\xcd\x9d\x66\x73\x7c\x78\x47\xe0\xd9\x46\x4f\x2c\xc8\x67\x8e\xfb\xe0\x2f\xdd\x21\xe1\x1d\x83\xf2\x36\x0c\x9a\xa2\x99\x37\x95\xc7\xea\xed\x31\x1e\x13\x09\xba\x4d\xe4\x24\x15\xf4\x86\x91\x47\x8e\x3f\x80\xd7\x79\xef\x9a\x37\x76\xdb\x32\xaf\xc1\x56\xfe\xb8\x0f\x61\x75\xca\xe0\xad\xfa\xb2\x7b\x8a\xc6\xf0\x81\x15\x75\x73\x49\x4c\xc4\xc1\xb9\xc9\xb7\xa4\xf8\xf4\x53\x67\x87\xc6\x48\x8e\x77\xb1\x81\x3d\xca\xa5\xcc\xf2\x8c\x4a\xac\x62\xb9\x6e\x4a\x8f\x90\x65\xc6\x6e\x41\x6d\x38\x0a\x6d\xce\x97\xca\x9b\x86\xd1\x06\xd2\x0e\xc3\xda\x95\xb9\x18\xe2\xe3\x12\x96\xe1\xf8\x0f\x72\x02\x93\x70\x09\x16\x76\x45\xc5\x73\xb0\x0d\x94\x9c\xd6\x14\xce\xcc\xc3\x40\xad\x38\x02\x1e\x89\x0d\xda\x2a\xf4\xdd\x58\xe6\x65\x83\x55\x29\x78\x54\x20\x16\x5d\xe7\xda\x6b\x60\x62\x50\x94\xf6\x7e\xa9\xeb\xfb\x42\x36\xb5\x5e\xca\x9a\x22\xbf\x40\x80\xa2\x4c\xa4\xf8\xbb\x72\x5f\x38\x8f\x25\x96\xed\x49\x4b\x88\x09\xce\x11\xa3\x7c\xf9\xba\x62\xbb\x74\x13\xff\x34\x75\x5c\x06\xd4\x57\x09\x98\xb6\xdb\x00\xd9\xf5\x35\xae\x56\xee\x1e\xf3\xd3\x25\x85\x0b\x75\xb8\x47\x22\x1a\xe4\xe7\x50\x4a\xc0\x77\x63\x02\x6e\x05\x70\x76\xd0\x6d\xa8\xe9\xdb\x0b\x7b\x65\x0f\x52\x64\x68\x88\xeb\x15\x4b\xb6\xc6\x58\xb1\xd8\xd3\x7b\x5a\xad\xd8\x3e\xfc\xa7\xa8\xcb\x10\x3c\x45\x96\x22\xb0\xc4\x61\xd7\x6b\xa8\x5a\x2c\x99\x7c\xcd\xa4\x0a\xbe\xab\x80\x6f\xd3\x8b\x32\x2d\x8c\x1e\x85\x4a\x73\xf4\x86\x2d\xb5\x90\x71\x26\x2e\x6a\xcf\xee\x1d\xa8\xc7\x92\x07\xcf\x30\xb4\x9d\xb4\x8f\x61\x3d\x0e\xe9\xc3\xfb\x48\x9f\xc3\x26\xd4\xe8\x26\xf4\x03\x1b\x5f\x09\xab\xd4\xb5\x37\xfb\x78\xc5\x00\x54\x89\x49\x43\x01\x6c\x60\x5a\x73\xb5\xdc\x5d\xf0\x5c\xd0\xab\x78\x82\x3c\x6c\xa9\x38\x82\x16\x02\x91\x59\x29\xe6\x24\x8b\xc2\xd7\x9e\x41\x9d\x4a\x8a\x99\xba\x11\x85\x5c\xab\x0a\x0c\x56\x3a\x0e\xb3\x74\xdd\x54\xe6\xda\xd5\x0f\xe4\x9a\x19\xbe\x0b\x38\x0d\x24\x68\xac\x54\x85\x43\x79\x6d\x42\x96\x42\x99\x3a\x5f\x92\xcd\x68\xa1\x6f\x44\xa1\xcb\x39\xaa\x5f\xbe\x08\x38\x86\xed\x59\xd5\xae\x83\x38\x9c\x3a\x00\xe9\x0d\x4b\xc3\x53\xfe\xb8\xe0\xe7\x8b\x6e\xee\x7b\xae\x30\x0c\x75\x18\x2e\x82\xce\xed\xd8\x3e\xec\x23\x48\x62\x8c\x62\xfa\xfc\x7d\x16\x90\x16\x76\x69\x47\x04\x20\xdd\x8c\x22\xff\x96\x26\x6d\x92\xba\x72\xf5\x73\x98\xa7\x59\x3b\x02\xde\x58\x41\xbb\xe5\xc3\xe7\x06\x4f\x5f\xe3\xbd\x33\x7a\x15\xcb\xc6\xfa\xc6\x79\x74\xcf\x07\x9c\x94\x73\xcb\xd9\x20\x4a\xc5\x8a\xd0\xa1\x74\x69\xad\xa9\xe2\x6c\x4d\xfa\x91\x97\x81\xbc\x52\xbb\xe7\x8a\x44\x0c\x27\x66\xcc\xf6\x5b\x86\x61\x9a\xc9\x12\x75\x9f\xdc\xd1\x39\xbd\x7f\xe0\xa4\x10\xa9\x84\xee\x84\x9c\xd8\x67\xf3\x6d\x53\xb6\x02\xf0\x82\x9d\xae\x1d\xee\x94\x3e\x13\x82\x1e\x9c\x47\x2a\x44\x2c\x79\xab\x8f\xac\xe6\x50\x93\xce\xfb\xa8\xff\x20\x8e\xc5\xfb\xf7\x0c\x13\xf4\x02\xbb\x00\x9b\x7d\x5e\x91\xd8\xd7\x15\x11\x49\x15\xef\xad\x92\x71\xa3\xb1\x32\x2c\xa6\x3b\xa9\x9f\x1a\x59\xec\xb9\x7e\xf0\xd8\x8b\xff\x8c\x96\x4e\x4e\xeb\x46\x16\x43\xaf\xaa\xb0\x88\x61\xbc\x05\xfe\x5a\x7f\x97\xfb\xc8\x3d\x84\x95\xc0\x3c\x84\x3f\xf2\xf0\xa6\xc3\xcb\xdd\x33\xff\x8a\xae\x28\x81\x90\xf8\xda\xd9\xf2\x96\x0f\xf5\x99\x78\xf0\x20\x1f\x78\xaf\x32\xde\xbb\xc8\x2f\xf9\x2b\x2e\xf2\xcb\xb8\xc0\x06\x7b\x41\x94\x5b\xc1\x70\x7c\x0e\xb6\x1f\x3a\x1e\x4b\x7a\x27\x09\x88\xd8\x48\x00\xd2\xc4\x00\xe1\xce\xcc\xe4\x15\x3c\x00\x8b\x84\xb6\xc6\x50\xe3\x4e\x26\x8b\xf5\xce\xce\xce\x7a\x42\xaf\xac\x88\x07\x85\x15\x42\x78\x3c\x16\xff\x82\x02\xeb\x53\xad\xaa\x29\x0b\x31\xa3\x28\xaa\x8d\xbd\x2f\xec\xec\x96\xb2\xba\x72\xc7\x9d\x8b\x79\xc0\x42\x8f\x9c\xb2\x20\x99\x97\xc5\x74\x1a\x52\xc2\x52\x76\x75\xff\x83\xfb\x7c\xa8\xcf\x80\xbf\xfe\x7f\xe4\xbd\x69\x7f\xdb\x38\x92\x38\xfc\x3e\x9f\x02\xc9\x7f\xb7\x29\x25\x92\x2c\xca\xb6\x7c\x64\xdc\xbd\x92\x2c\x75\x3c\x39\x37\x76\x92\xdd\x71\xa7\xb3\x10\x05\x59\x6c\x53\xa4\x86\xa4\x2c\xab\x27\x99\xcf\xfe\xfc\x50\x55\xb8\x48\xca\x47\x92\x9e\x99\xdd\x27\x2f\x62\x1b\x04\x0a\x40\xa1\x50\x28\x14\xea\x98\x0b\x2e\x2f\x60\xd6\x5c\xed\xfa\x1a\x13\x26\xda\xa9\x5e\xef\x2a\x4e\x28\x37\x08\x04\xfd\xe9\xc5\xf2\x77\xe4\x69\x50\xa0\xd4\x7a\xe1\x44\xc4\x79\x38\x5d\x3b\x46\x4c\x06\x09\xd6\x3b\x1f\x84\x71\x80\x53\x93\xdc\xc1\x95\x34\xa0\x84\xe6\x69\x18\x89\xc3\x28\x8c\xb5\x82\x4b\x79\xf0\x40\xfa\xb1\xbb\xee\x1e\xca\x72\x51\x32\x81\x2a\x6e\xa1\x86\x9e\x1c\x29\xa8\xb6\xd8\xbb\x3c\x8c\xc2\x7c\xed\xbc\xa0\x2d\x52\x91\xe7\x6b\x15\xfa\x94\x22\x51\xd8\xa9\x81\xe6\x3c\xaf\x01\x26\xed\x40\x33\x72\x28\xc9\x94\x30\x7c\x74\xc4\x3c\xf4\x25\xf4\x0a\xe4\x0e\xdf\x89\x23\xc2\x5d\x2c\x4f\xd9\x11\x79\xd8\x12\xd0\xa7\xfa\x23\x4f\xd7\x28\x37\x83\x1d\x52\x8e\x21\x5f\x5a\x73\xbe\xd0\xf9\xe9\x59\x4d\x0e\x42\x01\x2f\x64\xb8\x17\x75\xcc\x1f\xa1\x36\xa4\xce\x4f\xcd\x7e\x64\xbe\x51\xb7\x9b\x74\x17\x74\x7b\x99\xf1\x4c\xb2\x44\x48\x39\xdc\x40\x25\x93\x5c\xb8\x64\x3a\x65\x72\x7d\xf3\x8c\x25\xab\x18\x9c\x62\xd4\x7b\x97\x81\x04\xe6\x33\x26\x2b\xb1\x3c\x99\xc0\xef\xf2\x82\x87\xb1\xbc\xd5\x92\xbd\x26\xf5\x04\x37\x5b\xd5\x55\xcb\xc5\x94\x9c\x2c\x64\x2d\x5b\x5b\xf1\x6e\x48\xbf\xef\x06\xbb\x51\x97\xc6\xaa\x9a\xce\x99\x80\xfb\xe5\xe8\xc8\xf0\xa3\x92\x8c\xbf\xb5\xc5\x8e\xb5\x6b\x59\x90\xcc\xe7\x89\xc9\x00\xbb\x5e\x88\x8c\x82\x89\xda\xf7\x38\x1e\x7b\xa0\xa3\xc2\xb0\x3e\x0b\xe5\x16\x5a\x08\xeb\x63\x08\x45\x9e\x69\x8a\xe3\x97\xd9\x7c\x45\xfc\x21\x49\x0a\x31\x06\xd1\xd2\xbb\xf3\x27\x0a\x9c\xa5\x0b\x20\x70\x16\x3b\x84\x1c\x79\x76\x74\x90\x9a\xa7\xf6\x87\xac\x1e\xdb\x16\x7c\x58\xe9\x42\xe4\x60\xa4\x9b\xbe\x48\x02\x38\xe9\x3f\xd5\xfc\x7a\xb5\x95\x1f\xd1\x3e\x8e\x19\xea\x80\x53\x37\xf8\x4b\xe1\x27\x33\x8d\xcd\x2c\xdc\xb0\x6e\xc9\xea\xff\x00\xde\x8c\xf1\x3a\xac\xbb\xb9\x12\xc9\xb0\xe3\xff\x91\xdd\xfe\x0f\x86\x4d\x03\xcb\x2f\x30\x9c\x7d\x94\xa7\xcb\x30\x9b\x3d\x72\x4f\x8c\x7f\x3c\x8b\xd7\xa2\xe5\xbd\x18\xfd\xff\x76\xee\x5d\x25\xf9\xb8\xcc\xba\xb0\x81\xc1\xdd\xa7\xb8\x79\xbf\xcb\x46\xf9\xf6\x6d\x42\xdc\x9c\xb6\x49\xf1\x7e\xa2\x2c\x6a\x00\x7d\x90\x5c\x02\x38\x29\x5c\x51\x54\xa2\x2a\xb4\x58\x01\x13\x99\xf2\xfe\xe0\x6c\x12\xa6\xf9\x9a\xcd\xd0\x4f\xf6\x24\x47\x4a\xca\x9c\x48\x64\x0d\xb4\xe9\x81\x0b\x38\x66\xa1\x16\xd7\x7c\x2e\xd9\xac\xd2\xce\x62\x1f\x3a\x42\xbc\x5e\x3b\xd7\xc0\xbb\xf2\x2e\x09\x03\x3b\x01\xc3\xd9\x33\x0d\x09\x0a\xf1\x55\x4f\x4e\xb1\xc5\x58\x5b\x85\x5a\xa5\x4f\x70\x50\xd0\x43\x16\xf9\x39\x1a\xe7\xc5\x06\xf3\x21\xcc\x7f\x4e\x11\xf8\x52\x1c\x75\x96\x30\xda\xd4\xda\x5b\x5f\xd1\x7a\x4f\x9d\x22\x34\x74\x64\x41\xec\x91\x83\x57\x3c\x85\x1f\xdd\x91\x18\xcb\x8b\x6c\x13\xa6\x99\x76\xd9\x3b\x48\x5d\x23\x86\x98\x39\x77\x83\xf9\x95\x24\x50\x44\xc6\x91\x36\x4c\xb2\xcf\xf6\x73\x0b\xb3\x4f\x58\xe7\x63\x51\x14\x40\x8a\x00\x17\xf8\xda\x56\xed\xfc\xd7\xad\x8f\x4f\x0e\x7f\x99\x3c\xa9\xcb\xff\x7e\xa9\xff\xf4\x6f\x5b\xae\xb1\xac\x6c\xf4\x93\xfc\xff\xdc\xff\x28\x29\xfe\xa7\x9f\x7e\xf2\x4a\x6a\xd0\x0f\x29\x44\xc0\x32\xea\xcf\xc4\x7e\x8d\x46\xf1\xe7\x2e\xb8\x23\xc5\x98\xa3\x12\x40\x90\x85\xd0\x2e\xf2\x2e\xa7\xad\x40\x54\x15\x67\x93\xbc\xe4\xe9\xa5\x6b\x25\x43\x14\x2c\xa5\x90\x65\x6e\x3d\x98\x57\xab\x75\x24\x55\xa1\x66\x04\xd6\xa5\xc0\x88\xdd\x4d\x82\x51\x52\x6c\x33\x09\x65\xfa\x93\xe5\xc9\x62\x93\xbe\x40\x72\x13\x85\x30\x7d\xf3\xb7\x30\x08\x09\x1e\x13\x4b\x80\xbc\x0b\x06\x41\x8f\x56\xc8\x50\xec\xa0\xb0\xea\x62\x5b\x2f\xab\xd4\xed\x76\x96\xd7\xf2\x66\xad\x24\xf9\x4e\x96\x57\x40\xc5\x25\xfa\x27\xaf\xc0\x5d\xa8\x0f\xe3\xa7\x56\xa9\x7e\x2b\x26\x8e\x0f\x61\xf6\xc4\xb7\xb6\xd8\xe9\xeb\x77\x6f\x07\x43\x36\x3a\x79\x31\x3c\x64\x51\x38\x9e\x24\xf9\xd6\x6f\xd9\x56\x14\x8e\x3f\x2d\xf3\xe9\x7e\xeb\xb7\xec\x01\x78\x34\x2c\xd6\x69\x28\x79\x64\x2d\xa8\xb3\x4e\xdb\xef\x00\x0f\x1c\xcc\xd2\x64\x1e\x2e\xe7\xec\xf5\x29\xeb\x2d\xf3\x59\x92\x66\x2d\xd6\x8b\x22\x06\x75\xe1\xe5\x46\xa4\x57\xf2\xce\x25\x6f\x1d\x99\x31\xb2\xc8\x92\x65\x1a\x50\xba\xe7\x30\x63\x17\xc9\x95\x48\x63\x15\x7f\xb4\x7f\x7a\xdc\xcc\xf2\x75\x24\x58\x14\x06\x22\x56\xce\x42\x64\x6a\xb1\xb5\x85\xe9\x6f\xd4\xa1\xfd\xe2\x64\x30\x7c\x75\x3a\x84\x83\xa5\xf5\xe0\x81\xb7\xcc\x50\xa4\x0f\x72\x78\xe7\xdb\x62\x67\xaf\x8f\x5f\xd7\x26\xfc\x2a\x9c\x8c\x45\x5c\x3f\x64\x1f\x94\x65\x20\x31\x52\x11\x07\xc9\x84\x5c\x29\x80\x19\xab\xa8\xdc\x62\xd2\x78\x00\x79\x30\x29\x68\x36\x2e\x2f\x85\xd7\x8d\xd1\xab\x2a\x8c\x9b\xca\x72\xcd\x8d\xe6\x2d\xa7\x2c\x5b\xcf\xf2\x7c\x91\x1d\x6e\x6d\xad\xc2\xcb\xb0\xb5\x9a\xf1\x7c\x75\xd1\x4a\xd2\x0b\xf8\x7b\x0b\xcf\xcc\x21\x0d\xc0\xae\xae\x06\xd5\xca\x16\x22\xb0\xdb\x19\xe9\x12\x0d\x46\xa6\xcb\x88\xbd\x3b\x1b\x35\xf7\xd9\x44\x48\x74\x5a\x12\xc8\xbb\xb3\xd1\xfe\x31\x16\x96\x89\x84\x3c\xad\x4d\xec\x97\xf1\x3a\x17\x19\x7a\x59\x13\x66\xf5\x23\xb5\xf8\xeb\x52\x50\xd8\x43\x20\x24\xa8\xfa\x42\xd6\xa4\xf8\x4f\x04\x2c\x04\x7b\x94\x8b\x54\x40\x1c\xe0\x89\xc0\xec\xde\x6c\x2c\x24\x76\x71\x78\x13\x48\xac\x60\x00\xfc\xc8\xda\x56\x56\xed\x89\x78\x03\x2d\x5c\xb0\x51\xb2\x12\x29\x1b\xc3\xa2\x27\xb1\xa5\xe3\x36\x7d\xdc\x00\x15\x5a\xf7\xa1\x31\x80\x75\x72\x70\x05\x90\xcf\x81\xa3\x30\x4c\x68\xe4\x39\x6f\xb0\x9c\x5f\x82\x7b\x42\x2c\xd9\x5a\x80\x9e\x0d\x68\xca\x08\x5e\x6f\x8b\x54\x5c\x85\xc9\x12\xc4\x0a\xc8\x92\x9c\xe5\xa9\xe0\x73\x38\xdc\x75\xda\x1c\xa4\x2c\x91\x16\xd9\xe9\xa9\x56\xbf\xa6\xd8\x18\x22\x7b\xc8\xaa\x0d\x13\xf5\x5b\xc9\xd6\xe6\x4e\xa0\xa4\x88\x53\xeb\x16\x89\x7a\x71\x89\x86\x65\x1c\x96\x62\x86\x4b\x84\xb0\xb1\xc8\x57\x42\xc4\xac\x7d\xdd\x6e\x5b\x19\x1a\xdb\xd7\xa3\x91\x2b\x61\xa8\x61\x41\x84\x7a\x39\x2c\x5a\x31\x42\x82\x7d\x3b\x91\x98\xf2\xbb\x26\xe6\x55\x99\xe0\x2c\x26\x85\x60\x2a\x5f\xce\xe4\x19\x9f\x8a\x5c\x27\x39\xaf\xd2\xb6\x65\x79\x5a\x65\x30\x07\x59\x41\x49\x4f\x10\xcc\x78\x3a\x48\x26\xa2\x97\xd7\x42\xeb\xea\x5f\xa4\x55\xcb\xdb\x09\x2b\x04\xec\x4f\x47\xac\x7d\xbd\x37\x72\xc3\xcf\x42\x30\x20\x05\xd7\x82\xe9\xb8\xb8\xb6\xaf\x07\x6d\xd9\x3c\x60\x3f\xfc\xc0\x08\xd0\xb1\x03\xa8\x44\xd3\x01\x6b\x32\xd9\xec\xa9\x5b\xc5\xde\x4d\xfe\xd3\xa2\x57\x89\x4d\xbc\xd7\xfb\xed\xca\x91\x0c\x4b\x23\x19\xde\x65\x24\xc3\x9b\x46\xd2\xb9\x6d\x24\xd5\x43\x19\x95\x86\x32\xda\xbb\xc3\x50\x46\x37\x0d\x65\xfb\xe6\xa1\xf8\xed\xf6\xa6\xc1\xec\x97\x06\xd3\xbf\xcb\x60\xf6\x6f\x18\xcc\xce\xcd\x83\xe9\xb4\x37\x8f\x66\x50\x1a\xcd\xf1\x5d\x46\x33\xb8\x61\x34\xbb\x37\x8f\x66\xa7\x5d\x35\x9c\x12\xad\x7b\xbf\x2c\xa7\xd3\xe9\xc4\x2b\xc4\x7c\x73\x6b\xe3\x24\xf6\x4b\xeb\xdb\x2f\x93\x9a\x1e\x61\xb3\xf9\x74\xf3\xf4\x6a\x85\x92\x3f\xfd\x89\x75\xe5\xdd\xb2\x86\xf3\xde\x6f\xd7\x4d\xe3\x5b\xb7\x33\x43\x45\xdc\xcf\x49\x0e\x9e\x01\x51\x64\x4e\x2d\x7a\xae\x50\x7e\x96\x18\xf9\x04\x8f\x13\xf0\xf6\x70\x21\x4c\xc3\x28\x97\x07\xe2\x32\x67\xd9\x32\x4d\x93\x0b\x7c\x97\x0d\x53\xad\xa9\x63\x8a\xfb\x58\x73\x71\xa7\xf2\xd4\xaa\x09\x7c\xc6\xcc\xb1\xb8\x4c\x05\x4b\xda\xcf\x9f\x25\x92\x8f\xf7\xdb\x88\x66\xdd\x4e\xa2\xdb\x00\x41\x5e\x33\x1a\xd5\xcb\xad\x4d\xad\x1f\x61\x6b\x8c\x64\x35\x07\x4b\x1b\x57\xbd\x92\x42\x08\x2b\x20\xa2\x08\x79\x22\x11\xeb\x57\x39\x4a\x97\xf9\x62\x99\xb7\x9c\xea\xc5\x19\xd3\x0e\x2d\x8e\x42\x8f\x03\xcf\x9d\x96\x3c\x57\x07\xc4\xc8\x4d\xfb\xfa\x53\xa7\x51\xe5\xf8\x30\x55\xb5\xb3\x58\xad\x42\x05\x33\x9e\x66\x89\x65\xdc\x61\x38\x25\x7b\x67\x5a\xa3\x27\xac\x66\x4d\xf5\xc7\x1f\x7f\x64\x7e\xbb\xce\x7e\x60\xed\xeb\xed\xd1\xa8\x5e\x8e\x0d\xd7\xbe\x3e\x1e\x60\x33\x6b\x69\xa9\x76\x71\xa6\x0f\xaa\x7e\xff\xb2\x69\x27\x4b\x51\x29\x49\xe0\x71\x1e\x05\xb9\x30\x66\xf3\x65\x94\x87\x4d\x10\x02\xcc\x66\x78\x2b\x56\x61\x3c\x21\x79\x05\x43\xd8\xd8\x40\xd0\xbf\x23\x4a\xc8\x15\x02\x1c\x78\x25\x84\xd6\x6d\x3c\x63\x93\x68\x48\x34\x61\x38\xc1\x17\x4b\x45\xad\xef\xec\xa9\xc8\x2b\x25\x33\x23\x92\xb5\xac\xd0\x6a\x3a\x70\x7a\x20\x9c\x27\x0a\x32\xa6\x81\x0b\x98\xd0\xa2\x59\x68\xbc\xf0\x21\x6c\xc4\xff\x6f\xc4\x31\x6c\x20\x85\x32\x5b\xf8\x92\xb7\x3a\xc7\xf6\xaf\xa6\x1e\x82\x2d\xf1\xad\x56\xaf\x53\x73\xac\xef\x26\x93\x88\x95\xd8\xec\x74\x8c\x03\x83\x15\xd3\x37\xe2\xc2\xd5\xeb\x18\x22\x26\x81\xc3\x18\x37\xd7\x97\x2b\x91\x66\x76\xfe\x23\x75\xdb\x33\x31\x1a\x64\x6d\x67\x7f\x33\x50\x1f\x01\x17\x5a\x61\x86\x8c\xec\x27\xf6\x01\x83\x55\x2e\x16\x22\xce\x24\x17\x82\x10\x16\x97\x62\xbd\x80\x0b\x09\xfa\x22\xa3\x79\x1a\x98\xb2\x90\xe1\x34\x8c\x45\x4a\x7a\x3c\x20\xc6\x0f\xe9\xe3\x24\xf5\xf7\x5f\xbe\xf9\xe9\x06\x62\x39\x33\x77\x48\x30\x08\x95\x58\xd9\xbc\x86\xf6\x6d\x13\xa9\x09\x50\xd5\xd8\x44\x57\xf6\x63\x11\x6e\xe9\x02\x31\x6a\x3a\xcb\xf0\x4e\x42\x14\xa5\x49\x09\x89\x00\xfb\x2b\x12\xc1\xf7\x90\xc0\xe5\x71\x0b\x09\x31\x97\x71\x08\x63\xb1\xae\x7c\xa4\x2d\x91\x2d\xef\x2a\xad\x13\x6f\x2c\x89\xd4\xf6\xf9\x15\x80\x54\x33\x1a\x8d\x8e\x9d\x27\x31\x6a\xbe\x5f\xd1\xbc\x6f\x37\x87\xc8\x07\x4f\x7c\x67\x4a\xf6\xb1\x24\x47\x39\xa9\x18\xe5\x13\xbf\x20\x8a\x98\xb1\x4e\x64\x67\x93\xaa\xb1\x12\x8a\x4e\x57\x10\x83\xb6\x44\xc1\xf6\x09\x15\x18\x39\x16\x8f\x14\x7d\x28\x48\xa1\x48\x1e\x29\x4f\x58\x6d\xa2\x0b\x1d\xf1\x02\x83\xed\x6e\x38\x15\xca\x18\xbb\xf1\x10\x29\x57\x76\xa2\xff\x1a\x39\x20\x90\x3b\x4f\xed\x74\x42\x9c\xe6\xfc\x66\x49\x2b\xee\x57\x37\xdd\xae\xdc\xd0\xc3\xd6\xda\x6a\x38\x65\x40\x55\xa7\x35\x5c\xcd\x3e\xcb\x66\xf2\x44\xee\x9a\x93\xb5\xe2\xa6\x55\xee\xc5\x95\x98\x6e\xec\x66\x68\x75\xe3\x77\xaa\xfb\xe9\x38\xfd\x6c\x3d\xb6\xbb\x52\xe2\xd9\xe3\xad\xbb\xf5\x37\xb2\xfb\xdb\xaf\xee\x6f\xfb\xa9\xbd\x64\xab\x59\x18\x09\x56\x73\x34\x23\x66\x72\x15\x72\xfa\x8d\xfd\xef\x43\xff\x34\x80\x5a\x97\x3d\x36\x10\xea\x4a\xec\xa9\x3b\x6f\xd0\xa5\x03\x7e\x83\xc6\x31\x9f\x85\xe9\xe4\xd3\x82\xa7\xf9\x7a\x6b\x15\xac\xc2\x49\x3e\x03\x15\xe4\x2a\xd8\xa4\x80\xdc\xf9\x6a\x05\xa4\xe4\x8a\xab\xe0\x1f\xa8\x82\xb4\xe2\xdf\x5b\x87\x76\x14\x8e\x53\x48\xfc\x9c\x31\xb2\x0e\xd5\xf9\xa1\x09\x03\xad\xdf\x32\x36\x4f\x26\x4b\x74\xee\x8d\xe5\xe9\xf2\x5b\xa6\x9f\x7a\x93\x34\xbc\x00\x2d\x58\x21\x8b\x20\xf9\x0b\xe3\x00\x79\x7e\x08\xa7\x28\x69\x15\xe3\xc5\xfc\xb7\x0c\xd4\x88\x0b\x1e\x5c\xf2\x0b\xb1\x65\xba\x82\x13\x43\x0d\xd6\x1a\xa7\x0a\x08\x95\x4c\x41\x3f\xbe\xcc\xd8\xf3\xe5\x2c\x96\x17\x29\x6c\x5a\xab\x17\x46\x60\x59\x6e\x4f\x13\xc9\xfb\xe0\xd8\xbb\x5e\x44\x3c\xa6\x11\x26\x73\x91\x99\xd9\xea\x89\x0c\x0a\x80\x0e\x0b\x41\xad\x78\x5c\x91\x31\xd1\x8c\x82\xc7\x13\xb6\x0a\x32\xf5\x67\x4d\x67\x50\x07\x41\xe2\x64\x38\x1c\xb2\xd3\x7c\xc2\xfc\x76\xbb\xd3\xf2\x9b\x9d\x76\xdb\xaf\xc3\x71\xf7\x0e\x8f\x2f\x25\xb3\x48\x5c\x1d\x6e\x6d\xad\x56\xab\x56\xb2\x10\x31\x84\x32\x00\x94\x25\x71\x14\xc6\x62\xb1\x1c\x67\x5b\xed\xf6\xde\x41\x7b\xe7\x60\x6f\x77\x4b\x3b\xd8\x69\x4c\xce\xf2\x79\xf4\x6d\x70\x32\x07\x10\x05\x8b\x9a\x86\xd7\x62\xd2\x84\x2f\x74\xeb\x62\x13\x71\x15\x06\x22\x6b\xb0\x17\x3c\x0f\x63\x23\xc3\x40\xd8\x73\x96\x04\xc1\x72\xb1\xd6\x5e\x95\x12\xcc\xa3\x40\x44\xd1\x23\xb6\x48\xb2\x50\xa1\x0f\xed\xc7\x00\x6c\x43\x8a\xcf\xa9\xe0\x19\x0b\x27\x22\xb9\x48\xf9\x62\x16\x06\x6c\xf0\xe7\xe7\x16\x64\x30\xf9\x45\xc0\x52\xf0\xca\x96\x52\xde\x15\x51\x94\xb5\xd8\x49\x9c\x0b\x78\x56\x85\x48\xaa\xf9\x5a\x4b\xba\xe8\x69\xce\xa3\xa6\x7a\x34\x87\x94\x5a\xf8\xd2\x88\xe1\x16\x6a\xb9\x88\x44\xbe\x5e\x08\xdc\x73\x75\x4b\x1c\x53\x8d\x33\xa6\x1f\x4c\xc0\x8b\x01\xee\x05\x5a\x73\xaf\xf3\x60\xf2\x8b\x54\x00\x7d\xb0\x24\x56\xfe\xf3\x1a\x16\x19\x21\xf3\xc9\x15\x87\xd8\x4a\x8f\x95\x96\x3b\x4b\x52\x48\x49\x96\xac\xd8\x1c\xfc\xda\x45\x14\x69\x2c\x65\x2d\xf6\x2a\x61\x22\xcb\xf9\x38\x82\xbc\x91\xf8\xe4\x0a\x6b\x9c\xe5\x3c\x9e\xf0\x74\x92\x61\x9a\x77\xc6\x21\x8a\x46\xe6\xf4\xff\x4e\x49\x47\xd6\x38\xcc\xfa\x3c\xa0\x9c\x3b\x15\xfd\x4a\x10\x15\x88\x68\x91\x4f\x6c\x9a\x2c\xf3\x30\x16\x60\x77\x09\x58\xc5\x58\x3f\x2a\xf0\x96\x5c\x5c\xd8\x01\xf0\xb2\x2e\xd7\x69\x2c\x66\xfc\x2a\x94\x53\xe5\x19\xa6\xf0\xce\x60\x3b\xb1\x74\x19\xe1\x03\xb9\x95\xeb\x0c\x6e\x1c\x8b\x34\xb9\x0a\x27\x26\x46\x80\x9a\xca\x20\x89\x33\xc9\x15\x96\x3a\xbb\xd5\x28\x49\x51\x87\x4e\x64\xc3\x23\x8b\x68\x1a\x4e\x63\x85\x33\x60\x09\x61\x10\xe6\x14\x58\x00\x76\x6b\x66\xcb\xe2\x4d\xc0\x07\x92\xfc\x55\xc8\x01\x0a\x4e\xc9\xa4\x4b\x15\x6c\xc8\xb3\x9c\xf5\xb2\x10\xef\x0b\xa3\x65\x14\x7d\x80\x16\xb5\x51\xbd\xc1\x3e\x48\x51\xbe\xf6\xa1\xde\x60\xcf\x78\x34\xa5\xed\x53\x7b\x56\xc7\x67\xf6\x57\x3c\x4d\x93\x15\xab\xbd\xe2\x75\x2b\x87\x11\xc6\x66\xc3\x4b\x64\x86\xd1\xea\x70\x0a\x29\x79\x93\x30\x3e\x1f\x87\x17\x4b\x49\xe3\x10\x32\x89\x16\x1a\x81\x73\x34\xd2\xc7\xc5\xa2\xa5\x5e\x66\xa2\x05\x28\xb2\xb6\x28\x1d\x1d\x66\xf4\xac\x07\x50\x93\x65\xc6\x6a\xbd\x3a\x04\x83\xa0\x5c\x8c\xf2\x44\x00\xd8\xc1\x2c\x09\x03\x89\x83\x85\x88\x27\x19\x5b\x2c\x21\xb7\x13\xc4\x14\x5b\xa4\x62\x2a\x52\x41\x8e\xcc\x63\x1e\x5c\xae\x78\x3a\x51\xf1\x35\x78\x1e\xd2\xa6\xc4\x6b\x6a\x08\xe6\x68\xb3\x30\xcb\x93\x94\xf6\x78\x92\xb2\x0f\x22\x83\x70\xfc\x0b\x70\xef\x0f\xf0\x2e\x33\x98\x25\x09\xec\x3c\x64\x23\x84\x42\x4a\xcd\x95\x09\x67\x4a\x60\x03\x07\x71\x83\x7e\x5b\x66\x60\x6e\xc3\xb5\xe1\x05\x5f\x2c\xd2\x64\x91\x86\x52\xfe\x8d\x92\xf8\x02\xc3\x2b\x67\x49\xb4\xc4\x17\x51\x0c\xad\x01\x43\x51\xfd\x93\x53\xdd\x24\xcc\x16\x11\x5f\xd3\xee\x77\xbb\xe4\x99\x8a\x9a\x46\x18\x32\x47\x8b\x9a\x9d\x04\x51\x38\x36\x80\xee\x25\xe9\xad\x59\x6d\xbf\x39\x0e\x73\x7d\x2b\xb3\x40\x83\x1b\x3b\xf5\x8d\x76\x4c\x0e\x06\x24\xfd\xf8\x5d\x68\x9c\x48\xba\xb5\x87\x41\x91\xdd\x24\x92\x7e\x4e\x85\xb8\x04\x6f\xa7\xc1\x3a\x0d\xa3\x28\x0c\x1a\x4c\xe4\x41\x0b\x8f\x2b\xf0\xdc\x88\xd7\x2c\x5f\x2f\x34\xc3\x0d\x28\x78\x1c\x77\xfc\xb6\x5f\xca\x1d\x1c\xc1\xc3\x5a\x04\x9e\x55\x88\x2e\xa2\x08\x79\x0e\xda\xeb\xc2\x5e\x25\x79\x61\x63\xd4\x5e\x89\x65\x9e\xf2\x88\x28\xbd\xc5\x86\x92\x63\x49\xa4\x6a\x74\x6b\x37\x97\x49\x18\xc0\x53\x17\xb7\xa0\xf2\x78\x4d\xfe\x1e\xc5\x45\x68\xb1\x13\x75\xaf\x86\x54\xb1\xf9\x4c\xc0\x40\x31\x2d\xba\x14\x9e\x80\x06\xcc\x14\xc1\x63\x0b\xb3\xcb\x27\xe8\x03\x24\xef\xf0\x9a\xd3\xc1\x79\x82\xc9\xf5\xf4\x62\x48\x06\x06\x1c\x0a\xfd\x4d\xb5\x3f\xf5\xf0\x25\x3b\x7d\xd3\x1b\x0c\x25\xf9\xbe\x7f\xfd\xe2\xdd\xcb\x21\x3b\x79\x75\x36\xfc\xf9\x6d\xef\x85\x15\x3f\x45\xce\x69\x4c\x09\x93\xad\x2b\xf4\x44\x1e\x7e\xb9\xdc\x42\xb0\x2b\xb8\xbb\xc0\x17\xd1\x7a\x31\x6b\xb9\x62\x0c\x80\xd0\x7c\xd7\x30\xfb\xb9\x80\x9d\xc8\xb3\x2c\xbc\x88\x0d\x20\x8b\x7f\xe1\x74\x65\xfb\x18\xd7\xc1\xe1\x8f\xc4\x0c\x42\xf0\x4e\x43\xe3\x02\x43\xa3\x46\xf3\xa5\x1d\xd9\x28\xab\x5b\xc6\xf3\x30\x9b\xf2\x20\x4f\xd2\xb5\x0a\x5c\x2e\x97\x01\x5c\x8e\x14\x1d\x49\xf6\x0d\x5e\x4a\xd0\x54\x1d\x63\xa8\x91\xc2\x93\xcc\xb0\x64\x8a\xa7\xb2\x0a\xe4\xa1\xc2\x5b\xac\x87\x3e\x25\xf3\x04\x13\xdd\x2b\xad\x9a\x08\x42\x50\xd8\x20\x82\x5d\x5a\xb3\x09\xcd\x5a\x3f\x35\xb0\xe2\x22\x8c\xd7\xee\x06\x06\xac\x67\x6a\xd1\xd6\x02\xac\x19\x79\x9c\xad\x70\x22\x6b\x75\x4c\xad\x55\x56\x64\x7d\x82\x19\x81\x52\x9d\x34\xf2\x0c\x1b\x43\x24\x51\xcc\xd5\xd3\x62\xa7\x22\xcf\x69\x19\x97\x0b\xe0\x9a\x52\x60\x31\xf3\x57\xdb\x47\x1f\x95\xc9\x94\x44\x8d\x8a\x83\x58\x42\x01\x6b\x0f\x92\x3e\xc0\x92\x2d\x05\x8d\x16\x8f\x79\xb4\xce\x28\x91\x19\x04\x5f\x97\xa2\x16\xaf\x92\x06\x80\x37\x8c\x97\x39\x46\x48\x55\xd5\x08\x41\x5c\x1b\x5f\x37\xe0\x78\xcd\x75\x76\x17\x0e\x97\x1d\xbd\x1d\x1d\xc2\x84\xb8\xa3\x57\x09\x9c\xdc\xca\xa9\x8d\x4d\x79\x5a\x21\xe1\x92\xea\x06\xe4\x52\xfa\x7d\x8b\xc2\xa1\x6e\xe5\xa9\xef\x6f\x29\xf6\x63\x24\x7f\xd6\x6c\xb2\x4e\xbb\xbd\xd7\x6c\xef\x36\x3b\x5d\x56\x53\x33\xda\x6d\xb5\xeb\x54\xfb\x8d\x44\x51\x96\x91\x65\xf9\x32\x13\x0d\x16\x24\x8b\x75\x43\xde\x66\xc2\xe9\xba\x41\x1e\xae\xf2\x8a\x34\x5e\xe6\xc2\xdc\xc8\xa6\xf9\x8a\xa4\x19\x62\x39\xf2\x8c\x5b\x40\x86\xcd\x18\x3d\x82\xc1\x71\x4e\xc0\x41\x2c\x0f\xe4\xf1\x5a\x4a\x1c\x92\x92\x70\xa7\x22\x5a\xe8\xd4\x08\x22\x1e\xce\x51\x18\x5e\xf1\x54\x56\x0b\x05\x59\x70\xa4\xe2\x42\xae\x37\x65\x33\xb4\xfa\x56\x38\x7a\xc1\xc1\x1c\x87\x54\x93\x87\x36\xce\x82\xa8\x15\xf0\x79\x8b\x07\xad\xe5\xe5\xd6\xdf\xe7\x17\x97\x9d\xdd\xad\x65\x60\x2e\x00\x81\x73\x93\x72\xaf\x41\x5a\x5b\xad\xc4\x1d\x74\xd9\x8a\x96\xf3\x98\x18\x05\x26\x69\x3b\x39\x7d\xcd\xfc\x76\x77\xa7\x6b\x08\x45\xb3\x3f\x09\x2b\x53\x77\x23\xd6\x24\x33\x8e\xc8\xe2\x28\xac\xf6\xee\x09\x3e\xb9\x00\x29\x94\x3a\x68\xb7\xa8\xe9\x6b\x90\x03\x06\xed\xad\x81\x0f\x9b\x24\x4d\x22\xe7\x74\x8d\x27\xec\x78\xf8\x82\x62\x63\x09\x8e\xf1\x4d\x1c\xa3\x7e\x09\xae\xe9\x2b\x78\xaf\x92\xb8\x99\x2d\x78\x00\x9b\x33\x9e\xc8\x63\x35\x42\xe9\x21\x48\xe6\x63\x94\x45\x2d\xf8\x35\xf4\x2f\x8e\x98\x3c\x05\x2e\x24\x13\x03\x4a\x7a\xa9\xf2\x12\x24\x29\x7b\xa9\x43\xa8\x15\x77\x75\x5d\x39\x24\x6e\x9c\xdd\xe9\xeb\xd1\x19\x7b\xf6\xdf\x6f\x9e\x0d\x5f\x21\x46\x7a\xc7\x9b\x30\xe2\xbb\x18\x21\xa3\xca\xdb\x87\x3a\x98\x6e\x1c\x1e\xcd\x41\xa2\xe1\x2f\xc3\xb7\xaf\xd9\x87\x93\xe3\xb3\x67\x74\x5a\xd5\xde\x3d\xe9\xb4\xdb\xfd\xdb\xa7\xf0\x8c\xc7\x17\xcb\x88\xfd\x99\xcf\x13\x06\xc9\x1d\x22\x76\x95\xac\x44\x84\x6b\xa3\xac\x60\xe2\x2c\x89\x79\x9c\x67\x12\xae\xef\x77\xdb\x4d\xf9\x63\x34\x52\xe0\x69\x24\x9b\xf1\x44\x2b\x76\xa3\x74\xaa\x24\x69\xb9\x28\x56\xb1\x94\xb7\x95\x58\x3d\x52\x73\xd6\x38\x92\xe2\x99\xbe\x85\x6b\x14\x9d\x89\x60\x16\xc3\x1d\x81\xfc\x16\xff\x9f\xef\x6f\xc0\x04\x01\xec\xa8\xa1\x56\x8a\xcb\x36\xc5\xa6\x02\x1c\x43\x63\xd7\x72\x27\x54\x80\x70\xdf\x0f\x7e\xbb\x34\xad\xa7\x11\xbf\x00\xd1\x35\xe6\xe3\x88\xf8\xc8\x7a\xd3\xc2\xe8\x81\x80\x8e\x49\xcc\x79\x99\xa6\x4d\xa2\x70\xc9\x78\xc0\x3a\x51\x02\x86\x2d\xbd\xbf\xbf\x7b\xd0\xf4\x61\xed\x3e\xfc\xfc\x62\x47\xa1\xcb\x92\x04\xf4\xf9\x50\xda\x8d\x4a\x6e\xdc\x30\x32\xdf\x0d\x01\xee\x0a\xbc\x18\x78\x4f\xbd\xac\xb8\xe8\x52\xa2\x6f\x68\x71\x1d\x7c\x3e\x78\x40\xbc\xf1\x08\xf3\xb7\x6e\x6d\xb1\x0f\x9a\x45\x49\x8e\x63\x20\xb5\xa8\x6a\x2b\x5e\xd2\xed\x0b\x53\x75\xb9\x4d\x4a\x73\xd2\xcd\xe8\x4b\xa1\xe9\x48\xae\x8c\xf2\x22\xa5\x0c\xc9\x10\x56\xf9\x16\x2a\xd0\x60\x2b\x56\xdb\x24\xb5\x74\xc6\x16\xdf\x02\xd3\x8c\xd4\x02\xa6\x86\xdb\x41\x68\xa7\xa8\xc5\x53\x21\x13\xe3\x24\x6e\x26\x57\x22\x8d\xf8\x62\x41\xaf\x63\x22\xbd\xe2\x51\xa6\x3e\x66\xa5\x6d\x27\xa1\xa8\x90\x0b\x20\x1a\x3d\x5a\xc6\x61\x26\x72\xf6\x24\xe0\xf9\xd1\x4b\x41\x3f\x63\xfc\x39\x98\xb2\xa6\xe4\x69\x0c\xf7\xbc\xdc\xf1\x0c\xd8\x0a\x0b\x1e\x19\xc4\x2a\xb6\x7b\xc4\xce\x41\x2f\x7b\xce\xda\xd7\xed\xed\x76\xbb\x01\x3f\xbb\x23\xf6\xb1\x81\x65\x3b\xfb\xdb\x0d\xfc\xd9\xb5\xca\xf6\xa9\xec\x80\x51\xaa\x33\x28\xdf\x3d\xf0\xa1\x7c\xb7\x7f\xac\xeb\xee\xf6\x47\x54\x66\x60\xee\x0e\xa8\xde\xa0\xe3\xb6\x1f\xec\x50\xf9\xae\x55\x77\x8f\xca\xf6\x74\x59\x97\xc6\xd9\x6d\x6f\x3b\xed\xbb\x3e\x95\xfb\xa6\x7d\x77\xa7\x8f\x65\xbb\x43\x53\xb6\x47\xf5\xf6\xda\x6e\xfb\xe3\x2e\x96\x0f\x77\x4c\xdd\xe1\x1e\x95\xed\x5b\x65\x3d\x2a\x3b\x76\xda\xef\xb5\x71\xae\x7b\x6d\x33\xd7\x3d\x1f\xe7\xba\xe7\xfb\xa6\x6c\x1b\xfb\xdf\xdb\xe9\xb9\xed\x7b\xd8\xff\x5e\xbf\x6d\xea\x0e\x71\xfc\x7b\xa3\x6d\x5d\x76\xd0\x46\x98\x07\x6d\x17\x7f\x07\xdb\x83\x06\xfd\x34\x75\x77\xa8\xee\xce\xbe\x55\x76\x4c\x65\xee\xf8\x0f\x76\xa9\xee\xae\x99\xff\x41\xb7\x83\x65\x5d\xab\xff\x7d\xaa\xb7\xef\xbb\xed\xfb\xd4\x7f\xdf\xea\x9f\xd6\xfa\x60\x60\xc1\x1c\x50\xff\x83\x42\xff\x43\xea\x6b\x68\xfa\xea\xd1\x5c\x7b\x30\x57\x2a\xa3\x79\xf6\x60\x9e\xa6\x7d\x8f\xe6\xda\xdb\xb1\xea\xee\xec\x51\xd9\xbe\x55\xd6\xa7\x32\xb7\xff\x1e\xd1\x45\x6f\xcf\xac\x55\x8f\xe6\xda\xdb\xb7\x60\xd2\x3c\x7b\xfd\x42\xff\x34\xd7\x9e\x45\xbf\x3d\xa2\xdf\xde\xc0\xea\x9f\xe6\xdf\x2b\xcc\xbf\x47\xf3\xef\x59\xf3\xef\xd3\xfc\xfb\x6d\x33\xa6\x3e\xcd\xbf\x5f\x98\x7f\x7f\x7b\x44\xe5\x86\xfe\xfa\x84\x93\xfe\x8e\x05\x93\xd6\xbf\x5f\x98\x7f\x7f\x17\xe9\xaf\xbf\x6b\xf6\x7a\x7f\x1f\xc7\xd4\xb7\xe6\xdf\x1f\x20\x9e\xfa\x03\x77\xff\xf4\x69\x5e\xfd\x81\xd9\xff\x83\xed\x21\x94\x0d\x76\x0c\x4d\x0f\x76\xba\x54\xb6\xef\xb4\x1f\xec\xf4\xa8\xdc\x6a\xbf\xbb\x8b\x65\xd6\x98\x06\x84\xff\x41\x01\xff\x03\xe2\x35\x03\x8b\xd7\x0c\x06\xd4\xd7\xc0\x6a\x3f\xa0\xf6\x05\xfc\x0f\x08\xff\x03\x0b\xff\xc7\x84\xbf\xe3\x1d\xbb\xec\x98\xca\xdc\xf6\xc7\x03\x1c\xff\xf1\xa0\x67\xea\x1e\x23\xcc\xe3\xe3\x1d\xab\xac\x4b\x65\x5d\xa7\xfd\x70\x1b\xfb\x1a\x6e\x9b\xb5\x1e\x6e\xef\x50\x99\x81\x39\x24\x9a\x1e\xee\x0c\xdd\xf6\x7d\x6a\xdf\xb7\xda\xf7\xa9\x7d\xff\xc0\x2a\xeb\x53\x99\x8b\xbf\xe1\x00\xf9\xfa\xd0\x5a\xbf\x91\x8f\x65\x23\xdf\xb4\x1f\x6d\xe3\x9a\x8c\xb6\x77\x9d\xf6\xa3\xed\x3d\x2a\xdf\xb3\xea\x1e\x50\x99\xd5\x7e\x0f\xc7\x39\xda\x73\xc7\x3f\xda\x47\xba\x1a\xed\x1b\x5c\x8d\xf6\xbb\x54\x66\xc1\x3c\xa0\x7a\x07\x7b\x6e\xfb\x03\xea\xcb\xe2\x3f\x23\x5a\xff\x91\x59\x7f\xbf\xdd\x81\xf5\xf3\xdb\xdb\x0e\xfd\xfa\xed\xed\x0e\x95\x77\x4c\xdd\xed\x2e\x95\xed\x59\x65\x07\x54\x76\xe0\xb6\xdf\xdd\xc7\xf2\x5d\x3d\x57\x79\x06\x43\x99\x3c\x86\x55\xd9\xf6\x2e\xd0\xa9\xfc\xe9\xb4\xdf\xf3\xb1\xff\x3d\x5f\xcf\xdf\xdf\xa3\x31\xed\x6d\x5b\x65\xbb\x54\xb6\xbb\xed\xb6\xdf\xa3\xf2\xbd\x6d\x53\x17\xd7\xdf\xdf\xeb\xef\x5a\x65\x7b\x54\x76\xec\xb6\x47\x5c\xc9\x9f\xa6\xee\x00\xe7\xba\x77\x6c\xc1\x3c\x3e\xa6\x32\xb7\xfd\x7e\x1b\xe8\xca\xdf\x6f\x6b\xfa\xf1\xf7\x7b\xd8\x7e\xbf\x67\x70\x72\xd0\x41\x9c\x1c\x74\x9c\xf3\xcb\x3f\xe8\xec\x51\xf9\xbe\xa9\x4b\xf3\x3f\xb0\xd6\xe4\x80\xf0\x7f\xb0\xdd\x77\xda\xf7\x7c\x6c\xdf\xf3\x4d\xfb\x3e\xca\x0a\x7e\xbf\x6d\xc6\xdf\xc7\x3d\x25\x7f\x3a\xed\xfb\xb4\xd6\x7d\xb3\xd7\x7c\xe2\xb5\x7e\xdf\x9c\xa9\x7e\x7f\x07\xc7\xd4\xdf\x71\xc7\xdf\xef\xe2\xfc\xfb\x16\xfe\x8f\x91\x57\xfa\x16\x4f\xf0\x8f\x47\x43\x2c\x1b\x39\xeb\x2f\x85\xb4\x06\xfe\xd4\xb4\xd2\x69\x77\x7a\x58\xd6\x19\x9a\x32\xa4\xa9\x4e\xbb\xbb\xed\xb6\xef\x52\xdd\xae\xd5\xfe\x98\xea\x0e\x75\xd9\x36\xc1\xdc\x6e\x77\x9c\xfe\xb7\xdb\xb8\x7f\xb6\xdb\x07\x7a\xac\xbd\xfd\x36\xe0\x44\xfe\xb4\xca\xfa\x54\xe6\xe0\xbf\xb7\xdf\xd9\xc5\xf2\x8e\xae\x3b\xea\xfb\x30\x57\xf9\x53\x97\x0d\x71\x4d\x46\xc3\xb6\xd3\xff\x68\xd8\xa1\xf2\xce\xb6\xa9\x3b\x1a\x35\xe8\xa7\x2e\x1b\x8d\x60\x9c\xa3\xd1\xc8\x5d\x7f\x25\x2c\xc8\x5f\xcc\x0a\xb4\x7b\xed\x5d\x55\xda\xb5\x4b\x07\xaa\x74\x54\x80\xb2\x4d\xdb\xb8\x67\xd1\x41\xbb\x87\x87\x2b\xfc\x62\x56\xd2\xef\x22\xc9\x1d\xfb\x5d\x97\x17\x1c\xfb\x7b\xdb\xf4\xc5\x9c\x9c\xf2\x8f\x5d\x55\xda\xb7\x4a\x7b\x3d\x2a\xed\xb9\x3b\xea\xb8\x43\xa4\x76\xdc\xd9\xd1\xfb\x7f\xd8\x6e\xe3\x3c\xe1\x17\xab\x14\xd1\x37\x6c\xb7\xf7\x9c\x19\x0d\xdb\x7e\x9b\xbe\xf8\x92\x0a\x1e\x7c\xbc\xff\xcd\xe4\x96\xbb\xd5\xe6\x2b\x0a\xe8\x37\x9a\x3d\xd6\xa4\xbb\x4a\x93\xee\x2a\x4d\xba\xab\x98\x4b\x09\xb7\x6e\x63\xd6\xa5\xa4\xdd\xc3\xc3\xa2\xdd\x33\x87\x5a\xbb\xb7\x43\x65\x3b\x56\xd9\x1e\x95\xb9\x42\x45\x1b\x71\x2b\x7f\x5a\x75\x87\x54\x66\x2e\x05\xed\x3e\x1e\x2a\xed\xfe\x8e\xdb\xbe\xdf\xa5\x72\xab\x3d\x09\x20\x6d\x4b\xd0\x68\xd3\x41\xd3\x1e\xb8\x87\x3a\x6d\x40\xf9\xd3\xd4\x3d\xa6\xb1\x1e\xef\x5b\x65\x34\xa6\xa1\x2b\x54\xb7\x87\x04\x77\x68\x04\x98\xf6\x70\x9f\xca\xac\x31\x0d\x69\x4c\x85\x4b\x49\x7b\x44\xfd\x8f\xac\xfe\x47\x1d\x2a\xdb\xb6\xca\x68\x4c\xa3\x5e\xa1\x3d\xc1\x1d\x0d\xac\xba\x34\xd6\x91\xc1\x9f\x4f\x82\xaa\xdf\x76\xc7\xef\xd3\x05\xc8\xb7\x2e\x40\xbe\xbf\x4d\x65\xdb\x56\x59\x9f\xca\xfa\x6e\xfb\x0e\xce\xdf\xef\x18\x01\xc0\xef\x50\xdd\x4e\xdf\x94\x91\xf0\xe4\x6f\xbb\x97\x42\x1f\x77\xb3\xfc\x69\xd5\x45\x41\xd1\xb7\x2e\x0a\xfe\xce\x0e\x95\xb9\xeb\xef\xef\x50\xfb\x1d\xab\x2f\x12\x00\x7d\x4b\x50\xf5\xf1\x50\x6e\xfb\xbb\x85\xfe\xbb\x34\xfe\xae\x35\xfe\x2e\x8d\xbf\x6b\xc1\x1c\x20\x4e\xfd\x81\x2b\x14\xf9\x44\x3f\xbe\x45\x3f\x3e\x09\x95\xfe\xb1\x35\xfe\x63\x1a\xff\x71\x61\xfc\x24\x6c\xfa\xc7\x5d\xab\x2e\xcd\xc9\xa2\x3f\xff\xb8\x47\x65\xbd\x42\xfb\x01\x95\x9b\xf5\xef\xd0\x45\xb1\xb3\x6b\xd6\xb4\xd3\xa5\xb2\xae\xbb\xfe\x1d\xba\xd4\x77\xac\x0b\x60\x87\x2e\x45\x1d\xeb\x52\xdf\x41\x41\xa3\xdd\x19\xf4\x0b\xed\x8f\xa9\xdc\xe0\xba\x43\x38\xe9\x58\x38\xe9\xd0\x9c\x3a\xc7\x85\xf6\xc7\xd4\xfe\xd8\x6e\x3f\xa2\x32\xb3\x7f\xb7\x49\x79\xb1\xdd\x73\xc7\xbf\xdd\xdb\xa6\x72\x23\xc0\x6e\x93\xa0\xbd\x3d\x30\xf3\xdf\x1e\x50\xbd\x81\xab\x14\xd9\xa1\x7d\xb1\x63\x5d\xe0\x76\x48\x51\xb1\xb3\x63\x29\x5a\x08\xa7\x3b\xbb\xbe\x7b\xa8\xfb\x74\x80\xfb\x6d\x73\xa8\xe3\xfe\xe9\xb4\xfd\xae\x55\xb6\x4f\x65\x07\x85\xf6\x03\x2a\x3f\xb6\x84\x0a\x82\xd9\xe9\x58\x65\x3b\x54\xb6\xe7\xb6\xdf\xa6\xba\xdb\x56\xff\x28\x94\x75\xda\xdb\xdb\x56\xd9\x2e\x95\xed\x16\xda\x93\x50\xb3\xdd\xb7\xea\x0e\xa9\xcc\x12\x6a\xf6\xa8\xff\xbd\x1d\xb7\xfd\xde\x88\xca\x2d\xa1\x06\x2f\xe5\x9d\xb6\xb9\x28\x74\xda\x3d\x9a\x67\xcf\xb9\xd4\x74\xfc\x36\xe2\xca\x37\x22\x41\xc7\x47\x89\x40\xfe\xb4\xca\x0e\xa8\xcc\xc5\x1f\xf1\xaa\x8e\xc5\xab\x3a\xbe\xdf\xa5\x32\x83\x7f\xbf\x83\x63\xf2\x5d\xa1\xb6\x43\xfc\x4b\xfe\xb4\xea\xf6\xa9\xcc\xe0\xc4\xdf\xa5\x7e\x76\xdd\xf9\xfb\xbb\x54\xd7\x28\xb0\x3a\x74\xa9\xe8\x58\xfc\xa3\xe3\xef\x51\xd9\x5e\x61\xfc\x07\x54\x7e\x70\x60\xea\xf6\x91\x56\xfc\xbe\x55\x86\x3c\xa5\x83\x3c\xc5\x6a\x8f\x7c\xa5\xe3\x9b\x0b\x6c\xc7\x47\xa5\x98\xfc\xa9\xcb\x3a\x28\x63\xc8\x9f\x4e\xfb\x4e\xbb\x43\xe5\xdb\x56\xdd\x3d\x2a\xdb\xb7\xca\xfa\x54\xd6\x2f\xb4\x1f\x51\xb9\x59\xff\x0e\x9e\x29\xf2\xa7\x55\xb6\x4b\x65\x2e\xfd\x75\xfc\x1e\x95\xf7\xac\xba\xc7\x58\xd6\x31\x34\xdd\xe9\x6c\x53\x99\x2b\x54\x77\x3a\x04\xb7\xb3\x6b\xd5\xa5\xf1\x77\x06\x56\xd9\x90\xca\x86\x6e\x7b\xbc\x6c\x74\x3a\xdb\x16\xae\xf0\x52\xd1\xe9\x6c\x9b\x3d\xd9\xc1\x73\x46\xfe\x74\xdb\xef\x50\xdd\x1d\xab\xaf\x5d\xc2\xe9\xae\xd9\xbf\x1d\xa2\x89\x02\xff\xed\x74\xba\xd4\x7f\xd7\xea\x9f\x2e\x0a\x1d\x8b\x7e\x3a\x5d\x1a\x7f\xd7\xbd\x94\x74\xf6\xa9\xaf\x7d\x6b\xfd\xf0\x52\xde\xe9\xec\x5b\x30\x0f\x08\x4f\x07\x05\xfc\xe3\xa5\x42\xfe\x34\x75\x7b\x54\xb7\x67\xe1\xb4\x4f\xeb\xdc\x77\xfb\xdf\xc6\x4b\xb1\xfc\xa9\xeb\xee\xd0\x5c\x77\x86\x06\xe6\x0e\x2a\x4a\x3b\xbb\x3b\x2e\xfd\xec\xee\x62\xdd\x5d\x73\x29\xeb\xec\xee\x53\xd9\xbe\xa1\xa9\xdd\x03\xec\x67\xb7\x30\xfe\xdd\x1e\xd5\x35\xf2\x67\x67\x17\xcf\x84\xce\xae\x39\x13\x3a\xbb\x7d\x6a\xdf\x77\xe9\x67\x17\xe5\xc7\xce\x6e\x7f\xcf\xaa\x3b\xa0\x32\xb3\xfe\xbb\x03\xea\x67\xe0\xae\xdf\xee\x80\xda\x1b\x05\x62\x67\x77\x40\x73\x1d\xf4\xad\x32\x5c\xbf\xdd\xe3\x42\xfb\x21\x8d\x6b\x68\x70\xbd\x3b\x1c\x51\x99\x99\x7f\x97\x78\x62\xb7\xed\xc8\xaf\x9d\x2e\xf1\xc5\x6e\xfb\xc0\xaa\x3b\xa4\x32\xab\xbd\x8f\x74\xd6\x2d\xec\xbf\x2e\x9d\x3f\x5d\x7f\x60\xd5\xa5\xf6\xe6\x52\xd8\xe9\xee\xe0\xfc\xbb\x3b\x2e\xff\xe8\xe2\x0d\x48\xfe\x34\x75\x69\xfd\xbb\x5d\xdf\x2a\xdb\xa6\xb2\x42\xff\x78\x43\xeb\x74\xbb\x3d\xab\x2e\x8d\xa9\x7b\x6c\x95\x8d\xa8\xcc\xa5\xbf\xbd\x6d\xe4\x15\x7b\xd6\x5e\xdd\xdb\xc3\x35\xd9\x33\x67\x92\xbc\x8b\x35\xc0\x4b\xd8\xbd\xd4\x8f\x46\x23\x68\x2f\x7f\xea\x0b\x6c\x5b\x55\xb6\x4b\xc1\xd1\x03\x95\x05\x6d\x2c\xc7\x8b\x1a\x1a\x0c\xf4\xc3\x98\xa7\x6b\x96\x09\x9e\x06\x33\x34\x83\x22\xf7\xd5\x7c\x86\xd9\xe6\x63\xe3\x71\xa3\x5f\xfc\xc1\x2f\x2e\x5b\xf0\x40\xd8\x8f\x56\xa5\x28\x46\xe2\x42\xa4\x5f\xd8\x32\xc8\x58\xaf\x02\x88\x6d\x06\xad\x7d\x98\x74\x68\xae\xb3\x74\x29\xdc\x61\xdc\xdc\xfd\x53\x7c\x6a\xd3\x61\xb2\xf2\x99\x48\x57\x61\x66\xa5\xff\x5c\x05\xad\x30\x3b\x85\x56\xb6\x83\x5a\x90\xe9\x10\x15\xbd\xe5\x75\x18\x85\x12\x1f\x8e\x9f\xdf\xd8\xc1\x51\x18\xeb\x2b\x2c\x83\xb7\x56\x95\x52\x72\x1e\xc6\xec\x88\xb5\x1b\x6c\xce\xaf\xd9\x11\x2b\xbe\x89\xa9\xb8\x80\x4d\x74\x06\xc1\x16\x13\x1d\x31\x54\x62\xe9\x4f\xa5\x46\xe7\xed\x8f\xe7\xed\x8f\xec\xf3\x67\xc0\xe2\x8f\xe5\xef\x73\x7e\xfd\xf1\xdc\xff\x58\x15\x4f\x54\xfb\x63\xc8\xf1\xfc\x78\x24\xc7\xa7\x9c\x31\xe6\xe1\x84\x1d\xb1\x97\x3c\x9f\xb5\xa6\x51\x92\xa4\xb5\x9a\x1c\xfc\x13\x39\xf2\x3a\xdb\x62\x1d\xcb\x51\x6a\x53\xbf\xe1\x04\xfa\xd5\xde\x1d\x38\x7b\x09\xf8\x49\x85\xb7\xcb\x86\xd9\x01\x94\xb6\x0d\x05\x50\x27\xa1\x34\x0b\x50\x0a\x81\x08\x4d\x56\x3f\x1d\x7e\xd0\x9d\xbd\x1d\x19\xaf\x7a\x59\x81\xd2\x41\x23\x71\x07\x62\x1f\x72\x4c\x57\x7c\xc3\x9b\xed\x3f\x96\xfc\xab\x34\x27\x60\x80\x6b\x0f\xc8\x22\xfc\xe2\xbb\x74\x89\xfe\x37\x93\xb0\xd6\xa0\xdc\x87\x84\x75\xa3\x0d\x24\x6c\xbe\xff\x63\x49\xd8\xea\xf7\x1b\x48\xb8\x00\xe5\x0f\x27\xe1\x63\x95\x41\xaf\xd2\x84\xab\x82\x48\xbe\x0f\x39\xea\x56\x67\x77\xef\x55\xd3\x9c\x2c\x55\x46\x0b\x65\x72\x93\x28\xdd\x68\x38\xa1\xb0\x49\xe3\x28\x02\x7c\x0b\x0d\x74\x6d\x00\x5a\x8a\x6b\xbd\xa1\xed\x71\x98\xa5\x9b\x9a\x7f\x13\xc6\xb5\xc1\xa0\x32\x1c\x91\xac\xe5\x56\xb6\x51\x4a\x95\xf5\xcf\x5c\xa8\x32\x6e\x36\x9d\x94\x10\xd5\x5f\x32\x51\x34\x68\x2f\xdb\x0f\xb5\x2c\x9e\x70\x04\xc1\x33\x2a\x16\x45\xd9\xef\x3c\x75\x18\xc8\x36\x04\x11\xc7\x5d\x0b\x8e\x98\x53\xf6\xc3\x0f\x0c\xbf\xb5\xaf\x79\xbb\x5e\x05\xca\xb6\xe9\x51\x41\x66\x5f\x2f\xf2\x70\x1e\xfe\x8e\x19\xd7\x7b\xa7\x83\x93\x93\x0d\x03\xfc\x13\xf4\xe2\x80\xf5\x15\x90\x7e\xf1\xf0\x47\xfb\xaa\x8d\x56\x35\x2d\x97\xb6\x49\xe2\x00\xe4\x39\x1d\xb4\x55\x07\x98\xdd\x95\xa7\x69\x78\x25\x28\xc1\xab\x1c\x13\x99\xf3\x72\xcb\x96\x31\xd9\x68\x3c\xd9\x32\xbc\xc3\xa7\x40\x99\x06\x7f\xbe\xdf\x6e\xb3\x1f\x7e\x40\xe6\x83\xf3\xc5\xe2\xdd\xa9\x44\xb4\xfd\x6f\x6b\xcb\xb1\x01\x0c\xe3\x30\x6f\x59\x16\x7f\xc4\xbf\x70\x4d\xe1\xf2\xd4\x39\x50\x8c\x5d\x15\x70\xf6\xf9\x33\xd5\x33\x43\xe8\x88\xfd\xb6\x5e\x44\x59\xc0\x77\x82\xa9\x1e\x13\x42\x7c\x78\x04\x6f\x44\xdb\xd3\xba\x3b\xaa\xad\x2d\x70\xd3\x68\xb5\x5a\xec\xbf\xc3\x12\x64\x1e\xb4\x5d\xc8\x93\x3d\xbe\x8d\x10\xcc\x64\x4e\xd7\x51\x24\x57\x2d\x2b\x35\x9f\x1e\x14\x9a\x4f\xf9\x74\xaa\x9b\xcb\x7e\x07\x8e\x43\xcb\x89\xf2\x55\xab\x00\x25\xfc\x02\x28\xe1\x1f\x68\x50\xef\x45\x0a\xd9\x63\xc0\xd8\xb3\xaa\xf1\x76\xb1\x71\xf7\xa6\x71\x8c\xaa\xa1\x4c\x8b\xb3\x99\x76\xdb\x1a\xca\x68\x19\x45\xc8\x13\x36\xb5\x16\xc5\xd6\xa2\x5b\xaf\x5c\x4e\xf0\x1d\xb7\xab\x76\xa6\xd3\xe9\xa4\xb2\xee\x76\xa9\xee\x36\xd4\x45\xcf\x5d\x0a\x98\x77\xc8\xc4\x3c\xf9\x2d\xb4\x8d\x05\x97\xd9\x12\x3c\x37\x94\xb9\x3b\x8a\xfb\x10\x76\x23\x9c\xb8\x5e\x39\x91\xe4\xbb\x17\x33\x04\x67\xc9\x45\x38\xd9\x6c\x21\x02\x96\xf1\x35\xec\xa7\x99\x14\xc4\xd9\x29\xfa\x07\xc8\x6d\x37\x99\x40\x85\x10\x6c\x6d\x33\x9d\x60\x4c\xcc\x7f\xfa\xb6\xc3\xa0\x78\x08\x18\xd7\x98\x7f\xf5\x43\xe0\xed\x1d\x4e\x00\x87\xc1\xd9\x07\x77\x99\xcf\x6d\xb2\x64\xb4\xd3\x11\xdc\xf9\x8c\xfe\x8a\x25\x31\x61\x4a\xaa\x62\x8c\x66\x79\xaa\x63\xdc\x7e\x2d\x3e\x8b\x81\x50\x56\x41\x2b\xcb\xcb\x92\x8f\x13\x04\x83\x1c\xb7\xd2\x2b\xb2\x3f\xbd\x35\x14\x86\x13\x88\xce\x0a\x05\x05\xa1\x0d\xd4\xdf\x56\x7c\x83\x15\x75\x5f\x44\x6d\x29\xd6\x91\x5c\x4a\xac\xfc\x27\x75\x48\xeb\x75\x69\x92\xfc\x9a\x5e\xb1\x27\x47\x08\x92\x1a\xc9\xbf\x6b\x85\x18\x51\xd3\xa9\x64\x9d\x3f\x31\x9f\x1d\x62\x1c\x02\x5b\xa4\x4d\xaf\x9c\xd5\xfb\x59\x50\xbe\xe6\xe5\x98\x22\x8f\x50\x0a\x41\x22\x51\x44\x76\x32\x9d\x66\x22\x2f\x50\xaf\xb5\x0e\x37\xad\xaa\x1b\x2e\xe5\x42\xe4\x56\x5f\xd3\x34\x99\xb7\x2a\xf7\x1b\x06\xe2\xa7\x80\xcb\xe8\x89\xee\x8e\xa5\x08\xab\x1a\x4c\xb2\xc8\x3f\x21\x52\x37\x91\x8e\x03\xe0\x41\x55\xe8\xe5\xb3\x62\x2d\x43\x5d\x50\x5a\xa0\x2d\x4a\x22\xd0\x30\x7d\x5b\xc9\xe8\xe4\x17\x88\x78\xdc\x60\x22\x9e\xd0\x6f\x2b\xbd\x0d\x81\xf6\x4c\x25\xbc\x02\xae\xb4\x79\xb4\xd5\xbe\x10\x9f\xc5\x7c\x30\x81\x5a\xb0\xdd\x93\x0a\xd2\x2b\x04\x3a\x31\x8d\xeb\x25\x5a\xfc\x11\x41\x2b\x7a\x1c\xa7\x82\x5f\x3a\xb9\x67\x0c\x86\x1f\x1e\xb1\x65\x4c\x76\xff\x4e\x52\x64\x35\x53\x4c\x92\xa3\x11\x60\xe6\xf5\x40\xcb\x18\xba\xaa\x3d\x3d\x79\x68\xd1\xce\x38\x32\x58\xb5\x5a\xdd\x79\xa6\x0a\x7c\xbd\x6e\xf0\xff\xe4\x49\xc5\xa4\xcd\xda\x3d\x70\x07\xa6\x42\x66\xa8\x64\xd4\x79\xda\xd2\xb4\x51\xab\x5a\xde\x7a\x71\x03\x9a\x26\x36\xe2\x4b\x9b\x72\xc3\x86\xc4\x7d\x81\x4e\x36\x13\x77\x4b\xfc\xe3\x37\x61\x75\x2b\x39\xb0\x33\x08\x83\x3a\xa9\x6c\xf1\x55\x9b\xac\x90\xc5\xd2\xde\x67\x22\x9e\x38\x81\xad\x9c\x76\xc5\x9a\xac\x49\x04\x0d\x08\x97\x55\x53\x81\x21\x41\x5a\x7c\x32\xa9\x79\x14\x98\x24\x98\xf1\xf8\x42\x44\xc9\xc5\x16\xb9\x82\x79\x0d\xe6\xe5\xe2\x3a\xdf\x5a\x44\x3c\x8c\xbd\xc6\x03\xcf\x6f\xf9\x5d\x8f\x3d\x79\xe0\x79\x0f\xea\x94\x99\xf3\x16\x50\x13\x9e\x8b\x32\x9c\x4e\xdb\xdf\x6b\xb6\xf7\x9b\x0e\xb4\x62\xbc\x94\x99\x3c\x63\xb7\x7e\xcb\xb6\xe0\x97\xff\xed\xd1\x99\x01\x57\xf9\x44\x2c\x00\x49\xad\xd3\x3c\x49\xf9\x85\x80\xa4\xf7\xb4\x03\xfe\x43\x36\x94\xfd\x5f\x85\x62\xc5\x8e\x45\x10\xf1\x94\xdc\xe6\x10\x03\x8f\x21\x6d\x01\xca\xa2\x18\x3a\x7f\x2e\xd8\x98\x67\x61\xc0\xb2\x19\x4f\xc5\x84\x2d\x21\xdb\x4d\xa8\x72\x00\xf0\x1c\xbd\x84\x92\x84\x65\x73\x70\xf3\x4f\xd8\x04\x31\xc1\x26\x02\xb3\x12\x4e\x60\xbc\x94\xcb\x56\xf2\x6b\xe8\x4b\x3b\xc2\x18\xcf\x3e\xc8\xc2\x01\xde\xd7\xf1\x24\x59\xb1\x59\x82\x2e\xd5\x38\xb4\x42\xf8\x12\x79\x58\xf1\x8c\x2d\xe4\x56\x4a\xa6\x54\x47\x5e\xe8\x6a\xf5\x16\xb3\x12\x15\xc9\xda\xf1\x15\x8f\xc2\x09\x5b\xc6\x79\x08\x4e\xc3\x10\xf3\x80\x47\xe1\xef\x3a\x82\x0a\x66\xa6\xc5\x11\x22\x28\x1c\xc3\x99\x1c\x91\x4e\xf7\xa8\xa2\xdd\xf3\x14\xee\xab\x56\xac\x76\xf2\x6c\x37\xa9\x2f\x28\x62\x01\x84\xd0\x53\x21\xad\x7f\x4f\x92\xb9\xed\x1b\x45\x33\xfa\xef\x64\x09\xeb\xad\x22\x63\x43\x86\x8c\x7c\xa6\xd3\xab\xb3\x28\x09\xe4\x60\x85\xce\x84\x6e\x8f\x53\x02\xa5\x01\x99\xac\x9a\xde\x5f\x5e\xbf\x7e\x29\x4f\x0e\xbf\xdd\xfe\x77\x2b\x6a\x4e\x3f\x0d\xc5\x94\xa1\xb5\xda\x5a\x8f\x5f\xbb\xe5\xe3\x70\xe5\x3e\x92\xc3\x0c\x92\x05\x85\xaf\x00\x09\x34\x0a\x17\xe3\x84\xa7\x7a\xd8\xfd\x35\x9b\x88\x29\x5f\x46\x90\xd8\x87\x3c\xe8\x95\x24\xdf\x7f\xd1\x1b\x3c\x67\xa7\x83\x93\xd3\xd3\xd7\x6f\x4f\x2d\xff\x5c\x70\xce\x5d\xe3\x8c\xc9\x7b\xf9\x1e\x93\xb6\x09\x00\x1c\x81\x8b\x43\x9f\x09\xe6\x21\x7a\x9b\x7a\xc0\xcd\x38\xc9\xc3\x40\x78\x56\x54\x07\x20\x02\x67\x21\x14\x3a\x65\xdd\xe9\x5a\xb2\x00\x0b\x9b\xbf\x2c\x3b\x7b\xed\x8e\xc4\xa3\xa6\x56\x89\xa3\x6c\x26\x07\x1a\xc6\x8c\x4b\x92\xbf\xcc\x93\x05\x83\xe6\x14\x8d\x45\xfb\x3f\x2b\x6a\x00\xdf\x64\x11\x45\x2d\xc6\x7e\x59\x76\x3a\x5d\x0c\xa6\xa8\x71\x36\x3c\xf9\xf9\xd9\xd9\x33\xf6\xea\xf5\xd9\xb0\xc1\xfe\xbd\x96\x87\x79\x24\xea\x85\xc4\x97\x12\x57\x3a\x80\x88\xa6\x32\xa8\x6a\xcf\x82\x86\xf3\xca\x1a\xcd\x99\xac\x43\x93\xe9\x76\x7b\xa6\x03\xfc\xdb\x22\x92\x17\x64\xd8\x08\xe1\x1d\x69\xaf\x82\xfb\x2e\x24\x34\xd7\x77\xb9\x1e\x16\xce\x78\x1a\x8b\x4c\xfb\xa4\x53\x22\x67\x95\x32\x7b\x0d\x6e\x7b\x18\xce\x85\xb2\x7b\xa6\xcb\x38\xd6\x87\x11\x0e\x57\x02\x3a\x16\x0b\xb0\x60\xf4\xb0\xe8\x34\x48\x93\x28\x7a\x93\xa4\x98\x3e\x2f\x93\x0c\x5e\x7f\x11\x22\x56\xa5\x0f\x58\xe9\x1f\xd5\x3b\x23\xec\x14\xdb\xbf\x3f\xbb\xbd\xed\xfb\xb3\xd6\x80\xc7\xb1\x98\x60\xcd\x8f\x2e\x9b\x42\x94\x48\x26\xa2\x4f\xce\x06\x4b\xc5\x45\x98\x41\x3a\x5c\x24\x64\x3c\xb8\xb0\xec\x04\xd9\x52\x81\x80\x29\x7f\xc9\x64\x09\xa7\xb0\xac\x1f\x3a\xf5\x94\x04\xa0\xfa\xf8\xc2\x92\x58\x42\x42\x27\x68\xf5\xd2\x63\xda\xb1\x15\x78\xad\x2e\x21\xda\x43\x18\x5f\x25\x97\x02\x76\x85\x7a\x32\x2c\x70\x3d\xd8\xe1\x26\xd9\xe7\xd6\x83\xd2\x88\x11\x19\x5e\xc3\xca\x26\x01\x03\x40\xb1\x40\x8f\x20\x89\x3f\x00\xaf\xac\x21\xcb\x54\x32\x6a\x05\x1b\xc5\x3f\x5a\x92\xcd\xa3\xb8\x67\x25\xe8\x44\xd0\x0d\xd6\x36\x92\x9d\xd5\xc3\x19\x1f\xd7\x72\x3e\x76\x92\xa5\xf1\x31\x4a\xb0\x00\x33\x90\xa7\xb3\xb0\x62\x1b\xc2\xdf\xd4\x3d\x64\xde\x91\x0d\xe8\xef\x93\x49\x03\x58\x7a\x43\x8f\xbd\x3a\x29\x98\x4a\x77\x90\x5e\x84\xf1\x84\xd7\x0f\xf5\xd2\x41\x68\x27\xb6\x02\x61\x8c\x2d\x17\xe8\x5f\xcf\xae\x7c\xc6\x17\x0b\x2f\x83\x80\x31\x17\x29\x1c\xdc\x0b\xe4\x5c\x0a\xdc\x4b\xbe\x1e\x0b\xe6\x20\xc5\x8b\x93\x58\x78\x14\xf2\x63\x4c\x09\x63\xad\xf8\x2e\x90\x62\x57\x87\x2b\x50\xb0\x2a\xb0\xeb\xc5\x10\x7f\x42\xc7\x90\xdd\x88\xdc\x42\x4a\xb3\x87\x8a\x67\x00\x33\x27\xa9\xc1\xc6\xb4\x83\x62\x08\x07\x89\xc8\xcd\xb0\x6a\xb9\xa4\x95\xad\xe3\xc0\xac\x45\x15\x7c\xca\x10\x6e\xc9\x29\x2d\x10\xb0\x44\xad\x0a\x54\xe5\xea\xdc\x11\xec\x0b\x79\x90\xd4\x8a\x13\xa7\x64\x08\xd4\x59\xce\xc7\x99\x4a\x58\x11\x27\x92\xd3\x2d\x28\x8a\x5c\x18\x33\x0a\xee\x06\x69\xb8\x33\x8a\xb6\x20\x72\x11\xe4\xf8\xb6\x8a\xc0\xd6\xc9\xd2\x83\xa0\x15\x76\x6d\xe4\xef\x51\x98\x4b\xd6\xcb\x57\x10\x44\x48\xbd\xa6\x87\xd9\x1b\xaa\xd9\x5b\x2c\x8c\x23\xed\xcd\x18\x4f\xa5\x08\x53\x55\x22\x09\xfc\x25\x8f\xc3\xa9\xc8\x72\x5b\x95\x32\xa7\x32\x76\x74\x43\x03\x85\x9c\xe2\x90\x54\xe3\x96\x9c\xca\x0f\x3f\x38\x7f\xb7\x0c\x8d\x3b\xf7\x56\x07\x86\x15\xdb\xf4\x8d\x8d\x44\x10\x19\x21\xba\x8d\x75\x80\x87\x46\x50\x92\xcb\xd1\x2a\x33\x08\xdc\xaa\x98\xba\x17\xb7\xef\xdf\x24\x2b\x39\x64\xde\x22\x59\x2c\x17\xde\x97\xba\x66\x1f\x36\xa5\xdc\x84\x50\xd9\x93\x93\xc5\x50\x12\xc5\x85\xc8\x07\x94\xac\x03\xf3\x4a\xc9\x12\x94\x6f\x24\xd3\x81\xb3\x2d\xcc\xd8\x23\xca\xe8\x11\xad\xd5\x99\xf6\x08\x13\xc2\x41\x60\x17\x05\x30\x4f\x16\xf3\x44\x1e\xa8\x29\x9b\x26\x01\x66\x50\xe3\xe3\x96\xcb\xa6\x60\xc2\xa6\xdb\x1a\x30\xbc\x6a\xaa\xbf\x23\x46\x88\x17\x18\x94\x28\xda\xff\x52\x2f\x25\x12\x9b\x88\x20\x9c\xf3\x88\xfd\x4d\xa9\xed\x66\x02\xae\x3f\x5f\x88\xaf\xe1\x15\x79\x92\xcc\x31\x6a\xa2\x75\x70\xcb\x21\x47\xa1\x88\xf3\xd3\xf0\x77\xc7\xea\x64\x92\xcc\x9d\xcb\xe3\x24\x81\xca\x10\xa4\x3d\x8c\x2f\xb0\xd1\x5b\x11\x00\xed\x95\x53\x9b\xa9\x11\x59\x01\x93\xee\x32\x8a\x92\x4e\xf2\x1e\xc3\x68\x91\xf6\x63\xf3\x60\x08\x2b\x77\x1e\xcd\x33\xac\xff\x95\xc3\xc1\xde\xdc\x44\xc1\xc9\x62\x5d\x48\x25\x13\x09\x9d\x72\x14\xb4\x6e\xeb\x2c\x17\xf3\xb2\xac\xae\x44\x89\x67\x67\x2f\x5f\x1c\x27\x01\x24\x7f\xa2\x58\xd8\xf4\x97\x49\xc5\xe3\x00\x0d\x92\xc5\xda\x9e\x9c\xfc\xfb\x54\x55\x38\x4b\x06\xaa\x23\x77\x96\x08\xb2\x98\xe0\x4c\x95\xb7\xc4\xb5\x08\x06\xc9\x7c\xce\xe3\x49\xcd\x93\x10\x3d\x37\xd7\xd9\x34\x4c\xc5\x34\xb9\x1e\xaa\x04\x4f\x16\x1b\x39\xb9\x88\x31\x9f\x7a\x98\xb5\xd8\x68\x54\x95\xb5\x8e\xac\x4a\xe4\xf9\xcc\xf1\x4b\x9a\x26\x29\x05\x11\xd3\x2f\x29\xb8\x37\xe5\x74\xf5\xf3\xc9\x6f\x98\xe9\xde\x58\x28\xb4\x8a\x6f\xe6\x6f\x78\x96\x8b\x4a\x44\x63\x80\x0c\xc8\x52\x83\x91\x22\x10\x9f\xb0\xe3\xd5\x22\xbc\x4a\x72\x71\xc8\x4e\x62\xd4\x24\x88\xad\x11\x4e\x53\x72\xc4\x2d\x71\x9d\x8b\x18\x42\xfc\x88\xf8\x2a\x4c\x93\x18\xd2\x73\x41\xb6\x77\x2f\x8a\x30\xc6\x37\xc5\x8b\x7a\xa4\x3b\x7d\x2b\xf8\xe4\x11\x5b\xe8\xf0\x40\x2d\x26\xa1\x63\x72\x54\x17\x0c\xe6\xc8\x03\x72\xe4\xd1\x8a\xaf\xe1\xf2\x0e\xa9\xc2\x28\x50\x9c\xe2\xbc\x53\x48\xcc\x0e\x3c\x6d\x1c\x25\xc1\x65\xc6\x78\x10\x48\xf1\x5e\x52\x7d\x26\x82\x65\x1a\xe6\x6b\x96\x0a\x9e\x59\xd1\xd4\xee\x40\x5d\x79\xc2\x16\x80\x3c\x89\xa7\xd6\xed\x26\x41\x58\x39\x5b\x06\x81\x10\x13\xf7\x86\x06\x9f\x46\x69\x32\xbf\x17\xf1\xe9\x1d\x57\x45\x83\x00\xf2\x2b\x89\x50\x52\xe1\x4e\x1b\xa4\x82\x24\x9a\x88\x94\x04\xb9\x30\x0e\x92\x34\x15\x90\x55\x9a\xf2\x97\xb9\x34\x6a\xd1\x60\x81\x54\x21\x1e\x9b\xe0\x13\x79\x07\xc3\x61\x83\x3a\x51\x51\x64\xd9\x86\xc8\xa1\xd1\x41\x2a\x30\xd8\x9c\x94\x83\xec\xeb\x68\x71\xb5\x5e\x43\x46\xda\x2f\x0c\xfe\xcc\xd8\x7b\x9e\x86\xc9\x32\xc3\x3f\x05\x3c\x3c\xaa\xfb\x6b\x11\x4a\x49\x15\x8a\x20\x5a\x70\xa1\x44\x45\x0e\xfc\x56\x23\xd9\x2c\x53\xec\x09\x4f\x61\x2f\xc3\xef\xf5\x9b\x60\x8d\x93\xc9\x1a\x73\xb0\xd2\x35\x1c\x0a\x6a\x73\x1e\xa2\x82\xa2\x5e\xbe\xb4\xdb\x64\x80\x50\xcc\x0b\xc1\x44\x4c\xd9\x11\xab\x49\xc6\xd9\x90\x88\x8b\xa4\xf8\x52\x67\x47\x3f\x02\x2f\x85\x0c\xb4\x5a\xc9\xce\x7e\xc2\xc2\x43\x5d\x51\x89\x65\x84\xaa\x23\xa7\xf6\xe7\xcf\xcc\x2a\x97\xa7\x30\x2a\xb7\x55\x21\x6a\xb9\x50\xfa\x17\xe9\x05\xf2\x8f\x65\x26\x52\x2f\xa3\x80\x83\x56\x1e\x34\xa5\x51\xc9\x30\xb4\x9a\xa4\xaf\x0f\x82\xd2\x48\xe4\xfc\x52\xb0\x30\x47\x50\x93\x90\x88\x2b\x8c\xe1\x61\x17\x14\x28\x3c\x63\x59\xbe\x9c\x4e\xd5\x1d\x54\xd2\x5b\x26\x19\x5b\x7c\xa9\xc4\x4e\x4c\xe8\x0a\xc3\x22\x81\xc2\x93\x98\xf5\x0e\x6d\xc4\xab\x9b\xb1\x17\x06\x49\xec\x1d\xca\x51\xd1\xdc\x5b\xb2\xa4\xc1\x1c\xad\xec\x85\xc8\x8f\x79\xce\xdf\xa5\x11\xdd\x18\xb7\xc2\x39\xbf\x10\xd9\x96\xac\xdb\x3c\xe8\x7a\x75\xc8\xdd\xf1\x45\x65\x57\xcd\x49\x13\x61\x41\x85\xa2\x86\xba\xcb\xe9\x4d\x8a\x64\xa2\xb0\xff\x10\xff\x84\xb1\x29\x18\x74\x45\x95\x55\x54\x91\x1c\xdb\xb4\x45\xba\x92\xf7\x3c\xcd\x6a\x37\xeb\x44\x1a\xec\x6f\x1e\xb4\xf5\x0e\x11\xc6\x97\xba\x49\x04\x4b\xf7\x09\xbb\x51\x8d\x06\x4b\x98\x84\xe1\xc5\xad\x24\x0e\xa2\x30\xb8\x2c\x67\x86\x63\x6a\x56\x70\x16\x28\x51\x1b\x33\xdc\x44\x49\x26\x28\xcf\xe7\x53\x23\x15\xc4\x85\x43\x3f\xce\xf2\x74\x19\xe4\x20\x40\x4a\xd1\x83\xd4\x20\x52\xe2\x4a\x45\x90\x98\x53\xfe\x84\xe2\x38\x66\x5a\xf5\x0c\xc1\x29\x31\xc6\xd1\x62\x39\x8e\xc2\x40\xb2\xee\xc9\xd6\x0a\xd2\x75\xce\xc5\x7c\xac\xb6\xb9\x89\xc2\x89\x72\xc7\xc6\x07\x7b\xf3\xea\x67\x3d\xf7\x85\x99\x35\x92\x72\x1b\x12\x9c\x40\x75\x82\xbf\x96\x5b\xa9\xad\x5c\x14\x24\x1d\x89\xd4\x4a\xc8\xa8\x5e\xb9\xf4\x9b\x15\x94\xce\x94\xc8\x55\x21\x3d\xf5\x26\x70\xc0\x9b\xf8\xaf\x66\xb6\x15\xe3\xb9\x65\xf2\x92\x28\xbe\x0a\x01\xb2\xe1\x9d\x90\x60\xa5\x7c\x4b\x45\xf6\x87\x61\x85\x64\x5c\x0e\x92\xde\x26\x3c\xa8\xa3\xda\x8c\xee\x0b\xeb\xe1\x54\xcc\xa2\xe9\x28\xa2\x46\x92\xe4\x73\x0b\xd7\x10\x2b\x51\x13\xd7\x86\xa9\x06\x51\x12\x8b\xf2\x26\x52\x3b\xc3\xe9\xb1\x66\xa6\xdc\xb0\x27\xea\xde\x28\x4e\xe9\x25\x9e\x90\x80\x91\x0f\xed\x85\xd3\xe3\xd6\x81\x9c\x55\x82\x79\x6b\x84\x05\x8a\xb0\x11\x01\xd7\x41\x08\x21\x4f\x29\xde\x51\x6a\xd6\xef\x7f\x1b\x66\x2a\xef\x71\x89\x3d\x53\x09\xa7\x62\x29\x65\x71\x6b\xc3\x7a\xc2\xb7\x8a\x45\x05\xeb\xc5\x70\x5a\x31\x11\x33\xdb\x30\xa3\x68\xe5\x70\x36\x83\x3e\xfd\x8e\xd3\xdc\x04\xf2\x16\xb1\x6e\x9c\xe4\x33\x5d\x97\x98\x92\x4b\x25\x5b\x38\x95\xc6\x8d\x9e\x0e\x95\xc8\x84\x99\x64\xd5\xd8\x54\xd6\xc8\x16\x52\x6d\xac\xb2\x1f\x7e\x70\xb1\xba\x19\xad\x7a\xaf\xd0\xc3\xa9\x8e\xbc\xca\x73\x3b\xe1\x8e\x8d\x8f\xca\x47\x59\x9d\x74\x1a\x35\x09\x98\x4c\x3d\xa4\x77\xb8\x4d\xbc\xc9\x68\x71\x0d\xf4\x0d\xd8\xc8\x93\xd3\xd2\xcb\xae\x83\x0b\xef\xdc\xb4\xb3\xd2\x93\xd3\x7b\x3f\xf3\x1a\xa6\x8c\x06\x01\x09\xcf\xef\x74\x2e\xbd\x4d\x56\x83\x24\xfa\x7e\x27\x13\x8a\xce\xea\x4d\xde\xd1\xa1\x23\x0c\x8c\x10\x28\x40\x7e\xf6\x92\x2b\x91\x4e\xa3\x64\xe5\xb1\x71\xa8\x22\x89\x63\xce\x73\x54\x8a\xe3\x83\x24\xbd\x5b\x82\x66\x5c\x05\x78\x9f\xf1\x8c\x8d\x85\x88\xd9\x9c\x4f\xa0\xf2\x3c\x21\x02\xa5\x90\xf6\xf4\xe0\xae\xd2\x19\xe3\x4b\x3c\x99\xbb\x48\x40\x19\xbe\x4b\x30\x95\x11\x37\xcc\x74\xf6\xa4\x95\x60\x91\xe0\x95\xe0\xc8\xe6\x06\x92\x3c\xf3\x2c\xa7\xe2\x07\x3a\x36\x34\x81\x85\x67\xb3\x8c\x58\x99\x9a\xa4\x9c\x23\xde\xf9\xf0\x9d\x19\xa2\x4c\x13\x78\x39\x7a\x29\x43\x01\xd7\xa5\x61\xa0\x4e\x28\x5a\xe3\x23\x1c\x8f\xd7\x7a\xf2\xf2\x7a\x96\x86\x71\x0e\x1c\xd6\x32\x3d\x0c\x38\x65\x8b\x0f\xd2\xad\x08\xa2\x3e\x42\x54\xfc\x8d\x07\xa4\x5c\x2c\xc9\x23\xe4\xcf\xbb\x1c\x8c\x84\x04\xcb\x88\xe8\x86\x56\x9a\xa3\x24\x8b\xfc\x93\xc6\x81\xce\x9c\x4d\x9f\xd5\x22\xeb\xfd\x25\x31\x86\x44\xa9\xb6\x90\x5c\x6a\xd5\xde\xbd\x5b\x12\xf1\x5a\xfb\x26\x4d\x56\x0d\x1a\x5b\xc3\xe9\xd8\x62\xd5\x72\xb6\x47\x72\xce\x4f\x4d\xee\x5d\x98\xcc\x11\xb5\xd4\xe5\x7a\xd4\x47\xec\xe1\x43\x1b\xda\x26\x49\xc5\xa5\xfe\xbb\xca\x29\x6a\x19\xe4\x6a\x7e\xc5\x52\x00\x11\xfc\xeb\x2c\x87\xc5\xd9\x60\x4f\xfe\x93\x57\xe7\x2b\x24\x26\x9c\x87\x2b\x33\x11\xa9\x6d\x90\x9a\x68\xdd\xc1\xe1\x49\x33\xbe\x8d\x68\xb9\xab\xd4\x84\x0d\x6b\x0a\x2d\x0d\x1b\x1d\x0d\x17\x07\xd5\x42\xd4\x06\x72\xbc\x4d\x84\xa2\x01\x57\x4a\x17\x0a\x37\x77\x15\xa3\x4a\x93\xbf\x4d\x90\xc2\xf5\x87\x33\xbd\x92\x08\xe0\xcb\x66\x4a\x80\xcf\x95\x84\x50\x2d\x65\x15\xd7\xf5\xee\x72\x56\x19\x13\x9b\xc1\x7e\x8b\xac\x95\x26\xab\x2d\xb5\xe6\xb7\x4b\x5a\x25\x7c\xdf\x41\xd6\xaa\x19\xc4\x1b\xcc\x6b\x41\x4b\x61\xde\x41\xbd\xe5\x2c\xc1\x4a\x8b\x50\x58\x85\xca\x27\x83\x3f\x56\x2a\xab\x26\xfc\x9b\x64\xb2\x12\xde\x6e\x95\xca\x6a\x4a\x2c\xc3\xa6\x96\x60\x26\x7b\x77\xc5\x32\x1a\x87\x2a\xdc\x88\x3a\x90\xdb\xea\x95\xb9\xc2\x5c\xdb\xb7\x4f\xd3\x94\xcf\xc5\xff\x31\x0b\xb8\xa9\x6d\xfb\x36\x82\x7c\x3e\x93\x94\x4f\xb5\xc5\x35\xf8\x39\x4f\x79\x60\xf2\x88\x3a\x66\x35\x72\xc1\x39\x83\x64\x6a\x60\x67\xb6\x66\x93\x90\x47\xc9\x45\xd1\x90\x03\x52\xd4\x4b\x41\x2c\xf7\xe8\x15\xc1\x06\xd3\xfc\x11\x5b\xb1\x88\xaf\x45\xda\x62\xec\x2c\xd1\x86\x17\x0c\xde\xf4\x31\xf7\x81\xf0\xa2\x08\xd3\x16\x50\x46\xcf\x00\xd5\xd3\xcd\x1f\xf5\x80\x34\x04\x89\x20\x08\x23\x8f\x3b\x3b\x61\x53\x1e\x84\x51\x28\x05\x40\x3c\x32\x0a\x2d\xf5\x18\x92\x94\x34\x87\xa6\x0e\x7d\x91\x7f\x2f\xe3\x82\xae\xf8\x84\x85\x73\x7e\x81\x4e\x08\x5a\xe0\x86\x8e\xd1\xfc\x92\x65\xe1\x45\x0c\x9a\x31\x78\x32\x20\x1b\x2c\x93\x37\xb4\xe5\x04\xef\xd7\x57\x06\xd2\x4e\x03\xc9\x69\x2d\x33\xbe\xa8\xa9\x11\x17\x58\xa4\x46\xc1\xdf\x5c\xe3\x1e\x7c\x66\x58\x70\x78\x0e\xd3\x95\xf0\x08\xb1\xa5\x95\x65\x1a\xb9\xf9\x43\x65\x41\x9e\xb0\x28\xe1\x9a\xb4\x70\x07\x58\x8d\x40\x04\x20\x7d\xa9\x56\x97\x6b\x01\x47\x7d\x51\xe3\xc7\xe6\x0c\x12\x78\xe8\x80\xe1\xae\x3c\x33\x82\x09\xdb\x9c\x93\x46\xdc\x90\xe3\x69\xd8\x1d\x5a\x07\x98\xaa\xf4\x49\x9e\x46\xf4\xbb\x3e\xa9\x26\xe1\x95\x5d\x0e\x7f\xeb\x8f\x72\x92\x47\x12\xb4\x39\xd8\xb4\xfa\xd7\x9e\xdc\xe7\xcf\xa0\xa4\xa6\x3a\x21\xcc\xe4\x93\x36\x7b\xd4\x07\x26\x26\x78\x4d\x4b\x5f\x48\x45\x3f\x98\xf1\x38\x16\x91\xf9\x6c\x31\xe9\x67\x98\x78\x96\x6a\x5a\xe9\xea\x42\x8d\x75\x07\x49\x16\xdf\x4c\x62\xb2\xc4\xfb\x64\x63\x8e\x0c\x54\xb2\x55\x08\xaf\x35\xa2\x05\x59\x8d\x63\x6e\x6c\x80\x40\x2b\xee\x85\x8b\xa0\x19\xc6\x61\xde\x4c\x2e\xbd\x43\xf3\x2a\xff\x01\x5e\xf9\x95\xe8\x96\x2d\x12\xc9\x77\xf8\x14\xdc\x5c\x21\xcd\x0e\xdc\xf0\xe6\x4c\x35\x07\x5e\x00\xf6\x6c\xd3\x30\x0e\xb3\x99\x7a\xbf\x87\xf9\xcb\xea\x8a\x20\x4f\xe2\x69\xf2\xa9\x56\x7f\xea\x38\x9a\x3c\xb5\x06\xa4\xb7\x64\x18\x4f\x93\xaf\x1c\x95\x03\x63\xd3\xd0\x24\xbf\x9f\x25\x2b\xa4\x4d\xf8\x02\x49\x11\xf9\x5c\x34\x54\x93\x98\xa5\x62\x1c\xca\x5b\xec\x32\xd5\x0f\x2d\x98\x23\x38\xa5\x5b\xa9\x01\x16\xd0\x63\x08\x1b\x8b\x28\x59\x39\x08\x30\xa4\xd1\x02\x4e\xde\x52\xe6\xb0\x47\xcc\x9b\x46\xe2\x5a\x9b\x24\x55\x91\x4b\x6b\x91\xa4\xb9\xdf\x4a\xe2\xb9\x36\xb8\x44\x52\x55\xeb\x8e\xe6\x0d\xb2\xac\xee\xc0\x49\xe2\x17\x09\x9f\x54\xe3\x9a\xde\x51\x14\x6e\xc1\xc5\x33\x12\xad\x28\xb9\xa8\x79\xef\x62\xb4\x6c\x54\xfd\x01\x2d\x02\x62\x0e\xbd\x06\x43\x4a\xaa\x00\xea\xbe\xb2\xc1\x53\x7d\xc6\x02\x78\xec\x93\xe7\x59\x8a\x69\x8e\xc3\xac\xc1\x4e\xd8\xc5\x52\x64\xfa\x79\xf4\x24\x87\x5c\x50\xb1\xa7\xed\x8a\x30\x97\xf8\x02\x8e\xbc\x2c\x17\x31\xe4\x23\x90\x77\xf2\x13\x6f\x4e\xf6\x47\xca\x86\x12\x5f\x13\xdd\xe4\x4f\x33\x91\x0a\x75\xdc\x2c\xd2\x64\xcc\xc7\x11\xe4\x07\xcc\x71\xd5\xb2\x85\xe0\x97\xe6\x81\x28\x4f\x60\x79\x91\x47\x66\x77\xda\x69\x05\x11\xa5\xbc\x8f\x71\xd7\x32\x5c\x01\xcc\x05\x7d\x33\x60\x59\xef\x53\x59\xf2\xd9\xc4\x3e\xc4\x8a\xbd\x74\x4a\x71\x95\xbf\x8a\x7c\x3e\x15\xe8\xe7\x06\x20\xe0\xc2\x60\x75\x45\x9c\xb0\x45\x19\x8f\xc8\xda\x66\x91\x64\x39\xc1\x56\xa9\xec\xff\x26\x19\xcf\xa1\xe1\x36\x5e\x83\xf1\xf4\xe2\xea\x90\x9d\xff\x8d\x7a\x7a\x93\xa4\xf9\xe1\xe6\xbe\x3b\x5f\x3e\x7e\x69\xd8\xc4\x0d\xe7\xc1\xf9\xe6\xfa\x1f\x5d\x21\x58\xd1\xe3\x9c\xaf\x5d\x6a\xbc\x7d\x59\x36\x2f\xf6\x29\xe4\xc5\x73\x64\x19\x60\x38\x96\xdd\xfb\xdd\x58\x78\x89\x41\x96\x29\x01\x5f\xed\x2e\x44\xde\x0b\x02\xb1\xc8\x5f\xf0\xf8\x62\x29\x4f\x8a\x9a\xae\x17\xa9\x22\x63\xaf\x05\x13\xb4\x97\xc3\xe5\xae\x5e\x83\x9d\x5b\xd9\x9b\xb9\x0b\xf9\x90\x69\x88\x96\x25\xf0\x34\x49\x05\x9a\xb5\x0d\x92\x28\x49\x0f\x0b\x47\xb0\x1c\xe1\xc8\xad\x52\xab\x5b\xcd\x8d\x55\xdc\xc6\xe6\x7d\xb7\x8a\xd3\x1c\x95\x77\x1b\x9b\x0e\xcc\x67\xa7\xd9\x34\x41\x0b\xac\xea\xd1\xe2\xb7\x52\x83\x11\x9f\x87\xd1\x7a\x53\x13\xfc\x5a\x98\x5b\x26\xde\xbd\x7d\x71\x68\xd6\xea\xdd\xdb\x17\x35\x6f\xcb\xab\x5b\xd7\x8f\x2f\x1f\xf5\x1f\xca\xec\xcc\xda\x7f\x2e\xd1\xbe\xcb\x44\xca\xe0\xd9\x94\x14\xaa\xf0\x20\x2a\x19\x61\x0e\x46\xbf\x46\xac\x82\x6c\xfd\xa9\x16\x4d\x37\x13\xf4\x40\x42\x18\x20\xc8\x4d\xfc\x46\x3f\xbb\x3a\xfb\x27\xc9\x48\xc8\xbd\x95\x9a\x71\x94\x25\xd8\xf8\x44\x5d\x90\x94\x3e\x7f\x66\xc5\xb2\x16\x72\xe2\x57\xc9\x44\xd4\x0b\x87\x4c\x59\xd4\xb2\x2a\xb7\x52\x31\x4f\xae\xc4\x60\x16\x46\x88\x4d\xab\x9a\x61\x59\x84\x02\x35\xbd\x6f\xe4\x0f\x83\x8a\xa9\x16\x18\x04\xe3\xf7\xe7\x07\xd6\x96\xb5\x81\xc7\x28\x9b\xa4\x17\x57\x45\x8c\x16\x58\x20\xd9\x00\x80\x59\x8d\x3c\x2b\x86\x69\x9a\xa4\x35\x4f\x81\x0c\xb0\x9a\x36\xe6\x15\x39\x5b\x2e\x5a\x5e\xdd\x20\xb8\x9a\xfd\xdb\x9c\x84\x38\xba\x19\xd2\x21\xfc\xff\xa5\xa0\x17\x53\x02\xd6\xbb\x13\xba\x07\xd8\x04\xa4\xfc\x05\xe8\xb4\xcc\xd2\x40\x0d\x49\x5e\x3b\x04\x39\x24\x91\x71\x16\x1a\x9a\x6a\xb7\x80\x1b\xd9\xe9\x0c\x34\x53\x05\xfa\x03\x47\x58\x11\x4d\xe9\x00\x7c\xea\x5a\xd0\x2f\x72\x42\x2f\x49\x46\xef\x79\xb4\x74\x8c\xbc\xe5\x57\x79\x13\x92\x20\xd4\x35\xa1\xe0\x2e\x6d\x7f\x3a\x97\xf5\x3f\x3e\x7d\xe0\x18\x57\x59\xa0\x9f\xda\x16\x1f\xc5\x61\x81\xf9\x7e\x61\xa7\x18\xed\x50\xd5\x46\x51\x32\x3d\xc9\x71\x02\x17\x1c\xef\x53\x3c\x4a\x05\x9f\xac\xd9\x55\x98\x85\xe3\x88\xec\xb8\x5c\xc9\x8d\xc6\x31\x13\x7c\x22\x52\x6d\x97\xe9\xf9\xdd\x85\x94\x4d\x95\x8d\x50\x78\x45\xd6\x07\x15\xc6\xad\x35\x7d\xdb\x32\xd6\x21\xea\x89\x56\x22\xd7\x83\x3f\xbc\x06\xeb\xee\xa0\xbd\x2d\xf6\x47\x3d\x41\x0d\xfc\xcb\x6b\xb0\x9d\x7d\x53\x25\xc2\x3c\xf3\x35\xea\x9c\xde\xe0\x9a\x8c\x3c\x9c\xb7\xd0\xd3\x1c\xcc\x66\x92\x85\x5d\x91\x60\x37\xb5\x11\x00\x54\x55\x53\x51\x76\x77\x47\x45\xf6\xae\xbe\x7c\xd2\x75\x35\xc2\x55\x65\xe7\xa2\xa7\x6d\x71\x02\xb0\x2b\x1b\xe2\xb5\xb6\xe6\x4d\xc2\x2b\x44\xb4\xae\x4d\xa2\x7f\x90\x65\xe0\x1c\x75\xc4\x94\x70\xe4\xa9\x1c\xcc\x87\x8c\x8f\x21\x45\xad\x78\x6a\x74\x56\x1e\xdd\x15\x0e\x59\x9c\xc4\xce\x07\x79\x73\x68\xa2\x18\x0b\x8d\x49\x47\x6b\xd5\xc8\x93\xc5\x21\xf3\xdb\xff\x6e\x97\x49\x84\x1e\xb2\x1d\xa7\x0c\x90\x79\xc8\x0e\xdc\x9a\x88\xb8\x43\xb6\xef\x16\xcf\xc3\xb8\xa9\x3e\x75\x0a\x9f\xf8\x75\x73\x43\xab\x71\x72\xdd\xcc\x66\x7c\x92\xac\x0e\x59\x9b\xb5\x59\x67\x71\x6d\xb4\x75\x37\x8b\x0f\xec\x09\xf3\x5c\x50\xe9\x44\xa4\x87\xf7\x05\xc1\xb2\x24\x0a\x27\x4f\x89\xcd\xc9\x2d\x06\xca\x5d\xcb\x6e\xf1\x15\x64\x8f\xd4\x0a\x0b\xfb\xb4\x6d\xb0\x2c\x61\xb1\xfb\x5d\x79\x61\xc2\xa6\xa1\x2c\xc7\x2d\xed\x59\x40\xc5\x77\xa0\x10\x46\x75\x37\x12\x88\x4d\x04\x72\xd1\x9f\xda\x1a\x4d\x8f\x92\x1f\x37\x49\x08\xc7\x2a\x4d\x11\x4f\xdc\x6a\x6a\x5d\x24\xc6\x9c\x7d\xee\x62\x57\xe2\x57\x0b\x60\xcd\x00\x25\xad\xaf\x5b\x28\xc6\xbc\x1b\xdb\x97\x04\xbd\x72\x7b\x29\x87\x35\x33\x90\xdc\x24\x2f\xaa\xf8\x38\x25\x29\x6d\xd3\x10\x8d\xa4\x46\xb8\x36\xfb\x11\x54\x70\x13\x94\x17\x10\x23\x75\xe2\xd7\x72\xfd\x48\xca\xba\xd3\xfa\x61\xdd\x56\x26\xf2\x5e\x4e\x59\x46\x6b\x5e\x9a\x44\xe0\x76\x8d\x1f\x8b\x55\x37\x2f\xf5\x9c\xa7\x17\x61\xdc\x84\xbd\xdb\xdc\x2e\x4e\x9a\xbe\xa6\xb8\x98\xa5\xcf\x28\x20\x1f\xb2\x45\x02\xba\xdb\xa7\x85\x6e\x73\x71\x9d\x0f\x90\x4e\xc8\xd5\x91\x77\xa6\x9e\x53\x85\x4f\x26\x43\x79\x5f\x7d\x41\x37\xef\x9a\x07\x12\xa8\xd7\x70\xe4\x27\x25\x42\xba\xb2\xab\x45\xcb\x36\x72\x11\x72\xdd\x39\x6a\xe8\xcc\x3f\x2a\xaa\xd4\x36\x61\x1b\x6b\x78\x64\xec\x08\x07\x7e\x12\x47\x78\x3d\xb3\xb4\x1d\xc5\xcb\x2c\x55\xdd\xc8\x7a\x37\xed\x2b\x60\xae\x87\xcc\xaf\xe0\x92\xe0\x32\xec\x00\x77\x96\x3d\x4b\x03\x85\xab\x65\x1a\xdd\x50\x4f\xf0\x79\x24\xb2\x4c\x56\x4e\x97\xa2\x70\x56\xd8\xe8\xc3\xe6\x96\x74\x26\x4f\x59\xa7\x86\x6e\x77\xa7\x97\x8c\x4b\xb1\x46\xe7\x87\xff\x3b\x8f\x19\x28\x90\x3c\x57\x13\x7b\x2e\xd6\x2f\xf9\xc2\x7e\xdc\x50\x9f\x94\xf6\x4e\x89\x9f\x83\x24\xc6\x5c\x95\x49\xfc\x5c\xac\x1f\xa3\xaa\x06\xd3\x9d\xa2\x87\xa8\xfc\xf2\xfe\xec\xb9\x58\x67\x79\x9a\x5c\x0a\x75\xeb\xe2\x59\x96\x04\x21\xcf\x31\x55\xbb\xab\x73\xb7\xd4\xeb\x78\x09\x10\xf0\x6c\x71\xc8\xce\xff\xeb\x6c\xf8\xf6\xe5\x47\xc6\x25\xf6\xc8\xd3\x1a\xe6\x7a\x95\xb7\x7e\x2b\x79\x0b\x54\x29\xf2\x0b\x5d\x58\xc3\x50\xef\xe3\x61\xc6\xf4\xfa\x5a\x22\xb2\x9e\x7f\x85\x72\xdd\x04\xf5\x33\x4f\x05\x57\x39\x3e\xfe\x2c\x52\x41\xe1\xe5\x1c\xe6\xea\x68\xda\x4d\x63\xed\xdb\x21\xbc\x54\x7b\xe1\x44\x6b\x16\xf0\x45\x8e\x5e\xbc\x6a\x6c\x0a\xd1\xd3\xc4\x00\x57\xdf\x68\xcf\x1b\x3d\xb9\xd5\x81\x6c\xa5\xd6\x30\xc3\xb8\x79\x26\x91\x39\x20\x53\x2b\x6f\xc3\x94\x8d\x81\x98\x94\x62\x36\x6b\xb0\x8c\x5f\xc9\x15\x93\xe0\xb2\x04\x95\xc2\x48\x7a\x6c\x19\xc3\x23\x25\x78\x1c\x53\xce\x66\x79\x9b\x74\x58\x61\x03\x1f\x70\x28\x22\xd9\x44\x0f\x5c\x8d\xe7\x93\xce\x30\xc3\xd8\xb9\x07\xf6\xcc\xc9\x32\x37\x9c\x73\x24\x4b\x5e\x2f\x73\x9b\x49\x7d\x6c\xe8\x06\x97\x62\x3d\x49\x56\xb1\xa9\xff\x5c\xac\x8f\x93\x55\xbc\xb9\xfa\x22\x25\x06\xa2\xeb\xbf\x91\x25\x9b\x1b\x2c\x17\x4e\xed\x77\x8b\x0d\x55\xe5\x39\x71\x12\x2f\xec\xc1\x9f\xa9\x22\xa7\xc9\x03\xc6\xf0\x92\x03\xfb\x8c\xd1\x85\x4e\xf9\x5f\x5d\x8a\x35\x9b\xf3\x05\x08\x45\x8f\xb7\xac\x75\x7e\xc9\x17\xa4\xc6\xac\xdc\xb9\x8a\x7f\xab\x16\xb2\xc3\x30\xbe\xc8\xaa\xdb\xf4\xe9\xab\xd5\x4a\x8f\x46\xca\xcc\x87\xec\x38\xcc\x20\x68\x23\x8f\xd7\xac\x17\xe5\x3f\xa7\x2c\x15\x11\xec\x9a\xf9\x32\xbe\x50\x5e\xc3\x8f\x59\x90\xa7\x51\x93\x47\xf9\x21\xeb\x41\x0a\x5b\x36\xc8\xd3\xe8\x49\x2f\xca\xd9\x5c\xf0\x38\xc3\xb6\x54\x57\xca\xd1\x4e\x5d\xb8\xa9\x54\xd7\x05\x96\xe9\x54\x46\x86\x5b\x59\x5b\xe3\x89\xcb\xb2\x97\x92\x8d\x2a\x27\x68\x77\x6e\x27\x53\x38\x39\x1a\xec\x74\x16\x4e\xf3\xe6\x49\x9c\x89\x94\x9e\x3d\xa7\x10\x69\x64\x06\x0f\xaf\x4a\xed\xa0\x5c\x98\x20\x23\x35\x78\xf4\xb4\x34\x1c\x90\x84\x21\xe3\xbe\x5c\x33\x62\x75\x00\x69\x0c\x7a\x75\x6d\x83\x37\x4b\xc0\xba\xcd\x1e\x66\x26\x7b\xc7\xce\xd1\xff\xeb\x88\x22\xdb\x56\x8e\x75\x96\xcc\xc5\x96\x00\x23\xe3\x28\xd2\x81\x2c\x9d\x67\xe5\x0c\x42\x1b\x8c\x79\x8a\x11\x56\x24\x78\xdd\x0c\xa1\x41\x5b\xf5\xdc\xc3\xde\x9f\xc9\x41\xcb\xf3\x26\x6b\x31\x3d\x1b\x7c\xbf\xd1\xdd\x65\xa0\xab\x7d\x7f\x06\xe7\x52\x86\xb6\x43\x12\x94\x0b\x9e\xfa\xce\x0a\x53\x94\x9f\xe5\x11\x80\x41\x17\xac\xac\xbe\xd6\x0c\x4f\xe1\xaa\x9d\x31\x3e\x4e\xae\x44\x83\x5c\x99\xe0\xae\xb0\xe0\x17\x82\x2d\x17\x5b\xf0\x53\xee\xf0\x02\x74\x59\x7e\x1b\x74\x8d\x3f\x49\x91\xcd\x37\xd1\x32\xdb\x7a\x19\xc6\xcb\x6c\xeb\x2f\x22\x4d\x14\x1a\x33\x88\xa0\x52\x5a\x55\x68\x82\x34\x72\x63\x43\xaa\x09\x9f\x09\x5f\xbf\x7e\x6a\x20\x34\xd3\x2d\xb4\x9b\x24\x3a\x98\xa2\x3b\x17\xb9\x83\x64\x35\x00\x22\xab\xfe\x25\x49\xe6\x95\x14\x01\x5b\x6b\x80\x41\x54\x32\x70\x6b\x83\xf9\x51\xbf\x03\x49\x70\x92\xd8\xe4\x17\xe3\xda\x45\xcd\x60\x32\x4f\x06\x95\x95\x11\x8c\x01\x6b\x35\x76\x46\x39\x00\x6f\xd1\x4a\x64\x43\x1f\xef\x71\x8f\x94\x87\xf6\xfe\x0e\x43\x7b\x5f\x59\x19\xc1\x18\xb0\x9b\x86\xf6\x5e\xed\xa3\x8a\xb1\x0d\x21\x24\xcb\xd6\x44\x71\xb4\xc5\x22\x52\xe1\x54\xe4\x81\xc0\x27\x08\x4f\xf1\xe2\x30\x23\x4b\x04\x32\x9e\xe6\x6b\x16\x2f\xe7\x22\x0d\x03\xd8\xe8\x70\x7c\xc2\xfe\xd6\x0f\xce\x96\xf4\xe0\x30\x23\xd3\xd1\x73\xe8\xe7\x4e\xc3\x03\x51\xc9\x1a\xa2\x36\xbe\x9d\x88\x5b\xc7\x49\x75\xbf\x7a\x98\xf8\x18\x70\xcb\x76\x02\xc6\x28\x65\x03\x88\xe8\x44\x31\x5a\x80\xb3\xf4\x4f\x59\xcd\xfb\xe5\xba\xbd\xef\x35\x18\xbf\xe4\xec\xd7\x67\xf5\x16\xc3\x84\xfd\xab\x30\x13\x08\xc7\x6d\x2e\x8f\x3b\x1b\x84\xf7\xcb\xf5\xde\xd4\x2b\x8c\x50\x57\x87\xd7\xa3\xbe\x6e\x5c\x39\x4e\x8c\x67\x16\x24\x13\x0c\xa7\x04\x2a\x50\xc9\x52\x26\x3c\xe7\xb7\xf1\x65\x6d\xa6\x3c\x54\x00\x8e\x98\xb7\xcc\xa7\xcd\xfd\xc2\x39\x72\x2a\x72\x93\xf7\x1c\x3c\x0a\x73\x8e\x73\x01\x1a\xe6\x2c\x12\x1c\xda\x8b\x2c\xe0\x0b\xc1\x92\x54\x6e\xfe\x42\x6f\xb2\x11\xcc\x68\x88\x95\xaa\xb6\xbc\xdd\x91\xac\xdf\x7c\x8f\x81\x03\x94\xc9\x78\x52\x35\x0d\xf9\xf1\xa5\xc8\xf9\xfb\x6a\x2e\xa2\x18\x98\x52\x34\xf3\x08\xc5\x0e\xb0\x2e\x97\x62\x99\xb3\x21\x68\x0a\x2d\xfc\x47\xfa\xf9\x98\x0d\x4f\x07\x10\xfc\x28\xbc\xa6\xad\x8c\x61\xad\x5b\xaa\x5e\x6f\x32\x61\x7e\x67\x5f\x21\x7b\x19\xc3\xa9\x21\x26\x56\x40\x56\x9e\x49\x41\xfe\x9a\x22\x71\x01\x0c\x3a\x70\x9b\x97\x62\xdd\x6a\xb1\x0f\x3c\xcc\xb5\xea\x48\xc9\x6e\x24\xd0\xc2\x39\x27\x04\x5b\x29\x03\x60\x75\x56\x67\x7c\x9d\x29\x70\xee\xbf\x1a\xec\x99\x15\x38\x3e\xae\x92\xf4\x92\xad\x44\x14\xc9\xdb\xc9\x22\xe2\x39\xc4\x18\xa6\x20\x2c\x16\xb8\x4a\x40\x6c\x21\x52\xac\xcf\xb5\x77\x25\x37\x49\x12\x20\xc0\x19\x07\x8f\xcb\xbf\x2e\xe5\x85\x25\x6b\xd5\x8b\x3b\x97\x9c\x31\x31\xe2\xd4\x9c\xe7\x60\x1a\x0f\xa2\xb2\x6c\x18\x66\x6c\x12\x66\x79\x18\x07\xb4\x7d\x81\xbe\x6a\x3c\xca\x4f\x60\x61\x59\x98\x21\x2c\x64\x87\xf5\x92\x10\x04\x64\xf5\x41\xa2\xe6\x88\x79\xb8\x80\xb7\x50\xb0\x22\x02\x1e\xc8\xbb\x5c\x06\x4f\x30\x48\xd3\x0d\xdb\x79\x78\x91\x26\x93\x25\x84\xef\x86\xe5\x26\x19\xd0\x89\xe4\xad\xe7\x99\x2e\xe1\xfd\x06\x23\x62\x35\x94\x88\x01\x81\xcd\xb0\x44\x5e\x55\x64\x01\x5f\xe6\x09\x86\x3f\x31\xd6\xbe\x6a\x4d\xca\x02\x1e\xa1\xe0\x16\x26\x95\x82\x99\x65\x42\x61\x55\xd8\xf1\xf0\x05\x4c\x8f\xee\x50\x3a\xc8\x1c\x60\x97\x47\x79\xd3\xb0\xa4\x24\xa6\x7d\x82\x81\x3d\x5e\x9f\xb2\x2b\x32\x2e\xe2\x00\x5c\xc3\x02\x72\xb4\x67\x6c\xb4\x73\x87\xac\x47\x16\x7b\xe1\x1c\xc3\xcf\xa5\xa1\x5c\xef\x86\x9c\x9a\x06\xdc\x28\xf4\x1c\x66\x52\xf4\x5f\x08\x92\xb3\xf2\x44\x76\xd5\x62\xa7\xb2\xf6\x32\x93\x14\x32\xe7\x6b\x29\x5e\xce\xf8\x62\xb1\x36\xd7\x57\x34\xf4\x00\x53\x5b\x5d\x65\x9a\x2e\xb3\x3c\xc5\xdb\x36\x53\x61\xf5\xc2\xdc\xcb\x58\x38\x5f\x24\x19\x3c\x6b\x00\x7e\x12\xe4\x2b\x7a\x14\x2d\x40\x22\xf9\x13\xd3\xe2\x65\x78\x4b\x96\xfb\x9d\x84\x9b\x15\x7c\x07\x8c\x84\xc1\x25\xec\x72\xb9\x99\x5c\x0c\xe1\x7e\x2d\xa3\xf8\x50\xe3\xd8\x29\x6e\x48\xa8\x24\xa7\x0a\x87\x28\x2f\x12\x10\x02\x1b\x28\xa0\x5e\x88\x9c\x71\xd5\x07\x0a\xde\xf6\x1c\xc9\x21\x47\x2d\x32\x6e\xa7\x38\xc9\x71\xbd\xc4\xa4\x05\xea\x85\x59\x9e\x2f\xb2\xc3\xad\xad\x20\x1d\x2f\x2f\x5a\x41\x32\xdf\xf2\xf7\x76\x76\xfc\x36\x2b\x13\x9c\x3e\x70\x90\xf2\x6e\x39\x7f\xde\x11\x5f\xbe\x14\x62\xc1\xf2\x94\x07\x97\xca\x34\x54\x5d\xf1\xe4\xa4\xe1\xac\xc8\x21\x14\x93\xf6\x28\x8a\x45\x20\xb2\x0c\x72\xae\x24\xa9\x39\x2c\x6f\x1a\x81\x09\x3f\x87\x42\x34\xb0\x45\xc5\x31\xf5\x65\x08\x61\x99\xba\x60\xee\x89\x76\xa6\x9c\x8d\xc3\x7c\xce\x17\x48\x4c\xc8\xfe\xc6\x61\xce\xd4\xfb\x4a\xc6\x20\xe6\x40\xb6\x48\xe2\x89\x65\xbe\xf5\x98\x3d\x8a\x12\x94\x19\x1e\x49\x9e\xb0\x10\x69\xbe\x56\xf3\xd4\xfb\xac\x8c\x4a\x75\xdd\x16\x13\x1d\xc4\xb9\x42\x5e\xd7\x1b\x6f\x2e\x26\x21\x47\x71\x46\xdd\xac\x70\x83\xd0\x50\xc2\x94\x8d\x00\x95\xe2\xaf\xcb\xf0\x8a\x47\xba\x4f\x36\x6c\x5d\xb4\xd8\x23\x89\xa8\x47\x15\x4d\x47\x7e\xcb\x16\xf6\xb1\x3f\x32\x7e\x05\x63\x24\x75\xab\x2b\x9d\xd8\x93\x90\xcb\x7b\x47\x2f\x15\x23\xf9\xb3\x9a\x04\x9e\x25\x11\x19\xb9\x2c\x52\x71\x05\x21\x10\x34\xbf\x9f\x32\x87\x3d\x03\xcb\x3f\x1e\x0e\x4e\x87\x67\x0c\x92\x98\xa3\x67\xd9\xa4\x05\x2e\x5f\x08\xee\x78\x38\x78\x7b\xea\x7e\x6e\xb8\x50\xb4\x28\x38\x01\xd1\x4a\xfb\x05\xa0\x5a\x07\x56\x9a\xee\xf6\x4b\xd0\xd6\x24\xcb\x92\xc8\x40\x03\xed\x59\x60\x2b\xad\x2e\x4f\x29\xf2\x3b\x20\x0a\x82\x48\xa0\xc0\x39\x80\x3b\x22\x04\x2e\xd4\x0a\xab\x88\xaf\xb1\xa7\x92\x4e\x4d\xfe\xd2\x0b\xec\xb0\x01\x46\x3c\x91\xf7\x70\x39\x1c\x11\xe7\xc7\xea\x70\x95\x87\x7d\x9e\x2c\xde\xa4\xc9\x82\x5f\xd8\x91\x10\x51\x77\x67\xc9\x04\x74\xc7\x42\x58\xc2\xb9\x2c\x0c\x7a\xaf\x06\x43\x6d\x6b\x42\xca\xf2\x78\x39\xaf\x79\xf8\xc5\xab\x37\x0a\x92\xa4\xe4\x79\xea\xa8\xb7\x43\x29\x18\x73\xee\xc0\x89\xca\x28\xc5\x16\xb8\x4e\x43\x4c\x26\xd4\xc8\x22\x2c\x15\x3c\x49\xb5\x20\x85\x5b\x41\x7d\xa0\xfd\x0c\x40\xdf\x90\x86\x31\x26\xce\x80\x43\x58\x83\xb2\xb3\xa7\x6c\xd0\x36\x38\x63\x48\x62\xa1\x76\xe6\x3c\x99\x84\xd3\x50\x49\x35\x38\x94\xac\x51\x08\x2f\x2a\x81\xd2\xac\x29\x54\x87\x1c\xb9\x1e\x38\x98\x8e\xd6\xe8\x08\x59\xd7\x35\x1f\xc7\xb8\xfd\x61\xee\xc8\x8e\x4d\x75\x98\x10\x10\x25\x11\x61\x64\x5f\x0a\x52\x31\x38\x3d\x69\x50\x98\x20\xfa\xaa\x26\xc6\xc1\x6b\x4d\x1d\x61\x8c\xa1\xc3\x25\xf8\x66\x3a\xf3\x31\x11\x46\xa4\xe8\x32\x11\x59\x90\x86\x63\x9c\xbd\x52\x20\x2b\x83\x6c\x0c\x9a\xa9\xc0\xa9\xbc\x24\xf2\xd3\xa3\x37\x83\xe6\x29\xe8\xd9\x47\xca\xc4\x41\x6e\xf1\x47\x2c\xc3\xd7\xe2\xea\x89\x29\x75\x0c\x09\xd0\xf2\x98\xd2\x8b\x2b\xcb\x36\x2c\xa9\x89\x5e\xaa\x07\xa3\x5a\x2d\x17\x0b\x91\x82\x61\x2f\x05\x34\x56\x03\x34\x32\xf4\xa5\x58\x07\x1c\x42\xc1\x91\x93\x81\x06\xd2\xdd\x61\x35\x4c\xdb\xe2\xfd\x87\x57\x07\x98\x07\xbb\xba\xe8\x93\x57\xa7\x33\xf4\xa6\x8e\x34\xb0\x52\x87\x73\xd0\x73\x74\x77\x30\x58\x6e\x9c\xab\x83\x64\xce\x2f\x45\xc6\xbc\x5f\xff\xc3\xd3\xb7\xb8\x76\xdb\x33\x1a\x23\xc6\x98\xf7\xeb\x27\xf3\xd1\x9f\x7a\x2d\xc6\x6a\xaf\x12\xe5\x37\x2b\x69\x74\x16\x5e\xa0\x30\xca\x73\xd6\xbe\xf6\xa7\xb2\x93\xf6\x75\xa7\x6d\x4e\x48\xb3\x6e\xb0\x92\x69\x96\x5b\x18\xc5\x29\x42\x80\x5e\x47\xdc\x36\x4b\x65\xdd\x73\xee\xbd\x4c\x80\x35\xa7\x7f\x0c\x05\xac\x8e\x76\x3b\xd1\x98\x42\xda\x72\xc1\xc6\x6b\x79\x09\x2a\x53\xce\x1c\x85\x78\x33\x8e\x20\x89\xa7\xe1\xc5\x32\xc5\xf3\x29\xa3\x4b\x16\x4a\xee\x0d\x40\xd9\xd8\x73\xf6\xbb\x1e\x0b\x85\x40\x2d\xef\x54\xc3\xbc\x84\x75\xe5\x3f\x1e\x8e\x7a\xef\x5e\x9c\x55\x71\x41\xfa\x54\x64\x83\x03\x74\xd8\x75\xa3\xc3\x26\x2c\x59\xe4\xf2\x1c\x81\x40\xc9\xea\x2c\x70\x4e\x7f\x73\x6f\x88\xf0\xf0\xb3\xee\xff\x74\x57\x9b\x08\x60\x38\xf9\x4c\xf3\x0d\x39\xc4\x37\xbd\xd3\xd3\xaa\xf1\xc9\xf2\xe2\xe0\x48\x83\x6b\x08\x02\x63\x4a\x49\x69\xc5\xac\x89\x91\x4b\x06\x7c\xd1\x30\x77\x0c\x81\x8a\xd8\xe7\x62\xdd\x32\xba\x03\x39\x7e\x85\x68\xba\x0e\x23\x17\xa5\xa7\x05\x7c\x2c\x11\x2d\xf7\x88\xaa\xd5\x55\x23\x62\xd2\xca\xe2\x4a\x2f\xfc\x49\x4e\x87\xf7\x74\x19\x91\x77\x3b\xb1\xaf\x89\xba\x78\x41\xd0\x57\x94\xc1\xc2\x9c\x49\x31\x29\xce\x43\xc8\xe8\x92\xe5\x69\xb8\xc8\xcc\xe6\xd4\x8c\x0f\x73\xbd\xd1\x58\xd4\x12\x98\xc8\x5b\xc9\x9c\xa5\x82\x63\x58\x49\x3a\x20\x2e\xd5\x6c\x25\xaa\x4f\xcf\xde\x9e\xbc\xa9\xc2\x35\x7c\xf0\xea\xf6\xc9\x0f\x3a\x11\x61\x9c\xe2\x78\x10\x24\xe9\xc4\x82\xec\x49\xb2\x6d\x2a\xdd\x8b\x1d\x1b\xb9\x52\x04\xb0\xdc\xff\x10\x72\x55\xe2\x0f\x63\xd6\x55\x56\xcd\x68\xdd\x8c\x93\x3c\xc5\x79\x74\x6b\x5d\xe5\x04\xfd\xdd\xd9\x68\x1f\xc0\x3e\x75\x03\xfc\xbb\x26\x9b\xf0\xe8\x26\x4a\x4f\x6e\xf6\x01\x6b\xbd\x1f\xd2\xdb\x9d\xe3\xbb\x65\x2e\x4c\x96\xc2\x8d\x29\xc8\x1a\xa2\xbc\x7b\x06\xf8\x90\x4a\xb1\x97\x95\x2f\x14\x04\x10\x50\xca\x7e\xb8\xb6\x98\xb3\x38\x4c\x8b\xfa\x86\x24\x65\xe3\xe5\x98\xee\x72\x14\xa6\x0d\x47\xa5\x1f\x47\xdf\xf0\x2c\x83\xf5\xc2\xfb\xb6\x09\x26\x17\x45\xe6\x09\xcf\x19\xaf\x7e\x2d\xac\x8a\xc6\x46\x4f\x8d\x5f\x34\x20\xe7\x15\x73\x96\x64\x42\x63\x6d\xa6\xe2\xcf\x06\x34\xfb\x06\x93\x17\x1b\xd4\xa7\xa8\xcb\xbf\xad\xf7\xbc\xe9\x19\xd6\xa2\x17\x1a\x73\xd5\x03\x2d\x0d\xc4\x10\x8f\x1a\xd9\xd1\x51\xf5\x8b\xa9\x4d\x3b\xda\xca\x49\x35\x52\x06\x84\xd5\x8d\xd0\x0c\xc3\x1d\x0b\x84\xcc\xac\x6f\xcc\x4e\xe3\xbe\x7d\xea\x9c\x20\xa1\x49\x05\x02\x76\x50\xe4\x2e\x73\x54\xa8\x7f\x1e\x7e\x34\xf9\x2f\x9c\x99\xca\x7f\x8a\x1a\x4b\xd6\x28\xd4\xfe\xbc\xfd\xb1\xa1\x40\x9f\xfb\x1f\xab\x43\x81\x56\x4e\xb7\x55\xf1\xb0\x7b\x0b\x54\x65\xb7\xb2\xe9\x95\x9a\x06\xeb\xa6\x27\x22\x4a\x70\x77\x9f\x22\x1e\x67\x97\x01\xf1\xf2\x28\x22\x0d\xa6\x0e\xf2\x9a\xc8\xcb\x28\x04\x28\xb3\x94\x3d\x2a\x46\xc5\x2d\x54\xa5\xf7\x42\x15\x5d\x59\xb6\xde\x1b\x56\xbc\xec\xd1\x62\x3d\x00\xd3\x50\xd4\x1c\x3e\xc0\x63\x3f\xe4\xaa\x0b\x72\xcc\xd9\x05\x6e\x3c\xa4\x3a\x40\x87\x2d\x21\xef\xa6\xe3\x65\xce\x56\x82\x4d\x12\x65\x45\xf1\x92\x07\x4a\x96\x95\xa2\x1b\xb8\x79\xc2\x89\xe1\x7a\x95\xf2\xc5\x82\x74\xd1\xd9\x3a\xce\x67\x22\xa7\xd7\x0b\xb8\x67\x80\x62\x0c\x6f\xbd\xb7\xe0\xc4\x7e\xc3\xae\x70\x95\x03\x6b\x6a\xf2\x6e\x2a\xee\x23\x72\x9f\xcb\x16\x51\x98\xd7\x3c\xaf\xde\x9a\x26\xe9\x90\x07\xb3\x9a\xcb\xa0\x1d\x53\x11\xf3\x4c\xae\x2b\xd4\x37\xa0\x56\x69\x12\x2c\xcc\xde\x38\x0f\xfd\xd0\x5f\x31\x0d\x95\x20\x4a\xdb\xaf\x4a\xe2\x39\x62\xe8\xdb\xd9\x92\xa7\xe8\x80\x12\xd3\xd4\x44\x0b\x84\x51\x63\x6b\x9b\xac\x44\xfa\x1c\xaa\xcb\x83\x35\x4f\x5e\xc8\x82\x01\x57\x41\xd8\x24\x86\x6a\x02\x9e\xa8\x64\xad\xcf\x9f\x99\x00\xbd\xff\x73\xb1\xae\x4b\xf6\x52\x33\x00\x8e\x98\x17\x78\xb2\x86\x53\x74\xe5\xd5\x2d\x73\xcb\xd7\x31\x46\x28\x15\x46\x01\xc9\x6a\x92\x8e\xe4\x9f\x52\x98\xac\xd3\xa6\x81\x47\x82\x69\x28\x4f\x1c\xc8\xdb\x9b\x2c\xd6\x5b\xe6\x01\x5b\x82\x7a\x21\x20\xc9\x82\xf3\xec\xad\xee\xb1\xea\x90\x51\xfb\x6a\x2c\x66\xfc\x2a\x4c\xd2\x96\xb3\xc8\x56\x88\x66\x41\xca\x1d\xcd\x31\x5d\x1d\xf4\x11\xf3\x2c\xcd\xbe\x27\x6b\x09\x9d\xec\x07\xd2\x20\xda\xa1\x30\x21\xb9\xe3\x45\x92\x33\xd4\x46\x09\x88\x18\x03\xba\x41\xf9\xb7\xb8\x5e\x50\x9c\xec\xc2\xce\x27\xd5\x0d\x8f\x15\x20\x5b\x05\x0f\x1b\x29\xcc\xd9\x24\x9c\xc4\x5e\x2e\xf7\x53\x98\xd3\x55\x68\x25\x28\x8c\xe9\x58\x60\x98\x09\xf6\xfa\x54\x25\x26\xd5\xa0\x62\x95\xd8\x81\x9d\xbc\x1c\x52\xa8\x56\x15\x27\x07\x8c\xb1\x70\x84\x80\x4d\xa5\x82\x81\x97\x8d\x66\x14\xa2\x7a\x52\x82\x71\xf1\xb8\xb5\xa5\xca\xcf\xec\xc8\x3e\x30\x6b\x78\x17\x00\x35\xbc\x0a\x18\x29\xef\x5a\xeb\x45\x18\x00\xb7\x00\xee\x60\xbd\x5b\xe0\x51\xab\xc0\x41\x1e\x13\x7b\x01\xf2\x84\x6c\x6d\xf5\x63\x80\x14\x1c\x3c\x50\xe1\x7b\xc6\xfe\x36\x98\x6d\xa4\x7a\xd2\xf0\x58\xf9\x97\x1e\x1a\xe9\x59\xd9\xf4\x43\xfb\x60\x56\xde\x05\x8c\x91\x80\x17\xcc\xec\x1c\x4f\xed\x3a\x7b\x22\xef\x47\xb0\xef\xac\xb4\xc1\x16\x6d\xfc\x78\xc4\xb6\x3b\xda\x54\x5f\xc2\x37\x1f\x1d\x0a\x0c\x66\xd6\xa1\x5c\xcd\x5d\x6a\x55\x53\x0b\x66\xf5\x3a\xf1\xab\xa2\x44\xff\x14\x4a\x0b\x7a\xa7\x82\x93\xcf\x1b\x6c\xa3\x77\x8c\xa3\x16\x8b\x93\xb8\x09\xf6\x31\xea\x46\xa8\xbd\x1a\xe1\x10\x98\x41\x6a\xb6\xf9\x18\x42\x7e\xa2\x26\x04\x35\x91\x26\xfc\x2e\xf3\xf8\x62\xd1\x52\xd1\x1e\x97\x51\x44\x11\xa1\x94\xbf\xcd\x30\x0b\xbc\x86\x92\x18\x29\xf9\x03\xa4\x5f\x4f\xf2\x99\xe6\x09\xf0\x51\xfe\xb1\x5c\x10\xb7\x6c\x3c\xa0\x8b\xd8\xf0\x74\x40\xd7\xdf\x39\x0f\x63\x79\x3d\x81\x13\x58\x0e\x26\x8c\x99\xe9\x50\x8d\x4c\x1e\x2b\x2a\xff\xc1\xcd\x1c\x97\x90\x89\xed\x7a\x8b\xc5\xab\x24\x1e\xe4\x69\x04\x6f\xfd\x84\xe1\x8d\x27\x8a\x1b\x59\xfd\xf3\x67\xe6\x96\x40\xec\xf8\xca\x52\xc2\x54\xbd\xc0\xa6\x88\x5c\x2d\x26\x5c\x22\xde\xaa\xd5\x97\xcb\x7c\xc3\x89\xa2\x4d\xd3\x2a\xa6\xb1\x49\xdf\x7d\x0b\x48\xb4\x2f\xdb\x80\x16\xbd\x09\x25\xc3\xf4\xf7\x2d\x72\x2f\x76\x54\x51\xf8\x03\xfb\x7b\xcd\x67\x7f\xfa\x93\x04\xa3\x34\xf7\xac\xc9\xfc\xba\x31\xed\x77\xe0\x77\xf6\x2c\xf8\x77\x59\xcb\x9a\xd8\x7c\x50\xcb\x6b\xf3\x3d\xce\x69\x30\xe0\xfb\x23\x90\xf0\x99\xfd\x03\x70\x60\x44\x88\x63\xa1\x3c\x94\xc8\x7e\xaf\x85\x85\xd9\xb9\xee\xe6\xa3\x26\x4f\xfc\x54\x74\x4a\x5a\xf1\x34\xae\x79\xaf\x12\x06\x91\x81\x43\xad\x6c\xa6\xe6\x68\xc3\x5f\xe4\xce\x85\xf3\x99\xec\x40\x55\x22\x2c\xba\x38\xa2\xbd\xe9\x45\x42\xf7\xf7\x25\x2a\xca\xe5\xc8\x53\x91\x25\xd1\x95\x98\xa0\x7e\xde\xcd\x56\x55\xe1\x7b\x65\x79\x84\x81\xab\xad\x76\xbb\xb3\x8e\x74\x95\xba\xd2\xe8\x39\x0a\x21\x3a\xa8\x30\xc6\x70\x17\x4a\x5f\xa7\xf5\x58\x5c\x01\x32\xb9\x71\x26\x61\xb6\x80\xa8\xda\x61\x5e\x6a\x31\x11\x53\x91\xea\x08\xd1\x8e\x56\xac\xa1\x20\xd1\x2c\xd5\x9b\x21\x28\xaa\x5a\xca\xf5\xac\x0a\x01\x7c\x2e\x2c\x57\x07\xea\xe9\x88\xd6\x59\xb9\xae\xa9\xc3\x51\x22\xdb\xe0\x5a\xca\x3f\x6a\xe4\xda\xb3\x55\x43\xc0\x5f\xc0\x0c\x67\x5d\x03\x7f\x38\xa4\x96\x06\x3b\x17\x0d\x82\xff\x51\xb9\x59\x48\xe0\x1a\xea\x91\xd2\xe6\x49\x81\x0a\x9c\xed\x1e\x9a\x94\x2d\xa5\x7e\xcc\xea\xe8\x2a\xae\xaf\x1d\xd6\xb4\xe9\xc6\x28\x68\xe9\xbd\x17\x94\x80\x69\xb8\x88\x44\x93\x62\x36\xd5\xbc\xa3\xa3\x23\xaf\xce\x92\x85\x48\x79\x9e\x60\x8c\x07\x91\xe5\x18\xa1\x2a\xcc\xd5\x63\x26\x86\x25\xcf\x50\xeb\x91\x73\x08\x21\x1f\xc6\x0c\xfc\x92\x48\x0d\x20\x85\xba\x65\x98\xcd\xe4\x29\x74\x61\x54\xab\x54\x1f\xb5\x59\xf0\x09\xc1\x49\xfc\xb2\x28\xcc\x45\xca\x23\x27\xce\x92\x12\xa4\xf2\x44\x79\x07\x98\x40\x55\xe3\x35\xa6\x9b\x82\x45\xc4\x67\x1f\xed\x9c\x57\xf1\x38\xd5\xc2\x2a\x4a\xda\x57\xe8\xbe\xa9\x05\xd5\x51\x4d\xde\xf4\x4e\x4f\x6f\xac\x2f\x2b\xa8\xca\xa0\x75\xbb\xb1\x36\xd4\x70\xfc\xec\x52\x08\x2e\xa8\x4f\x37\x05\x4a\x0a\xbf\x47\x45\x9b\x89\x9f\xc8\x08\xe3\x90\x29\x81\x5d\x55\x9f\xa3\x49\x45\xa9\xbe\x91\xec\xdd\xab\xcb\xa1\xf9\x43\x27\x65\x8f\xd5\x1e\x6f\xce\x25\xf5\xae\x04\xcb\x96\x29\xa6\x2c\x32\xea\x57\x2d\x18\x69\x25\x3b\xbc\x1a\x3e\x3a\x6f\xb5\x5a\x1f\x1f\x99\x44\x36\x5a\x05\x7f\xc4\x1e\xd6\xb6\x7e\xfd\xe5\xfc\x97\xd5\x93\x5f\x3e\xfe\xdb\x16\x24\xf6\xaa\xe1\xae\x68\x21\x48\xe2\xdf\x2a\x6e\x8b\x6b\x08\xec\x86\x6e\x51\xd6\xca\x14\x21\x85\xb2\xcb\xe8\xbe\x7e\xf8\x41\xa3\xf4\x87\x1f\x24\x0a\x9d\x3c\x2e\xaa\xb1\x19\x3a\x59\x22\x43\x67\x18\x56\x3d\x88\x04\x4f\x41\x2f\x6e\x3f\x0e\xd1\x43\x88\xb9\x96\x28\xfd\x2d\x3e\xd1\xae\x78\x98\xa3\xda\x5f\xe8\xd7\x04\x38\x84\x42\x8d\xd2\x89\x3e\x42\x75\x9a\x17\xbd\xf6\x3a\x68\x3f\x6c\x77\x58\x77\xab\xe8\x0b\xfc\x4f\xd9\x60\x2d\x54\x68\x03\xeb\xcd\xb8\x28\x5c\xd5\xb5\x76\xae\x28\x5a\x74\xea\x56\x92\xac\x6f\x1c\x96\xb2\x11\xff\xf6\x51\xf9\xdf\x3a\x2a\xcb\xf5\x4a\xb1\x46\x75\xd9\x40\x70\x0a\x7e\x15\x8b\xa5\x2a\x9e\x9d\x3b\x08\x98\xb7\x21\xaa\xaa\x66\x72\xe6\xc5\x26\x72\x9f\xdd\xd4\x46\x7e\xf7\xca\x39\x8a\x6e\x66\xfc\x86\xc9\x9f\x4c\xe5\x5e\xe6\xd9\xe5\x29\x49\xc4\x18\xf4\x5f\xe4\xac\x46\x79\xe4\x34\x80\xba\xbc\x42\x23\xcd\x03\x47\x05\x43\x70\x7c\x52\x7b\x40\xb4\x8d\x7e\xd3\x3c\x08\x92\x65\x9c\xd3\x6d\x84\xc8\x58\xbd\x70\x00\xc9\x6b\xcb\x51\xd2\x82\xc9\xab\x37\xc4\x44\x5a\x3f\xa0\x93\x3e\x05\xe7\x50\x93\xda\x4e\xbb\xc6\xc0\xdd\x18\x5e\xb7\x25\x70\xcb\x54\xfb\x8c\x8f\xd5\x63\xa1\x65\x53\x8a\xf0\x1e\x0d\x4e\x4f\xd8\x5f\x28\x9b\x12\xfc\xe1\xb3\xa7\xac\xc3\xfe\xf2\x48\x9d\x06\x38\x9b\x23\x79\x37\x70\xb0\x01\xca\x0a\x75\x5b\x70\xe4\x3b\xb9\x27\x55\xd2\x03\x2d\x91\x69\x69\x0c\x45\x0d\x68\x78\x68\x41\x68\xc8\xd1\xc8\x41\xfc\x8f\xee\xf4\x7f\xc8\x46\x6a\x9c\x5c\x91\x7e\x46\xb2\x9a\x43\x45\xb5\x08\x08\x5c\x21\x78\x94\xe3\x5f\x72\xcd\x0f\xe1\x7f\x8c\xf4\x4f\xa3\x22\xaf\x0f\xc5\xc9\x95\x13\x08\xb8\x8e\xe2\xef\x35\x1a\xb8\x91\x79\xa9\x92\x25\xae\x0d\x1c\x26\xa6\xdf\x9a\xc6\x61\x9e\xb1\x2c\x41\x7d\x24\x64\x8f\x48\x21\x14\xd0\x7c\x19\x53\x0a\x0a\xa5\x6d\x31\xe2\x5a\x6a\x3c\x7c\x15\x7e\xcd\x5e\xc4\xed\x37\x77\xac\xf9\x36\x0a\x60\x6e\x2a\x3a\x4d\xdc\x34\xfa\x96\xb5\x43\xbf\x5a\x04\x93\x17\xe8\x1a\x1a\xd4\x39\x3c\xa6\xc1\x0c\xd2\x2c\x95\x83\x1c\xfe\x9d\xf5\x5d\x66\x1c\x24\x20\x58\xf8\xfe\x40\x76\x9f\x8e\x41\x8f\x03\x01\x4d\xe3\x36\x9b\xc3\x6a\xad\xde\x49\xac\xbf\x34\x5c\xb3\x58\xdc\x10\x10\xdc\x4f\x05\x7d\xc6\xa6\xfa\xb4\xb1\xa2\x73\xc9\xad\x6c\xd2\x05\x9a\xa7\x54\xdd\x8f\x9b\xc3\x70\xa0\x9f\x5a\x83\x64\x6e\x4c\xc7\xf0\x09\x4b\x08\x95\xf3\x37\xe2\xc1\x25\x9b\xf3\x8b\x30\x68\xb9\x8b\xa8\x64\x20\x83\x5a\x23\xe2\x82\x00\xf5\xf9\xf3\x26\xb1\xf7\xa1\x62\xc6\xb2\x8e\x5c\x91\xcf\x9f\x81\xa2\xea\x75\x57\xa5\xa8\x4d\x85\xc2\xcc\xd1\xb5\x5b\xaf\xbc\x94\x02\x95\x30\x06\x39\x12\x31\x0b\xad\x51\x29\x2e\x63\xe7\xcd\xb6\x94\x63\x45\xb1\x38\x50\x2c\x8a\xeb\x90\x02\xaf\x39\x3e\x78\x2d\x6b\x54\x60\x90\xc9\xe3\x02\xdc\x86\x2c\xaf\x7e\x81\x46\x9d\xb7\xca\x15\xa9\x20\x05\x3c\x46\xfb\x4b\x30\x3f\x5e\xca\x6f\xc0\x05\xd1\x26\x22\xa0\xc5\x0d\xe1\xad\xbc\x52\xf7\x08\x89\x99\x60\xa9\x48\x6c\x96\xcb\x65\x0c\x0b\x50\x2e\x95\x92\x57\xc3\x44\x74\xa5\xf0\x92\xf0\x34\xad\x80\x39\xfc\x82\xac\xcf\xe2\x4b\x9c\x66\x02\x4a\xd1\x48\xb8\xe6\xda\xae\xc1\x9d\x31\xa9\x55\xd7\x56\x55\x0f\xcd\xb6\x2f\xe3\x64\x45\x57\xd7\x3c\x5d\xd3\xdd\x35\x54\xb9\x93\x44\x41\xae\x02\xb5\xae\x02\xa6\x9e\x51\x81\x14\xdd\xf5\xda\xa8\xd6\xb6\x48\x0e\x50\xa0\x4f\xe1\xc8\x65\x64\x16\xef\x2a\x5c\x0c\x5b\xc8\xb5\xbe\xc3\xcd\xd0\xd2\x23\xdc\x7e\x33\xb4\x77\x88\x23\x2b\xab\x3c\xfd\x47\x47\xac\x53\xea\xcf\xad\x49\x59\xd9\x6b\xc8\xb7\x7f\x62\x3e\x3b\x64\xed\x7a\x83\xf9\x86\x0b\xde\x43\x67\x5a\xc6\x28\x5e\xad\x2a\xdf\x5f\xa9\xd6\x43\x77\x22\x2e\xea\xe4\x55\x17\x6f\x7d\x5e\xb5\xd6\xe4\x84\x52\x74\x73\x8a\xf5\xe1\xb1\x27\xec\xcf\xa7\xaf\x5f\xb5\xb0\x55\x38\x5d\x53\x3f\xf5\x8d\x7a\x93\x53\x49\xdb\x2e\x51\xab\x4c\x8d\x65\x37\x62\x23\xe0\x64\x21\x18\xb1\x81\xad\xc0\x72\x8e\x37\x68\x04\xa8\xc1\xcc\x78\xa6\x85\x25\x48\x11\x70\x83\xc4\xd4\x22\xac\x54\x1d\x8b\x47\xcc\x48\x9a\x06\x0b\x45\xb2\xb4\x84\xc9\x0d\x40\x40\xee\x74\xa8\xfb\x1e\x8d\x51\x00\xa5\xd6\xc5\xe3\xbc\xb0\x99\x14\x59\xb5\x1b\xac\x53\x87\xd6\xbf\x5c\xfb\xe3\x73\x38\x23\x6b\xc4\xbf\x2d\x8e\x0e\xc4\x67\xb3\xf2\x33\x57\x31\xa4\x6c\xa4\xcc\x43\x0f\xe5\x61\x98\xa8\xec\x55\x79\x1a\x5e\x5c\x40\x0e\x65\x63\x8f\x09\xfc\x00\xec\xbd\x02\xd4\x89\x99\x37\x67\xb5\x42\x70\xe2\xce\xf9\x9a\xf2\xe4\x25\x68\xe2\x68\x6b\x99\xf2\x44\x81\xaa\x34\x49\x24\xf6\x29\x25\x50\x65\x18\xa9\xb5\x47\xf3\x64\x62\xed\x5a\xdc\x60\x70\x96\xb9\x08\xb0\x2e\x30\xf3\x64\x22\x65\xa0\xa7\x1d\xcf\x79\xb6\xb7\xc4\x90\x87\x04\xe7\xc6\xe6\xdb\xe5\xe6\xba\x77\x05\xa7\x70\xb9\x31\x8d\x77\xca\x8d\xad\xdb\xb2\xd5\xbf\xbc\xe3\x94\x9b\xef\xde\xd0\xb7\x0d\xc7\xb9\x76\xab\xc6\xdd\x8d\xf3\xb6\x9b\x22\xb5\x94\x1a\xef\xdd\x3e\xeb\x8d\x93\xde\x57\x6d\x8b\x5c\xd6\xe2\xa4\xdb\x8e\x9a\x00\xdc\x35\x48\x79\x25\xef\x19\xda\x0b\x08\x85\xaf\xdf\x45\x9a\xd8\x19\xf1\x96\x71\x24\x8f\x74\x75\xfe\xb7\x8a\x4c\x19\xf7\x87\x2f\xb9\x97\x1c\xd3\x13\xe6\xee\xa3\x8e\x62\xc8\x55\x99\xa6\x5f\xa3\x4b\x08\xe6\x67\xc4\xee\x79\xce\x22\xc1\x33\x34\xb9\xd4\xc3\x28\xf5\x5a\xda\xac\xee\xa4\x9b\xcc\xaf\xab\x01\x51\x53\xd3\x5c\xb5\x2a\x37\xb1\x50\x59\x4a\xa7\x5b\x16\xef\x0c\x56\xbf\xe2\x84\xa2\x96\x15\xb7\x75\xb5\x09\x8d\x75\xeb\x06\xb8\x6d\x83\x5a\xd5\x86\x9e\x31\x75\x53\xf7\x35\xd3\xd4\xc5\x6e\xf1\xfd\xb2\xbb\x83\x04\x36\x11\xec\x4f\x47\xec\x60\xd7\x1e\x87\x35\xb5\xca\xc7\x49\xd9\xa8\xc9\xba\x3b\x16\xe8\x2f\x0f\xec\x9f\x36\x59\xde\x74\x1d\xc1\xa7\x5e\x73\x11\xb1\xa8\xd7\x37\x03\xb2\xa6\xa8\xae\x44\x55\xaf\xb5\x77\x1c\x79\xdd\xd9\x39\x18\x8b\x38\x15\xd9\x02\xa2\x70\x44\xf9\x56\xd1\xff\x11\xb2\xa9\x86\xda\x56\x73\xce\x17\xfa\xb1\x82\x67\x46\xd7\xab\xa0\xe1\x31\x6e\x3b\x98\x42\x42\xd6\x54\x47\x23\x9c\xe0\xad\x0a\xfa\xd1\x90\xcc\x2d\xc8\xf0\xef\x60\x26\x82\xcb\xaa\x21\xb5\x34\x72\x6f\xc6\x2e\x3d\xaa\xd7\xd9\xe7\xcf\x7a\x9d\x40\x6d\xa3\x9b\x14\x00\xd7\x2b\x68\x9b\x8c\x7c\x9f\x58\x7a\xf8\xa2\x21\xd5\x86\x77\x6d\x12\x63\xee\x13\xc8\xe6\x93\x56\x0d\x6c\x88\x68\xb3\xfb\xbf\x24\xa2\x8d\xca\x6f\x03\xde\x3d\xf0\xf0\x9e\x26\xf3\x0a\x05\xfa\x1b\xf0\xb1\x84\x04\xc4\x3c\x36\x82\x15\x9a\x94\x39\x97\xd9\x11\x28\xa8\x57\x38\x0f\x1d\x46\x43\xcd\xc4\x55\x3e\x81\x8f\x9c\x7a\x8c\x87\xc7\xcd\xea\xe8\x1c\x2c\xcb\x8d\x77\x91\x64\xc8\x91\x3a\x21\xc6\xcb\x30\xca\x9b\x61\xac\x02\x7f\x2c\x60\x51\x30\xc6\xb3\x07\xc6\x93\x71\x18\xc0\x99\x85\x76\x2a\xe0\xd2\x47\x46\xf3\x57\xf8\x74\x22\xaf\x89\xd5\xe1\x3d\xd0\xd4\xb9\xf2\xcd\xb5\x6f\xe2\x83\x54\x19\xb9\xa9\x79\x7f\xa2\x64\xa3\x4e\x72\x0c\x48\x99\x03\x96\x2e\x8a\x88\x6e\xea\xc1\x09\x73\x2a\x78\x6a\xf5\xc8\xee\xd8\x65\x6f\x32\xa1\xf8\xfe\x4a\xdd\xa3\x93\x80\xc9\x45\xe5\x11\x24\xda\x47\xc9\x2f\xc3\xe0\x44\x0b\x9e\x82\x95\x37\x04\xfd\xc9\xd0\xd7\x78\xb1\xc4\x07\x68\x70\x00\x04\xf7\x2c\x4c\x13\xc6\x27\x13\x1a\x2c\x2c\xea\x5c\xca\x6d\x13\x91\xf3\x30\xda\x10\x61\xa8\x82\xb0\xbe\xc8\x05\xa4\xdf\xcb\x39\x68\x3f\xab\x19\x7f\xde\xf4\xb4\xf3\x85\x68\xf2\x8e\x98\x34\x43\x76\x5e\xca\xcd\x18\xd4\x89\x6d\x2c\xdc\x8c\x6e\x50\x45\xda\x07\x03\xb6\x30\xcb\x8b\xea\xc2\x4f\xe7\x06\x4e\xe9\xa5\x5a\x36\x50\xdc\xab\xca\xc4\x55\x7e\xaf\x32\x6c\x35\xad\xcf\xc3\x8f\x2d\xab\x83\x39\xcf\x83\x99\x41\xa4\x35\x87\xba\x7d\x54\x9a\xe1\x13\x0c\x73\x24\x6a\x7d\xbd\x7d\x2e\x5a\x37\x8f\x82\x86\xd3\x55\x19\xea\xb3\xae\xa4\x40\x37\x3d\xfe\xcd\x8c\xe9\x90\x95\x71\x7c\x48\x3f\xbf\x58\x42\xfd\x43\x1b\x4f\x45\x0a\xaf\xc2\x2f\x3b\x62\xe7\x54\xe1\xe3\x66\xd3\xdc\x1b\x41\xb4\x16\xcb\x6c\xa6\x67\xab\x65\x20\x58\x91\x2c\x49\x73\x13\xf8\x9a\x37\xd8\xd8\x46\x2e\xbd\x00\x6f\xa4\x6e\x68\x3e\x48\xe6\x0b\x9e\x8a\x9a\x25\xbd\x30\xc6\x5b\x36\x3e\xc6\xd6\x5f\x5a\x66\xf9\xe2\x18\x05\xdf\x69\x5b\x4f\xc1\x31\xd5\x6c\x49\x12\x09\x14\x13\x57\x37\x67\x71\x1d\x66\x79\x06\x37\x3d\xf2\xd8\x30\x47\xbf\x82\xf5\x12\x6e\x61\x0b\x11\x84\x53\xb4\x81\x25\x20\x19\x26\x3f\x5e\xa4\x22\x10\x13\xbc\x08\x02\x3f\x05\x0b\x76\xf4\x86\x0d\xa3\x49\xc0\xd3\x49\xd6\x62\xec\xe7\xf0\x4a\xc0\xbe\xd6\x07\x82\x1c\xd6\x23\x78\x7c\xe8\x3d\x82\xfb\x26\xfe\xf1\xb8\xd9\x7b\xd4\xa0\x34\x2f\xfa\x33\x3d\xe0\xa1\x46\x56\x95\x5a\xd0\x70\xf8\xb0\x11\xb4\x14\x64\xc0\x81\xf8\x83\xce\x19\x13\xc8\xe8\x67\xa3\xc9\x5c\x85\x49\x20\x6a\xd8\xe8\xd0\x99\x05\xd1\xbe\x13\xd7\xf7\x8d\x64\x8d\x69\x0b\x38\xa4\xe6\x3f\x0a\xa6\x3c\xfd\xc4\x35\x9f\x2f\x22\x71\x88\xa6\xfa\x52\x70\x93\xe0\x28\xfd\x31\xc5\xb5\xb1\xad\x89\x4d\x9e\x31\x7c\x85\x7f\x34\x0b\xd7\xfc\xe1\xa3\x16\xb6\x37\xac\xaa\xe6\x61\x5b\xaf\xc1\x1e\x79\x50\xc7\x7b\x24\x69\xc3\xee\x25\xe0\x71\x20\xa2\x82\x5f\xa4\x88\xf3\x30\x15\x11\x24\xeb\x86\x84\xd5\x56\x34\x9d\x7a\x45\x37\xbd\x28\x6f\x1e\x7b\x8d\x5b\xdf\xf5\x8b\x9d\x8b\x6b\x11\x2c\x29\x1d\x3f\x3a\xbb\xc4\x13\xe3\x57\x62\xe9\x63\x2a\xe7\x75\xe6\x35\x0a\x67\x29\x7a\x3a\x38\x99\x22\x7e\x4e\x72\xc6\xd9\xd9\x43\x4f\xf5\x7d\xc3\xe6\x2b\x98\x08\x3c\x56\x7b\xe9\x71\xc5\x01\xf3\xaf\x77\x30\x15\xce\x25\xf7\x40\x52\x76\xbe\x60\x84\x84\x26\x40\x37\x08\x6d\x78\x8a\x43\x1c\xa0\x0c\x57\x7f\xa5\xb5\x62\xa4\x15\x94\xe2\x53\x85\x4a\x10\xe5\x75\x73\x58\x3a\x23\xd9\xa4\xf6\x7b\x86\xda\x75\x96\xcb\x3d\x87\x46\x4b\x66\x7f\xa9\xe7\x42\x37\x1a\x1b\xee\x29\x52\x74\x2e\x5a\x52\x2e\x06\x2b\x05\x6d\x28\xae\xb4\x00\x18\xa1\x2d\x5d\xd3\xf8\xb4\xda\xea\x88\x2d\xf4\x8e\x3c\xa5\x42\xca\xe3\xcd\x02\x8e\x09\x69\xae\xab\x63\x56\x8b\xeb\xea\x99\xc0\x31\xb4\x68\x85\xd9\x80\x52\x43\xd5\xea\xd5\x00\x16\x2a\xf8\xf5\x10\x6c\xab\xc5\x44\xa5\x21\x55\xa3\x43\xe5\xa9\xfa\x6b\xb3\xbe\x74\x03\x43\x82\x79\xa1\xa1\x96\xbe\xab\x29\xdd\x28\x3c\x0d\x04\x3c\x8a\xf8\x38\x12\x85\x35\xb5\x94\xe4\x85\x65\x55\x18\x76\x16\xd2\x60\xd5\xba\x55\x2d\x0a\x7c\xae\xa6\x95\x25\x25\xac\x6e\xc4\xab\x9b\x07\xe6\xcb\x3f\x09\xbf\x25\x52\xae\x8e\x05\xa8\xc4\x28\x0d\xcd\x22\xf7\xc2\xd9\xab\x53\xc6\xe8\x43\x4d\x0a\xd0\x18\xb3\x64\x49\x3e\x63\xf2\x16\x9e\x4c\x15\xbb\x38\xd4\x6b\xda\x6a\xb5\xbe\xd8\x1e\x39\xe0\x23\x6a\xef\x05\x70\xc6\x81\x85\x07\xb5\x28\x5f\xd0\xf3\x5b\x9c\x27\xcc\x0c\x33\xd3\xb1\x27\x25\x24\xd9\x19\xf8\xd5\x66\x58\xaf\xc4\xa4\x0c\x57\xda\x78\x5e\x29\xb6\xfb\xad\xc7\x16\x53\x87\xd5\xa1\x39\xac\x1a\x05\xd8\x5f\x7d\x58\x31\x3a\xa2\x0e\x6f\x3d\xa2\xb0\xcb\x2f\x05\xa6\xaf\x32\x87\xcd\xf9\xe2\xde\x7c\xd9\xb9\xf2\xcd\xf9\x02\x69\x56\x8b\xf2\xb8\x48\x4c\x7f\x28\x11\x1e\xb2\xd0\x39\x5f\x48\x11\xf4\x63\xbd\x94\xc7\xe8\xad\x39\x2f\x95\x78\xa3\x1e\x4d\xa0\x4c\x64\x39\x89\x3a\xae\x0d\xa8\xb2\xa8\xc0\xb4\xa7\x30\x6f\x79\x13\x5f\x46\x11\x29\x85\x52\x81\x91\x5c\xb0\x75\xf1\x66\xa6\x50\xa2\xc0\xf4\xd4\xb1\x81\xeb\xcc\x95\x85\x86\x09\x57\x22\x09\x0f\xb4\xb1\xca\x29\x11\x2e\x7e\x2a\xc9\x2c\x55\x0b\x45\x66\x9c\xc3\x29\x1c\xab\x79\x66\x04\x07\x78\x70\xc5\x50\x40\x63\x3e\x17\x94\xc4\x71\xbe\xd4\x33\x45\xa9\x12\x8c\x78\xf1\x21\x62\xb3\xa4\x6d\x60\xdf\x71\x65\x8d\x6d\x47\xe1\xc4\x05\x8b\x05\x7d\xfd\xdb\x78\xd1\x93\xd5\xca\xf6\xc8\x70\x7d\xb1\xd8\x90\xb1\x00\xbe\xcf\xa5\xcf\xbd\x77\x3a\x17\x37\xeb\x62\x56\x75\x1b\x94\xa3\xd2\x93\x28\x24\x8d\xa0\x66\x9a\x33\x3a\x23\xbc\x87\x0e\x0c\x95\x8c\xff\xa7\x63\x3a\x13\x33\xb1\xe3\x3a\x9f\x59\xf6\x0a\xa4\x74\x82\x35\x9d\x51\x20\x36\x15\xe4\x39\x07\x8f\x10\xae\x15\x6b\x28\x64\x61\x9c\x17\x88\x6f\x04\xb6\xec\xac\xc6\x2f\x31\xf4\x9d\x31\x51\xcf\xea\xb8\x2f\x64\xb1\x04\x66\x19\xaf\xe7\x22\x8a\x90\x0f\x14\x82\x2c\x53\xf2\xf6\x64\x65\xb9\x72\xe9\x10\xa5\xf6\x41\x43\x86\x2c\x10\xc0\x0d\xb5\x35\x19\xfa\x5f\xc9\xa3\x44\x45\xdd\x29\xc5\x6f\xc8\xc0\xa9\x92\xac\x29\x24\x2c\x63\x5a\x69\x9b\xd1\xb8\x1e\x5d\x8d\xa2\x4a\x9a\x82\x6e\xac\xd2\x24\xbe\xd0\xcf\x89\x8f\x15\x16\x1b\x74\x6f\x48\x31\x19\xa6\xb6\x89\x31\x7e\xd0\x99\xe5\xfe\x73\x1c\x4e\xc1\x3b\x3e\xa7\x30\x39\x59\x83\x65\xcb\x60\x26\xe7\x70\x7c\x95\xa4\xfc\xd2\x99\xa9\x13\xaa\x1a\xfa\x82\xb9\x26\xe8\x01\x4a\x10\x58\xae\x1d\xc4\x40\x45\xa7\xf0\xc7\x38\x5a\xe1\x26\xb1\xeb\xe6\x4d\x4e\x6e\x60\x7b\xbd\x4c\xc7\x10\xa2\xe1\xb1\xba\xe8\x2c\x79\x44\x53\xb6\xf0\x2f\x79\x30\x05\x18\x0b\xb3\x6c\xa9\x0e\x51\x2b\x08\x4a\x26\x7b\x89\x93\xb8\xf9\xee\x54\x77\x94\x49\x46\x0e\x15\x75\xc9\x03\x15\xae\x0b\x14\xf6\x6e\xca\x4f\x1d\xb0\x12\x5d\xfd\x38\x1a\x13\xc9\xbe\xc1\x64\x1c\x4d\x5b\x94\xc7\xdd\x9c\xaf\x31\x1f\xfd\x15\xd9\xb8\x80\xa9\x8d\x14\x8d\x68\x55\xec\xd1\x5b\x6f\x71\x16\x2f\xd6\xa6\x41\x72\x27\x80\xe9\x0b\x8c\x60\x53\xe8\x71\x09\x0b\xa2\x8f\x37\x30\x8a\x0d\xde\xdf\x95\x28\x21\xe8\x71\x38\xcc\x23\x31\x61\x8f\x7a\x14\xbd\x08\xcc\xa9\x21\x9c\xcc\xa6\x70\x48\x18\xdf\xd9\xe6\xdf\xf0\xc9\x52\x90\x5e\x1a\xbf\x64\xf5\xeb\x53\xeb\x1b\xec\xc6\x23\x3b\xeb\x26\xca\xc8\x65\xb9\x8f\x33\x29\xdc\xe1\x06\xb3\x36\xa7\x8d\x28\x6b\xcb\x82\x28\x3f\xe3\xd9\x4c\x59\xd3\x2b\xdf\xcb\x69\x12\x45\xc9\x8a\xce\xc4\xec\x90\x79\xf8\x7c\xe6\x35\xb4\xad\x1e\x1c\xe2\xda\x40\x01\x45\x3d\x30\x35\x50\x5d\xb1\xa6\x32\x0b\xb7\x2e\x0c\x2a\x51\xf2\xda\x0a\x29\xd2\x62\x20\xe9\xe9\x9d\x4d\x62\x94\xec\x58\xc7\x60\x66\x72\x7b\x9a\xcd\x26\xae\x39\x26\x2b\x5c\x25\x16\x1f\xa8\x58\xb4\x07\xc5\x68\x37\x14\x0e\x87\xfa\x24\xe9\xb2\xc1\x3c\xde\x83\xe4\x14\x7d\xf9\xbf\xff\xd0\xc3\xe9\x1c\x3d\xf1\xb0\x22\x81\x71\x6c\xdb\x37\x0c\x4d\xd9\xc5\x23\xfd\x65\x7f\x5d\x72\x29\x78\xa4\x3c\x20\x26\x86\x44\x26\xc5\xc4\xf3\x93\x57\xa7\x1f\x65\x7f\xe7\x2f\x86\xa3\xb3\x8f\xb2\xab\xfe\x5a\x2e\x04\xc4\xfb\x48\xe2\x46\xa1\x3f\xda\xb1\x14\xe3\xdd\x84\xf8\x21\x78\xe3\x65\xae\x02\x82\xa1\xe1\x2d\x9d\x23\x2a\x40\xbb\x1d\xce\x82\x35\xd9\x2b\x74\x9d\x21\xc9\x4d\xd9\x3d\xc8\x6d\x6b\xe6\xa2\x63\xcc\xa8\x54\xbd\x62\xad\xec\xec\x28\xe0\x1e\xf5\xad\x6c\x5a\xc6\xc6\xec\x22\x36\xa2\x54\x8b\x81\x56\x1e\x12\x81\x6a\xc1\x90\x72\x5b\x0a\x65\xc4\x93\x59\x63\xa3\x30\xa6\xdf\x69\x70\x3c\x4a\xec\x6d\xac\x18\xda\x57\x8f\xae\x17\xe5\x7f\xcc\xc8\x6c\xef\x81\x7b\x8f\x8a\x62\x87\xfe\x01\xc3\x82\xc7\xce\xaf\x1b\x97\x8a\x03\x47\x59\x05\xac\x70\x65\x9b\x63\xc6\xf1\x4c\x67\x3d\x91\x22\x95\xec\x08\xdd\x60\x0b\x0e\x41\x60\xc4\xc9\x63\xc6\xd3\x94\xaf\x2b\x3d\xcb\xca\x1e\x44\xa8\xe7\xb5\xee\x85\x14\xec\xca\x49\x7f\xea\x86\x5a\xcb\x8b\x46\x49\xd0\x1f\x0b\x73\x90\x34\x50\xd3\x1c\xd3\x53\xdd\x26\x93\x25\x3a\x56\xc1\xcc\x08\xc5\x44\x6d\x4a\x44\x91\x08\xd5\x11\x16\x24\xf1\xa4\x99\x27\xcd\x88\x67\xb9\x8e\xbc\x42\x28\xc3\x8e\x6d\x6d\xf8\x2a\x0d\xf3\x5c\xc4\x0e\xb7\x83\xc8\x93\xc5\xa0\x70\xc4\x4c\x79\xa6\xb4\xe5\x62\xe2\x44\x4d\x33\xd1\xd2\x74\xa4\x34\xb8\x80\xbb\xc1\xd2\xec\xa3\xf3\x86\xa3\xce\xbd\x99\x3e\x57\xce\x92\xf6\xf1\x07\x36\xf4\xf2\x20\x32\xde\x9f\xea\x0a\x47\x87\xb6\x3a\xf5\xea\x15\xd6\x7f\xc7\x4b\x8c\x6a\x2d\x5c\x5f\x49\xe3\x29\x59\x38\x39\xcf\xad\x77\x98\x89\x98\x6e\xd6\x95\x14\x44\x5d\x0c\x79\x48\xe7\xa9\x94\xbd\x1c\x61\x55\x3f\x74\xe6\x10\x21\x4d\x9d\x06\x76\x7b\x9e\xc9\x5b\x52\x88\xa1\xc9\xd3\x0b\xcc\xb1\x06\xf7\x29\xc6\x86\x3c\x98\x01\x59\xab\xf2\xb0\x0a\x86\xb5\x5e\xdc\x50\x9f\x1a\x47\x8d\xe8\xd3\x0c\x25\x49\x2e\xd1\x50\x02\x54\x12\xb2\x8d\xdc\x73\xe3\xf0\x02\x4f\xf9\x95\xc0\x14\xc4\x10\x27\x01\xa2\xe7\x82\x0c\xaf\xf0\x69\x34\x36\xa9\x20\x73\x0a\x49\xb6\x2c\x4a\x72\xbc\x40\x4b\x21\x14\xc4\xe3\x2b\xb0\x15\x6c\xd5\x69\x20\x72\x32\xa5\x91\x5b\x56\xe9\x5d\x1d\xb9\xe8\x90\x99\xf5\x57\x41\xbb\x8a\x5e\x9c\x8f\x8d\x73\x95\x72\x2b\x31\x51\x91\xc0\xf8\xd7\x58\x7d\xd4\x89\x21\x11\xe9\x19\x82\x23\xde\x04\xaa\x27\xc1\x63\xba\xe5\xa0\x9f\xa2\x1d\x46\xe9\x1e\x44\xec\x68\x57\xae\x78\xfa\x89\xa7\x17\x59\x41\xc5\x62\x5d\x9c\xd5\xca\x66\x55\xb7\x67\xa5\x78\x41\xc8\x35\x5d\xf7\x3c\xfc\x78\xde\xfe\xd8\x70\xde\xe1\xe8\xdf\xdf\x08\x61\x87\xcc\xa9\xed\x57\xd7\x66\x84\xd6\x42\xed\xce\xa6\xda\x84\xf2\x42\xf5\xed\x4d\xd5\xd1\x65\xc5\xae\xba\xb3\xa9\x2a\xfa\xb3\x38\x75\x77\x3f\x56\x55\xfd\x52\x56\x38\x9d\x42\x32\x4e\xc7\x0e\x1f\x19\x9c\x1d\x22\x14\x73\xaa\xdc\x61\x25\x41\x68\xde\x60\x15\xe1\x4a\xd9\x1b\x32\x51\x2a\x9b\x7a\xbd\xe1\x28\x66\xab\xf2\x2f\x78\x34\xe7\x41\x9a\x3c\xd2\xdf\x33\xca\x7e\xce\xd8\x49\x4e\x91\x14\x43\x32\x17\xb6\x03\x35\x2b\xf7\x5b\x70\x52\xa9\x33\x00\xa2\xf7\x3b\xb1\x07\x30\x6e\x59\x53\x1c\x30\xa8\xd1\xb2\xfd\xb3\xc9\x7c\xb7\xa6\x76\x8c\xdc\x5e\x76\xbe\xce\x3b\xd8\xa6\x3b\xae\xc2\x96\xcf\x32\x99\xa4\x7f\xbc\xd5\xa5\xf8\x64\x8a\x82\x67\x29\x09\x03\xe3\x0d\x7c\xef\x1e\x1b\xe5\x41\xa6\xee\xe2\x29\xc4\x37\x5e\x12\x5a\x2a\x1a\x93\x0f\x40\x98\x6b\xb9\x45\x89\x2d\xb6\x61\xa5\xc6\x04\xbf\x74\x9e\xc0\x69\xb4\x26\xe0\x80\x85\x98\x82\xbf\x77\xcd\x78\x72\xa1\x4b\xac\x13\xda\xa7\xc2\x57\xd6\xb6\x09\xb3\xff\x3d\x54\xae\xde\xe4\xbd\x58\x4c\x16\x51\x67\x3f\x31\xce\x0e\xd9\xd8\x7d\x83\xa8\x5e\x44\x7a\x99\x28\x20\x7a\x9e\x4c\x28\xf3\x40\x55\x46\x89\xaf\xc3\x37\x35\xbe\x2f\xbe\x83\x7f\x61\x7c\x63\xd6\x8b\xef\x80\x6f\x89\x68\x1d\xcd\xbc\x09\xe1\xb7\x9a\x4e\xaa\x0b\x97\xcc\x6d\x04\x8d\xb3\xaf\x45\x50\x61\x5e\x9b\x72\x65\x7c\x97\xc9\x59\x6b\x51\x3d\x8d\x6c\xf6\xd5\xd3\xb0\x60\x17\xc6\x5a\xf0\xc7\x54\x39\x2d\xbe\x6d\x22\x44\x39\xd5\xd3\xe0\x51\xfe\x0d\xf3\x20\xd0\xdf\x01\xe3\xb6\x3f\x53\xe5\x40\xe7\xc9\xe4\xab\x07\x7a\xef\x9d\xf5\xad\x3b\x64\x90\xcc\x17\xcb\x5c\xca\x8a\x4a\x74\x33\x3a\x52\x0c\x88\x8a\x0f\x41\x8e\xb7\xa1\x9e\x6a\x90\x47\xb5\x60\x56\x67\x7f\x53\xdd\x56\x47\x73\x2a\x58\x2c\x83\xf1\xb4\x19\x01\x87\x1c\x05\x94\x15\xc6\xa8\x43\xe7\x7c\x01\x31\x40\x38\xc6\x2a\xb5\x3a\xad\xcd\xad\x1e\x8d\xd9\x22\xe1\xd5\x8e\x39\x7a\x3e\xff\x48\xc5\x5f\xcc\x22\x12\x97\x44\xa2\xcb\x53\xd2\xa4\x9b\xb0\xf6\xee\x62\x8a\x49\x6d\x1a\xdf\x6d\x29\xe1\x8d\xc6\xdd\xf9\xa5\xe0\xf4\xb6\x81\xd7\xd6\x16\xeb\x83\x8f\x9f\xe4\x08\x0d\x36\x4a\xd2\x15\x4f\x27\x28\xca\xbf\x15\x90\x14\x14\xf9\x7f\xc2\xf8\x55\x12\x4e\x58\xcc\xaf\xc2\x0b\x0e\x7a\x32\xbe\xe2\xa8\x94\xb5\xa1\xe5\x56\x42\x83\x05\xbf\x10\xad\xa2\x2d\x59\x21\x54\x4f\xb7\x8b\xb4\xe4\x94\xed\x55\x94\xed\xd7\xd9\x4f\x0e\x03\xbf\xed\x85\x94\x1d\xde\xb1\xba\xf2\x32\x65\x96\x15\x7d\x81\x84\xa7\x9b\xc8\x57\x6e\x9d\xe1\xe9\x40\x9b\x69\x2b\xb3\x8e\xc1\xe9\x89\xf6\xd1\xd0\x85\xa7\xa7\xdb\xaa\xf0\xb5\xc9\x05\xfe\xbf\x3a\xda\x88\x7b\x15\xc9\x6a\xca\x74\x1e\x5f\x3f\xa7\xa1\x88\x26\xa0\x74\x3c\x64\xe7\xf4\xea\xd0\x20\x5d\xa4\xba\xba\x35\xb4\x3b\x3b\x78\xb1\x83\xc4\xff\xf1\x81\x05\xc7\xb8\x2a\x43\xdc\x4a\xf5\xe4\x22\x09\xa3\x6d\xf2\xea\xc0\xae\x61\xec\x03\xf8\x9e\xfe\xb6\xcc\x72\xdb\x90\x44\x41\xd3\x61\x8d\x26\xa8\xa9\xc1\x77\x3d\xbc\xee\x8e\xd7\xfa\x96\x80\xf7\x83\x24\xb3\x72\x3d\xb0\xf3\x76\x03\xf4\xae\xef\x5e\x3d\x7f\xf5\xfa\xc3\xab\x8f\x5e\x03\x90\x5a\xfe\xff\x63\x43\x0f\x7e\x04\x91\xa7\xd3\x64\x45\x20\x3a\x7b\x0d\x09\x62\x78\x3a\x90\xcd\x87\xa7\x83\x46\x95\x40\xc2\x74\x30\xee\x86\xf9\xc5\x2a\xa5\xab\xd2\xb9\xef\x77\x1a\xcc\x3b\x1f\xf9\x12\x18\x70\x7c\x49\x5f\x4f\x98\xf7\xc6\x6b\x00\xfd\xc1\xaf\x75\x0b\x08\x16\x3e\xea\x6c\xff\xfd\x51\xa3\x0c\x6d\x1b\xa0\x75\x8a\xd0\xfe\xd3\x40\xfb\xcf\x4a\x68\x3b\x95\xd0\x76\x00\xda\x76\x11\xda\x5b\x03\xed\x6d\x25\xb4\xdd\x4a\x68\xbb\x00\x6d\xa7\x08\xed\xd4\x40\x3b\xad\x84\xd6\xad\x84\xd6\x05\x68\xbb\x00\x8d\x9a\xfb\xbb\x7f\xf7\x8a\xab\x51\x82\xb6\x5f\x09\x6d\x0f\xa0\x75\x1d\x68\x7b\x77\x80\x76\x50\x09\x6d\x1f\xa0\xed\x39\xd0\xf6\x6f\x87\xb6\xed\x57\x42\x3b\x00\x68\xfb\x0e\xb4\x83\x3b\x40\xeb\x54\x41\xeb\xb4\x01\xda\x81\x0d\xad\xd3\xbe\x03\xb4\x4a\x7a\xeb\xf8\x48\xbd\xed\x8f\x66\x11\x3b\xfe\x1d\xa0\x55\xd2\x5b\x87\xf6\x82\x6f\x43\xdb\xbe\x1d\xda\x4e\xf5\x4c\x71\x2f\xf8\x1d\x1b\xda\xce\x1d\xa0\x15\x66\xaa\x18\xc1\x29\x46\x9e\x37\x9c\xc0\x3f\x90\xe3\xfd\x1f\x09\x51\xc3\xc8\x66\x35\x29\xcb\x78\xff\x21\x29\x19\x7e\xfb\xd5\xab\xd7\x1b\x6e\x47\xe6\x1f\xf1\x1a\x00\xb7\x73\x20\x19\x8b\xff\xd0\x06\x17\xd4\x3c\x0c\x45\xf7\x6a\x39\x87\xfc\x0e\x8c\x61\x59\x2f\xca\x55\x11\xfc\xfd\x52\xe4\x1c\x0b\x14\xb8\x5d\xc9\xeb\xbc\xce\x7f\x7c\x2f\x70\xbe\x04\xb7\xfd\xff\xbe\x17\xb8\x8e\x04\xb7\xf3\x6f\xdf\x0b\xdc\xb6\x04\xb7\xfb\xef\xdf\x0b\xdc\x8e\x04\xd7\xfd\xf5\x7b\x81\xdb\x95\xe0\xf6\x7e\xf8\x5e\xe0\xba\x12\xdc\xfe\xe3\xef\x05\x0e\x0e\xb4\x83\xda\x77\x02\xb7\xb3\x2f\xc1\xb5\xeb\x25\x70\x4e\x1a\x54\x09\xa1\x00\xb0\xb2\x92\xde\xcd\xfb\x92\x0b\x36\x3f\xdd\x0e\xf5\x96\xef\x06\xa0\x64\xf9\x47\x4f\xbe\x17\x40\x94\x14\xc4\x34\xb9\x66\xcd\x4f\x20\x79\x1f\x3d\xa1\x9e\xf6\xb6\xbf\xef\xd0\xbb\xfe\x1f\x35\xf2\x93\x9c\x47\x21\x8f\xd9\x93\xc7\x6a\xe8\xb2\xab\x27\x65\x4a\xfb\x8a\xae\x10\xe2\x3e\x0a\x60\xfd\xe7\xa7\x6f\x24\x5b\x1e\x67\x35\x4c\x0a\xda\x60\xde\x2f\x63\x09\x07\x4a\xc6\xf0\xb7\x2c\xaf\x6f\x14\x9f\x8c\x70\x19\xa6\x36\x57\x3e\xc0\x1e\xce\x7a\x7d\xd9\x41\x36\xab\x79\xbf\xe4\xe6\x00\xf8\x8b\x84\x08\x92\x6f\x43\x33\xe0\x06\x2b\xcb\x65\xfb\xc0\xee\xfe\xfa\x9f\x5e\x63\x03\xe7\x66\xc8\xdd\x41\x9a\x2a\x89\x7a\x1a\x0a\x6c\xad\xd5\x87\xdb\xa0\x7c\xb8\x11\x4a\x17\x0e\x06\x31\xbc\x0d\xca\xf0\xe6\xb1\x00\xc7\x4d\xdf\xde\x06\xe5\xed\xcd\x50\x80\x33\xe6\x67\xb7\x41\x39\xbb\x19\x0a\xcc\x68\xfd\xdf\xb7\x41\xf9\xef\x9b\xa1\x00\x5b\x5d\xbe\xbb\x0d\xca\xbb\x1b\xa1\xec\xc1\xd1\x11\x9e\xdc\x06\xe5\xe4\x66\x28\x30\xa3\xe4\xf5\x6d\x50\x5e\xdf\x3c\x23\x38\xb3\x17\x6f\x6e\x83\xf2\xe6\x46\x28\x1d\x94\x18\xff\x76\x1b\x94\xf3\x9b\xa1\x80\x6c\xf7\xf1\xcb\x6d\x50\x3e\xde\x02\x45\xca\x9b\xbf\xfc\xf2\x19\xc0\x6c\x86\xf2\xcb\x2f\xce\x56\x2f\x6f\xf3\x51\xb2\x4c\xf3\x19\xec\x73\x56\xfb\x20\x20\xd4\x90\x15\x1d\xee\xcf\xe8\x3e\x02\x31\xe3\x30\xb2\xf4\xb1\xb8\x3a\x4b\x92\x88\xd2\xb3\xb2\xf3\x0e\xe0\xf6\x7c\xd0\x7b\x03\x36\x37\x66\xe7\xeb\x5f\x36\xfc\xdb\xc4\x22\xba\x40\x7e\x60\x36\xc4\x1c\x14\xc1\x84\x7a\x74\x6a\x56\xfc\xdb\xb8\xfa\x40\x89\xd9\x69\x35\xc0\xd3\xfb\x03\xec\xc2\x51\x3c\x39\xae\x06\x78\x7c\x7f\x80\x7b\x80\xc3\xe9\xa8\x1a\xe0\xe8\x2b\x00\x02\x9b\xbd\xf8\xb9\x1a\xe0\xcf\x5f\x01\x10\xb8\xdc\xec\x59\x35\xc0\x67\x5f\x01\x10\x18\xde\x6f\x7f\x2e\x01\x54\x92\xfe\x9f\x25\x4c\x49\x23\x05\xd0\x1b\x01\x02\xd9\x5c\x3e\xdf\x08\xf0\xb9\x16\xae\x20\x54\xdf\x27\x75\x7f\xd8\x08\x10\xc4\xc1\xe8\xc5\x46\x80\x2f\xee\x39\x42\x7f\x5f\xde\xad\x9f\x1e\x96\x00\x5a\xe7\xe6\xbd\x70\xd8\x81\x8b\xdd\x2f\xde\x23\xaf\xf1\x7d\x00\xfa\xdb\xa8\x83\x79\x75\x36\x7c\x0b\x06\x74\xbf\xa4\x08\x9a\xdc\x2a\x36\x02\xd4\xdf\x2b\x18\x4c\x38\x55\xfc\x85\xc2\x52\x62\xe0\x9f\x8c\x6c\xc6\x54\x8e\x0d\x96\xcd\x92\x34\x0f\x96\x79\xd6\x62\xec\x75\x0c\x8a\x2b\x05\xc3\xe4\x6c\x00\xcf\x27\xe0\x4f\x83\xad\xf7\x90\x18\x98\x32\xf8\xc2\x07\x29\x35\xcb\x0f\x18\x56\x96\x74\x5c\x98\xc4\x41\x81\xa2\xb6\x58\x53\x99\x52\x00\x8f\x23\x03\x25\x1d\x3b\x8d\x9e\xe8\xd0\x81\x82\xb3\x4c\x44\x42\xd9\x51\xa8\xfc\x16\x13\x9b\x55\xbe\x47\xa0\x8f\x9b\xef\x15\x58\x0a\x21\x53\x05\xbd\x06\xe1\xae\x14\x24\x34\x9e\xc8\x84\x98\x93\xbd\x53\x2a\x82\xe4\x22\x0e\x7f\x47\xeb\x14\xc4\x4f\x9e\x24\x75\x75\x43\x06\xd2\x3c\x3f\x7d\x76\x32\x3a\x2b\x2a\xdb\xca\xff\x36\x31\xda\x03\xe0\x3a\xbf\xff\xc5\x3d\x42\x80\xb4\xff\x52\xde\xd0\x1b\xb9\x2b\x30\xc3\xeb\xff\xaa\x80\xf2\x5f\x77\x87\xd2\x05\x89\x2e\x18\x14\xa0\xa8\xeb\xd2\xe0\x93\x03\xca\xad\x20\xd1\x3e\xb0\xe4\xf8\x7d\xc0\xce\xd5\xfb\x0d\xb0\xde\xdf\x06\xeb\xbd\x7d\x27\x00\x58\x60\xbd\x5a\xc1\x01\xfa\x05\x0e\x60\x57\xd0\xbf\xc3\x77\xcd\x54\x00\x5b\xf1\xab\x0d\x63\x7b\x75\xdb\xd8\x5e\x59\x63\xdb\x03\x9c\xcd\x5f\x56\x60\xfe\xe5\xdd\x31\xef\xcb\x05\xf4\x1a\x7f\x72\xa1\xf0\x28\xaf\x11\x17\x71\x38\xdc\x46\x28\x92\x98\xbc\xd6\x8f\xdf\x0a\x45\xca\x46\x5b\x3f\x55\x63\xfb\x93\xd6\xfd\xfc\x04\xbc\xfb\x06\xa9\xe6\x34\xbc\xce\x67\x98\xd7\x19\xac\xf0\x2c\xe5\x12\xaa\x99\x07\x67\x6f\x5f\x6c\x12\x57\x9c\x22\x83\x26\x68\xd7\x7b\x01\x1b\xee\xee\xed\x0e\xe0\x24\x3e\x7f\xd1\x7b\x73\xbf\xfe\xb6\xe1\xc0\x65\x5e\x09\x65\x46\x0d\xb6\x09\x8b\x07\xd0\xf4\xfc\xed\x7d\xbb\x3c\x40\xee\xff\xf6\xe5\xf0\xd5\x3b\xc3\x55\x6e\x6c\xe7\xbe\x68\xc0\x5b\x81\x7a\x12\xd8\xc1\x51\xbc\x79\x7b\x76\x3a\x78\x7b\xe3\x8b\x00\xe2\x77\x07\xd4\xd8\xa7\x83\xb7\x2f\x9e\x5b\xa3\xde\x58\x1d\xee\x05\xe7\xfd\xb7\xc3\xde\x2d\xd5\x9d\xc7\x12\x78\xcd\x4b\xa6\x2c\x0b\xaf\xf1\xe9\x0e\x13\x80\x93\x11\x28\x26\x68\x81\xc1\x83\x30\x71\x7e\xf2\xea\x74\xf8\x16\x16\x1c\x36\xe0\x73\xb1\xc6\xd4\x99\xb4\x4b\x8b\x0b\x50\x5a\x89\x6d\xe4\xd3\xcf\x5e\xbf\x1c\x22\xd5\x28\x30\xcf\x92\xb9\xd0\x5b\xfd\x76\x30\xb8\x30\x6f\x7e\x7e\xf7\xc6\x05\xf3\x86\x5f\x88\x77\x8b\xbb\x8e\x66\x07\x47\x73\x3c\x44\xb2\x30\x60\x8e\x45\x64\xf8\xce\xed\xa3\xd9\x25\x21\xe1\xb8\x00\x66\x18\x4f\xee\x03\x66\x87\x26\x75\x4c\x2f\x46\xf6\xa4\x20\x9b\x49\x15\x8d\x57\x6d\xf6\x9e\x5c\x39\xfd\xc6\x25\x8f\x6d\x2b\x32\x2c\x18\x63\xab\x00\x5a\xb0\xce\x65\xbb\x1c\xcc\x29\xaf\xc0\x99\x58\xad\xd0\x96\x0e\x71\xc8\x2e\xab\xa2\xd3\x29\x07\x2b\x98\x07\x3c\x4a\xa8\x95\xd1\xb3\x80\x41\xd1\xda\xdc\xbe\x32\xf0\x78\xa0\x10\xe1\xc2\xb8\x13\x2a\x70\x24\x70\x3d\x7d\x7b\xf2\xf3\x33\x20\x59\x1e\xd4\x48\x39\x23\x4f\x55\x7a\x14\x1a\xdc\x0d\xd2\x9e\x71\x9e\x68\x30\x0b\xd2\xb1\x81\x74\x7c\xa7\xe5\x39\xf7\x77\xe0\xb1\xeb\xd5\xbb\x97\x2f\x5e\x0f\x9e\xdf\xe9\x65\xf0\x43\x98\xcf\x58\xbc\x9c\xd3\x66\x9d\x6a\x5f\x95\x05\x9f\xb0\x0b\x11\x8b\x94\xe7\x24\x3e\x42\x7a\x0a\x70\x15\x41\x97\xad\xcc\xda\xca\xb6\x98\xe6\xd9\x3b\xdf\x73\x1f\x46\xf1\x3d\x1f\x5c\x66\x0d\x24\x65\x80\x9f\x8a\x4c\xc5\xa0\xdc\xda\x62\x68\x64\x86\x56\xe1\x7a\x80\xb1\x35\xa6\x65\x1c\xfe\x75\x69\x8d\xa8\xd5\x52\xda\x33\xdc\x7b\xcf\xdf\xc0\x8b\xce\x46\xb4\x95\x79\xf9\x1e\xb5\xf3\xef\xd9\x6e\x9f\xda\x75\xee\xd9\xee\x80\xda\x6d\xdf\xaf\x9d\xdf\x06\x12\x7e\xfe\x66\xe7\xbe\xed\x7c\x6c\xb7\x7b\xdf\x76\x1d\x6c\xd7\xbd\x6f\xbb\x6d\x6c\xb7\x77\xdf\x76\x3b\xd8\x6e\xff\xbe\xed\x76\xb1\xdd\xc1\x7d\xdb\xed\x61\xbb\x27\x1f\xbf\x9f\x6a\xbe\x7d\x80\x30\x9b\xdf\x13\x66\x17\x61\x3e\xbe\xe7\xfc\x7c\x5a\xf7\xad\xfb\xb6\x23\x3a\x6b\xdd\xb9\x9d\xbe\xf9\xa1\xfe\xea\xb5\x71\xb1\x64\x79\xb2\xb0\x45\xc3\x2e\xcc\xa5\xdf\x43\x3e\xc5\xc0\xb6\x88\x1e\xd4\x9f\x28\xc3\x01\xf9\x4b\xbd\xf0\x9a\xfe\x64\x83\xd5\x40\x17\x5f\xbf\x3f\xa8\x83\xd2\x81\xf7\x9f\x0a\xde\x7f\x56\xc1\xab\x7c\xc7\xed\xc2\x51\xf3\x76\xf8\xe2\x75\x0f\x40\x3a\xf0\xde\x2a\x78\x6f\xab\xe0\x55\x5a\x0e\xec\xe3\x4b\x2e\xc9\x67\x85\xf1\x9d\x2a\x78\xa7\x55\xf0\x2a\x6d\x07\xf6\x61\x4f\x7e\x20\xef\x3b\x84\x67\x99\x10\x38\x57\x92\x02\xbc\x2a\xeb\x81\x0e\xda\x22\xf4\xdf\x9e\x9c\x35\xd1\xb8\xc1\x82\xb7\x77\x33\xbc\x2a\xfb\x81\x0e\x5a\x23\x48\x78\x4f\x4a\xf0\xf6\x6f\x84\xe7\x5a\x10\x68\x92\xf2\xf7\xb6\xd9\xf9\xcb\x77\x67\xc3\x8f\x0d\xe6\xef\xed\xb0\xf3\xf7\xaf\x5f\x34\x3f\xc2\x79\xe2\xef\xed\xc2\x9f\x4f\x3e\x82\x5b\x21\x98\xb1\x19\x73\x76\x4d\x8b\x0a\x12\xe6\xe0\x63\x73\x1e\xf3\x0b\x91\x36\x30\x63\x84\x07\x99\x00\xae\xc0\xba\x07\xa4\x91\x79\xcb\xca\x2e\x25\x3b\x0f\x33\xc6\xa3\x2c\x29\xbc\x37\x79\x19\x6b\x7e\x52\x76\x40\x92\xb8\x5d\x6f\xd6\x21\x66\xb5\x34\x99\x80\x51\xbf\x90\xa4\x94\x42\x1f\x8e\x2f\xe5\x67\x75\x37\xfb\x7f\x5b\x36\xde\x90\x84\xce\xf1\xc6\x45\x23\x4a\x6c\xf0\x06\x7a\x77\x12\x86\x38\x31\x14\x6e\xb3\xcb\x32\xb1\x0c\xd0\xa2\xac\xf3\x77\xaf\x6a\xba\x59\x90\x26\x94\xb2\x1b\x7f\x85\x8c\xa3\xe3\xe5\x74\x2a\xd2\x6f\x9f\x3b\x08\xf4\x9b\x52\x33\xba\x53\x9f\x25\x73\xf1\x5c\xac\xb3\x53\x1c\xd0\xaf\xf6\xbc\x2d\xbf\x02\x4c\x22\x55\x69\x66\x6a\xaa\x5b\x66\xdb\x85\x5e\x2a\x4c\xb5\x95\x61\xa3\x83\xad\x67\x6e\xa8\x66\xfb\xdb\x6b\xfc\x56\x4e\x49\x6d\x42\xaa\x22\x26\xe5\xe4\x31\x44\xd0\xad\x4b\xa6\x8c\xf5\xfe\xd1\xeb\x23\xef\x26\x7f\xc0\xf2\x54\x9b\x01\x7f\xcf\xf5\x19\xdd\xb0\x3e\xa3\x3b\xae\xcf\x30\x9e\xfc\x8b\x2f\x0f\x5d\x64\xef\xb6\x42\x0b\x7e\xb1\x71\x85\x4a\x48\x3a\xdf\xfd\xbb\xf7\xf4\x56\x0c\x61\xff\xdf\x8e\x24\x44\x42\x9e\x2e\x05\x3b\x1e\xbe\x00\x47\xda\x6c\x39\x86\xd0\x40\x22\xe7\xc6\xaf\x41\xf9\x19\xbe\x8e\xcd\x51\xd0\xa0\x78\xb5\x97\x31\xb1\x65\x1e\xa9\x3c\x51\x0c\x03\x21\x52\x5e\xf3\x0b\x91\x33\x2e\xe1\x53\x8a\x14\xcc\x94\xf0\x98\x05\x11\x0f\xe7\xe4\x8d\x52\x68\x1f\x27\xb9\x72\x45\x6e\x38\x7d\x48\x28\x18\x28\x5a\xa7\x3c\x87\x18\x42\x31\xc5\x73\xe0\x18\xad\x17\x53\x04\x86\x10\x82\xda\x9a\x05\xeb\x73\x88\x17\x1b\xab\x7a\x8b\x54\x4c\xa1\x83\x80\xc7\x72\xe6\x14\x34\xc4\x9d\xbc\x0e\x1f\x11\xf0\xec\x3e\x44\x72\x2c\xa2\xbb\x1d\x2e\x3c\xca\xb5\x0f\x07\x26\xe5\x33\x2e\x1d\x3f\xfc\x40\xbb\xac\xd4\xc4\xce\x83\xf6\x83\x71\x49\x28\x93\x14\x18\x50\x3c\x2d\x1e\x3b\xdb\xff\x8c\x63\x47\xeb\x4a\xfe\x88\x9d\xd3\xbd\xeb\xce\x81\xb0\x43\xff\xda\x0c\x46\xa9\x63\xee\x86\xa7\x12\x73\x2e\x88\x27\xb6\xab\xe9\x26\xc4\xbc\x08\x63\xcd\x52\xee\x81\x18\x37\x3a\xd3\x37\x3a\x72\xdd\x7e\xe6\xfc\x44\x6b\xdd\xf3\xd8\x21\x9d\x2a\xbd\x7f\x02\x1d\x1b\x4d\xd7\x3f\x76\x81\x0c\xe5\xfe\xeb\x2f\x51\xdf\x2c\x51\xdf\x5d\x22\x4c\x3d\x47\x41\x9c\xe6\x3c\x5d\x6f\x41\x40\x84\x98\xe7\xb0\x58\x42\xc4\x99\x72\x3f\x2f\x2f\xde\x5d\x57\x09\x1f\xcd\x9d\xe5\x51\xe9\x94\x2a\xc2\xed\x18\x64\xaf\xc2\x85\x18\x24\x71\x2e\xe2\x3c\xfb\x66\x26\x01\x4f\xa9\xf0\xe6\xea\xb7\x5a\x07\xc5\x47\x55\x45\x86\xf2\xa6\xe4\xc4\x9b\xa0\xd3\xd6\xdc\x9d\x10\x84\x79\xc1\x3d\xa0\xe4\x7c\x18\xc2\x29\x5a\x53\xca\xb7\x85\x08\x42\x1e\x59\x01\x90\xe6\x70\x8b\x83\x50\x17\x09\x76\x13\xc6\xec\x5a\x4e\x44\x76\x7e\x11\x27\x73\xd1\xd4\x33\x47\x0f\xd1\x94\xc7\x17\xf0\x84\x9c\x0a\x80\x0c\xfd\x75\x5a\xad\x7d\x38\xcf\x25\xa8\x95\xca\x58\xc6\x60\x52\x98\x08\x89\xc4\x02\x88\xa6\x8a\x5a\xcd\xd5\x2c\x89\x14\x38\x1a\xd9\x9d\xd7\x8e\x2c\x4e\x6f\x58\xbd\x7f\xbe\xab\x59\xf9\x1c\xd7\x98\x94\xcb\x4e\x73\x18\x8b\x94\x8e\xe7\xaf\xbd\x2c\xaa\x94\xb7\x9b\xd3\x97\xb8\xe9\x6f\x7d\xef\x50\x9f\x8b\x3e\x49\xe3\xf8\xa5\x63\xbe\xa8\x57\x39\xfb\xf3\x76\xe1\xf3\xb9\xfb\x79\xa7\xf0\xf9\x97\x5f\xdc\xef\xbb\x85\xef\x1f\xdd\xcf\xdd\xc2\xe7\x5f\xdd\xcf\x7b\x85\xcf\x9f\xdc\xcf\xfb\xd6\xa4\xb4\x3c\xa3\x3e\x1e\x58\x1f\x0f\xbc\x52\xe8\x00\x7b\x2f\xf6\xa2\xfc\xde\x5b\xf1\x2e\x14\x4b\xe6\xcb\x37\x10\xec\x2d\xe4\x82\x00\xbe\x9d\x5a\x6e\xad\x49\x4a\xa1\x8d\xdc\x0a\x8c\x42\xfe\x08\x14\x29\x13\xf1\xaf\xc7\x11\x41\xf8\xe7\x22\x89\x04\x87\x5f\x07\x90\x3a\x32\xce\x45\xba\x48\x4d\xe6\x7b\x0a\x0f\x0b\x37\x94\x20\x59\xac\x59\x90\xcc\xe7\x3c\xae\x4e\xcf\xb1\x81\xf3\x0d\x6e\x42\x11\x05\xa3\x10\xca\xc3\x77\x03\xba\x2e\x44\x7e\x4c\xb1\x93\x6a\x75\xf9\xd7\xa9\x6a\x63\xe5\xe9\x7b\xa8\x01\x41\x7c\xe3\x28\xe2\x8b\x4c\x4c\x9c\x60\x11\x0e\x74\x29\x29\x0c\x06\x72\x56\x05\xf4\xdb\xe9\xa8\xd0\x60\x49\x99\x14\x01\x0e\xec\xc8\xae\xb6\x61\x12\xe2\x52\x62\x52\x3d\x61\xb6\x0c\x9c\x37\x94\xca\x51\x59\x5d\xb1\xf1\x9a\x45\x22\xcf\x55\xbc\xb8\x42\x6e\x49\xec\x16\x4d\xb1\xe6\x49\x96\x1b\x40\x54\x91\xf2\xbd\xaa\xe8\x3a\x8f\x93\x38\x5a\x3f\x66\x2b\x0e\x91\x9e\x30\x7a\x70\x2e\xae\x73\xe5\x30\x1c\x44\xe1\x02\x95\xee\x96\x53\x2c\xb9\xc4\x7a\x93\x34\xbc\x12\xcd\xf1\xda\x63\x2b\x31\x56\x63\xbe\x81\x78\x21\x25\x8a\x5e\x81\xde\x34\x17\xa9\x44\xa3\xed\xbb\x9b\x89\xfc\x2c\x9c\x8b\x64\x99\xd7\xcc\xaa\x04\xb4\x26\x67\xc9\x30\x9e\x40\x40\x57\xf3\xb1\xde\x60\xbb\x26\x1b\x55\xc1\xd5\xf5\x2e\xfe\xb1\x56\x56\xa9\x87\x37\xac\xf3\x4d\xcb\x8c\x86\x64\x7f\xc4\x62\xcf\x79\x0c\x82\x8d\x32\xc2\x83\x8c\x3c\xab\x24\xbd\x84\x58\x4c\x59\x98\x2f\x29\x62\x24\x64\x49\x35\x80\x54\xc0\xb0\x96\xb8\x16\xc1\x00\xf7\x5e\xcd\x93\x20\xbd\x3a\x6a\x9f\xa3\x64\x65\x12\xb0\xfd\x4b\xac\xd9\xa6\x01\x24\x8b\xb5\xee\xff\x2c\x19\x28\x82\xac\x15\x02\x96\xdf\xe9\x06\x60\x45\x34\x37\xc7\x68\x7b\xbb\xfa\xea\x44\x1c\xee\x95\xe4\x70\xc9\x02\xc2\xf6\xc7\x62\xa5\x74\xfe\xc4\xfa\xe1\x29\x3b\x4a\x50\xf6\xbf\x97\x60\x77\xdb\x09\x50\xa6\x38\xec\xb9\x25\xc7\x52\xd3\x2b\xac\xfb\x9e\x81\x12\xc7\xf3\xca\x51\x87\xbc\x00\xa4\xd2\xa3\x38\x69\x04\x51\x92\x89\xa3\xb5\xc8\x1a\xa9\xc8\xc2\xdf\xf1\x57\x75\xb9\x48\x33\xf8\xd3\x73\xf2\xdc\x11\x88\x79\x18\x87\xf3\xf0\x77\x3e\x8e\xb0\xcd\x2a\x9c\xe4\xb3\x23\x8f\x3d\x51\xa3\x0a\xe3\x58\xa4\x1f\x64\x69\x55\xf3\xc6\x4c\x84\x17\xb3\xbc\xd4\xe0\x19\x14\x7f\xdb\x55\x4e\x2e\xa1\xb8\x71\x09\xdf\xc3\x21\x95\x65\x4b\x29\x25\xe3\xb3\x89\x75\x20\x15\x03\x05\x8f\xc5\x8c\x5f\x85\xd0\x02\x03\xbb\xcb\xfa\x14\x18\x57\xa9\xcb\xb2\x4c\x64\x8e\x15\x29\x9a\x23\x60\x0e\xf6\xc7\xd8\xe7\xc6\x26\xef\x29\xd3\x3b\x45\x01\x9c\x46\x21\x3c\x32\xd9\x51\xeb\x3c\xc9\x7c\x9a\x57\x4d\xe8\xdc\x03\x05\x1d\x46\x65\xa5\x01\xdf\x95\xca\xde\xdf\x46\x65\x35\x3b\x18\x89\xca\xe0\xe6\xb0\xc0\xf7\xf0\xd2\x63\x29\xc5\x6b\x6e\x8b\x0a\xae\x49\x4d\xec\xb4\xdf\x42\x65\x50\x27\x37\x75\x39\x31\x88\x41\xb6\x4c\x33\x11\x5d\xa1\x15\x08\x44\xef\x89\x22\x7d\x56\x6d\xbd\x3e\xc5\xb4\x64\x84\x37\x2b\x8f\x1d\xb5\x6f\x31\x79\x3d\xe4\xe3\x68\x0d\x56\xc5\x73\x1e\xbc\x3e\x6d\x50\xed\x2d\x7b\x7d\xac\xc0\xf4\x3a\xe7\xf2\xb3\x64\x25\xae\x44\x4a\x27\x22\x64\x50\x66\xe9\x32\xc6\x78\xfc\x2b\x31\x06\x33\x92\x34\x44\xe2\x83\xc7\xbd\x70\xca\xc2\x9c\x4d\x79\x18\x65\xa0\x2f\x85\x54\x67\x0a\xdc\x94\xd3\x0d\x9d\x58\x83\x7d\x4c\xc7\x3c\x0f\xaf\x84\x21\xad\xda\x2c\x59\x88\xe9\x32\x8a\xd6\x75\x96\xc9\x4b\xeb\x32\x6b\x6d\x10\x37\x6c\xd9\x0f\xf2\x2e\x7c\x0d\xdb\x13\x51\x26\xee\x7b\x36\x16\xf6\x98\xdf\xad\xdc\x63\xe5\x94\xe0\xdf\x9f\x5f\xa2\x09\xed\xff\x2d\x7e\x99\x2c\xf3\xfb\xf1\x4b\x68\xf0\x3d\xf8\xe5\xb7\xc8\xfb\x64\x80\x9f\xd8\xef\xd0\x4a\x04\x85\x90\xd4\x9b\x2f\x02\x18\xc7\xd0\xbd\x0b\x50\x66\x27\x3b\xe1\x81\x25\x2a\x49\x16\x5c\xc1\x43\x61\x0c\x24\x73\x51\xfa\x79\x78\x74\x07\xfd\x4e\xca\xe3\x6c\x1e\xe6\x8c\xc7\x2a\xc9\x64\x2d\x9c\xb2\x62\xfa\x4d\x10\xa5\xea\x14\xd5\x19\xdf\xf7\xbd\xc0\x93\x1d\x7a\x03\xaf\x6a\x60\x8e\x08\xb7\x02\x8a\xc7\x19\x5b\x08\x50\x11\xd5\xe9\x89\x04\xde\x53\x40\xc5\x97\xa0\xc2\x08\x63\x66\xab\x3b\x4b\x96\x98\x99\x5d\xc6\xc9\x2a\x03\x85\x92\x00\xfb\x96\x99\x98\x53\x5e\xad\x48\x56\x4b\x40\x83\x83\x37\x4e\x44\xe3\x8c\x43\x2c\xd5\xa4\xb0\x2c\xe3\x35\x86\x09\x99\x85\x86\xf3\x40\x4a\x9f\x0b\x1e\xde\x6b\xb3\xdd\x7a\xf7\x52\xdb\xe9\x8e\x57\xaf\xa7\xa5\x3d\xca\x3e\x7f\x36\x52\xaa\x7b\x31\xab\xba\x85\x61\x94\x28\xc0\x20\x24\xc0\xa5\x07\xb2\xb1\x90\xd3\x9c\x89\x68\x02\xd4\x62\xd3\x91\x1e\x61\x41\xf6\xd6\xf6\x85\x84\x34\x13\x11\x8e\x82\xf3\x27\x13\x81\x41\x65\xf9\x04\x75\xaf\xc3\xd3\x01\xab\xa6\xa1\x3c\x5d\x1a\x03\xd4\x95\x20\xe4\x53\x78\xf6\x89\x08\xc2\x89\x64\xf9\xf9\x4a\x88\x18\xe8\x0b\x6c\x1a\x81\xc0\xcc\xee\xad\xd4\x67\x39\x01\xc2\x20\xd5\xaf\x93\x8b\x5e\xa5\x3b\x06\x73\xd7\x88\x76\x5b\xe1\x26\x28\xf7\x40\xc5\xf5\xfb\x1b\x64\x7d\x4b\xce\xb7\x03\x46\x6e\x5c\x46\xe7\x0a\x50\xab\xb3\x2f\x5a\xec\xff\x72\x17\x66\x84\xc7\x50\x99\x13\x41\xdc\x9f\xc4\x84\x0c\x82\x65\x7c\xdf\x60\x13\xb1\xa0\xfc\xe3\x49\x5c\x16\x98\x58\x0f\x0d\x82\xa1\xb5\xc5\x41\xde\x63\xbe\x73\xc9\xcb\xee\xc4\xc7\x50\xba\x2b\xc9\x90\x77\xdd\x58\xb7\xca\x63\xdf\xac\xcd\x29\x3e\x1d\xa2\xbe\xe8\xbd\x0e\x34\x75\x33\x24\x1d\x60\xea\x7e\x87\xc4\x33\xa4\xb9\x69\x12\xe7\xec\xf7\x24\x99\x5b\xf9\x0d\xad\x68\x47\x5e\x66\x52\xc0\xca\x5a\x6c\x06\x14\x3a\x0e\x73\x8c\x90\xae\x44\xf4\x9c\x05\x22\xcd\xb9\xaa\x15\x89\x2b\x81\xd9\x49\x59\x2f\x47\x03\xe0\x39\xa7\x24\x0a\x24\x9a\x61\x58\x6e\x9e\x2d\x53\x31\x61\x78\x74\x62\xae\xfb\x34\x59\x41\x98\x5b\x71\x9d\xb3\x09\x64\xa1\xc8\x48\x93\x81\xfc\x98\xea\xc2\xeb\xc2\x8a\x67\x4c\x5c\x2f\xa2\x30\x08\xf3\x68\x2d\xc9\x5d\xcd\xe1\x83\x4e\xb6\x28\x9c\xad\x06\xc3\x53\xb1\xc4\x24\x53\xbe\xc0\xef\xf8\x50\xfb\x26\x49\x73\x2f\x43\xa4\x48\xd9\x01\xa4\xd7\xc7\x14\x73\x4c\x56\x83\xe9\xde\x95\x7a\x5c\x53\xce\x5b\xa8\xe8\x61\x85\xca\xca\x01\xf0\x17\x39\x72\xe7\x21\xd9\xe5\xb4\x70\xfd\x78\xf3\xf2\x2f\xea\x4d\x21\xc3\xb9\xea\xe7\x28\x9b\x09\x6b\x0b\x85\x44\xbb\xeb\x41\x73\xa8\xb4\x11\x08\xa4\x37\xb1\xa0\xd8\xb6\x0e\x0a\x0c\x9d\xed\x6c\xc5\x31\xe0\xab\xb6\xe6\xd7\x2f\x1d\x18\x21\x3b\xcb\x05\x87\x24\x63\x7c\x3a\x95\xec\x27\xbe\x80\x9e\x8c\x44\xed\x30\x59\x88\xf6\xda\xfc\x54\x8c\xf3\x2a\xc5\x85\xa9\xf7\x14\x3a\xfe\xf5\x93\x36\x16\x7c\x1d\x47\x6b\xf6\xeb\x27\x39\xc4\x2b\x1e\x85\x13\x24\xb6\x84\x84\x22\x27\xdd\x7d\x9c\xa8\xd0\xca\xad\xaf\x92\xcf\x6e\x60\xcd\x17\x22\x97\x4b\x36\xe2\x41\x9e\xa4\xb5\x3a\x7b\x68\xe5\x32\xb7\xf3\x0b\xc2\x0d\x2a\x67\xfe\xa1\x8f\xb8\x9e\x42\x83\x86\x3e\x24\xe4\x95\x88\x3d\xd9\x6a\x6e\xb5\x91\x6e\x15\x22\xe1\xda\xe9\x28\x0a\xa1\x3d\x5e\x7a\x24\x15\x0b\x9e\x85\xc8\x1b\x95\x8d\xfd\x92\x78\xe5\x85\xc0\x48\xa0\xf2\x77\xbf\xdd\xfe\xf7\x3b\xce\xdd\xb9\x65\x40\x32\x76\x48\x0a\x72\x73\x76\x7a\xc8\x35\x4f\x2b\xd8\xf6\x0a\x29\x67\x2b\x5e\x8c\x45\x3e\x4a\xe2\xfc\x34\xfc\x5d\x50\xca\x7a\x27\xcf\x2c\x28\x91\xe5\xc6\xbc\x49\x88\xd1\x00\xea\x56\xc6\x5b\x35\x86\xa6\x27\xe5\x98\x32\x75\xa1\xb5\xb6\x19\x1f\xf4\xd2\x3c\x62\x7e\x65\xb6\x5b\xf8\xfa\xc4\x7c\x7d\x70\xe3\x2b\xb8\x35\x24\xd9\xb0\x7e\x77\xf1\xde\x7a\xa0\xbd\x47\xda\xa8\x05\x65\xab\xfa\xbf\x92\x3c\x1d\x73\xae\xc9\x01\xe8\x6c\x00\xe3\x30\xc7\xa7\x76\x15\x84\x0f\x62\x58\x83\x0c\x37\x0d\x63\x41\x06\x12\x85\xc4\xbd\x67\x76\x3e\x01\x48\x85\x06\x26\xc3\x22\x5e\xce\x05\x66\x2e\xa7\x71\x65\x39\xcf\xc3\x80\x55\xe5\x3d\x93\x70\x74\x3a\x35\x15\x1a\x1b\x82\xc7\x6b\xc8\xa4\x24\x02\x51\x93\xfd\x7f\xec\xbd\x7b\x7f\x1b\x37\x92\x28\xfa\xbf\x3f\x05\xa2\x3d\x1b\x92\x63\x92\x92\x9c\x38\x0f\x3a\xca\xae\x2c\x2b\x89\x6f\xfc\xba\x92\x6c\x67\xd7\xf2\xf8\x82\xdd\x20\xd9\xa3\x66\x83\xd3\x00\x45\x31\x13\x9f\xcf\x7e\x7f\xa8\x2a\xbc\xfa\x41\x52\x8a\x93\xb3\xb3\x7b\xfc\xdb\xcd\x50\x24\x50\x00\x0a\x85\x42\xa1\x9e\x13\x9e\x2b\x01\xa2\xee\xde\x5f\xf6\x8c\xe4\x5a\x2e\xe1\xe2\x2b\x94\xbd\xd0\xc2\x0a\x07\x58\x95\x6d\x0c\x85\x7f\x95\x28\x34\xf5\xc7\x0e\x46\x40\x84\xdf\x0b\xa9\xf1\xb1\xb1\xf7\x97\x3d\x0f\x0b\x4a\xf9\x09\x55\x74\xa0\xac\x9b\x6e\x77\x38\xb0\x75\x4b\x83\x0b\x49\x2d\x44\x12\x38\x17\xd8\xda\xc2\x27\x72\x09\x0f\x86\x83\xb0\x92\x0f\x26\xc3\x04\xcb\xb8\xfd\x13\xce\xd9\x2e\x45\xe3\x26\xb2\x34\xb8\xf2\xd2\xe8\x5c\xa6\xa1\x0f\xc9\xbb\xb9\x4c\xdf\x13\x70\xfc\xfc\xdb\x6f\x88\x82\x47\x91\xae\x85\xda\x1d\xb1\xce\x5f\xdc\xa5\x50\x9f\xf9\xfd\xfb\x70\xd2\x50\x97\x6d\x7e\xee\xc5\xfe\xd9\x6f\xcc\xed\x50\xa1\x88\x2d\x48\xf3\x6b\x61\x47\xec\xdd\x3d\xc6\x3a\x70\x25\x76\xfa\xa8\xff\x33\xff\xcb\x73\xf8\xd3\x3c\x3e\x3a\xf7\xde\x87\x74\x9c\x60\x89\x6a\x48\x92\x0e\xfc\xd7\x30\xe6\x63\x28\x87\xe0\xe5\x06\x28\x85\xdd\x8b\x64\xb1\xa8\xca\xbf\xb9\x59\x15\x45\xaf\x1b\xe9\x09\x6f\x59\x5e\x42\x1d\x3f\x2c\xa4\x6c\xab\x83\x24\x5a\x28\x6d\xcb\x9c\x2d\x6c\x61\xe9\x49\x56\x2a\xdd\xc7\xd7\x2c\xd7\x2c\x97\x52\x89\x7c\xed\x4a\x4e\xb9\x76\x70\x41\x72\x66\x9e\xdb\x50\xda\x48\x96\x99\x5e\x9b\x3e\x50\x81\x04\xea\x17\xb9\xc6\xb7\x28\x44\xcf\x77\x6c\x37\xde\xb2\x11\x41\xcd\xef\x90\x92\x7d\xbe\x61\x43\x2b\xbc\x42\xca\xdf\xb1\x71\xfc\x4d\x24\xb2\x0f\x0e\x9d\x85\xb1\xda\xf1\xfb\x8d\x1d\x0f\x43\x71\xfe\x20\xa2\xb1\x57\x65\x76\xcd\xb5\xb0\x59\x7d\x2d\x9b\xb2\x85\x17\xa9\xb6\xd7\xc2\x96\x0e\x37\xcf\x7e\xa5\x49\x58\x09\x7e\x51\x54\x70\x12\x2a\x54\xc8\x55\x81\x1e\xa9\x35\xbc\xdb\x32\x93\x86\x6c\xa8\xbe\xa4\x0e\x2a\x52\xba\x76\x54\x46\xf2\x23\xb2\x23\x74\x87\x25\x5b\x18\xe5\x4e\x0f\xcb\x8b\xbf\x56\x62\xb2\xcc\x31\x51\xc3\x5a\x2e\x81\x04\xb1\xd0\x8e\x96\xb6\x26\x0f\xf0\x23\x24\x0a\x5c\x9b\x5d\x0a\x2f\x6a\x8b\xd9\x76\xc6\xfc\x61\x00\x50\x91\xe8\x2c\xc7\x7f\xeb\xe3\x38\xcf\xcd\x6f\x75\xf3\x3b\xb0\xa7\xcf\x8e\xcc\xf2\xed\x9f\xd1\x5e\x11\x37\x21\x11\xa6\xbc\x76\x19\xbb\x3f\x01\x0b\x33\x10\xe7\x32\x7d\xc3\xf3\xa5\x21\x4a\xf3\x93\xb9\x52\xe4\xf8\x6f\x3d\xf6\x6f\xe6\x7f\x90\x6f\x8d\xaa\x2c\xed\xb3\xf2\xda\x30\xba\xee\x67\x7e\x61\x56\xb3\x1f\x71\x3a\xd3\x28\xfa\xd2\x0e\x16\x0b\xc6\xb6\xca\x81\x59\x9b\x1b\xa9\xc2\x06\x3d\xbd\x96\xd7\x8f\x9a\x0a\xa4\x12\x61\xd4\x2b\xa0\x12\x5d\x65\x58\x7d\xd1\x57\x4a\x8d\x49\xf9\x7f\x66\x01\xd4\x76\x22\xa6\xa2\xa1\xad\x45\x50\x43\x5d\x00\x52\xbd\xfd\x9d\x64\x80\xde\x6e\xbb\xd4\x7e\xdd\x67\xca\x17\x9d\xb3\x6a\x7d\x4e\x52\x08\x68\x57\xc5\xee\x5c\xfc\xd6\x6b\x6f\x90\x39\x7c\x59\xd5\x4d\x18\xa0\x26\x7d\x58\x6a\x6f\x17\x49\x58\x2e\x50\x76\xfe\x27\x2f\x9c\x4a\x1b\xfd\xef\xe6\x57\x33\xc8\x75\x26\x56\x54\xba\x25\xcb\x05\xcb\xe6\x0b\x2a\x01\x14\x14\x23\x7b\x89\x4b\xc7\x72\xa5\x50\x86\x08\xcb\x51\x2a\x2d\x4b\xa1\x5c\x46\x74\x73\x16\x30\x79\x7a\x22\x8b\x94\x2a\x3d\xd9\x47\x62\xe4\x55\x69\xe8\xc2\x1e\x77\x03\x0e\xae\xaf\xf0\xf5\xce\x94\x28\xcd\x19\x94\x13\x06\x44\x23\xa0\x9a\xa9\x53\xd0\x29\x7e\x9d\x15\xd3\xfd\x52\x98\x19\x50\x01\x23\xcc\x05\x40\x35\x92\xec\xe8\xe6\xb1\x9a\xaf\xa9\x78\x93\x34\xe7\xf5\x3a\x4b\xb1\x1c\x19\x57\x6b\x72\x73\x31\x53\x4c\xe4\x7c\x2e\x0b\xd3\x75\x92\x4d\x97\x25\xa8\x93\xe0\x6e\xa4\x5d\xb7\xf1\x1e\x65\x36\x85\x84\x24\xb0\x51\xe3\x35\x3b\x91\xe5\x9a\x3d\xe7\x49\xc2\xcb\x92\x48\x7d\xdf\xfb\xf5\xca\x42\xe9\x72\x69\x1e\xde\x0e\x0f\x4d\x18\xa5\x51\xc0\xbd\x94\xa3\xd6\xc2\x69\x6c\x69\x41\x16\x4e\x83\x99\x1a\x5f\x1b\x5c\xc5\x8c\x46\x2f\x46\xfb\xfb\xab\xd5\x6a\x78\xad\x0f\x0f\x0e\x86\x85\xd0\xfb\xa9\x4c\xd4\xfe\xb5\x7e\x78\x78\x30\x28\xe7\xfb\x4f\x4e\x4f\xce\x2f\xce\x50\xe6\x4a\xc4\xc2\xaa\xbe\xcc\xbb\x05\xcb\x72\x2d\xb5\x5c\x95\x7c\xc1\xba\xe6\xbf\x58\x4c\xb5\x17\x26\x12\x47\x3f\x57\x2c\xa5\x27\xc4\x5c\x91\x56\x6b\x2c\xd8\xca\x7c\x87\x5e\xb5\xe6\xe9\xd0\x7c\xfe\x09\x05\x47\x1f\xcd\xea\x3f\x80\x72\xfa\x25\xa1\xc1\x95\x25\x00\x6d\x9a\x5c\xac\x51\xc8\x08\xd0\x10\x30\x0a\x8b\xca\xf0\x32\x27\x80\xce\x33\xd6\x9c\x40\xae\x75\x99\x8d\x97\x1a\xca\xac\x93\x71\x06\xca\xef\x1a\xec\x2d\x96\xe3\x3c\x4b\x3c\x81\x01\x75\xf0\x24\x11\x4a\x51\xc8\x27\x02\x72\x54\xec\xe2\x2a\x3c\x72\xd8\x91\x5f\xc9\xbf\xb9\x8f\x61\x83\x91\x2b\xe2\x41\x95\x4a\xaf\x45\xa9\xc4\xdb\x6d\x10\xea\xed\x82\x9b\x1e\x20\x49\x20\xcb\xe7\xf8\x82\x6a\x02\x11\x34\xa8\xf6\x35\xfb\x7c\xc2\xcb\x32\xe3\x53\x41\xec\xbf\x19\x46\x43\xc3\x2a\x2c\x3c\x83\x6f\x32\xac\xdf\xd4\x0c\x26\x6e\xd3\x0c\xe1\x71\x9e\x15\x57\x1b\xfb\x63\x8b\x6a\xef\x0c\x02\x52\x37\xe0\x21\x68\x50\xed\x4b\x58\x7e\x93\xa5\x42\x6e\xde\x08\x6c\x52\xed\x3f\x2e\x79\x72\x25\xb4\x48\x31\x1e\xb6\x19\x42\xa5\x91\x83\xb1\xfd\xfa\x59\xf0\x52\x89\xf2\x9f\x5d\xf7\x72\xdb\xb2\xdd\x95\x33\xcf\x5e\x19\x2c\x34\x97\x03\x5c\x17\x9a\xdf\xe0\x4d\x62\x78\x2d\x9a\x53\x9d\x2d\x6f\xa9\xb4\x9c\x67\xbf\x72\xc7\xcd\x2d\xfb\x00\x88\x65\xbd\xf4\x19\x4c\x80\x99\x29\x18\x81\x83\xfd\x03\xcb\x62\xe2\x13\x88\xd0\x85\x5f\x81\x96\xf3\x2f\xfb\x96\x0c\xe8\xb7\x23\xd6\xc1\xe0\xab\x2a\x9c\x02\xfc\x75\x11\x8e\x2b\x25\x22\x95\xad\x45\x1c\x82\x5a\x48\x85\x4a\x92\xd6\xe9\xfc\x1b\xc1\x71\x6e\xfe\x14\x39\xb8\x05\x70\x32\x63\x47\xbe\x70\x7c\x84\x88\x40\xc6\x12\x65\x29\x23\xc4\xcc\x85\x52\x7c\x2a\x22\xb1\xaa\x10\x2b\x76\x6a\x1a\x76\x3b\x00\x80\x61\x2f\xae\xa1\xf0\xa4\x5b\xc6\x7d\xd6\xc1\x52\x94\x16\xc6\xc6\x91\x33\x65\x5e\xe0\xb9\xd0\xa2\xbe\x2f\xa1\x38\x07\x08\x3a\x0a\xf1\x6e\x0b\x0a\x6e\x82\x5e\xab\x75\x87\x5d\xe1\x16\xfe\xb0\x90\x2a\x50\x58\xb9\xcd\xc4\x0f\x8f\xe2\x9d\xa1\xf6\xe6\xf5\xe4\x35\x59\x80\x5b\x9a\x4c\xac\xb4\x0e\x5f\xef\x80\xaa\x7a\xb4\x15\xea\x73\xc2\x6f\xcd\x71\xa4\xd7\x0a\x3e\x54\xa4\xab\xcb\x1e\xd4\x49\xf2\x37\x3f\x94\x05\x0f\xd7\x4d\x65\xa5\xe1\x69\x61\x3b\xfc\x2c\xd6\x2a\x72\x79\xe0\x2e\xe3\xcd\x90\xb1\x9f\x05\x09\x1d\xa9\x70\x9e\x69\x1c\x7c\xa1\xc4\x14\xdd\xde\xcd\x5f\x0e\xac\xb3\xa2\xb5\x0e\x6b\x0b\xe8\x0f\x19\x7b\xee\x4b\x3b\xa1\x92\x15\x2b\xeb\xfb\x52\xbc\x7f\x93\x66\x21\x20\x47\xe0\x7b\x22\x85\x1a\xdc\x41\xc4\x0a\x22\xa9\x60\x86\x81\x96\x99\xba\x02\x6d\x25\x4d\xd3\xaa\x41\xb2\x22\xc5\x32\xa8\x2e\x96\x76\x59\xf8\x7a\xa1\x91\xd2\xd5\xdc\xfe\x56\xfc\xb2\xd0\x83\x02\xd8\x23\x7c\xd4\x1d\x8f\x18\x3c\x9f\x05\x79\xde\xf2\x28\x47\xd5\xde\xf1\x5e\x3c\x45\xc6\xd8\x57\x0f\x47\xec\x1c\xdf\x42\x98\xa4\x8c\xbe\x3f\xb8\xf9\xf2\xb0\xf9\x17\x70\x52\xab\x0e\x84\x5f\x86\x2d\xda\x00\xc3\x8f\x5b\xa0\xa3\xa5\xbb\x71\x0c\xfa\x29\x6c\xfd\x97\xb0\x25\x4e\x04\x2a\xe5\xae\x84\x11\xa7\x54\x50\x75\x31\xa2\x58\xc0\xb9\x4d\x12\x4a\x85\x93\x0d\x43\xc8\x05\x57\x81\xed\xc9\x10\xc0\xb1\xab\xf2\x0b\xcc\x9e\xce\xb6\x7b\xd4\x57\x1e\xf3\xa0\x12\xed\x83\x49\x31\x28\xa7\xd3\xb7\x64\x84\x43\xf9\x07\x7c\x9d\xcb\x07\x4c\x00\xae\xd3\x9f\xc5\xfa\xdc\xce\xba\xc6\x68\x9c\x1a\x07\x75\x30\xae\xa0\xae\xe1\x9b\xf7\xa0\x4a\x52\x58\xdd\xf4\xca\x3f\xef\xb7\x1c\x3c\x57\xea\xea\xfa\xdd\x4e\xed\xdf\x5d\xbd\x7f\x1f\x29\x5c\xcc\xb8\xab\x99\x79\xac\x75\x1d\x33\xfa\xae\x81\x09\x46\x41\x94\xea\x2a\x5b\x9c\x2f\x78\xe2\xad\x57\x66\xd6\x5a\x5e\x09\x17\x34\x01\x28\xb9\x30\xdf\x58\x8f\x6a\xd0\x7f\x99\x2f\x86\x70\xe9\x1c\x1d\xb1\x0e\x71\x81\xc0\xa2\x55\x5e\x07\xda\x7b\x6c\x7d\xcd\x73\xd2\x7c\x39\x0b\x57\x13\x28\xb7\xe0\x4e\x5c\xad\x6d\x99\x58\x4d\x57\x00\x6e\xa8\xe5\xeb\xc5\x42\x94\x27\x5c\x09\xef\xf1\x6d\xc0\xda\xe6\xbb\x6e\x80\x0f\x21\xf7\xee\x0d\x5b\xba\x0c\x67\x5c\xbd\x5c\x15\xaf\x48\xdd\x63\x87\xec\x85\xce\xef\xa4\xa4\x73\xa5\xa5\xb6\x6d\x2b\xc1\x78\xff\xc8\x41\x30\x8b\x29\xaf\x51\x09\xf7\xf9\xe7\xcc\x7e\xfc\x2c\x32\x47\xe0\x8e\x96\xe0\x71\x97\x29\xbc\xa4\xc3\xc2\xcf\x76\x0c\xbc\x6e\x03\x04\xf6\xfc\x40\x16\x72\xa0\xa2\xac\x6c\xd5\x2e\x38\x75\xdc\x3b\xc2\xe7\x36\xb4\xba\xcb\x60\x07\x94\x46\xa4\xb5\x15\x62\x80\xd1\x78\x41\x1e\x60\x1d\x71\xaf\x8b\xab\x42\xae\x40\x0b\xd9\x8e\xb1\x8f\xdb\x48\x59\xad\xe7\x63\x99\x77\xe2\x4a\x75\x01\x24\xa7\x68\xf5\x53\xf1\x75\x91\xd3\x5b\xb3\x0e\x4f\x70\x8b\x9d\xc9\x2d\x4b\x03\x4a\x73\xea\xe1\x77\x8b\xf7\xbd\x68\xf3\xe0\x2b\x76\xc4\xcc\x74\x7d\xfb\x8f\xb7\x41\xa8\xb8\x59\x88\x44\x8b\x94\x21\x56\x36\xa1\xb5\x01\x66\x1d\xe2\xa9\x85\x17\x48\x20\x21\xef\xa8\xdb\xca\xeb\xcc\xce\x69\xf2\x93\x19\x9c\xa7\x81\x3b\x4f\xe3\x52\xf0\xab\xa0\x55\x40\x73\x9f\xa1\x90\xdc\xdb\x30\x33\x5d\xf2\xf0\x11\xc2\x27\x46\x08\xd7\xbc\x9c\x0a\x30\x90\x75\xec\xf8\x54\x49\xee\x9a\x17\x89\xe8\x06\xfe\x7b\x95\x11\x8f\xc2\x11\xeb\xe3\x3d\xcf\x94\x02\x6f\xce\xea\x00\x15\x95\xfb\x96\x3b\xef\xd8\xc6\xca\x35\x55\x7b\xae\xe2\x6e\xcb\x35\x71\xaf\xf1\x96\xc0\xd7\x49\x27\x32\x90\x54\xaf\x86\xdd\x6e\x84\xea\x41\xda\x74\x54\x38\x55\x96\x0e\xf8\xd1\xb6\xb6\x55\x2e\x14\x92\x69\xa3\x7b\x7d\x3b\xa8\x77\x41\xdf\xf7\x6e\xdb\x37\xf0\x1b\x72\x92\x6f\x3e\x1f\x94\x14\xa8\xf5\x2c\x20\x86\xeb\x47\x61\xe3\xfe\x0b\x71\x85\x41\xdd\x9b\x9f\x55\xe6\x09\x73\xc4\x3a\x97\x9d\x8e\x35\x0c\xd9\xaf\xf6\x3a\x9b\x09\x4c\x88\xab\xa7\xfe\x61\xb0\x65\x10\xd4\xc6\x77\xf7\xdf\xf1\xc1\xaf\x1f\xde\xef\x67\x9b\xdf\x84\x00\x9b\x18\xc0\xae\x80\x0f\x06\xdf\xbe\xdf\xdf\x02\xd6\x51\x73\x1d\x6a\xc8\x34\x62\x06\xee\x65\x43\x03\x64\xe4\x2e\x80\x3e\x83\x1d\x1c\xd9\x99\x7c\x7c\xd4\x76\xfa\xa3\x33\x5b\xf5\xfa\x8a\xf1\x68\x03\x3d\xac\x74\x4c\x43\x06\xfb\x1e\x0f\x0b\x4b\x0a\xbb\x7f\x7c\x54\x83\x8e\x64\xd0\x02\x99\x4e\x6f\x03\x54\xdb\xad\x01\x22\xed\x4d\xdb\x64\x49\x6c\x6c\x9a\xa9\xed\x68\x80\x36\x12\x7d\x70\xa5\xc0\x31\xe9\xec\xb0\xa5\x9b\xc8\xd0\x47\x78\x36\x23\x7a\xd3\x15\x14\x1f\xb6\x8a\x3a\xc2\x0c\x4c\x86\x25\x24\xeb\x83\xc1\xb7\x1f\xde\xdf\xdf\xcf\xa6\xbb\xcc\xb8\x8d\xb8\x0d\xb1\x8d\xb9\x32\x32\xd0\xe1\x41\x8c\x78\x22\xcc\x83\x8e\x0b\xd8\x6a\x7b\x0c\xb0\x01\x3b\xac\xe4\x4e\x8a\x95\x14\x81\xaa\xe6\xb0\xcf\x0e\x7b\x00\xf8\xa6\x53\x29\xcc\x6b\x67\xda\x6d\x58\xf0\xc1\x8d\x39\x70\x7c\x30\x79\x7f\x7f\x7f\x9a\xf5\x6a\xee\x68\x9b\xfa\x5e\xa6\xf7\xf7\xa7\xbd\x66\x25\x89\xb9\xf2\x72\x48\x6f\x98\xca\xe5\x38\x17\xec\xef\x4b\xe9\x59\x60\x68\x10\xa9\xaa\xbd\x5c\x79\x08\x99\x15\xda\xea\xc6\xe0\xae\xe6\x39\x42\x09\x9e\xed\x8c\x9d\xc3\x40\x06\x58\x34\x82\xc2\x20\x80\x31\x25\xf3\x10\x29\xcb\x33\x2d\x4a\x9e\xe7\xeb\x7e\x65\x4a\xd0\x70\x51\x4a\xb0\x1b\x08\x88\x0e\x70\xaf\xdb\x8b\x97\x4f\x5e\x76\xcb\x69\x56\xa4\xbc\x37\x62\x6f\x78\x99\x81\x99\x05\x1d\xcc\x65\xee\xc2\xa0\x42\x4b\xc9\x2b\x3c\x74\x5c\x8b\x8f\x6c\xe1\x3e\x87\x2d\xac\x5a\x12\x57\x73\x5c\x43\xd6\xa0\xba\xcc\xe8\xa1\x4d\xbd\xb7\x3e\x94\xdb\x6e\x0d\xe0\x83\x42\x2d\x73\xed\x15\x9e\xe6\x3b\x1c\xf4\xc8\xb2\x41\xeb\xb0\x89\x5f\x7f\x06\x17\x89\xa1\x58\xff\xf7\x65\xa7\xd3\x76\xf6\x68\x6c\xcb\x02\xe8\xdc\xd5\x58\xaa\x9b\x0d\x3b\x02\xa5\xe4\x99\x98\x9e\xde\x2c\xba\x9d\x77\x97\x97\x97\x97\xe6\x86\xc5\xc1\xee\xb3\x0e\x14\x46\x99\x12\x9c\xdb\x3c\xa4\x4b\x31\xcc\xb9\xd2\x4f\x8b\x54\xdc\x38\x69\x48\xaa\xd0\xdf\x42\x40\x9c\x75\x37\x80\xd1\x6b\x17\x1f\x5f\x17\x64\x4e\x0a\x2e\x74\x22\x2d\x27\x38\x12\x76\xef\x1f\x35\x9c\x59\xc3\x8a\xed\x24\xfa\xf1\xec\x06\xec\xb0\x51\xf4\xac\x34\x72\xcb\x0e\xda\xfb\x8d\x3a\x72\x1b\x15\x89\x05\x97\x55\x77\xdb\xea\xcd\x56\x9b\x35\xd0\x10\x06\xcb\xf8\xa7\x7b\x22\x0b\x9d\x15\xb6\xa6\xfd\xc7\xa6\xc1\x8d\x04\xb2\x69\xf4\xca\x30\x48\x68\x1b\xa6\xd5\x3a\x64\x30\x02\x8c\xbe\xc3\x02\x6d\x05\xed\x65\xae\x2b\xf1\xe4\xb7\xde\x68\xb8\xf8\x62\xa6\x57\x10\xf7\x40\x93\x0c\x64\xf2\x6b\xd2\xeb\xb3\x2e\x19\xe2\x43\x3e\x87\x66\x58\xd3\x1c\x5c\xf2\x02\xeb\xc0\xf1\x0f\x17\xa7\x67\x14\x91\xca\x21\x40\x06\x72\xfa\xe5\x5c\xcd\x86\xbd\xaa\x12\x6e\x57\xde\x40\x41\x50\x8d\xbc\x61\x0e\x9e\xdc\x88\xcb\xce\x5e\x67\x64\xfe\x83\x3e\xfd\x66\x6f\x47\xf0\x5f\xfb\xf7\x25\xfc\x7d\x69\xff\xe6\xf0\xe7\xcd\xc1\xd7\xf6\x8b\x31\x7d\xf1\x8d\xfd\x42\x74\x28\x9d\x96\xfd\x62\x42\x2d\x12\xfb\x45\x41\x5f\x70\xfb\x45\x49\x5f\xa4\xf6\x0b\x4d\x5f\x7c\x6b\xbf\xb8\xa6\x2f\x1c\xd0\x9b\xce\xa8\xba\x32\x2b\x01\x5e\x5b\x2d\x55\xeb\xe5\xff\xfe\x1f\x0f\x3e\xe2\xed\x1f\x91\x4d\x53\x66\x25\x77\x3b\x02\xd4\x3e\x3b\xfc\xaa\x67\x5f\xb6\x34\x93\xe5\xef\x9b\xc9\x97\x9f\x60\x26\x4e\xef\x19\x84\x96\x24\x33\xc8\x10\xc9\x17\xe6\xa8\xce\xf9\xa2\xf6\xa4\xc2\x46\xbd\x56\xe1\xca\x3e\x89\x90\xe2\x47\xde\x70\x94\xcc\x3c\x5f\xb7\x2b\x9c\xf3\xc5\x3b\xfa\xf1\xfd\xa3\x96\x7b\x00\x4e\xf4\x7a\x21\xe4\x84\x79\xed\x8b\xc5\x1c\xdd\x33\x16\x1e\xea\x16\x13\x9e\xe7\xe8\xc2\x16\x0a\x75\xf4\x56\xad\x89\x24\xde\x2b\xca\xfa\x57\x2a\xcd\x4b\x70\xdb\x68\x3d\xa9\xd5\x9b\x1d\xaf\xa7\x8f\x0e\xc2\xb1\xfb\x14\xb9\x9d\xe9\xd0\xba\x07\x0e\x30\x6a\xc1\x8b\x21\x63\xcf\x5f\x9f\x5f\xa0\xc2\x9b\x34\xed\xd0\x74\x6f\x9a\xcb\x31\xcf\xf7\xe8\xf6\x63\x93\x9c\x4f\xef\x76\xe3\x37\x38\x56\x2d\x42\xaf\x2a\x20\x00\xeb\x93\x87\xa3\xb6\xed\xaf\x11\x6c\xcb\x82\xe7\x68\x1a\x1c\xb1\xf3\x05\x2f\xbc\x3b\xb0\xf5\x4c\x47\x18\x74\xef\x59\xc0\x6d\xd7\xad\xa1\x08\x5e\xae\xd9\x91\x6b\x59\xbb\x76\x3d\x99\x9a\x86\xbf\xfd\xd6\x00\x73\x60\x60\xbc\x3b\x78\x6f\x45\xe4\xcf\xfc\x20\x5b\x1f\x02\xce\x43\x11\xe9\xd5\xe2\xc6\xcb\x26\x68\x22\x6c\x1a\xf4\xb0\x8d\x6e\x69\x8f\x70\x52\xf1\xb5\x70\x8c\x2d\x77\x22\x2d\x6b\x61\x4e\xe4\x12\xfc\x69\x5b\x37\x9a\x86\x0f\xf7\x18\xfa\x04\xda\x20\x78\x10\x1c\x21\xa8\xd8\xc4\xb9\xe1\x09\x51\x33\x77\xc6\xc2\x2a\x79\xfc\xa0\x40\xc7\x8e\x59\x9e\x29\x88\xd1\x83\xa0\x2a\x56\xc8\x62\xb0\x9a\x65\x5a\x60\xba\xd7\x88\xf8\xc9\x39\xd8\xde\xa5\x0c\xd7\xee\x89\xfb\x5a\x66\xe9\x46\xd2\x76\xca\xad\xaa\xb7\x10\x4e\x26\x20\xed\xfd\x4b\xb5\x3f\xd4\x42\x69\xcf\xbf\x82\x77\x50\x2c\x6e\xee\x5f\xaa\xfb\xfb\xd3\x39\xa6\x46\x6c\xa1\x59\x9b\xa9\xca\x1a\x94\x03\xf4\x59\xe9\xd8\x0a\x8f\x91\xdc\x18\xd0\x52\x08\xdb\xd3\xd9\x6e\x9b\x41\x43\x54\x97\x1a\x49\x3f\xc3\xcc\x40\x7e\x39\x89\x5a\x1d\x1d\xb1\xc1\x61\x6f\x17\xed\xac\x2c\xc0\x38\x6d\x4e\x43\xb0\xbd\xf7\x59\xa7\x8f\x0e\x22\x70\x50\x22\x23\x86\x65\xf1\x5e\x7a\xda\xd5\x0d\xe6\x43\xa8\x7f\xfb\x27\x77\x89\x71\xbe\x82\x39\x05\x4c\x83\xd7\x63\x68\x5f\x97\x65\xac\x7c\xac\x53\x78\x80\x0e\x23\x6f\x05\x47\xef\x79\x18\x05\x84\xb1\x49\x60\x24\x07\xa7\x7b\xd4\x5c\x93\x77\xb3\x0b\x61\x0c\x5e\xd4\x46\x14\x2d\x05\x5b\x2e\x16\x10\x7f\x64\xe6\x2d\x6d\x76\xe8\x42\x96\x73\x9e\x43\x34\xab\x8d\x01\xcc\x8a\xc5\x52\x83\x61\x77\x0c\x5e\x95\xd3\xec\x9a\x5e\xe8\x6c\xef\xe4\xe2\xec\xd9\xe0\x78\x0f\xe3\x8b\xd0\x98\x4c\x7f\x40\x88\x28\xdf\x43\x2f\xc6\x3c\x07\xb7\xbb\x85\x16\x69\x98\xf5\x73\xc4\x5e\xc0\xdc\x21\xac\x3f\xe1\x45\x21\x35\x04\xe2\xe6\x7c\x81\xb6\xe1\xed\xf6\xa6\x8d\x58\x8b\x0d\x84\x28\xb2\x42\x75\xc6\x91\x8b\xc4\xb9\xc7\x98\x59\xc3\xc8\x46\xe4\xb8\x9c\x9b\x73\x59\x30\x9e\x67\x1c\xf2\xb6\x9c\xbc\x7c\x71\x71\xf6\x32\x6a\x75\xfc\xcc\x40\x81\xf0\x9d\x7b\x8c\x3d\x3f\xbd\x38\x1e\xd9\x30\x9e\x60\xa3\x7e\x76\xa5\x8b\x96\x41\x58\xc4\xe6\x1d\x7a\x65\x58\x18\x26\xfe\x32\x34\x3a\x97\x4a\xe7\x6b\x96\x8b\x89\x66\x72\xa9\x1d\x29\x03\x83\x1d\x8b\x84\x2f\x6d\x4d\x2c\xb3\x7f\x73\x79\x6d\x76\xd7\x10\x2a\xb8\x5b\xd8\x4c\xe0\xce\x67\x2a\x97\x09\xcf\x05\x6e\x27\xe5\xb5\xb0\xf9\x30\x8a\x8a\xef\x0a\xcb\xb3\x2b\x41\xdb\x7a\x7a\x7e\xb2\xd7\x77\xe9\x12\x12\x69\xb6\x8d\xc4\x22\x3b\x17\x39\x81\xc0\xb2\x00\xfd\x8c\x3d\x05\xd7\x7f\xf1\xf7\x65\x76\xcd\x73\x81\x51\xbe\x08\xf0\xc1\xd7\x21\xd5\x1c\xdc\x1c\x8e\xf7\xfe\x20\x12\xb5\xd3\x0f\x86\x3b\x55\x89\xf9\x93\xfe\x12\xf0\x57\x0b\x9d\xbe\x15\x98\xa5\xc3\x0a\x64\x49\x40\x1a\x41\x45\x2a\x5b\xf2\x6a\xc8\xd8\x1e\x41\x4f\xe1\x13\x5f\x08\x04\x4e\x99\x9f\x5c\xc3\x4f\x72\x0e\x22\x73\xf6\xe6\xb3\xe0\x0c\xbb\x47\xd6\x7f\xf6\xc2\xd7\xd9\x39\x3d\x3f\x39\x7e\x75\x3a\x62\x0f\xbe\xee\xe3\x5f\xf6\xe3\x0f\x87\x23\x76\x78\xf8\x00\x3e\x3e\x30\x1f\xbf\x80\x8f\x5f\x98\x8f\x5f\xc2\xc7\x2f\xcd\xc7\x87\xf0\xf1\xa1\xf9\xf8\x15\x7c\xfc\xca\x7c\x44\x08\x5f\x9b\x8f\xdf\xc0\xc7\x6f\xcc\xc7\x6f\xe1\xe3\xb7\x23\x76\xf8\xe0\x00\x87\x38\x30\x9f\x0f\xf1\xb3\x19\xef\x01\x8e\x77\x68\x06\x7c\xf0\x45\x9f\x52\x62\x9c\x99\x3b\x6a\x25\xcd\x74\x5f\xbe\x38\x1d\xb1\x2f\x01\xd0\xc5\xdb\x97\x23\xf6\x10\x00\x5d\xfc\x74\x76\x7a\x3a\x62\x0f\x11\xd2\xcb\xd7\x67\x23\xf6\x10\x21\x3d\x7d\x63\xbe\x87\xa9\x9f\x3f\xfd\x65\xc4\x1e\xc2\xd4\xcf\x4f\xdf\x9c\xbe\x18\xb1\x87\x30\xf9\xd3\xa7\x3f\xfe\x74\x31\x62\x0f\x61\xfa\x2f\x9e\x9a\x01\x1e\xc2\xfc\xff\xf3\xf4\xec\xe5\x88\x7d\x09\x0b\x78\x7c\x7c\xf2\xf3\xf9\xab\xe3\x93\xd3\x11\xc3\xbf\x7f\x3e\x7f\x65\x3f\x9e\xc3\x87\x60\xaa\xb3\x52\x40\xf2\xbf\x8b\xe3\xc7\x23\x06\x73\xfd\x7f\x47\xec\x1b\x98\xdc\xdb\x11\xfb\x06\x31\x3d\x62\x5f\xc1\x4f\x67\x23\xf6\x0d\xcc\xf5\x62\xc4\xbe\x81\xd9\xfd\xc7\x88\x7d\x03\x3f\xbd\x1e\xb1\x6f\x60\x8a\x4f\x47\xec\x6b\x58\xc3\xcb\x11\xfb\x1a\x7e\x32\x83\x1f\x84\x83\x4e\xe4\x12\xf2\xff\x9e\x1c\xbf\x3a\xff\xf0\xec\xe5\xc9\xcf\x23\x86\x48\x36\x5f\x54\xff\xb6\x9f\x8f\x47\xec\x2b\x18\xc0\x2c\x01\x06\x78\x32\x62\x5f\xe1\x8e\x8d\xd8\xd7\xd0\xe6\xc7\x11\xfb\x1a\xa6\xfe\xd3\x88\x7d\x0d\x13\xfd\x7f\x46\xec\x6b\x98\xe8\xcf\x23\xf6\x35\x74\x7f\x36\x62\x5f\x7f\x45\x1c\xf4\xad\x80\xc7\xa3\x28\xc0\x7f\xb1\x48\xbd\xbd\x70\x2a\xc0\xb9\x48\x5c\x43\x21\x5f\x08\x41\xc4\x56\xa4\xee\xa0\x84\xcc\x63\xc1\x0e\x0f\x10\x96\x65\x72\x86\x13\xb2\x85\x90\x8b\x5c\x50\x62\x68\x28\x98\x20\x0d\x87\x30\xa7\x77\x6c\xd8\x23\x78\xe3\x67\x4a\xcb\x72\x0d\xe7\x69\xc8\xd8\xab\x7c\xa9\x68\x5a\x00\xc2\xf2\x42\xb5\xbf\x28\xe5\xb4\xe4\x73\xc8\x20\x6d\x33\xbe\xd2\xfc\x78\x5e\x0a\x9e\x9a\xf3\x8c\x89\x69\xd6\x76\x62\x18\xcf\x06\x6e\xe3\x12\x93\x97\x41\x47\xcc\x3e\x21\x0a\x9d\xaf\xfb\x9e\x1d\x03\xeb\x20\x06\xcd\x20\x72\x38\x4b\xe8\x75\x6a\x76\xff\xc5\xc5\xe9\xd9\x88\xe1\x99\x3a\x7d\x71\x61\x3f\x9e\x9d\x5e\xbc\x3e\x7b\x11\xfc\x85\x1f\x83\x6d\xce\xc0\x03\x8c\xfd\xe7\x88\x7d\x0b\xdb\xf3\xcb\x88\x7d\x03\x1b\x76\x32\x62\x5f\x01\x65\xbd\x19\xb1\x6f\x60\x33\x1e\x8f\xd8\x57\x48\xd4\x23\xf6\x35\xb4\x79\x3e\x62\x5f\x7f\x6d\xc1\x9d\xea\xc4\x40\x22\xaa\xfe\x02\xb6\xd6\x10\x35\x7e\x7a\x75\xf6\xf4\xc5\xc5\x87\xf3\x93\xb3\x53\x73\x52\xbe\xa4\xef\x2e\x0c\x7f\xc0\x3f\xce\x4f\xce\x5e\x3e\x7b\x46\xa4\x76\xf8\xe5\x43\xfa\xee\x99\xff\x0b\x8a\x81\x8e\x18\x1e\xfb\xc7\x67\xee\x23\x56\xf1\x1c\x31\x6c\xf5\xf4\xc5\xb9\xfd\xf8\xd3\xcb\xe7\x66\x26\x30\xe7\x57\xc7\x3f\x9e\x7e\x78\x6d\xa6\x03\xa8\x78\xf5\xa3\xff\xfc\xe4\xf4\xd9\xe9\x85\x61\x03\x5f\xd1\x5f\xf6\xe3\xe9\x8b\x27\x23\xf6\xc5\x43\xd7\xfd\xc9\xcb\xb7\x2f\x46\xec\x8b\x2f\x11\x40\xe5\x2f\xf7\x19\x00\x03\x7a\xb0\xc5\x97\x80\xd7\x33\xe4\x0a\x5f\xc0\x8c\x9f\x9d\x1a\xc9\xe1\x0b\x40\x2f\x55\x4e\x34\xab\xfc\xd2\xa2\x12\xeb\x10\x9a\x13\xf1\xea\x60\xc4\xbe\x85\xc9\xfc\xfc\xea\x70\xc4\xbe\xfd\x1a\x3f\x3e\x18\xb1\x6f\xbf\xc1\x8f\x5f\x8c\xd8\xb7\xdf\xe2\x47\xc3\x40\x0f\x0e\xf0\xb3\xe1\xa0\x07\x87\xf8\xd9\xb0\xd0\x83\x07\xf8\xd9\xf0\xd0\x83\x2f\xf0\xb3\x61\xa2\x07\x78\xf2\x5e\x19\x2e\x7a\xf0\x10\x3f\x7f\x78\xf5\xec\xf5\xb9\xf9\x9b\x46\xfb\x70\xfc\xe4\x49\xf8\xe7\xf3\xa7\x2f\xf0\x77\x1a\xf7\xc3\xf9\xeb\xc7\x17\x67\xc7\x27\x17\xd1\x77\x17\xc7\x86\x22\x0f\xbe\xb2\x9d\x5e\x3f\xbb\x78\xfa\xea\xd9\x7f\x84\xdf\x3d\x79\xfa\xe6\xe9\x93\x53\xc3\xca\x0f\xed\x37\xa7\x27\x4f\x9f\x1f\x3f\x33\x5f\x1d\xd8\xc9\x9c\x9e\x3d\x7d\xf9\x84\xbe\xb9\x57\x29\xf5\x36\x17\x69\x06\xb2\x86\x32\xa8\x3c\x7e\xf3\xf4\xc7\xe3\x8b\xd3\x0f\x86\xbb\x8e\xd8\x21\x51\xab\xfd\xf6\x87\x97\x67\x6f\x8f\xcf\x0c\x24\x24\x6c\x2c\xb4\x66\xfe\x44\x0e\xf5\xfa\xd9\x33\x47\xa0\x87\xc8\xbe\xde\x3e\x7d\xf1\xe4\xe5\xdb\x0f\x2f\xdf\x9c\x9e\xbd\x79\x7a\xfa\xd6\x7c\xff\x00\xa9\xcf\x6c\xe7\x8b\xd3\xf3\x73\xa0\xa9\x07\x78\x57\x05\xdf\xe2\xd6\x3f\x38\xfc\x3a\x94\xe1\x9e\x06\x62\x38\xf9\xa0\x9b\x37\x80\xb7\xf5\x6f\xbb\x79\xad\x07\xc3\x51\xec\x82\xfe\xaa\xb4\x85\x62\x7c\xc6\x19\xc3\x29\x7d\xc0\x95\x5a\x2b\x2d\xe6\x28\x67\x41\xda\x27\xab\x3c\x82\x8e\xde\xfd\x1b\x13\x3f\x8c\xb6\xa6\x86\xe8\x47\x3e\xe7\x6f\x79\xa6\x29\x83\xfc\xde\x95\x58\x43\x72\x96\x3d\x04\xdd\xf7\xa9\x58\xec\x2f\xcc\x66\x88\xaf\x24\xc5\xa6\x29\x50\xd6\xa0\x4d\x73\xb0\xb5\xdb\xa2\x49\x3c\xab\x64\xb7\xc2\xdc\x82\xf1\xfa\x29\xe3\x15\xcd\xc6\x8f\xf9\xea\xf8\xfc\x7c\xd3\x80\x50\xc6\x34\x1a\xed\xdc\x97\xcb\xb0\x31\x3f\xf0\xc2\x5d\xf0\xa9\x11\x36\x3d\xe8\xb0\xfe\x50\xa0\x9f\xb5\x9d\x9c\x13\x66\x7b\xbd\xa2\xdb\xa5\x87\xb9\xc5\x34\x53\xb9\x2a\x9a\x26\xfa\x44\xae\x8a\xdb\x4d\xf5\xae\x65\x36\xb6\x4f\x96\x48\x44\xcb\x1a\x4a\x2f\xe4\x85\xbc\x05\x46\x5d\x8d\xac\x3f\x68\x86\x63\xa9\x35\x25\x12\x8a\x26\xf9\x18\xbe\xff\x93\xe7\xe9\x0b\x86\xb8\x69\x42\xd2\xd9\x86\xda\x20\x34\x5d\xcc\xe8\xe6\x7e\xdf\x65\xbe\xf5\xc2\x1f\xb7\x4c\x64\xb4\x83\x36\xc7\x25\x67\xfb\x40\x95\x13\xff\xd9\xc3\x6b\x83\x00\x27\xf3\x71\xd2\xe9\x33\xf8\x70\xae\x65\xc9\xa7\x22\x8c\x6d\x7a\xe5\x16\xff\x1c\xd7\xce\xd4\x72\x8c\x21\x89\x80\x0c\xc3\xd7\x50\x2b\xce\x5e\xf0\xf3\xf3\x9f\x82\x54\x76\x81\x8e\x06\x33\xb8\x93\x4e\x38\xa7\xb4\x8f\xbc\x60\xb2\x4c\x45\x09\xbe\x0a\xa8\x5d\x45\x1b\x4b\x22\x8b\x82\xd2\x4e\x2e\x4a\x69\x96\x10\x5f\x49\xb5\x29\x85\xfa\x7f\xec\xf0\x94\xd2\x12\x98\x55\xd5\xda\x7b\x4b\x4a\x9f\x88\x84\xa2\x45\x69\xfd\xf5\x14\xab\xd1\xbf\x0e\xd2\xc5\xbe\x9d\xdb\x3e\xe8\xd6\xdd\xb8\x56\xf5\x9f\x8a\x89\xf2\x8e\xaf\xb5\x39\xd0\x90\xfe\x07\xb0\x19\x60\x50\x81\x79\xdc\xaa\xae\x01\xd0\xab\xa7\x5c\xb8\xaa\x54\x1e\xc2\xb0\x1a\x0f\xc7\x34\xe8\xc3\xe8\xef\xae\xc4\xfa\xfd\xbb\xc3\xf7\xbd\x96\x4c\x30\x6d\x53\x4b\xb8\x16\x53\x09\xa1\xcd\xa8\xa7\xdb\xde\xd0\x1d\x33\x76\xc4\x3a\xf6\x73\x67\xa7\x9e\xc7\x8b\x85\xe0\x25\xe9\xf8\x3b\xfe\xaf\xdd\x7a\x9b\x33\x68\x63\x19\x3b\xee\x8f\xdd\xfa\x9e\x9b\x13\x63\xd6\xd8\xc1\x4f\x3b\xf6\x02\xfe\x84\x9e\x26\x1d\xf7\xc7\x6e\x7d\x4f\x8b\x44\xa6\xd4\xd5\x7e\xde\xad\xe7\xf3\x4c\x25\x22\xcf\x79\x21\xe4\x12\xa6\x1c\x7d\x11\xa8\x68\x9f\xd1\x51\xf2\x7d\xfb\xee\x98\x8d\xd7\x2c\xcd\xd4\x22\xe7\x6b\xfc\x8a\x75\xb5\x5c\xc0\xbb\x0f\xee\x87\xde\xa6\x43\x66\x27\xb3\x7e\xe2\x3c\x89\x6d\x1a\xa0\x7f\xb0\x2c\x1d\xb5\x12\x7a\xe3\x56\xf7\x89\x8b\xdf\xe8\x51\xb8\xe7\xac\x3b\x91\x85\x56\x7d\x96\xc8\x5c\x96\xaa\xcf\xb2\x39\x9f\x0a\xd5\xeb\x80\x79\x79\xe7\x71\x1c\x1d\x44\xc3\x60\x6d\x04\x86\x04\x72\x3b\x80\x76\xaf\x22\x78\x6e\x03\x6f\x07\xcb\x9e\x8e\x08\x96\x3b\x32\xb7\x83\xe5\xc8\x2f\x02\xe6\x89\xf2\x96\xd0\xe0\x14\xc4\xa0\xf0\x60\xdc\x0e\x4e\x44\x9a\x11\x38\xf3\xcb\xb0\xf3\x11\x32\x43\xb5\x12\x5a\x9d\x33\xd2\x53\xa3\xc3\x73\x3d\x98\x96\x83\xb9\x4c\x45\x67\x74\x8f\xb1\x77\xb7\x41\x37\x38\xad\xc3\x6c\xde\xc1\x27\xd6\x29\x64\x21\x6c\xf2\xaa\x01\x65\xae\xca\xc5\x44\xdb\xcf\x70\x5f\xc3\x1f\x58\xdc\xb9\x83\xe9\x62\xcd\xc5\x75\x9c\xeb\x1f\x0d\x8b\xd7\x74\x4f\xcd\x78\x72\xf5\xd7\xb7\x33\xb1\x2c\x33\xa5\xb3\x64\x78\x59\x90\x1d\xa9\x13\x7c\xea\x98\x71\x2f\x3b\x23\x23\x15\x48\xec\xeb\x35\xda\x05\xbf\xce\xa6\x5c\xcb\x72\x98\xf3\x62\xba\xe4\x53\x31\xf2\x5d\xf1\xe2\xb9\xec\x88\x62\xb0\x54\x97\x1d\x76\xf4\x3d\xbb\x84\xe9\x5f\x76\xfa\x18\x99\x00\xdf\xb8\x09\x5f\xc6\xc3\x42\xc3\x11\x7b\x92\x29\x4c\x9a\x50\xac\x69\x01\xa5\xc8\xc1\xdd\x67\xbe\x2c\xcc\x4d\x1e\x4e\xdb\x61\x05\x26\xac\xd4\x72\x8e\x21\x71\xf7\x8f\x73\x4d\x29\xd9\x00\x46\xd4\xc7\x62\x2f\xe8\x03\x8a\xfe\x4d\x7d\x82\x49\xbb\x4e\x28\x55\x35\xf4\xc2\x4a\xeb\x9d\xa8\x40\xe8\x20\x53\x83\xb8\xf6\xe7\x1d\x88\x83\x52\xd5\x75\xc6\x52\xa2\x41\x84\x75\x9e\x4e\x98\x12\xba\xcf\x96\x45\x2a\x29\x9c\xdb\x3f\xf9\x8f\x73\x3d\x70\xf5\x3e\x07\xdf\x3f\x39\x7d\xc6\x4a\x31\xe7\x0b\x9f\x5b\xcc\xae\x30\x9a\x2b\xcb\x8a\x54\x88\x14\x8b\x9a\x84\x45\x4e\xc3\x95\xd1\x7a\x3e\xcd\x2a\xce\x85\x66\xab\x99\x70\xc9\xef\x6d\xbd\x56\x9e\x68\x85\x09\x3c\xcc\x58\xf0\x95\x79\x3b\x9b\x2f\x52\x43\xc3\x45\xa2\x6d\xdb\x68\x72\xe6\x25\xad\x06\xab\x19\xd7\x77\x98\x5f\x07\xdd\x67\x70\x6a\xef\xdc\x5f\xac\xf3\xcd\x60\x9c\xc1\x99\xa3\x87\xf3\xe0\x4a\xac\xed\xa9\x3b\xb1\xe9\x58\x67\xf5\x92\xb5\xf8\x96\x4e\x1b\xcf\x1b\x23\x67\x9d\x21\xfe\x63\xe7\x90\x7c\xbc\x00\x8b\x8f\x91\x52\xb3\x9b\x61\xd8\x18\xa6\x30\xb4\x8d\x8f\xd3\x94\x1d\x3e\xf8\xc6\x3e\xac\x96\x05\x18\xd8\x44\x1a\x86\xb1\x2b\x57\x97\x2f\x02\x14\x2c\x61\x38\xf4\x6a\x89\x48\xfb\x80\xaa\x12\xac\xc1\x41\xa9\x48\x42\xb5\x41\xf5\xe4\xfb\x7f\x8a\xaf\xd5\x90\xb1\x2e\xc8\xd4\x2b\x59\x5c\x76\x34\x54\xd8\xc1\x78\x57\x23\x31\xe7\x5c\x4f\x64\x39\xa7\x22\x3b\x00\xb6\x1d\x9c\x1d\x90\x12\x99\xc1\xee\xc7\xd5\x11\xcc\xd4\x21\x89\xb1\xc1\xba\x37\xee\xf5\x3a\xf7\x18\xb3\x64\xb1\x4c\xb3\x71\x2e\x06\x63\x91\xe7\x03\x65\x6e\x8c\x9d\x49\x83\xae\x1c\x78\x7e\x0c\x4a\x81\x2f\xa0\x11\xca\xd7\x06\xac\xdc\x37\x40\x89\x94\x97\xa5\xfd\xf4\xfa\xec\x99\x8d\x31\x77\x6f\x4b\xd3\x90\xc1\xe8\x43\xc6\x4e\xe7\x0b\xbd\xb6\x5e\x8c\x66\x09\x85\x64\x34\x4d\x68\xe8\x48\x3a\x15\xea\x4a\xcb\xc5\xa0\x90\xda\x65\x68\x86\x85\xdc\x7a\x09\xcd\x1c\x04\x13\x61\x46\x93\x54\xf6\x91\x66\x4e\xff\x14\x73\xa5\x80\x4f\x76\x02\x9e\xdb\x8c\xb3\xb7\x62\xec\xd8\xc7\x8b\x60\x62\x43\x48\x99\xa3\x28\x67\xce\xea\x8b\xa1\x2c\xa7\xfb\x17\x67\xfb\xe1\xe4\xd5\x7e\x74\x16\xf0\xc3\x13\x94\xfa\x0c\x32\xa2\xb6\xac\x14\x7f\x5f\x66\xa5\x50\x86\x00\xe6\x99\x52\xb0\xe3\xd6\x3d\x6c\x09\x55\x02\xde\xce\x04\x65\xa2\xb1\x60\x31\x12\xdd\x1c\x3f\x25\xc0\x04\x8a\x8b\x04\x5c\x51\x2e\x7a\xad\xc5\x7c\x01\xbf\x71\x75\xe5\x0d\x9b\x66\x27\x82\x91\x2c\xc0\x6c\xc2\x0a\x91\x08\xa5\x78\xb9\x1e\x62\x01\x4d\x5b\x53\x85\xcd\xf9\x1a\xd2\x04\xab\x19\xf9\x74\x84\x00\xcc\xf4\x85\xd2\x54\xe8\xc4\x82\x4b\xc1\x43\x47\x33\xcc\x27\x63\x50\x1a\x56\x99\x46\xba\x6e\xe4\x18\xc4\xde\xc5\x8d\x16\x85\xc2\x42\x55\x54\xe4\x86\xed\x45\x78\xdb\x0b\x27\x01\xb9\x22\x83\xbf\xb5\x0c\x66\x82\xd2\x76\xd4\xd9\xd1\x9e\xdf\xff\x01\xc8\xbb\x3b\x93\x5c\x20\x47\xb3\x4e\x39\x1d\x77\x0f\xbf\xea\x33\xfc\xff\x1e\x08\x34\x00\x0d\x69\xf0\x22\x26\x34\xf8\x09\xf9\x91\xb8\xa1\x90\xf5\x42\x52\x84\x3c\xfe\xe8\x73\x10\x35\xcd\x14\x24\xf2\xbb\xcd\xd4\x4c\xcd\x86\xed\x20\xbe\xcf\xcf\xc9\xc7\x91\x0e\x73\x30\x51\x18\xa7\xe5\x24\xe3\x6f\x4d\x3b\x18\x26\x45\x08\xb9\xde\xb2\xcc\xbb\xf6\xec\x4c\xa5\x1c\x4e\xf3\x7d\x5e\x88\xf4\xe2\xe7\x5e\xd8\x2a\xcf\x0a\xc1\xcb\xc1\xb4\xe4\x69\x26\x0a\x0d\xaf\x23\x7c\x1a\xf5\xd9\x18\xdc\x4c\x4b\x91\xf6\x1a\x90\xa2\xb2\x5f\xff\x34\x9c\x40\xfe\xe5\x21\x63\x4f\x6c\x62\x2d\x2d\x99\x91\xf0\x9a\x36\xcb\x7a\xdf\xfd\x69\x73\x73\xee\x7e\xb7\xd9\x9c\xc3\x83\x7f\x35\xff\x1f\x7e\x95\x80\x0d\x35\x5c\x11\x0a\x5a\x28\x7d\x7c\x7a\x41\x8f\xd8\x34\x2d\x09\x45\x35\x32\xe0\x82\xe9\xe0\xf1\x39\xeb\x5e\x76\x2e\x2f\x6f\x0e\xbe\x31\x22\x37\xbf\xe2\xec\xaf\x3f\xf5\x86\x2c\x28\x6c\x61\x27\x1f\x03\x01\x07\x94\x00\x10\x00\xf9\x7a\x72\xd9\x71\xdb\xe5\x04\x8a\xc1\x9c\x2f\x06\x36\x71\xbf\xba\xd3\x96\xd1\xc3\x06\xf6\xc8\xfa\x86\x5b\xed\x9b\x4f\x2d\x02\x59\x31\x28\x69\xc5\x90\x7c\x5a\x38\x53\x0b\xf4\xea\x2f\x4b\xbe\xee\x93\xf0\x20\x78\x32\x33\xdb\x81\x2e\x71\x1d\x97\x49\x92\xca\x31\x7a\x59\xc8\x5c\x04\xa0\xb7\xb4\x29\xf7\x29\x10\x36\x18\x89\x52\x6e\xb8\x6b\x84\x75\xe2\x31\x59\xa6\x95\xc8\x27\x43\xac\x4a\xc3\x75\x65\x42\x30\x95\xea\x04\x1c\xa8\x52\x24\x22\xbb\x8e\xc5\xb3\xea\x4c\x20\x51\x0b\x32\xe4\xb0\xa1\x27\xd5\x80\x56\x5b\x88\xd5\xe0\xe2\x1f\x7b\x07\x7b\xa3\x7f\xec\xdd\xdf\x1b\xed\x5d\x5e\x2e\x1f\x1c\x7e\xfb\x60\xaf\xbf\xd7\x77\x7f\x1d\xec\xf5\xf7\x06\xee\xaf\xc3\xbd\xfe\xde\xd0\xfd\xf5\xc5\x5e\xdf\x4f\xd9\x80\x81\xef\x1f\x7e\xf3\xcd\xde\xc7\x8f\x81\x3c\x05\x55\x9c\x06\xb2\x18\x88\x9b\x6c\x77\x29\x3b\x7e\x75\x13\x45\x87\x64\xfe\x96\x5e\x01\xc0\x43\xe1\x6e\x86\x81\x00\x2f\x54\xf5\x6a\x85\x77\xbd\xab\x15\xc2\xcc\x0c\xfc\x35\x80\x59\xcd\x06\xe3\x3c\x2b\xae\xee\x44\x9f\x0d\x87\xaf\x3e\x2b\x00\x6f\x9d\x88\x95\x2c\x83\x74\x7e\x8d\x33\x19\x24\xeb\x24\xbf\x1b\xfb\x7d\x77\x78\x70\x70\xd0\x67\x0f\x0f\x0e\xde\xc7\xc7\xa6\x73\x11\x0c\x0f\xf3\x29\x8d\x1c\x91\x15\x6c\x9e\xe5\x79\xa6\x44\x22\x8b\x54\x35\x72\xb9\x63\xa6\x57\x92\x09\x4c\x50\x69\xa9\xd7\x07\xba\xc8\x09\xe5\xa5\xcc\xf0\x41\x93\x4b\xeb\x41\x8f\xa3\xf9\x2c\x43\x4e\xdc\x82\x52\x40\x66\xc0\xa8\x4f\xa6\x83\xb6\x72\x32\xa9\xe2\xe6\xf7\x89\x14\xbc\xfb\xe0\xe1\xc3\x3e\x3b\xc0\xff\x1b\x3e\xec\x11\x5e\xaa\xa2\x05\x8a\x0c\x74\x1d\x5c\x53\xbe\x3c\x9c\x81\x9f\x90\x69\x33\x58\xf0\x5c\x68\x2d\x3e\x39\x87\xeb\xbc\xb4\xb5\x4e\x50\x69\x68\xa5\x6b\xfb\x8e\xa1\x71\x1b\xf7\x2a\xac\x6b\x58\xe5\x8f\xc8\x94\x30\x91\x94\xe5\x95\xec\xe9\xa4\xd6\xce\x6d\x13\xe5\x0a\x45\x76\x0a\x7a\x8c\x94\x52\x95\x6f\x60\xae\x8e\xa3\x39\x59\xd8\xf0\x62\xeb\x5a\x03\xce\xce\x58\xe0\x4f\x3b\x64\x6f\x5a\x10\xe4\x16\x69\x59\x52\x0e\xde\x42\xbc\x58\xb3\x44\x29\x82\x85\xbe\x3b\x94\xed\xd4\x4d\x81\xd2\x22\xb1\x7f\x39\xfb\xf1\x71\x9f\xfd\xcb\xd9\xd9\x8f\x3f\x3e\x7e\xdc\x67\x46\xd2\x1c\x0e\x87\x3d\xf8\xc4\xe9\x23\xd4\xfd\x32\x30\x01\x1e\x3a\xef\xfa\xab\x90\x6b\xf2\x44\x54\x92\x2d\x78\xa9\x2d\xa5\x28\x2d\x93\x2b\xf6\xcb\xe1\xa1\x01\x35\xd4\x37\x1a\x2d\x55\x4d\x4b\xfa\x0f\xb9\x84\xf5\x2c\x95\x60\x56\x85\x86\x31\x26\x66\x71\x6b\x9f\x3d\xcb\x6e\x38\x32\x7c\x7f\x36\x0c\x5b\xb1\xc0\xc6\x82\x0a\xdf\xa4\x76\xd1\x99\xf3\x65\x85\x97\xee\x55\xb6\x58\x40\x6a\x53\xa6\xe6\x3c\xcf\x19\xc6\x29\x80\xb3\x73\x91\x66\x49\xb0\x38\xc7\x2b\xdd\x05\xd3\x48\x41\xc1\x29\x58\xac\x0d\x53\xc7\x02\x5f\x3b\x13\xbf\xd7\x65\x37\xb0\xf4\xe3\xa5\x96\x73\xae\xb3\x04\x5c\xb9\xb0\x06\xaf\x04\x5b\x9f\x2b\xdc\x66\x49\xc7\x16\xa2\x75\xf3\x59\x2a\x31\x20\x94\x0d\x90\xfd\x0f\xa0\xe2\xee\x1d\x26\xb6\x81\xad\x6b\xef\x2f\x66\xf7\x87\xee\x1a\x2c\x0f\x4d\x15\x26\x1d\x92\x72\x23\x80\xbb\xd9\x0f\x20\x57\xc9\x9d\xe7\xd5\x7e\x07\xc2\xe5\x67\xcd\xd3\x1e\x59\x98\x1a\xc5\x0c\x97\x15\x53\xbf\x73\xba\xcc\x07\x8b\x7c\xa9\x06\xf3\xac\x58\xaa\xc1\xaf\xa2\x94\x83\x5f\xa5\x9c\xdf\x41\xfc\xac\x4f\xc9\x49\x9f\xe0\xbc\xfb\x2a\x5f\xaa\x7d\xa8\x7b\xb4\xff\x9f\xa2\x94\x71\x2d\xa2\xe0\x7c\x3c\x9d\x58\xac\x07\x89\xd1\x36\x76\xa6\x96\xf0\x33\xc8\xa2\x8a\xfd\xf5\x83\x93\x47\x3a\x7e\x74\xe8\x1a\xd4\x1f\x8d\xd0\x90\xdc\x6e\x33\x36\xca\xdd\xa0\x4e\x3e\x31\xe8\xce\x84\x82\x4c\xde\x80\x07\x5b\x72\x5a\x4b\x70\xca\x31\x3f\x40\xe7\x60\xf5\xd0\x13\xd6\x7c\xff\xc4\xae\x25\xea\x80\x90\x3c\x64\x04\x10\xad\xc4\x56\xab\xfd\x74\x4b\x79\x83\x85\xd6\x6a\x4b\x79\xb3\xe3\x52\xde\xd8\xa5\xbc\xa9\x2f\xc5\x43\x8e\x97\x22\xb8\xd2\x03\xae\x32\x5e\x0c\xf8\x7c\x9c\x4d\x97\x72\xa9\x06\x5c\x0d\xf4\x4a\x1a\x09\x60\x39\xdf\xfd\xed\xb7\xb3\x1a\xf9\x94\x2b\xcd\x8e\xcd\x98\xec\xd8\x8e\x19\xc6\x40\x61\x49\xc1\x95\xa1\x3f\x33\x01\x06\xc5\x44\xfd\x8c\x21\x73\xf3\x00\xd4\xad\x03\xa2\xd0\x4f\x33\x47\xa8\xe7\xa0\xa5\xcd\x0d\x0d\x23\xf8\xda\x5b\x6e\x7e\xb6\xae\x8c\x96\xb6\xde\x83\x9e\x89\x79\xe3\xdd\xf3\x56\x5c\x76\xf2\x9c\x95\x42\x2d\xf0\x05\x03\xeb\x1a\x8c\xd7\x5a\xb0\x6b\x51\x2a\x1b\x08\xa3\xc1\xc5\xbf\x3e\x94\x3b\x5d\xa5\x98\xf2\x32\xcd\x85\x52\xde\xdb\x03\xeb\xed\x56\xf1\x32\x96\xf9\xee\xea\xd3\x06\xc9\x48\x97\x99\xd2\x5c\x8b\x10\x27\x51\x8d\x0b\xc3\x8e\xcd\x20\x6c\x85\xc5\xe4\xa0\xe0\x5b\xac\x10\x42\x57\xa2\x3c\xdd\x1f\xa3\x21\xc6\x99\x32\xac\x66\x68\xc8\xd8\x0f\x16\x87\xce\x1d\x18\xe2\x18\x42\xa8\x43\xc6\x5e\x2c\x73\x70\x4e\xe2\xce\xe2\xd5\xb4\x5e\x43\xb0\x38\xd4\x9d\x56\x5e\xe7\xa9\x2d\xab\xc6\xd5\x90\x98\xd8\xfd\x66\x70\xf8\x90\x19\xa6\xcf\x0e\xbf\x8a\x45\xab\x9e\x5b\x31\xf8\x13\x16\xeb\x06\xdc\xb0\x3a\x32\x7c\x8d\xfc\xea\x1a\xef\xfc\x60\xda\x65\x69\x21\x75\xe2\x5b\xa5\x71\x9f\x88\xd6\x33\xb3\x2d\x95\xf9\x39\xe1\x00\xd4\xe0\xb7\x50\xab\x6c\xbc\x6b\xcf\xcd\x53\x85\xdb\x64\xba\x56\x2c\x77\xaa\x70\x27\x3f\x01\xa3\x5b\x95\x99\xe1\x6f\xad\xd2\x4a\x6d\xa6\xd0\xe1\x13\x49\x51\xae\x36\x30\x4c\x45\x4b\x9c\x0d\x4b\xb3\x52\x60\xc9\x08\x2a\x06\x8d\xfe\x9b\xad\x93\x4b\x45\x72\xf8\xe0\xae\xef\xf5\x06\x7e\x76\x16\x6c\xac\x99\xd9\x65\x47\x85\x9a\xf5\xa0\x82\x63\xf4\x52\x35\xc7\x7f\x69\xa4\x5a\x23\xc7\x5a\x42\x7e\x72\x7a\xe2\xca\xf1\x40\x66\xf1\xc3\x07\xc1\xf4\xaf\xb3\x52\x16\xe6\xbd\x7a\xd7\xd9\xff\xa3\x73\x71\x7a\xf6\xbc\x33\x62\x1d\xb0\x87\x0d\x1e\x3c\xfc\x0a\x5f\x8a\x98\x17\xa0\xf6\xb4\xb6\xb2\x60\x30\x34\xbb\xa6\x6c\x33\xaa\x1f\x6b\xa8\xec\x34\x0d\x4b\x19\x4c\xf8\x3c\xcb\x77\x97\x3f\x2a\x1e\x27\x9d\xbd\x27\xe2\x6f\xfc\xcd\x92\x9d\xf3\x42\xb1\xe7\xb2\x90\x7b\x7d\xb6\x77\x6a\x58\xb9\x2c\xec\xdf\x3f\x94\x42\x98\x8f\x7d\xb6\xf7\x5c\x14\x39\x34\xb9\x20\xaa\xf5\x0a\x9c\xce\x5c\x16\x12\x95\x90\x55\x35\x29\x69\x66\x89\xb3\xc2\x84\x6b\x15\x26\x80\xa3\xc4\x4b\xbb\xb3\x12\xf9\xf0\x61\x1f\x92\x57\x35\xe0\xd7\x57\xf3\xcc\x0a\xb6\xc8\x6e\x44\xae\x2a\x83\xce\x25\x8a\x79\x77\xd3\x14\xf0\x42\x67\x18\x3b\x96\x36\x6a\x8b\xe3\x31\xdc\x6b\x37\x98\x43\x29\x3e\x8d\x09\xe4\xc1\x97\x07\x7d\x66\xff\xd3\x68\x05\xf1\x63\xdd\xd1\x0a\x32\x93\x73\x31\xb8\x12\x6b\x35\x40\x1f\xd6\x4f\xac\x7d\x36\xe0\xf7\x85\x33\x06\xfa\x52\x97\x9e\x68\x5c\x29\x77\x34\x1d\x43\x41\x52\xd7\xcd\x3d\x4c\x4d\x77\xe7\xf0\xfe\xe6\xc2\x96\x09\x54\xa8\xbf\x20\xe1\xc7\x70\x5f\xd7\x15\xe5\xce\x37\x17\x14\xdc\xc9\x03\x68\x95\x41\x70\x06\x1e\x27\x57\x62\x6d\x4b\xb4\xdd\xd5\x25\x27\xe6\x0e\xc7\x10\xbc\x24\x27\x95\x74\xcd\x32\x0a\x50\x80\xfc\xdf\x41\x3d\x53\x1b\xcd\x68\x93\x90\xfb\x33\x5a\xc6\x35\x06\x37\x67\x14\x8f\xd3\x89\xa7\x22\xc9\x8c\x44\x13\xc0\x9b\x89\x1b\x6e\xbf\x46\xcd\x00\x78\xd7\x11\x20\x1f\x24\x41\xe0\x6c\xa4\x44\x4d\x1d\xe3\x04\x2a\x6b\xd8\x72\xd5\x62\x7d\x30\x42\x9f\x74\x4f\x64\x87\x8f\x80\xff\x00\x63\x4e\x8c\x70\x65\x41\x89\x9b\x45\xce\x0b\x0c\xb3\x25\x25\xcb\xc4\x48\x64\x10\xfc\x20\x58\xc5\xf8\xf5\xec\xed\x59\x91\x96\x8d\x32\xef\x39\xe8\xbc\x59\xb0\xb1\x81\xb1\xe6\x1f\xa1\x91\x86\x22\xa4\x73\x3d\xf8\x79\x6f\xc4\xf6\x2a\xde\xdb\x7b\xfd\x7a\x5b\x7c\xa6\x3e\x33\xad\x5f\x1d\x9f\x9f\x37\x35\xf9\xc9\xfc\x78\xd9\xf9\xe9\xf4\xd9\xb3\x97\x97\x97\xc5\x65\x67\xcf\xb7\xf9\x68\xa9\x6e\xce\x6f\x06\x88\xb9\x81\x25\x82\x9d\xa9\xcf\xf9\xf2\xb1\xc3\x83\x03\x50\xff\x06\xbc\xf3\x39\xbf\x61\x94\x68\x03\x2a\xfc\x3c\x39\x39\xef\xb3\x97\xe7\x27\x7d\xf6\xea\x39\x6c\xc8\xf1\xab\x73\x4f\x95\x63\x31\x81\x72\x71\x98\x69\x85\x2d\x17\xd1\xc9\xf1\x8f\x0b\x24\x31\x37\x79\x91\x66\x1c\xf9\x08\x2f\xc5\x60\x62\x3e\x7d\x62\x56\x92\xc8\xe2\x5a\x94\x3a\x08\x4c\x22\xca\xca\x4a\xf6\x83\x21\x55\x1f\xc2\x3c\x64\x5e\x95\x90\x0b\x1d\x9b\xb1\xe2\x1a\xed\xb6\xb8\x78\xb0\x12\xcd\xc9\x24\x47\xae\x3c\x9f\x42\x21\x52\xf5\x58\x72\xfe\x49\xc8\xa5\xb8\xcb\x0b\x45\xd9\xa7\xd0\x72\xe0\x27\x25\x97\x4a\x0c\xd0\xab\x2c\xc9\xb3\xe4\xea\x96\xef\xfc\x8d\xa2\x22\xba\x1a\xcb\x82\x3c\xd4\x50\xd9\x36\x5e\x6a\x2d\x0b\x06\x83\x35\xdb\x04\xb0\x98\x94\x73\x9b\x30\x47\xfa\x1a\xed\x09\x58\x06\x1e\x0a\x53\xe1\xa1\xdd\xc3\xf9\xc3\x9c\x07\x08\x79\xcf\x33\x63\x7a\x33\x36\x8d\x81\x91\xd7\xe8\x17\x64\x6e\x00\xda\x34\xf0\xbf\xfb\x9c\xe6\x6b\xbe\x13\x29\x9b\x67\x10\x66\x50\xa2\x78\x5b\xc1\x5c\x38\xf2\x5d\x90\x56\x75\xb3\x3c\xe8\xb3\xc3\x3e\x7b\xd0\x67\x5f\xf4\xd9\x97\x7d\xf6\xb0\xcf\xbe\x22\xc7\xae\xe7\x80\x3d\x2c\x4e\x8f\xe3\xc1\x11\x2b\xea\x6f\xc6\x36\x6b\xb2\x6f\xd2\x67\x2b\x7c\xab\xdb\xe7\xe8\x3c\x4b\xcd\xf2\xa3\x1d\x42\xf7\x81\x62\xf0\xcb\xe1\xa1\x43\xa9\xf7\x97\xea\xe2\x2d\x62\x28\xcb\xf9\xf9\x81\x89\xb7\x60\xbf\x1c\x1e\xd6\x06\x08\x29\xc0\xa9\x97\x71\x9c\xae\xad\x3a\x25\x98\xe1\xc8\xd7\xce\xbe\x36\xb7\x31\x14\x94\x0a\x0d\x96\x7e\x9d\xf1\x70\xc6\xfe\xee\xf2\x33\xef\x35\x62\xe0\x80\x1d\x1d\xe1\xfe\x76\x17\x65\x36\xe7\xe5\xba\x47\xed\x83\xe6\x87\x50\x2a\x11\x41\x77\xf9\xf2\x26\xcb\xb3\xe6\x86\x0f\x4c\x43\x0a\x67\x41\x73\x53\x73\xbb\xdf\x43\xd5\xb5\x53\xf9\x67\x91\xf6\x4a\x96\xe9\x00\xb2\x68\x0f\x20\x29\xd2\xc0\xf4\xbd\x03\x75\xc3\x74\xde\xfd\xf5\xf2\x52\x5d\x5e\xbe\xbb\xbc\x7c\xdf\xed\xfd\xe3\xe3\x77\xdf\xef\x5d\x76\x2e\x2f\xff\xfa\xd9\xbf\xff\xcb\xff\xfa\xd7\xcf\xff\xd2\x7f\x34\xfa\xff\xde\xd7\x84\xe1\x33\x31\x5d\xe6\xbc\x64\xe2\x06\x1c\x00\x49\x33\x3f\xe3\x39\x95\x61\x24\x21\x00\xd3\xde\x99\x1d\x85\x6c\x5d\x3d\x5b\x67\x8e\x14\xd4\x2d\xd8\x29\xe7\xa0\xff\xd7\x64\xcf\xe0\x81\x15\x1c\x43\x75\xb4\x64\xa5\x00\xf3\x14\xc9\x20\x49\xa0\xa4\x1a\x86\xfa\x2e\x2a\x2d\xb6\xf7\xbf\x29\xe5\xc3\x70\x2f\xac\xa6\xc6\x15\x5b\x70\x3d\x53\x6c\x02\x9e\x57\x10\xcb\x03\x13\xb5\xba\x11\x19\x28\x3f\x6a\x38\xbf\x9d\x86\xe7\xb6\x48\xff\xdf\xc3\xdf\x87\x76\x22\x7d\x51\xa4\x7f\x0e\xd6\x5b\xd1\x84\x87\xf5\x13\xe3\xe9\xfd\x5f\x76\xc4\x0d\x15\xb0\xa5\x00\xc3\x40\x95\x49\xfa\x1b\x9c\xdd\x1f\x4d\x88\xfe\xd3\x6b\xaa\x96\x23\x6e\x16\xd6\xa3\xc3\xdb\x6b\xd4\xb2\x84\x07\x9d\x0d\x24\x76\x29\xee\x20\xc9\xa4\x43\xf1\x82\x4f\xff\xc8\x87\x1b\x85\xdb\xee\x43\x6d\xe2\xdb\x3d\xde\xdc\x2d\x54\x03\xb1\xd3\x03\x2e\xea\xe6\x39\x69\xed\x31\x87\x83\x45\xad\xab\x0f\xb9\x05\x57\x6a\xc0\x73\x3d\xc0\x77\xcd\xdd\x1f\x73\x15\x05\x74\x28\xcd\x79\x9d\xa5\x19\x0d\x7c\xe8\x0f\x87\xc3\x6f\x5d\xf4\x2a\x25\xf0\x69\xbd\x6b\xc8\xe1\x7b\x8d\xba\xc3\x72\x59\x40\xd6\x21\xf4\x3b\xcd\x0a\xc6\x9d\xc0\xaa\xf9\xd8\x3b\xe2\xaf\xe5\x92\xa5\xe8\x29\x6d\xa1\x81\xdf\x0b\x5e\xf2\x97\x1d\xc5\xf6\xd4\x2a\x83\x52\xb8\xd2\xf4\xdc\xf3\xd9\x85\x78\x92\x88\x5c\x94\x5c\x43\x0c\x27\xba\xc2\x16\x52\xbb\xa1\xbd\xc5\x9c\x71\xd3\x95\x65\xa0\xa4\x1b\x0b\xad\xd1\xc8\x68\x77\x51\x89\x50\x0a\x47\x3d\x23\xcc\x8f\x12\x6b\x04\xee\x1e\x54\x66\x94\x5d\x67\x73\x23\x0d\x89\x39\x4f\x9a\x4f\x86\xa3\x3f\x87\x47\x9b\x02\x9a\xbc\xe2\x6d\x75\x2a\x8b\x57\x16\x88\xfa\xae\x4f\xa4\x35\x30\x8f\x54\x4a\x6b\xe4\x62\xe2\xa1\x17\xee\x2d\x6f\x88\x5b\x71\x1e\xe4\x24\x47\xf9\xb7\x2d\x68\x32\x40\xec\x81\xb4\x76\x11\xa1\x81\x05\xee\xcf\xa3\x34\x78\x59\xfe\x5f\x52\xfb\xfd\xa4\xe6\x11\x79\x0b\x5a\xf3\x9d\xfe\x6c\x62\x23\x6a\x83\x77\xea\x9f\x47\x6d\xcf\xcd\x70\xff\x97\xda\x7e\x3f\xb5\x79\x44\xde\x82\xda\x7c\xa7\xff\x33\xac\x0d\x88\xed\xfa\x93\x6b\x42\x00\xec\x1b\x36\x15\x5a\x01\x95\xa1\x54\x04\xcb\xb0\xc3\x93\x13\xec\x40\xd8\xc0\xd4\xdb\xab\xc4\x3a\x4b\x3d\x19\x7c\xd3\xe9\xb3\x77\xee\x53\xa7\xe4\x2b\x1f\x00\x89\xd6\x28\x57\xea\xc2\x0e\x05\x4f\xeb\x94\x6b\xce\x9c\x27\xae\x0b\x23\x81\x39\xb6\x38\xab\x65\x29\xba\x4f\x61\x81\xe3\x4b\x1c\xf4\xb2\x03\x42\xcb\xa5\x19\x39\x70\x94\x46\x89\x65\x20\x0b\x10\xe5\x74\x29\xaf\x76\x17\x92\x7d\xa0\xec\x26\x0f\x1c\x45\x99\x35\xc2\x64\x1a\x60\x21\x2e\xd6\xcc\x8d\xd9\x30\x1f\xb9\xd4\x8b\xe5\xee\x2f\x9b\x60\x32\x9b\xc4\xca\xb6\xd9\xf8\x1c\x2a\x30\x6c\x65\x3e\x63\x5e\x0e\xc8\x0f\xf3\xd3\x60\xe7\x62\x06\xbe\x0e\xe0\x64\x16\xc8\xb0\xf3\x50\xa5\x49\xa8\x58\xcd\x84\xc8\x07\x73\xbe\x06\xa5\xe0\x80\x97\xa5\x5c\x0d\x6e\xa5\xde\xdc\x8c\x1a\x60\x53\x68\xd7\xa4\x38\x40\x51\x92\x82\x45\x25\xa5\x10\x05\x65\x14\x41\xaf\xc4\x27\xa7\x27\x27\x3f\x3f\x67\xdd\xe3\x05\x96\x9d\x33\x0f\x86\x13\x34\x94\x5a\x0a\xc4\x7a\x65\x56\x77\x21\xfa\xa4\xce\x81\x75\x58\xfc\x43\xa8\x1e\x29\x1e\xc4\x7c\x99\x43\x88\x96\x59\x19\xea\x42\x1b\x19\x98\xcd\xcb\xc1\xb4\x98\x2f\x64\xc9\xcb\x2c\x87\xd0\x7b\x3e\x26\xe6\x35\x93\xb9\x7f\xb4\x80\x70\x7e\x25\xd6\xed\xf7\x43\xf0\xdc\xc6\x5c\x95\xcb\x05\x5e\x15\x88\x0c\x23\xd8\x97\x8a\x75\x73\xa1\x54\xcf\xf0\xd6\x92\x34\xa4\x73\x8e\x6f\x84\x20\x76\x8b\x4c\x5e\x22\xcd\x34\x78\x41\x5c\x67\xfb\x05\x2f\x24\x74\x43\x68\x88\xca\x7d\x3d\x5f\xde\xb4\x6c\xb0\xbc\x16\x83\xf9\x32\xd7\xd9\x22\xcf\x6e\x71\xa5\x06\x9b\x7b\x58\xb3\x58\x7a\x78\xce\x56\x0a\xf6\x4a\x96\x8a\x5c\x73\x73\x6f\xe0\xae\xd0\x76\x40\x0a\x3d\x77\x0f\xb8\xa7\x0f\x6e\x19\xb4\x1c\x1a\x19\x17\xdc\x91\xe4\x8a\x4d\x6c\x55\x4f\x78\x03\x55\xdf\x3e\x40\xad\x7f\x02\xd7\xac\x31\x4b\x7b\x23\x45\x6c\xdc\x9e\xef\xdf\x35\xa3\x4c\xc9\xc1\x83\x83\x07\x0f\x6c\xa8\xad\xff\xdb\xcf\x16\x3f\x0c\x72\x99\x5c\x89\xd4\x4e\x36\xb4\x1e\x3b\x4e\xe3\x66\xde\x7d\xf2\xf2\xe4\xbc\x59\x1b\xf9\xf4\xfc\x25\x8c\x40\xee\x57\x81\x47\x18\xa6\x23\x2c\x79\xa1\x72\x0a\x3b\xec\x42\x2a\xd6\x69\xc9\x17\xb3\x2c\x81\x74\x85\x2a\x04\xfa\xfa\xe2\x87\xc1\x37\xf6\xbc\x28\xa6\x96\x8b\x85\x2c\x6d\x14\xad\x54\x6d\xbe\xdc\x82\xe1\x52\xd0\x93\xa0\xb0\xc1\xe3\x11\xea\x29\x1d\xa9\xf7\x03\x66\x1c\xa4\x1e\x9d\xcd\x3d\x19\x81\x46\xd6\xad\x1d\xad\x0c\x3e\xf4\xb5\xcd\x49\xd9\x86\xf9\xe8\x2c\xb9\x42\x7d\x18\xae\x63\x59\x80\xdf\x97\x91\xd6\xd0\xbd\xc6\x08\x16\x57\x46\xce\x13\x45\x2a\xc0\xfc\x07\xad\x9d\x0c\x27\xa6\x3c\x59\x33\xee\xd9\x56\x40\xa9\x60\x40\xc3\x02\xf1\x77\xf6\x5f\x6c\x72\xd5\x31\x2c\xe8\x3e\x7b\x0a\x80\x9b\xdc\x18\x75\xdd\x87\x31\x70\x24\x2e\x07\x89\xba\x9b\x3f\x3f\x04\x99\xd5\x02\x7b\x21\x50\x13\xb2\x1d\xa9\x99\xc0\x18\x53\x6b\xe2\xad\xba\x11\xa5\x32\x59\xce\x45\xa0\xec\xb1\xd3\x19\x18\x3e\x77\xf7\x39\x01\x3f\xca\xb3\x42\x0c\x62\xa7\x06\xa8\xd1\xce\x4e\xce\xcf\x91\x8f\x82\xd3\xb8\x5e\xbb\x54\x76\x2e\x31\x95\x99\xce\xa6\x24\x3b\x2e\xdf\x3b\x3b\x32\x80\x6d\xe6\x1f\x8c\x01\xee\x36\xe7\x2d\x72\x7d\x7a\x1b\x72\xc6\xf8\x5a\xf4\xed\xd9\x87\xb6\xe7\xbc\x5a\x8e\xd5\x72\xfc\xcf\x9e\xe7\x8a\x52\xe2\xbc\x36\x1b\xa9\xd7\xa4\x82\xb4\xe5\xb7\x79\x9a\xb2\xc5\x72\x9c\x67\x6a\xb6\xaf\x96\x63\x95\x94\xd9\x58\xec\x2f\x0b\xf7\xd9\x25\x95\xe2\xd0\x1b\x33\xfb\xf3\x82\x89\x1b\xc8\x8f\x30\xb5\xfe\x49\x61\xd6\x9c\xe5\xf8\x7c\x39\x6e\x29\x5a\x29\xc7\x80\x8f\x52\x7d\xa0\xb4\x4a\x41\x52\xc6\x63\x3f\x99\x3e\x73\x33\x40\x39\x26\x9c\xd2\x5c\xe8\x99\x4c\xe1\xb9\xd5\x3c\x13\xcc\xc1\x4c\x9e\x2c\xbe\xcc\xb4\xb5\xc3\x50\x90\x0a\x24\x70\x96\xcb\x64\x26\x52\x7a\x4e\x8a\x12\xf6\xa2\x90\xac\x10\x80\x1f\x03\x68\x25\xcb\x72\x4d\x89\x68\x0d\xf2\xc8\x87\x07\xad\x3c\x71\x0d\xeb\xb0\x82\x82\xad\x8c\x2d\xc7\x7f\x03\x42\xb1\xf1\x7f\x88\x73\x20\x01\xeb\xf7\xcf\xb4\xac\xe3\x6f\xc8\xd3\xf4\xb1\x6d\x10\xd6\x40\x18\xff\xcd\x57\xed\x41\x0a\xa5\x3a\x5a\x61\x6f\xcc\x02\xe7\x2a\xd7\xce\x83\x6a\x9c\x08\xdd\x9f\x22\x4a\xa3\x25\xc7\x7f\x7b\x37\x7f\xef\x4f\x4b\xa5\xd9\xbb\xf9\x7b\xcc\x9d\x85\x43\xf6\x5c\xde\x38\xbb\x79\xe7\x6e\x7b\x30\xdc\x07\xa3\xbd\xcd\x1b\x72\x62\xbd\x1f\x15\x61\x91\x9b\xcd\x0d\xf7\xaa\x5a\x22\x8d\x7e\x06\xbc\xd9\xcf\xe6\xb9\x1d\x0c\x31\x0c\xfb\x39\xe4\x20\xd2\x7b\x1f\x59\xc2\x29\xbb\x1e\xf8\x3c\xd1\xcf\xc8\x41\xaf\xe5\x95\x20\x23\x68\x18\x8f\x5e\xdf\x80\xa0\x18\x85\x1b\x38\xd8\x08\x9a\x58\xdf\x8d\x15\xd4\xa4\xb0\x3f\xe2\x09\x8d\xc8\x3e\xac\x16\xe1\xbf\x7d\x47\x1d\xcc\x06\xbc\x7b\xef\x6b\x46\x34\xb4\x18\x2e\x96\x6a\xd6\x75\x83\x46\x27\xe8\x75\x78\x70\x31\xdc\xff\x6e\xa8\x5e\x56\x00\xed\x8a\xee\x63\xff\x71\x51\x8a\xeb\x4c\x2e\x55\xbe\x66\xa5\x98\x66\x4a\x43\xf6\xad\xeb\x8c\xdb\x42\xf3\x6e\x84\x6e\x6f\x23\xf6\xc3\xb9\x6c\xc7\xbf\x21\x77\xc8\xa4\x77\xd4\x8a\x41\x5b\xc6\xe3\x33\xd3\x2e\xac\x1f\xd3\x79\x5a\x60\x69\x13\x6a\x89\x15\x63\xe8\x0f\x57\x19\x24\x63\x47\x30\x82\xab\xc2\x11\xec\x05\x02\xce\xd8\x77\xec\x20\x02\xfc\x42\x6a\xbf\xde\xb4\x0e\x17\xe0\x29\x23\xeb\x88\x6e\x56\xab\xca\xf2\x0a\x99\x62\xe0\x47\xdc\x72\x90\xdc\x21\x34\x8f\x1a\x6b\x29\x42\xe3\x34\xcf\xd9\x04\x64\x05\x8f\x2e\xc3\x00\xf1\x3c\xa4\x8c\xab\x75\x91\xcc\x4a\x59\xc0\x8e\x0d\x5d\xc6\x42\xe4\xb5\xf8\xf0\xa3\x94\x92\xe4\xf0\xc3\x8b\xb5\x2c\x04\xbd\x1b\x97\x60\xf2\xb2\x67\xfe\x96\xc4\xb6\xb0\xcb\x33\x8b\x1a\x36\x31\x51\xc1\x8e\x0b\xc6\xcb\x71\xa6\x4b\x5e\xae\x1d\x03\x57\x4a\x26\x19\xc7\x72\x8e\x60\x79\x05\xe6\x1d\xa4\x0a\xd9\x4c\xb5\x72\xa1\x3f\xe4\x5c\xe9\x13\x47\xbd\x45\x80\xac\x80\x69\x24\x50\x44\x60\xa2\x45\x69\x69\xd7\x7c\xa1\x02\x64\x43\xb4\xc7\x58\xa0\x02\xd1\xe1\xa0\x95\xa4\xed\x8a\x9b\xc8\x59\xf4\x6b\x13\x43\xca\x76\x33\x82\x21\xd6\xcf\x32\xa5\xbb\x99\x65\xdf\x46\x94\x81\x17\x56\xa6\x98\x11\xe3\x0d\x79\xd0\x46\xc1\x16\xbb\x12\x55\x04\xb2\x4f\xc5\x17\x30\xe7\x3a\x06\xab\x48\x0b\x29\x91\x45\x22\xca\x82\xc9\x65\xa9\x44\x7e\x2d\x28\x05\x88\xb8\x49\xc4\xc2\x72\x4b\xe6\x49\x1d\x88\xd7\x17\x2f\xb5\x65\x14\x95\xd0\x17\x38\x93\xae\x9f\x31\xb8\xc2\x64\xec\xbe\xaf\x62\x68\x7a\xbf\xcb\xde\x77\x83\x6a\xca\xb7\x38\xc3\x70\x84\x3d\x0e\x20\xbd\x1d\xf8\x0f\xc0\x58\x59\x81\x85\x26\x32\x4d\x2f\x1d\x45\x65\x24\x57\xa2\x53\xd2\x1d\xb5\xc6\xaa\x12\x34\x13\xe0\xbf\x46\x7e\x4c\xb8\x46\xe0\x51\xd1\xdf\xe6\x9d\xa9\x4f\x85\x4e\x34\xb0\xea\x5a\x1f\xaa\xa3\x13\x57\x53\xb7\x83\x57\x5b\xbf\xaf\xd4\x2c\x74\x23\xdd\xdb\x8c\xe3\x03\x64\x21\x5b\x44\x5c\x54\x73\xfc\xb3\x8b\xb8\x6d\xa9\x5c\x57\xb6\xbe\x20\xe5\x2c\xc5\xd3\x78\x26\x57\x27\x50\x01\x9a\xfe\x3e\xcf\x7e\x15\xfe\xaf\x0b\x71\xa3\x8f\x9d\xdb\x73\x98\x05\xf6\xdf\xcd\xe0\x66\x0d\xd7\x99\x58\x21\x77\x44\x61\xda\xd5\x81\x53\xbe\x06\x6e\x68\xf0\x36\x6c\x01\xdc\x54\x0d\x62\xc4\x8d\xe3\xd6\x4f\x35\x9b\xf3\xac\xd0\x3c\xa3\x07\xba\xad\x17\x46\x91\x0c\xae\x76\xa4\xe1\xe4\x33\xae\xd8\x98\xab\x2c\x71\xe2\xaf\xf5\xdc\x86\x0a\x2d\xf8\x66\x85\x54\xe3\xd7\xa2\x84\xd0\x0d\x0a\x4b\x4e\x53\x2a\x3f\x5e\x8a\xb9\xbc\x36\x9f\x4b\xb9\x52\x5e\x33\x4d\x24\x10\xa6\xa9\xc5\x65\x99\x11\x0b\x09\xe9\x68\x73\x91\x4e\x5d\xbe\x93\xa6\xdc\xc5\xae\xb0\xaf\x0f\x15\x86\x51\x64\x11\x8c\x61\x88\x20\x15\x88\x19\x30\x2e\xe4\x6b\xab\xbb\x8a\xbb\x61\x55\x4c\x8a\x68\x36\x1c\x0b\xca\xc1\x98\x15\x2a\x1f\x07\x4e\xf3\x06\xf3\x05\xb7\xad\x56\xbc\xc0\x64\x30\xa2\x50\x4b\x73\x49\x19\x50\xf0\x1a\xe4\x85\xde\x38\xb9\x3e\xcb\x74\x47\x91\x7b\x68\x29\xd4\x42\x16\x2a\x1b\x67\xf4\xea\x41\xe4\x11\xbc\x12\x8a\x72\x94\x18\xbb\x6e\xfe\xc0\xb9\xf9\x7b\xef\xc2\x2f\x19\xc2\xfe\x90\x11\xc9\x42\x97\x1c\xb8\x92\x62\xa2\x98\xc8\x32\x11\x54\xba\x27\xb7\x95\x63\xa8\x64\xcf\xa2\xe4\x89\xce\x12\x31\x1c\xc2\x0d\x36\x00\x80\x96\x3c\x89\xae\x68\x8f\x64\x6e\x1e\x42\x2b\x49\x3f\x9f\x13\xa2\x61\xc1\x09\x38\x4b\xbc\x2c\x84\x55\x26\x1a\x60\xe4\x24\x67\xe7\x07\x14\xe3\x5b\x38\x75\x72\x95\x2e\xec\x1c\xe6\xb9\x1d\x03\x27\x00\x9b\x98\xf0\x12\x72\x03\x72\x8d\x88\x35\x82\xc5\x4f\x17\xcf\x9f\x9d\x62\xfe\x07\x70\xd9\x28\xec\x04\x72\x5e\x4e\x21\xc0\xa0\x00\xdd\x81\x9c\xe0\xd4\xfb\x6c\x26\x57\xe2\x5a\x94\x98\x27\x02\xe0\xcc\xf8\x62\x21\x0a\x7a\x50\xf8\xac\x25\x86\x7f\x14\x06\x94\x5b\xb3\xcc\xf3\x57\x92\xe8\x9f\xee\x32\xf2\x71\x67\x9c\x4d\xc4\x8a\x95\xcb\x5c\x50\xa6\x3f\xac\x04\x3b\x64\xec\x94\x27\x33\xbb\x9d\xb6\xb6\x61\x29\xa1\x3a\x34\x51\x65\x82\x7a\x0e\xb3\x14\xa6\xf9\x94\x75\x6e\x06\xa5\x5c\x75\xf0\x60\xc1\xee\x43\x3f\x18\xd1\x52\x06\x16\x94\x73\x19\x0d\x90\xa9\xc9\x12\x29\x2a\x75\x36\x42\x4c\x6a\x40\x27\x0a\x69\x88\x9c\xa4\x0b\x7b\xa6\x5b\x8f\x1b\xa3\x6a\x4a\x59\x41\x3a\x3e\xc4\xb8\xa3\xa9\xf1\xba\x42\x2c\x50\x35\xca\x55\x95\xc2\x04\x34\x18\x61\x86\xba\x00\x2b\x1c\x54\x68\x28\x9c\x10\x78\x83\x35\x22\x1d\x05\x1d\x57\x1c\xcd\xa6\x6f\x33\x2f\x52\x15\x53\x63\xc3\xf1\xa0\x12\xdf\xf9\xda\x72\x1b\xa4\x1f\xc3\xb7\xd8\x9c\xdf\x64\xf3\xe5\xdc\x06\xd0\x42\x65\x43\x33\x8d\x83\xaa\x78\x49\x25\xeb\x51\xa0\xc3\xd6\x27\xd0\x18\x54\xea\x04\xc5\x9f\x7d\x6c\x61\xcb\x3c\x65\x8a\x64\x3a\xc7\x4f\xce\x85\xa0\x13\x6d\x8b\xe8\xc7\x7c\xd5\x7d\x6b\x00\x64\x05\x06\x18\x00\x9b\x36\xf2\x2b\x41\x83\x6c\x86\x48\xbf\x8a\xa2\xfc\xa4\x64\x73\x48\x12\xe1\xdd\xc9\x20\x2d\x44\x9a\x82\xae\x41\x1a\xda\x94\xab\x38\xa9\x15\x41\x3b\x30\xd7\x7e\x21\xb5\xa1\xab\xeb\x2c\x8d\xa5\x4b\xda\xaf\x4a\x9d\xc4\x00\x0f\xbd\x4a\x8d\x0a\x23\x7c\x26\x7d\xb0\x8f\x0c\xe0\xfc\xf2\x04\xca\xa0\x5b\x1f\x40\xb3\x05\xf4\x70\xf5\x5c\x80\xb2\xd3\x83\x3c\x66\x5a\x1c\x43\x66\x10\xf7\x5a\xdd\xdf\xb7\xd8\x8e\x02\x9e\x1d\x92\x03\x40\x58\x4e\xd0\x4f\xef\x03\x3b\xaa\xed\xdc\x6f\xbf\xb1\x6f\x0e\x42\xc0\xee\x6a\x94\xb9\x2c\xfb\x10\x7c\x0a\x49\x49\x45\x99\x67\x05\x95\x3e\x8b\xc3\x3e\x95\x1b\x4b\x47\x57\x7a\xa4\x2d\x89\x6f\xfb\x2e\xda\xb3\x87\x56\x9d\xda\xb3\x33\x38\xa1\xd1\x21\xe9\x01\x9a\xc6\xe9\x8e\x4e\xa4\x2c\x53\xc8\xaf\xe7\xc7\xc3\x9f\x5e\xd9\xdb\x3b\x1c\x0f\x65\x8f\x2e\xc9\x67\x7e\x79\x85\x4c\xf1\xa8\x71\x2c\x22\x67\xb9\x82\xbf\x05\x71\xb8\x4c\x39\xa9\x00\x6e\xd0\xca\x98\x67\x72\xf5\x42\xa6\xc2\x60\xb4\x58\xe6\xf9\xb6\x11\xd4\x82\x17\x56\x28\xb9\xed\x50\x6d\xe3\xc8\xc9\x44\x09\x8d\x17\x5e\x40\x07\x70\x6d\x87\x3d\x7d\x62\xce\xa6\xf1\x2a\x83\xbd\x04\xa0\xd5\xe1\xce\xc4\x54\xdc\x50\xbd\x36\xf4\x8c\x04\x33\x82\x2c\x53\xef\x1d\xe9\x77\xc5\x7c\xff\xb8\x14\xfc\xea\x39\xd7\xc9\xec\x99\x98\x68\x07\xae\xb1\xc5\x19\x48\xc2\x1b\x9b\x3c\x47\x8f\x72\xdb\x26\x78\xb1\x9f\x51\x65\x2c\xcf\xe9\x20\xfe\x10\x43\x3a\xbd\xd8\x59\xd1\x59\xba\xf2\xa8\xbe\xc5\xc7\x7a\xeb\x86\xba\xc3\x44\x9e\xc8\xe3\xec\x1b\xd5\x8a\x39\x1c\x63\xfd\x80\xe7\xd5\x8e\x75\x85\x8b\x04\x6f\xd4\xa9\xd0\x30\x68\x4d\x8f\x4b\x93\xf4\x44\x6d\x9a\x75\x6b\xa7\xba\x5f\xe1\x15\xb6\x44\x7f\x1b\x9e\xe2\x45\xb8\xd9\xd7\x67\x1c\x61\xca\xf1\xfe\x06\xe1\xf3\x76\x8b\xfd\x49\xd0\x86\x37\x2f\xb7\x71\x31\xbb\xaf\xa5\x7d\x03\x76\x59\xce\xdd\xb6\xef\x2d\x9c\xbc\x8d\x0b\x0a\x37\x2c\x5a\x8c\x35\xd7\xb6\x5f\x9f\x0b\x51\x52\xa5\xc1\xe6\xcb\x38\xd9\xe1\x0a\x0e\x60\xb4\x2e\x44\x09\x7d\x12\xdc\x0c\x1b\x4a\x20\x57\xee\x14\x2a\x85\x7c\x2f\x2c\x9d\x1b\x71\x66\xea\xc0\xbe\xa7\xb6\x81\x66\xd6\x0c\x1a\xb5\x6d\xec\x5f\xca\x55\x9f\xd6\x39\xa8\xea\xec\xce\xf0\xc1\xe0\x73\x9e\xc1\xab\x21\x7e\x74\x85\x45\xf4\xb2\x3a\x17\x08\x44\x68\x24\x08\x0f\xe8\x16\x84\x00\xd6\xd2\x33\xb9\xda\x4c\x08\xb6\x95\xea\x1e\xf6\x5c\x4d\xeb\x78\x29\xf1\xb3\x51\xcb\x45\x20\xa1\x56\x16\x03\xd5\xf3\xc2\xfc\x4f\xdb\x89\xa4\x72\x76\xdd\x93\x2b\xae\x1b\x8d\x87\xef\xbb\x00\x33\xdf\x23\x6a\x90\xe1\x8b\x14\x7a\xef\x84\x0f\xd5\x42\x4a\xcd\xe7\x9d\x74\xb3\x07\xb4\xdf\xf1\x5e\x93\xc5\x18\xe4\x37\x46\xb7\x68\x0d\x3f\x55\x1c\x44\xbb\x6b\x3a\x5e\xd8\x3b\x5f\x92\xf8\xb9\x71\x19\x94\x8c\xbb\xb2\xb1\xa5\x5c\x05\x07\xa2\x69\xfa\x07\x7d\x33\x48\xe3\xfc\xf1\xb6\xd8\x71\xfa\x8d\x3b\x01\x10\x2e\xac\x0c\x79\xdb\x85\xa8\xca\x4a\x54\xe3\x52\xa8\xfd\x90\x2f\x16\xf9\xba\x1b\xff\x08\x6b\x53\xad\x07\x31\xe7\x9f\xe6\x1c\x3a\x38\xb7\x38\x86\x0b\xb9\xd8\x7a\x08\xb1\xcd\xce\x47\xd0\x7a\xc3\xfd\x33\x9e\x42\x5a\xea\x5d\xce\x60\xe3\x4d\xcc\x06\xb8\x8a\x9d\xcf\x67\x13\xf2\x3e\xf1\x11\x5d\x2c\xd5\x6c\xc7\xf3\x09\x8a\xe2\x5d\xce\xe5\x2e\xd3\xfe\x64\x47\x93\x16\xd0\x72\x2e\x61\x8f\x4d\x93\x9d\x8f\x62\xd3\x3e\xf8\x7c\x00\xe6\xcb\x8d\xeb\x72\xf4\x8a\xca\x93\x0b\xa7\x46\x71\xab\xb1\xef\xa6\xe1\x27\xdc\x45\x6c\x52\xd9\x47\x18\x17\x39\xe9\x06\x76\x4b\xad\x76\x64\xb9\x7f\x08\x26\xd4\xf0\x0f\xa1\x0c\x87\x14\xd5\x8c\x15\x22\x11\xe7\x80\x90\xb1\x23\x76\xf0\x88\x65\xec\x3b\x9c\x14\x89\xcf\x2c\xbb\x7f\x3f\xaa\xe3\xd5\x8c\x42\x76\x9f\x65\x16\x8d\xea\x5d\xf6\xbe\xee\x7d\x40\xfc\x91\xdf\x82\xbb\x6f\x43\x65\xa0\x9b\x6b\x61\x83\xb5\x7b\x21\x64\x7f\x1b\xd1\x87\xd0\x9a\x68\x6a\x07\xfe\x47\x58\xfe\xb3\x2f\x89\x06\x52\xc3\xa8\xd7\xc8\xae\x30\xfc\xaf\x72\xc1\x38\x14\x37\x51\xe8\xae\x57\x4d\xd4\xbc\x72\x7e\xc1\x53\x80\x6b\xb1\xc9\x72\x13\x59\x55\x94\xd0\xaa\x51\x41\xa4\x25\x43\x8d\x10\x3e\xd5\x73\xc1\x4b\xc5\xe4\x52\x63\xc9\x11\x83\xc4\x92\x94\xb8\x29\xd7\xdc\xc2\x3c\xc6\x24\x58\x14\xbc\x4b\xa7\x5e\x96\x5e\x4f\x49\x69\x7d\xc0\xde\x19\xe8\x59\x9c\x55\x29\x53\xa0\x41\xce\xb3\x14\xdc\x9c\xc0\xc2\xcf\x33\x25\x30\xeb\x94\x4a\x96\xa5\xf0\x26\xdf\x2d\xdc\xc0\x22\xe3\xa4\xaa\xfa\x6a\xf2\x01\xab\xbc\xa2\xcc\x3e\x59\x8d\xd8\x66\x6d\xd6\x06\x05\xd4\x46\x75\x51\xb0\x6f\xbe\x1e\x67\x42\x05\x33\xed\xd1\x20\xf4\x6c\x3b\xba\xb0\x3d\x27\x76\x7e\x1b\x57\x68\xe7\x3f\xcc\x8a\x42\x94\x60\x45\x38\x62\x9d\x4e\xcb\x2a\x89\x62\x9d\x36\xb2\xdb\x01\xc7\x4b\xb3\x9d\x93\x5c\xae\x3a\x55\xec\xf8\x45\x1e\x3c\x6a\xc1\x2c\xbd\x6f\x37\xb4\xb0\xd0\xcd\x3a\x78\xae\x84\x73\x72\x31\xb4\xf3\x28\x7c\x3a\xc7\x4a\xd4\x61\xa6\x48\x4b\xdd\xed\xf9\x72\xa4\x37\xda\x2d\x30\xb2\x6e\xd3\x2f\x60\x9b\x05\xc5\xc4\x2c\xd3\x02\xd2\x86\xd5\xd5\x46\xde\xde\x8e\x15\xe7\xd1\xa1\x18\x9c\x14\x64\x01\x0a\xf7\x6b\x51\x2a\x97\xe7\x1a\x54\xeb\xb0\x27\x90\xb0\xd8\x30\x31\xc1\xfb\x2e\x86\x1b\xc1\x40\x3a\xb6\x8e\x82\x8a\x04\x94\xd9\x4a\x94\x5c\x09\xe7\x81\x37\xb4\xae\x3d\x04\xfc\xa8\x49\x71\x3c\xa4\x5f\x1f\x35\xeb\x95\x87\xbe\x33\xa1\xb2\xb9\x99\x5a\x17\xc9\x09\x4c\xbe\xdb\x73\xe8\x06\xed\x6c\xf3\xa8\xe8\x0c\x7b\x82\x9a\x5b\x51\x76\xcd\xcf\x6d\x27\x65\x08\x06\x87\xf4\x64\x96\xe5\x69\xd7\xc0\xac\x36\x74\x87\x46\xa6\xc2\x7b\x99\xb5\x2e\x64\xcb\x8a\xe3\xa5\x04\xa7\xec\x39\x2f\xaf\x22\xbe\x08\x02\x1f\xb8\xc9\x80\x31\x9a\xa8\x4e\xb8\x5c\x4f\x85\xa1\x10\x43\xef\xa1\x8d\x08\x34\xfb\x8e\x42\x21\xee\x90\x32\x55\xa7\xb4\xef\x98\xe1\x07\x53\x55\x97\x90\x08\xd0\xeb\xfe\x0c\x64\x32\xb6\xa3\xa5\xfd\x4a\x28\x96\x69\xc3\xff\x30\x41\x3b\xdc\x3d\x89\x9c\x8f\xcd\x30\x7a\x05\x39\xb3\x20\x57\x96\x1b\xd2\x19\xf1\x1d\x48\xf0\x7e\xb5\x36\xfe\x78\xbe\x18\xc1\xe8\xca\x86\xb9\x0b\xd8\xa6\x25\x14\x66\x9a\x64\x54\x8b\x17\x35\x64\x14\x92\x03\x56\x3f\xfb\x13\xa4\xda\xe6\xda\x1a\x56\x17\x65\x86\x0a\xdf\x58\x4b\xef\xb8\x39\x85\xdc\xcf\xe7\x99\x46\x5b\x64\x84\xbd\xbe\x75\xc0\xc7\xcc\xec\x8b\x52\x24\x22\xb5\xae\x18\xa5\xb0\x50\x60\x73\x42\x76\x08\x96\x78\xc9\x38\x64\x8c\xa9\xcc\x7a\x23\x97\x84\x89\x3c\xcb\x0a\xf1\x32\xe0\x30\xdb\x39\xa5\x12\xba\x95\x01\xa2\xcf\x7e\xf5\x71\x9f\xcb\x24\xb8\x84\x15\x78\xd3\x32\x8e\xb9\xa8\x80\xea\x9c\xf6\xbb\x55\xb2\xb1\x6f\x02\x48\x9c\x86\xd6\x9d\xea\x1b\x22\x90\x64\x80\xa5\x56\x9a\xfb\x01\x36\xaa\x31\x5b\x2f\x47\x52\x24\x1a\x20\x81\x17\x69\xb3\xfe\x9c\x78\x6a\x22\x0b\x25\x73\x31\x5c\xf1\xb2\xe8\x76\x8e\x7d\x46\x4c\xa8\x42\x52\x21\x0e\x59\x30\x81\x25\x84\x70\x5a\x9d\xa8\x48\x74\xe4\xe1\x64\x90\xf1\xfd\x51\x8b\xee\xbe\x32\xb6\x28\x4b\x59\x76\x3b\xe6\x1e\x34\xe2\x8a\x9c\xb0\x31\xd4\x01\x43\xff\x46\x7c\xf3\xc0\x30\xb0\xfd\x6d\xef\xf6\xc3\xe0\xbe\xb0\x33\xf8\xce\x48\x43\xbf\x67\xb0\x83\x68\x51\x5e\xd1\x5b\xbf\x6f\x9a\x87\x41\x95\x73\xd3\x48\xb4\x4d\x8f\xa8\x17\xdd\xb0\x75\x05\x74\x7d\x61\xd4\xb8\x7d\x6d\xb7\x1d\xd4\x2f\xf2\x56\x77\x7b\x89\xa7\xad\xb6\x25\xef\x4a\xb9\x7a\xff\x28\xbe\x91\xa8\xed\x10\x54\xcf\x70\xaf\x38\x8d\xfa\x67\x70\xc1\xd0\x4a\x2a\xcd\xe5\xaa\x10\xe5\x13\x1b\x95\x82\x57\xd8\x85\xb8\xd1\xe6\xc7\x6e\xa7\xe3\xb7\x0a\x5a\x37\xde\x5a\xce\x13\x90\xee\x90\x93\x60\xd5\x9e\x56\x71\x21\x47\x4d\xcc\x24\xf4\xcd\xab\x12\x40\xa3\x9c\x34\x68\x10\xaf\xbc\x43\x5f\x78\x45\x07\x97\xe9\x23\xfa\xb9\x3a\xcb\x5b\x8e\x13\x78\xf9\x45\x92\x53\xa3\x34\x4c\xeb\xde\xb8\xfb\x20\x55\x87\x7c\x05\xb0\x86\xaf\x81\x6e\xb8\x73\x06\xc5\x64\xb4\x3d\x62\x6e\x86\xd1\x72\x1e\xb9\x86\x2b\x32\x29\x35\x59\xcf\x87\x06\x2a\xd8\x9c\xfc\x26\x06\x94\x32\x34\x77\xfc\x79\x36\x86\x28\xa1\xdf\x7e\x23\x50\xdf\xd3\xd8\x1e\xcf\xad\xd2\x4a\xed\x67\x2f\x01\x23\x0c\xdb\xc4\x73\x35\xc2\x4f\x75\x77\xee\x1f\xe1\xe8\x8f\x42\xd2\xad\xce\xb1\x1e\xe1\x40\x26\x31\xeb\x83\x11\xa4\xe0\xf1\xc1\x1d\x50\xe8\x24\xe1\xa5\xd0\x61\x45\x05\x1d\x0a\x43\xe0\x92\x56\x7f\x27\xb6\xdf\x1c\xeb\x22\x39\xb7\xb0\x4e\x00\x74\xe8\x37\x6c\x7f\xa1\x4b\xb5\x5c\x13\x26\x7d\xe6\xa6\x44\xe6\x39\x5f\x28\xd1\xad\xa2\xb6\xdf\x44\xf0\xc8\xb4\x12\xc8\x80\xd4\x9d\x64\xa5\x98\xc8\x9b\xa7\x90\xc5\x31\x3d\xb5\xaf\xc1\xc0\xe3\xf6\x87\x1f\xc0\x67\x13\xfd\xdc\x21\x1c\x87\xda\x40\xe4\xdc\x4c\x90\x5c\x96\x99\x77\xd6\xa4\xcf\x4a\x4e\x29\x0d\x79\x81\x05\xf0\x0b\xa9\x2d\x28\xaa\xbf\xe9\xac\xda\x34\xed\x61\x6d\x23\x16\x79\xa6\xbd\x18\x06\xfb\x87\xf2\xde\x4a\xc2\x5f\x4e\xa5\x66\xa4\x80\x82\xa8\xc3\x5e\xff\x61\x4d\x2b\xf3\xf7\x8f\xd0\xc6\xb4\x7e\xf2\xf2\x39\x9b\x94\x7c\x0a\x89\x98\x3b\xdf\xa5\xd9\xf5\xf7\xdf\xa9\x05\x2f\xbe\xff\x49\xe4\xb9\x64\x6f\x65\x99\xa7\xdf\xed\xc3\x37\xdf\xed\x9b\x5f\x3b\x18\x7c\xc0\x94\x99\x10\x60\x14\x3c\xec\xb8\x52\x91\x87\x05\x56\x87\xb1\x87\x4c\x4e\xd8\x57\xb6\xee\xca\x0a\x82\x25\x21\x37\x2b\x7a\x9c\xb9\xe1\x51\xd4\x1c\x1b\xf9\x54\x8c\x1a\x26\x63\xe7\x01\xff\x6d\x98\x19\xfa\x45\xda\x29\x80\xdf\x16\xc7\x1a\x35\xde\x41\x06\x13\x54\xe0\x1c\xbc\x03\x3b\xd4\x8b\x08\x04\xf3\x15\x2d\x42\x41\x75\xd5\x50\x3e\xd7\x72\x30\x16\x03\x58\x3c\x6e\x42\xe0\x0d\x67\x5d\x4d\x44\xe9\x53\x75\x58\x78\xe8\x8a\x82\x8e\xbe\x06\x5f\x39\x4f\x44\x8a\x4f\x00\x2d\x1b\x54\x74\xe6\xe5\x6c\xb0\xfb\x11\x7b\x3a\x6f\x16\xa8\x7f\x93\x67\xba\x59\x52\x23\x74\x47\x3e\x29\x76\x51\xa6\xb7\x77\x40\xc1\x15\xe0\x43\xd3\x39\x4f\x24\xc9\xb2\xdc\x7c\x2c\xdd\xa6\x87\xc7\xd1\x80\xee\x47\x3c\xcd\xb0\x4d\x88\x1d\x78\x11\xf0\x99\x24\x97\x85\x80\xcb\x10\xae\xe6\x5e\xf4\xee\x3e\x41\xcd\x84\x6d\x1b\x7c\x65\xce\x66\xf5\xbb\x4d\xdc\xf8\x7c\x39\x56\xba\xa4\x49\x1d\xb8\x79\x19\x30\x6e\x4a\x15\x58\xe8\x37\x0d\x21\x4f\x1a\x1f\x9b\xf4\x5b\xd0\x9b\xae\xdf\x46\x10\x3d\xc7\x53\x87\x0b\x6e\xd8\x1d\x34\x40\xf5\xd4\x63\x08\x48\xf0\xfd\xfa\x35\xa6\xeb\x42\x68\x3e\xab\x2e\xb3\x19\x2e\xea\x4c\x22\xc9\x21\x60\x14\xa7\xe8\x04\x8c\xc4\x67\xc8\x0b\x7c\x9b\xb3\xc5\x42\xa4\xae\x32\x9e\xf7\x3e\x4a\x72\x3e\x5f\x78\xca\x0f\xdd\x0e\x37\x12\xc2\x9c\xaf\xc7\xe2\x24\xcf\x16\xe4\x25\xd6\xa8\x16\xba\xc5\xe5\xd9\x24\xca\x38\x9c\x23\x8c\xef\x36\x08\xb2\x81\xbb\x9a\x61\xc9\x50\xb6\xbb\x90\x1a\x43\x1a\x61\xf5\x10\x1c\x3f\x5e\x6a\x2c\x2b\x8b\x5f\xf3\xf9\xc2\xc5\x41\x6c\x77\x97\x68\x1d\xfc\xf6\xee\x13\x8d\x82\x73\xaf\xe1\xb6\x6f\x92\x6b\xcd\x83\x30\xba\xe7\x2b\x0f\x9a\xfd\x7d\x76\x6e\xd8\x91\x9c\x4c\x62\x35\x2d\xae\x04\x43\x60\x0c\x27\x82\x3d\x64\xa5\x50\x1a\xcb\x43\xb0\x9c\x6b\xe1\xd4\x42\xbb\xcb\x76\xd6\x35\xed\xb9\x35\x39\xfb\x37\x29\x7a\x82\x80\xeb\xb6\x7d\x2d\x7e\x32\x64\x59\x7f\x38\x34\x82\xd8\x52\x1d\xa8\x37\xe0\x25\x79\xd8\x5a\xbc\x81\x4b\xdc\xed\x69\xb1\x42\x88\x0d\x72\xd8\x77\x04\xd5\xcc\xa9\x2e\xbf\xe2\x03\xff\x76\x8c\xcb\x05\x6f\xd4\x25\x97\x83\x26\xe1\x85\xe2\x8a\xfc\xee\x5b\x94\xe4\xb9\x15\x0c\xa0\xb8\x95\xdf\x99\x61\xf3\x9b\x28\x3e\x7e\x8f\x1a\xb4\x74\xe1\xa2\x22\xa9\xb1\x59\xca\xb6\x4f\x9d\x06\x86\xb5\xe1\x71\x51\x97\x47\xed\x83\x36\xa2\xc8\xef\x36\x72\x83\xa7\x91\x7e\x7b\xc5\x31\x9a\x2b\x8b\xbc\x13\x7d\x12\x6f\xb0\xe9\x08\xe0\x8d\x45\x70\x20\x94\x13\xd2\xbc\xc8\x7a\x17\x67\xa9\x70\xde\xbd\x9a\xa2\x78\x7f\x3f\xa8\x25\x9b\x0b\x73\x74\x8d\xa4\x47\x2e\x29\xd6\xf3\x82\x4e\x6f\xb3\x2e\xad\x4a\x76\x9b\xd8\xc6\xc7\x46\xe3\x34\x65\xa3\x8f\x85\xf6\x20\x91\x87\xd3\xaa\x78\xc7\xf9\x40\xb2\x87\x93\x17\x39\x21\x03\xf4\xff\x90\x4b\x14\x8f\x40\x60\x6c\xb8\x32\xba\x3d\xa2\xcd\xac\x60\xb2\x4c\x6d\x79\xb6\x6c\x11\x68\x4b\x3d\xfc\x82\x78\x76\x4c\xc9\x36\xaa\x28\x53\x58\x6c\x70\xb9\x70\x97\x19\x86\xc7\x68\x49\x91\x09\xf9\xda\x85\x1e\x51\xb8\x5c\x4d\xd5\x6a\x60\xe1\x0a\xa3\x7b\xaf\x41\xb5\x17\xc7\xef\xb6\xd8\x8a\xd1\x6b\x3e\x7a\xb9\xe8\xd2\xdf\x8d\x9e\xe8\x5b\xde\xd8\x71\xa3\x0b\xb4\x28\xf8\x2f\x62\x29\xe9\xce\x16\x16\x67\x76\x30\x57\x23\xc4\xc2\x00\x7a\x90\xaf\xb9\xb2\x8d\xb0\x92\xf1\x9a\x2d\x4a\x48\xf1\x0c\xf9\x82\xe4\x5c\x30\x28\x7e\x5e\x4c\x11\xc8\xca\x19\x39\x94\x0d\xb6\xa4\xac\x02\xa0\x76\x2e\xd3\x10\x18\x0e\xc0\x67\x82\x43\xc0\xbc\xce\xe6\xc2\x72\x26\xa5\x4b\xeb\xc8\x69\x65\x33\xfa\x06\x30\x68\xe7\xfc\x02\x2c\x1e\x66\xc2\xab\x19\xd7\x7d\x7b\xa2\xc1\x3d\xc9\x45\x8e\x42\x25\xdb\x90\x1b\x38\x1f\x6d\x48\x28\x7d\x2d\x10\x96\xc1\x12\xe5\x28\x98\x2f\x93\x59\x8b\x63\xbb\x95\x07\xee\x1f\xb9\x39\xda\xc9\x3c\x93\x09\x44\x1a\x27\x33\x51\x31\xaf\xb9\xb7\x58\xac\x77\x68\x52\x88\x58\x0e\x8e\xc6\x08\x2b\xc3\xe3\xf4\xe9\xaf\xb9\xe0\x46\xc2\x0b\xf2\xac\x89\x22\x8d\xf7\x69\x88\x60\xa0\x9e\x5f\x36\x5f\xe4\x99\x55\xa8\xc7\xc2\x1f\xd7\xd5\xee\xf4\x1b\x48\x9c\xf6\x92\xc0\xb9\xbc\xb4\xb3\xde\x72\x79\x7a\xea\xec\xb1\x81\xd3\x51\x58\xdd\x55\x04\x2b\xd0\x09\xee\xef\xb3\x63\x56\x88\x29\xa6\xf4\x2a\xe3\xe5\xfb\x64\x3e\x8d\x5e\xfa\x0b\x9b\xe1\x49\x14\xa9\x05\x66\x97\xe3\xa3\x4e\x24\x79\xad\x81\xfd\x82\xb1\xb7\xa2\x63\xae\x47\xa2\xcd\xc0\x7d\xc4\x93\x73\x85\xa0\x87\x5e\x1f\xa4\x5a\xec\x7a\x83\x68\x7d\x36\xd6\x17\x62\x04\x32\x15\x80\x0a\x4a\x94\x26\xd2\xbc\xc9\xb5\xc8\xd7\x6c\x59\x40\x68\x68\x3a\x64\xec\xb5\x8d\xf1\xe8\x07\x85\xd6\x7d\xa0\x32\x44\x83\x40\x76\x5f\x5d\x66\x57\x42\xcf\x4a\xb9\x9c\xce\xe8\x51\x3b\xf6\xd5\x78\x65\x11\x0c\xda\xf7\x92\x5f\x47\xb3\xa5\x12\x0e\x57\x05\xd1\xab\x54\xf8\x70\x56\x98\xf1\x27\x4f\x29\xaf\x0d\xd8\x93\xac\x56\xab\xd1\x30\xea\x63\x52\x7e\xfb\x2d\x88\x3d\x6d\x34\x9f\x45\x53\xde\xda\x3c\xa8\x33\xbf\xb5\xed\x2a\x01\x56\x1a\xb5\xfb\xac\xa9\x21\x57\x49\x96\xd5\xdb\x36\x35\xd5\x59\x2e\x9e\x70\xcd\xd9\x67\x68\x57\xef\x79\xa1\x7f\x7f\x9f\x3d\x16\x70\xb9\x19\xbc\x25\xa2\xe0\x65\x26\xfb\x56\xb8\x06\x3d\xcf\xa2\x14\xda\x66\x73\x46\xae\xc8\x56\xe6\x01\x1e\x14\xc4\xf5\xc0\x64\x99\x4d\x31\x7a\xd6\x9d\x61\x50\x69\xe9\x92\x1d\x19\x9a\xbb\x6f\x3e\x46\x61\xd4\x24\x14\xd9\xdb\xc0\x1c\xc2\x0b\xc8\x2b\x74\xc4\xbe\x88\x97\x86\xb8\x08\x1b\x37\x21\xcb\xb6\x0b\x9a\xb5\xa0\x8a\xfe\x85\x57\x51\x96\x8b\x5d\xda\x01\x8d\x03\x96\x9f\x98\x0b\x01\x83\xc8\x76\xea\xe3\x49\x01\xcc\xaf\xf1\x4e\x9c\x63\x99\xec\xb1\xdd\x90\x7e\x1c\x92\x40\xd1\xd8\x9c\x4c\xa0\x8e\xb8\xab\xc7\x9b\xb5\xdc\xae\xec\x28\xc4\x34\x5c\xc4\xf7\xcd\xa6\x34\x87\xb5\x9b\xdb\x54\x96\x6e\x26\x2b\xe1\xe2\x33\x93\x30\x52\xd0\xea\x73\x36\xcc\x06\xd9\x0d\x49\x08\xc1\xd4\x36\x9a\x1a\xdc\xb4\xda\x1c\x33\x02\xb5\x04\x02\xef\x87\xb0\xab\x9a\x09\xd6\xac\x9f\x8e\x84\x17\x04\xb3\x83\xba\x9a\x1d\xb1\x98\x4b\x3e\xaa\xe1\x9d\xc4\x9c\x95\x8a\x1e\xb9\x28\xa1\x14\x72\x05\xb1\xd9\x98\x7d\xcb\xe9\x39\x30\xb3\x01\x5d\x67\x28\x2e\x3b\xc9\xb5\xf9\x66\x63\xb5\x7b\x2d\x36\x9e\x35\xf1\x02\x70\xae\x10\xca\x7b\x25\x04\x77\x5d\x70\x91\x5d\x90\xc6\x0f\x84\x56\xca\x06\x49\xea\x3e\x57\x57\x30\x2b\x9a\x27\x55\xbf\x24\x8f\x8e\xfc\x2d\xb9\x81\x3a\xab\xc4\xd9\xc8\x2b\xe4\xad\x40\x1a\xc6\x73\xbf\x02\xb8\x91\xdc\xdb\x20\x04\x67\x7a\xdb\x9b\xd7\x83\x08\x55\x76\x98\x16\x8f\x79\x3e\x78\xff\x56\x80\x02\xc5\x9f\x23\xa3\xa6\xe7\x73\x28\xca\xb1\x46\x7d\xca\x45\xbc\x57\x56\x20\x5b\x95\xd2\x48\xc1\x90\xd0\xc1\xc6\x92\xdb\x9d\x47\x5d\x74\x48\x98\x08\x6a\x2c\xa6\x19\x66\x5a\x96\x65\x8b\xe4\xd5\xc7\x77\x28\x44\xa6\xa7\x7f\xe3\x49\xc4\xc1\xcc\x13\x87\xdf\xa3\x57\xa9\xc1\x73\x06\x42\x67\x91\x82\x2b\xda\xd0\xe5\xec\xa8\x6f\xb5\x91\xb1\xc8\x9f\xda\xcf\xa1\x79\x70\x96\xcc\x44\x72\x45\x86\x1f\xcc\x68\xc4\x14\xb2\x04\x2f\x06\xd9\x5f\xac\x79\x2b\x62\x50\x95\x1f\xbd\x59\xac\xda\xeb\xf3\xcf\x63\x7d\xc7\xb6\x33\x57\xe9\x1f\xdc\x02\x95\x5f\x22\x5a\xc4\x3d\xde\xc0\xcd\x1a\xe7\xdb\xc2\xc9\xaa\x2f\x92\x0d\x03\xf7\x36\x98\xe7\x40\xb9\x22\x22\x0d\xcc\x16\x2f\x28\x7c\xfa\xec\xc4\xd7\x09\x70\xc8\xd8\xeb\x5d\x9d\xa9\x51\xac\x3c\xfb\x6e\x5c\xf2\xc6\x03\xb2\x99\x69\x79\xb2\xdb\x40\xed\x01\xc1\x81\x49\xa4\x46\x6c\xa1\x1d\xf5\xa8\xe5\xb6\xf2\x44\x16\xb6\xbe\x2d\x81\x85\xd7\x5f\x60\x08\xf7\xdf\x36\xb2\xc9\x96\xdf\x37\x50\x5c\x6d\xe2\x3b\x52\x9b\x27\x82\xff\x83\x54\x55\x97\x11\xb6\x91\x15\x39\x36\x52\xed\x17\xcc\x9c\xe5\x5e\x5f\x98\xe0\x93\x17\x6b\xfb\xfc\x0a\x1f\x4b\x33\x51\x9a\xc7\x0b\x14\xd6\xca\x74\xc7\x29\xe5\xa6\x92\x9c\xcb\xbc\x34\x55\x53\x84\x79\x34\x6e\x33\xde\xe3\x5c\x9b\x5d\x84\x6a\xf2\x9c\x61\xea\x4a\xce\x05\x9a\xd3\xa2\xfa\x38\x4d\xf2\x06\x3d\x37\x11\x92\x15\x05\xd1\x00\x97\xe9\x9a\x15\x17\x12\x00\xa1\x63\xf3\x12\xf6\xd2\x9b\x15\xcd\x50\x63\xa1\x57\x61\x52\x01\x6f\x92\x6b\xbb\xfc\xee\x4e\x12\x77\x61\x33\x35\xf9\x71\x33\x65\x6c\x61\x37\x81\xae\xf2\xa5\xf7\xf1\xa6\x67\x69\x4d\x5d\xd9\xec\x88\xfe\x3f\x58\x0d\x59\xc9\xdf\xd1\xaa\x89\x9c\xf3\x9b\x67\xe8\x9a\xd6\xec\xd5\xb5\xc9\xf8\x43\x8a\x01\x07\xa2\x17\x1c\x21\xf6\x4e\xe9\xf2\xbd\x33\xf4\xae\x36\xea\xf4\x6e\x21\x79\xd7\x4c\x34\x9e\xcd\x6f\xb2\xbe\x38\x0b\x6f\x83\xcb\xd3\x11\x90\x5d\x24\xc7\x67\x2a\x08\x2c\x70\xda\x15\xce\x0a\x39\x90\x8b\x3e\x3e\xf1\xe7\x15\xa3\x97\x8f\x32\x69\x65\x46\xb1\x27\xce\x66\x25\xe3\xaa\xf5\xd6\x85\x7e\xa9\xc8\x85\x16\x27\x33\x5e\xaa\xee\x73\xae\x67\xc3\x79\x56\x74\x29\xfd\x92\xdf\x10\x7f\x0c\xa3\x14\x2f\x88\xf5\xe0\x84\xfd\x20\xcb\x15\x2f\xd3\x01\x42\x45\xc5\x10\xb9\x07\x87\xf9\x5b\x76\x3a\x74\x17\xe4\xd9\xa0\x5d\x81\x35\x62\x8c\x08\x3c\x8d\x0a\x8c\x29\x4c\x85\x2f\x52\x28\x81\x07\xf9\x9b\xf2\x35\xe3\x93\x89\x48\x34\xa4\xaa\xa9\x2a\xf2\x04\x53\x7c\x2e\xac\x87\x75\xfd\x20\x6e\x08\xc6\x89\x32\x74\xc8\x49\x08\x5a\x4b\x9a\x9d\x75\x55\x71\x79\x72\x5a\xec\xe4\x08\x64\x9e\x15\xcb\x06\x05\xf3\xb0\x3d\xc9\x41\x75\x0e\x15\x5d\xa5\xcb\x2d\x49\xb8\xda\x78\xc4\x03\x12\x68\x09\x2c\xdd\x60\xc5\x7b\xb4\xa3\x4e\x3a\x34\x08\xc3\x8f\x3b\x99\x85\x19\xa1\xfd\x88\x39\xda\xa4\x78\xd5\x26\x1e\xd3\x00\xdf\x7b\x46\x04\xb9\x0a\x08\xa3\x07\xde\xb5\xf3\xda\x27\x3e\xb0\xe6\x03\x5e\x6a\x24\xfe\xbe\x11\x3b\x9f\x51\xe2\x8a\xd8\x4c\xc9\x3e\xff\x3c\x0c\x8a\x62\x61\xb7\x5b\xb9\xfb\x7d\x02\xef\x94\xe0\xa9\xbb\x5b\x57\xda\xb1\xfb\x2e\x4e\xcb\x74\x75\x4b\xbd\xd5\xf4\x29\x99\xc3\x51\xb4\xfe\x41\x88\x37\x2b\x57\x4b\xab\xb8\x0f\x5b\x7e\xfe\x79\x30\xee\xe7\x9f\xc7\x58\x3c\xf2\xbf\x45\xfa\xba\x17\x32\x24\x78\x50\x8a\x5a\xc6\xb0\xa2\xc7\x6f\x19\xe8\xc9\x51\x84\x2a\xc1\x0f\x71\xcc\xc7\xf9\x9a\xe9\x72\x6d\xd5\xf4\x00\xd0\x9d\x5d\x60\x5b\x71\x3a\x26\x4c\x0a\xbc\xca\xd2\xe0\x94\x79\xc9\xcc\xa6\xb9\x8b\x94\xb1\x0d\x8d\x41\x10\x25\xfe\x0e\xfa\x1c\x23\xbc\x41\x8e\x50\xe7\x95\x57\xd3\xdd\xc1\x17\xb7\x10\xbc\x3a\xac\xe3\x84\xfb\x8d\xee\x44\x0e\x70\x8b\x3b\x51\x0b\x59\x62\x9c\x52\x95\x54\x0e\x9c\x12\xce\x52\xc2\x61\xc3\x9b\x02\xb5\x8b\x2d\x4e\xa3\x48\x1f\x01\xd0\x23\x76\x60\x88\x01\x10\xf7\x59\x9d\xf1\xc4\x2e\xc6\x5b\xbc\x9b\x18\x79\x09\x7b\xb7\x55\x9a\x0c\xfe\x24\xeb\x2a\x3c\xef\x05\x51\x93\x3e\xb3\x09\xc5\x83\x70\x1b\x1f\x50\xc8\x02\x4a\x06\xb8\x27\x44\xc5\xd5\x83\xbc\x12\xac\x76\xfd\xb3\x23\xf6\x85\x59\xda\x67\x9b\x24\x8d\xd0\xd1\x78\xab\x99\x97\x55\x35\xf9\x55\x25\xc7\x26\x3f\xe1\x6d\x4a\x97\xbb\xbd\x87\x02\xc5\xdb\x86\x79\x6d\xb4\x46\x04\x14\xb9\xe3\xfc\x77\x7d\x12\x1f\x34\xaa\x21\x0d\xaa\x61\x43\xdb\x7d\x5a\x76\x74\xd1\xdf\x1e\x66\xe6\xc6\xd9\xa4\x21\x77\x8d\x76\x5a\x4c\xeb\x0b\x3c\x3c\x10\x15\x6d\x0e\xd0\x3a\xdd\x87\xe5\x75\x2c\xcb\x65\x45\xaa\x28\x79\xce\x2f\x83\xb3\x97\x6f\xb1\xb4\x2d\x3c\x36\x82\x8c\x68\x3e\xfe\x1e\x1a\x81\xcc\x62\x0b\xaf\xda\xea\x2b\xd1\x03\xa5\x2a\x61\xa1\x8f\xaa\x11\xc4\x70\x14\x70\x07\x9f\x66\x05\x53\x82\x97\x09\xe6\xc2\xf3\x29\x7c\xe4\xc4\x05\x90\x79\xd1\x08\x41\x18\xb9\x88\x40\x50\xb6\x46\xde\xa2\xad\xb4\x10\x36\xe6\x81\x32\x8f\xa4\x73\x73\x13\x9d\xc9\xd5\x87\xc6\x6c\x14\x24\x09\x94\x72\x55\xa5\xeb\x50\x67\xc4\x1a\x7e\x1f\xce\xb8\x6a\x77\xa8\x08\xbc\x9f\x30\x6c\xa1\xe9\x5c\x7e\x0c\x36\x4e\xae\xa2\x9d\xfb\x11\x42\xa6\x6d\xfa\x49\xc4\xbe\xc7\x01\x5c\x38\x36\x52\xeb\x1c\x77\x48\xed\xba\x45\x3f\xc4\xe4\x50\xdf\x0a\x9b\xb4\x1c\xa4\x77\x0a\x16\x0e\x5b\x6e\x45\xb9\xe9\xd8\x8c\x6e\x72\x38\x23\xeb\xce\xde\xde\xa3\x68\x0b\x02\xa4\x59\xeb\x9a\x59\x64\x4d\x95\x46\x11\x30\xbb\xed\x40\xb8\x07\x35\xde\x52\xe1\x1e\x50\x87\x39\x08\x48\x89\xf6\x07\x4d\x1f\xb5\xb4\x67\xaa\x4a\xb0\x45\x02\xbe\x63\x96\x50\xe9\x3e\x69\xd8\x0c\xb8\xc7\x5e\x90\xfd\x6f\x2a\xec\x9e\x38\x00\x13\x7c\xca\x54\xcf\x48\xa5\x95\x9c\x90\x06\xd5\xd6\xce\xa7\x84\x99\x90\x45\x7a\xeb\x76\xfd\x72\x26\x57\xc7\x04\xaa\xe6\xce\x1d\x1d\x91\xd0\xa7\x0f\xd4\xab\xd6\xda\xfc\xc2\x3c\xc2\x8e\x8e\x8e\x58\x07\x66\xd6\xe9\xd5\x91\x19\x06\x9a\xf8\x5b\xbe\x72\x04\x30\xd6\xa5\x01\xbf\x41\xa4\x27\x78\xef\x21\x9d\x07\x8f\x36\xc3\x24\xe8\xfe\xa7\x26\x16\xe9\xb7\x3e\x1c\x84\x5c\x1d\x33\x1c\x7f\x46\x36\x6f\xa0\x0f\x3b\x9c\x6c\x74\xcd\x7f\x19\xb8\xe5\x47\xf4\x51\x7b\x28\xbe\xba\xfb\xda\x37\xee\xbb\x85\xfb\x36\xd3\x33\xab\x46\xaa\x1e\xd9\x3e\xab\xfb\xf4\xfb\xf0\xb7\xf0\x19\x36\x38\xb4\x8f\x2e\x4b\x96\x67\x3e\xf0\xb1\x4a\x65\x5e\xa0\x03\x60\x41\x8f\x16\x98\x0b\x1f\x37\x7a\x10\x30\x8c\x70\xa8\xcf\x8e\x58\xc0\x3f\x5c\x87\xfb\x5b\x45\x1c\x1f\x3d\xb9\x13\x53\x31\x22\x5f\x85\x91\xdc\x85\xcf\x44\x4b\xac\xf1\x1a\x3f\x7d\x87\xc0\x70\xbb\xb2\xc2\xdc\x66\x0d\x1b\xb4\xd3\xe1\xa1\x0b\x78\x97\xb3\xf3\xc4\x3a\xd0\xdf\x55\x06\x88\x8e\x04\x42\xbf\xd5\x29\x72\x0c\x70\xf3\x31\x0a\xe6\xdd\x0e\x62\xeb\xc9\xda\x1d\x31\x3b\x1f\x2c\xdc\xa9\x1d\x4f\x55\x85\x39\x56\x48\x1a\xbd\x99\x57\x82\xe9\x92\x83\x91\xcd\x69\xa1\xb4\x5c\x54\x0c\xc6\xa5\xe8\xc0\xbe\xcd\x28\x43\xca\x24\x2b\x52\x78\xb7\x0e\x63\xe6\x1d\x0c\x76\x44\x8e\x4d\x75\xfa\x0c\x8f\xe4\x06\x6a\xac\x00\xac\x2e\x32\xb4\xe1\xef\x44\xd4\x11\xac\x83\x9e\xbd\x2a\x9a\xd8\x41\x4b\xaa\xa5\x61\x62\x84\xe5\x17\x50\x38\xbf\x21\xe9\x52\xa0\xcc\x7a\xe1\x22\x78\x83\x3e\xef\xb2\xf7\xd1\xab\x2c\x42\x95\xe3\x7f\x4d\x67\x36\x0c\xc9\xbc\x05\x27\x0a\xc6\xe8\x55\x6e\x46\xb3\x0f\x0d\x47\xdb\x05\x74\x41\x92\x6e\x24\x55\x9f\x70\x9d\x36\xbf\xe9\xf2\xfc\x23\x6f\x46\x77\xbe\xdc\xc0\x8d\x57\x18\xf8\x02\xeb\x32\x13\xd7\xb5\x35\x34\x24\x44\xfa\xc8\x2e\x56\x92\x09\x4c\x88\x84\xd9\x9a\xc2\xf7\x4b\x15\x09\x06\x03\x02\x4a\xba\x62\x7d\x81\x8d\x07\xd6\xac\xf0\xb8\x48\x91\x97\x6c\xbe\x0e\xed\x92\xaa\x4f\x07\x73\x2b\xb8\xe5\x7e\xbf\xcb\x95\x13\x0a\x52\xbf\xef\xd2\x71\xe3\x0e\x6e\x71\xd7\x7d\xba\xbb\xca\x9e\xe5\x1a\x16\xc3\x03\xed\xf0\xf6\xe9\xc8\xd8\x3e\x7e\xfe\xf0\x3b\x6a\x3b\x3d\xbb\x3c\x69\xff\x35\xc9\xb9\xe5\x12\x8a\x69\xf9\xee\x3c\xb4\xd8\xc8\x3c\x6d\x0b\x43\x93\x6f\xef\x14\x41\xef\xd0\xfe\xdd\x51\x0c\xc9\x1f\x81\x96\xd7\xc8\xf9\xab\xe3\x17\x1d\xdf\x0a\xea\x00\xb0\x27\x65\x96\xe7\x2c\x95\x2b\x48\x3e\x56\x04\xa9\xe1\x31\x27\x8c\xe9\x34\x04\x14\xbb\xa7\xff\x6e\x84\x8e\xf7\x5d\x40\xe9\xd8\xbb\x72\x98\xbc\x49\x34\x6e\xff\xde\xb5\x0f\xf4\x40\xe1\xd1\x8e\x96\x5e\x7d\x38\x35\xe7\x60\xff\xaf\x7e\x41\x60\x0e\x3d\x50\xcf\x84\x0f\x27\x0a\x9b\xaf\xce\xa6\xd6\x5d\x14\x29\x3b\x2d\xd2\x5b\x74\x3d\x33\xbf\x7e\xa4\x46\xf0\x07\x64\xcb\x82\x18\xf4\xcd\xe7\x4a\x09\x0d\xed\xeb\xc7\x08\x16\x01\xe6\xa5\x3e\x02\xf6\x7a\x0e\xf8\x29\x22\x97\xe0\x45\xd4\x7e\xeb\x04\x70\xdd\x23\xa9\x09\x54\x28\xb1\x79\xab\x30\xe8\x3f\x8b\xf4\xae\xc3\x8a\x22\x75\x83\xd6\xc1\x34\x0f\x09\xcb\x36\x28\x82\xad\x6c\x98\xeb\xbb\x83\xf7\xfd\x06\x6c\xbc\x3b\xc4\x74\x96\xae\xff\x69\x91\xd6\x06\x85\xbe\xb5\x2f\xa1\x67\x18\xee\x0c\x35\x10\x54\x90\x78\x02\x34\x97\x25\xc6\x0c\xbc\x3e\x7b\x56\x2b\x52\xea\xd2\x4a\x7c\x0c\x3a\x9d\x87\xdd\xb1\xae\xc2\x66\xba\xc0\x36\xbe\x5b\x7b\x76\x0a\x78\xea\xfa\xef\x22\x14\x5a\xbd\x18\x50\xe4\x51\x90\xbe\x62\x4a\x64\x77\xac\xbb\x07\xfe\xc1\x8c\xed\x7e\xfb\x8d\x10\xa7\xa5\x2d\xcb\x82\x1e\x12\xdd\xfd\x4b\xb5\xdf\x6b\x1e\x21\x7a\x94\x47\xca\xd1\x6e\xf3\x53\x9d\xf6\xc6\xb4\x72\xf6\xa9\x5e\x30\x95\xf8\xcd\xee\x06\x82\x0e\x41\xba\xa7\x26\x89\x3f\xa6\xbc\xf0\x7d\xb0\xf3\xbf\xa6\xd9\xfd\x6e\x48\x2f\xbd\xcf\x94\x3b\x7a\x7e\x29\x47\x6c\x70\xd8\x72\xe6\xfe\xe8\xf5\xe2\x1c\x45\x91\xfe\xae\xb5\x3a\x28\x95\x75\x46\x0b\xa8\xaf\x12\xcd\x69\xaf\x15\xba\xb9\x40\x81\xee\x44\x16\x93\x6c\xba\x2c\x21\x9e\x02\x48\x8f\x29\xa1\x75\x56\x4c\x95\x0d\x1b\xcb\xc5\x44\x43\xbd\x10\xc6\x2c\x56\xea\xc5\x48\x2c\x0a\xc1\x41\x84\x5a\x37\x36\x86\xba\x24\x8f\x5c\xc2\x42\x95\xa5\x02\x9b\x37\xb6\xc6\x12\x25\x34\x73\x88\x4a\xc7\x0b\x87\x9e\xcd\xe0\x63\x52\xd3\x48\x87\x67\x03\xb4\xd8\x4e\x68\xc6\xca\x8c\x85\x78\xbd\xb8\x90\x67\x74\x52\xa3\x8c\x11\xe6\x08\x12\x20\xb0\xe9\x07\x08\xf5\x00\xc4\x44\x9f\x89\xe9\x32\xe7\xe5\xe9\xcd\xa2\x14\x4a\xf9\x32\x39\x67\x62\x7a\x7a\xb3\xe8\x7a\x94\xdd\x8f\xd6\x78\x9f\xed\xfd\xaf\x3d\x07\x08\x19\x8f\x48\xf1\xf6\x3c\x8a\x67\x36\x44\xab\x4b\xb7\x71\x34\xbf\xe1\x31\x08\xb3\xe5\x86\xa9\xc4\x5f\x7f\x1f\x1f\xe5\x06\x9a\x00\xcc\x42\x78\x53\xe0\xe6\x33\x0c\x10\xf6\x43\x29\xe7\xdb\x11\x16\x0d\xb3\x33\x5d\x57\x5d\xc8\x08\x5c\xaf\x17\xd1\xd4\x16\x8c\xef\xfd\x75\xaf\x86\x6b\x4f\x8b\x0e\x14\x56\x65\x3c\x8a\xd7\x44\x2c\xb7\x79\x18\xcf\x27\xa1\x6f\x23\xdb\x20\x6c\x9f\x02\xe8\x98\xd7\xdc\xaf\x2d\x0f\xc0\xbc\x3b\x78\x5f\xdb\x43\xe8\x5e\xdd\x41\xf3\xe5\x77\x11\x19\x56\x77\xcf\xc6\xb0\xa3\x6c\x43\x12\x40\xb8\xff\xfd\x10\x98\x15\x70\xcc\xe0\xfe\x8e\xe2\x69\x0a\xdd\xbb\xf6\xc7\x9d\x4a\x6f\xca\x3c\x37\xb2\xe5\x7f\xc7\xf2\x9b\x61\xe1\xdb\x4a\xa9\xcd\xa0\xa4\xe6\x31\xeb\x5c\x67\x62\x65\x90\xd0\x61\x50\x56\x53\x4e\xd8\x24\xbb\x11\xe9\x60\x86\xe5\x78\x20\xf3\x26\x18\xfa\xec\xd3\x16\xc2\x9d\x7c\x6a\xad\x02\xdc\x51\x13\xb9\x58\x0f\xb4\x1c\x24\x79\xb6\x18\x4b\x5e\xba\x52\x8c\x9d\x37\x0e\xbe\x2d\xd6\x00\x41\x8a\x36\x90\x96\x6b\x2c\x61\x68\x56\x69\x63\x45\x5d\x0d\xc3\xcc\xe5\x85\xc2\x2c\xa2\x2e\x23\xf8\x2b\x4c\x01\x56\x42\xd5\xba\xc3\x83\x83\xfe\xc1\xc1\x01\x74\xc3\xbc\x2a\xa6\x55\x50\x95\x30\xa3\x32\x89\x0f\x1e\xfa\xea\x96\x3c\xcf\x49\x55\x69\x7f\x4a\xe5\xdc\xba\x3d\x97\x82\xa2\xe3\x52\xac\xf5\x17\x02\x83\x50\x6d\xae\xae\x18\x95\x53\x3c\x0b\x66\xe3\xa3\xea\xcc\xc1\x8e\x96\x23\x0b\x96\x8a\x39\x64\xa2\xa2\xbc\x4f\x66\x14\xa4\x41\x61\xf6\x99\x32\x7d\x86\x78\xe0\xa5\xe0\x51\x7e\x53\xbb\x57\x58\xc8\x53\x65\x53\x43\x4e\x36\xbb\x13\xee\x09\xe5\xdb\xac\xec\x06\x53\xda\x4c\x7b\x25\xcb\x2b\xd5\x37\xe0\xc4\xb5\x28\xd0\xbb\x89\xe7\x39\x93\x65\x18\x06\x1a\xec\x2e\x96\xd6\xc0\x29\xca\xc9\xa4\x92\x0d\xff\x85\xd4\xc2\xc7\x72\xff\x72\x78\xc8\xe6\xd2\x50\xa6\x1f\xd6\x25\xbf\x31\x23\x7b\x9f\xe3\xea\xc0\xf7\x82\x6a\x8b\xe1\xd8\xc1\x90\x8c\x3d\xd5\xde\xef\x35\xcd\x26\x93\x2c\x59\xe6\x1a\x15\xcb\x37\x48\x58\x86\x4c\xa9\x02\x20\x55\x5d\x35\x28\x02\x1f\xff\x42\xc3\xd3\x11\xe2\xfb\xcd\x6b\x93\xeb\x99\xcc\xe5\x94\xbc\xff\xa1\x24\x66\x30\xb4\xa1\x50\x15\x66\xda\x0a\x37\x99\x1c\xc1\xbc\x45\x56\x35\x57\xad\xd4\x7c\xca\x0a\x3e\x17\xb6\x6a\xe5\xd0\x6d\x23\xd6\x46\x55\x36\x5e\x10\x0e\xfd\xdf\x97\x59\x72\x95\xaf\x19\x57\x66\xce\xe4\xd8\x59\x96\x66\x47\xa9\xf0\x26\xc3\x13\x19\xd0\x89\x3f\x9b\x89\xaa\x3d\x2d\x82\x29\x7f\x8c\x8e\xcc\xb1\x4b\x97\x97\xf0\x05\x48\x4d\x72\x42\x39\xf5\x5c\x71\x5a\xee\x9c\x4d\x4b\x4e\xd1\x83\x98\x9a\x1b\x4f\x48\xc5\x09\xd4\x1e\x8d\xf8\x55\x6a\x07\xc4\x97\x47\x54\x88\x9b\xa7\xe9\x63\xca\xfc\x0c\x12\x7f\xcf\xdf\x03\x41\x47\xca\xb4\x68\xff\xb4\xd2\xdf\xf9\xdb\xe3\x1f\x63\x2f\x55\xac\xed\xb6\x2c\x74\x96\xbb\x7c\x42\x98\x98\x00\x93\x99\x91\x2b\x8b\x6d\x4e\x55\xd5\x2a\xf5\xd3\x0e\x0f\xfa\xec\xd0\x17\x05\x7c\xf2\xf2\x39\x2a\x2d\x20\xdb\xb1\xe1\x79\x7e\x38\x02\x0e\x7e\x3b\x6e\xde\xcb\x1c\x67\xec\x0a\xe4\xd1\xb5\xe6\x1f\x65\xc1\x80\xbe\x78\xa7\x7b\xb5\x05\x88\x80\x0c\x04\x73\xbe\xa0\x64\xca\x58\xd1\xf4\xe8\x7b\x97\x23\x27\xaa\x7d\x6b\x0d\xfe\x69\xc9\x57\x90\x25\xce\x9e\x64\x1b\x99\x47\x09\x32\x4a\x61\x5a\x7c\xe8\xf6\x20\x08\x60\xc8\xd8\x0b\xb2\xd2\xa3\x7b\x23\x54\x6e\xaf\x36\xc6\xa6\x41\x64\x04\x05\x29\x98\x59\x9c\xf0\x64\x56\x2b\x40\x78\xcb\x69\xaf\x78\xc3\xbc\x5d\x78\xa2\x0b\xf7\xab\x4c\xdd\xce\xc7\xfe\x5e\x9d\xd0\x3f\x3e\x06\x0f\x85\x94\xa5\x4b\x08\x37\x40\x3e\x06\x8c\x4f\x93\x7b\xb5\x36\x87\xc0\xba\x78\x52\x31\xcb\xb5\x69\x8b\x95\x5a\x33\xaa\x56\x9b\xfd\x2a\xdc\x98\x39\x57\x1a\xdf\xdf\x20\x0b\xd5\xf2\xdf\xfb\xdf\xb1\x9c\x5d\xad\x42\x63\xb9\x14\x36\x31\x23\x3c\x5f\x7c\xfa\x05\x9e\xbb\x8c\xdc\xc4\xca\x31\x65\x5a\x41\x31\x26\x98\x0a\x7b\x78\xcf\x07\x04\x60\xba\x6b\x73\x84\xbd\xa7\x2a\x9b\x49\xa5\x59\x29\xfe\xbe\x14\x4a\x2b\x62\xc8\x69\xc9\xa7\x76\xe5\xf6\xba\xb0\xb5\xe7\x11\x9e\x11\x9d\x97\x0b\x2a\xe3\x0f\xf1\x3f\x86\x26\x21\x37\xbf\x17\xb2\x6a\x44\x7d\x5a\xc0\xe0\x1f\x5c\x4a\x1f\x1f\xa2\xea\x4a\x34\xa1\x1f\x27\x72\x4b\xcf\x23\xcd\x2f\x94\xc7\xb3\xec\xb3\x52\x0c\x16\x72\xb1\xcc\xcd\x8d\x4b\xfb\x85\x90\x20\xf5\x26\x6c\x1c\xa2\x13\x42\x4c\x3c\xa6\xa1\x9a\x27\x55\x9b\x8b\xaa\x95\xd2\x66\xaf\x66\x42\xe4\x6c\x91\xdd\x88\x9c\xa5\x22\xd7\x9c\xcd\x97\xb9\xce\x16\x79\x86\x97\x75\x56\x98\xeb\x5a\x89\xfd\x54\xe0\x07\x84\xa0\x3d\x04\xb5\x10\x70\xf5\x11\x22\x11\x20\x62\x72\xc8\xce\x85\x30\x52\xa5\x5e\xa8\xd1\xfe\xfe\x54\xca\xe1\x34\xdf\x57\xbf\x88\xbc\xf8\xbb\xc3\x14\x40\x79\x6b\x7a\x3d\x77\x23\x9b\xd9\x1e\xd6\x70\xa5\xe5\x32\x99\xd9\x4d\x5a\x09\xa6\xf8\x2a\x74\x7c\xc3\x9f\x31\xdb\x35\x42\xcd\x8a\x29\xd4\x75\x4e\xc5\x8d\x48\x29\xa0\x77\x4d\xed\xb2\x54\x14\x3a\x9b\x64\xc0\x1b\x8b\x44\x58\xb6\x08\x01\x5f\x73\xcc\x4b\xc3\x0b\x70\x4f\xc6\x0e\x1c\x14\xfb\x11\x72\x2f\xcc\x0f\xe1\x79\xb2\xf5\x6b\x43\x1a\x86\xa9\x13\xae\xe0\xd4\xa4\x01\xf6\x68\xe2\x86\xc6\x57\x41\xfa\x35\x34\x9a\x84\xf5\x6c\x33\x75\x4e\x52\x06\xbe\x40\x3c\x31\xd9\x31\x8f\xd9\x74\x29\x54\x2d\xe0\xc3\xd6\x66\x2e\x6d\x9d\x6f\x90\x5d\xcd\x99\xc1\x73\x8b\xf4\x12\x8c\x44\x1d\xcf\x6d\x3f\x38\xc5\xaf\x6e\xcc\x8e\x7c\x15\x8f\xf8\x76\x26\x28\x53\xaa\x60\x89\x2e\xf3\xc1\x35\xbb\x12\xeb\x4a\x41\x75\x3a\xbd\x0b\xae\x28\xf3\x55\x30\x92\x2e\xf3\x37\xaf\xcc\x0f\x51\xfe\x67\x0c\x95\xc9\xae\x6b\x9c\xc3\xd6\xbc\xad\x72\x8c\x13\x83\x97\xc4\xaa\x96\x71\x9f\x20\x3f\x91\x5c\x6a\x36\xe3\x45\x9a\x87\x95\x76\xf1\x7b\x15\x6c\x1b\x7c\x2f\xc7\xf0\x46\x29\x6b\x3f\x3c\x39\x7d\xfc\xfa\xc7\x0f\x7e\x86\x1f\xdd\xd3\xe0\x55\x29\x6f\xd6\x3e\x94\x1c\xb3\xe1\xd4\x32\xee\xae\x66\x59\x32\x43\xd6\xa9\x34\x28\x3f\x67\x68\x87\x5a\xf1\xfc\x0a\x02\xcf\x50\x4a\x36\xd7\xa9\xf5\x01\xb0\xc5\x3f\xc8\xce\x64\xa5\x0a\xcc\x22\x23\x21\xd6\xd0\x02\x4e\xe4\x5c\x90\xe7\x68\x55\xbe\xa9\xde\xa4\x1f\x89\x18\x40\x12\x31\xa7\x0a\x4d\xf7\xf5\x1a\xe5\x61\x35\xec\xba\x10\x33\x6c\x56\xa3\xba\xdf\x83\xd4\xf9\xfe\x4b\x88\x13\x74\x7f\x55\x4e\x0b\x71\xbb\x6a\xe9\x5f\xdd\x24\x70\x23\x0d\xd9\x8e\x99\x82\x34\x58\x63\x11\x26\x11\x2c\xd9\x64\x69\x3e\xd8\x4a\x3c\x28\x19\x53\xbb\x58\x82\xe6\x45\x32\x93\x25\x42\xa3\x7d\x9c\xc8\x64\x49\x8f\xa4\xcc\xbc\x5d\xed\x35\x6d\xde\xa7\x4b\x5e\xf2\x42\x53\x20\xec\x58\xb0\x5c\x28\x35\x30\x7c\x62\x20\xcb\x81\xf8\xfb\x92\xe7\x03\x2d\x11\x1a\xbe\xdb\x26\x36\x94\xfa\xcc\x9e\x68\xfc\xf5\xe9\x04\x1f\x55\x86\xbd\x40\x95\x3e\xe5\xeb\x06\xc1\x93\x4b\x91\xbe\x97\x62\x32\xce\xa0\xea\xf6\xd3\x48\x14\x41\x48\x01\xbd\x95\xf5\xe7\x81\x4d\x50\xdc\x00\xd5\x9c\xa0\xca\x81\xf4\x3f\x07\xe7\x6b\xcb\x2e\x85\xd9\xac\xfe\x4b\xee\xd1\x14\x9e\x9b\xe5\x0e\xdb\x64\x97\xff\x5f\x7f\xa3\x70\xa0\xe6\x6d\xa2\xab\xc7\x41\xf8\xec\x28\xa2\xbf\xe0\x46\x81\xfb\x16\x6c\x86\x9b\x00\xd5\xa6\x0a\x81\x94\x9c\x2d\x64\x66\xa4\x96\x20\x59\x36\x15\x38\xa9\x8d\x73\xe2\xd6\xd6\x50\xed\x08\x73\x5b\x73\x96\x67\x0a\x36\xc2\xbe\x2a\x6c\x89\xfd\x20\x49\xb3\x2f\x07\xe6\xdf\x1e\x66\xff\x0c\x98\xcc\x7a\xcf\xf3\x24\x81\x72\xe7\x53\x2c\xb2\x91\x8a\x85\x9e\x0d\xf0\x27\xd4\xb6\x5a\x2e\x69\x6d\xaf\xde\x15\xb7\xf0\xe1\xe0\xb3\x2c\x4f\x4b\x01\xa5\x7a\xbc\x7f\xee\x26\x56\x18\xd8\x9a\x0c\x07\xff\xc1\xd5\x22\x08\x79\x24\x1a\x8b\x81\xe9\xf6\x71\x8c\xe3\x72\x5d\x8b\xfa\xc3\x06\xd5\x72\x06\x2d\xce\xbd\x16\xca\x10\xea\x80\xbd\x9c\x50\x83\xcf\xbc\x61\xa0\xe2\xb6\x1b\x7b\x96\xd5\xdc\x06\x7a\x51\x80\x06\xc4\xea\xc1\x2e\xc6\x8b\x22\x23\xba\x5b\xc2\xa3\xc0\xc0\x5f\x5e\xf7\xaa\x36\xf4\xf2\x3a\x0a\x50\x2a\x36\x65\xb3\xdf\x60\x2d\x3f\x5f\x17\xc9\xac\x94\x85\x79\x9c\x82\x36\xc3\xde\xb0\x20\x92\x07\x32\x8f\xa1\x8e\x90\x19\x45\xe5\x6f\xb8\x39\xcb\x83\x15\x5f\x83\xe8\x8c\xf0\x20\xaf\x55\xdf\x51\x56\xe5\x64\xfa\x64\xe3\x18\x61\x8a\xc3\xf6\x41\x6b\x03\x99\xfe\xe0\x08\x18\x88\xbc\xbc\x25\xad\x98\x29\x34\x67\x62\x56\x22\x9f\x10\xf2\x43\x41\x38\x95\xf3\xba\x88\x31\xe3\xf0\x34\x35\x33\x80\x92\x42\x20\xd7\x1b\xe1\x00\x0f\x92\x11\x11\xe8\x74\x64\x85\x97\xdf\xad\x38\x65\x53\xcd\xd9\x54\x07\x60\x2b\x22\xad\x95\x5c\x6a\x7c\x4e\x05\x6f\x2a\x97\xaa\x31\x2a\x74\x64\x1e\x4b\xf8\x5c\x74\xea\xae\x3d\xe4\xdc\x7b\x2e\x1d\x8e\x95\x52\x3c\x08\x6c\x01\x84\xd5\xed\xf9\xaa\x00\x93\xf0\x2a\xc2\x36\x67\x72\xf5\xa8\xf2\x33\xb9\x03\x06\x2a\x6e\x68\xe9\x63\x78\x7c\x53\x67\x5f\xaf\x36\x0e\xd3\x5a\x41\x73\xc7\x5a\xe1\x8e\x89\x47\x25\xf3\x76\x04\x06\x9a\x55\x86\x14\x81\x41\xbf\xd2\xd2\x8f\xe7\xb3\x15\xdd\x0a\xa7\x00\x65\x13\x4a\xa1\xc1\x66\x8c\x36\x2c\xad\x19\xa1\x4d\x8b\x6b\xc3\x67\x65\x79\x55\x74\x36\xed\x62\x13\x3e\x1b\xf7\xb0\x19\xa1\xd5\x1d\x74\xe5\x58\x42\x95\x52\x55\x0e\x1d\x4e\x85\xb6\x21\x65\xdd\x9e\xf9\xcb\xeb\x97\x02\x25\x5b\x4d\x14\x6a\xbe\x79\x37\xdc\xa5\x8d\xd7\x9f\xf7\x2c\x60\xbf\xfd\x16\x2c\x25\x68\x15\xa7\xaf\x0e\x7e\x68\x34\xe0\x3b\xb4\x6e\x40\xa2\x77\xc3\xa7\xa6\x9f\x7f\xce\x3e\xeb\x76\xac\xd4\x04\x66\x07\xf7\xa3\xf3\x78\x0c\x21\xbb\xcf\xb5\xa0\x90\x20\x38\x80\xfa\x37\xd7\x0d\x3a\xaf\x88\x73\x28\x19\x69\xab\x17\x86\xbc\x30\xf6\x99\x03\xf5\x84\x1a\x2c\x8b\x4d\xeb\x73\xae\x64\xcd\xb9\x60\xd0\x1e\x88\xd4\xde\x4e\xd9\x84\x20\xd7\xb0\x01\x3f\xf6\x37\x87\x9e\x00\xaa\xfd\xd8\x8a\x1c\xd7\x79\x1b\x6e\xa0\xe1\xef\x43\x8d\x5b\xd8\x16\xcc\x40\x75\x04\xb7\xad\x4e\x82\xfe\xce\xaf\xc6\x7e\x17\x13\x04\x71\x16\x20\xc0\x20\x94\xb4\x01\xd4\xf7\xed\xa0\x42\x1e\x55\x85\xd4\xb0\x14\xc8\xf6\xd1\xb0\xf9\xa1\x20\xd4\xcc\x16\xd8\x77\xcd\x1c\xca\x8b\x39\x95\x55\xb1\xba\x2b\x60\x3c\x59\x27\xc7\x54\xb3\x82\x5f\x44\x72\x32\xf0\x0f\x94\x61\x85\x79\xf3\x67\x71\x1e\x0c\x7a\xbb\xa8\xa2\xa3\x03\xb7\x46\x0e\x59\x87\x00\x1a\xec\x7a\x50\x3d\xc6\xe7\xd6\x02\x8e\x1f\x06\xcd\x56\x44\x33\x47\x1d\x6e\x4b\xfa\xec\x5d\x13\xf6\xfa\x4d\x54\xf3\xbe\x17\x88\x88\x9f\xb9\xb1\xac\x48\x87\x35\x74\x0a\xb1\x62\xa7\x48\xbb\xaf\x0b\x71\xb3\xc0\xe7\x10\x50\x33\x08\x55\xa0\x4c\x76\xb0\x3b\x21\xc8\x60\xf6\x9b\xf7\xf4\xae\x3b\x13\xe6\x5b\x89\xd9\x72\x03\x89\x7e\x76\x54\xa7\x51\x14\x39\xad\xcc\x79\x61\x24\x51\xce\xd2\xec\xda\xd6\x66\xc9\x54\xdd\x44\xd1\x2c\xf0\x85\x59\x3f\x20\x79\xaa\x08\x45\xbd\x34\xbb\x0e\x34\x25\xa4\xef\x4a\xb3\x6b\x7f\x07\x65\x93\x92\xcf\x05\x7d\xdd\x18\x0c\x4d\x95\x87\xbb\x1d\x6c\x1a\x14\x60\xa5\xbe\x94\x8c\x35\x51\x8a\xfc\x66\x2c\x79\x74\xc6\x90\x3a\x69\xc4\x0e\x1e\x79\x8e\xd2\x41\xfb\xd9\x88\x1d\x1e\x1c\xfc\x6b\xf8\xbd\x75\xdd\x1c\x31\x3e\x56\x32\x5f\x6a\x11\xfe\x0a\x8a\x45\xec\xe4\x13\x94\xdb\x52\x54\x38\x11\xa6\xca\xc4\xc8\x96\xff\x62\x08\xfb\x87\x1f\x86\x2c\x48\xa2\xef\xf4\xf2\xb8\x06\x85\xfd\x73\xc9\x53\xd4\xf5\x1a\x8a\x17\x0a\x3b\xb2\x4c\x87\xd5\x87\xb5\x2f\x92\x6b\x9f\x6e\x38\x9e\xcd\x0b\xd0\x99\xcb\x5f\x9f\x16\x85\x28\xd1\xe2\xf0\x0b\xf0\xf2\x55\x56\xa4\x86\x19\x9b\x61\x48\xbe\xe2\x06\x36\x3c\xf4\xd1\x02\xab\xd7\xf7\x18\xab\xa2\xb2\x34\xa2\x7a\xe7\x5f\x3a\xb0\x44\xb3\x25\x61\x8c\x79\xd8\xb4\x57\xdb\xc3\x21\xcd\xf2\x2d\x0c\x3d\xe4\x69\x7a\x6a\x96\xf6\x2c\x53\x5a\x40\x26\x09\x54\xc6\x76\x6e\xeb\x28\x86\xaa\xcb\xe2\x0c\x7a\x7f\x18\x8e\xb3\x02\x67\xd2\xf3\xe5\x7a\x52\x99\x58\x4e\x11\x2a\x50\x9b\x66\x67\xa9\xcb\x50\x51\x2a\x93\xe1\x58\xa6\xeb\x76\x0a\x9a\xf3\x72\x9a\x15\x23\x76\xb0\xb8\x89\x68\x05\x0d\xcb\xb5\xef\xdb\x68\x2b\xa0\x9e\xf0\x6b\xeb\xc6\x3c\x62\xb3\x2c\x4d\x45\x11\xfe\x86\x71\xf5\x23\xb3\xbc\xee\x60\x00\xe7\x6e\x00\xd6\x87\x01\xfe\x82\x6e\x23\xbd\xb0\xcb\x60\x25\xc6\x57\x99\x1e\x2c\x95\x28\x07\xc8\x77\x46\xf0\xe4\x8f\x1a\xcd\xe5\xaf\x4d\x2d\x2a\x25\x45\x50\x23\x1c\x04\x7c\xbd\x45\x61\xbd\x03\x69\x51\xc6\xcb\xe9\x14\x42\xbf\x05\xe3\x69\xca\x08\x1d\xd6\x20\x6d\x50\x1a\x55\x9b\x92\x93\x09\x6a\xca\x2d\x30\x8a\x36\x40\x1f\x0b\xf2\x73\x08\x92\x53\xb9\x3d\x0c\x77\x87\x06\xb9\x90\x8b\x20\x8f\xeb\xd6\xe6\x8f\xb1\xee\xba\xef\xd1\x49\x78\x9e\x74\x43\xac\x26\x33\x5e\x1a\xd2\x22\x5f\x97\x1e\xfb\x0b\xfb\xa2\xd7\x89\x85\x6d\x70\xd1\x39\x02\x82\xa9\x70\x25\xf8\x09\x99\x92\x4f\x24\x1d\xe4\x68\xb6\x78\x07\xeb\x3f\xfb\x47\xb0\x13\xcc\x9a\xf4\x47\x6c\x9c\xcb\xe4\xea\x51\xf4\x9b\x25\xa5\x4d\x33\x8d\x7b\x40\xa0\xce\x6d\xbb\x7d\xc4\xa9\x9b\x85\xcd\x04\x4f\xa3\xe3\x4e\x14\xe6\xce\xb9\xa1\x9a\x13\xa5\x9e\x65\xc5\xd5\x87\x66\x64\xe4\x59\x71\x15\x30\xe8\xb0\x43\xa5\xa6\x6c\x29\xf2\x4e\x9f\x21\xf6\xd4\x4c\x08\xdd\xa9\x0f\x64\x23\xf7\x37\x63\xbd\x71\xea\x35\x30\x8e\x67\x5f\xbc\x7c\xf2\xb2\x6b\x0e\x75\xca\x7b\x23\x76\x2e\xcb\x72\x8d\xc9\x9f\x58\x07\x69\xf4\x43\x87\x64\x16\x27\xcb\x60\xec\x22\x57\x51\xea\x3b\x84\x06\x89\x7c\xc8\x37\xe5\x6f\x6a\xc8\xd8\x53\x97\x43\x72\x91\x25\x57\x8c\xb3\xb1\x80\x6a\x10\xe0\x02\x32\x91\xa5\xcf\x6d\x2f\xe6\xa0\xbd\xbb\x96\x59\xea\xf5\x15\x89\xcc\xf3\x4c\x91\x7a\xd9\x96\xc0\xb8\xb2\xf5\x23\x32\x91\xa7\x4c\xa4\x99\x06\x7f\x0d\x81\x05\xf3\x30\xd1\x3e\x99\x71\x7d\xa2\x2e\xb0\x23\x33\x5e\xac\x61\xf6\xf7\x6c\x46\xa2\xb1\x00\x00\x02\x63\x30\xdd\x29\x05\xef\x36\x81\x5e\x4d\x69\x98\x22\x0d\xd7\x0e\xda\xa7\xeb\xac\x34\xb0\x11\xd4\x95\x58\x83\x6f\x0f\x8a\x7f\x4f\x9f\x9f\x9a\xc5\x3f\x5e\x62\x81\x67\xcc\x83\xbd\x12\x0c\x74\x5c\x72\x32\x01\x2f\x1f\xb8\xb9\x8a\xc5\x52\xb3\x99\xc8\x17\xa2\x64\xe0\x79\x63\xd7\xce\x35\xb8\x09\x99\x35\x20\x08\xf0\x86\xc3\x4c\x9b\x66\x88\x39\x4c\x27\x2b\x78\x7a\x2d\x4a\x73\xb8\xf2\x35\x9b\x2f\x31\x69\xb1\x82\x0a\x35\x06\x34\xa1\xed\xdc\x2c\x06\xb1\xac\x44\x58\x6a\x0f\xbc\xad\x34\x2f\x52\x5e\xa6\xf4\x24\x02\xcd\x16\xfe\x32\x2e\xe5\x0a\xac\xf1\x94\x13\xb4\x4f\xf6\xd4\xa5\x0e\x0c\xf4\x8a\x4f\x44\xbe\x66\x19\xd6\x62\x64\xe3\x35\xe9\xc6\xa8\xb3\xb7\xc2\x11\x39\x35\x13\xf0\xcd\x00\x7f\x0e\x4e\x0b\xb5\xaf\x1c\x14\xba\xb6\xec\xae\x9b\x43\xa3\xcb\xa5\xd8\xda\x4f\x2d\x44\x9e\x43\x0e\x5b\xd3\x05\xec\x7a\x5b\xfb\xf0\xa5\x96\xb6\xfc\x83\xe9\x25\x27\x93\x1d\xfb\x80\x8b\xd2\xad\xba\xf0\x85\xe6\x39\x88\x03\xac\x63\x6e\xa0\xad\xbd\x4a\x49\xab\x17\x37\x7a\x2c\x6f\xb6\xb6\xd7\x7c\x0c\xfa\x62\xd3\x67\x70\xd8\xd4\xbc\xed\xd2\x87\xba\xa1\x03\x28\x6a\x31\x62\xba\xe4\x85\xc2\x47\x6f\xc8\x37\xdb\x59\xf7\x44\x16\x7a\x30\xe1\xf3\x2c\x5f\x8f\xd8\x5c\x16\x12\x12\x63\xd5\x5a\x18\x86\x3c\x62\x87\x0f\x63\x01\x02\x7e\xba\xe6\x65\xc6\x0b\x3d\xc8\xb3\x29\xd7\xcb\x52\xa8\xfa\x2d\xde\x26\x68\x58\x89\x62\xb0\x1e\x91\x29\xf2\x91\x0b\x96\x1a\xdc\x34\xc9\x19\x90\xd6\x76\x00\x73\x1c\xb1\x45\xd9\x26\xf4\x46\x83\x2c\xb5\xb9\x6b\x70\x56\xec\xb3\x6c\xbe\x90\xa5\xe6\x85\x65\xe1\x4e\xaa\xaa\x31\x64\xc2\x7c\xa8\x82\xa2\xbd\xa8\x0b\x8b\x38\xfb\x4e\xdf\x8a\x7f\xf8\xe6\xa8\x88\x7f\x5b\xa1\x80\xa7\x46\x15\x08\x38\x62\xdc\x16\x12\x38\x48\xc0\x8b\xd7\x83\x43\xdf\x88\xbb\x00\x9a\xcb\x6b\xf1\x29\xe0\x88\x22\xfd\x14\x60\x12\x5e\x24\x21\x9e\xee\x04\x29\x91\x8b\xb5\x07\x71\x22\x17\xeb\xdb\x42\x00\x07\x0a\x0f\x02\xdc\x26\x6a\x30\xf6\xf7\xd9\x13\x74\x77\x42\x87\xa6\xcf\x59\x5a\x4a\xf0\x36\x33\x9c\x61\x9f\xf8\x25\xe6\xd1\xc3\x3b\x11\xdd\x23\xa8\x84\x99\xb9\x89\xba\x6b\xa1\xff\xad\x47\xdc\xdd\x56\xa0\x4c\xc5\x84\x2f\x73\xcd\xc6\xe4\x92\x88\x36\xc0\x44\x16\x93\xa5\x12\xf6\xee\xdf\xbe\x06\x33\x99\x4e\xdf\x3f\x81\xdd\x63\x1f\x73\x95\x99\x17\x08\x0e\xd4\x8d\x74\x56\xd6\xf3\x82\xb1\x8f\xd5\x53\x54\x1b\xe2\x4a\xac\x53\xb9\x2a\x3c\xa2\x1e\xcb\x74\xfd\xb3\x58\x3f\x91\xab\xa2\xfe\x3e\x0a\xdc\xc4\x20\x27\x34\xcf\x8a\x20\x7d\xb3\xf5\xec\x40\x8f\x99\x92\xca\x12\x5a\x1f\x4c\xb0\x9a\xb5\xdc\x60\x69\x76\x1d\x30\x55\xd7\x78\x98\xa5\xe6\x05\x09\xe8\x1a\x95\x72\x35\x00\xfb\x4c\xa7\xa1\x61\x2b\xff\x6d\xe7\xad\xfe\x8d\x0e\xf3\xdd\xf5\x2d\xd5\xf8\x30\x32\xd4\xb2\xf9\x61\x84\x2d\x1a\x08\xb7\xca\xd7\xdc\x9a\x3c\xc6\x5d\xf2\x6c\x5b\x4d\xc5\xbd\x81\xd0\x9f\x8f\xdc\x11\x51\xe6\x5b\xac\x51\x0b\xe0\x1d\x78\xe4\x02\x15\xa6\x8f\xf9\xb4\x5d\x80\x80\x16\x83\x31\x9f\x06\x73\x8c\x7a\xde\x05\xc5\x9b\xf0\x78\xdb\xc7\x45\xfd\x6e\x09\x58\xff\x18\x5e\x66\xd1\x32\x1b\x56\xe0\x2b\xf4\x06\x25\xd6\xc0\x72\x3e\xb6\x69\x8e\xb5\x5c\xb0\x89\x41\x31\x87\x72\x3b\x39\x79\x99\x21\x7c\xfa\xa5\x14\xb4\x1c\xf4\xe4\x07\xb7\xfb\x7b\x54\x6b\x2a\x5f\xa3\x39\xca\xee\x14\xb8\x3e\x83\x40\xca\xe3\xc2\x48\x81\xea\xd3\x88\x84\x10\x1f\x80\xd6\xd8\x7c\x4d\x8e\x8a\xa1\x97\xbc\x9d\x9b\x2c\xed\x5c\x08\x8c\x8b\x08\xb0\x9e\x04\x76\xdd\x3f\xc8\x3c\x6d\xdd\x6e\xb3\x90\x78\xa3\xa1\x79\x74\xde\xb4\x5c\x40\xbb\xc1\x44\x96\xe6\xbd\x39\x70\x33\xee\xd4\x3b\x56\x89\xa3\x46\x14\x0d\x67\xb6\x46\xfa\x16\x5a\x6d\x63\xed\x5a\xe2\x31\xa3\xed\xac\xb7\x8f\x16\x83\xdf\x6f\x5d\xcf\x86\xc9\x05\x90\x63\x5e\x88\xb4\x00\x1a\x4f\x9e\x80\x6b\xaa\x72\x9c\xd0\x3c\x2f\xb2\x84\xe7\x98\x29\x95\xbc\x64\x7d\x71\xb4\x42\x2d\xe7\x20\xf6\xd3\xed\x41\x0f\x1b\x20\x1a\x52\x80\x8f\x97\x93\x89\x28\xc9\xaf\x64\x8d\xa9\x64\xad\x92\x83\xb1\xa7\xba\xa3\xa0\x38\x20\x7a\x4a\x2a\xef\xe9\xec\xdd\x18\xcd\xc3\x70\xb1\x10\xbc\xb4\x8e\x86\xfe\xbd\x80\xaf\xa1\x0c\xd3\x7c\x37\xd5\x10\x5d\xcd\x44\x51\x75\x60\x35\x30\x33\x85\x05\x05\x43\x5b\x37\x66\x87\x57\x42\xb3\x0e\x4c\x30\xcb\x33\xbd\xb6\x27\xbf\x63\xa6\x71\x25\x04\xa6\x95\xb7\x6f\x23\x2c\xf1\x07\xa9\x6e\x83\x4a\x09\x08\x2e\x73\x7e\xca\xfe\xa4\x60\x90\x07\x7a\x39\x77\xe0\xc2\xc6\xdf\x54\x87\x2d\x17\x2b\x78\x41\x76\xe1\x6b\xb8\x9c\xc0\xbd\x16\xfc\x96\x0c\x3e\x7c\x28\x0b\xf9\x96\xf2\xf0\x55\x9e\xcd\x45\xcf\x5c\xf3\x18\xee\x01\xc4\xd0\xaf\x0c\x3e\x15\x9a\x54\xad\xa6\x85\x9c\x18\xbc\x27\x57\xc3\xd8\x75\xef\xb8\x14\x7c\xa7\x3b\x2e\x68\x1e\x11\x2a\x7e\xcf\x4b\xc1\x3b\x8d\x6d\x6b\x07\xad\x01\xd7\xdb\x2f\x99\x00\x62\x4c\xcc\xea\x7a\xea\xd2\x77\x58\xd3\x7a\x83\x63\xbb\xdd\xc0\x4c\xb1\x5f\xa5\x9c\x3b\x77\x34\x23\xe5\x8c\xad\xaf\x3d\x16\x85\xb2\x25\x5d\x97\x66\x79\x52\x69\xe7\x46\x81\x11\x10\xd6\x79\x96\x63\xe9\xb2\xb1\x8b\x51\x19\x36\xa9\x58\xd0\x39\xce\xc7\x79\x01\xce\x58\x21\x94\x35\xfc\x15\x56\x7f\x0e\xda\x87\x42\x6a\x0b\xce\x72\x55\x5a\x89\x5d\x80\x99\x3d\xcb\xc5\xb5\xc8\x51\xc8\xa3\xa7\x39\x78\x80\x58\xe7\x75\xa7\x77\x01\x4d\xbe\xd7\xa7\xbc\x90\x5a\xd8\x29\xe1\xc2\xc1\x73\x7b\x04\x3a\x49\x25\xac\x1e\x24\xe1\x05\xcc\x03\xa3\xb8\xc0\x05\x90\x10\xec\xa6\x66\xa3\x4a\x6f\xe6\x79\xa1\x90\x16\x00\xce\x6a\xb5\x1a\xae\xbe\x18\xca\x72\xba\xff\xe0\xe0\xe0\x60\x5f\x5d\x4f\x83\xcd\xbd\xf6\xf7\x5c\x9a\x5d\x37\x67\x7f\x25\xea\x7b\x71\xde\x05\xd8\x7d\xd6\x31\x30\x7a\x11\x90\x88\xfe\x0c\x42\x06\x88\x24\x59\xc6\x83\x55\xde\xc4\x00\xb0\xd3\xc7\x49\xf7\x36\xb5\xbc\x16\xa5\x32\x6c\xb6\xcf\x3a\x87\xc3\xc3\xea\xe8\xad\x72\xc5\x66\x23\x8a\x96\x8b\x8a\x31\x26\x17\x13\x5d\xf9\xaa\xe1\x70\x18\x7a\x77\xfa\x30\x25\x8a\x94\x8c\xc8\xd6\x56\x65\x37\xe7\x6f\xb8\xa5\x50\x71\x95\xa3\x3b\x36\x9b\xc1\x41\x52\x41\xad\x49\x84\x94\xf0\x85\x46\x17\x20\x81\x2d\x53\x5f\x4c\x63\x82\x55\x07\x0c\x3f\xa3\xec\x0d\x72\x2e\xcc\x5b\x77\x35\x93\x2c\xe1\x65\xe0\x6a\x0d\x5d\x2f\x78\x39\x15\x6d\xaa\x4a\x03\x15\x78\x83\xc7\x61\xd8\x29\xda\x49\xf4\x30\x1f\xc0\xef\x03\x0d\x0d\x3a\xcd\xbd\x76\xd4\x75\xc4\x7d\x1a\x77\x6d\xd3\x9e\x79\x3d\x43\xa0\xa6\x70\x6a\x81\xf0\x3b\xda\xc8\xc5\xcd\x23\x67\xbd\xef\xe0\xf5\x1b\x1b\x49\x3a\x72\xc1\x13\xd8\xdb\x83\xb6\x69\xd2\x0b\xee\xd4\xea\x39\x83\x40\x80\xcd\x1c\x32\x84\xd2\x02\xbb\xf6\x98\x72\xa4\x29\x6e\xf4\xd3\x62\xb1\x74\xaf\x7b\x7c\x34\xbe\xf2\x9d\x2f\x6c\x8b\xfa\x13\x0b\xe5\x10\x0a\x35\x88\xdd\xf9\x28\x84\x07\xfc\x79\x9d\x5e\x88\x88\xac\xd0\x03\x35\x97\x94\x1a\x0f\xc5\x0f\x17\x69\xb9\x20\x93\x6b\xe8\xeb\x6e\x53\xe1\x9a\x9e\x3f\x20\xa0\x37\x3c\x5f\x3a\x8f\xce\x93\xf3\xf3\x48\xfd\x04\x17\xb8\xb9\x50\x2d\x6c\x1b\xcd\x17\x0c\xc1\xd8\xb9\x0f\x3d\xf2\xea\x2a\x18\x63\xd8\x34\xb8\x5c\xe8\x0f\x7e\xd6\x2f\x17\x86\x72\x78\xce\xae\x61\x22\x66\x20\xf7\xda\x8a\x17\x88\x81\x8f\xe6\x1f\xbd\x7f\xe1\xf8\xba\x8c\xe7\x54\x80\x99\xd2\xc5\xba\x1c\xd0\x5b\xad\xce\x4a\xe8\x1f\x3c\x3a\x02\xd3\xb3\x47\x52\x3f\x9e\x73\xec\xba\x1f\x68\x02\x27\x11\x1c\xf7\x87\x0d\x6f\x6f\x00\xd2\x08\x06\x57\x6f\x26\x75\xee\xd0\x74\x14\x4f\xe1\x51\xd5\xb5\x62\x67\x30\x1d\x6f\x97\xc2\x3e\xeb\x22\x39\x09\x23\x1a\x2d\xfd\x6d\x40\xd9\xb4\x0d\x65\xb8\xa8\x30\xc5\x54\x1b\x82\x2a\x34\xae\x19\xb7\xe1\xae\xde\xa0\x13\xd6\xd1\xf2\x12\x6a\x85\xb4\x43\x5a\x28\x96\x79\xde\x07\x49\x01\xf3\x8e\x59\x90\x89\x02\xe5\x45\x2e\x79\x0a\x42\x8b\x19\x2f\xd3\x50\x86\xd8\x76\x63\xb2\x84\x80\x58\x73\x51\x87\xe4\x04\x99\xd0\x20\xe9\x3e\x77\x71\x84\xe6\xf8\x2d\x16\x79\x26\xd2\x60\x80\x5d\xe8\xec\x35\x9a\x93\x5e\x97\x79\x88\xb4\x65\x99\xfb\xa4\x3a\xee\x8f\xed\x06\xb0\x59\x29\x26\x9d\x3e\x33\x3d\x42\x6f\x94\x7a\x37\xef\x70\xe5\x1d\x54\x22\xa3\xe7\x46\xe3\x17\xc0\x08\x2b\xfc\x3b\x0b\x6f\xdb\x20\xe1\xfc\x2b\x83\x84\x79\xdf\x5b\x06\xd9\x46\x7c\x1e\x8f\x74\x09\x39\x44\x1a\x0e\x1c\x9c\xcd\xd0\x78\x57\xb1\xa9\x6a\x97\xfb\x7a\xc3\x40\x28\x21\xd4\xa8\x3b\x72\x09\x80\x36\xdd\xba\x82\xc7\x7d\xbf\xcb\x49\x2a\x45\x50\x02\xf8\x36\xc7\x09\x0c\x0c\x5b\xc7\x50\x1b\xc7\x00\x18\xad\x1c\x2d\xa1\xe6\xbb\x8d\x34\x15\xfa\x71\x5c\xd0\xf8\x36\xab\xa9\xd4\x42\xde\x65\x5d\x1b\x46\xdb\xbc\xae\x71\xad\xe3\xce\xb8\xf4\x63\x3e\x9d\xf3\x69\xe4\xac\x94\x99\x2f\x76\x18\xd3\x76\x84\xf6\xb7\x1b\x93\x62\xce\x7d\x40\x59\xf6\xeb\x2e\x23\x52\x37\xd3\xfa\x76\xe3\x05\x59\xa0\xdc\x98\x71\xae\xc5\x8d\xe3\x06\xdd\x6d\xaf\x5d\xc6\x3f\x89\x62\x1e\xdd\x96\xba\x6f\x83\x91\xa3\xf0\x48\xff\x47\xb5\xfa\x00\x05\x4a\x83\x38\x08\x51\xfe\x56\x21\xe7\x03\x4c\xe3\x9c\x14\x17\x33\x41\xa5\x76\xdc\xa3\xd2\xde\x45\xb1\x56\x04\x1a\x6d\xe5\xfe\x53\x41\xe1\xdc\xd5\x0d\x0c\x62\x19\xf0\x17\x04\x32\x15\xfa\x24\xcf\xcc\x23\xd9\x5c\xc9\x15\xdb\x97\x3b\x45\xc8\x68\xad\x88\x0d\x01\xe6\xf8\x07\x7a\x48\x91\x98\x0d\xdf\xe3\x5a\x06\x1b\xa3\x57\x0d\xfb\xdd\x84\xb8\xa8\xb6\xd7\x06\xcc\xd9\x52\xc2\x59\x3a\x85\x74\xd3\xbe\xa0\xd8\x9d\xd1\x66\xb3\x6d\x6e\xe0\x26\x11\x8a\xbb\x3d\x5a\xf1\xa6\xf5\x50\x6a\x9a\x4d\x0b\xda\x6d\x76\x18\x54\x7e\xbb\xe9\xe1\xe0\x0d\x89\x2e\xa3\xb0\x13\xd2\x78\xc8\x3c\x55\xf5\xd4\x36\x36\x41\xd0\xad\x3d\x2d\x03\xef\xfe\xcd\x93\x76\xd7\x77\x6b\x42\x4e\xab\x56\x74\x4f\xe8\xca\x84\x7f\xf7\x44\x11\x69\xe4\xca\xbb\xfd\x32\x89\x26\x7a\x92\x83\x06\x74\xa9\xa1\x0e\x6b\xc2\x93\x19\x9a\xa8\x5e\xb4\x27\x1f\x09\x06\x2f\x85\x61\x45\xa6\x53\x8b\x14\xb0\x31\x91\xc5\x0e\xc9\x25\xc2\x99\xce\x30\x81\x67\x10\x9f\x15\xa4\x2c\x89\x8e\x16\xf0\x23\x70\xef\x74\x19\x10\x60\x65\x98\xb1\x07\x32\x4e\x70\x4a\x75\x51\x7d\xff\xbd\x84\x48\xa8\x5b\xa5\x71\xb1\x7b\x68\xdf\x5e\x36\xf9\xd2\xad\xb7\x52\x09\x1d\x66\xbf\xd9\x94\xe3\xc5\xbe\x86\x09\xfb\xdd\xc8\x48\xd8\x9a\xd5\xc5\x5d\x45\x33\x91\x2e\x73\x71\x06\x18\xa8\xbc\xa6\x9f\x16\x13\x59\xce\xab\x79\x9d\x9c\x9b\x61\x29\xa5\x0e\x62\x2b\x21\x43\x15\x38\x02\x95\x98\x65\x28\xb2\xbe\x18\x78\x2e\xc3\x54\x21\x59\x2e\x8b\xa9\x28\xcd\x3b\x36\x73\x59\xab\xce\x83\xda\xc0\xe4\x24\xe6\xfd\x80\xa0\x88\x6a\x8a\x5a\xfe\xca\xda\x20\x57\x26\x52\x4c\xb7\xc7\x0a\xb9\x82\xc1\xe8\xd8\x99\x27\x6f\xa1\xb3\x52\xe4\x6b\x48\x60\x24\x4a\x57\x4d\x1d\x22\x4c\x33\xcd\xd2\x2c\x25\x35\x16\xea\x68\x6d\xfe\x24\x03\xa6\xf0\x51\xbf\xe1\x0c\x22\x1f\x61\x1f\x4b\x61\xad\xbe\x94\x5c\x0b\x49\x02\xa3\x49\x13\xa0\xd9\x34\x22\x4e\x75\x95\x2d\x14\x21\x0d\xa1\xba\x74\x49\x00\x76\x62\xde\x5a\x48\x9c\xfd\xd0\x2d\xca\xdc\xaf\x63\x4c\x92\x03\x81\xaa\x94\x3b\x89\x61\x35\xe2\x0a\x7b\x9e\x71\xc5\xc6\x90\x36\x81\xac\x65\x50\x2d\xc6\xe9\xa9\x7d\xb6\x90\x19\x57\x95\x89\x6e\x24\xd1\xac\x80\xcd\xab\xb8\xa0\x37\x17\x9c\x74\x06\xa9\x4a\x6c\x66\x58\x8b\xd1\xd6\x88\x0b\xad\x48\x61\xae\xe9\xa8\xfe\x77\x73\x05\xba\xa0\x78\x00\xe9\x03\xdb\x8a\xc9\x05\x65\xe4\xaa\xa1\xa2\x1b\x19\x91\xe5\x56\xd7\x60\x35\x5a\x9c\xb9\x84\x3b\xee\xda\xba\xf0\xdf\x76\x5d\xfe\x40\x5c\x53\x43\xeb\xc7\xd1\x0f\xdd\x00\x64\xa0\xea\x32\xfb\xff\x06\x8f\xd1\x99\x5c\xa9\x0f\x61\xb3\x7e\x05\xf6\xf6\x57\x94\x3d\xf2\x4f\x37\xec\x9f\x2f\xc3\x6b\x53\x5b\x04\xdb\xdd\x9c\xf5\x35\x8c\x2d\xad\xe6\xc5\x88\x69\x45\x09\x7d\x81\xbf\x74\x5d\x84\x61\xd7\xc7\x68\x50\x11\x47\x08\xd2\x6b\x82\x60\x03\x83\xa1\x81\xff\xda\x85\x6b\x60\xc9\x88\x8a\xc2\xc4\x6a\x04\x23\x71\xf6\x76\xfc\x18\x74\x43\x15\x79\x74\x71\xb3\x51\xbd\x45\xcd\x17\x37\xec\x3e\xeb\x2c\x6e\x02\x5b\x41\x9b\x1e\xa9\x2e\xdb\xd8\x0b\xee\xf7\xcc\x7e\xda\x3c\xfb\x48\x2c\x58\xf0\x52\x89\xa7\x85\xee\x6e\x58\x4b\x3c\xc9\xe7\x94\xed\x0b\xf8\x0d\x4d\xcc\x05\x18\xf9\xbc\x5d\x59\x81\xb9\x80\x6a\xb9\xd2\x42\x15\xe7\x0a\x65\xc2\x0b\xbb\x4d\xf4\xb7\x96\x36\xed\x17\x30\xad\x4e\x21\xcb\x39\xcf\x3b\x2c\x9b\xd8\x1b\x56\xce\x33\x4d\x05\x72\x7d\xa2\x7d\x9f\x60\xec\x23\x3b\xae\xa4\x1c\xa3\xfb\x7b\x2b\xce\x68\xdc\x93\x4a\xfe\x32\x87\x3c\x3f\x6b\x44\xe3\xfe\x3e\x7b\xb1\x9c\x8f\x45\x69\x13\x9f\x7b\xd3\x20\xbf\x16\x25\x27\x79\xc5\x4b\xd1\x75\x54\x59\x1b\x57\x01\x70\x5e\x4e\x9e\x01\x94\x23\x76\x78\x70\xf0\xa8\x3a\x02\xf8\x81\x30\x70\xeb\xcd\x0a\xd1\x38\x94\x7b\x80\xb4\x8f\x64\xfa\xba\x22\xa0\x30\xcc\xbd\x50\x31\x86\xe9\xd5\x22\x15\x95\xcb\xb8\x56\x51\x58\xb5\x59\x72\xa3\x6e\xb1\xb3\x92\xf9\x6a\xe0\xa6\x04\x1e\x9a\x9d\x7a\x97\x36\xdb\xd7\x36\xeb\x57\x93\xfd\xab\xd1\x02\xd6\x68\x03\x8b\x7f\xb7\x6f\x46\xbe\xd4\x32\x70\xc0\x8c\x1b\xd1\xfb\xb1\xd6\xc6\xea\x1b\xd1\x9c\xe6\xdc\xd5\x29\xd4\xc8\x66\x1b\xe3\x4c\x2d\x38\x18\xbf\xc8\x01\x9d\xce\x54\xc2\xf3\x64\x99\x43\x32\x01\x0b\x25\xce\xea\x98\x15\xec\x87\xac\x14\x13\x79\x53\x41\xdd\xf9\x82\x17\xdb\x37\xca\x8c\x5a\xdf\x29\xe8\xdb\xb0\x5b\xa6\xf5\xc0\x8c\x8f\x59\x09\x6a\xdb\x45\xfd\x8a\x42\x94\x3f\x5d\x3c\x7f\x16\xc4\x81\x74\x3b\xbf\x74\x86\xa5\x58\x08\xae\xbb\x9e\xea\x7a\x86\x31\x5e\x96\x9d\x9e\xfd\x29\x22\xfd\x06\x02\xaa\xfb\x82\xb9\x61\x2d\x9e\xfd\xd7\x8f\xb9\x12\x66\xac\x4f\x8d\x85\x31\xc1\xa5\xe5\xe3\xc6\xae\x78\x01\xfc\xca\x66\x5d\xb1\xd6\xcc\x99\x60\xb6\x7d\xdb\xf4\xea\x37\x46\xe7\x80\x6e\x8b\xe6\xf6\x95\x92\xbe\xbf\x54\xac\x14\xc1\xe4\x3d\xe4\xb7\xf6\xd5\x1d\xb0\xdb\xdf\x7e\x03\x0b\xc7\x0e\xae\x3d\xc4\x09\x5c\x6a\x65\x18\x61\x8b\x0a\xa6\xba\x35\x81\xda\xa6\x92\x05\xd2\x81\x23\x35\xc4\x7e\xc0\x98\x36\x87\xaf\xf9\x9e\xc4\x58\xf7\x59\x95\x84\xee\xed\x42\x41\x0e\xb7\x18\x59\x64\x00\xda\x5d\xb3\xc4\x53\xd9\x03\x2c\xa9\x71\x21\x17\x8f\x2a\x03\xd4\xb4\xf6\xb5\x01\xea\xf8\x6e\xee\x13\xb6\x6d\x70\x5f\x68\x71\xfa\xbe\x9e\x06\x8b\xf8\x55\xca\xf9\x0f\x3c\xd1\xa0\xb5\xf5\x0e\x05\xa1\x4f\xc9\xa3\x6d\x43\xd4\x26\x47\x43\x78\xd9\xc1\x6b\x4a\x1b\xd3\xaa\x54\x93\x86\xd6\x1f\xe8\xa5\x18\xcc\x03\x69\xc2\xca\x3c\x95\x5c\xa3\x90\xbd\x27\x05\xaf\x03\x7f\x95\x52\x16\x5b\x5e\x30\x0c\xf9\x02\x0e\xaa\x93\xed\xda\xb2\x9a\x0c\xd6\xa6\xb7\xa8\xb4\x81\x2f\x9b\xa4\x83\xee\x36\xeb\xf4\x99\x79\xa4\xb3\x34\x9b\x8b\x42\x41\x9e\x47\xb3\xa0\x40\x47\x45\xef\x30\x73\x8d\xa3\x97\x1c\xbc\xa9\x39\xbd\xc8\xc8\xaa\x67\x00\x05\x20\x48\x18\xf4\x0e\x6b\xbb\x28\x6a\x36\x2c\xb6\x35\x53\x5f\xe5\x98\x63\x52\xf2\x48\xd5\xca\x06\x75\xe3\x6a\xe2\x1b\x3f\x8a\xac\xa8\x71\x7e\xc9\x48\x30\xa6\x37\x97\x7a\xe2\x56\xf9\xa1\xdb\xdb\xf8\xd0\x58\x2c\xc7\x79\xa6\x5c\xcd\x6a\x17\xf9\xca\xfe\x11\x24\x88\x1b\xa1\x46\xe1\xa3\x65\x28\x95\xe5\x07\x8f\x0a\xec\x73\x26\x57\x17\x12\xdf\x67\x5d\xf8\xba\x41\xe5\x00\x79\x30\xbb\x3d\x97\xac\xc8\x01\xa8\x6a\x55\xf0\xc7\x8f\xcd\x0f\x13\x57\xc5\x06\x5c\xef\x02\x11\xdf\xa5\xfe\xb5\xfa\xc2\x9d\x88\xba\x01\x7f\x2d\x3a\xf4\x50\xc7\xde\xa4\x76\xf5\x5b\xd6\x90\x81\xd5\xf7\x46\xae\xbd\x31\x1b\x6b\xd0\xd8\xaa\x72\x9d\x87\x11\x46\x0d\xd8\xfb\x13\xd2\x56\x72\x9b\xd7\x0d\x50\x30\x16\x94\x1a\x36\xca\x45\xad\xb4\x39\x7a\x2e\xd8\x0e\x64\x28\x9b\xaf\xd5\xba\x1f\x4d\x72\x69\x4e\x50\xb1\x66\x13\x68\x2c\x29\x13\x26\x9e\x34\xe7\x55\x74\xed\x1e\xd7\xb0\xa1\x54\xac\x60\x32\x54\x73\x5e\xea\x1f\x0c\x8c\x27\x99\xd9\x77\x4b\x60\xb5\xd5\xf4\x1b\x58\xc5\xd0\x7a\x68\xfb\x54\x4b\x05\x4b\xe4\x7c\xb1\xd4\xd5\xa7\x80\x5c\x9a\x67\x92\x16\xd3\x92\xe7\x74\x7f\x51\x3a\x5f\x57\x4d\xc3\x4f\x51\x39\xfd\x79\xe3\xdc\xff\xd2\x3e\x95\x68\x26\xa0\x37\x27\x7d\x58\x22\xd8\x58\xe8\x95\x10\x91\x67\x2b\xcd\x0f\x02\x36\xa4\x26\xc4\xd1\x97\x46\x8c\x55\xce\x73\x74\x2c\xd8\x9c\xa7\xe0\x0e\x08\x1c\x4b\x81\x23\x36\x06\x73\xa3\xd3\xa0\x15\x7b\x4b\x91\xc8\x32\xc5\x93\x88\x3e\x2c\x4a\xb2\x4c\x5b\x1f\xb1\xc2\xaa\xb5\x58\xce\x35\x66\x8b\x4d\x05\x6e\xaa\x73\x3e\xb7\x9a\x8e\x86\xdd\xbb\x90\x8b\xe7\x30\xa8\x2d\x0f\x59\xf9\x1d\x4f\xb3\x6b\x52\xdb\x46\x36\xa8\xe3\xd9\x9f\x81\x8a\x27\x37\x2e\xcf\x06\x3c\xb7\x4f\xc5\x3e\xfd\xef\x79\xb5\x91\x01\xe3\x92\x0f\x1d\x3c\xda\xa4\x30\x6b\xa8\x1c\xde\x90\xb6\x2d\x86\x79\xbf\xc6\xad\x89\xcf\x36\x28\xc0\x1a\x8a\xfa\x87\x99\xa4\x2c\x8b\xaa\xdf\x38\x91\x6d\xc5\x05\xb8\xd4\xa3\x59\xac\x7f\x0d\x99\xa4\xaa\x5c\xa3\xaa\x19\xa9\xf6\x9b\x59\x62\xaf\x1f\x80\xfb\xd5\x65\x6f\x86\x64\x5e\x7e\x41\xf2\x26\xb8\x9e\x50\x88\x7b\x66\x7e\xd9\xd2\xdb\x10\x74\x63\xe7\x0b\xb9\x60\x83\x96\x99\x6c\xd3\xc4\x55\xee\xc1\x3a\x97\xde\xdf\x67\x98\x87\x21\xcc\x8e\xcc\x4b\xc1\x03\x97\x75\xa8\x6c\x00\x51\xc9\x99\x4b\xfc\xa2\x98\xb8\x16\xe5\xda\x26\xfd\x75\x6c\x39\x4c\xdd\xdc\xa6\x46\xa7\x3b\x6d\x83\x6b\xb5\xdb\x93\x6e\x2b\xab\xc1\x5c\x97\xdb\xfe\x35\xcc\xab\x29\x13\x51\x73\xbf\xc6\xb3\x76\x87\xde\x11\x53\xd8\x09\x80\xd9\xdc\xca\x4d\x4e\x17\xbe\xb3\x25\x41\x74\x0b\xc8\xe6\x8c\xdb\x9c\x80\xe0\x0c\x65\x65\xdf\xa7\x64\xe4\x9b\x0b\x3d\x93\x29\x24\x05\x44\xf3\x02\xe5\xca\x46\x87\x7b\x65\xdd\x6b\x41\x1a\x40\xc8\x33\xae\x48\x26\x4c\xd0\x77\xff\x2f\xac\x5c\x16\x41\x4a\x51\x6c\x26\x93\x64\x59\xee\xe0\x68\x15\x89\x2a\x3b\x69\x82\x71\x80\x3b\x68\x81\x4b\x3b\xc6\x9d\x34\xc0\xd8\x3b\xd2\xfe\xba\x14\xf5\x6d\xaa\x5f\x5a\x55\xf8\xa6\xa8\x65\x26\xc6\xec\xde\xb2\x68\x49\x71\x6d\x85\x33\xbb\x71\x90\x98\x03\x07\xce\x8a\x69\x1f\x72\x72\x94\x02\xdc\x94\x27\xcb\xdc\x29\x70\x94\xcb\x77\xe8\xec\xba\x58\x2f\x04\x33\x10\x43\xd1\x30\xeb\x43\xe7\x06\xf5\x09\xcd\xc0\x48\x46\xf9\xc7\xad\xdf\xfe\x9a\xad\xf8\x7a\xc8\xd8\x13\x09\xc9\x90\x24\x09\x43\x46\x12\x5a\x96\x63\x0b\xcc\x01\xc1\xc8\x95\x24\x27\x07\xbf\xe5\x82\xf1\x89\xc6\xbc\xaa\x56\x8e\x42\xb1\x6a\x92\x73\x35\x13\x0a\xab\x37\x2a\x6d\x8b\xcb\x64\x85\x2d\x85\x11\xcc\x0b\x6a\x8a\x28\x0d\x29\xd0\x95\x16\x3c\x05\x04\x60\x19\x45\x97\xeb\x12\x95\x43\x94\x0d\xc0\x95\xae\x30\x62\x00\xe4\x50\x50\x9a\xab\x59\x25\x72\x04\xd0\xb2\x0f\x89\x7f\x97\x5a\x65\xa9\xa8\x5e\x33\xc0\xf4\x50\xed\xeb\xea\xb8\xb8\xd2\xaf\xca\xd9\xe8\x6c\x73\xf2\x80\xbc\xb5\xdd\xd5\x96\x60\x68\x7e\x1d\x81\x95\xd5\x45\xcb\xa9\x0f\x21\x97\x74\x79\xa7\xcc\x71\x8f\xd2\xfe\x35\xbc\x76\xb6\xd8\xc4\x29\x57\xf8\x9f\x6e\x64\xba\x20\xa9\xa3\xd2\x24\x68\xf1\xd8\x1b\xe7\xba\x35\xc3\xd3\xdd\xcc\x55\xbb\x3d\xfd\x36\x5a\xe5\x5a\x71\xf9\x68\x27\xe7\x03\x9f\xdb\x2b\x4e\x88\xdf\xf5\xef\xd9\x2a\xce\x6d\x79\xfe\xaa\xf4\xfd\xfd\x51\xc3\xa5\x56\xa9\x57\x59\xc4\xbc\xa1\x68\x8d\xaf\x2c\x85\x2b\x5b\xe4\xec\xe0\xd1\xfd\x51\x3b\x41\xe6\xec\xee\x23\x73\x09\xaa\x2a\x79\xd8\x51\x28\xa4\xab\xff\xd3\xe0\xa0\xc0\xb4\x7b\x23\xc8\x39\xea\x68\xc6\x82\x94\x2f\x41\xf5\x23\x3c\x8a\x20\x87\x18\x68\xc1\x65\xe5\x56\xd1\xc5\x70\xe7\x52\x69\x86\x41\x95\xf6\x2d\xdb\x67\xfc\x8a\x47\xd2\x6e\x2f\x58\x5c\x21\x75\x3f\x06\x64\x27\xe1\xe1\x05\x8f\x62\xe8\x05\xf1\x58\x49\x99\x61\x3c\x21\x4d\xd0\xdf\xb1\xae\x2c\xd2\xdc\xa2\xc3\x63\x0f\xb9\x14\xf1\x56\x03\xcc\xb1\x57\xef\x3b\x52\x63\xd3\x21\x17\xc4\x0b\x5a\x39\xff\x28\xc3\x07\x31\x02\xc0\x21\xcd\xb3\xc5\xf9\xf6\xec\x6e\xc1\x69\x8c\xbc\x76\x83\x83\xe9\x6b\x8b\x56\x39\x90\x4d\x34\xfa\xdb\x6f\xa1\x0b\x73\xbd\x41\x90\x58\xf1\x88\xd5\x40\xd3\x03\x20\xc8\x5b\xec\x1c\x29\x7c\xd8\xaf\xdd\x9e\x3e\x46\x03\x85\x77\x9f\xc0\x7d\x33\x58\x60\x2e\x40\x12\x77\x0e\xb2\x3c\x0f\x9d\x1b\x76\x45\xe2\xf6\x69\xaa\x9d\x53\x80\x8b\x7b\x0d\x17\x14\x04\xc1\x17\x4a\x94\xfa\x31\x90\x5f\x1c\x28\xdb\xaf\x36\xf5\xc0\xad\xc1\xa0\x21\x8b\x65\x15\xa3\x61\xd6\xbf\x36\xa4\x52\x46\xf4\xed\x28\x7d\x69\x2b\xaf\xb9\x7d\xca\xc2\xf3\x6f\x90\x56\x41\x4d\xc3\xce\x85\xee\x10\xbf\x1f\x49\x3b\x48\xbd\x3b\x4c\xa4\x57\x0b\xb4\xd8\xdf\x67\x8f\xa5\x9e\x79\xcf\x9f\x1d\x97\x49\xb8\xdc\xb8\x48\x27\x2e\xfe\x91\xcb\xac\x4f\x24\xcc\xd7\x49\xc5\x85\xb2\x39\x48\x67\x59\x61\xce\xb3\x48\x33\xae\x05\x5a\x80\x71\x7d\xf4\x5e\xdf\x6d\x27\xef\x6d\x9b\x4b\xeb\xba\xeb\x6a\xfa\xed\x9b\x15\x64\xb7\x84\x59\xee\x70\x12\xeb\x50\x63\xfb\xf0\x06\x9b\x46\xf3\x19\xb4\x51\x0c\x1b\xaf\xc7\xf6\x3c\x03\x9f\xe4\x86\xf4\xe0\xff\xe0\x1b\xd2\x8a\xe0\xf1\x3a\xba\x38\xd1\x44\x16\x69\xfb\x25\xe9\xfd\xa2\x1a\xef\xc9\x10\x5e\x78\x55\x42\xad\xa0\xff\xe6\x37\xe5\xe3\x28\x05\x82\xbb\x2c\x2b\xa2\x66\xeb\x7d\x49\x09\xb8\x77\x65\xec\xdf\x1d\x55\x85\xd8\x6d\xd7\xa5\xe7\x7a\xc1\x2e\xed\x7a\x63\xc2\x06\x6e\xbe\x30\x4d\x93\xf8\x94\x86\x4e\x74\xcd\xec\x62\x7b\xf6\x86\x4f\x76\x33\xd6\xc5\x8d\x4d\x28\x74\xd7\x23\x6d\x4b\x16\x9e\xfe\x86\x5b\x23\xcc\x67\xd1\x74\x61\xd4\x18\xe8\xae\xd7\x46\x00\xf8\xce\x37\xc7\x0e\x57\xe2\x27\x5a\x5c\x95\x1b\xff\xe1\x0b\x74\x03\xfe\x4f\xba\x10\xeb\x27\xad\x6d\x3a\xbb\xdf\x86\x0e\xe6\xf6\xcb\x10\x88\x26\x34\xd5\x18\xf1\x1b\xf2\xf0\x78\xbe\xa2\x36\x5f\x8b\x17\x01\x9f\xe7\x4a\x2d\xe7\xb6\x24\x6a\xa4\x00\xe8\x01\xd4\xea\x8b\xbf\x87\x05\x3d\x78\x5e\x0a\x9e\xae\x49\xf3\xd8\xa7\x94\x5e\xf6\xb2\x83\x26\xa0\x6c\x37\x34\x60\xef\x53\x7f\x81\x94\x72\x15\xa4\x56\xc7\x5b\xf9\x1e\xd6\x61\xf2\xdf\x8a\x22\xed\x45\x0b\x85\x95\x05\xf7\x57\x29\x92\x75\x92\x0b\x15\x3a\xa0\x43\xaa\x94\x99\xa8\x96\xb0\x24\xb7\xe8\x85\x54\x30\x15\xf4\xa4\xb6\x05\x85\xad\xda\xac\x94\xab\x73\xac\x1c\x6d\x35\x78\x85\xb0\xc6\xd7\x6c\xc2\x0a\x91\x08\xa5\x78\xb9\xfe\xef\x7a\x85\x86\x0a\x9b\x5a\x7d\xa1\x4d\x0a\x9c\x4d\xd5\x65\x7e\x16\x62\x81\x11\xc1\x18\x62\x9c\x0a\x45\xd5\xde\x5d\x96\x53\x5a\x27\x26\x8f\x77\xc5\x64\x45\x01\x06\x5a\x51\x52\x66\x1d\xc8\x08\x00\x15\x08\x18\xbb\x98\xd9\xd2\xce\x13\x9e\xe5\xcb\x52\x44\xa5\x4a\xf0\x9c\xbd\x36\x80\x20\x1e\x20\x82\xef\xe1\xd8\x53\x4a\xac\x28\x68\x05\x07\xbb\xd6\x8e\x2e\xbf\xa0\x9d\xaf\x48\x84\x09\xec\x3b\x4f\x32\x74\xcc\x77\x73\x27\x30\xb0\xee\x0e\xdd\xa8\x54\x61\x29\x18\x0e\x73\xd6\x4f\x9a\x6e\x6c\x07\xfa\xd4\x82\x14\xd1\x49\x77\xfa\x96\xa6\x71\x20\x4f\xb7\xe0\xb6\x1a\x4a\x30\xa4\x55\xa1\x47\xb3\x08\xff\xaa\x3b\xd6\x33\x07\x2a\x08\x5d\x8e\x78\x9a\xfd\xbd\xca\x45\x8d\x4c\x34\x93\xa5\x9e\x51\xa2\x0f\x8c\x8a\x50\x94\xda\x7a\x2a\x29\x6c\x1c\xe3\x70\x72\xa9\x87\xd5\x7a\x2b\xe7\xbe\x6a\x4a\x0b\x13\x7f\x54\xed\x72\x6a\x0b\xaa\x34\x32\xe8\x58\x5d\x6a\x10\xce\xea\x42\x53\x58\x1f\x09\x4c\xa5\x38\x5f\x71\xc3\xe7\x58\xa7\x2e\x4c\x28\x47\x47\x35\xd3\xa2\xe4\x36\xf9\xcd\x6e\x11\x10\x56\xc9\x0b\x1b\xf8\xa4\xe4\xce\xff\xe0\x39\xd7\xb3\xe1\x3c\xc3\xfa\xc4\x55\x2d\xe3\x0e\x97\xf5\x16\xe3\x1e\x0a\x78\x66\x3b\xba\x40\x27\xc1\xc8\x07\x8f\x82\x3f\xbf\xab\x4e\x2d\xf8\xf1\xfe\xfd\x30\x3c\xa3\x0c\xd4\xce\x81\xca\xfa\xbe\x6f\x5f\xa9\x13\x66\x08\x3f\x78\xd2\xb8\x73\x06\x3e\x21\x9d\x6b\xc1\x66\x99\xae\x8b\xcc\x2b\xef\x4a\x80\xf2\x0c\xe3\xc0\xa8\x6d\x75\x53\x17\x2c\xb2\x8a\xca\x59\x08\x9d\xcc\x48\xf7\xfb\xa1\x5b\x86\x1a\x6b\x77\xb4\xa9\x4b\xe8\x0c\x64\x6b\xaa\xe4\x72\xda\xdd\x3b\x31\x0c\xba\xe8\x68\x06\xc0\xb0\x70\x9f\x81\x32\x62\x7b\xec\x3e\xab\xc1\x64\x6c\x5c\x0a\x7e\xe5\x3c\x7f\xee\xed\x20\x94\xd1\x14\xfa\x2c\xb0\xd3\xc3\x2c\x74\x56\x2c\x45\x24\x66\xb9\x6a\x6b\x1e\xef\x47\xac\x5a\x12\xc5\xe7\xac\xb2\xb1\x49\x64\x16\xc1\x5c\xd3\x90\x7d\xaa\x8f\x17\x14\xcf\x65\x31\xb5\x18\xdc\x50\x4c\x6d\xe3\x84\xea\x67\xf6\xf3\xcf\xeb\x07\x79\x97\x29\xd7\x9f\xed\xb6\x50\x62\x6c\xee\xc1\x7c\xd5\x94\x73\x02\x2f\x6b\xb8\x43\x3c\xac\x95\xc0\xf2\xa7\x58\x92\x9c\xc1\xa3\x26\xbe\x21\x8a\xb8\x6e\xc9\x79\x2c\xd6\x3a\x6c\xd4\xd7\x71\x27\xd4\x10\x6f\x0a\x11\x73\x5a\x79\x5f\xee\x86\x16\x51\xa4\x7f\x1e\x52\x4e\xfd\x63\xa6\x09\x25\xa7\x35\x2d\xd9\x4e\xc4\x1b\xd5\x6b\x39\xf7\x4a\x6b\x56\xfb\xf1\xb4\x22\xe9\xa3\xe3\x98\x08\xae\x45\xa7\x4f\xdd\x6f\xaa\x1e\x4a\x32\x5f\xe4\x6b\x06\x5e\x47\x04\x6c\x2d\xc8\xa4\x19\x71\x14\x28\x5a\x2b\x78\xfa\x3f\x8a\xb3\x20\xa1\xd9\x3a\xa3\x18\xc3\x08\xf9\x81\x78\xce\xf8\xd8\x66\xfe\x63\x48\x20\x58\x2d\xb5\x03\x8c\x45\x2e\x4b\x32\x50\x9f\x09\x60\x2d\x16\x5c\x16\x94\x53\x74\x05\x36\x83\xc8\x4e\x33\x9a\xaf\x45\x74\x1b\x04\x37\xa3\xf7\xf7\x20\x37\x40\x6d\x03\xb1\xd6\x86\xba\x0b\xa7\xbc\xed\x3e\x85\x8b\x8c\xde\xab\x4e\x32\x1b\x2f\xa7\x53\x8c\xe9\xdd\xf8\xec\x6c\x0a\x7f\xac\x41\x8d\x94\x3d\xad\x71\x99\xf7\xda\x79\x46\x70\xa7\xc7\x66\x4f\x48\x14\x64\xe8\x67\x2c\xf5\xcc\x26\x9b\x1c\xf3\x29\xba\x41\x13\xbb\x82\x3a\x0d\xee\x21\x67\xe3\x35\x82\x34\x13\xd6\xa3\x00\x73\xc7\xba\x08\x9a\xc8\x7d\xd1\xea\x79\x1b\x0b\x09\x1b\x38\x14\xfc\xca\x6d\xb1\x7f\x85\x35\x05\xa0\x74\x90\x9c\x4c\x6c\x46\x03\x9f\xbb\x96\x4d\x32\xcc\x33\xbb\xd4\x81\x1b\x36\x65\xdd\x76\xc9\x84\x77\x08\x90\x0f\x9c\x07\x36\xf9\xda\x44\x39\x79\x5b\x92\x05\xc5\x8d\x2a\x21\x21\x61\xf0\x48\x1b\xb4\xba\x4e\x22\x6a\xd9\x8b\x48\x21\x20\x81\xed\x53\xab\xb5\xdb\x30\xbb\x0d\x30\xeb\x13\xac\x36\xae\x6b\x4c\x5e\x19\xce\x13\x45\x64\x93\x63\x0f\x04\xfd\xcb\x89\x53\x48\x38\xbf\x94\xaa\x52\x64\xce\xd7\xe8\x4c\x65\x5d\x51\x49\xd4\xb7\xae\x5d\x1f\xb6\xee\x34\x8c\x65\x79\x56\x25\x76\xdf\xe3\xaa\xd5\x2f\xe1\x1d\x35\x73\x12\xc1\x7b\x0c\xde\xc7\xb7\x5b\xb0\xd6\x1f\x80\xa5\x85\x8e\xe2\x2e\xab\xee\x14\x4a\x20\x67\xe4\x27\x5b\x8b\xb6\xd0\x58\x82\x0c\xbb\xd8\xd3\x86\x28\xca\x26\x81\xa6\x44\x96\xb6\xc7\xdf\x97\xa0\x6f\x28\x80\xf0\x5d\x97\x30\x47\x01\xe6\x92\x0b\x4c\x13\x0e\x61\x24\x79\x2e\x4a\x39\x2d\x85\x72\x99\x2e\x02\xa3\x49\x6a\xab\xe1\x06\xb1\x1f\x66\x36\x5b\x51\x1d\x5d\x0f\x15\x54\x57\xf4\x13\xae\x56\xb1\x23\xe7\x66\x77\x92\xcf\x3f\x0f\x8a\x7f\x17\x1b\x1c\x4f\x2c\xc9\x87\xcf\xbc\xc6\x86\xef\xdc\x46\xd6\xb4\xc1\x61\xdf\xb6\x94\x06\xd1\x25\x15\x1f\xc8\x26\xf2\xe9\xf9\xb3\x15\x11\xa2\xe5\xff\xf7\x2a\xd5\x9b\xeb\xe9\x13\x79\x9e\x47\x09\x96\xaf\x33\xb1\x5a\xec\x16\x25\x6d\xfa\x1f\xe7\x79\x73\xbc\x01\x98\xfd\xe0\x05\x5e\x61\x76\xb5\x97\x71\x54\x4e\xef\xa0\xa2\xac\xd9\xe8\x20\xbd\xbb\x36\xb8\x15\x42\x74\x5b\xdb\x39\x37\xcb\x23\x07\xbd\xc6\x5b\x37\xba\xd3\x2d\x84\x7e\xc5\x7e\x1d\xf4\xdc\xe0\xfa\x54\xa1\x97\xea\x74\xda\x12\x2b\xb8\x52\x5a\xe4\x88\x14\xb9\x84\xb5\xeb\x05\xd8\x80\x1d\x3e\x8a\x7b\x3e\x6a\xb8\x01\x1a\xf1\x16\xed\x59\x38\xec\xff\xcf\xde\xdf\x77\xb7\x71\x63\x79\xe2\xf8\xff\x7e\x15\x70\x76\xc6\x24\x63\x92\x92\xbd\x9b\x9d\x6e\x29\xea\xfe\xc9\xb2\x3c\xed\x8d\x1d\xf9\x48\x72\xd2\x33\x8e\xc7\x01\xab\x40\x0a\xad\x62\xa1\xb6\x00\x92\x62\xda\xde\xd7\xfe\x3b\xb8\x17\x8f\x55\x28\xb2\xe4\x38\xfd\x30\xe7\xdb\x67\xce\xc4\x62\xe1\x19\x17\xc0\x7d\xfc\xdc\xd4\xf6\x75\xd8\x35\xfa\xef\x5e\x57\x03\xd1\xe6\x99\x51\xa4\xf7\x2e\x1a\x62\x72\x1b\x43\x13\x99\x29\xdd\xde\x91\x46\x1f\x7d\x16\xe8\x78\x67\x62\x61\x1f\xa4\xda\x4c\x24\x1c\xe6\x64\xb5\x61\xa6\x01\x79\x1d\x36\x8a\xb0\x3b\xc5\x4a\x37\xf2\xb1\x1d\x69\x22\x41\x7b\xe0\x84\xd7\x72\x63\x4c\xa3\x12\x2c\xe9\x1d\x5f\xae\x96\xd6\x25\xdd\x45\x30\x45\xc1\xfe\x3d\xc0\x8a\x44\x51\xbc\xa6\x77\xd1\xcd\xcd\x22\x58\x82\x61\x3a\x92\x41\x35\x3c\xd3\x47\x91\xe7\xb6\xea\xf4\x0f\xdf\xe9\xfc\x3d\x09\x9a\xd8\xdd\x2d\xc4\xbb\x35\x5d\xc0\x61\x25\xfc\xe3\xeb\x8e\x83\x79\xd8\x94\xc9\x9a\xd2\xe1\x96\x1a\x22\x23\x40\x2c\x10\xab\x3f\xf9\x36\xf0\xff\x9b\xea\x46\xdf\x8b\x3a\xaf\x7d\xee\xdd\x2e\x94\x0d\x32\xf9\x75\x3d\x90\x6a\x9f\xa7\x6a\xda\x37\xb2\xf6\x7a\xbe\x7b\xb9\x43\xfa\x00\x34\x51\x14\x38\x30\xd7\xd4\x8e\x00\x26\xb7\xc9\x5d\x1b\xdc\x68\xf9\x35\xbd\x8b\x23\xdb\x0c\xb9\xe1\x61\x02\xbd\x8c\x1b\xc1\x1f\x7c\x1d\x7c\x41\xc3\xc1\xb9\x4f\xf1\x6d\xe8\x50\x32\x7c\xd1\x13\x5f\xaf\xe5\x21\xdf\x55\xc7\x57\xe9\x87\xcb\xb4\x97\xd4\xe2\xfc\x17\x7f\x17\x6a\x73\x71\x51\xff\xbd\x09\x6e\xf7\x8d\x02\xf7\xb1\xeb\x72\xf2\x99\x11\x7b\x31\x9d\x7e\x4b\x0e\xdb\xf4\x79\xf8\x9b\xd3\x65\xfa\x19\x70\xea\x14\x4b\x2c\xe8\xde\x19\xc4\x86\x45\xd2\x07\x97\x71\xb4\x45\xe3\xf5\x98\x92\x3d\x62\x03\xda\x38\xeb\x00\x50\x0f\x22\xbe\xb5\x20\xff\x35\xea\x93\xbe\x06\x79\x42\xd9\x0b\xb7\xcf\x2b\x74\x1d\x79\xd8\xa7\xc1\x71\xc0\x1c\x03\x16\xd5\xae\x05\x3e\xe8\xde\xc4\xce\x47\xb4\xb5\x7a\xe0\xea\xf3\x8f\xb1\x78\x78\x85\xf4\x59\xbf\x67\xcd\xb0\x83\x6e\x67\x65\x8b\x40\x18\x19\x88\x92\x67\x02\xf8\xd0\x60\xd5\xfe\x04\xf0\xf0\x98\x3f\xcb\x4c\x1c\xb4\x2e\x32\x44\x20\xb5\x09\xe7\xa2\x1c\xcf\xa0\xeb\xf1\x9c\xc2\x40\x06\x07\xc7\x26\x66\x36\x11\xf6\x12\x34\x3e\xb8\x4e\x4b\x0a\x0a\x80\x7c\xc5\xec\xa5\x0a\x29\x55\x96\xb4\xc4\x7c\x9f\xde\xac\x6f\x23\x85\x40\x5a\xa6\xb8\xe2\x74\xb9\xa4\x8a\x67\xa6\xdd\xbd\xab\xe8\xd2\xed\x25\xf8\xa0\x9e\x81\xda\xee\x9a\x88\xa3\x2b\x1f\x06\xf7\x61\x14\xbf\xed\x7c\xb5\xda\x41\xb0\xed\x3a\x26\x8e\x7b\x14\x66\xa6\xe7\xd2\x2c\xb3\x5e\x29\x5a\x48\x01\xeb\x1d\x2a\x4b\x20\x6e\x71\x38\x5b\xa9\x38\x88\x0d\x7e\x86\xaa\x0f\x47\xd3\xa8\x3d\x93\x3b\xa2\x9d\x43\x05\x73\xef\x44\xab\x4d\xa8\x8c\x72\x45\x61\xbb\xae\xbd\x97\xa5\x09\x3f\x02\x60\x3c\xb0\x1b\xda\x00\x73\xcc\x24\x1a\x1e\x21\x9c\x07\x2d\x73\x52\x30\x45\x6c\xea\x6b\xdb\x94\x49\x67\x87\x76\x6b\x3c\x65\xd6\x90\x30\x46\x27\x50\x70\x58\xc8\xc9\xaa\x32\x0d\x06\xb9\x99\x37\xb5\x80\x00\x75\x4c\xf7\xe2\xe2\xfc\xc1\x0b\x94\x46\x83\x46\xd9\xc3\xc1\x46\x90\xb6\xfb\x9d\x29\x11\x84\xbc\xa1\xca\xc1\x80\x1f\xf8\x14\x8e\x29\xd4\x83\x51\x03\xea\x93\x43\x3e\xe8\x8c\x96\x00\x39\x58\xf3\xdc\x24\xbd\x75\x59\x94\xcc\x6a\xdd\x30\xf7\x6c\x42\x72\xc7\xc6\xb1\xb3\x0d\x69\x22\xc8\xa8\x5d\xcb\x56\xea\xbd\x56\xb3\x2e\xcf\x91\x07\x2a\x74\x8a\x25\x20\x26\x58\x75\x6b\x61\xf7\x7d\xf6\x3a\x46\x90\x70\xb2\x79\x94\x76\x5e\x26\x93\xd4\xdc\xc2\x2b\xe5\x47\xff\x3d\xbc\x57\xfc\xbd\x60\x29\x94\xc7\xab\xa5\x17\xd7\xdd\xbd\xad\xa1\x13\xf2\xcc\x40\x1b\xc0\xdb\x59\x8b\x52\x41\xfe\x1f\x97\x5e\x28\x1d\xc5\x66\x7d\x7d\x4c\x16\x41\x47\x56\xcf\x5f\xfe\x30\x0e\xe9\x1a\x87\x60\x3d\x91\xc0\x92\x33\xdb\xda\xc4\x8b\x71\x08\x1f\x0c\x8f\xae\x19\xc6\xad\xda\xfc\x8d\xf6\xb6\xbb\xdf\xca\xa7\x6e\x31\xa0\xd4\xa8\xd4\x90\xf9\x14\xe8\x6c\x6a\x06\xf5\x06\xe9\x86\xe5\x2d\x1e\xe5\xe0\x80\xbc\xe0\x8b\x55\x0d\x69\x92\xc8\x8d\xd8\x90\x39\x35\x19\x3c\x70\x57\x34\x65\x49\x82\x59\x6a\x70\xfe\xd6\x0d\x23\x67\x85\xa2\x41\xf0\xb6\x1d\xc1\x73\xfd\xbb\x1d\x86\x89\xb5\x6b\xc6\x78\x07\xdc\x1b\xb6\x63\x6f\x5a\x15\xb2\x62\x2a\x60\xc2\xee\x23\x7d\xa8\x94\xdc\xa1\xba\x24\x0e\x51\x79\xa7\xc3\xe6\xf0\x82\xab\xf9\x35\x7a\x5b\xf9\x91\x9b\xbc\x67\x34\xba\xee\xc6\x64\x73\xc3\xb3\x1b\xa2\x6a\xbe\x58\xb0\x5a\x06\x11\xc6\xc1\x7d\x94\x62\x0a\x95\x66\x07\x23\x67\xdd\xf8\xb4\xe3\xc9\xd8\x80\x0f\x87\x4b\x8f\x6d\xb1\x47\xf1\xfe\x54\x37\xac\x66\x03\x47\x95\xb6\x31\xb7\x73\xe1\x75\x5d\x51\xa3\x31\xc6\x6d\x56\x37\x35\xc4\xba\x4b\x11\x24\x8f\xb2\x29\xab\x30\xb5\x1b\x26\x20\x5b\xb3\xda\x93\x41\x57\x3a\xd0\xc8\x74\x70\x66\xa0\xd6\x98\x23\x2f\x4a\x82\x7b\xc1\x5a\x2c\x5d\xab\x91\x10\x05\x14\x05\xb9\x6e\x3e\x11\x06\x57\x07\x26\x57\x0b\x1b\xd0\xb3\xa9\x45\xc6\x30\xff\x85\x87\x2b\x44\xc4\x8f\x4f\xe4\x4f\xa6\xdb\xa1\xd3\xa2\x8c\x22\x6a\xee\x23\x7c\x79\xca\xee\xe0\x25\x0c\x15\x6b\xc9\x64\xc3\x55\x76\x83\xa7\xaf\x50\xf4\x75\x60\xc5\xd1\xaf\x26\xf1\x53\x9a\x3e\xbf\x78\xfd\xe1\xf9\xf9\xab\xeb\xd3\x0f\x6f\x5e\xfe\xf9\xfc\xd5\x91\x33\x3d\x62\x3f\xa6\x85\xff\xb0\xa2\x4c\x30\x94\xd7\x18\xce\xce\x59\xfd\x21\x61\x63\xed\xee\xe7\xd5\xcb\xef\xcf\xf7\x75\x93\x96\x98\xee\xd1\xc9\x9b\xd3\x7f\xff\xac\x4e\x82\x79\xc2\xf1\x58\x30\x15\x22\x19\x45\xfd\x7f\x0a\x3c\xc9\x24\x5f\x94\xc8\x98\x43\x52\xf5\x1c\xdf\x3b\x48\x4e\xa8\x29\x1e\xc8\x8b\xdd\x55\x26\xb5\x9b\x21\x0f\x1c\xd8\xd7\x64\x62\x38\xe2\xcf\x7c\xc3\x21\x94\xfc\x1f\xfb\xf5\x86\x34\xc8\x3d\xdf\xed\xe6\x74\xfa\x34\xbd\xe3\x61\x82\xef\xf7\x7f\x92\xce\xef\x00\x84\xc8\x88\xbe\xac\xc8\x03\x2f\xe4\x6b\x3f\x42\x13\x73\x8f\xbe\x6b\x8e\x85\x94\x74\x8d\x8e\x2b\xd8\x16\x96\xcc\x39\xe6\xbb\x1b\xeb\xf7\xf7\x86\x4a\x52\x33\x03\xd1\x03\x2f\x1b\xe6\xbe\x47\x08\x53\x49\x86\x05\xbf\x65\x88\x7b\x36\x32\x40\xd3\xba\x25\xcc\xdd\x2f\x15\xcf\x6e\xad\x1f\x30\x02\x89\x15\x42\x6f\x09\x5f\x32\x23\xe8\x90\x0d\xdd\xea\x91\x80\xb9\x13\x9e\x7f\xb9\x04\xe8\x6e\x6c\xdf\x01\x2b\x89\x15\x9a\x03\xcc\x2a\x4a\x45\x15\x9b\xfa\xb7\x6e\x35\x6b\xed\x9c\xb2\x37\x49\x94\x7b\x81\x10\x9e\x1f\x11\x35\xe5\x39\x2b\x15\x9f\x73\x56\x5b\x57\xc6\xad\xfe\x19\xc1\xc2\xfe\xc3\xfe\x76\xe7\x7f\xfb\x33\xfe\xf6\xe9\x18\x93\x2e\x98\xae\xf9\x18\xc9\xe0\x38\xba\xcc\xf4\x8e\x47\xf7\x58\x98\x4b\xfc\xc8\xfb\xfc\x5c\xd1\x35\x6b\xb8\x5a\xa3\x34\x01\x98\x0b\xd2\x3a\xfd\x80\x93\x24\x47\xc7\x48\x4e\xbe\x25\x6c\x6a\x00\xb2\xaf\x4d\x39\xd4\xa1\x1f\x93\xc7\x8f\x79\xe8\xe2\xa3\xcc\x92\xf8\xf5\x19\x36\xab\xbe\xe3\xef\x03\xaf\x1e\x27\x73\xe1\x2a\xbf\x83\x06\xa6\x3c\x7f\x0f\x6f\xae\x99\x26\x31\xbe\xb5\xc1\x15\xd3\x9c\xa8\x49\x2e\x7e\xd4\xfc\x9d\x95\x79\x38\x7d\x70\xa3\x26\x54\x53\x00\xbb\xe3\x52\xa1\xd0\x02\xe3\xb2\xe4\x3a\x00\xc7\x87\x92\xcb\x1b\x96\x83\x0b\xcf\x67\xad\x89\x9b\xa0\x81\xf5\x68\xce\x33\xb1\x2a\x01\x81\xbc\x3f\xde\x3d\x5b\xc8\xec\x1e\x4c\xeb\x47\x5a\xdc\x86\xf0\xf3\x76\x4a\x16\x89\x5f\x94\x2c\x90\xf7\x96\xac\x5e\xb0\xa0\x38\xaf\x7d\x4b\x46\x27\x40\x78\xa9\xcf\x5d\xc9\xf0\x22\xb6\x27\xa7\x60\xfa\xde\xb4\x58\x2d\x73\x5e\x02\x13\x65\xd8\x97\x39\x95\x06\x64\x97\x90\x98\x07\x3d\x3c\xfe\x5b\x93\x15\xf6\xfc\xd8\x82\xf5\xa4\x08\x6c\xba\x05\x04\x23\xfd\xd7\xf6\xf3\x08\xd2\xaf\xda\x4b\x78\xda\x1c\x0a\xa3\xdf\x03\x03\x2a\xe6\x25\x64\xbc\xe9\xb4\xdc\x22\xe6\x4e\xd2\xdf\xf0\x32\x37\xa8\x67\x7e\xf0\x5f\x9f\xc0\xe3\x17\x2c\x67\x5f\x4e\x9d\x90\x04\xb7\xde\xe4\xd8\x6d\xa3\x7d\xb8\xf6\xb0\xc1\x16\xe7\x4e\x3a\xb8\xf7\xb0\xd2\x5e\x0e\x9e\x7c\x51\x2e\x9e\xec\xe5\xe4\x93\x77\x4a\xc0\xb6\x08\x92\x9b\xf4\xff\x0b\x26\xd5\x4a\x8b\xbe\x08\xa9\x87\x02\x25\x26\x39\x2b\x15\xab\xe7\xac\x76\x51\x1d\xfa\xc1\x70\x3b\xad\x47\x92\x62\xbf\x3b\x5e\xf6\x50\x43\x14\xc9\xe2\x9e\x46\xc0\x23\x05\x4a\xad\x24\x91\x2b\x20\x33\xaf\xf4\x05\xbd\xa6\x54\x74\x2b\x03\x4d\xb0\xf5\x00\xd5\x8d\x55\xf0\xa6\x36\x8c\x25\x06\x3b\x54\xd7\xbb\xa7\x0e\xd4\x2a\x8c\x52\xec\x05\x00\x78\x4d\x1c\x86\xb9\xe4\x65\xc6\x9c\x86\xc9\xf2\x4a\xa8\xf5\xd2\x73\x8f\x72\xee\x5a\xa5\xe4\x4e\xd0\xf8\x5d\x78\xa3\xf7\xe4\x10\x7d\x62\xfc\x7f\x54\x06\xf1\x4c\x8f\xb0\xb1\xc8\xa4\x83\x8c\xf4\x6c\x26\x4a\x4c\xb2\x82\x57\x33\x41\xeb\xbc\x31\xb5\x97\xf3\x54\xb6\x12\xb4\x7f\xb3\xdc\x87\x67\x7a\x7f\x40\x40\x3a\xa2\x5b\x17\x80\x30\xd7\x74\xc8\xcb\x20\x82\xcc\xc7\xe6\x25\xa2\xce\x63\xdf\x6d\xfb\x8e\xdc\x98\x21\x3b\x98\x43\x50\xed\xf0\xb9\x79\x7e\x97\x5c\x4a\x44\x7b\xf2\x39\x42\xdc\x18\x15\xbb\x53\x26\x3f\xb9\x9e\x0c\xa9\x44\x05\xf2\x2b\xbe\x72\x98\x07\xff\xc6\xc5\xb0\x33\xf2\x55\xe0\x74\xf9\x95\xf7\xc9\xb5\x7d\xe8\xe6\x7a\x6e\xc2\x0e\x4e\x5a\x7f\xbe\x27\x23\x6d\x29\xf8\x5e\xd8\x4a\x9f\x05\x7c\xd2\x0c\xe5\x9e\xf4\x08\x55\x26\x4f\x63\x5e\x36\xf2\xde\xf8\x5b\xc0\x33\xed\x82\x01\x09\x86\xd9\x81\xdf\xa2\x8c\x92\x5c\x86\x91\xe9\x6d\xb4\x21\xef\x80\xcd\xca\xfc\x19\xcd\x6e\x35\x75\x1b\x6f\x15\xe7\x86\xbc\x67\x35\x93\x63\x40\x39\x09\x22\xe1\xfb\x8d\x81\xb4\x46\xd0\x15\xc9\x15\x39\xd4\x34\xdc\x72\x1a\xd1\xf8\xe8\x0b\x23\x13\xc0\x35\xfb\x3a\xdd\xe9\x9e\xd6\x76\xec\xde\xe5\x95\xdb\xe5\x7c\x05\xa9\x0d\x86\x8d\xf7\x7a\xc7\x5e\x3f\x26\x4f\xc6\xad\xf1\xf6\xf0\x44\x6b\x0f\x70\x7f\x24\x59\xd7\x60\xda\x3e\x57\x3d\x3c\xd9\x3a\xa8\xb9\x85\x9c\xd3\x07\x5f\xa1\xb1\x9d\x41\x94\x98\x27\x65\x18\x6d\x4f\x62\x4e\x60\x22\x75\x0c\xa3\x93\xa2\x77\x8c\x86\x24\xc6\xd2\x1d\xd1\x18\x6d\xf5\x7e\xe2\x86\x6a\x32\x8d\x32\xb1\xbf\xfb\x5e\x2e\x7d\x7e\x1c\x0f\x7a\xbb\x79\xf7\x24\xf7\xf6\xc8\xc6\x7b\x8e\x7b\x5f\x52\x6f\x8e\xaf\xa3\xdd\xb6\x26\xf8\x85\xc8\x80\xd9\x36\x96\x76\xcc\x6c\x6f\xfc\x60\x44\x49\x28\xc1\xc4\xf1\xe4\x96\x6d\x73\xb1\x29\x2d\x2f\x4e\xa5\x61\x07\x5e\xbc\xd0\x65\xcc\x42\x30\x9b\x58\xdd\x5a\x75\x96\x98\x36\x1f\x93\xea\xb3\x3c\xb4\x8e\x62\x4f\xfd\xe2\x09\x44\xf9\x4c\xe4\xdb\xef\xd8\xf6\xb9\xd8\x94\xa9\x07\xd9\xbf\x90\x41\x2e\xd0\xe6\xdb\xab\x8f\xc9\x2d\xd3\x5c\xd5\x15\xa4\xe3\x99\x6a\x1e\x4d\x73\x99\x67\x22\x67\x43\x36\x05\xf9\xc2\xbd\x61\x85\xd8\xb0\xfa\x3b\x28\x7e\xcb\xb6\x53\x25\x5e\xe9\x1f\xce\xa8\x0c\x6c\xd0\x5a\x1e\x55\x75\xa1\x4b\x7d\xfc\x48\xd8\x74\xc9\x14\xfd\x8e\x6d\x47\xe4\xd1\xa3\xa0\xfe\x09\xf9\x6a\xfd\x55\xe0\xaa\x1c\xa5\x8d\x8f\x12\x02\x47\xbc\x1d\x20\x83\xbb\x35\xb2\x1b\xa4\xa2\x74\x48\x68\xe2\x0f\xb2\x2c\xf6\x58\x4a\x58\x9c\x4e\xae\x26\x3d\xb8\x34\xe6\x69\x02\xdb\x34\x80\x36\x85\x50\x6f\x67\xb1\x85\x76\xc1\x60\xab\x4f\xce\x91\xf9\x1a\x76\x86\x18\xd9\x9f\x46\x11\xec\x69\xa2\x84\x0f\xaa\xf0\x18\xf6\x71\x6e\x65\x92\x04\x48\xc5\x55\x95\x00\x9d\x6e\xf2\xed\xc7\x4b\x1b\xd2\xfe\x94\x5c\x29\x51\xa1\x2f\x09\xf0\xf2\x28\x4c\x89\x8a\x2e\x28\xe8\x8f\xa8\xf4\x96\x1b\xc8\x6b\x8a\xf1\x88\xd0\x47\x6e\xad\x99\x6e\xb1\x31\xde\x62\xef\xe6\x60\xf5\x37\x7e\xce\xd7\x76\xa4\xa9\xfd\x62\x53\xa9\x44\xf5\xc6\x0e\x0a\x1d\x67\x13\x98\xfb\x6b\x56\x23\x72\x83\xf7\x28\x58\x8a\xfc\x33\x53\x83\xb9\x74\x09\x06\x45\x21\xca\x39\xac\xa8\xea\x4e\x3a\xac\xc5\xb2\x79\x21\x36\xff\x41\x4e\x50\xad\x4a\xfe\x48\xac\x21\x9f\x1c\x91\x01\x66\x23\x1a\xb4\xa6\x10\x59\x78\x97\xce\xc6\x32\x45\xa1\x82\x16\x8a\xd5\x12\xcc\x58\xcb\x95\x51\xc2\x44\xfa\x17\x7d\xb5\x81\x97\x4b\xd3\x46\xd5\x2b\x33\x7b\x60\xc5\x7d\x2d\xd6\xcc\x98\x78\xe2\x34\x95\x7e\x4c\xf1\xdc\x13\x76\x21\x72\x12\xcc\x00\x66\xaa\x5f\xb7\x8b\xb7\x97\x67\xe7\xe4\xc5\xcb\x57\xe7\x47\x68\x00\x3f\xf8\x8b\x3c\x80\x7f\x7c\xb0\x28\xff\xd3\xbf\x48\x5d\x54\x4b\x1c\x18\xd1\x3c\xcc\x46\xe4\xe9\xe1\x93\xa7\xa0\x2e\x00\xf3\x20\x5f\x2d\xc9\xc5\x15\x39\x5d\xa9\x1b\x51\xcb\x29\x39\x2d\x0a\x8c\x7e\x96\x44\x0b\x1c\xf5\x9a\xe5\x53\xdd\xc6\x5b\xc9\x1c\xd2\x97\x44\x1c\x90\xcc\xc4\x4c\x2f\xf4\x1e\x95\xfa\x9e\xde\x12\x4a\x9e\x5d\x3d\x9f\xc0\xd6\x91\x82\x67\xac\x94\x26\x9a\x11\xa1\xeb\x75\x4b\x73\xd0\xb7\x1b\x5a\x7f\xf5\xf2\xec\xfc\xfb\xab\x73\x2d\x2a\xb2\xe9\x83\x07\x03\xbd\xda\x52\xd5\x3c\x53\x83\xe3\x07\x0f\x0a\x3e\x9b\xd6\x2a\x67\xd5\x70\xa0\xff\x09\x49\xb5\xe5\x60\x4c\xe0\xaf\x37\x4e\xf1\xff\x9a\x96\x74\xc1\x6a\xfb\xa1\x66\x38\x40\xfb\xf7\x26\x1b\x84\x6c\x1c\xfc\x36\xd7\x1f\x71\x13\xbf\x63\x5b\x10\x7f\xfd\x2f\x17\x95\xde\x21\xe9\x7f\x48\x74\x15\x36\xe8\x88\x81\xb1\xd2\x57\x0a\xee\x5b\xff\x1b\x64\xdd\x68\xd7\xd5\x27\xd6\xe5\xe2\x0f\x3a\xfe\xe1\x1a\xb2\x63\x59\x75\x85\x28\xa5\xaa\x57\x90\xac\xc6\xc6\x31\x5d\x9b\xad\x26\x59\x41\xa5\x93\xdd\x4f\xfd\xef\xd5\x4a\x53\xb3\x12\x0b\x06\x96\x91\x94\xbb\xc4\x98\x84\x33\x00\x79\xd9\x76\xff\xe4\xf0\x10\x52\x5e\xea\xc6\xd1\xc0\x82\xb9\x5c\x8d\x61\x40\x2c\x2b\x54\x59\xdb\xde\x2c\x79\xd3\x82\xab\x6d\xa0\x9b\xaa\x11\x04\x9a\x06\xc9\x1b\xe0\xa9\x9b\x14\x6c\xcd\x0a\x3f\x5a\xbc\xf2\x64\x48\x33\x06\xf7\x1b\xd3\xba\xa0\xed\x07\xb5\xa7\x25\x47\x69\xde\xda\x28\xa4\xa8\xc7\x46\xe4\x37\xa7\xbf\x66\x0b\x87\xf3\x8c\x86\x21\x3b\x50\x70\x0f\x71\x0b\x3e\x25\xe4\x4f\x62\xc3\xd6\xac\x1e\x1b\x7c\x1c\xbe\xa4\xf5\x36\xc0\x1e\x07\x05\x5e\x55\x33\x35\x1c\x59\x95\x22\xe4\x03\x94\xe4\x87\x6b\xdd\x16\x93\x19\xad\x34\xb7\xfb\x7f\x57\x68\x8a\x02\xa5\x43\xb9\x16\xb7\xc6\x2f\x8b\x56\xfa\x1d\xa8\x01\xe9\xa9\x39\xdb\xc8\x8b\x11\x96\x9a\x6c\xa8\x24\x37\x8c\xae\x39\x24\x30\x9b\x17\xd0\x2a\x9c\xb0\x33\x51\x6f\xc9\x6b\x9a\x65\xb4\xae\x45\xc9\x06\x92\xbc\xa8\xe9\x92\xcd\x56\xf3\x39\xab\x63\x2a\xb8\xbe\x78\x7e\x31\xac\x17\xbc\xcc\xe9\xe8\x88\x80\x6d\x17\x9d\x0d\x1a\xd8\x22\x56\x5f\x03\x61\xf2\x75\x90\x55\x48\x9a\xa9\xd2\xda\x64\xd5\x91\x55\x41\xb7\xba\xf0\x86\x67\x00\xa1\xb4\xd1\xa4\x40\xa5\xbe\x9a\xcb\x9c\xd6\x90\x96\x82\x97\x41\x0b\x56\x8d\x83\x8f\x9d\xe9\x01\x88\xf9\xff\x7c\x47\x86\x7a\x95\x4c\x30\xdd\xd6\xec\x50\x90\xd2\x88\x29\x39\xda\x95\x13\xb1\xaa\x85\xbe\x37\x5e\xe6\x04\x4f\xac\xa6\x76\x77\x52\x89\xf9\x4a\x4a\x0a\xe6\x3c\x84\x02\xb4\x59\x11\x0d\x15\xe7\x63\xeb\xed\x03\xc3\x1b\x98\x3f\xa2\x1c\x41\x6e\xb7\x1a\xb9\x0d\x5d\xef\x21\x1f\x64\x7f\x8b\xb0\x93\x0f\x0e\xc8\xf5\x46\xd8\x07\x86\x97\x7a\xb1\xb2\x40\x6f\x69\xc8\x0d\x8f\xdf\x87\x38\xfb\x17\xfc\x16\xa8\x7a\xe0\xe5\x2a\xa9\x62\xbb\x4b\x7b\x93\xfa\x57\xc6\x7a\xf7\x95\x4f\x43\x1e\xbd\xb3\x3e\x30\x2f\x1c\x44\xd8\x42\x21\x34\x1b\x50\x0a\x6b\x8a\x08\x1f\x4b\xfe\x8b\x5e\x5b\xac\xf4\x0c\x48\x50\x5a\xfd\xe5\x9a\x41\x5e\xc5\x5f\x18\x12\x91\xb5\x95\xe6\x3c\x03\x0d\x1c\xba\x82\x55\xfa\x91\x31\x79\x3b\xa7\x84\x3c\x47\xe7\x48\x4c\xec\x87\xda\x5d\x03\x72\xbc\x11\xa0\x5a\xcc\xb9\xa4\x8b\x9a\x81\x71\xf5\xe0\x80\x9c\x16\x52\x60\x01\x5e\xd2\x4c\xf1\xb5\x1d\x99\x66\x71\x75\x23\x18\xa3\x8f\xef\x3d\xcb\x0d\x7e\x12\x87\x88\x66\x48\xc8\x02\x47\x13\x2a\x62\x83\xc9\x35\xba\x4a\xe6\x64\x3b\x44\x5e\x31\x70\x5e\xb0\xfe\xc6\x35\xd8\x06\x31\x74\x73\x25\xcd\x21\x33\x87\x87\xa8\x46\x6a\x90\x69\xfc\xf6\xeb\xfb\xb8\xb5\xa9\xe6\x77\x10\xda\x9a\x79\x27\xa0\xc2\x54\xae\x66\x32\xab\xf9\x8c\x0d\x7d\x6e\x27\xa3\x6f\x34\xba\xf7\xe9\x8c\x1b\xe7\xec\xd1\xde\x26\x9c\xa3\x64\xe4\x95\x76\xaf\x26\x2c\xe7\x6e\x5a\x40\x8e\x76\x6f\x03\x4e\x83\x1d\xe8\x4a\xc3\x5a\xe1\x72\xe7\x7c\x6d\x9e\x09\x9b\xd2\x03\x59\x6a\xcb\xfb\x84\x59\xdb\x9a\xa7\xb1\x95\x12\x3f\x68\x83\x05\xce\xa1\x9a\x24\xf1\x4a\xf0\xf1\xb7\x8b\x42\xcc\xf4\x03\xa2\x1b\x72\x8d\xc0\x0b\x17\x40\x9a\xfa\x17\x51\x4b\x02\xee\x51\x44\x7c\x7f\x3e\x37\xbe\x0b\xe5\x40\x41\xe6\x69\x7b\x36\x24\x3a\xbd\x80\x41\x95\xfa\xc6\xb7\x4c\xa1\x75\xa6\x66\x13\xc9\xc0\xeb\x31\x67\x99\xa8\x21\xa9\xaf\x9f\xa7\x0d\x8b\x23\x27\xc6\x4a\xe8\x7e\x0a\xe7\xed\x33\x2d\xa0\x3f\x83\xf1\x3b\x0b\xd5\xf8\x90\x46\x2e\xca\x42\x4e\xf3\xbc\x66\x12\xac\x5c\x0d\x7a\x9d\xd1\xec\xd6\x62\xa2\xbd\x7b\x6f\x3b\xba\x42\xcf\x0d\x3a\x23\x5a\xd8\xf0\x34\xae\xe8\x0c\x24\xa4\xb8\x34\xa0\xa0\xa9\x9a\x66\xb7\xfa\x7a\xd9\xdc\x20\xa7\x62\xee\x62\xdf\x0a\x0e\x18\x32\x75\xb3\x9a\x4a\x96\x1f\x3b\x3f\xe1\xeb\x67\x67\x26\x43\x52\xc1\x28\x5c\x41\x85\xaf\x17\xdc\xf1\xb4\x66\x7a\xcd\x6b\x26\x95\xa8\x31\x52\xc0\xda\xc9\xe0\x66\x00\x8f\x63\xe6\xf3\x5e\x99\x8a\xd7\x66\xd8\x9a\x30\xeb\x15\x0b\x97\xf3\x87\x6b\x74\xd3\x0b\xee\xc6\x06\xe4\x20\x1c\x72\xa2\x19\x68\x17\x29\x0f\xc6\x0a\xcd\x38\xc0\x90\x81\x73\x71\x4e\xaa\x20\x26\x96\x79\x60\x07\xce\xc4\x72\x49\xcb\xdc\xaf\xe2\xda\x08\x18\xd7\xa2\x0a\x53\x6e\x47\xdf\x50\x67\x9e\x22\xfc\xe7\x2f\x7f\x70\x9a\x16\xcb\x45\xda\x0b\x09\xc7\x32\x0d\x82\xef\xa5\xa8\x6d\xe8\x78\xb3\x21\x17\x88\x8e\x13\x90\x37\x9a\x03\xb2\x6b\xd0\x3c\x85\x58\xe8\x4a\x97\xf9\xe0\x92\xe5\xd9\xa7\x35\xfc\x3a\x7d\xf6\xea\xe2\xec\xbb\x64\x3f\x9a\xfd\xb7\x1d\x24\x47\x7a\xa6\x4b\x34\x87\x7a\x86\xc3\x9b\x15\xbc\xbc\x25\xa2\x3c\xd0\x84\x0e\xd0\x88\xfa\x1c\x2d\xe5\x18\x2c\x7f\x9b\x9a\x2b\xc5\x4a\xcd\x60\x69\x16\x42\x8b\x7f\x19\xbc\x0e\x5b\xcd\x29\x15\x82\xe6\x90\x42\x39\xec\xec\x99\x6e\xf0\x4c\x37\x04\xd4\xfc\xe4\xf0\x70\x4c\x9e\x1c\x1e\x3a\xaa\x7e\x53\xb3\xc9\x0c\x64\x1d\x51\x9e\xf9\x1a\x1f\xac\x45\xcb\xa6\x60\x43\xc4\x1d\xeb\x5b\x9c\x0b\xa3\x3d\x10\x35\x61\xd4\x3e\x9b\x66\x89\xcd\xe8\xb5\x58\xc6\x33\x63\x38\x86\x11\x2d\xb7\x17\x71\x1f\xfe\x06\x0d\x7e\x4d\x5f\xa4\x92\x99\x29\x63\x96\x16\x48\xa7\x92\x1a\x59\xcd\xa8\xf1\xc7\x43\x86\x40\x1f\x21\xba\x60\x60\x26\x33\x0e\x5a\x34\xbb\x21\x62\xa5\xaa\x15\xda\xf3\x6e\xd9\x56\xaa\x5a\xdc\xb2\x10\x28\x84\x97\x5c\x71\x5a\xf0\x5f\x90\x9d\x35\x70\x94\x96\x69\x5b\xa2\x7c\xe5\x26\xa6\xaf\x97\x05\x78\x68\x35\xf6\xd6\x7c\x9f\x8b\x9a\xed\xfa\x8e\xa7\xe8\xa2\xbc\x80\x51\x75\x7e\xfe\xce\x8e\xb4\xa3\x04\x48\xe4\xa7\x75\x2d\x36\xba\x64\xeb\x30\xd4\x2b\x86\x16\x49\xeb\x02\xeb\x8c\xc9\xa8\x3f\x40\x85\x51\xcd\x34\x6b\x60\xd8\x01\x5a\x14\x62\x63\x57\xd2\xe9\x5b\x83\x7b\x87\x51\xf5\x5a\x57\xbe\x84\x5a\x88\x86\x42\x0b\xe9\x2f\x1f\xfb\xc0\xcc\x58\x51\x68\x91\xbc\xf4\x04\xaa\x7f\x3a\x5d\xe5\x5c\xec\x4f\xec\x4b\x75\xb1\x81\x7f\x8d\x7d\xd5\x28\xaf\xaf\xfe\x79\x82\x65\x53\x45\x25\xf3\xe2\xeb\x70\x50\xd5\x4c\x9f\x18\x2d\xc6\xd2\x95\x12\x03\x47\x6d\xa7\xfa\x5a\x8e\xc6\xad\x6f\xce\xb9\xe6\x08\x21\x73\x9a\x7f\x96\xe0\x96\x5f\xb0\x92\xe9\x47\x2e\x27\x43\xcd\xc4\x59\x88\x51\x5e\x6c\x0d\xb3\x76\x23\x36\xe5\x28\x9a\xf5\xf7\x41\x7b\xaf\xb8\x54\xf1\x43\xf3\xa3\x79\x5a\x36\x0c\x7b\xa9\xf4\x58\xa4\xd4\x77\x77\xc0\xa1\x45\x63\x0a\xb6\x44\xde\x2a\x51\x85\x1d\x3c\x63\x26\x22\x29\xdc\x97\xb3\xf8\x3a\xc7\xc7\xd4\x49\x9a\xc6\xa7\x11\x4c\xcb\xcf\xcf\xcf\xae\xce\xfc\x73\xaa\x3f\x18\xcd\x43\x90\xe2\xa6\x71\x07\x82\x0a\x6e\xc6\x95\x74\x57\x77\xeb\xa6\x15\xbe\x0d\xcf\x44\x9a\x86\x03\xd1\xc0\xa4\x8d\x02\x9b\xbd\xcb\x58\x08\xf9\x99\xf5\x13\x3a\x6d\x25\xa7\x6a\x0d\xe9\x87\xeb\xa6\xd4\xeb\xa5\xe4\xe0\x04\xaf\x55\x34\x90\x1f\xae\xdb\x9c\xdc\xad\xd1\xc0\xd8\x9b\xd1\xd5\x75\x1f\xc2\x16\xac\xbe\x26\x6e\xe7\xdf\x81\x56\x0a\xf2\xf2\xc2\x38\xdb\xd0\x2c\xd2\x3c\x99\x40\x60\xe0\xe1\x78\x9d\x63\xfa\x4c\x26\x61\x27\xc4\x4a\x11\x76\xa7\x77\xcc\xe6\xca\x44\x74\x6d\x30\x60\x39\x7a\x75\x69\xf1\x4d\xf8\xad\x88\x46\xe5\x9e\xb2\x97\x17\x8d\x09\x9a\xcb\x01\x6e\x82\x49\x56\xf0\xec\x76\x92\xd7\x74\x11\x7b\xcb\xa7\xb7\x92\x95\x9a\xe3\x82\x6b\xe0\x79\x4d\x17\x26\x78\x2f\x60\x42\xf0\x39\x12\xd5\xf6\xa2\x34\xd0\x24\x8d\xeb\x0b\x7a\xbd\xd4\xfb\x7b\xa6\x7b\x06\x36\x3c\x59\x06\xbe\x3c\x5b\x29\x05\x38\x0b\xe1\xed\x66\x0f\x8d\x01\x21\x05\xd8\x29\x1b\xc8\x00\x6c\x26\xfa\xc5\xcc\xd8\x0d\x5d\xf3\xe0\x49\xd6\x83\xc6\x72\x3f\x42\x31\xeb\x9b\xe2\x0e\x0b\x0e\x5e\x53\x9b\xb3\xd4\x9d\x6a\x7e\xce\x8a\x00\xd1\x24\x6b\x06\x6f\x86\x96\xbc\x3e\x0c\x7f\x77\x38\x26\x4f\xff\x57\xe8\xff\x60\x5d\x6d\x2c\xa7\x16\xe5\x97\x62\xea\x0d\xca\xe5\xb1\xdc\x0e\xd9\xbd\xad\xc4\x9f\x32\xf4\x86\xe6\x09\xe7\x07\x6d\xf6\xe8\x92\xd1\x7c\x3b\x1c\x1d\x93\x4f\xb1\x50\x13\x22\x2d\x19\x94\xa0\x88\x41\x92\x29\xd5\x42\xc8\xff\xe8\x73\xf6\x80\x10\xe0\x82\x8e\xc8\x00\xfe\x0b\xa3\x7b\x76\x7e\xfa\x5a\xff\x70\x7e\xfa\x1a\xfe\x7e\xfb\xfd\xf3\xf3\x4b\x88\x02\x20\x03\xf7\xef\x41\xca\xbd\xa9\xf9\x28\x05\xa6\x07\xbc\xeb\xf4\x8d\x64\xa3\xb5\x42\xc1\xc5\xa1\x58\xeb\xcb\x66\x25\x59\xe8\x6c\xe6\xcb\xd9\x07\x9d\x3a\xc7\x85\x20\xa1\x1f\x2a\xdf\x70\x04\x28\xee\x90\xc0\xa6\xf7\xc0\x04\x0a\xb4\xb2\xfc\x25\x57\x29\xf2\x57\x0f\xf7\xa1\x11\x96\x1c\x7a\x3c\x3d\x0f\xa4\x08\xf4\xbc\x9b\x93\xdf\x79\xef\xcb\x3b\xe8\x61\x77\x67\x8a\xce\x7e\x34\xc9\x39\x7f\xd7\x86\x02\x4a\xa8\x9c\xda\x80\x52\xfa\x39\x8c\x57\xb7\x0a\xdc\xd6\x63\x4c\xaa\x50\x6f\x65\x53\xcd\x51\x29\x45\x06\xba\x43\x2d\x62\xc3\x75\xab\xc2\x8e\xad\x2b\xae\x87\x11\x64\x9b\x1d\x03\x6b\x2a\xd3\xfc\x91\x00\x38\x5f\xea\x5d\xa9\x12\x6d\x10\xf2\x42\xd4\x1b\x7d\x2b\xcb\x82\xca\x1b\xab\x51\x0b\x95\x86\x06\xb6\x0a\x31\x69\x72\xef\xf1\x0f\xaa\xb8\x70\x00\x76\xd7\x50\x9f\xa7\xb7\x5e\x33\x7c\x5e\x9d\xe7\x7e\x01\x38\xdb\xb5\xb8\x65\x9e\x50\xcd\x78\x6c\xff\xaa\xa6\xa5\xc5\x58\x91\x4e\x33\xbd\x67\x6b\xfd\xd5\x10\x92\x90\x5b\x8e\x71\x34\xac\x2e\x3d\x9f\xfb\x63\x5a\x23\xae\xe3\xf0\xe0\xa7\x83\x83\xc5\x98\x0c\x06\x41\xe8\x9c\xd7\x22\x2a\x0b\x00\x1e\xe2\x6c\xcd\x65\x88\x4b\x85\x3f\x4c\x73\x06\xba\x29\x90\xf3\xa3\x24\x6f\xf3\xc6\xf3\xde\x32\x50\x0c\x1b\xc3\x0c\xa2\x61\xb1\x69\x9a\xe7\x17\x33\xb0\xef\xd4\x72\xa8\xaf\xfb\xb1\x31\xc1\x0e\x68\xa1\x26\x8b\x7a\xa2\x39\x8d\xc1\x91\x5f\x94\x75\x8c\xf4\xbd\x06\xb8\xc7\x55\x51\x84\x6e\xb9\x00\x89\x48\xd7\x7c\x41\x95\xa8\xa7\x05\x2d\x17\x2b\xba\x60\xb1\x15\x5c\xd7\x1b\xb0\x72\xb2\x92\x83\xb0\x2a\x21\x6b\xcd\x6d\x96\xa2\x64\x03\xef\x61\xdd\x70\xea\x70\xc5\xc0\x42\x35\xa1\x85\x0a\xcb\x3e\x88\xea\xc0\xe2\x6e\x2b\x26\xe6\x04\xc6\x3a\x40\x62\x8f\x3a\xd5\x6d\xad\xdb\x46\xfa\x64\xcf\xed\xe1\x7d\x0a\x5d\x97\x1f\x1e\xfc\xd7\x50\x7f\xfd\x08\x9e\x0f\xb4\x50\x1f\x0b\x36\x87\x21\x7e\x74\x83\x1d\xfd\xcb\xc1\x54\x31\xa9\x86\xeb\xd1\x28\xd9\xae\xf5\xc9\xb3\x84\x6a\xf9\x9f\x29\x2d\xd4\xbf\xd7\xaf\x11\x0a\x6d\x6d\x4d\xd5\x0f\xfc\x7e\x69\xf2\x94\x15\xcd\xd8\x84\xcb\xc9\x92\x29\xea\x7f\xe9\xd8\xc3\x64\x1f\xcf\x6c\xa5\x97\xf2\x35\x53\xd4\xfd\xd9\xd1\xab\xe9\xeb\x3e\x3d\x60\xc3\x1d\xed\x49\x56\xe6\x72\xb2\xb9\xa1\x6a\x07\xe1\xe9\x85\x46\xbe\xf3\xe3\xef\x26\x33\xae\x3e\x1a\x97\xe0\xc9\x2d\xdb\x76\x2f\x30\xd6\xd8\xb3\xc4\x57\xba\xff\x1f\x35\xcf\x98\x18\xdf\x2a\xd7\x6f\xf9\x04\x04\x21\x90\xb6\x3a\xc6\xa8\x0f\x3b\xad\xb7\x40\x59\xf0\xc6\x0c\x0f\xfe\xab\xe0\xb3\x89\xb5\x4a\x1e\x0d\x7f\xba\x7a\x3c\x3a\x88\x9c\xe5\x69\xbd\x8d\x42\x18\xec\xe0\x3a\x25\x2c\x59\x67\x49\x8e\xa5\xe3\x7f\xa1\x55\x74\xba\x60\xea\x39\x55\xf4\x6d\x5d\xe8\x7e\xdf\x3d\x79\x3f\xea\x26\xfa\x9e\x23\x21\xeb\x51\xec\x27\xef\x96\xcd\x48\x4d\x93\x50\xa6\x82\x35\xdc\x79\xb5\x3c\x7a\x44\x42\x39\x2b\xb9\x36\xdd\xf2\x58\xb4\x2e\xe1\xf7\x69\x20\xef\x9d\xe8\x2b\x61\x51\xd3\x52\xb1\x3c\xb8\x44\xd0\x25\x68\x5f\x1f\xf1\xc5\x75\x70\xa0\x7b\x61\x47\x3e\x55\x3f\x78\x82\x47\x3d\x1b\x7c\xc8\x37\x7e\x00\xa0\x31\x36\x89\xfb\xe3\xc6\x4c\xd8\xae\xae\x02\x81\xf4\x08\x3d\xe9\x13\x56\xd5\x4c\x6a\x8e\x46\xcc\x09\xc5\xd8\x7a\x4c\xdc\x4f\x86\xe0\xe8\x4f\x25\xa1\x65\xdc\xa0\x28\x41\xec\xb0\xe2\xd5\x08\x79\x32\xfd\x10\x90\x82\x4b\xa5\x25\x27\xd4\xfe\xd4\xab\x44\x36\xe6\xa0\xa5\xb8\xd9\x53\x88\x8e\x13\x73\xb2\x11\xf5\x2d\xa8\x2d\x6d\x4a\x0d\xcd\xf6\x58\xf0\xe2\x40\xb0\xa6\x24\xe7\xb4\x10\x0b\x87\x10\x1b\xb6\xe6\x1e\x48\xe0\x61\x28\xf9\x0a\x45\x25\x25\x26\x66\xed\x26\x7e\xf7\xbe\x22\x33\x90\x54\xc2\xd1\x59\x50\xe3\x0d\xad\xcb\x61\x37\xdd\x81\x21\x52\x8b\x64\x0e\xef\x1a\x0c\x44\xa0\x0e\x18\x74\x67\xb7\x1e\xf4\x51\x15\x0c\x46\x9d\xaf\xd1\xbd\x08\xd8\xca\x48\xc9\x13\xe5\x35\x62\x13\x50\x88\xee\xbb\x7d\x25\x83\x6b\x3d\x50\x92\x0d\xd7\xa3\xe3\xce\x36\xf9\x92\x2e\xf6\xbe\x19\x91\xcd\x27\x6c\xff\xa5\xae\xbd\xb3\x7d\xb0\x4d\x7d\x6e\xf3\x60\x77\xdb\xd5\xba\xd5\xba\x7c\x76\x0f\x6f\x4c\x03\xe9\x5e\xf0\x89\xc5\x67\xea\xfe\x0f\xac\xab\x01\xef\xcc\xae\xc7\xd5\xf1\xd2\x93\x25\xad\x26\x56\x6e\x93\xbb\x5e\x45\xcf\x90\x69\xb1\x76\xed\xac\xcc\x62\x4e\x2e\x40\x71\x31\x4a\xc1\xab\xe3\x61\x79\x13\x09\x12\x41\xcf\x90\xb6\xda\x69\xe7\xac\x2d\xb5\xec\x3e\x28\x03\x54\x92\x1c\xe9\x12\xc1\xa3\x10\x46\x06\x90\x08\x92\xdd\x2e\xd2\x5a\xf9\x38\xf2\xd7\xb4\x32\xd1\x0e\x9e\x1d\xeb\x2e\x28\x99\xba\xb0\x0b\xd4\xde\x35\x14\xac\x27\xa0\xfc\xef\x71\x52\x02\x6d\xf9\xf0\xe1\xc3\x9d\xad\x4d\xc0\x86\xd0\xd1\xa6\x7d\xc8\x82\x5d\x38\xad\x6b\xba\x25\x8f\x1e\x45\x0b\x67\x19\xd4\x77\x87\xef\x81\x47\x45\xef\x98\x41\x67\xb1\x27\x51\xb1\xf8\x19\x52\xb1\x32\x21\x36\x4f\xac\x5b\x3c\x75\x8b\x3f\xbe\x7f\xa3\xef\xd6\x63\xb2\x7e\xbf\x93\x5b\x3f\x38\x20\x2f\xa8\x54\xc6\xfa\xe2\xad\xff\xb4\x24\xac\xae\x45\x3d\xed\xdd\x57\x60\x5f\x71\xfd\x25\x77\xa7\xef\xad\x78\xe6\x4d\x46\x09\xba\xd1\x3f\x4f\x2a\x5a\x30\xa5\xd8\x17\x3a\x81\xad\x9f\x81\x24\x7a\x9e\xcb\xf4\x78\x82\x33\x49\x81\xbe\x44\xfd\xe5\x0e\xa7\x77\xb9\xc3\xff\xbc\xc1\xde\xc9\x49\xf8\x45\x2a\x91\xdd\x9e\x05\x9f\xa7\x99\x28\x33\x6a\x91\x0a\xdd\x51\x08\x67\xe9\xd2\xea\xdc\xb2\xad\xe6\x05\xd6\x0d\x41\x90\xd6\x84\x6b\xb9\x9a\xd6\x92\xbd\x2c\xd5\x50\x73\xf6\xc7\x41\x01\xdd\x20\x97\xdf\xd3\xef\x87\x7c\xa4\x17\x95\x93\x6f\xc9\x21\xfe\xe3\x0f\xe4\xe9\x37\xdf\xc4\xcd\xc5\xf9\x0e\x06\x2f\xcb\x35\x2d\x78\x4e\xd0\x2d\x98\x97\xc4\x2c\x2a\x2e\x8b\x1e\xd1\x63\x32\x30\x6b\xf4\xee\x96\x6d\xdf\x47\x5d\x37\x53\x16\x34\x96\xcc\x4d\xf7\x1d\x7f\xdf\x1c\x05\x24\x01\x5a\xcc\xe2\xe5\x2b\x45\xbd\x04\xc5\xe6\xd9\xd5\x15\xd6\x8a\x7b\xd3\x8d\xd5\x8b\xd9\xa8\xb1\xa3\x1d\x5b\xf3\x8e\x03\x12\xfa\x62\x16\x0f\xae\xf9\xaf\xf6\xf5\x1b\x3b\xff\x40\x98\x82\x77\x47\xc4\xbb\x38\xdc\xe3\xc4\xbd\xdc\xf4\x4b\xea\xdd\x46\x70\xe4\xaa\xed\x44\x94\x13\xb4\x86\xed\x3b\xc0\x0d\xa5\xf7\xc3\x87\xcd\x37\x74\x25\xd9\xc4\x28\x77\x27\xa8\xa7\x9e\xe8\x3a\xfb\xda\xed\xd0\x5a\xb7\xdb\x07\xc5\xf5\xc4\x99\xee\x26\xe0\x8a\xd0\xab\x8b\x6e\x95\x77\xa2\x17\x55\x17\x93\xaa\x58\xc9\xc9\x92\x97\x2b\x39\xf9\x85\xd5\x62\xf2\x8b\x10\xcb\xde\x5c\x87\x6e\xe1\x4d\xb1\x92\xaf\x75\xfd\xff\x64\xb5\xf8\x4f\x01\xb0\xa3\xc9\x9e\xb2\x5e\x13\x88\xda\x3e\x33\x63\x4f\xb6\xb7\x9e\xa0\x1f\xd0\x7d\x1a\xfc\xc1\x1a\x29\xd6\x2d\x22\x6b\xb0\x6d\x67\xae\x74\xfb\x02\x67\x54\xaa\x09\x95\x9c\x96\x13\xba\x9c\xf1\xc5\x4a\xac\xe4\x84\xca\x89\xda\x08\xfd\x42\xac\x96\x5d\x3c\x22\x7a\x0c\x4f\x6b\xb6\xa0\x75\x7e\xf6\x97\xdb\x53\x5b\x3b\x31\x47\xb4\xcf\x4c\x40\x0f\x31\xd1\x17\x43\x2d\xba\x04\xdb\x90\x81\xc1\x6a\xbf\x7b\xc6\x21\x16\xa8\x16\x45\x72\xeb\x4d\xe3\x33\x51\x74\xa9\x1a\xfc\xba\x6c\xcb\xec\x99\x28\xf2\x2b\x3a\x67\x57\x8a\x26\x0e\x57\xd0\x98\x5e\x85\x19\xe8\xa4\xf6\x35\xbb\xfb\x56\xc0\x26\x75\xb7\xa7\xf2\x19\xba\x97\x07\xd3\xb8\xc7\xd5\xb0\xbb\xa1\xd6\x14\x7a\xb1\x72\x7a\x41\x74\xc1\x9d\xab\xe1\x22\x9f\x27\x9b\x9a\xef\xa7\x52\xb7\x73\x67\xb6\xde\x8f\xba\xda\xae\xc1\xe6\x2c\x7b\xf2\xb4\x77\xbb\xcf\x75\xe9\x64\x73\x73\x51\xaa\xc9\x9c\x2e\x79\xb1\xf7\x70\xea\xa9\xbf\x10\xa5\x7a\x01\xa5\x5b\x53\x87\x96\x7a\x09\x61\x4c\xe9\x66\xd2\x22\x17\xb6\xb2\x14\x08\x4f\xf6\xab\x87\x64\x7d\x38\x7a\xf3\x6e\x2f\x62\xb7\x8f\xf6\x00\x6f\xc4\x92\x4d\x6e\xd9\x56\x4e\x8c\x2f\x63\xdf\x1b\x48\x57\xfc\x8e\x6d\xa5\xb3\xb5\x36\xb7\x42\x97\xd4\x7c\x6c\xb9\xe8\xe2\x06\x13\x92\x9f\xa9\x80\x57\x7f\x83\x35\x7a\xb8\x1e\xb5\x38\xb1\x06\x5f\xd9\x4f\x98\x03\x86\x7a\x38\x38\xd7\xff\xd1\x8c\x4d\x30\xd2\xc0\x8e\x73\x44\xce\x01\x40\x8b\xe5\xc6\xa2\x3d\xe8\x21\xa6\xd5\xdb\x94\x06\xa3\x3d\x3f\x9a\xe7\xcf\xcc\xbf\x87\x81\x4e\x90\x64\x14\xb1\x87\xee\x7e\xcd\xb8\x35\x4b\x16\x64\xa2\x6a\x70\xff\x4b\x7a\x37\x41\x15\xff\xc4\xfa\x23\xf4\x38\x78\x4b\x7a\x87\x61\x7d\x57\xd6\x87\xa1\xbd\xe3\x90\xa0\x19\x89\x89\xd6\x6c\x32\xd7\xff\xea\xbd\xf5\x50\x59\x13\xd4\x69\xcd\x5e\xe8\xff\x26\x3b\x50\xd4\x68\x15\x8c\x9e\xba\x7f\xeb\x8a\x82\x36\xe1\x1c\x3d\x31\x12\x6d\x83\xdb\x01\x9a\x20\x50\xa3\xd6\xeb\x45\xee\xf0\x1b\x48\xb7\x0e\x2d\x4e\x50\x25\xd7\xe7\x2e\x78\xdd\x70\x38\x68\xdd\x08\x15\x5d\x7c\xde\xe9\xd5\x15\x77\x9e\xde\x8a\x4a\x39\xa1\x85\x9a\x18\x69\xf7\x9e\x06\x2e\xcd\xc3\x0b\x79\xe7\x3d\x6c\xbd\xb5\x6b\x25\x59\x7d\xba\x60\xa5\xb2\x5a\xff\xd7\x34\x23\x17\x57\xe4\xcf\x07\xfe\xb8\x83\x3c\xfc\x8a\x29\x72\x5a\xa8\xc9\x93\xe9\xf4\xf7\x06\xbc\x51\x44\x60\xbe\x43\x25\x88\x61\x26\xd0\x89\x15\x90\xbb\x20\xf9\x87\x28\xc3\x96\x4a\x51\x4e\x74\x0f\x44\x6e\xa5\x62\xe0\xca\x08\x59\x86\xc0\x26\x68\x45\x43\x51\xb1\x12\x63\x0b\xb5\x90\x58\x55\x76\xe4\x7e\x4e\xe4\x84\x0c\x1f\xea\x59\x3d\x7a\x64\xcc\x89\x58\xe4\x7a\x5b\x41\x72\xb3\x41\x25\xaa\x55\x35\x18\x75\x6b\x6f\xf4\x2c\x4e\x0b\xf5\x3d\xc6\xf6\x74\xac\x3a\x30\x84\x7f\xdf\x65\xd7\x0c\xe3\x7f\xb7\x75\xd7\x73\xda\xbd\xf0\x70\xbd\xfc\x7d\x17\xfe\xb5\x1e\xc2\xaf\x5f\xf8\x2f\xb4\xe8\xbf\x7a\xcd\xf5\x74\x7a\xac\xf9\xfa\x1e\xf7\x16\x36\xfa\x43\xa2\xbd\x9a\x65\x8c\xaf\xd9\x84\x95\x99\xc8\xbb\xb9\x2d\xc3\x2c\x1c\xfc\xd7\x70\xa5\xe6\x93\xdf\x7d\xac\xe9\x66\xf4\x2f\x07\x23\x67\x0f\x0d\xb5\x11\xb1\x9a\x29\xd6\x88\xcc\x45\x4d\xbe\x6a\xf6\xf9\x55\x5b\x69\x84\x76\x55\xe8\xcb\xdb\xcf\xbc\x22\x24\xa9\xb0\x3d\x37\xcd\x25\x66\x69\x60\xa6\x45\x39\x71\x5e\xc3\xfd\x94\xf8\x0d\xe7\xdd\xee\x76\xd1\x31\xb9\x6f\xa3\xde\x61\x38\xdd\xe2\x8c\xd6\x13\xe3\x35\xdf\x83\x5f\x6d\xc6\x3f\xb7\x19\xd6\x10\x66\x7b\xb2\xa4\x5b\xe0\x07\x26\xb4\xae\xc5\x66\xd2\x87\xe1\xe8\xf2\x53\xee\x58\x0f\xd3\x8f\x58\xb3\x89\x0f\x2d\xee\x3d\x91\x76\x64\x73\x62\x42\x7a\xfc\x7f\x4b\x9a\x8d\x3a\xfc\x15\x04\xeb\x95\x11\x7d\xc8\xf6\x86\xcf\xd5\x04\x23\x77\xee\xa9\xeb\x80\xaa\x98\x51\xb7\x8b\xbd\xb2\x95\xf6\xad\x63\x78\xd8\x24\x53\x76\xbc\xed\x4d\xd1\x97\xf6\x24\x93\x3d\xa9\xc9\x29\x5a\xde\x4a\x56\x9f\x49\xf9\xb6\x2e\xba\x9b\x9c\x68\xa9\xfe\xf3\xda\x05\xb8\x93\x56\xc3\x1b\x51\xe7\x13\x80\xdb\x9b\xc0\x0b\x33\x29\xd8\xfc\xbe\x2a\x0b\xdd\xc6\x33\xdd\xc4\x6b\xdd\xc2\x2b\x36\x57\x49\xbd\x52\x4b\x43\xb1\xab\x5e\xf7\x00\x3f\x47\xa9\x12\xf7\x74\x69\xb4\x1f\xf7\x1e\x62\xa3\x62\xf7\x18\x97\x3c\xcf\xf7\x5f\x59\x3b\x07\xf9\x1a\x9a\xf8\x9c\x51\x36\x6b\x7e\x1a\x3f\x20\x80\xdd\xd1\x70\x4e\xab\x19\xcd\xaf\x30\xbc\xa4\x8d\x11\x12\x16\x04\xfb\xfb\xf6\xb4\x28\x9c\x4c\xad\x6f\x94\xc8\x69\xcf\x0c\x31\xfc\xcd\x80\x2d\xb5\x1d\x77\xe3\x14\x34\xb2\xe1\x01\x29\x6d\x74\x0a\x7a\xb0\x22\x86\x5e\x39\xe7\x0b\x0c\xea\x6a\x46\x1f\x7e\x1d\x41\x98\x77\xf8\xe9\x7d\xda\xed\x9f\xb8\x60\xea\x0d\xc4\xe6\x74\xe5\xdd\x09\x16\x23\x4e\x26\x0c\x0a\x25\xcd\x22\x59\x70\xca\x59\x4d\xb3\x5b\xa6\xc5\x7e\x44\x2c\x59\x8a\xbc\xe5\x0f\x3a\x13\xa2\x60\xb4\xfc\x64\x90\x36\xae\x6f\x98\xb9\x60\x95\x20\x18\x16\xb7\xc7\x99\xf2\x99\xed\xc4\xde\x68\x9d\x28\x1f\x36\x4a\x61\x3a\x6b\x56\x81\x92\x49\x48\x12\x0c\x00\xb3\xde\xb2\x2e\x02\xcc\xa2\x15\x6e\xc5\x2a\x80\x56\x91\x4c\xd9\x58\x9b\x8a\xd5\x92\x4b\x35\x06\x00\x63\xee\x21\xf2\x71\xdd\xc6\xa4\xa6\x06\x1a\x81\x62\xf2\x63\x74\xa2\x75\x5e\xc9\x5d\x5e\xb3\x38\x9c\x6b\x37\xb0\xbe\x8b\x14\x18\x1e\xc3\x15\x82\x46\xe2\xcc\xb7\x61\x48\x1b\x7c\x3e\x4e\x44\xe6\x19\xa0\x94\x46\xa4\x54\x9f\x1a\xa2\xce\x59\xdd\x28\x9d\x4e\xc4\xd4\x08\xf5\xc3\xf9\x52\x00\x5b\x45\x50\xa4\x88\xd6\xcd\x02\xed\x25\xed\x8e\x85\x68\x13\x78\xb8\x14\x7b\xc8\x1c\x03\xae\x30\x0f\x14\xe4\xae\x0e\x00\xc8\xca\x66\x94\xc5\x97\x25\xfe\x2b\x9f\x8c\x5f\x0f\x25\xdf\x45\xfe\x5d\x91\x1d\xdd\xc4\xef\xf7\x17\x97\xff\x9f\x90\xf0\x9f\xb5\x48\xb4\x93\xf8\x13\x71\x7f\x5d\x56\x53\xac\x7a\x9c\x06\x53\x68\xda\x1a\x7c\xa4\x88\xb4\x00\x6b\xc9\x38\xc2\x71\x7a\x18\xdd\x38\x0c\xbf\x59\x47\x9d\xae\x4a\xa8\xf9\xb6\xb3\xdf\x7d\x6e\x7d\xd0\x5d\x17\x15\x95\x8a\x95\xb9\x79\xd5\xe0\x04\x39\x3c\x0e\x84\x7e\x49\x47\xab\x42\xd4\x14\x0b\xc2\xa5\x2c\x7a\xb0\xfc\xe0\xe3\xa5\xbe\xfe\xac\xcb\x61\x07\xb1\xb4\x2f\x88\xe6\xf2\x25\x4f\x90\x5f\xfa\x7f\xda\x13\xd4\xb0\x7b\xec\x3a\x41\x89\xc8\xd8\xff\xef\x04\xa5\x6c\x47\xf7\x3c\x41\x9d\x54\xf4\x0f\x77\x82\x76\x10\x4b\xfb\x04\x35\x57\x35\xc6\xc9\x86\x98\x61\x42\x21\xe2\xc4\x1a\xa3\xd0\x01\xd9\xad\x8b\x41\x29\x00\xd7\xe2\x7a\x55\xea\xc3\x62\x3c\x79\x21\xac\x09\xa2\x98\xea\x05\x02\x5a\x78\xa6\x21\x1d\x0c\x64\xda\x3a\x03\x28\x24\x3c\x25\x31\xf2\x55\xbb\xdf\x69\xea\x98\xd1\x7a\x81\xd6\x1d\x68\xa4\xd1\xbd\xcf\x9d\x24\x2c\x98\x95\x6d\x68\xc7\xba\xd6\xab\xf2\x2c\x1c\x5d\x74\x02\xfd\xef\x63\xdf\xb7\xcf\x2c\xc4\xca\x35\xaf\x45\xb9\x0c\xd0\x3f\x8d\x1c\xb3\x60\x6a\x38\x08\x3e\x0f\x7c\x06\x2c\x74\xd1\x0b\xab\x3e\x3c\xb1\xae\x5c\x03\x00\x90\x0c\x5b\x35\x2a\x5c\x38\x2f\x71\x77\x7f\xfd\xd4\x05\xc8\x68\x82\x48\x71\xfb\x30\xaa\x28\x9c\x8a\x3d\x7c\x7f\xf5\x53\x3a\x0a\x56\xf6\xe3\x47\x32\x08\x62\x11\xb8\x38\xb2\xf1\xb1\xd3\x6a\x25\x6f\x86\x23\xff\x2d\x18\xd0\x51\xf8\x87\x2f\x21\xca\xf3\x3b\xae\x8e\xc2\x35\xf5\x39\x97\xf0\x7f\x00\xde\xa8\x1b\x17\xd5\x30\x72\x96\x82\x0f\xab\x12\xc8\xb3\x28\x5c\x94\x70\xcb\x73\x0c\x11\x22\x83\x75\xcf\x0a\x21\xd9\x44\x94\x13\x76\xc7\xd5\x60\xd4\xf4\xb5\x32\x2a\x64\x28\x35\x4c\x79\x78\x87\x39\x79\x53\x9d\x87\xeb\xab\xe9\x27\x99\x34\xdc\x78\xa5\xf3\x79\x9c\x71\xc5\x40\x46\xc9\x08\x96\x0c\x7f\x1d\xa3\x9b\x38\x5e\x32\x1b\xee\xa3\x33\xdd\x45\x61\x39\xda\xdd\x14\xcd\xe5\x9b\xf0\xc2\xdf\x7d\x4d\x38\xd0\xa8\x0e\xd4\xa8\x60\x5e\x2f\x71\x2d\x60\xe4\xcd\x08\x6f\x23\xc4\x25\x04\x66\x1f\x33\x69\x30\xf4\x23\x4b\x01\x44\x12\x4a\xc6\x10\x24\x65\xeb\x11\x26\xf4\xa3\x8d\xc8\xfa\x10\x58\xf0\x75\xd4\xee\xae\xc9\xc7\x1b\xd6\x9e\x7c\x14\x87\xde\xda\xdf\xd6\xfb\xb2\x60\xea\xb9\x81\x5a\x18\x8e\xa6\x33\x91\x6f\xf5\x66\xbb\x35\x79\x6b\xc9\xf3\x1e\xab\xb2\x63\xf4\x2d\x6a\xbf\xef\xf8\xe1\xb2\x08\x07\xa8\x79\x25\x4a\xce\xae\xae\xf4\x45\xc1\x0d\xde\x0f\x7c\xf9\x1e\x38\x86\x62\x8b\x03\xe4\x12\x95\x20\xc8\xb8\xb8\xc2\x32\xca\xc8\x08\xf1\x9e\xe0\xe3\xde\xc5\x07\x41\xa8\x29\x4a\x5a\xd8\x40\xc0\x09\xb5\x0a\xa3\x34\x16\xc9\x65\x54\x42\xc6\x30\x73\x83\x87\x43\x6e\xd4\xfe\xa3\x45\x8c\x63\x73\x7e\x17\xf7\xe8\x06\x79\x60\xbe\x62\xa0\x7b\x0f\x39\x5e\xca\x1f\x68\xf4\xac\xea\xa6\xc6\x38\xba\x7b\x44\x67\x39\xfd\x14\xf6\x7f\x32\x98\x4c\xa0\xdb\xc9\x20\xd8\x42\x0f\xe0\x61\xff\x65\x20\x3c\x8c\x30\x8f\x91\xac\x90\xac\xd7\x5e\xd8\x3f\xff\xcb\x5f\x7d\xab\x9f\xfe\xe5\xaf\x7a\x74\x9f\x7e\x36\xe3\x4b\x83\xbe\xce\x85\xc1\x62\xeb\x3e\xa0\x67\x9a\x7a\x43\xe7\xa0\xc3\x11\xa2\xc3\x68\x3a\x30\x1b\x61\xf1\x01\x5c\x73\xd1\xe9\xb6\xcb\xe5\x12\x6f\x12\x88\x33\xd8\xba\x11\x80\x7f\x52\xa0\x78\x6b\x52\x8f\x4d\x07\x58\xe1\x4e\xe6\x4c\xf2\x1a\x18\x2f\xd3\xdb\x98\xb8\xfc\x80\x7d\x58\x6a\x9c\x47\x14\x00\x7c\xe7\x01\xa2\xab\x3b\x88\x15\x33\xa9\x71\xaa\xbb\xd4\xcb\xed\x9d\xaa\x46\x51\xbe\xf0\x98\xed\x34\xeb\x55\xdd\x45\xc0\x05\x48\x45\x43\x88\xf9\xd0\x4d\x4c\x20\x2f\xb1\x45\x4e\x0b\x1b\x89\x13\xed\x61\xfa\xe2\xc7\x64\x50\xdd\x0d\x76\x37\x88\x29\xf9\x52\xf1\x82\x7b\xba\xb0\x29\xde\x6d\x1f\x01\xc1\xfc\xbb\x55\xc9\x99\x87\xaa\xb5\xd3\xcd\xdc\x8d\x3d\xb8\xd5\xf6\x3e\x24\xdf\x9f\xf0\xae\x75\x8b\xda\x63\x74\xe8\x3e\xf7\x2b\xb8\x69\xeb\xc0\x76\xef\x11\x7a\xbf\xb7\xc4\x91\xd3\x77\xed\x57\x81\x7f\xdf\x57\xf7\x7e\x05\x62\xf7\xba\x8e\x27\x20\x41\x8d\x66\x58\x69\x6a\x36\xce\x86\xa3\x1e\xf7\x58\xc7\x71\x70\xde\x81\x21\xd6\x5f\xca\x51\xb5\xb5\x28\x29\x4c\x92\x28\xb3\x7b\xdb\xed\x08\x6e\x8b\x31\x08\x19\x2b\x25\x30\xdb\xa9\x66\x12\xf8\xdc\xc1\x06\x6d\x7b\x2c\x63\xd3\x33\xa9\xbd\x98\x90\xa8\xc4\x7e\x6b\xcd\x3c\xe1\x0f\xd5\xe4\xe4\x6d\xe5\x76\xc4\x4d\x17\x18\x0b\xd6\x40\xc6\x33\x91\x61\x05\x83\x8d\x77\x38\x66\xfc\x34\xfc\xf3\x93\x27\xc7\x3f\xc9\xc7\x41\xe4\x31\x18\x5e\x75\xcd\x8f\x1f\x09\x46\x01\xc3\x88\xce\xea\x8b\xab\xbd\xe3\x79\x72\x8c\x09\xb8\xd0\x98\x63\x14\xae\x2e\x1e\x33\x0a\x02\xea\x6a\xe2\x29\x36\x81\x56\xab\x56\x0b\x7b\x0c\x19\xa2\xc8\x63\x72\x08\x9c\x9b\x91\x0e\x5a\x44\xa0\x5b\xba\x0f\x1d\x44\x34\x9a\x26\x02\xef\xb5\x9c\x96\xe5\xbc\xf3\xb6\x5b\xf0\xa0\xca\xc3\x86\xb3\x4d\x0f\xc5\x4b\xd4\xa1\xff\xe3\xd8\xd7\xef\xef\x68\x9d\x68\x21\x41\x59\xa8\x24\x0a\xb3\xea\x87\xb7\x88\xc9\xd9\x95\x48\xb8\x85\xc9\x7c\x8a\xfc\x5e\x35\x07\x76\xad\x6c\xee\x4a\x69\x37\x41\x53\xb7\x1b\xc9\x94\xfd\xdf\x15\x2d\xe4\xd0\xb6\xef\xa9\xd9\x57\x70\xc9\x2d\x23\x97\x01\x98\x77\x80\x52\x62\xe8\x29\x3f\x22\x30\x4e\x7d\x34\x75\x89\x0d\x3e\x7a\x39\x47\x30\xdb\x64\x34\xd5\x00\xe4\x10\x1c\x14\xe0\xa1\xb8\xe7\x85\x70\x79\x94\xae\xb3\xef\x71\xf0\x09\x60\xee\x4b\x0b\x7e\xe2\xbd\x75\x6b\x9d\xf5\x77\x9f\x3c\x08\xe2\x4b\x1e\x3d\xf8\xa2\x0f\x40\x9f\xc3\xe5\x1c\xf3\xbb\xde\x2a\xcf\xc4\x94\x22\x67\x93\x7c\x55\x43\x08\x6a\x27\x0b\x93\x3a\x79\x10\x26\x30\x22\x7f\x24\x83\xc3\xe9\xbf\x49\xc8\x15\x70\x38\x48\x3f\xc1\x78\x01\x59\x94\x26\xc0\xae\x8f\x26\xd9\xd2\x01\x5a\xdb\x69\x9f\xd7\xe4\x0a\xda\xdb\x3b\x51\x03\x0f\x86\x21\x8c\x30\x86\xce\xd9\xae\x95\x71\xcf\x05\x64\x40\x27\x8a\xaf\xd5\xf4\xf5\xc5\xdb\xab\xf3\x0f\x97\xe7\x6f\x2e\x2e\xaf\x3f\x3c\x7f\x79\x75\xfa\xec\xd5\xf9\x73\xf2\xc7\xf4\x13\x3e\x58\xd3\x7a\x68\x45\x8d\xa8\x7b\x4d\x2c\xa3\x01\x39\xba\x6f\xbd\x4a\x00\xf4\xda\x68\x90\xd4\xa6\x52\xc4\x09\x13\xf3\x94\x45\xd1\x06\x6e\x77\xd8\xcd\x2f\xc5\xe6\x4c\x14\x9f\x80\xdd\xc7\x7f\x1b\xe5\x28\xa9\x99\x81\x90\xb6\xb9\xf2\x6c\xc3\x61\x8b\xbb\xf6\x89\xae\x99\x81\xec\xeb\xa3\xf8\x30\xa6\x48\x1b\x26\x3e\xcd\x0a\x51\x36\x99\x98\xa4\xf6\xf8\x4e\x85\x78\xf3\x9f\xcb\x84\xc6\x79\x02\xfa\x8d\x38\x3e\xfa\xc9\x03\xd0\x35\xbc\x86\x00\x1e\xb7\x84\x3a\x55\xff\x67\x5f\x1b\x46\xf7\x1c\xe2\xf6\x13\x29\x41\x54\xb3\xea\x8e\xb9\x25\x76\x21\x4a\x1e\x39\xa7\xa0\x4d\xa6\x55\x55\x70\x0f\xee\xdc\xe9\xbf\x61\x65\xce\xeb\xdd\xed\xed\x99\xfe\x82\xa9\xff\x14\x62\xf9\x02\xfb\xee\x2d\x47\xc4\x62\xd9\x2f\xae\x85\x58\x49\x0f\x18\x60\x38\x0b\xae\x0a\x9f\xae\xc3\xce\x69\x20\xbd\x3b\x6c\x7a\x7f\xa1\xda\xb5\x6b\xa0\xef\x8e\x62\xa4\xe4\x35\xd4\x09\xb7\x53\xff\x80\x13\x6b\xe0\x51\x4f\x95\x29\x0b\xff\x6d\x6c\x1b\x40\x33\x23\xae\x1a\xa4\xda\x2a\xb6\x06\x34\xb3\xeb\xaa\x30\xb3\x88\x6f\x0a\x53\x58\x4f\xc6\x41\x71\xa2\x9a\x42\x37\xbf\x4f\xc9\x8f\xa5\xda\xf7\x02\xb6\xea\x99\xc0\x5a\x6c\x8c\x5d\x6d\x3e\xcd\x0a\xba\xac\x4c\x89\x69\x2d\x36\x63\x72\x38\x0e\xc9\x37\x14\xa9\x27\xe4\x89\xe3\x94\x30\x1a\x31\xdd\x0c\x7e\x4b\xb6\x84\xf2\xbf\x6d\x28\x3a\x26\xce\xc7\xc4\xa1\x59\xc0\x70\xb0\x31\xc7\x30\x45\x5d\x90\x3f\xd8\x71\xb8\xcc\x90\xf1\xf7\x93\x13\x5b\xe0\xd1\x23\xfb\xc9\xe6\xe6\x89\x98\xd8\x8e\x8b\xd2\x96\x75\xc0\x8e\x0d\x3e\xff\xac\x80\x1c\xfc\xce\xaf\x67\x20\x89\xab\x32\x2f\xe8\x62\xcf\x8e\x41\x60\x15\x4e\xfa\xc2\xf7\xd4\x21\x08\xef\x19\x9f\x41\x5f\x89\xef\x49\x19\x8c\x0d\x91\x1c\x3b\x0e\x11\xc2\x60\x43\x3e\x00\xf8\xd7\xfd\xbc\x82\x2c\x04\xa4\x77\x1c\xd1\x3f\xb4\xbc\x82\x1c\x8e\x36\x7c\x3e\x0e\x52\x84\x6a\xce\x01\x9b\x82\x9c\x82\x9f\x52\x3a\x91\xd6\x14\x3e\xcf\x71\xa7\x35\xd6\x2e\xc7\x1d\x1c\x6d\x53\xcd\xac\x07\x83\x44\xdc\xc0\x0c\x1f\x23\x26\xbb\x7d\xd0\xdf\xbe\x74\x70\x8d\x5d\x8a\x40\xa4\xcc\x33\xb1\x2a\x55\x8f\xcb\x0a\xa1\x1c\x43\xc3\xb9\xad\xec\xb5\x7e\xc1\x8f\xcd\xb8\x08\x65\x93\x0a\x18\xcd\xeb\xc6\x34\x38\x78\x72\x78\xf8\xaf\x83\xa4\x30\xd5\x55\xe5\x35\x55\x37\xd3\x8c\xf1\x22\x32\x70\xef\xd3\xf9\x7d\x6d\x0f\x68\x30\xc6\xc7\x89\xaa\xf8\x4a\x39\xd7\x73\x98\xf8\x9b\xbb\x91\xd1\xe7\x1d\x27\x91\x55\x83\x36\xbb\x2e\xaf\xf0\xbe\xb9\x61\xf9\xaa\x60\x57\xdb\x32\x8b\x2f\x9c\x0f\x1d\xca\x2e\x73\xfd\xfd\xea\x0d\xaf\xf5\x2d\xaf\xe7\x7d\xed\x1b\xe5\xa5\xcd\xa7\xb1\x87\x02\xfe\xc4\x8c\xb3\xac\x23\x01\xdb\x9c\xdf\x7f\xd7\xc1\x9e\xcd\xbf\xb1\x6d\xdd\x63\xf7\x6d\x9d\x7e\x7b\x6e\x4a\x7f\xed\xe7\xbc\x6b\xff\x92\xaf\xc4\xd8\xd5\xfd\x9c\xbd\x7b\xce\x2c\x28\x97\x93\x7f\xc2\xfc\x2c\x3d\xce\x24\xa2\x8a\xba\xc4\x4f\xf8\x45\x4e\xf7\x6e\xac\xaf\xd2\x63\x63\xc3\x65\xe8\x38\xde\xc1\x3a\x24\x0f\x7a\x9c\x7a\xde\xaf\x5f\x00\xcc\x69\x7a\x81\xb3\x14\x9d\x16\x9f\x89\xd8\x4d\x21\xd1\x9c\x39\x41\xad\xf6\x90\x24\x3f\x0c\x83\x7d\x32\x89\x34\x58\x99\x83\x45\x3e\x5e\x7b\x25\x48\x55\xac\x16\xbc\x0c\xe0\xa8\x23\x50\x5c\xd9\x3e\xcd\x41\xdb\xbb\x77\x17\x6f\x99\xc6\xf6\x26\x2c\x37\x9b\x1b\x8a\xa8\xe1\x16\x4c\x38\x17\x25\x4b\x00\x09\x47\xed\x41\xb6\xed\x95\x42\x4b\xee\xaa\xcc\xc1\x9b\x7a\x4a\xc8\x4b\xe5\xf2\xbc\x03\x32\x5e\xe0\x58\xa5\x4f\xb6\x4b\x63\x33\x1c\x59\xd0\x3c\x98\x37\x24\x27\x13\x79\x9c\x77\xbc\x5e\x95\x24\x42\xb1\x83\x0c\xee\x98\x1e\xb3\xaa\xc5\xa2\xa6\xcb\x25\x55\x3c\x73\xb0\xb9\x62\x1e\x9a\x8c\x71\xc0\x76\xe2\x97\xac\xd8\xea\x9b\xc9\xe8\x02\x2c\xcf\x0f\xcf\x7a\x99\x93\x15\x60\x19\x01\x68\x5e\x94\x98\x9f\x2c\x19\x2d\xa5\xcb\x88\x2e\x14\x99\x81\x5d\xda\xd8\x47\x33\x51\xd7\x5a\x7c\x45\x5f\xd3\x2d\x53\x7e\xdd\x4a\x2d\x8c\x35\x91\xd5\x6f\xb8\xfa\x75\x27\x6d\xff\xc9\x41\x9a\xbe\xd7\xcb\xf8\xad\xb3\x8b\xa9\x1b\xcd\x0a\x6b\x42\x3d\xc7\x68\xee\x53\xa5\xd8\xb2\x52\x26\x71\x84\x6e\x9f\xcc\x68\x8e\x4b\x8b\xb1\x39\xad\xc3\xa3\x99\xe1\x9c\x15\x8a\x9e\xe1\xb0\xc9\x49\x34\xb5\x49\xcc\xbf\x2d\xcc\x53\x3e\x8c\x4d\x6e\x31\x7b\x1c\xb5\x90\xe4\x93\xfd\xe7\xf4\x69\x8e\x06\xf4\x07\x72\x68\x1f\x02\x87\xdd\xdb\x48\x11\x33\x8a\x6e\xf5\x36\x2e\x79\x17\x1b\x1f\xf6\x83\xaa\xc0\x50\x8f\xee\x10\x93\xb8\xcb\xba\x6d\x33\xe9\x4c\x0b\x56\x2e\x50\x12\x38\x26\x9c\xfc\xe1\x84\x1c\x1e\x13\x3e\x99\xc4\xd1\x9d\x71\x9d\x77\xfc\x3d\xf9\x36\xda\x00\xa7\xea\x81\x58\x11\x0f\x93\x1a\x77\x15\xf8\xdc\x7c\x8a\x5e\xb7\x8e\x15\x4d\xdf\xa6\xfb\xee\x1f\xf3\xe2\x7d\xb9\x0b\x28\x6e\xf0\x9f\xe1\x06\xc2\x11\xff\xf3\x5c\x41\xbf\xfa\xd9\x36\x0f\x60\x4f\xa6\xec\xfe\xf7\x0e\x2e\x28\x5e\x3c\xf1\x23\xeb\x6e\x9d\x4b\xb1\xd1\x57\x8e\xeb\xa4\x7d\xdf\xe0\x20\x3b\x2e\x1c\xc7\x09\xda\x06\x5c\xeb\x99\x55\x23\x60\x15\xa7\x70\x1c\x36\x6e\x19\x18\xc0\xb7\xfe\x8a\xd1\xcf\x3f\xba\x64\x2d\x84\x22\x72\x49\x0b\x93\x1b\x83\x04\x03\xfe\xfa\x84\x4c\x4c\xe6\xf1\xcd\x0d\x2f\x58\xd0\x56\x8c\x49\x5c\x50\xa9\x2e\x51\xfe\xd6\xc3\xc0\x4c\xe3\x78\x4c\x47\x70\x79\x04\xb7\x85\x2d\x3b\x09\x99\x53\x97\xe9\xcb\xde\x38\x27\x27\xc4\x6b\x3b\xba\x6e\x10\x77\xf9\x60\x87\x10\xea\x67\x9a\x1f\xed\xbc\x75\xec\xba\x57\xa2\xba\x14\x1b\xef\x78\xe7\xa6\x37\x99\xd8\x9b\xe8\x01\x89\x70\x97\xe3\x1b\xe9\x86\xcf\x21\xa7\x7a\xb0\x2e\xc7\x0f\x1a\x7c\xb7\x9f\x5a\xb5\x92\x37\x53\x5a\x55\xd6\x2e\xde\xf8\x3e\xd6\x5d\xd8\x50\xb3\x83\x03\xf2\x23\x23\x7f\x59\x49\xe5\x90\xee\x21\xb9\x9a\x83\xbb\x57\xa2\x8a\xf3\x25\x8e\xf5\x61\xb4\x77\xc4\xaa\xca\xa9\x62\xb6\xa5\x40\x34\x0f\x84\x1f\xaf\x86\x41\x4d\x13\x08\x8c\x4b\x7a\x17\xa8\x99\xec\xdb\xa1\xc7\x87\x19\x09\x23\x88\x47\x4f\x29\x7f\xe8\xa2\xac\x82\xd6\x90\x72\xc9\xbd\x6b\x01\x35\x9e\xec\xa2\x80\x98\xc0\x7c\x19\x23\x39\x99\xd1\xf2\x72\x18\x0c\x70\x57\x73\xc7\x41\x6b\x35\x9e\xc6\x64\x71\x59\x15\x3c\x63\xc3\x07\x0d\xbb\x48\x07\x99\x4e\x9a\x23\x1b\x37\x7f\xf0\x68\x76\x21\xe5\xac\x4a\x4f\x3b\xb5\x27\x9b\xf0\xf0\x4d\x4e\x9a\x4d\x1d\xc7\xca\x33\xbd\x3f\x8f\x3b\x0a\x7d\x4a\x2c\x78\xc4\x3d\xc0\x63\x94\xc3\x5c\x1a\xc4\xfb\x29\xcc\x6d\xf2\xc3\x35\x8a\xf8\x97\x90\xec\xd6\x60\xf9\x1b\xc7\xbe\x40\x2f\xe4\xf4\x99\x56\x89\x19\x0b\xe8\xed\x2c\x34\x4e\x25\x1e\x51\xb1\x99\x07\xc1\x7c\xb3\xfb\x84\x6d\x28\xff\x27\xb1\xec\x34\x80\x85\x5e\x29\x38\x0b\xb1\xb9\x16\xd7\xa2\x1a\x1e\xf6\x1e\x20\xdb\xeb\xb4\x8d\x4d\x9f\x97\x5d\xfe\x91\x1d\xc3\xc0\x1c\x7a\xc3\xf6\x7d\xb9\x7f\x68\x9a\x11\xa9\xe8\x82\x91\x55\x45\x86\x00\xdd\x07\x3f\x15\xbc\x64\x23\x52\xb3\x82\x42\xae\x52\xeb\x79\x8e\x9a\x1a\xf0\xfc\xef\x69\xb5\xc2\x01\xd3\x05\x7b\x5b\xa5\xdd\x13\x78\xca\xf0\xbe\x60\xea\x1a\xae\xd3\x97\x65\xce\xee\x86\x1d\x21\x12\xf1\x3e\xf0\xf8\x21\x8c\x1d\xc3\x9e\xdc\x63\x25\x72\xb1\x29\x7f\xdb\xb5\x78\xae\x7b\xf8\xad\x57\xe3\xf1\x6e\x9d\x7e\x8f\xd5\xd0\x13\xd7\x74\xd1\x31\xf5\xfb\xcd\xfb\x15\x2f\xff\x36\x34\x70\x9f\xc9\xc1\x56\x7f\xb1\xe9\xfd\x8d\xb6\xb5\x31\x41\x34\x48\x34\x5d\xee\x25\xcb\x44\x99\x87\xbf\xd0\x32\xff\xac\xbb\x71\xc3\x2b\x76\x26\x4a\x05\x19\x9a\x76\x5d\x4b\x6d\xbe\x8b\x1c\x26\xe7\x84\x10\xab\x34\xbb\xb1\xd9\x62\xde\x25\x3c\x49\xc6\x69\x07\x91\xf7\xd3\xb9\xa8\xcf\x69\x76\xe3\xe3\xed\x71\x82\xf6\x8d\x47\x9f\x1e\x48\x68\x7a\x62\xb3\x24\x47\x2c\xb1\x7d\xcb\x4c\xa1\x80\xdb\x70\x8f\x10\x0a\x06\xf8\xa0\x1d\x8e\x4d\x73\xf1\xe3\x0b\x76\x1c\xfd\x60\xd8\xee\x03\x69\x33\x8e\xd7\x0f\x5d\x0a\x13\x0a\xcc\xc4\xfa\x70\xc4\x0c\x69\x7b\x1d\xbe\x58\x85\x79\x09\x6d\x06\xd8\x3d\x06\x42\xa6\x3a\x76\x0d\xa6\x70\x5a\x14\x61\x2a\xb2\x5e\x79\xca\xfc\xdc\x13\xfb\xd6\x37\x3c\xcf\xe1\xa6\x77\xb4\xda\xdc\xf8\xfe\xf1\x78\xad\x96\x5b\x78\xe9\x2d\x5f\x9c\x08\x7d\x3d\xdc\xb4\xb5\x4a\x34\x27\xe6\xea\xd2\xfe\x18\xde\x34\x62\xae\x12\xbb\x03\x19\xd6\x58\x3d\x17\xf5\x92\x50\xa2\x2b\xa7\x7d\xd0\xc1\xdb\x5d\x62\xa2\x8b\x9c\x70\x08\x44\xbb\x51\xaa\x3a\x3a\x38\xd8\x6c\x36\xd3\xb5\x7a\x72\x78\x38\x2d\x99\x3a\xc8\x45\x26\x0f\xd6\xea\x9b\x27\x87\x93\x7a\x79\xf0\xfc\xfc\xec\xea\xfa\xf2\x7f\x5c\x7f\x33\xf9\xfd\x9e\x7b\xca\x0e\xbb\x4d\x0e\x07\x07\x04\xbf\xf8\x1b\x12\x51\x0f\xcc\x18\x79\xdd\x18\xe5\x3d\x73\x38\xfe\x08\xf9\x46\x37\xa1\xec\x20\xca\x70\x29\x66\x2b\x65\x13\x5c\xc0\xee\xa2\xfa\x00\x7c\xb5\x40\xea\x6f\xf5\x17\x42\xaf\x03\x10\x29\x2a\x80\x6c\x0e\xc8\xf0\xb3\x1d\xc4\x9f\x21\xd2\x03\x72\xbe\x43\xa7\x32\x80\x6a\x30\xd0\xda\xf1\xa8\xc6\x98\x04\x5b\xdd\x40\x20\x2d\x57\xa0\xcb\x29\x07\xca\xe4\xf4\x64\x6c\xe9\xb4\x39\xe8\x2d\xc0\x72\x42\xcb\xed\xe6\x86\xd5\xac\x23\x65\x7e\x4f\xb0\xe9\xfe\x64\xde\xac\xeb\x73\x55\x42\xc2\x38\xb2\xa4\x25\x32\x35\xec\x4e\xcb\x22\x5c\x81\x93\xc2\xd6\xa4\x20\x87\xf0\x25\xd4\x25\xc5\x53\x9f\xf6\x64\xdb\x5b\x2b\xab\xb7\x59\x76\xee\xf3\xd8\x6c\x34\x93\xa9\xad\x36\xeb\x1a\xed\xb7\x3b\xba\x16\x8f\x4a\xd5\xcd\x90\x90\xd7\x62\xcd\xc2\x1e\xe7\x26\xe9\x9b\x39\x5e\xa0\x22\xb2\x29\xb6\x01\x8b\xcd\x7c\xd0\xc2\xbd\x51\x2d\x82\xb2\x69\x4e\x4a\x41\x96\xa2\x66\x41\x22\x6f\x5a\xb3\x1e\x46\x71\xd3\xa3\xb9\x2a\xd3\x1c\x80\x73\x9e\xd8\xe9\xa4\x05\x85\x60\x59\x23\x45\xea\xe1\x31\x40\xc7\x27\xf5\xa9\xc7\x84\x3f\x7e\xdc\x52\xf6\x46\x1a\x54\xeb\x32\xd1\x78\xe7\x42\x84\x8f\xd5\xb2\x6c\x57\x74\x2f\x5e\x88\xb6\xea\xf4\xa9\x07\x07\x86\xc6\xdc\x7e\x66\xce\x35\x22\xf2\x88\xd0\x34\xf0\xa7\x6b\xbd\xf2\x67\x7f\xba\x9e\x9a\xf5\x08\xdd\x2c\x7a\x78\x3b\x1c\xb7\x08\x22\x1c\x74\x3f\x6f\x93\x6e\x47\x0a\xdf\xcb\x0e\xba\xd2\xec\x4d\x48\x58\xd6\xed\x27\x49\x5c\x73\x5e\x27\xa8\xab\x55\xa5\x2f\x85\xd9\xbe\x7f\x3b\x12\xbb\x9f\xae\x7e\xb7\xa6\xfe\xcb\xd2\x59\xb2\x8d\x26\x93\x0f\xd1\x80\x76\x55\x09\x55\x41\x9a\x4a\x1c\x53\x53\x21\xcc\x4b\xc5\x16\xde\x28\x45\xfe\x93\xd5\xc2\x38\xd3\xfa\x0a\x7b\xfc\x03\xdb\x9b\x11\xce\xff\x8b\x2f\xaf\xf3\x6c\x1a\x35\x96\xeb\xfe\x5b\xe2\x47\x62\x54\x54\x20\x57\x80\xfb\x56\xe0\x7c\xb5\x7b\x4b\x5a\x6d\x1c\xc6\xf5\x93\x3e\x53\xcd\x2d\xda\xe3\x5d\xfb\xbd\x20\x6c\x3e\x67\x99\x32\xf1\xc6\x35\x43\x00\xcd\xfb\xb4\xb3\xcf\x19\xcb\x6c\xe3\xa9\xea\xf2\xae\xfd\x9c\xb3\xd5\xb1\xef\x5c\x4b\x7a\x17\xf3\x61\xc3\xc3\x8d\xeb\xbd\x9d\x3c\x19\x3d\x68\xec\x6a\xc7\x5e\x8d\xd3\x22\x20\x44\xeb\xda\x8b\xa5\xcf\xcc\x03\xde\xbf\x43\x44\x68\x51\x6c\x28\xd2\x35\x0c\x8a\x5d\x0e\x69\x64\x55\x45\x7c\xae\x1b\xe2\x58\xbf\xf5\x98\x67\x1e\x34\xd1\x34\x79\x60\xaf\x0d\xd0\x89\xc4\x03\x0e\x9b\xce\xd6\xac\xde\x5a\x0b\x2f\xf9\x57\x37\x56\xb0\xb3\x8e\x88\x75\x46\xb4\xcd\xeb\x66\x9c\xae\x5b\x56\x2c\xc3\x4c\xc2\xb6\x98\xa8\xc9\xa1\xb9\xa0\x4d\x8b\x5c\x92\xaa\x16\x6b\x9e\xb3\x1c\xed\x6d\xc0\xdb\xe8\xb7\x0c\xac\x68\xf3\x95\x5a\xd5\xcc\x98\xb0\xac\x3f\xb1\x6e\x7c\x49\x56\x55\x34\xee\xc4\xd3\xc8\xee\xb8\x44\x1f\x70\xf7\x06\xc0\x63\x31\x06\x2c\x8e\xe6\xbe\x3c\x30\x39\x8d\xd5\x0d\x55\x9d\x57\x98\xa8\xd4\x07\x98\xab\xcf\x47\xeb\x56\xf6\x17\x7f\xaf\xb9\xdf\xec\xc4\x57\x92\xcd\x57\x85\xcd\x4b\xab\xbb\x99\xf3\xa2\x00\x03\xde\x4a\x11\xc8\x22\x17\x8d\xb3\x23\xf5\xb2\x5e\x85\xbd\x8a\xcd\x96\x40\x19\x52\x9c\x9b\x80\x3f\x70\x38\x9f\x93\x60\x6e\x1f\x3f\x22\xed\xe9\xaf\x9b\xe0\x68\xc1\xa6\x1f\x1b\x29\x06\xe0\x4e\xb0\xbc\x26\x3b\x41\x68\x8b\xee\x34\x07\x62\x5b\xc7\xff\x4e\xc8\x13\x32\x21\xc3\xa1\xfb\x6b\x44\xfe\x95\x6c\x46\xe4\x31\x01\xbe\x23\xba\xc8\xa1\x4c\xc0\x8e\x35\x59\x0f\xfd\xe9\xf1\x09\x69\xb8\x9a\xba\xc7\x62\xc8\x1b\x7a\xf1\xf6\x21\x42\xaf\xd3\x08\x9f\xc0\x24\xab\xd7\xe2\xa3\x35\x72\x8a\x79\x10\x22\xe4\xa1\x5d\x6c\x3a\xe1\xa6\x51\x14\x19\x0d\xd4\xf7\xb0\x9c\xac\x4a\xc5\x0b\xcf\x1e\x67\xb4\x68\xa1\x8c\x39\x37\x51\x55\x93\xab\x64\xaf\x98\xeb\xd8\x8e\x0d\xa4\x28\x29\x2d\xf0\xd0\x5e\x38\x03\x5b\x2f\xc2\x1e\x0b\x71\x81\xd6\xca\x97\x82\x4f\x9f\xe1\x12\x76\x4d\x6f\x91\x19\x0d\xf8\x81\xe7\x2f\x7f\x70\xd0\x37\x54\xc6\xf4\x6c\xd2\x25\x36\xd7\xe2\x4f\xd7\xaf\x5f\x3d\xe7\x6b\x13\xc8\xfe\x89\xe4\x7c\x8d\x01\xdd\x7c\x6d\xb3\xcd\xef\x68\x69\xc7\x32\xe4\x2c\x13\x75\x23\xbe\x28\xe7\xeb\x30\x9c\x9e\xaf\xb5\x70\x9d\xf3\x75\x3a\x60\xdb\xb6\x00\xd5\xf6\x63\x71\x61\xde\xc3\x96\xfe\xa3\x95\x57\x71\xd4\xa3\x2d\x88\x86\xdb\xd5\x14\x06\x9a\xf7\x68\xc9\xb9\x7f\x87\x3c\x4a\x47\xa3\x2e\x73\x62\x77\xc3\x01\x0a\x6c\xab\x25\x07\x2c\xbb\xb7\x3a\x58\x80\x3b\xeb\x23\x8a\x6c\xa8\x2a\x02\xc7\xc9\xb9\xc8\x56\xce\x1c\x08\x7f\x04\xca\xc0\x48\x23\xe5\x22\xc2\x5b\x5d\x04\x41\xfa\x71\x40\x72\x1c\xa2\x1d\xb4\xd5\x42\x6d\x6e\xb5\xd9\xc6\x82\x1e\x45\xda\xbe\x4e\xb8\xe4\xae\x1d\xd9\x09\xcf\x1c\x2d\x8b\xc5\x83\xe8\x50\x81\x7b\x14\x92\x44\x1d\x00\x26\x99\x8a\x32\x13\xa5\x5e\xef\x25\x2b\x57\xcd\x14\xfa\xc6\x8b\x1b\x59\x0f\xe2\xb1\x83\x44\x09\x51\x6d\xb6\x57\xf3\xe7\x87\x68\x3b\x9c\x3d\x98\xb1\xf2\x7b\x4c\x5a\x9d\x1a\xe2\x95\x2b\x80\xea\x19\x5f\x61\x4a\xf3\xfc\x7c\xcd\x4a\xf5\xca\xa4\xa7\x35\xf1\x71\xb9\xd8\x94\x83\xb1\x1d\x43\xcf\x4a\xab\xea\xde\x55\xf4\xc2\x37\x2a\xb5\x26\x20\xca\x60\x73\xf5\x8b\x8a\x85\x61\xa1\x76\xf5\x60\x76\x7e\x00\x54\x6c\x61\x1e\x44\xf9\x42\xff\x89\x21\x3c\xc1\x62\x8e\xe1\xd9\x42\x9a\x3a\x38\x20\xd8\x08\x5c\xb3\x6e\x3d\xd0\xd7\x47\x5a\xe7\xa0\x60\xd5\x29\xa0\xb1\xbc\x78\x61\x70\x35\xb2\x95\xc4\x56\x4c\x05\xc4\x21\x9b\xad\x66\x88\x98\xd2\x7f\xf9\x5b\x88\xbc\xfa\x1d\x46\x15\xe1\xb0\xf7\x6c\xda\xda\xfc\x3e\x8b\x36\x2b\x56\xf5\xfe\x35\x03\xa2\x1d\x79\xf7\x1e\x69\x42\x30\x1b\x87\x20\x03\x54\x33\xf3\xfa\x0c\x07\x18\x74\x89\x14\x02\x7e\xda\xfa\x68\x18\x0b\x8d\x73\xd6\x1e\x0e\x8c\x74\x32\x29\x45\xce\xde\xc1\xaa\x9e\x7c\x05\x1d\x7e\xf5\x9e\xfc\x35\x88\xfc\x1d\x10\x32\x13\x77\x13\xf4\x6b\x3f\x22\x08\xb6\x3a\x99\x89\xbb\xe3\x46\xa1\x46\x3e\xdf\x23\xa2\x6a\x5a\xca\x8a\x82\xe0\xf5\x90\x2f\x2b\x51\x2b\x5a\xaa\x66\x35\x6c\xcf\xf8\x53\x3e\xad\x5a\xcd\xe2\x77\x98\xc9\x11\x91\xa2\xe0\x79\x54\xe2\x53\xf8\xc7\x74\x93\xc1\x7c\x9a\x13\x30\xaf\xed\x11\xe1\x65\xc1\x4b\x36\x99\x15\x22\xbb\x6d\x74\xa4\x57\x69\x42\x0b\xbe\x28\x8f\x48\xc6\x34\x67\xd1\x28\x60\x86\x98\xd1\x22\x1b\x86\xa1\xa3\x31\xe0\xc9\x88\x7c\x4d\x9e\x8e\x1a\x55\xa1\x53\xeb\xba\x95\xac\x6b\x43\x12\x3a\xa7\x76\x54\x0b\xa1\x9a\xf3\x4a\x0f\x01\xbd\xc3\x5a\x07\xbd\x13\x76\xe5\x78\x4f\xa3\xa1\xcf\xd9\x9e\x56\x43\xa4\x95\xae\x66\x91\xec\xc4\x7c\x2e\x99\xd2\xa4\x72\x44\x0e\x7b\x15\xad\xc5\xa6\xbb\x28\xa6\xb2\x8d\xa2\xac\x8f\xc8\xe1\xf4\xdf\x64\x47\xf9\x56\x9c\xf0\x11\x10\x40\x9f\xd2\x26\x3a\xf8\xc8\x4a\x0e\x7d\xea\x18\xf2\xdd\x1d\xa9\xdc\xbd\xf9\xff\xbf\x5b\xb6\x9d\xd7\x74\xc9\xa4\xb1\x7a\x34\xe8\x00\xa4\xd7\xbf\x12\x51\xd1\x8c\xab\xed\x11\x79\x32\x3d\x3c\x26\x9f\x1a\xf4\x2d\xc2\x12\x87\xad\x12\xf1\x41\xf2\xeb\xd9\xec\x8b\x96\x7c\x89\x69\xc8\x4b\xba\x64\x47\x38\xa0\xe3\xae\x32\x7e\x33\xc2\xb9\x27\x76\xab\x79\x64\x7c\x13\x5c\x31\x2c\x32\xc9\xc4\xaa\x54\xfa\x10\xcf\x79\xc9\x15\xeb\xac\xa1\xf8\x92\x97\x8b\x89\xbd\xdf\x8f\x08\xa3\x92\x4d\x38\xa4\xce\xe8\x1e\x29\xaf\x99\x29\xee\x4c\x2b\x8d\x1d\xf1\x0f\xa8\xbf\x7c\x6f\x18\xcd\x8d\x87\xd3\xd9\x0d\x2f\xf2\x21\x6c\x75\x68\xb7\xf4\x78\xd5\x7b\xaf\xee\x9c\xaf\x83\x4e\x42\xa4\x6b\x9e\x93\x13\x32\x80\xd5\x3b\x72\xd9\x14\x4c\x84\x61\xb2\x02\x80\x75\x7e\x4f\xc1\x63\x69\x10\x5c\xf5\xe9\xd2\xf8\x50\x64\xc8\xd5\x06\x8f\x84\xe5\xa6\x8f\x08\x9d\x49\x51\xac\x1a\x4b\x52\xb0\xb9\xea\x75\x23\x46\x5f\x9b\x17\xc0\x28\xde\x7b\x25\xaa\x5d\x6d\x9a\x9b\x72\x67\xa3\xb5\xd8\x34\x1a\x75\x2f\x40\xfb\xea\x37\x77\xe6\x8e\x09\x44\xc5\xef\x7d\x8d\x4f\x36\x6c\x76\xcb\xd5\x04\x9e\x43\xb3\x9a\xe6\x1c\x8e\x5b\xaf\x26\x79\x72\x78\xb8\x94\xf0\x60\xd0\xf8\x01\x9a\x2c\xc5\x2f\x9f\xd5\x46\xca\xd2\x8d\x88\xb1\x5d\x76\x6e\xcc\x5e\x18\x4b\x00\xf7\xb5\x90\x77\x46\x72\x76\x30\xf1\xe1\x11\x6a\x92\xa7\x37\x14\xdf\xb0\xd2\xe6\xa4\x6c\x60\x8e\x0f\x08\x97\x44\xcc\xe7\x64\xc3\x48\xcd\x7c\xa8\xf4\x0d\x97\x84\xe1\xf9\x22\x78\xc4\x8b\x2d\x36\x86\x2e\xf3\x2d\xdc\x0c\xc8\x7f\x4b\x28\x81\x24\x73\x53\x82\x8a\xba\x25\xbd\x65\x92\x9c\xdd\xd4\x62\xa9\xf9\x51\x29\x32\x8e\x3e\xaf\x07\x07\x44\xae\x66\xa8\x46\x31\x08\x40\x9a\xe9\xb6\xbc\xa9\xc1\x51\xb6\x5e\x35\xc8\x78\xb0\x7a\x4a\xc8\x15\x2f\x33\x86\x20\x8f\xd0\x48\xf4\x5d\xcf\x85\x92\x8a\xb1\x9a\x0c\xc1\x12\x4a\x32\xbd\x30\xa3\xd8\x7f\x51\x33\x54\x63\x3f\x01\xdd\x6f\x83\x31\x46\xdd\xa2\x71\xf1\x0f\xab\x81\x52\x12\xfe\x9a\x42\x15\xac\xf7\x52\x0d\x74\xbf\x37\x34\xbb\x45\x53\x2c\xd7\x3f\x80\xfe\xbc\x60\xb4\x64\x52\x91\x0d\xdd\x92\x97\x24\x13\xab\x22\x27\x73\x0e\x0e\x8b\x21\x4f\xf0\x0c\xc7\xff\x39\xb7\x5d\xbb\x81\xe8\xd2\xc3\xe7\x32\xaf\xe9\x62\x12\xaf\xd5\x60\x57\x0b\x9f\x79\xaf\xc1\x15\x34\xf9\xfd\xef\x1b\x4c\xcc\xfe\x4b\xe4\xc9\x61\xa3\x8a\xbd\x2d\xf0\x43\xea\x01\x49\x53\x7f\x7b\x2e\x1d\x88\x7c\x9d\xe2\x1b\x21\xef\x22\x69\x27\x10\x22\x23\xe1\x70\x00\x84\xae\xff\x91\xcf\x0a\xf3\x6f\x3d\xfc\x84\x27\x15\xd0\x55\x80\x62\xdb\xb5\xea\x2d\xb1\x07\x2a\xc6\x72\xa8\x6f\x20\x7c\x87\xee\x57\xd3\x2f\x62\xcf\x7a\x1d\xae\x57\x3b\x47\xb0\x5b\x64\x6c\x0b\x8d\x4d\xad\x8e\xf5\xfc\xea\xf0\xfa\x62\xea\x92\xad\x59\x2d\xd9\x0f\x3c\x67\x62\x88\x22\x5f\x7a\xab\xa1\xe5\x4e\x3f\x40\xd4\x79\x5e\xb2\xbc\xa6\x9b\x6e\x20\x97\x3f\x5d\xbf\x7e\xe5\x1c\x52\xc0\x6c\x00\x19\xeb\x28\x2f\x1b\x0a\xca\xe7\x17\xaf\x89\xe6\x17\xda\x18\x2f\xa0\xed\x34\x2d\xec\x0f\xb1\xb7\x25\x77\xc7\xd7\xbb\x9d\x8c\xfd\xd9\x40\x5b\xd6\x84\x33\xd9\xe9\x69\x81\xea\xb5\x7d\xbe\xd1\x6e\x25\x77\x2c\x92\xb9\xa6\x0c\x4c\x37\xea\x86\x6b\xb1\x21\x60\xa3\x8b\xac\x38\x70\x59\x23\x4e\xbe\xb7\x23\x5d\x8a\xcd\x1b\xb4\x11\xd5\xa8\x05\x9f\xd3\x8c\xc1\x73\xc2\x8c\xcf\xa9\x1e\x0a\x59\x49\x0c\xe4\xe2\x70\x25\xcf\x99\xca\x6e\x30\x64\x40\x94\x24\x67\x08\x44\x0e\x4b\xb0\x45\x57\x00\xa8\x09\xfe\x5f\x4a\x90\x35\x67\x0e\x03\xe5\xfa\xe2\xf9\xc5\xb0\x5e\xf0\x32\xa7\xa3\x23\x72\x26\x4a\x09\x5d\x4b\xba\xe6\xe5\x22\x74\xea\x84\xd6\xa9\x24\x43\x98\xa5\x14\xab\x3a\x63\x63\x44\xce\xc9\x50\x49\x30\x02\xa7\x65\xca\x51\x85\x9f\x89\x52\xb2\x7a\xcd\xc8\x92\x2d\x45\xdd\xd2\x7d\x3b\x2b\x13\xac\x0b\x4c\x0f\x72\xbb\xa3\x4d\xc9\x2d\xd8\x98\x18\xb0\xb4\xbc\xe9\x4f\x6b\xed\x4b\x68\x5d\xe9\x74\xd0\x27\xe4\xa2\x9c\x18\x18\x69\x98\x02\x38\x27\xd1\x62\x43\xb7\xd2\x80\xd0\xfb\xb6\x20\x12\x44\x2a\xdd\x35\xcf\x98\x9c\xb6\xe8\xd7\xa9\xea\xf5\x78\x07\x77\x9a\x61\x1c\x38\x36\xc1\x1c\x08\x30\x3c\x9a\x1c\x3d\xb5\x7e\xe0\xc1\xf1\xae\x46\xd8\x99\xdd\x44\x7f\x29\x36\x46\x5f\xe8\x28\x11\x56\xc1\x87\x80\xe1\x6a\x7d\xbb\x33\x8c\x24\x30\xf7\x26\xcb\xbd\x83\x46\xde\x7b\xf5\x10\xac\x0e\x78\x0b\x93\x13\xb3\x1f\x3b\x23\x9f\x8e\x3b\x90\x96\xf4\xfa\x9e\xd6\x35\xdd\xbe\x0b\x9a\x7c\xdf\x75\x5a\x42\xd2\x89\x4f\x0b\xe0\xf8\x04\xe1\x73\xbf\xd9\x89\x89\x86\xe0\x4f\x8e\x33\x48\xae\xa4\x66\xe9\x30\xa2\xce\x10\x75\xb5\x45\xcf\x45\xdd\x94\x4f\xad\x63\x5d\xbc\x6d\x62\xf4\x4e\x6a\x47\x6a\xed\xa2\x76\x60\xaf\xa0\x84\x9e\x9d\xa7\x7d\x4b\x9f\x4d\x97\xf2\xcf\xa1\x7d\xdb\x56\xe3\x08\xa4\x69\xbf\x39\x7c\x56\xe6\x3b\x07\xaf\xbf\x8b\xf2\x57\x0f\x3c\x05\xca\x42\x4e\x89\xe4\xe5\xa2\x60\x36\x7d\x41\x70\xdc\x1c\x39\x21\x30\xb6\x69\xd7\xd2\x91\x1b\x84\x26\x27\x42\x5e\xf1\x92\x99\x6b\x60\xc6\x48\xc9\x36\xe8\xb2\xcf\x0a\xbe\xe4\x8a\xe5\x63\x64\xbe\x4b\x41\x54\x4d\x39\x98\xad\x4d\x99\x5e\xe7\xd7\x70\x8c\x51\xe6\x23\xcd\x6e\xb3\x32\xf7\x56\x68\x8c\xd3\x7b\xf7\x7e\x97\x19\x98\x95\x79\xe4\x83\x87\x80\x94\xde\x98\xe0\xaf\x0b\x63\xfc\x25\xba\x59\xcc\x39\xa0\xcb\x85\xea\xdb\xc0\x3d\xdd\x34\x0d\xc6\xe9\x47\x8f\xc8\x43\x28\xba\x60\xde\x03\x74\x38\x00\xad\xa3\xf5\x5d\xf3\xf9\x00\x5c\xeb\x83\x9f\x0c\xaa\x2b\x98\x9b\xcd\x36\xe9\xaf\x7f\x11\xbc\x1c\x0e\xd2\xe8\x77\xbb\x4f\xbc\xc7\xe4\xfa\x6f\x72\xce\x77\xbf\x6a\x18\x9d\xab\xd7\xe5\x1f\xe0\x8c\x27\xce\x59\xcf\x03\x86\xeb\x72\x8f\xc7\xad\x79\x36\x82\xc7\x6d\x17\x79\x43\xa9\xe0\xd1\x69\x92\x77\x27\xbd\x09\x45\x8b\x46\x38\xb6\x8d\xfe\xa6\x79\x5e\x33\x89\xb8\x9e\x66\xf9\x34\x49\xe0\x57\xd8\xf4\xe6\x52\xb7\xf0\xe4\x7e\x23\x92\xcd\xc4\xb2\x5a\x29\x23\x79\x1b\x64\xd6\x70\xef\xeb\x16\x67\xed\xa8\xae\x1d\x7d\x8e\x13\xea\x8f\xa5\x1d\x84\xf9\xf5\x81\xe7\x6b\xc5\xe6\x3c\xee\xe0\x08\x1c\xe7\xd0\xce\xaa\xe3\x24\x06\xb8\x12\x4a\xb6\x31\xac\xa6\x66\x61\x41\xbc\x45\x17\x28\x1f\xec\xd8\x84\x4f\x6a\xee\x03\x78\x0a\x97\xc5\xd6\x45\xf8\x6f\x28\xe0\x0f\xd0\x3c\x37\x29\x7c\x6c\x97\xe6\x12\xd2\xe4\x4b\xc8\xf7\x42\x71\x50\xad\x50\x88\xbe\x43\x2f\x96\x0d\x1e\x5a\x69\x86\xe2\x81\x12\x4d\x98\x8f\x19\x4a\xc1\xa5\xb2\x4b\x8e\x21\x51\xd6\x45\x4b\x37\xa5\xb9\x40\x0e\x9e\x5d\xb8\x39\xfa\x44\x0d\xed\x23\x65\xe2\xb4\x48\x65\xb2\x17\x80\xb2\xc6\x79\xf4\x86\x2c\x90\xc9\xd3\xa5\x6e\x78\x79\xeb\x33\x76\xe1\x8c\x66\x05\x2d\x81\x47\x27\x52\x2c\xd9\x06\x5d\x1a\x0d\x58\x38\xe2\x54\x63\x7f\x21\xca\xc2\x98\x14\x42\xdc\xa2\x48\xa0\x85\x7a\x0c\x4c\x1a\x45\xcb\x69\x28\xda\x39\x9c\x55\x74\x0b\x17\x65\x69\xaf\xc3\xb5\xb1\xf1\x5f\x8b\xea\x00\xe3\x45\xc7\xfa\x9d\xce\x18\x8c\x50\xde\x88\x55\x01\x57\xdb\x4c\xdf\xb2\x7a\xe2\xb6\xa7\xe1\x48\x0f\x30\xa3\x12\x80\x2c\xf4\x78\x41\x5a\xd9\x80\x8a\x68\xa9\xfb\xa8\xfd\x48\x9c\x96\xcd\x3e\xdb\x56\x11\xc3\x72\x42\xad\x43\x34\x39\xb4\xdb\x81\x6e\xd2\x98\x95\x98\xe5\xc4\x3e\xde\x69\xf0\x98\x34\x6c\x03\x9c\x44\x20\xd0\x7d\x3e\x68\x41\x98\x72\xec\xb3\xeb\xb0\x1b\x3c\x08\xc2\x65\xdb\x33\xbd\x7d\x44\x8c\xa3\x01\xa8\xa4\xbb\x42\xc0\xdd\x71\x73\xed\xb6\x78\x09\xe3\xdd\x0f\xe3\x68\x71\x12\xb5\x1f\x48\xa7\x9e\x0d\xc5\x1b\xc3\x3b\xe8\x33\xd2\xd2\x36\x35\xab\xea\xfb\x1d\xae\xec\xc1\x60\x14\xd4\x73\x34\x7e\x62\x67\xf5\x98\xf0\x18\x84\x00\xa1\x0e\x56\xf2\xe6\x52\x6c\x86\xb5\xd8\x8c\x22\x20\x6e\x76\xa7\x6a\x8b\x4f\xb1\x73\xf1\x3a\x63\x75\x1d\x04\xb9\x6b\x29\x08\xd0\xdb\x0b\x9d\xe0\x6a\x99\x49\x61\x97\x9e\x04\x7a\xa2\x26\x90\xd0\x9f\x3a\x8a\xcc\x93\x57\x46\x40\x3f\x2f\xf3\x18\x41\xc7\xfa\xa4\xc1\xf7\xe7\x62\x63\xa3\xfb\x3e\x3d\x88\x60\x2c\x35\x61\xfd\x61\xcf\xe2\x8c\x02\x3c\x85\x1e\x84\x88\xa0\x18\x81\xc2\xe9\xd4\xa8\x3c\x1b\xd8\x9a\xae\x41\x44\x5f\x88\x9e\xe2\x42\x64\xfa\x8a\xf7\xb0\x10\x18\x0d\xed\x19\x9a\xc4\x33\xac\x6f\xea\x12\x92\x3a\x35\x2f\x76\x9b\x71\xa7\x66\xd9\x36\x2b\x4c\xb3\x39\x66\x1f\xfe\xe1\xda\x3c\x90\x52\xaf\xaf\x90\x8c\x6c\x6e\x78\x76\x03\xda\x8f\xbc\xb6\x19\xd8\x66\x5b\x5d\xd0\xe4\xa2\x92\x51\xfa\x42\xfd\xcd\xf1\x82\x4b\x5a\xf2\x6a\xa5\x19\x31\xc3\xfc\xf8\xc7\x77\xe4\x9c\x22\xf1\x61\xd5\x37\xd8\xd8\x44\x1b\xe9\x3b\xb8\x00\xf1\x22\x56\xb8\xf8\x16\x48\x0d\xe1\x4e\x30\xac\x25\xcd\xad\x78\x02\x8f\x0d\xbc\x81\x9b\x40\x59\x23\xe6\x73\x64\x16\x24\x73\x3c\x1c\xaf\x5b\x4f\x06\x67\x7a\x14\x35\x9b\xaf\x8a\x62\x8b\xef\x0d\xde\x65\x2c\x27\x52\x10\x8a\x37\x37\xaa\x64\xe6\x56\xa7\xef\xd9\x8f\xae\x9b\x51\xef\xd7\x4b\xc7\xc6\x22\x1b\xea\x94\x58\xf7\xba\x47\xf5\x95\x9f\xac\xa4\x84\xef\x20\x67\x52\xf1\x92\x9a\x4c\xb5\xa6\x9b\x1d\xd7\xae\x7b\xb1\xc2\x4b\xd7\x8d\x79\x8c\x03\x1a\xdb\x2e\x9a\xb2\x57\x4c\xf9\xcc\x3d\x4a\xcd\x06\xda\xe1\x3e\xf8\xaa\x40\x61\xd3\x76\x00\x8a\xe2\x5c\x8c\x41\xe0\xb3\x97\x8e\x5f\xc9\x6f\xe3\xf1\x78\x8f\x61\x57\x04\x6f\x09\x06\x50\x0d\x76\x79\x1e\x9b\x4b\xbc\x89\x8a\x65\x2b\x9b\x72\x61\x55\xdf\x65\x58\xf9\xc1\x83\x64\x2c\x72\x20\xa2\xee\x54\x12\xbf\xec\x0a\x20\xbe\x34\xcd\xa5\x39\x1a\x7b\xd6\x77\x6a\x77\x2c\x85\x69\xde\x89\x01\x23\x0e\x22\x0a\x1c\x94\x96\x48\x64\x42\xcf\x81\xac\x23\xa9\x08\xa8\xec\x32\x60\xf3\xdb\x5c\x7c\x46\x4b\x84\x82\x0a\x8e\x49\x68\x57\x43\x85\xa9\xe1\xdc\xc2\xeb\x69\xa8\x19\x9a\x8c\x96\x03\x45\x72\x06\xce\xd0\x9a\x2f\xb5\x60\x2a\xe6\x0f\xa6\xb2\xd1\x38\x60\x7d\xe0\xdc\xea\x96\x4a\xe1\xc1\xb1\xec\x6a\x35\xb4\xab\x5d\x07\xd1\xeb\x8c\xf6\x1d\x42\xab\x9e\x31\x0b\xd8\x28\x85\x47\x09\xbd\x0e\x8d\x77\x3f\xde\xb8\xd7\x37\xe1\xe5\x6b\x87\xb7\x37\x04\x3c\x20\xa1\xb4\xc2\x63\x1c\x74\x12\xb8\xe0\xdb\x34\x7b\xc1\x08\x3e\x7e\x8c\x0e\x99\xf7\xb6\xec\xc1\x04\xdd\x47\x89\x62\x02\xf7\xbd\xa2\x92\xbf\xef\xe6\x4e\x22\x7c\xe6\x37\x35\x07\x66\xdb\xe7\xce\xec\x14\x41\x6a\x26\x2b\x96\x79\xc4\x64\x70\x64\xc3\x6b\x03\xc8\x7b\x53\xd3\x8a\x62\x06\xd5\x25\x58\x4a\x20\x16\x04\xf5\xd2\x39\xa2\x5d\xc2\x23\x02\x0f\x43\xa7\xd4\x63\x09\x0f\xe2\x2a\xe6\x73\x07\x55\xd3\x78\x70\x02\xd2\xb7\x01\x83\x61\x1e\x18\x7f\xf8\x60\x5a\x5c\x92\xaf\x4b\xa1\xbe\xd6\x6f\xb4\xcd\xf1\x6f\x5c\xfe\x33\x33\xd4\xb7\xe6\x01\xf1\x4e\xf4\x23\x2b\x25\x70\xf3\x96\x51\x35\x30\xe0\x74\x5b\xb1\x1a\xd4\x0c\x6d\xe3\x31\x79\x47\x81\x00\xc1\x08\x94\x20\x95\x5e\xea\x3d\xd4\x07\x65\x92\x4e\xfe\xee\x0a\xbe\xb0\xb4\x73\x18\x5c\xcd\xb5\x85\x3f\x2e\xf8\x6c\xba\xc9\xa6\xf6\x17\x13\x09\xf0\xc0\xa1\x88\x85\x4d\x7c\xeb\x2a\xb6\x22\xe9\x5c\xe0\x78\xb0\xa9\x8f\x1e\xf5\x0a\x10\x6d\x86\x33\xda\xd2\x62\xb9\xe4\xea\x15\x2f\x99\x05\xf2\x1e\xc6\x10\x11\x25\xdb\xe8\xaf\x1e\x88\xd0\xf1\xb0\x99\x11\xdb\xdd\x34\x27\xe1\x4a\x1c\xbb\x72\x39\xcf\x2f\x5a\x70\xdf\xf6\xa3\x5c\xcd\xa4\xaa\x9b\xd1\x7f\x3b\x43\xd3\xec\x1b\xd3\xe0\x40\x03\xc8\x43\x37\xd5\xb8\x6b\x8b\x84\x0e\x7c\xa9\x19\x7c\xb2\x81\x26\x18\x5d\x47\x84\x1c\x69\xc0\x4a\x05\x9d\x3d\x7a\x44\x1e\x76\xed\x98\x1f\xde\xc1\x81\x96\xb2\x95\x27\x47\xbb\x59\x2c\x37\x72\x7e\x09\x99\x9a\xc2\x33\x8c\xfe\x23\xc0\x02\x1a\xe5\x91\x6d\x0a\x42\xc1\x81\x52\x59\x90\x79\xc7\xbe\x0c\x33\xe6\xe3\xc5\x45\xd8\xe9\xd4\xb7\x70\x7d\xf1\xfc\xe2\x28\xc8\x09\xaa\xef\x07\x25\x88\x58\xd5\xfa\x75\x9d\x15\x6c\x69\x7c\x45\xc0\x4b\x7e\xb6\x55\x8c\xbc\xbd\x7e\x31\x79\xf2\xbf\xe3\x28\x1e\x34\x94\xc1\xc6\x06\xa4\x0f\x7f\x6b\xc2\x1f\x87\x64\x62\x18\x1f\x8c\x57\x0a\xf3\xf8\x24\xab\x39\x42\x7b\x32\x6a\x6e\xa4\xfd\x68\xb6\x25\x64\x5c\xee\x3b\x98\x36\xa9\x2b\x71\xcb\x00\x21\xd5\xde\x10\x71\xea\xec\xaa\xe0\xea\x47\x9e\x33\xbd\x0a\x98\xa7\x77\x88\x3d\x98\x96\x92\x61\xf0\xd0\x64\x2a\xfc\x7d\x67\x16\x8e\xe9\x26\xb3\x3e\xfe\xd0\x80\x7e\x52\xf0\xa7\x24\xaa\x5a\xa3\x32\x95\x19\xe7\xad\xfa\xee\xd7\x36\x8c\xa0\x23\x5f\x7c\x50\x5e\xb7\xf2\x03\x27\x98\x55\xb3\x02\xbe\x7d\xbf\x10\xad\x8d\x69\x34\xa0\xe9\x7f\x53\x73\xc5\x76\xb7\x71\x9f\x65\x0a\xee\x9b\x7b\xac\x8d\xbb\x29\x0c\x11\x44\x15\x97\x74\x3b\x63\x67\x05\xaf\xce\xf0\xb5\x0d\x00\x13\xc3\x7b\xfc\xf1\x49\x8a\x17\xde\x13\xf6\xf5\xa0\x25\xb3\x5f\x94\x17\x2b\x55\xad\xd4\x87\x51\x34\x92\x5f\x83\xa0\x66\xe0\xe1\x9d\x10\x6b\xc4\xc4\x88\xad\x68\x41\x8c\xc4\x31\xc9\x96\x55\xb0\x8e\x49\x04\x02\xa7\x47\xee\xbb\x51\xcb\x35\x5f\x68\xc4\x5a\xa0\x55\xc5\x28\xda\xed\x73\x61\x7b\xbd\x62\xaa\x21\xff\x5a\xe9\xd5\xa2\x11\xac\x8a\xa2\x03\xd2\x1e\xaf\x2b\x08\x3b\xb5\xf2\x6d\x3c\x33\xe2\xa4\xfa\xaf\xbf\xbf\xb8\xfe\x1a\x07\xb3\x14\xd2\x83\xc5\x48\x3d\x14\x42\x7e\x64\x9a\x83\xf0\x38\x23\xba\xb9\x85\xd0\xe3\xfa\x4a\xcc\xe7\x13\xcd\x6a\x7d\x85\x80\xb5\x16\x95\x96\x2b\xe3\x77\xf7\x33\xd2\xc7\xcf\xc0\x75\xfd\xac\x96\xab\xbb\x9f\x3d\x40\x84\xe5\x93\x74\x7b\x85\xc8\x68\xd1\x66\x98\xc6\x46\x87\x80\x38\xb2\x91\x1a\x00\xf5\xd3\xa0\x21\x9a\x54\x8b\x55\x75\x50\x2d\xf2\x12\xa1\x70\x4b\xc5\x4b\xcc\xce\xbb\x11\xf5\xad\x16\xbf\x61\x5a\x2b\xc9\x6a\x69\xd4\x9b\xec\xae\x0a\x13\xdb\xb7\x8c\xc4\x56\xa3\xda\x34\x20\xb5\xa0\x08\x03\x3a\xe9\x6a\x06\x49\xb0\xd9\x52\xac\xbe\x8e\x1a\x1b\x5b\xeb\x11\x2f\xb3\x62\x25\xf9\xba\x47\x2a\xe0\x18\xcc\x25\xe2\xcb\xec\x5c\xc6\xd1\x78\xbc\x47\x83\x9f\xec\xc9\x09\x39\xd4\xef\x74\x34\xee\x93\x2e\x10\x79\x7c\xa0\x82\x68\xd8\x40\x13\x0d\xb8\x41\xab\xa2\x38\x6e\x7f\xc5\x66\xc3\x02\xed\x84\x8d\x8d\x96\xdc\x08\x77\x36\x17\x8e\xba\x25\x3d\x44\x46\xa9\x2a\x30\x04\xd2\x2c\x13\x75\x1e\x48\x14\x3f\x5c\xb7\x33\x81\x1b\xbb\xcb\x21\x59\x95\x05\x93\x0d\x87\xab\x1b\x2a\xc9\x0c\x45\xb7\x22\xb7\x29\x7e\x6a\x9e\x29\x2f\x1f\x18\x41\x42\x8a\x25\x23\x9a\x97\xa9\x8d\xc5\xe3\xa5\x72\x5a\x35\xfd\x20\xc2\xf7\x1f\xae\x9b\x17\x0b\xe6\x1a\xcf\xe3\xe6\xac\x0a\x6d\xb7\x2d\x4a\x89\x0a\x68\x1f\xe7\x1b\x8d\x7b\x20\xdb\x24\xbc\xdb\x2e\x65\x69\xec\x3a\x05\x54\xe2\xae\xe8\x68\xef\x1e\x9a\xe4\x15\x2d\x8f\x98\xb0\xd4\x71\x60\xc5\x3e\xec\x32\x25\x9a\xf3\xf2\x79\x1b\xa7\x3a\x33\x7f\x84\x3b\xca\x55\x6b\x2f\x51\x99\xd7\xdc\x4e\xb7\x97\x37\x7c\x71\xd3\x6f\x33\x43\x38\xc9\xd6\x7e\xf6\xdc\x4c\xb3\x04\x5f\x7e\x43\xed\x49\xdf\xbb\xa7\xf6\xb0\xed\xdd\x56\x53\x30\xdc\xd9\xee\x4b\x24\xcc\xcb\xf3\xa6\x16\x5a\x38\x26\x94\x0c\x7e\x2a\x07\x9e\x89\x0e\x4c\x70\xc1\xd3\xcb\x5d\xd4\xe1\x1c\xb1\xd9\xc4\xa6\xb5\xc1\xca\xf3\xee\x68\xcc\x04\x7b\x1d\xe8\xa2\x9d\xc9\x2e\x52\x6b\x05\x7b\x63\xef\x8b\x60\xc9\x5b\xb2\x3d\xb4\xe4\xbc\x66\xf4\x5f\x17\xea\x86\xd5\x1b\x8e\x5a\x69\x2e\x41\xfb\x1a\x71\x0c\xca\x01\x52\x00\x8a\x83\x19\x31\x44\xec\xef\x37\xe4\x1b\xe9\xb3\x03\xce\x04\x3a\x38\x55\xe7\x65\x7e\x31\xbf\xb2\x7a\x9e\x9d\x12\x24\x18\xa2\x4e\x02\xfe\x35\xf1\xbf\xbd\x66\x8a\x06\x9b\xd6\x45\x2f\x1e\xfd\xf9\x54\x1f\x8d\xab\x88\xa7\xd1\x1c\x56\xa6\xf8\x9a\x19\x90\xea\x35\xab\xed\x96\x59\x9b\xf4\xb4\x97\x4c\x8c\x33\x4a\x12\x64\x24\x68\x22\x63\x63\x80\x66\x02\x05\x8f\x1f\x19\xbe\xa6\x63\x52\x39\x98\x3f\xc7\x20\x4e\x43\xfe\xd9\xf6\xf2\xb6\x1a\x3e\x69\x60\x39\x77\x5a\x6d\xf6\xcc\xc0\x22\x69\x47\x58\xda\x89\xed\xed\x35\x23\xab\xaf\x75\x86\x79\xc8\x8b\x8d\xcc\x26\x80\xa2\xac\x54\x2c\x38\xb7\x08\xf5\x70\xfa\xdb\xcc\x2a\x18\xfc\xa9\x81\xd8\x83\x0f\x63\x42\xf3\x35\x35\x1a\x61\x3b\x1c\x68\x40\x9f\x4e\x83\xb3\x88\x30\x7f\x88\x29\xf3\x05\x06\x67\xa0\x92\x42\xc4\xcf\x5e\x4b\xbf\x77\xe1\xa7\x84\x9c\x06\x77\x4f\x78\xe5\x38\x65\xa2\x6d\x09\x38\x5a\xe7\xf1\xe3\x58\x95\xd6\xb5\x33\xf5\xac\x50\x08\xd3\xfd\xa4\x9d\xba\xa3\xb9\xb4\x81\x66\x5e\x5f\x0f\x00\x1f\xdf\xbc\xa2\x82\xd6\xbf\xc8\x72\x46\xbc\xd8\x2b\x7e\x0b\x9e\x1d\xa8\x44\x1b\x13\x76\x97\xb1\x4a\x8b\x0c\x1c\xdc\x9d\xc2\x1d\xef\x05\xd9\x55\xf0\x92\xbd\x60\x2c\x81\xad\x7d\x6f\x84\xa7\x94\x86\xaf\x15\x80\xb5\x5a\x96\xc3\x14\x1a\xd6\xcb\x39\xa4\xfd\x3e\xa3\x75\xcd\xe9\x82\x19\xe6\x05\x51\x8e\x50\x39\x15\x4e\x5a\xef\x84\x1d\x39\xfa\x7c\xec\x46\x22\x5c\xa6\xa7\xd8\xd6\x4b\xb4\xc7\x10\x71\xe9\xd1\xdc\xda\xac\xb7\x1f\x52\x6b\xdf\x9a\xc0\x79\xab\x0a\xac\xc9\x70\x2a\x2b\x21\x25\x9f\x15\x5b\xa3\x66\x07\x16\x27\xb0\xc7\x26\x1c\x49\x3c\x24\x13\xc4\x3a\x41\x10\xfd\x3e\x4f\x8f\x1a\x23\x2e\x5e\xed\xdc\xf0\x40\x9e\x71\x9e\x6c\x01\xeb\xea\x33\x84\x67\x4e\x57\xb1\x87\x3a\x6a\xb1\x39\x0e\xac\xfd\xae\x52\x20\x99\x44\x4b\x8c\x6b\x00\x6e\xae\xa9\x03\x99\x3e\x56\x97\x62\x13\x36\x6e\x15\x7a\x0d\x29\xa6\x2a\x68\xc6\x00\x11\x2c\xc6\xeb\x01\x45\x26\x9b\xab\x8e\xec\xc6\x3e\x9c\xad\xa2\xa8\x82\x68\x71\x56\x71\x1c\x02\xa2\x73\xa1\x9e\xb4\xaa\xc5\x8c\xea\xbd\xfd\x1a\xed\xb4\xa8\x4d\x08\xfa\x87\x50\x37\x93\x86\x02\x06\xa8\xdb\x83\x2e\x29\x76\x38\xf2\x30\x6f\x68\xdb\x0b\x6b\x53\xc0\x18\x9a\xb1\xad\x30\x40\xd6\xf1\xd8\x1f\xf4\x07\x62\x67\x35\x95\xec\x5a\xbc\xd2\xeb\xb0\x83\x3d\x4a\x27\x42\xe9\x38\xe8\x87\x6d\x03\x74\x53\x25\x87\x69\x53\x17\x4c\xfd\x78\xc3\x15\x83\x09\x37\x72\x9b\x3e\x26\x4f\x46\xf7\x49\x86\x70\xae\x27\xe2\x9c\x73\x83\x74\x5a\xad\x3d\xaf\x43\xa1\xc6\xdd\xdd\xcd\xb3\xe6\x54\x54\x5a\x40\x29\x83\xb3\x16\xb3\xd4\x98\x53\xd8\x05\xa5\x1a\x0c\x5d\x73\x42\x55\x00\xf5\xd6\x2a\xa3\x4c\x1e\x22\xe0\xb3\x8d\xa5\x0d\x16\x42\x46\x1e\x1e\x68\xb6\x0d\x54\x4f\xab\x72\x2e\x6a\xb5\x2a\xa9\x62\x41\x4e\x23\xd4\x91\x59\xe7\x6f\x68\xc7\x70\xf0\x88\x19\x08\x8e\xb0\xce\x27\x38\x88\x78\xcc\xf9\x7c\xce\x33\x00\x05\x03\x37\x4e\x46\x56\x55\x40\x8b\xc6\x0d\x11\xd1\x38\xd8\xb2\x52\x5b\xd3\x38\x84\x53\x81\x66\xa8\x1c\x28\xa2\x6a\x5e\x59\x70\xbb\xd0\x64\xfb\xc0\x24\x5a\xb2\x0b\x67\xc8\xed\x12\x93\x3f\x4a\xc2\x17\xa5\xa8\x99\x75\x61\x25\x98\x16\x1c\xc1\xb5\xa8\x83\xcd\x35\xda\x2f\xbb\x06\x39\x5b\x73\xaa\xd0\xd4\x08\xfe\x39\xa0\x0e\xc4\x29\xd1\x45\xcd\x98\x31\x2f\x2c\x4a\xb1\x64\x13\x27\xd4\x68\x26\xe8\x56\x94\x52\x14\x6c\x4c\xee\xe6\x19\xfb\x5f\xee\xdb\x94\x90\x2b\x86\x47\xbc\x9e\xad\x16\xd3\x4c\x2c\x0f\x9e\xfe\xcf\xa7\xff\xf3\xf7\x87\x20\x96\xe6\x4c\x51\x5e\x74\x9a\xba\x45\xa5\x3e\xa4\x3c\x49\x62\xca\x83\x99\xf7\x3b\x8c\x97\xcd\x54\x97\xae\x87\xc6\xfb\xb5\xcf\x58\x17\xc8\x9a\xce\x9c\xb8\xa4\x77\x67\x5f\xc4\x6a\x15\x1a\xef\xfc\x12\xfc\xd1\x27\x90\x71\x3f\x8e\x5d\xa7\x23\x72\xe4\xfe\xdd\xd2\x52\xa7\xd4\xe9\xc1\xa9\x39\x39\x69\x26\xdf\x4c\x55\x78\x7e\xfe\xe2\xf4\xed\xab\xeb\x0f\x67\x17\xaf\x2e\x2e\x43\x5f\xb9\xfd\x2e\x64\xef\xf6\xbc\x67\xef\xbd\x33\x5c\xd2\x80\x53\x8a\x1c\xf3\xf1\x79\xef\xb2\x11\xf9\xf6\x24\x6d\xa3\xd8\x69\x93\xec\xb0\xe1\xe0\x55\x70\x76\x43\x6b\x39\xcc\xda\x39\x70\x12\xe9\x94\x87\xbb\xb1\x4b\xfb\xde\xef\xf7\xb9\xc4\x61\x5c\x7b\x2f\xee\xdd\x43\x6e\x5d\xeb\xe1\x65\xdb\xc1\x1b\x75\xde\xd7\xfb\xce\xdb\x3e\xcd\x40\xaf\xa5\x09\x26\xe2\xec\x38\x5f\x70\xfe\x0d\xe6\xc5\x03\x78\x36\xe2\x2c\x8c\x37\xcc\x6e\x8e\x60\x4c\x6a\xb6\xa0\x75\x0e\x4a\x3c\x31\xef\xb2\xde\xfc\xfa\x95\x3d\x9d\x69\xee\xf7\xde\x4b\x6b\x17\x27\x60\x4d\xcc\xcf\x49\x57\x61\x97\xb4\x29\x32\x7f\xee\x91\xc3\xb8\x17\x5a\xf7\xee\x63\xe8\x81\xf6\x5b\x6e\x66\x07\x6e\x6f\xdb\x9d\xc6\x44\x7a\x80\x7a\xe2\x6f\xb4\x95\xcf\x58\x32\x39\xfb\x3d\xb7\xf2\x32\x48\xc5\x17\xe5\x26\xd9\xa5\xe8\x6c\x6c\x7b\x98\xa4\x0b\x21\xa3\xbf\x3d\x31\x0d\xfd\xe3\x13\xc0\x0b\xde\x4c\xbf\x63\xd8\x2c\x83\xf6\xdb\x12\x30\x7c\x38\x43\x00\xa0\x6b\x7c\xb5\x76\x5a\x5f\x9b\xd0\xa5\xd9\x0d\xd2\x81\x73\xe8\x30\x58\x9d\x36\xe8\x77\xce\x8b\xbd\x01\xe7\x7a\xf0\x61\xb0\xc0\xcd\xfd\x88\xa0\x7b\x33\x0e\xed\x66\xb8\x9d\x46\x57\xff\xc3\x63\xf8\x47\x1b\x5e\xd6\xf8\xc7\xeb\xaf\x7e\xc7\x5d\xe5\x4c\x14\x58\x59\xff\xa3\x13\x9b\x36\x13\x45\xdb\x5b\xa2\x73\x88\x20\xb1\x67\xa2\x48\xa7\x9d\x6b\xbe\x8c\xd9\x4d\x32\xe3\x6a\x5f\x29\x06\x8f\xbb\xe2\x35\xb3\x68\x6e\xc0\xbd\x16\x8c\xc6\xda\x04\xaa\x8c\xc1\x3c\x0d\xb4\x1c\xd2\xc9\x4e\x22\xe9\x74\xb2\xf4\x18\xca\xee\x6d\x11\x15\x03\x94\x56\x30\x87\x1b\x1c\x63\x69\xad\xaf\x8d\xb7\xc7\xa8\xf2\x7a\xc0\x6f\x37\xd3\xcd\x7d\xb6\x0f\x66\x8f\xa4\x47\x0f\xa2\x9c\x47\x27\x27\x51\x8a\xc5\x73\x14\x71\xbc\xb3\xae\xd7\xfa\x4e\x1f\x90\x76\x9e\xf8\xd4\x93\x94\xb8\x8d\xcc\x38\x9c\xa4\x9c\xba\x87\x4c\x99\xce\x1b\xa8\xb3\x8d\xc3\x56\x10\x43\x27\x19\xe9\xeb\x46\xac\x8c\xee\xc8\xaa\x4c\x3b\x00\xe7\xf7\xbe\x1b\x64\x2f\xbd\xa1\x2d\xf0\x1f\x93\xe4\xbe\x20\xb9\xb9\xdb\xcf\x6e\x61\x83\xb9\x2f\x44\xa4\x18\x4d\xe6\xcb\xea\xdc\x5d\xff\xe0\x8d\x49\xa4\x22\x89\xb7\xdc\x87\x88\x20\x16\x35\xe8\x13\x30\xae\x23\x9d\x17\xa0\x19\xbf\x9c\xf4\x00\x6e\xfa\xbf\x80\x9b\x7a\xb5\x92\x37\x18\xe9\x11\x9a\x99\x69\x6d\xdc\x52\xa4\xd2\x32\x1d\x84\xc5\x95\x03\x85\xd9\x8e\x56\x55\xa7\x73\xfb\x68\x47\x3a\x8a\xb6\x50\x8d\x33\x72\x33\xdc\x0b\xad\xed\xb4\x8a\x9f\x13\xe6\xd6\xa1\xd3\x6c\xb3\x2e\x2d\xc3\x30\xee\x76\xd6\xcc\xa9\x6a\xc4\x61\x53\x79\xe2\x7b\x8e\xd2\x15\x2d\xc5\x9a\xa1\x8c\x6e\x02\x43\x1b\xd1\x29\x41\x3e\xda\xda\x46\x2b\x41\xfe\xd9\x5b\x46\x6a\x21\x96\xfa\x52\x7a\xe0\x12\xd4\x1a\xeb\xc9\x50\x8e\x4c\x10\x6f\x16\x36\x9d\x73\xa9\xd0\x66\x84\x21\x2f\x10\x12\x60\x13\xd3\xf8\x81\x9c\x24\xc6\xac\xff\x0d\x1f\x1f\x23\x9b\xa6\x2f\x55\x57\x23\x70\x33\xf3\x61\x9a\x41\xd4\x95\x2b\x38\x0e\x1a\x7c\xec\x3c\x27\x5b\x5c\x9f\x75\xef\x4c\xe6\x08\xe9\x1b\xec\x45\x1e\x93\xfb\xf1\x7d\x9d\xe7\xcb\x04\x53\xf4\x3c\x5f\xdf\xbb\xf8\xe0\x1a\xa2\xc7\x52\x11\xb9\x6d\x67\x35\xbd\x9d\x18\x3c\x05\x0a\xe2\x29\xd1\xed\xc0\x8d\x6a\x9b\x42\x27\x0b\xb0\x4d\x42\x2c\xaa\xa9\xb4\xaa\x8c\x8e\x4e\x0f\x16\x62\xb0\x20\x9d\x83\x41\x12\x30\xd0\xba\xf7\x89\x2d\x75\x87\xce\x28\x23\xf7\x01\xb9\xeb\x42\xfd\x0e\x5d\x27\xc7\x88\xfe\xb2\x55\xc4\xf0\xb7\x5e\xf7\xee\xb3\xd7\x56\x76\x39\xfa\xd5\xad\x1a\x8a\xed\x3a\x9f\x4e\x5d\xe5\x1b\x12\x6b\x76\x65\x22\x97\xfc\x49\x68\x52\x3f\xfe\xf0\xf0\xc4\x37\x90\x3a\x05\x90\x1e\xc9\xf6\x64\xdb\xdd\x21\xe0\xb6\x62\x61\xf7\x90\xbb\x1f\xeb\x7d\xc9\xfd\x4b\x89\x39\x2f\xe1\xda\x95\x41\x00\x95\xa7\x25\xa3\xe2\xee\x97\xf3\xa6\x83\x05\x69\x58\xbf\xfa\x92\xb1\xe9\xfa\x7e\x8f\xc7\x15\x9c\xa4\x5f\x45\xc7\x10\x02\xdc\xa9\x2c\xd3\x4c\x45\x22\x43\x57\xe4\x05\x6d\x82\x78\xfb\xf8\x0f\x7f\x31\x51\x15\x13\xb9\x4d\x7c\xd8\x58\x90\x2e\x26\xa9\xe4\x76\x39\x55\xfc\xde\x26\x6c\x51\xbd\x5f\xfa\x58\x7d\x7e\x8f\x9b\x07\x14\xa4\x3b\x76\x0c\x4b\xe5\xcd\xc7\x3e\xad\x5d\x35\x99\xbe\xa1\x82\x0b\xc7\xe8\xd0\x3d\x73\x69\x98\xd3\xe1\xa8\xad\x79\xee\x52\x23\xde\x33\x97\x9b\x19\x4b\xea\x4c\x47\x14\x93\x22\x37\x5b\x37\xac\xdc\x49\x26\x9f\x1e\xf4\xa7\x95\xab\x1b\x3e\x57\x11\x52\x49\xfc\x9a\xad\x2a\x4d\x4a\x92\xcc\xb6\x09\x03\x1d\x3c\x2e\xc9\x97\xd2\x61\x21\x18\x82\xda\xe1\xff\x0b\xb0\x39\x46\xb9\xf2\x00\xe0\x72\x35\x57\x94\x5b\xf8\xa4\x6b\xcf\x07\xe1\xed\xa1\xcb\x6a\x16\x76\xa5\xbc\x9d\xd7\xde\x45\x60\x2a\xa3\x7e\x5b\x43\x26\xd9\xd2\x54\x90\xb8\xd1\xd8\xd7\x62\xd6\x16\xe7\xa0\x08\x2d\x0a\xcb\x35\x83\x97\x0a\x42\xe6\x84\xa1\x6f\x7a\xa2\x9a\x67\xee\x71\xe5\x01\x54\x73\xfb\xca\xdb\x79\x8a\x6c\x38\xb3\xf3\xc0\xda\x75\x7e\xbc\x4f\xd6\xe7\x5f\x78\xdd\x96\xfa\xa4\x63\x41\x80\x12\xea\xd9\x86\x61\xc0\x06\xf6\x54\x9c\x04\x24\x38\x03\x5d\x65\x20\xd8\x42\xc6\x85\xfd\xb4\x17\x6f\x70\x0f\x71\xa8\x0f\xcd\x76\x79\xbf\xff\x73\x12\xac\x17\xf5\x22\x9a\xfd\xed\x28\xb1\x99\x46\xbc\x61\x09\xfd\xf5\xaa\xc7\x24\x51\x5a\xa6\xa9\xe5\x99\xe2\xbb\xef\x45\x9b\xcd\x50\x99\xfd\x5c\x8e\x01\xee\x49\x04\x8f\x87\x5e\x9f\xf3\x96\x37\xbd\x6e\x66\x20\x6a\xbe\xe0\x25\xc4\xe7\x0e\x08\x02\x47\xe7\x90\xd2\xad\xd9\x5c\x02\xc0\x42\x58\x07\xdc\xce\x3d\xd5\x43\xb3\x64\x19\x04\x65\xc4\xd2\xce\x7d\xab\xf5\xcd\x2f\x19\xef\x5a\x48\x11\x56\x31\xeb\x12\x3b\xb6\xbd\xbb\x70\x5d\xc2\xa8\x33\x4b\x14\x97\x66\x61\x3a\x94\xbd\x36\x2f\x61\x0f\x57\xa4\xee\xba\xbb\xdc\xc1\xc2\x8d\xe1\x4a\x26\xd3\xed\xa7\xb8\xdb\x5a\x6c\xd2\x4c\xaf\xc9\xb1\xba\x7b\x31\xd3\xb3\xde\xb9\xa8\xbd\x9d\xc4\x50\x71\x8f\xdc\x47\x56\xd0\x65\x35\x44\x4b\x4d\x2b\xa4\x06\xfe\xd9\x25\xc0\x19\xed\x89\xf1\x42\x0c\x5b\xb3\xf9\xfa\x0e\xc7\x9d\xee\x0b\x09\x66\xba\xad\x55\x8b\xb7\x69\xc7\x16\xd9\x13\xe8\x78\xdf\xdf\x76\x6f\xd2\x54\xb5\x73\x6f\x92\x4b\x9e\x5c\xa1\x20\x08\xe9\xef\xb7\xc0\x8d\xcb\xb0\x5f\x4a\xda\x2f\x75\x83\x9c\xd9\x29\x27\xd3\xd4\xfe\x5a\x47\xed\xd4\x74\x83\x78\x9c\xf4\x8c\x93\x71\x2b\x9f\x39\xcf\x45\xf7\x3c\x93\x68\x78\xbb\x3c\x7c\xba\xb7\x2c\xd2\x1c\xff\xb3\x3d\x5d\xf1\x1c\xee\x73\x18\x2f\x63\x0b\x78\x6d\xd1\x10\xfa\x3c\x08\xfb\x17\x7c\x1f\xd5\x04\x8b\xde\x97\x64\x7a\x21\x5c\x26\xe7\xd6\x9b\x58\xea\x46\xa2\xf0\x4b\xc4\x8e\x46\xef\x40\x15\x23\x46\xd6\x00\xd7\xae\xdf\x39\x56\xcc\x89\x14\x31\x03\x64\xbe\x86\x69\xf8\xa9\xdc\x96\xd9\x4d\x2d\x4a\xb1\x92\xc5\x76\x0c\x55\x4c\xca\x0a\x58\x18\x5a\x40\x72\xd7\xec\x96\x6c\x78\x09\x06\xf2\x0d\x46\x95\xda\x94\x7d\x50\xc4\xc3\xe6\x66\x82\x16\x4c\x66\x16\xe0\x8a\x5a\x6c\x5e\xec\x7a\x1f\x39\x44\xa0\xf3\x1f\x76\x78\x95\x2b\x44\xc8\x97\x1f\xa6\xd8\x70\xd2\x0d\x0f\xd6\x00\xdf\x51\x77\x99\x36\x2b\x92\x93\x10\x70\x3f\x01\xc7\x6f\x74\x33\xba\xad\x56\xe5\x63\x07\xd9\x5f\xcc\xa3\x48\x6f\xfc\xfc\xc1\x41\x71\x24\x10\xd0\xba\xf7\x70\x16\x20\x7d\x45\x2a\xec\x08\x97\x05\x8f\xfc\xdf\x63\x2b\xbd\x70\xe1\x43\xd0\x41\xde\x69\x84\x42\x7b\xd9\xda\x08\x67\x7e\x8e\x63\xa3\x36\x97\x81\xf5\x57\x37\x96\x0b\x2f\x79\x79\xaf\x8b\x30\x0c\xb1\x07\xf5\x04\x90\x78\xbd\x28\x48\xba\xf2\x9f\x41\x45\x32\x14\xa1\x3e\x87\x92\x7c\x03\x9d\xd4\xd4\xc6\x0d\x80\x22\x4d\xdc\x00\x43\x69\x4f\x0e\x77\x33\x5b\xab\x0a\xdc\xdf\xdb\x6a\xc6\x14\xd4\x54\x2f\x69\x73\x19\xf7\xb0\xcf\x30\x0c\x85\x3a\xd5\x1f\xe1\x85\x88\x45\xf5\xda\x0c\x27\xa1\x22\x77\xf7\x04\x41\x15\xf1\x0f\x30\xc5\xa6\x5c\x1d\x4c\xd2\x1a\x45\xfc\x9c\xac\xdd\x65\xc9\x4b\xf4\xa2\x70\xf1\x91\x09\x11\x8b\xfc\x31\x2d\x1c\x90\x23\x23\x54\x1b\xbb\xcc\x67\xb5\x64\xe5\x03\x72\x94\x0a\xbe\xdc\xc9\xee\x3e\x08\x31\x44\x43\x86\x77\x7f\x48\x16\xda\x6a\x3a\xc3\x3d\xdd\xb2\x8c\xfd\xbc\xa2\xe0\x88\xb6\x2a\x0c\xc1\x42\x77\xd0\x09\xc4\xa5\xa4\xe9\x04\xd9\x85\x10\x60\xd7\x84\xf8\x34\x31\xba\x34\x37\x66\x58\x29\xb8\xd2\x8c\x83\xbd\xc3\xe8\x85\xf2\x95\xb9\x42\x2d\xe0\x85\x95\x40\x6b\x54\xa1\x95\x64\xc3\x20\x74\x01\x9d\xfb\x21\x9d\x35\x94\x0b\xfa\xa2\x92\x6c\x58\x3b\x69\xf6\x6e\xe5\x3e\x4e\xe2\x73\xc9\xb7\x19\xae\xb2\x87\x7c\x23\xf3\xdc\xb7\xe4\x49\xf2\x2e\x35\x33\x3f\xbb\x5f\xec\x5b\x5b\xdb\x60\x76\xe3\xc7\x16\x52\x53\x6f\xb7\xfd\x16\xb2\x13\x97\x41\xf4\xb6\xd1\xb0\x63\x14\xcb\x92\xd6\x0b\x5e\x8e\x21\x71\xc9\x6a\xc9\x20\xb8\x0c\xa7\xa9\x04\x59\x30\x45\xb8\xf2\x6d\xc1\x3e\xda\xc0\x27\x2a\x2d\x04\xb1\xf5\xe3\x81\x28\x57\x5a\x55\x05\x67\x26\xbf\xfd\x06\x42\x34\x79\x69\x29\xcc\x37\xd5\x20\xb5\x69\x08\xa3\x34\x99\xf4\x71\x4b\x0f\x30\x82\x1e\x66\xde\x56\xda\xf6\x55\x77\x76\x94\x92\x6d\x7a\xfa\x68\x04\x35\xdc\x76\xc6\xdb\x3b\xf1\xa0\x3a\x38\x06\x5f\xf4\x5b\xef\x0f\x46\x7c\x9f\xe6\x1f\x13\xb4\x15\xcf\x0b\x21\x6a\x43\x4f\x07\x69\x39\x79\x64\xbd\x57\x83\x1e\x2e\xc1\x99\xf1\x30\xc4\x3e\x3a\x38\xb0\x68\x36\x85\x14\xb0\xac\xc6\x23\x58\x1f\xc0\xc3\x68\xb7\x90\x9d\x27\x8d\x81\x75\x5c\x7a\x8f\x6d\x89\x7f\xed\x72\x9e\x6c\xc0\x20\x85\x6b\x95\x16\xfc\x1f\x07\x65\xda\xad\x6e\x02\xd8\xac\x07\x09\xbb\x96\x93\x87\xd0\xd8\x4e\xef\xcc\x82\x68\xf6\x73\xec\x5b\x46\xca\x88\x14\x6e\xcd\x9d\x74\x0d\x24\xb7\xb4\x69\xf0\x6e\xd8\xd5\xc2\x8e\xf6\x29\xe7\x60\x21\x7b\x5d\xc2\x7f\x8b\x3b\xaf\x15\x15\xf4\x45\x2e\xbd\x94\x0a\xa8\x7f\xa0\x4a\xf7\xa3\x48\x48\x5f\x0d\x52\x8f\x28\x61\x93\x35\x0c\x1d\x95\x45\xcd\x4c\x44\x90\x7e\xd4\x9a\x61\x75\x72\x27\xd0\x3e\x5e\x71\x56\x20\x60\x77\x46\xc8\xd9\x50\x49\xb4\x50\x54\xba\x34\x2a\x09\x6b\x4a\x1c\xeb\xa9\x05\x24\x3c\xb8\x4a\x10\xc9\x20\xe0\xdd\xbe\xc3\xde\x99\xce\xe0\x9a\xf8\x9e\x8c\xbe\x03\xf0\x52\x82\x1e\x7d\x77\xb6\x18\x48\x4d\x10\x91\xc7\xcb\x8c\xe7\xcc\xcb\x1e\x26\xa0\x10\xd4\x26\xa5\x98\xb8\xaa\x03\xb3\x00\x53\x42\x5e\x6f\xc9\x62\xc5\x24\x84\x0b\xba\x48\xd4\x52\xb4\xec\x35\x33\x21\x0a\x46\x4b\x40\x6b\x55\xcc\xa2\xb5\xa2\x37\x99\x64\xfb\xfc\x23\x1a\xe9\xdc\x1a\x70\xaa\x8a\x05\xda\x91\xe6\xe3\x68\x2b\x40\x39\xfb\x8c\x06\x95\x52\x00\x65\x4c\xbd\x70\x5b\xdf\x91\xd2\xb3\x99\x1c\x74\x30\x6a\xd8\xc9\xc3\xd6\x9e\xb9\xc2\x1d\xad\x79\x4a\x8b\x5a\x4b\x18\x03\xee\x39\xcc\x8e\x86\x3f\x73\x98\x1d\x93\x8e\x83\xa0\x7d\x3e\x14\xa3\x78\x9b\xb1\x86\x98\x0c\x92\x35\x64\x4b\x28\x28\x82\x8a\xeb\x22\x84\xae\x72\xae\xef\x2b\x48\x75\x40\x4b\x22\xca\x8c\x91\x8a\x69\xd1\x33\x13\xe5\xde\xe0\x73\x5e\x2e\x9e\xb1\x38\x6c\x20\x20\x0b\xbc\x5b\xc2\xec\x95\xb3\x78\xb6\xa4\x19\xf2\xe7\x56\x66\xd1\x5e\xe7\x51\x97\x58\xbc\x5b\xf4\x05\x79\xb5\xc7\x48\xb0\x60\x77\x06\x59\x27\xe4\x3e\x3d\x3c\x74\xee\x9c\x7a\x0d\xaf\xfe\xef\x8a\x15\xd9\x8d\x19\xc2\x07\x77\xff\xcc\x84\x3e\xf9\xb0\xbe\xfa\x26\x2b\x85\xe2\x73\x9e\x21\x98\xb8\xae\x07\xd0\x2d\x8e\x69\x4c\xb4\xd4\xba\xd1\xa3\xc2\xa7\xba\xe5\x0f\x8d\x34\x49\xb2\xce\x06\xa3\xe8\x8c\x05\x45\xf5\xce\x47\x4e\x29\xd0\x27\x6b\x0c\x7f\x9f\x2a\x81\x78\xa4\xe9\xf4\xb0\x1d\xe7\x11\x64\x89\x1c\x93\x6f\x0e\x0f\xdb\xc7\xab\x47\x4b\x9f\xa2\x89\xe7\x4c\xde\x2a\x51\x7d\x1f\xac\xa5\xa6\xbf\x0f\xde\x77\x27\xc8\x66\x4d\xe5\x0b\xcc\x8d\x18\xa5\xab\x72\xf8\x9c\xb0\x21\xed\x05\x09\xdb\x7e\xc5\xa5\xfa\x60\xd2\x57\x99\x72\x0e\x00\xf5\x0a\x91\x00\x36\x8c\xa8\x1a\x62\xa8\x6b\xca\xcd\x1b\xb6\xe1\x65\x2e\x36\x00\x00\xf8\x47\xa8\x54\x4e\x45\x09\xe9\x48\x1b\x07\xc5\x10\x67\x21\x20\x02\x2b\xea\x5a\x7e\x18\x8e\x8e\xc9\xa7\xd6\x51\xb7\xba\xfa\x40\xa3\x4e\x66\x5c\x05\xe2\x62\xf8\x05\xde\xc4\x31\xc9\x58\x0d\x30\x22\x1e\x48\x2d\x0d\xb6\x65\x13\x3f\x11\x97\x66\x4a\xb3\xa9\xf0\x9a\x30\xc5\xda\xda\xfa\x56\x74\x12\x09\x91\x9e\x90\xc5\x85\x84\x37\xb2\x12\x65\x1e\x82\x47\x07\x7e\x13\x6d\x95\xbf\x9d\x8c\x8d\x05\x80\x20\x81\xf9\x7c\xdf\xf3\x56\xaf\xec\xcb\x16\xae\xc1\x18\xc1\x3d\x21\x20\xaa\xec\xf5\xea\x5d\x78\x15\x45\x9f\x37\x4f\x84\xc5\xdd\x8b\xd7\xc1\x1d\xb7\x63\x39\xec\x86\x1a\x97\xfe\xc4\x86\x86\x5f\xcc\x86\xb2\x3b\x2e\x11\x12\x47\xb3\x1e\x31\x50\x44\xe4\x5a\x64\x14\xaa\x10\x52\x88\xfe\x1e\x86\xef\x6d\x3a\x94\x83\xf1\x44\xb7\x16\xef\xa1\xfd\x95\xb8\x10\x28\xd8\x45\x5a\x6e\xe3\x31\xfc\xfa\x2d\x0b\x66\x79\xff\x2d\x7b\xe9\x80\x67\x7b\x6d\x19\x0f\x8b\x9b\x2d\x4b\x6c\x09\x5d\x69\x0e\xcd\xe0\xc6\x58\xed\x60\xbc\x37\xc9\x22\x0e\x83\xad\x24\x54\xaf\xed\x72\xce\x22\xb0\x65\x90\xf2\x0d\x52\x39\x3a\xe0\x50\x89\x38\x48\x05\x2f\xd9\xd8\x5b\xbc\x7c\xd2\x6a\x49\x21\x59\x37\xa1\xe0\xd3\xa4\xdb\x33\x5e\x44\x39\x9f\xcf\x59\x0d\xa0\x0a\x33\xc1\x0b\x89\xaa\xec\x0d\x30\x97\x9b\x1b\x06\x40\x13\x7a\x77\x45\xc2\x2a\x6b\x38\x59\xf6\xe5\x19\xc7\xd3\x36\xe8\x4f\x9f\x7d\x49\x60\x05\xed\xda\x9f\xa6\x42\x2c\xde\x9a\x84\xba\xac\x79\x17\xda\x6b\xcf\xe4\x5f\x6d\xf8\x95\x29\x14\xd8\x83\x5b\x2b\x8a\xc7\x9e\x0b\x5d\x41\x1f\x00\x04\x3b\x8c\x30\xee\x42\x3c\x3e\x90\xba\x9c\x41\x05\x60\x32\x9a\x70\x58\x98\x59\x2c\x48\xf6\x07\x47\x8d\x54\x54\x2a\xc2\x15\x7a\x9e\x21\x94\x46\xf2\xa0\xb5\xec\xeb\x3b\xce\x59\x63\x59\xee\x7f\xd6\xbc\xe6\xab\xd7\x9e\x6e\xc2\xe2\xdd\x7b\x69\x24\x87\xc9\xfd\xf7\x74\x3e\xff\x75\x9b\x1a\x6c\x46\xa8\x3e\xed\xb9\xa3\xce\xef\x03\xf0\xe0\x7e\xe5\x1d\xd8\xb1\x08\xf7\xdf\xa3\xcb\xa6\x92\xf2\x3e\xd2\xdb\x8f\xfb\x76\xac\x40\xfe\x96\xa9\x0d\x63\x16\xd8\x85\x2f\x69\x8d\x61\xac\xe0\xc6\x0a\xf0\x35\x48\xdb\xa1\x2a\xdb\x7f\x0b\x8f\x24\xdc\xb5\x8d\x5a\x1e\xfb\x30\xdc\x08\x7b\x80\x6c\x7f\xad\xb2\x16\x26\x7a\x43\xab\xca\x24\x8b\xd6\x43\x30\xf6\x3e\xc2\xd0\x39\x52\x74\xc4\xaa\xd9\xea\xe7\x34\xbb\xb1\x6d\x5b\x0c\x36\x09\x1e\x5c\xfa\x66\xed\x70\xf3\xfb\xfc\x6d\x8f\x57\xe5\xfe\xbb\x7d\x6a\xeb\xef\x78\x00\xef\x07\x78\x61\x37\xde\xda\x68\xdc\x08\xaf\xcc\xf7\x23\x62\x04\x55\xd8\x87\xab\x20\x45\x4a\x4b\x0d\xde\x02\xc7\x7c\xf4\x28\x15\x63\xed\x71\x5a\x0e\x83\xfc\x27\x0f\x77\xa6\x59\x09\x02\x7b\x5f\x46\xd7\xa9\x89\x1e\x81\x5c\x95\xd2\xa4\xcf\xd8\xe8\xff\xab\x19\xa1\x1b\xba\x1d\x43\xba\x02\xdb\x0b\x93\x64\x49\xb7\xb6\xa5\x99\xe6\xc5\x4c\x9a\xc6\xa9\x93\x1b\xfa\x66\x7d\xe9\x4e\xe8\x64\xe7\xd7\x8d\xf6\x4f\xeb\x6d\x1a\xea\x9f\xd6\xbb\xb3\xc2\xb4\x03\xd1\x69\xc1\x7f\x41\xb4\x9a\x0f\xe9\x58\x83\x10\xc2\x04\x0a\xa3\x61\xab\x5d\xfa\xa6\x69\xf0\x0a\xf5\x17\xdb\x32\x43\xcb\x9d\x0f\xbf\x4e\x14\xe3\x51\x8e\xa6\x7e\x11\x2c\xb1\x4b\x83\xde\xc7\x66\x50\x42\xe4\xb4\x34\x99\x15\xbc\xbc\x4d\x3d\x19\xd1\xf7\xe0\xc2\x71\x30\x70\x9a\x41\x86\x8f\x60\x13\xe1\x10\x3a\xb9\xe6\x92\xcf\x8a\xe8\xea\x01\x36\xcd\x7e\xf0\xf6\x5e\xe3\x75\x0d\x2d\xd8\x5e\xff\xc3\xa7\x5a\x02\x1e\x1b\x45\x2a\x41\x90\x7f\xd4\x25\x6d\x82\x1c\x3e\xb7\xe9\x68\x10\x3e\x5e\x09\x08\xe5\x16\x12\x21\xb2\x1e\x44\x99\x31\x3d\x5b\xa8\xeb\x14\x05\x29\x18\xbd\x25\x94\x18\x83\xfe\xaf\xe6\x0c\x5a\x2b\x79\xff\x9b\x08\x37\xf3\x19\xb4\xd0\xe7\xc5\xc9\xa2\xf2\xe6\xad\x31\x97\xc8\x43\x1c\xa1\xcd\x5c\xe3\xdd\x16\x82\x4a\xf6\x88\x80\x11\xca\x2a\x2d\x76\x14\x3f\x6e\xa9\x1d\x92\xe5\xda\x8a\x87\xc6\x88\x7f\x40\x32\x18\x25\x0c\x11\xe6\xd3\x50\xd5\x2b\xb6\x93\x62\x2d\x29\x75\xd3\xac\x2d\xd1\x45\xb5\x2c\x45\xa7\x9a\x82\xad\xb2\xef\x4b\x91\x44\x38\xd4\xcf\x25\x0a\xb3\x2e\xf7\x20\x0b\x5f\x23\x45\x18\x2d\xb3\xeb\x4e\x02\xb9\x2f\x89\xf4\x24\x12\x6b\x5f\xeb\x50\x77\x8a\x8a\x66\x5c\xe9\xa7\x60\x70\x38\x38\x4e\xe1\x4b\x20\xed\x74\x66\xf9\xd8\xdf\xee\x93\xc1\xf1\x2e\x42\x8d\x16\x61\xcf\x52\x35\xa0\xc4\xfc\xc4\x44\x19\x9c\xeb\x0f\x09\x98\xd4\x7f\x80\x3d\x88\x95\x64\xc6\x1b\x0d\x5e\x7f\x7d\x6c\x1a\xd7\x36\x26\x43\x46\x45\x61\x90\x49\xbd\x19\x79\xa3\x9b\x72\x02\x33\x20\xeb\x53\x63\x31\xda\x45\xf0\xed\xcd\x4c\x03\x2b\x29\x51\x5d\xfa\x07\x3d\xa5\x01\xbf\xf6\x25\x3c\x44\x2b\xfa\xe3\xed\xa9\xf9\x2c\x2a\x34\x0c\xba\x1a\x1d\x37\x51\x11\x12\xed\xb4\x73\xfa\xa6\x38\xb6\x0e\xf8\x84\x28\x01\x2c\x36\xfe\x87\xc6\xa8\x03\xbe\xed\xcc\x09\x55\x61\x8a\x51\x87\xd0\x02\x96\x54\xae\x88\xde\x79\x9e\xbb\xbc\xe3\x76\x3f\x69\xcd\x68\x0c\xcc\x7c\x26\xe5\x0f\xb4\x76\xca\x7b\xe4\x93\x20\x69\xf0\x98\x0c\x26\x4f\x5c\xea\xe0\xf8\x18\xee\xb9\xe7\x1b\x2c\x6b\xfb\x40\x5a\xfc\x95\x93\x13\x32\x28\x45\xc9\x06\xc1\x0c\x2f\xd9\xc4\x7e\x8e\x4c\x34\x56\x9c\x9c\xc3\x8d\x4d\x25\xb9\xe1\x79\xce\x5c\xce\xd7\xa5\x58\xc9\x04\xf6\xf4\x8e\xbe\xc9\x60\xe0\x26\x74\x70\x40\x5c\x70\x41\xe8\x80\x07\xe9\xae\xcf\xae\xae\x34\x09\x70\x50\xb9\x2e\xa9\xba\x99\x12\x10\xae\x19\xc9\x51\x24\xd6\xbf\x11\x5e\x92\xff\x73\x35\xf6\x40\x13\xf3\x42\x50\x85\x9f\xe0\x7d\xd1\x72\xf3\xaa\x22\x33\x86\x19\xb4\x6b\x10\x9f\x33\x14\xd2\x28\xf6\xaa\x3b\xc2\x74\x35\xba\x06\x36\xe5\x10\x4d\x9d\x44\x5e\xd3\xec\xd6\x30\x3f\x33\x66\x44\xa7\xe6\x7e\x9a\xe5\x4f\x6d\xab\xf9\xf4\xf3\xbf\xfc\xb5\x41\x75\x93\xf0\x88\x7d\x22\x8f\xc9\xcf\x8e\x8e\x7f\xfe\x97\xbf\xb6\x8e\x8d\xa1\x29\xf0\x75\xac\x5e\x83\xe3\xcd\xa7\xea\xee\xe7\xd8\x94\x9d\xa4\xae\x4c\x14\x83\x9e\x3e\xe0\xc9\x3b\x3d\x32\xe1\x28\xae\x0a\x36\xd8\x69\x79\xc7\xa5\x18\x0e\x9a\x99\xed\x3b\x6c\xf9\xfb\x9b\x1a\x93\x7d\x6d\x81\xa7\xdc\xfe\x86\x46\x03\x67\x1a\x7b\x5b\xe5\xd4\x04\x96\x67\xb4\x66\x0a\xf3\xda\x3f\x79\xb2\x25\xd5\xaa\xd6\x1c\xae\x9c\x7a\x73\x9e\xb9\x80\x5b\xd9\xbf\x17\x4c\x5d\xd9\xaf\x43\x17\xb0\xed\x2b\x3c\x7a\xe4\x6b\x4f\xb9\x3c\x13\x45\x41\x2b\xc9\xf2\x51\x3b\x7c\x1a\x64\x15\x5b\xf6\x4c\x8f\xc8\xb7\x13\xf3\x69\xa7\xf9\x5f\x56\xd2\x7a\x14\x03\x30\xae\x98\xb7\x76\xad\x9d\x6c\xa5\x81\x75\x20\x6f\x68\x85\x42\x43\x19\xea\x7e\x33\x56\x14\x24\xe7\x4b\x56\x4a\x7d\xd1\xec\x45\xf7\x86\x01\xe0\x25\xd9\xf1\x8e\x40\x47\x76\xe9\xb0\xf3\x2b\xfd\x53\x43\x1c\x0f\x29\x2e\x36\x1a\xce\x45\xb6\x92\x83\x11\x5c\x5e\xc0\xdb\x85\xb7\xd7\x69\xb1\xa1\x5b\x89\x28\x3f\x94\xcc\x0a\x91\xdd\x3a\x26\x54\xcb\x4b\xab\x12\xaa\x83\x62\x92\x10\x37\x98\xc6\x8c\x82\x61\x4d\x9f\xbd\xba\x38\xfb\xee\x38\xc4\x28\xc5\x45\x3e\xe9\xb8\xe0\x60\x1a\x72\xc3\x55\x76\x43\x86\xd0\xbe\xe3\xfa\xa9\x64\x3b\x7b\x3a\x3f\x7d\x6d\x3d\x49\xf1\xae\xbc\xb1\x5e\xa9\x83\x35\xad\x87\x93\x09\x54\x9e\xe8\xdd\xd1\x12\xe6\xc4\xc8\xba\x83\xe3\xa8\x52\xdb\x54\x3c\x50\x35\x2d\x65\x45\xf5\x7e\x37\x0b\x8b\x3a\x67\x35\xbe\xbf\x57\x66\x5e\x3e\xed\x53\x5c\xea\x15\x9b\x2b\x5b\x66\x20\x45\xc1\x73\xd7\xd8\xac\x66\xf4\xd6\xf0\x60\xfb\xa6\xf9\xf6\xfb\xe7\xe7\x97\xaf\x5e\x7e\x7f\xde\x31\xd7\xd6\x4d\xe7\xa8\x11\x04\xfc\x19\x95\x0c\x72\x48\x3e\x26\x83\xea\xee\x4b\xcf\xbd\x31\x2f\xfd\x00\xa0\x6a\x05\x8f\x17\xff\x05\x24\x89\x0a\xe0\xaa\x09\xbb\xa3\x80\x77\x63\x01\x01\xcc\xc8\xf6\x2c\x5d\xb8\xbc\xe1\xba\x19\x4f\x9a\xdf\x84\x02\x02\x52\x85\x9f\x3e\x7c\x19\x2a\x48\x4c\xe5\x9e\xac\x6d\x2b\x7a\x3c\xcd\xc0\xba\x58\x8e\x6d\x99\xfd\x7d\x22\x39\xb6\x65\xd6\x37\xa8\xa2\x0f\x47\x9d\x0a\xae\x70\xf5\x3e\x27\xb8\xc2\x55\xde\xeb\x11\x81\x41\x13\x69\x19\x0e\x4b\x74\x84\x5f\xb8\x2a\x5d\xa1\x3a\x57\xfa\xd6\x15\xb5\xe6\x0c\xf1\x25\xfd\x45\x88\x25\xd9\xd0\xba\xc4\x94\xac\x6e\x1b\xc3\xdf\x41\x1b\x4e\x96\x4c\x4a\xba\x60\xee\x47\x5d\x7b\x25\x11\x75\x5e\x19\xdc\xa9\x59\x2d\x36\xfa\x27\xa8\xbd\x5c\x49\x85\xbe\x6b\x98\x9c\x43\x90\x27\x87\x87\xff\xaa\xb9\x40\xa0\x52\x78\xbe\x6f\xac\x47\x9c\x83\x1d\xc0\x7c\xea\xc5\xb6\xaf\x4e\xe1\xc6\x58\x63\xcc\xf0\x02\x65\x02\xcc\x91\xef\x55\x27\xdc\x88\xcd\x7f\x0a\xb1\xfc\x11\xa7\xd5\x4c\xf2\x6d\xd5\x02\xa0\x26\x80\x1d\xfd\xc5\x17\x86\x37\x25\x94\x85\x8d\x22\xa1\x53\xee\x6d\xd6\x6d\xf3\x27\x59\xcd\xa8\x62\xe7\x05\xd3\x7f\x0e\x07\x39\x5f\x0f\x42\x7f\x92\x66\x03\x53\x9e\xeb\x9b\x07\x66\x77\xa4\x3f\x4e\xcc\xf6\x0c\x76\x55\xc2\xcb\x22\x93\xf2\x9a\xdd\x41\x44\x85\xe3\xc3\x06\xe0\x9b\x74\x44\x66\x05\xcd\x6e\x8f\x07\x01\x87\xd6\x72\x1b\x3b\x22\xff\x63\x3e\x7f\xfa\xf4\xe9\xd3\xb8\xd8\x5c\x94\x6a\xa2\x6f\xbe\x23\x52\xd0\x7a\xc1\x1a\x8d\xc0\xd6\x4f\x6a\x9a\xf3\x95\x3c\x22\xbf\xab\xee\xe2\xef\x46\x0f\x71\x44\x0e\xa7\xff\xf6\x4d\xfc\xa9\xa2\xb9\x66\x8e\xf4\xa7\xa7\x6c\x49\x0e\xa7\xdf\xc0\xff\x77\xff\x8e\x4b\x2b\x51\x1d\xa5\x7e\x07\x5f\x85\x23\xf2\x44\xd7\x6b\xb4\x6f\x4e\xd9\x91\x4b\x2e\x1a\x7f\x9f\x6c\xd8\xec\x96\xab\x89\x62\x77\x38\xc1\x09\x05\xb6\xee\x88\x68\xf9\x2c\x5d\x56\x9f\x8f\x09\x32\x85\xc9\x62\x4b\xf1\x4b\xbf\xf6\x74\xc1\x44\x63\xa3\x5d\xc4\x35\xa5\x79\x7e\xbe\x66\xa5\x7a\xc5\xa5\x62\x25\xd3\x52\x46\xc1\xb3\xdb\xc1\xd8\x53\x38\x6b\xe0\xd9\xe2\x2b\xac\xab\x4f\x31\x0f\xc9\xd9\x0d\x2f\x8c\xcb\x95\xb9\x53\x1a\x60\x3f\xad\x5e\xf5\x7c\xce\x0c\x76\x1c\xba\x09\xbf\xc6\xa3\xf9\x9a\x96\x74\xc1\xea\xa9\xc9\x5f\x72\xc9\x8c\x9b\x81\xb4\xe4\x87\x67\x34\x68\xd0\x54\xb4\xa2\xcb\x3b\xc8\xd7\xfe\xb2\x54\xc3\x3d\x0c\x88\x6e\xe2\x05\xcd\x94\xa8\xc9\xd7\xfa\xd2\x19\xbd\x0f\x04\xa5\x8e\xd3\xa0\xe9\xf6\x05\x5d\xf2\xc2\xd9\x59\x62\x0f\xcc\x52\x4d\xe6\xf0\x79\xe0\x11\x61\x5b\x6a\xc3\xf4\x0d\x11\xac\xea\x28\x5c\xec\x9c\xaf\xc3\x6f\x26\xc7\x94\x5f\xf1\xf6\x55\x73\x1c\xe7\xcb\xda\xdb\x5b\xe8\xb7\xb7\xa3\x5c\x6b\xaf\x3b\x7a\x6e\xbd\x24\x91\xfa\x41\xac\x59\x5d\xd0\x2d\x8a\x65\x06\x39\x87\x2e\xc1\x9b\x5c\x8b\x3b\x7c\x19\xa1\xf0\xb7\xaa\xd9\xec\xbc\xbc\x24\xbc\x44\xbf\xe8\x35\x78\xfd\xf2\x92\x50\xbc\x4b\x88\xde\x86\x31\xc9\x58\x09\xb8\x46\x00\x34\xb3\x36\x7c\x44\x90\x9a\x23\xb0\x96\x38\x67\xe6\x5b\xc6\x30\xd9\x88\xed\xce\x3e\x67\xb3\x9a\xb3\x39\x64\x83\x85\xcc\xc1\xe8\x20\xd3\xe8\x12\x24\xae\xad\x58\xf9\xe6\xf4\xd2\x0d\x94\xb7\xb1\x64\x37\x2c\xbb\x75\x0c\x28\x22\xe0\xc4\xab\x33\xe7\x75\x1b\xff\xc6\x82\x6d\x2f\xe5\xc2\x2c\xca\x9d\xc2\x4c\x3f\x7f\xba\x7e\xfd\x6a\xe4\x06\x69\xac\x38\x7a\xdc\x26\x9a\xc7\x4c\x63\x9a\x42\x8e\x10\x95\xfa\x60\x98\x02\x68\x35\xde\x04\x70\x58\xa0\x5c\x91\x19\x9b\x8b\x9a\x91\x39\x05\x99\x53\xac\xe0\xb1\x46\x72\xf1\xed\x93\x48\xd5\xff\x64\xfa\x8d\xf1\xe3\x95\x53\x42\xde\x50\x29\x81\xc1\x84\xd7\xd6\x42\x4d\x9b\x9a\xb6\x31\xa9\xe8\x96\xac\x2a\x70\xc3\xd7\x7b\x35\x14\x35\x59\x95\x8a\x23\xac\x79\x69\x3d\xc1\x0a\xba\xdd\x97\x9f\x4b\xbf\xd4\x17\x66\xf7\x82\x47\x7a\x29\x17\xe3\x70\xca\xcd\xf7\xda\xb4\xde\x7e\xab\xdd\x19\xdc\xa1\xa7\x0e\xea\xde\xfb\xad\x0e\x2b\xef\x7a\x72\x1b\x6f\xe2\x93\x6f\x9a\x8f\x62\xf0\xa4\xde\xdd\x4d\x12\xaf\xea\x17\x7b\x35\xfb\xbe\x81\xfb\xde\x35\xfb\x54\x6a\xc1\xce\x34\x68\x2d\x0c\x4f\x7e\x77\xb8\x94\x84\x51\xc9\x26\xbc\xec\xf7\xca\xb5\x9f\xcc\xfd\xed\x8e\xba\xb6\x31\xf1\x2a\x82\x62\x54\x8b\x1d\x1d\x2f\x23\xd3\x4f\x81\xae\xe2\xd0\xfa\x8e\xdd\x17\xa9\x44\xf5\xa6\x16\x15\x5d\x50\xaf\x52\x02\xce\xdb\x98\xeb\xc2\xb7\x32\x45\x11\xa1\xf8\xb7\xdb\x4b\xff\x78\x47\x33\x1d\xf2\xe4\xee\x20\x82\x5d\x0d\xde\xf7\x39\x6c\xb7\x13\xf3\x01\x4b\xb9\xd8\xd5\x5d\x68\xd7\x9a\xfe\xdb\x37\xde\x04\xd5\x3e\xc3\xad\xd7\xd4\xbf\xa5\xad\x07\x34\x3a\xfb\x4e\x4e\xcb\xf9\x5a\xb3\x09\x4e\xa9\xb4\x60\xea\xac\xe0\xac\x54\xfa\xd7\xa1\xbf\x16\xac\x61\xc3\xb4\xb2\xaf\x4e\xbb\xb3\xae\xd9\x02\x4e\xad\x21\xa1\xa1\x19\x8d\x0f\x3e\x0e\xba\xb3\xbe\x12\xe4\x80\x3c\x0d\xb4\x29\x5d\xed\x16\x18\xe5\xea\x9a\xb4\xd1\x53\x61\x8b\xe6\xb7\xae\x30\x09\x23\xe4\x5f\x59\xdc\x03\xf0\xf8\x78\x73\x17\x8f\x20\x25\xef\x46\x36\x0f\xec\x2f\x0e\x3b\x68\x9b\xea\x9a\xc5\x5c\x23\xe1\x03\x76\x72\xd2\xce\x83\xdc\x5a\xdc\xde\xb1\x06\x20\x30\xef\xa1\xbf\xc1\x71\xa2\xf0\x3d\xa2\x19\x9c\x4a\x79\xbe\x9b\x6e\xed\xff\x76\x95\x8c\x38\xb3\x56\x41\x77\x0f\xed\x18\x6d\xa8\x00\xea\xbb\x02\x78\x02\x6d\x0d\x17\xa1\x62\xfe\x08\x77\xe7\xe3\x47\xf2\x04\x03\x31\x02\xd6\xf0\x0d\x95\x8a\x05\x39\x87\xb6\x52\xb1\x25\xc9\x0a\x5e\xcd\x04\xad\xf3\x66\x5a\xd6\x3d\xcf\x7e\x05\xad\x75\x61\xcd\x60\x35\x28\xf3\xa2\x16\xcb\x33\xdb\xc9\x30\x7e\xab\xe3\x01\x9e\x89\x6a\x4b\x28\x41\xee\xcb\xb9\xe2\x36\x86\xe9\xd0\x1a\x85\x62\x47\xc6\x1b\xac\x66\xa8\x0b\xc1\xf7\x89\xe5\xa4\xa6\xe5\x82\x35\x93\x84\x8f\x35\x13\x69\x94\x55\x9a\xe8\xdb\x08\x9c\x96\xef\x93\xaa\x36\xbe\xd0\x76\x24\x99\xa8\xb6\xfb\xa2\x3b\x45\xb5\x45\xd0\xd6\x6b\xe1\xe6\x1b\xab\x2d\xea\x86\x0a\x2b\xbc\xbb\x31\xc2\x7f\xe2\xe6\x39\x29\x85\xe2\x19\x1b\x8c\x90\x2a\x03\xea\xc6\xcb\xc1\x73\x5d\x3e\xfc\x66\x1c\x45\xbc\xe8\xe5\xb4\xa2\x1a\x84\xe5\x04\x21\x4d\x18\x33\x5a\x6d\xaf\xc4\xaa\xce\xd8\x5e\x1e\xaa\xaa\xd9\xc0\x40\x8d\xd9\x3a\x91\x8a\x43\xff\x3c\x51\x22\x18\xbd\x84\x42\x83\x46\x9d\xf8\xf1\x91\xaa\x6e\x7c\xef\x62\xc7\xd2\x1c\x8e\x6e\x2d\x60\x43\x12\x8c\x4a\xb3\xc4\x4e\x46\x0a\x95\x13\x93\xdf\xff\xbe\xba\x0b\x5f\x4f\xbf\x28\x33\x91\x6f\xa3\xc7\xcc\x8f\x3c\x8a\x59\xeb\x6f\xe4\x02\x17\xc2\x32\xbb\x41\x3b\x08\xc6\xa6\x19\x23\x97\xff\x39\x2e\x78\x61\xfd\x13\x9b\x45\xf1\x83\x2d\x0c\xc6\x9a\x56\xa3\xee\xd7\xa8\x58\xa2\xc9\xe0\x77\x34\xcb\xb8\x2f\xf8\xaf\xd3\xa2\x80\x25\xa8\x59\xd9\x5a\x05\xa4\x41\xf8\xd5\xd6\x0a\x4e\x44\xfb\x06\x40\x33\xe2\xcb\x73\x70\xb2\x83\x4c\x13\xab\xaa\x12\x75\xe0\xb0\x31\x65\x77\x8a\x95\xf9\xd4\xe6\x51\xa2\xa5\xf4\xa8\x46\xae\x14\xb6\x83\xc9\x2a\xcc\x35\x24\x4a\xf2\xf2\x7c\xda\xb4\x26\x9a\xe6\x5c\x4e\x17\xf7\x7b\x66\xcc\x8a\x43\xbf\xf8\xe3\x68\xd9\x6d\x86\x97\x46\x4b\x43\xb7\xae\xe3\x70\x45\x3d\x9b\x19\x90\x78\xc7\x23\x12\x2d\x62\x0b\x40\x4c\x06\x33\x65\x39\x90\x35\xa0\xaa\x81\x94\xc7\xe7\xa4\x14\x28\xa3\x42\xc2\x65\x2c\xd4\x02\x19\xc3\xcb\xec\xa3\xae\xf2\x69\x2f\x9a\x98\xdf\x39\x3c\x88\x29\x73\x64\x93\xd0\xe3\x80\x57\xf3\xf1\x38\x26\x9e\x6d\x99\x05\xa9\x7b\x76\x98\x74\xcd\xa8\xf1\x99\x34\x24\x72\x65\xa2\x32\x80\x5a\x4d\x04\x5b\x90\x77\x6d\xc6\x16\xbc\x2c\xd1\xe3\x12\xd1\x16\x30\xc3\xa0\x31\x3d\xd2\x5a\x25\x08\x3d\xf8\xdd\x9e\x89\xb2\x79\x6a\xa0\x0c\x9e\x1a\x33\x70\x5d\x04\xf2\x44\x7e\x4f\x97\x8c\x3c\x3c\x21\x83\x3f\x4f\x2e\x2f\x7e\x1c\x24\xfc\x94\xdd\x2a\x39\xea\xc6\x59\x94\x84\x96\xe4\x6e\x52\x8b\x0d\x74\x38\xc6\x30\x22\xae\x40\x3f\x0f\x91\x5c\x26\x29\xba\x58\x32\x4c\x60\xce\x4b\x69\xcd\x03\x50\x6f\x4a\xc8\x69\x9e\x43\x88\x56\x33\x0d\x9d\x8b\x6f\x90\x7c\x56\xf0\x72\x21\x6d\x6b\x3e\x9b\x7a\xb0\x96\xd3\x07\x4e\xfa\x8e\x27\x76\x72\x42\x06\xff\x43\x13\xd6\x80\x3c\x7a\x04\xc3\x0c\xc9\x37\x2a\x76\xf5\xe6\xf4\xfb\x41\x13\xf1\xa4\x34\xbe\xff\xca\xea\x50\xf0\x07\x40\x4e\xd2\x37\x7d\x4e\x64\x45\xad\xf3\xcf\xaa\xf2\x18\x9d\xb4\xc4\xde\x4c\x6b\x66\x47\x1a\x03\x88\x40\x2a\xd0\xf5\x1b\xc7\x6f\x67\x7f\x85\x93\x0f\x50\x40\xc2\x76\xe2\x42\xde\x60\xe7\xe9\xe4\xb1\x37\x6f\x77\x24\x08\xd5\xff\x6a\x66\x08\x3b\x38\x20\xe7\x10\x69\xd2\x41\xa6\x41\x18\x4a\x48\xa0\xac\xcc\x1d\x79\xee\xcb\x4b\x1a\xdc\x3f\x65\x8e\x1a\xc5\x49\xca\x67\x23\x2a\x17\xdc\x49\x2d\x0a\x37\xcd\x7c\x11\xfa\x86\xf9\xfd\xa6\xd4\xed\x03\xb2\x3a\xc9\x9b\xb9\x1d\xf8\xef\x46\xdc\x25\xbb\x53\x3b\x09\x3b\x28\xe0\xf4\x21\x8e\xb6\x3e\x8f\xa4\x01\x70\x6b\x1d\xc0\x05\x5f\x8a\x0d\xb0\x68\xc3\xc6\x25\x79\x29\x36\x2e\x78\x61\xb7\x67\x53\x44\x7b\x61\x35\x48\x18\x7e\xec\x25\x89\x82\xcf\xa6\x9b\x6c\x2a\x57\x33\x7c\xc0\x86\xf5\x7a\x1c\x9e\xd2\xb1\x2b\xa1\x50\x2a\x1e\xd6\xeb\x11\x99\x90\x90\xe2\x9b\x32\x46\x04\x05\xef\x08\xb8\x43\xe0\x30\xb4\x8b\xb9\xc6\xb8\x32\x36\x72\x8a\x91\xb6\x9a\x4d\xc9\x99\xd1\xf8\xee\x13\x0e\x12\xdc\x50\x87\xc7\x28\x3e\xba\x76\xb5\xa3\xc7\xd8\x7b\x47\x41\xa9\x87\xa1\x18\x8e\xce\x0a\x29\x39\x04\x0a\x9b\x95\xe8\x1c\x64\xac\x50\x49\x01\x3d\x04\x52\x47\x47\x66\x8b\xc7\x64\x70\xd7\xf0\x31\x8b\xa3\x4b\xa2\xf4\x32\x6b\x71\xcb\x72\x32\xdb\x36\xbd\x5e\xbe\x63\x5b\x5c\x9e\x0d\xc6\xd6\xfe\x70\x4d\x6e\xd9\x56\xaa\x5a\xdc\xc2\x99\xcb\x99\x8a\x99\x9c\xb6\x00\xa7\xaf\x87\x6b\x13\xba\x8e\x7f\xd5\x0c\xd3\x92\x2b\x6b\x26\x77\x4d\x8e\xf5\xb1\x7d\x7b\xfd\x62\xf2\xe4\x7f\xef\xd9\x47\x51\xfe\x70\xfd\x9d\x1b\x49\x2c\xdc\xb9\x13\x19\x46\x46\x89\xa2\xb8\x28\x5d\x8d\x0f\xb1\xbf\xda\x0e\xf4\xc5\xe0\xa4\x79\xf4\x45\x07\x65\x2f\xe2\x81\x60\xe9\x5b\xb3\x68\x53\x56\x66\x22\x67\x76\x48\xf1\x9a\xbf\xa2\xab\x32\xbb\x61\x92\xac\xea\x02\x2f\x2b\x88\xfc\xa6\xb3\xae\xa5\xd4\xe5\xde\x5e\xbe\xd2\xa7\xa3\x80\xba\xad\x5a\xbb\x96\xab\x62\xe5\xdb\x3a\x82\x0d\x59\xd5\x85\x5f\x25\x04\x50\x98\x66\x37\xb5\x58\x42\x04\x48\xf4\xc3\xd4\xf8\x2d\x04\xaf\xce\x0b\x51\x93\x33\x2c\xbd\x7e\x4a\x68\x55\xc9\x71\x98\x46\x0d\x3d\x4e\xb9\x24\xa7\x6f\x5e\x82\xbb\x91\xf1\x5a\x20\x7a\x20\xa6\x71\x89\x17\x6f\xdc\x05\x8c\xf4\x9a\xce\x86\x7f\x1d\xac\xea\x62\x70\xa4\xa7\xfd\xa9\xed\xff\x0e\x59\x80\xb8\xe6\x78\xcd\x40\x75\x35\x3d\xa5\x31\x19\x7c\x98\x15\xb4\xbc\xb5\xa6\x86\x0d\x37\x42\x94\x4b\x41\xe6\xb6\xe0\xa2\x32\xc1\x94\x8e\x9f\x5f\xd5\xfb\xb4\x2d\xba\x9f\x2b\x53\xfc\x6d\x5d\x74\x79\x08\xaa\x7a\xd7\xb5\xf1\x20\x78\xb8\x51\x65\x52\x0a\x7f\xff\x8d\x01\xdf\x82\x96\x39\x61\x77\x95\xfe\x0f\xbc\xcb\xc6\x8e\xb7\x25\x60\xa3\x46\xef\x3f\xb4\xb1\xd6\xc4\xaa\x00\x1b\x18\x3a\xe0\x85\x89\x6d\x78\x71\x77\xa7\x28\x6c\xc5\xaa\xbd\xc3\xb7\x13\x80\xc1\x80\x0b\x4c\x49\x18\x66\xfa\xac\x68\xc6\xc6\xe6\xd1\x98\xba\x27\x3f\x1c\x66\xc3\x9c\xe4\xd9\xb5\xd7\x2e\x76\x4b\x13\x3a\x97\x04\xa2\xd8\xac\x21\x4e\x2f\x3d\x7a\xe1\xd8\x16\xad\xb3\xfc\x1f\xc8\xd3\xc3\xff\xf5\x3b\xf2\xf1\xa3\x1e\xf9\x54\x32\x5a\x67\x37\xc3\x83\x77\x3f\xc9\x9f\xde\xfd\xf4\x7e\x38\xfa\xeb\xa7\x6f\xff\xf0\xd5\xe0\xa7\x9f\xfe\xeb\xe7\xf7\x07\x23\x48\x76\xd7\x52\x96\x7a\x3e\xea\xed\xe5\x4b\xc2\x81\x7f\x42\x79\x93\xe5\x56\x5d\x05\xa4\xdb\x04\xe4\x00\xb9\x53\x62\x50\xaa\x6e\xe5\x47\xe6\x12\xc4\x6d\xe8\x56\xf3\x97\xb7\x25\xb2\x48\xf0\xd6\x19\x4f\x3c\x99\xdd\xb0\x25\x1d\x13\x29\x08\x95\x80\x33\x78\xa3\x54\x15\xce\xcc\x4c\x62\xf0\x5f\xef\xe8\xe4\x97\xd3\xc9\x7f\xbe\x37\xff\x3d\x9c\xfc\xfe\xf1\x74\xf2\xfe\xeb\xa3\x83\x83\xc1\x28\xc4\xbe\x0b\xfa\x06\x20\x02\xae\x58\xc1\xa5\x22\x94\xcc\xd9\x86\x00\x01\x67\xa2\x30\xe2\x7a\x41\xb3\x5b\x42\x57\xea\x46\xd4\x5c\x71\x26\x0d\x9c\xe5\xca\xf1\x6f\x25\xd0\x9b\xf5\x1b\x3f\x38\x98\x12\xf2\x8a\xdf\x32\xb2\xa4\xbc\x50\x26\x71\xab\xf3\x10\xd5\xc3\xad\x0a\xae\x86\x83\xa3\xc1\x98\x3c\x19\xbd\x3b\x7c\x1f\x44\xa0\x50\xc9\xc8\x00\xeb\x0d\x3c\xca\xa8\xf3\xb5\x23\x6d\xbf\x41\x4b\x80\x03\xbd\x28\x7a\xa2\xe4\xb1\x55\x51\xb5\x2a\xc7\x61\x98\xe6\x9a\x03\x0d\xdf\xb1\x3e\xe9\xde\xc3\x38\x8f\x54\x90\x97\x62\x83\x73\x36\x7f\x1b\xc8\x3b\xbc\xa6\x60\x45\x00\x54\x4e\x2f\x00\x58\xb6\x60\x85\x0c\xa4\x67\x49\xe6\x98\xca\x8b\x20\xaf\x22\xca\xd7\xba\xe0\x70\x94\x32\xdf\xef\xef\x28\x13\x10\xed\x0c\xc3\x8b\x40\xfe\x21\x18\xc6\x3b\x11\xba\xcc\xd2\xc1\xb0\x9a\x6f\x05\x18\xee\x3e\x11\x66\xb2\x5e\xba\x72\x68\x80\x2e\xf3\x62\x5f\xc2\x2f\x33\x97\xe8\x5a\x0b\x3c\xbc\xb4\xb4\x26\x32\x26\x25\xcb\x9f\x6d\x6d\xf5\x3f\x41\xc3\xf5\x87\x98\x12\x6b\xb6\xe0\x52\x33\x68\x62\x55\x9b\x41\xe0\x08\x6a\x8b\xd5\xe1\x02\x82\xc6\x16\xf1\x54\xff\x57\x05\x89\xce\xb0\x31\x0b\xb5\x6a\x80\x6f\xc0\x23\x9a\xd5\x53\x42\x5e\x87\xfb\x03\x74\x2d\xb2\x6c\x55\x93\x38\x02\xc3\x37\x14\x37\x60\xe1\x0a\xf4\x19\x04\xd7\x8a\xf6\xb0\x66\x2b\x85\x31\x1a\xfa\x3a\xd8\x50\x58\x47\xdb\x98\x59\x08\x5d\x63\x49\xd4\x86\x67\x46\x8e\x38\x38\x08\x16\x21\xa3\xba\xe6\x5f\xb4\xa8\x65\x4c\xa4\x64\xb6\x9a\x81\x48\x40\x66\xcc\x06\x66\x20\x8c\x1d\x46\x9b\x12\x10\xbe\x30\x6a\x5e\xea\x0b\xc2\xb6\xa6\xc7\xc1\x32\x51\x5b\x17\x7f\x6c\x4d\xcc\xfe\xa2\xef\x13\xe3\x83\x8a\xe8\x74\x9a\xb0\xb6\x5a\x8c\x53\x8c\xe6\xc9\x1c\xcb\x20\x46\xb0\x4a\xd4\x0a\x96\xf0\x1c\x57\xf0\xc4\xd9\xfc\xd9\x9c\x51\xfc\x74\x09\xa5\xe4\x87\x46\x3c\xce\x5a\x4d\x97\xfe\xb3\x8b\x19\x5f\xab\xe9\xeb\x8b\xb7\x57\xe7\x1f\x2e\xcf\xdf\x5c\x5c\x5e\x7f\x78\xfe\xf2\xea\xf4\xd9\xab\xf3\xe7\xf8\x66\xec\x24\x1e\xfd\xde\xd4\x2b\x66\x2f\xe3\x8b\x12\x9d\x91\x21\x7f\xd3\x81\x89\xab\x80\xe8\xe5\xdc\x6e\x53\x7c\x0c\x08\x9b\x86\x47\xee\x84\x38\x5f\xa8\x21\x9b\x66\x60\x89\xfc\x0f\x32\x69\x33\x7c\x89\x18\x94\x11\x39\xd8\x25\x31\xed\xf1\xad\xb2\x16\x49\x93\xc5\xd2\x0f\xcb\xc1\x6d\xba\x91\xd9\x81\xfd\x79\x77\x87\xfb\xfb\x34\xf8\xa8\x8f\x03\x94\x4a\x36\xd5\xe7\x19\x84\x66\x6f\xbe\xd7\x8c\x5d\x6b\x40\x7f\xe8\x82\x5b\x75\xa7\xf9\xb5\x6d\xa0\x99\x72\xb8\x0e\xc2\xc1\xee\x1d\xdf\x45\x1e\xb6\x48\xb0\xad\xd5\xf0\x08\x20\x2e\x00\x4d\x33\x44\x00\xa3\x5b\x0a\x2d\x34\x96\x39\x46\x43\x85\x57\x81\x81\x7d\xc1\x96\x6e\x84\x7e\x05\xab\x6a\xec\xe0\x97\xcd\x49\xf6\x4e\xbe\xcd\x08\x31\x10\x76\x1c\x8d\xd9\x86\xfc\x58\xd0\xa9\x4a\x54\x16\xe8\xf7\x96\xb1\x4a\x26\x5b\x02\x35\x09\x40\x0f\xcd\x99\x66\xe3\xdd\x69\xd6\x07\xb6\x10\x19\x2d\x50\xc6\xf4\x52\xb8\xe3\x98\x62\x82\x9e\x90\x27\x7a\x33\xf7\x45\x0c\xb9\x63\x9a\xa0\xbc\x1e\x4d\x84\xb9\x5b\x48\xaf\x00\x38\x88\xbd\x33\x4f\x71\xc3\xf1\xee\x1e\x41\x7b\xbd\x43\xed\x82\x07\xbf\x93\xca\x43\x27\x26\x36\xa5\x85\xfa\x8e\x6d\x35\x6f\xd8\x4d\x6f\x96\xe2\x7e\xb8\x36\x84\x84\x25\x8d\x6b\x77\xce\xa5\x4f\x9f\xa2\x2f\x6a\x04\x1b\x85\x4b\x92\xe5\xb0\x95\xbe\x15\x5a\xa8\x89\x1b\x8a\x21\x39\x7f\x5b\xe1\x93\xe3\xf1\x50\x90\x02\x1a\x9b\xef\xd2\xf7\xb5\x6f\x61\x7b\x49\x86\xb7\x42\xc0\xa0\x9f\x23\x38\xf9\xd0\xb9\xd6\x34\xa4\x26\xbc\x5a\x5d\xdc\x3a\x3c\x29\x73\xfd\x44\x6f\x4a\x56\xcb\x1b\xee\x10\xe2\x70\xb4\x0e\x73\xae\xc7\xb8\xc0\xab\x3c\x1a\x58\x97\x8c\xe1\x8c\x3b\xd7\xe2\xbc\xcc\xbd\xaf\x50\xe7\x6c\xa0\xe9\xc0\xa5\x28\xed\x6c\x14\xd1\x45\xf7\x56\x37\xa8\x26\x9f\x15\xe8\xf3\xeb\x50\x0f\x32\x51\x6d\x2f\x8c\x88\xd7\x20\xcf\x5f\x23\x52\x85\x3a\xa1\x5e\xc6\x38\xe2\xb5\x8e\x8d\x31\xfb\x01\x3f\x64\x53\xc0\x98\xd3\x04\xfe\xe8\x91\x2e\x94\xa9\xba\x30\xe4\xce\xa6\x4b\xa6\xe8\x77\x6c\x3b\x8a\xc8\xfc\x39\x9b\x89\x15\xe4\x27\xd7\x37\x17\x72\x11\x1e\x0a\xd7\x2c\x87\x79\x56\x21\x48\x75\x2b\x56\x16\x70\x31\x17\xab\x59\xc1\xa0\x44\x40\xf1\x56\x2b\x01\xf2\x11\x57\x63\xab\x17\x00\x62\x9f\xf3\x9a\xa1\x94\x88\x67\xc1\xf6\xe0\x98\x2b\x30\x13\xfa\xd6\x40\x80\xc1\x05\x66\x79\x43\xb1\x6d\xd2\x32\x62\x6c\x2c\xaf\xa5\x22\xe1\x60\xad\xbc\xb1\x23\xe2\xdd\x88\x07\xf1\x96\xb4\x3e\xc7\x2e\x2c\x4e\xae\x08\xa5\xfe\x10\x68\x73\xcf\xd3\x1d\xfe\xef\x1b\xe7\x26\x92\xc4\x64\xdf\x7b\xa3\x61\x11\x1c\x12\xf2\x5f\x9a\xd7\x38\xd3\x8b\x80\x3e\x25\xf0\xbe\xcf\x56\x4a\x89\x52\x37\xf1\x94\x1c\x7c\x6d\xd0\x07\xcd\x8f\x5f\x1f\x8c\xc8\xc7\x8f\xc1\x90\xc3\xe2\xbe\x5d\x68\xed\x19\x7c\x08\x3d\x77\xbc\xc3\x19\x38\x94\x0c\x47\xa1\xa3\x4e\x26\x4a\x29\x0a\x36\x35\x01\x16\xc3\xc1\x19\x78\x18\x03\x02\x2e\x0c\x6e\x49\xcb\x15\x2d\x8a\x2d\xc9\x31\x34\x65\xc3\x66\xa4\x66\x98\x72\x5d\xb3\x08\x83\xd1\x71\x8c\xa1\xbe\x63\x59\x56\xd5\xa0\x39\xd9\xc3\xe4\x11\x0e\x5f\xc4\x26\x5e\x69\xe3\x5e\x0a\x4d\x9f\x8d\x77\xe9\x73\x4f\x6d\x6b\xdc\x4b\xb1\x66\x03\x3c\x9d\xad\x09\x8d\xc2\xb1\x06\x1c\xdf\x33\x94\x57\xf0\x59\x64\xe5\x82\x2e\xc2\x01\xea\x23\xcd\x25\xfe\x1c\x30\x67\x13\x2b\xe5\xa0\x96\x5c\x94\x36\x92\xdf\xb1\x49\xd3\xb6\x8b\x5b\xaa\xa7\xe4\xdd\x9e\x28\x1e\x78\xee\x91\x01\xfa\x6e\x44\xcb\x71\x70\x40\xce\x97\xab\x42\x8b\x2f\xb4\xd6\xac\xca\x2d\xdb\x6a\xa1\x48\x4a\xa6\x99\x3b\xea\x92\x1c\xdd\x30\x56\x44\x43\x6c\x68\x71\x7f\xd4\x05\x4e\x75\x13\xdf\xb1\xad\xfc\xd0\xbe\x07\xe3\x35\x74\xca\x58\x48\xc4\x80\x50\xaf\x26\xcc\xcc\x41\xd8\x72\xf9\x26\x84\xd5\x1a\x8e\xe2\x03\x17\xec\x15\x8c\x6e\x10\x9e\x09\x93\x00\x5b\xd1\xa4\xf5\xdd\x8f\xf8\xb9\x2e\x33\x64\x81\x4b\x9a\xae\x59\x98\xa4\xfe\x88\x16\x2f\x97\xb4\x56\x2f\x0a\x21\xea\xe7\x7c\xcd\x73\x36\x8c\xee\x16\x80\xe9\xa7\x33\x39\x84\xee\x46\xe3\x9e\x92\x88\xcb\x0c\x61\xc6\x4a\x61\xa8\x83\x9f\xee\x9e\xcc\x2e\x06\xe4\x31\xc1\xe6\xc8\xb7\xe4\x90\xfc\x91\x0c\x9e\x0d\xc8\x11\x19\x9c\x0e\x82\x71\x5a\x4d\xb7\xe6\xb5\x4d\x32\x6c\xdd\xc8\xb4\x66\x15\xa3\x6a\x08\x53\x18\x85\xdd\x74\xfb\x03\x7f\xf2\x4f\x35\xf2\x25\x07\x5f\xfb\xed\x4d\xbc\xd9\x5f\x1f\xb4\x1c\xd2\xfb\x9c\x89\x1e\x17\xa9\x11\x6c\xd6\xc9\x33\x03\xd6\x4b\x08\xc2\xd1\x4d\x05\x12\x83\x8b\x92\xc0\x0a\x7a\xbc\x61\x7b\xc0\xed\x3b\x90\xdf\x69\xdf\xc3\xdc\x60\xeb\xfa\x9d\xb1\x48\xac\xfd\x66\xd4\x88\x25\xde\xd7\x86\xf5\x84\xf5\x22\x68\xa2\x91\x80\xa1\x4f\xde\x63\x8d\xd5\xbc\xb8\xb1\xf2\x50\xe0\x18\x94\xd7\x74\x31\xb1\x47\x9b\x7a\x66\x9a\x9c\xbe\xb8\x3e\xbf\x0c\x98\x4d\xe0\x97\xc3\xe6\x78\x69\x90\x2c\x40\x83\x88\xb8\xac\x42\x90\xc2\xa0\xa2\x76\xde\x78\x8d\x65\xbf\x2f\x1b\xda\x87\x7c\xbd\x96\xdd\xea\xfe\x02\x4f\xf6\x1d\xcf\xd5\xbd\xdf\x1f\x00\x33\x01\xb5\x07\xb2\x6b\xa2\x24\xa6\x3d\xbd\x3c\x66\x61\x60\x5d\x15\x5b\x56\xa2\xa6\x35\xd7\xef\x6b\x28\x9a\x10\xea\xf4\x68\xa1\x68\x32\x25\xe4\xa2\xd4\x65\x05\xb6\xec\x44\x5e\xcf\x6e\x69\xf6\x10\x55\xfa\x02\xf6\x32\xd4\x44\x81\x46\x8c\x2f\x97\x2c\xe7\x54\xb1\x62\x4b\x6e\x4d\xea\x6d\x08\x79\x95\x4d\x91\xa6\x8f\xe0\x10\x45\x4f\xa1\xef\xb8\xb4\x61\x4a\x5a\xe0\xae\x51\x5a\xe7\xd2\xe4\xbc\xdc\x02\xca\x05\x9c\xca\x52\x6c\x08\x9d\x89\x95\x8a\xf4\x00\xa1\x3a\x16\xf9\x5c\x8f\xab\x6d\x83\xa5\x29\x29\x45\xbd\xa4\x05\x79\x7e\xf1\xda\x02\xc0\x78\x9e\xd2\x2c\x60\x9e\x83\x74\x4c\x0b\x48\x11\x11\x48\xe5\x03\xd0\x46\x0c\x62\x39\x7b\x10\x28\x77\x7f\x2b\xfd\x6c\x53\x3d\x4b\x22\x47\x35\x2d\x60\x6e\x50\x4f\x9d\xad\xa4\x81\x66\x6c\x8d\xc5\x05\x0c\x1b\x38\x09\x0c\x19\xe6\x73\xfb\xb7\x8d\x14\x8e\xb2\x81\xee\x1c\x1a\x80\xbf\x9f\x41\x6f\x91\x02\xd9\x34\xd8\x95\xa7\x20\x01\x8d\x31\xb6\x83\x08\x41\x13\x43\x60\x0e\x6f\x7c\xb7\xa3\x3f\x39\xc1\x5b\x34\x34\xc0\x77\xc2\xbc\x3f\x48\xaf\x97\x8a\x73\x33\x06\x10\x49\x7b\xe7\x8e\xd5\x12\xe6\x40\x73\x0f\x77\x06\xd6\xef\x18\x8d\x71\x24\x04\xee\x39\x0f\x3c\xc6\xdc\x08\x77\x92\x97\xa6\x68\x64\xbc\xef\x4b\x62\xc0\xfd\xa7\x4c\x00\x01\xff\x80\x2e\xc4\x36\x56\x75\x78\xf0\x53\x79\xb0\x5c\x8c\xc9\xe0\x27\x13\x37\x63\x8a\x25\xed\xe1\xfa\x9b\x77\x9e\x88\x94\x84\xb3\x9a\x66\xb7\x4c\xb1\x1c\xc6\x80\x7b\x19\x72\x2c\xef\x9e\x1e\x1e\xfe\x3f\xcd\xb5\xc0\x8f\x8f\xdd\x8f\x4f\xfe\xdf\x20\xb2\xca\x37\x78\x95\x9d\x3b\x8e\x41\xfa\xb5\x31\xfa\x68\x5e\x3f\xf0\xcd\xef\xbf\xd6\x50\xd1\x59\x65\x76\x2e\xf0\x99\xa8\xb6\x5d\x26\x16\xe4\x72\x56\x92\x99\xd7\xe7\x47\xb0\x6f\xeb\x1a\xf6\x51\xe8\x7a\x9f\x9a\x42\x6b\x97\xd4\x12\x65\x89\x38\x4c\xe4\x36\xd9\x75\x20\x10\x19\xb4\xe1\xfc\x0f\x8f\xbe\x43\x28\x30\x77\xb6\x16\xfc\x72\x5e\x33\xc0\x17\xb1\x46\x2e\xbd\xff\xc8\x18\x00\xc0\x2d\x2a\x4d\x41\x3f\x6a\xae\x57\x44\x2f\x68\xa6\x1c\xd2\x7c\x05\x55\xe4\x96\xa3\xcb\x1e\xb4\x32\x63\x85\x28\x17\x12\xb3\xa9\x79\xf4\x55\xb0\xf7\x7c\x4d\x22\x8c\xd5\xb1\x7d\xc2\xf4\x6b\x99\xd1\x52\xdf\xfc\xec\x8e\x65\x2b\x7d\xae\x22\xf8\x0d\xab\xe1\x86\xa7\xd5\x02\x82\x56\xb5\x58\xd4\x74\xb9\xa4\x8a\x67\x04\xbd\x6b\xf0\x4e\xdd\xbb\xd1\x97\xb0\x5a\x1d\x4e\x02\xa8\x6c\x3d\x33\x99\xa6\x82\x34\x68\x2d\xbe\x5e\x33\x0a\x20\x99\xa0\x5f\xd5\x1e\x03\x05\xe9\x6d\x30\xf8\xf8\x91\x1c\x1e\xfb\x3c\x8e\x76\x28\x1d\xc2\x48\xf7\xb0\x2c\x16\xed\x6e\x5d\x48\x4f\xc3\x09\x0e\xca\x25\xdb\xf2\x6b\xf4\xad\x96\xf1\x3f\x7e\xf4\x23\xd5\x3f\xc4\x46\x47\xba\x16\x3c\x37\x52\xae\xe4\x6a\x85\x37\xbe\x89\x5c\x06\x9e\xc1\x80\xae\x48\xb1\x64\x8a\x2f\x59\xc0\xf8\x58\x62\xb3\xcd\x2d\x98\xd2\xe4\xae\x39\xdd\xdc\x5f\x08\x0e\xc4\x50\xd4\x24\x5f\xd5\xd6\xb0\xcf\x4b\xae\x38\x2d\x48\x21\x68\x3e\x36\x36\x0a\xb4\xfe\xd9\xe6\x72\x46\x0b\xab\x68\xa3\xca\xda\x0a\xf1\xe8\x68\x92\x04\x43\xa4\x19\x1d\x9f\x03\xa6\x0b\x73\xae\x0f\xf1\x55\xa4\x3f\x66\x20\x4a\xcb\xd0\xd0\xe1\x21\xaf\x34\xd1\x8d\x81\x0b\xd7\xe3\xd3\xfc\x1a\x5f\xa3\x7b\xd7\xa1\xe6\x93\xd6\x68\x45\x31\x56\x77\x7d\xe9\x1d\x92\x35\x2d\x56\x4c\x76\x5a\x0b\xb9\xfc\x9e\x6d\x8c\x3f\x5a\xb4\x29\x0f\xbb\x92\xdb\x45\x5a\x26\xf7\x3f\xb7\x77\x89\x7a\xa1\xbc\x8a\xdb\x69\x99\x53\x7d\xdb\xd9\x4c\xe7\x00\x60\x94\xf3\x5c\x33\xa0\x78\x0a\xc7\x68\x60\x45\x30\x3b\xf0\x1e\x61\x6b\x56\x6f\x31\xd5\x30\x97\x0f\xac\x34\x61\x00\x70\x2c\x3b\x01\xf7\x83\xee\xf8\x43\x38\xa1\xb1\x1b\x62\x00\x43\xd7\x80\x40\xb9\x07\xbc\xc2\xc3\x13\x9b\x2b\x55\x53\xb3\x5b\xc5\x80\x49\x09\x7c\xfd\x9a\x58\xcd\x4d\x76\xe7\x9e\xac\xc4\x15\xab\xd7\x3c\x8b\x90\xff\x10\x69\x38\x80\x2f\xde\xfd\x4c\x05\x18\xa4\x69\xfc\x9f\x87\x29\x13\x5f\x04\x41\xda\x13\x50\xb4\xcb\x7a\x78\x1f\x0c\x35\x4f\x72\x1d\xc6\x24\x17\xc2\x07\x51\x8c\x91\xb7\xd4\x5e\xc4\x57\xd2\x56\x17\x37\xa0\x94\x1b\xaf\xef\x72\x7b\x11\x2d\xe0\x7d\xf4\xc4\xd1\xa0\xa0\xfa\xd9\x36\x2b\xd8\x87\x77\x87\xef\x3b\x32\xa6\xf5\x42\xc2\xfd\xfb\x8f\xff\xc9\xfb\x04\x50\x86\x01\x69\x76\x46\xe5\x5d\x38\xcd\xed\x42\x01\x54\xf3\x5a\x0b\x5d\x60\x50\x73\xf6\xe9\x26\x6c\x33\xb8\xfd\xfd\x26\xc0\xcd\xe9\xe1\xdf\x1f\xbb\xd9\x45\x16\xf7\x80\x6f\x6e\x64\xb6\x6b\x56\x35\xe5\x93\x90\xd8\x91\xb6\x15\x3c\xe3\x97\x08\x27\xc6\xc1\xb5\xc6\x67\xb0\xc3\xe4\x6a\xe4\x46\x6c\xc8\x9c\x4a\xac\x5c\xd1\x05\x26\x38\x82\x46\x40\x2d\xd1\x50\xdb\xb6\xd6\xf2\x49\x73\x29\x2d\x18\x87\xef\x16\x85\x62\xff\x67\xdf\xd4\x37\x57\x5e\xc9\xfa\x5a\xac\x99\x85\x45\xab\x23\x10\x0c\xd7\xec\xbe\xe5\x6b\xb7\x13\x56\x8e\x5d\xd8\xb5\x7c\x49\xa8\x5e\x46\x36\x8b\xd2\xcd\x49\x82\x71\x9b\xf0\xe6\x46\x29\x02\xf7\xe1\x4f\x76\xc8\xac\x1d\x72\x65\x3a\x7d\xda\x5c\xd4\xe7\x34\xbb\xf1\xd1\xd7\x81\x11\xa7\xc4\x1e\x86\x11\x5a\xd1\x8e\xb6\x8c\x87\xe5\x89\xe6\xc9\x3e\x1d\x3f\x38\x38\x20\x57\x17\x6f\x2f\xcf\xce\xc9\x8b\x97\xaf\xce\x8f\xd0\x5d\xfc\xe0\x2f\xf2\x00\xfe\xf1\xc1\x4e\xf5\x03\x17\xd3\xbf\x48\x5d\x5a\x0b\x2e\x68\x81\x1a\x66\x23\xf2\xf4\xf0\xc9\x53\xd8\x66\x30\x11\xf2\xd5\x92\x5c\x5c\x91\x53\xf0\x43\x94\x53\x72\x5a\x14\x68\xad\xc2\x24\x49\xf5\x5a\xcb\x19\x07\x07\xe4\xad\x74\x80\xa0\x04\xc3\x59\x51\x02\xe0\x92\x2c\xf4\xf3\x59\xe2\x3a\x53\xf2\xec\xea\xf9\x04\xa1\x2d\x0b\x9e\xb1\xd2\x3a\x57\x21\xc7\xaf\x5b\x9a\x43\x8e\x15\xc3\xe3\xbf\x7a\x79\x76\xfe\xfd\xd5\x39\x99\x73\x7d\x31\x3c\x18\xac\x24\x06\x1a\x67\x4a\xcb\x92\x9a\x09\xae\x55\xce\xaa\xe1\x40\xff\x13\x45\xd7\xb7\xd7\x2f\x7e\x07\x21\xa9\xce\x71\xbe\x5a\xa9\x83\x8b\x95\x02\x38\x45\x70\xf3\xa0\x19\x48\x94\x30\x22\x97\x19\x07\xe4\xca\xe5\x72\x55\xea\xb5\x0d\x52\x8f\x36\x73\xaa\x9e\xd9\x0a\x05\xbf\x65\xe4\xe7\x92\x4a\x79\xf3\x33\x30\x6b\x3f\x67\xb5\xd0\xff\xae\x59\xc6\x38\x30\x70\xe0\xe1\x45\x35\x63\x6b\xd7\x26\x2b\xa8\x94\x04\x13\xa2\x56\x3e\x6f\x12\xaf\x09\xad\x17\x6b\xe3\x2b\x66\x0f\x37\xe4\xe9\xb1\xee\x6b\x36\xfd\x91\xc2\xcc\x89\x35\xa3\x9e\xe5\x0d\x53\x22\xc0\xc8\xc5\x4a\x11\x76\x57\x09\x69\x98\xdf\x25\x56\x23\xac\x54\xbc\x6e\xe2\x66\xba\x51\x86\xda\x38\x4c\x1d\xf3\xff\x67\xef\xef\xdb\xd3\xc8\x91\xfd\x71\xf8\xff\xbc\x0a\x65\xce\xf9\x2d\x30\xc1\x18\xf0\x43\x9c\x78\x3c\x59\x8c\xb1\x83\x9f\x03\xd8\x49\x9c\x64\x73\x9a\x6e\x01\x1d\x37\xdd\xa4\xbb\x31\xc6\x3b\x39\xaf\xfd\xbe\x54\x25\xa9\xa5\x6e\x35\x60\x67\xe6\xec\x7e\xcf\x7d\x7c\x6d\x76\x6c\x90\x4a\x52\xa9\x24\x95\x4a\x55\x9f\x12\xec\xc1\x50\x24\xc5\xc4\x47\x89\xee\x54\x5f\xc2\xe4\x79\xc9\x95\xbe\x44\xc6\x34\x1e\x05\x98\xdf\x4e\x1f\xbd\x44\xcf\x8b\x03\xc9\x2b\x19\x5e\x10\x49\x42\x24\xc0\x39\x13\x48\xb2\xe8\x97\x0b\xa9\xbc\x68\x14\xbb\xbe\x15\x2b\x79\x66\xda\x51\xe0\x59\xb1\x96\xb6\x4f\xde\x07\x24\x67\x26\x61\xc0\x6e\x49\x78\xa3\x4d\x02\xa3\xfa\xd4\xa7\x03\x37\x8e\x5e\x33\x42\x6b\xe4\x52\x94\xb2\xc8\x98\x32\xf5\xd5\x8d\x30\xe1\xad\xc5\x95\x72\x9e\xa3\x43\xe7\x40\x6a\xfc\x08\x1d\x24\xbd\x29\x31\x8b\x86\x7f\x17\x80\x23\x76\x34\xed\xcb\x5e\x16\x23\x8a\xfc\x84\x84\x8a\xc8\xc6\x49\x30\x49\xf8\x07\x2e\xab\x64\x0d\x26\xc5\xc5\x51\x06\x3e\xa4\xd0\x88\x00\x1d\xd4\x8a\xf8\x46\x0c\x59\x35\xb8\x21\x91\xf1\x58\x4e\x2f\xf4\x0c\xc3\x84\x65\xcf\x60\x26\xd8\xd5\x8a\x0b\x0b\x1e\x21\x2a\xff\x78\xb3\x6d\x1f\x5a\x3e\x9c\xc6\x4c\x6b\x4f\x72\x22\x5a\x73\x12\x4e\xc1\xdb\x8c\x6d\xac\xb3\x20\xbc\xe5\xe3\x0c\xf9\x2d\x6e\x86\x56\x61\xdf\x9b\x83\x11\xb7\xef\x51\x6c\x99\x4d\xa7\xe5\x41\x4e\x76\x8b\x64\x44\x50\xe6\xdb\xb7\x7c\xd2\xbe\x6c\x26\x33\x90\x3e\x9b\x74\x11\x36\x06\xe9\xb6\x2f\xd4\x2d\x59\x48\x81\xb2\x35\xcb\xad\x90\xec\x49\x21\x11\x57\x1b\x36\xe8\xf6\x85\x70\xde\x04\x49\x15\xb3\x4e\xda\x17\x15\x98\x22\x79\x53\x11\xf1\x91\xed\x8b\x04\xae\xe2\xff\x70\xc6\xfe\x0f\x67\xec\x7f\x18\x67\x8c\xc9\xe5\x52\xa8\x31\x01\x72\x91\x81\x1b\xd3\x97\x84\x16\xbe\x66\xac\xa4\x89\x38\xc4\xe9\x58\x3e\x19\x84\xd6\x58\x82\x89\x88\xb0\x41\xe5\x68\xf2\x9d\x60\x56\x26\x93\x80\x1d\xc4\x4e\x12\xe6\xc9\x93\xcd\x33\x4a\x3c\xbe\x07\x32\x8e\x31\x55\x15\xfd\x51\x66\xb4\xe0\x79\x4a\x5e\x6f\xca\xf3\x58\xad\x0b\x94\x8a\x75\xee\x79\xcd\x36\x47\x7e\xd9\xad\x88\xf5\x03\xd6\x63\x2e\xe5\x60\xc3\xe1\x1b\x92\xc8\x4a\xbf\x8e\x16\x53\x3c\x16\xd8\x00\x16\xc5\x77\xf5\x46\x54\xc6\x78\x05\x96\xd4\x54\x64\x3d\x59\xe9\x02\xb6\x0e\x14\x31\xde\x23\x72\x31\xc1\x57\x2a\xce\x27\xd1\x51\x42\xce\x83\x98\xb8\xe3\x09\x62\x88\xe4\xbc\x65\x68\xd3\x8b\xca\xeb\x21\x90\xd1\x23\xc6\xca\x6a\x8b\x1a\xd0\x8c\x4f\x67\xfc\xe8\x87\x7a\x45\x7d\xc6\xcb\x24\x53\x59\x57\xa5\xe1\x68\xc1\xb3\x2a\x14\xc0\x97\x6c\x4a\x98\x72\x26\x23\x1f\xd2\xea\x12\xe7\x06\x2f\x06\x51\xc2\x92\x9d\x8c\x95\x3e\xf0\x61\x90\x47\x96\x9d\x12\x4c\x13\xb1\x62\xb3\x25\x57\x17\x79\x1a\x8b\x2f\x2e\x79\x7d\x85\x35\x4a\x17\xcc\x02\x4f\x63\x5e\x4b\x2b\xaa\xf3\x00\xb8\xce\x43\xfa\xb2\xc7\x8d\x3c\xc5\x40\x65\x62\xe7\xb1\x1b\x0b\x4d\x8a\xbb\x93\xf6\xa4\x09\xf3\x57\x71\xb8\x58\x51\x14\xd8\x6e\xf2\x1a\x8c\x0f\xa8\x19\x9d\xcc\x85\xd4\xf6\xa0\xb7\xc6\x01\x99\xb0\x0d\xc5\x0e\xfc\x38\x0c\xbc\xcc\x06\xca\x0e\xae\xc1\x00\x8f\xd8\x44\xd9\xc0\xe4\xa8\xa0\x2d\xf1\x03\x8c\xeb\x18\xc2\xde\x2e\x68\x8b\xa3\x4e\x90\x4f\x1e\x9e\x25\x2d\xa6\x09\x4c\x3c\x9a\x97\xf9\x45\x9b\x16\xa6\xd9\x98\xcd\xeb\x6e\xc0\x8e\x4b\x13\x2b\x53\xb2\x89\x4f\x51\x81\x7c\xa6\x6a\x5a\x13\xa6\x8f\x38\x5f\xd3\xef\x57\xf2\x0b\x34\xe8\x05\x15\xdd\x82\xcf\x1f\x5d\xe4\x47\x9c\xac\x62\x58\x47\xcb\x1e\xff\x5b\x10\xd1\xcf\xf7\x94\xdc\xb8\xc1\x6e\x56\x98\x60\x64\xec\x9b\x64\xf5\xb1\xbf\xb4\x27\x1c\xe1\x34\x90\x08\x45\x21\x4a\xd0\x28\xa4\xf2\xb1\x02\x83\xc1\xdb\xc4\x74\xf9\x4c\x75\x28\xad\xac\xe8\xb2\x8d\xe6\x6c\x98\x6c\x78\xba\x63\x9b\x6c\x24\x6c\xb6\xfc\x79\x52\x03\x51\xe7\x62\x25\x2e\x46\x8b\xfc\x01\x14\x55\x5f\xcb\xf9\x1e\x0c\xc8\x84\xc7\x07\x80\xc3\xd2\xf2\x18\x65\xe8\x1a\xd8\x1d\x72\x32\xf1\xa7\xb6\x04\xa1\x91\xe7\x05\x20\xaf\xaf\x93\x0b\xb5\xab\x95\x67\x89\x9f\xa4\x17\x0c\x8b\x85\x2b\x1f\xd5\x78\x55\xbd\x7f\x4d\x78\xc0\x1b\x23\x93\xcb\x45\x2b\x59\x91\x0b\x23\xb2\x9f\xca\xb9\xe4\xd2\xa4\x6a\x8b\x49\x53\xc0\x2a\x61\x5e\xc3\xdb\xb1\x93\x4d\xd1\x51\x60\xc3\x5a\x83\xaf\x5d\x7f\x58\xc0\xd7\x34\xb1\x11\xaf\x16\x34\x7e\x4b\xe7\x24\xa2\xdf\xa7\xa2\xc6\xe2\x39\x59\x29\x2e\x7c\x85\x69\x09\xfa\x60\x80\x08\x1d\x2d\xe4\x1d\xa7\xe6\xb8\x7b\x71\x5e\x41\x7a\xee\x60\x9e\x0a\xef\x5e\xdc\x39\xf1\xb9\xe1\x61\x10\x9e\x4d\xca\x44\x3c\x83\x89\x6d\x2c\xe8\x7f\x53\x30\xf3\x39\x00\x45\xd0\xff\x26\x4c\x3a\x41\xff\x5b\x6a\x1f\x02\x42\xbb\xf2\x4b\x65\xff\x41\xda\xf2\x2b\xb2\x07\x05\xb4\x35\xab\x45\x53\xa6\xba\x9b\xea\x62\xae\x68\x4a\xc1\x04\xc5\xc7\x15\x1e\x28\x3f\x2d\x92\xa8\x49\x99\xa5\xe6\x0f\xa6\xf4\x0d\x99\xd6\xad\x28\x84\x4e\x3c\xaa\xac\x54\x14\x47\xb4\x8a\x74\xe9\x1c\x59\x32\x7f\x59\x39\x53\x38\xf6\x1e\x2c\x2e\x16\xc0\x1d\xec\xc8\x15\xd4\x9f\xc7\x34\x05\xbc\x97\xa3\xf5\x98\x96\x8b\x4e\x2b\x21\x33\x09\xdd\x1c\xb7\x04\x6d\x78\x60\x04\xba\xea\x1d\xee\x2c\x05\x54\xd0\xf6\x7e\xfe\x96\x27\x1e\xb5\xc2\x60\x46\x0a\x0d\x4c\xad\x2d\x1b\x17\x91\x50\x5c\x61\x49\x0e\x20\xc5\x6f\x43\x21\x2a\x92\xb5\x17\x4d\xdb\xe0\xa3\x39\xc7\xed\x31\xdc\x28\x17\x7a\x99\x54\xc1\x7f\x11\x2b\x3d\xff\xdf\x91\x99\xe0\x36\x13\x7e\xf6\x0b\xf9\x5c\xad\x6d\x93\x63\xeb\xce\xea\xda\xa1\x3b\x89\x9f\x2e\x8e\x8f\xe6\x1a\x8e\x6e\x6f\x25\x21\xad\x6d\xe7\x31\x16\xc6\x2f\x65\xb9\xa8\x9b\x6f\xcd\x68\x1c\x97\xd0\xf0\xea\x83\xd7\x24\x0a\x34\x76\x0e\x21\xf5\xd7\xb0\xc4\xf3\x57\x61\x0a\x88\xdb\x2a\x6c\x41\xb9\x5c\xc8\x98\xa5\x86\xfe\xfb\xf8\xab\x95\xc0\x16\xfd\xef\x32\xf6\x03\xfe\x73\xa4\x1a\xfa\x9b\x81\x1f\xc5\xe1\x14\xde\xf4\xd9\x6d\x54\x43\x6d\xe2\xab\x4f\x55\x94\x22\xf9\x21\x19\x43\x5a\x07\x00\x45\x45\xdb\x0f\x46\x31\x09\xd6\x91\x68\x6a\x8f\x88\x05\xe1\xfd\x1c\x7f\x7a\x1d\xb2\xc2\x48\xc4\x6a\x02\xdd\x29\x93\x7e\xe0\x81\x53\xa6\xeb\xc7\x65\xe2\xc6\x96\xe7\xda\x65\x7c\xd1\x2f\x93\xa9\xef\xd0\x90\x89\x20\x3a\x9f\xb0\x91\xdd\x52\x6e\xee\x94\xdd\xd2\xfa\x2c\xee\x80\x51\xfa\x82\x66\x8b\xa1\x12\x8b\xfb\xb5\x81\xeb\x16\x0d\x13\x1b\x02\xb7\xf4\xaa\xfa\x7a\x32\x20\x08\x93\x64\xcb\x85\x46\x31\x3c\x0b\xdc\xbb\x11\x18\x7f\x75\x62\x03\xf4\xd3\x62\x57\x3d\x2b\x76\xfb\xae\xe7\xc6\xf3\x6c\x2e\x25\x45\xc4\xc4\xda\xb2\x93\xa9\x50\xd7\xda\xdb\xde\xd9\xe9\x01\x77\xce\xf9\x91\xb8\xe9\xf4\xe0\xb9\x12\x68\xc9\xcf\x38\x3e\x0d\xe8\x2a\x60\xea\x90\x96\x6b\x02\x17\x46\xad\xa3\xa9\x3b\xa8\x0a\xd6\xa5\x2e\x34\x41\x5c\x59\x6a\xd2\xd1\x9b\xec\xc9\xb6\x77\xa5\x01\x38\xa2\x32\x23\xa4\x8e\x01\xc1\x85\x9e\x5f\xbb\x11\xff\xdc\x8a\x08\x75\xe3\x11\x0d\x5f\x73\x00\xc6\x4e\xf3\xeb\x41\xeb\xb0\x71\x75\xda\x23\xa4\x08\x5e\xcb\x81\x0f\x82\xc5\x9d\x7a\x4a\x49\xb9\xce\xd1\x3e\x3e\xfd\x15\xa5\x29\x8c\x2d\x8a\x42\x38\xec\x17\x49\x58\x26\xc3\x32\xe9\x97\x0a\x6c\x3e\xc6\xbc\x16\xda\x2f\xf9\x4b\x7e\x31\x83\xd6\xe4\x02\x3a\x18\x1c\x41\xd8\xbb\x89\xe5\xd1\x18\x5f\x8f\xa6\x11\xf8\xb6\xc0\xf8\x13\x81\xd6\xc1\x6d\x95\xce\x27\x8f\x8f\x52\xda\x17\x94\x55\x79\xa7\x02\x68\x58\xf6\x08\xaf\xba\xe0\xc4\x24\x0d\x84\xd0\xb7\x98\x31\x18\x83\x0d\xd3\xfd\x79\x26\xd1\x25\x32\xad\xab\xf3\x61\x5b\x7e\xe0\x83\x5b\x41\xe2\x23\x95\x1a\x9f\xe8\x2d\xef\xe9\xd7\xe6\xc5\xe9\x45\xc7\x30\xb6\x9c\x72\xcf\x12\x07\x79\x36\x77\x87\x2a\x5d\x98\xa6\xfa\xd6\x56\x99\x88\xff\x2b\x25\x10\xe7\xbc\xc2\xbe\xda\x00\x54\xa8\x96\x09\xfb\x5f\x49\xd1\x07\xd8\xee\xa1\xba\xdb\xe3\x10\x2c\x38\x6f\x53\x9f\xe2\xde\x92\xf9\xb8\x2f\x92\x8c\x6b\x9f\xca\x9d\x27\xf3\x8d\xb6\x09\x65\x1b\xe1\x6f\x0b\x86\xcf\x13\xc7\x07\xed\x9b\x99\xcd\x61\x74\xf5\x8f\xad\xc8\x76\x5d\xfe\x8d\x08\xa3\xe1\x9e\x2e\x1e\x3d\x40\xdf\x61\x8e\x5e\x2a\xc3\xf9\xbc\x20\xbc\xe4\x42\x9b\x20\x80\x0b\xbf\x2b\x1a\x37\x95\x02\x29\xa7\xaa\xf6\x00\x9b\x07\xb4\x2b\x77\xe8\x0b\x2b\x0b\xb0\x57\xee\x56\x46\xc3\xda\x00\xce\x0e\x89\x55\x02\x86\x7a\x0b\x2b\x32\x56\x60\xe2\x58\x2b\x46\x04\x6d\xc7\x1d\xc0\x2d\x39\x96\x0f\x19\x32\xc7\x2b\x8f\x58\x98\x21\x1e\x3e\xaf\x9a\xbf\x4b\x29\x5a\x02\x42\x5b\xef\xa3\x24\x70\xb8\x8d\x64\x5c\xec\x83\x32\xec\x8c\x7d\x3c\xc4\xf1\x18\x24\x45\x77\x40\xac\x3b\xcb\xf5\x58\xe5\x12\x0c\x03\x3a\x0d\x0e\xe0\xea\x40\x23\x1a\x8b\x98\x79\xb6\x47\x4c\xa8\xef\x50\x5f\xbc\x42\x13\xa5\x71\x5e\xf0\x91\x7d\x6e\x44\xfb\xa1\x48\xb0\xa8\xf5\xbd\x41\x70\x7b\xa2\x1e\x1e\x5e\x96\x1f\x4b\xe7\xc7\x5f\x66\x23\x2b\x16\xe0\x59\xd2\xe5\x11\xf7\x06\xe8\x27\x7f\x3c\xc6\xed\xf3\x97\x95\xba\xa4\x2d\x5f\xe9\x2f\xcb\x91\xba\xfd\xe9\xb8\x58\x50\x55\x87\x46\xd2\x29\xae\xfc\x89\x93\x16\xf7\xe3\x39\xce\xba\xd4\x75\x78\xcf\x52\x1b\xfa\x4a\x1d\x53\x8f\x85\x3d\x52\xe0\x55\xd9\x26\xf0\xc8\xce\xe8\xe7\x90\x95\xf4\xca\x42\x48\x2e\xf0\xb0\x56\xcf\x0f\xf9\xcc\x12\xae\xdc\x51\x76\x2e\xe1\x76\x55\x48\x98\xd5\xd3\x5c\x6c\x39\xb8\x0d\x44\x81\x09\x63\xc1\x0c\x17\x01\x3b\xa3\xfd\xc0\xa1\xba\xa7\x8d\xc9\xb8\xfd\x78\x05\x61\xa5\x21\x44\x34\x16\xd4\x9e\xa4\x07\x98\x0c\xff\x0e\xa5\x13\x8c\x23\x10\x1a\x70\x62\xa5\xd5\x20\xa4\x4d\x7d\xfb\x41\x1a\x0b\x09\x2c\x1d\x91\xed\x05\xbe\x01\x6f\x52\x62\x8e\xaa\xb6\x74\x95\x44\x11\x40\xdd\x60\x7b\x65\x7b\x43\x91\x55\xb8\xa5\x73\xb1\xb6\x84\xa1\x2a\xbc\xfb\x74\x4b\xe7\x5f\xf8\x19\x08\xbf\x4b\x73\x53\x78\x97\xde\x94\x33\x1b\x75\xc5\x0e\x7c\xdb\xe2\xc1\x0e\x9c\x0f\xe1\x5d\xda\xea\xcd\xbd\xdb\x12\x4c\x51\xd8\x7e\xb2\x5a\x24\xec\x57\x4e\x40\x23\x08\x53\xe0\x3e\x6e\xe8\xda\x86\xad\x11\xb8\x88\x18\x4e\x03\xfe\x18\x05\x2e\xdc\xbf\x92\x76\x8c\x8f\x7e\x02\x73\x57\xa1\xc4\x8e\x1f\xb0\x92\x96\xf1\x2d\x9b\x35\xc4\x76\x25\xa6\x7f\xae\x34\x1f\xd0\x78\x8e\xed\xfd\x4f\xd7\xad\xfe\x6c\x9d\xe6\xff\xff\xb4\x0e\xb3\x20\xa6\x15\x64\xf5\x14\x02\xf7\xcc\xd5\x45\xa1\xa9\xaf\x10\x93\x58\xa4\x16\x51\x72\x97\xcd\x5f\x4a\xc8\xb4\xb9\x6f\x03\xf9\x28\xa5\xee\xf4\xd8\x25\xce\x1d\xe4\xdc\xc9\x88\x43\x23\x3b\x74\xd9\xe5\xd1\xe7\x50\xcb\xaa\x52\x20\xb7\x2b\xe9\x36\x2b\x42\x0c\x1f\x4d\x6e\x29\x87\xdc\x88\xfb\x47\xe4\x66\x42\x29\xe6\x2c\x9c\xec\x6a\x50\x31\x04\x72\xd7\xd0\xb2\x6a\xcf\x13\xf9\x37\x7c\x8e\x4b\xc0\xf0\x05\x5f\x05\x26\x52\xb0\x10\x0c\x5f\x24\x6b\xc1\xf0\xa5\xbe\x1c\x4c\x0d\xf2\x15\x61\xfe\x4a\xa2\x75\x65\xbe\xe4\xeb\x22\xcb\xaa\x64\x65\x64\xbf\x4b\x54\x72\x0e\x05\x6a\x3e\x07\x75\x4b\x41\xd1\x42\xac\x6e\x70\x67\x92\x00\xdf\x25\x1e\x9c\xcb\x73\x99\x83\x8f\x5a\x6c\x8f\x84\xc7\xe2\x6a\x27\x00\x7f\xa2\x86\x67\x2c\x5b\xb4\x3e\xf1\xe0\xea\x97\x20\x89\x8b\x07\x70\x0c\xc7\x14\xb2\x59\xe6\x91\x66\x96\x0f\x4e\x42\xd8\xc7\x54\x59\x2c\x59\x21\xe4\x00\x1d\xc5\x01\x77\x33\x18\x90\x71\xe0\x07\x00\x94\x4a\x66\xae\x43\x93\xc8\x1d\x46\x0f\xaf\x08\x81\x4f\x6c\x1a\xc2\x25\x14\x71\xb0\x23\x52\xa4\x95\x61\x45\x80\xeb\x5c\x74\x4b\x1a\xe0\xee\x64\x1a\x13\x6a\xd9\x23\x03\x41\x44\x42\x07\x0e\x0e\x48\xb3\xdb\xe5\x9e\x92\x85\xca\xcc\x5e\x63\x03\x2c\x70\x0d\x6b\x64\x45\x1c\xe1\x87\x87\xa6\x29\x2f\x28\x2d\x46\xfa\x2e\xfe\xca\x26\x10\x1f\x49\x5d\xf4\xbd\x87\xd3\x4f\x9a\x08\x84\x6d\x0e\x5a\x13\xf3\x03\xe9\xa7\x61\x4e\x44\xaf\xca\xf8\x9d\xec\x0b\x65\xbd\x61\x14\x79\x40\x35\xfc\xfe\xf5\xb7\xa1\x37\x9f\x8c\xb8\x35\xe2\xf7\x42\x9e\x71\x15\xdc\x86\x94\x74\x36\xd2\x0d\x06\x26\xc1\xe6\x9f\x0a\x17\x12\xa6\xc4\x48\xd1\xaa\x68\xbb\x14\x9b\x45\x26\xb7\x3f\x48\x43\x9d\xd2\x20\x4c\x64\x41\xcc\xa8\x26\x6e\x42\xd6\x84\x09\x49\x97\xb5\xe5\x6a\x17\xc8\x5d\x53\x8a\xbb\xb2\x7f\xa5\x86\x96\x7a\x36\x90\x5b\x9e\xc0\xe1\xe1\x03\xd1\x95\x4e\x4e\x9f\x35\xcf\x06\x97\xa1\x99\xe4\xcb\x61\x83\x5d\x96\x7f\x88\x15\x2a\xc8\x8c\x39\x11\x4f\xa2\xce\x3e\xc5\xb0\x13\xf1\x8d\x98\xd6\x3d\xf2\xe9\x8b\x9e\xfb\x4c\xd1\x30\x9e\x9b\x54\x07\x9e\x65\x29\x9b\xfc\x2f\xa9\xa8\x13\x54\x54\x91\xa5\x04\x73\xd2\x00\x26\x1f\xeb\xa4\x95\x2b\xab\x40\x6f\x60\x1b\xba\x4a\x91\xad\xd6\xf7\x32\xc3\x3d\xfb\xb6\x90\x1a\x2f\xdb\xe9\x79\x0d\xc6\x26\xa1\xfc\x48\xb4\xcb\x64\x3e\x61\xeb\x4f\x13\x97\x69\xfd\xf1\xeb\x14\xf5\xbe\x1a\x6b\xc5\x99\x0e\x3e\x31\xc5\x02\x7c\x85\x0b\x5c\x04\x08\xb3\xf6\xe1\xe3\x94\xb9\x44\x86\xf9\x31\xc1\x38\x48\x7c\xdd\x04\xea\x9e\x6c\x4e\x1e\x35\x32\x78\x4a\xaf\xf0\x62\x8f\x14\x12\x5b\x74\x41\x69\x56\x55\xd8\x92\x66\x55\x70\x1f\xf5\xa0\x5a\x44\x9e\x11\x59\xe3\xe5\xd4\x16\xd2\x8a\x5f\xa6\x15\x8d\x96\xcc\x39\x84\x90\x2a\xe9\x71\xeb\x1f\x64\xe3\xd2\xf0\xf4\x33\x33\x5e\x6c\xab\x2a\xd7\xa5\x16\x99\x00\xbd\xc0\xe7\xaa\x1a\xa9\x20\x61\xe8\xe9\xf5\xf9\x99\xf9\x5c\x47\xf9\xd6\x1b\x85\xdd\x93\xb7\x98\xfd\xe6\xab\xcc\x04\x20\xa8\xa9\x9d\x63\x9f\x99\x24\x42\xa6\x1a\x54\xb6\x0b\xa5\x96\x96\x42\x2c\x55\x2e\x09\xe0\xe5\x7d\xc1\x38\x12\xa5\x3a\x7c\x81\x89\x3d\x64\x87\xbf\x05\xae\x5f\x2c\x10\x9e\xf4\x8b\x6f\x67\xac\x74\x46\x27\x15\x20\x20\xc2\xed\xde\x11\xc6\x02\xfe\x8a\x55\xce\xee\xdd\x25\x38\xe0\xc0\xb2\x61\x8d\x31\x7c\x09\x96\x16\x7c\xe8\x46\x24\x65\xdb\x37\xfb\xc8\xf9\x0e\x44\x70\x88\xac\x57\x8c\xb6\x78\xb3\x88\xa8\xaa\xca\xda\x60\xad\xe8\xc3\x3b\x0b\x0d\xd9\xc1\x28\x62\xe1\xf1\x48\x16\xef\x89\x56\x38\xa4\xb1\xb4\x66\x88\xc6\x0e\xf9\x69\x35\x99\x86\x93\x80\xed\xa3\xe2\x3a\x8f\x0a\x4b\x39\x49\xce\x87\x96\xa2\xc8\x75\x68\x48\x1d\x55\x3f\xca\x71\x93\x48\x0e\xb9\xa0\xff\x0d\x8c\x1f\x89\x17\x7a\x4c\xd1\x33\x7a\x89\xe2\x2e\x59\x9e\xa8\x68\x2a\x67\x25\x5b\x13\x37\x66\xa6\x27\x98\x39\xbb\xf4\x74\x84\x53\x96\x46\xe6\xe3\x51\x78\xc1\xc0\x5a\x99\x4f\x68\x30\x40\xb7\x96\x3d\x52\xc0\xe1\x02\xd4\x5a\xd0\xff\x06\x69\x55\x7a\x1c\x92\x67\x23\x7b\x5a\x2a\x47\x69\x72\x1e\xf2\x8d\x97\x55\xe7\x67\x9b\x12\x98\xac\x20\x42\x83\xee\xc5\x63\xc4\xa8\x9a\x23\x07\x14\x2f\xbe\xf2\x51\x79\x85\xc7\x47\x7c\x99\xe1\x91\x19\x76\x30\x1e\x83\x33\x8c\xcb\xdf\xa2\x12\x4d\xa0\xa2\xdc\x5d\x9e\xab\xdb\x8e\x18\x94\xd8\x84\x16\xe9\xe0\xe2\x9e\x92\xa3\x95\x3f\x37\xef\x31\xa2\x05\xb1\x33\x98\xda\x50\x4d\x05\x7b\xda\x81\xbd\xe8\xfa\x94\x94\x4d\x9f\xc5\x5a\xad\xc5\xe7\x2f\x23\xf2\xfc\x79\xe6\x00\x36\xb4\x8b\xc6\x03\x9c\xc4\xe4\xe4\xcb\x16\x14\xc6\x07\x9d\x2e\x9e\xbd\x3a\xc3\xd2\x77\x2e\xa8\xc2\xc8\xe7\x5d\xc3\x4c\xf7\x30\x59\x49\x3f\xf5\x74\x0f\xb2\x05\x86\x47\x11\x0a\xa0\x81\xec\x88\xe9\x28\x2b\xef\x59\xaa\x19\xd2\xf0\xba\xa4\xea\x54\x0b\xde\x94\x52\xfa\xd1\x62\x93\xc1\xd5\xc4\x11\x70\xf5\xa2\x21\xfd\x8d\x4d\x7d\xbb\x43\x8c\x6f\x76\xd9\xe1\xf7\x35\xd8\x61\xa9\x84\xdb\xe7\x98\xe8\xc2\x50\x62\xd2\xff\x85\x4b\x86\x32\xb0\x9e\xee\xa9\x21\x3f\x47\xf1\x64\x57\x81\x69\xa4\xee\x50\xe2\x0e\x0c\x9b\x67\xd2\x51\x83\xef\x58\xd2\x9c\xc2\x20\xad\xb9\xf4\xbb\xfd\xb2\xe6\x92\xee\xf1\x01\x2e\xb7\x3c\x4b\xce\x67\x6d\x1d\x12\x84\x65\x48\x63\x7c\x2d\x81\x5c\x4e\x45\x57\xc5\xbf\x75\xc9\x6f\x64\x27\x8d\x7d\x9c\x58\xab\x5c\x25\xbc\xcd\x0b\x66\xb0\xbd\x7b\x03\xf1\x8c\xd3\x38\xef\xb6\x49\x6d\xbb\x4c\x2c\xc7\x21\x3b\x15\x0d\xcd\x94\xb8\xe4\x05\xd9\x49\xc3\x3e\xb6\x07\x89\x01\x54\x12\xae\x6d\xeb\xb6\xb1\xb2\x78\x4c\x03\x8b\x49\x48\xbf\x4f\xd9\x29\xcf\x83\x15\x05\x25\x7e\x18\xe0\x83\x1b\x1d\x59\x77\x6e\x10\xb2\x7e\x0d\xfd\x60\x4c\xd7\x14\xc7\x24\xa5\x47\x9a\x7e\x9b\x67\x36\x4d\x7f\x2e\xae\x31\x79\xa6\xd3\xf4\xe7\xa2\xbc\x69\x8d\x99\xad\xa3\x4a\xe9\xfd\x15\xde\x87\x93\x4b\x02\xca\x8e\x98\xbd\xbc\x01\x99\x3a\x48\x72\x87\x63\x1a\xbe\x9e\xc2\xc0\xf5\x47\x34\x74\x85\x4d\x93\x1f\x50\x85\x48\xb8\x27\xf8\xf3\x71\x10\xf2\x04\x08\xb9\x3c\xc8\x0c\x77\x57\x2d\x9f\xe5\x42\x86\x50\x56\x37\x36\x3c\x0e\xea\x07\x45\x22\xf4\x19\x4e\x3d\x5f\x6c\xc1\x5b\x58\xbe\x73\xb4\x9f\xac\x1f\xc3\x1c\xa4\x56\x5f\xba\x84\x09\xb2\x5a\xb7\xb8\x2d\x98\x5f\xf3\xd4\x3e\x8e\xeb\x22\xe1\x4e\x97\xe2\x06\xb4\x9e\xde\xb5\x22\x32\xf5\x3d\x1a\x45\xc4\xf2\x42\x6a\x39\x73\xa2\xf9\x8e\x84\xc3\x7e\x51\xbe\xfc\x0d\x82\x70\x5c\x79\xb6\x02\x93\x15\xa6\x65\xdf\x1a\x8a\xd9\xba\x06\x13\x6b\x89\xbc\xc9\x83\xa1\xc8\x32\xe0\x75\xd6\x26\xfe\x29\xdd\xc8\x97\x52\x56\xa8\x84\x6d\x36\x6d\x05\x2d\x29\xb9\xa7\x80\x68\x2f\x38\xb3\x6e\xe9\x21\xbf\xd0\x17\x33\xf6\x8d\x3d\xa3\x39\x22\x7f\x08\x89\x3a\x92\x3b\x98\x84\x7a\x69\x37\x87\x93\x8a\xd1\x7f\xec\xde\x17\xd3\x3d\x2d\xa7\x3c\x44\xca\xa4\x5a\xd9\xd8\xd8\xd8\xd0\x19\x91\xd9\x29\x16\x4d\xa4\xf6\x18\x54\xcc\xd6\x7d\xd2\x44\x2a\xfb\x81\x69\x22\xd3\x8d\x98\x80\x45\x62\x00\xec\xe2\x36\x5e\xf1\xce\x1d\x2b\x2f\x1a\xa9\xcb\x63\x24\x6e\x8f\x11\x5e\x1f\x23\x6e\xe1\x4d\xcc\x7f\xa5\x24\xbc\x32\xb9\xea\xfc\x0f\x5f\xda\x6a\xa4\xe1\x1b\x2f\x6d\x0b\xea\xd4\x49\xc3\x47\x55\xea\xd1\xb7\xbd\xc4\x11\x2e\x6f\xec\x39\x0a\x4b\x52\xf1\x0c\x2c\xa5\xfa\xc5\xad\x56\x86\x7e\x99\xee\x6f\x35\xf5\x02\xa7\xdd\xd5\x16\xb7\xd3\x96\x97\x38\xa0\x2c\xcf\x4d\x46\x32\xb9\x00\x3e\x87\xcb\x40\x5d\x7e\xa0\x35\xc0\x4d\x30\xc6\x8a\xd9\x9b\xa3\xb0\xe0\xc9\xdb\x62\x0d\xaf\x8b\x35\xdd\x16\x0a\x7f\xd4\x09\x6f\x37\xb9\x4a\x8a\xbb\x1d\x56\x15\xc6\x4e\x7e\x3d\xaa\x9b\xee\x52\xbc\x64\xc6\x8a\x29\xeb\x2c\xbc\x53\xf1\xda\xaa\xc5\x52\x56\xcc\xbb\x45\x29\x75\xb8\x21\x52\xab\x62\xb8\x20\xf1\x1a\x69\x8b\x9a\xac\x96\x32\xc3\xed\xe6\xaf\x58\x65\xb1\x8a\x30\x76\xfd\x61\x48\x3e\x3b\x44\xe6\xf7\xc7\x7f\xf5\x82\x5c\xb8\xae\x78\x05\xe5\x41\x69\x95\xb5\xd4\x36\x3d\x73\x4a\x3b\x88\x10\x4c\xb3\x29\xc4\x68\x0b\x59\xcc\xff\x61\xf2\x8c\x2d\xdf\x83\xd0\x23\x08\x2c\x9c\x11\x51\x4c\x7e\x26\x7f\x1b\xfe\x6e\xf0\x03\x1f\xd2\xd8\x3d\x09\xde\x55\x28\x7e\xac\xb6\x20\x49\x2b\x14\xc5\x7d\x89\x5d\x1a\x74\x8e\xca\x08\x9e\x9e\xa1\x73\xe8\x23\x67\xea\x5e\x0e\x77\x65\xce\x5d\x95\xa9\xbe\xb4\xef\x02\xd0\x19\x08\x83\x34\xa2\x48\x9f\x16\x3d\x35\xae\x48\x7c\x0b\x85\xf5\x47\x96\x14\x68\x97\x08\x9a\x4e\x15\xe4\x66\xd2\x74\xa2\xca\xdc\x79\xc1\x64\xbc\xb9\x33\x42\x78\xc8\x81\x15\xc6\xe8\xb5\x8b\xef\x95\x8e\xa8\x87\x2c\xb3\x10\x7b\x63\x32\x45\x94\xd9\xcc\xe3\xdf\xd3\x27\x35\xe9\xde\xc2\x59\xe5\xb4\xe5\xa4\x62\x87\x65\xd7\x31\x91\x3c\x64\x4d\x36\xf4\x2e\x5b\x1d\x47\xd5\x93\x42\x15\x07\xc4\xc6\xc8\x5d\x73\x7d\xa3\x50\xd1\xfb\x18\xcc\x78\x8e\x3a\x88\xa7\x08\x56\x17\xab\xa7\x24\x8b\x67\x4e\x2e\x13\x25\xd7\xd6\xea\x72\x06\x24\x33\x52\x96\xa2\xb9\xb2\xcc\x71\x72\xd9\xca\xab\x4b\x20\x20\xdd\xa0\x29\x67\x91\x28\xa2\xd1\x5d\x4a\x23\x2b\x4c\x21\x44\x83\xfd\xf1\xbf\x4d\x0c\x29\xb7\x0c\xf1\x08\xe4\x45\x55\x57\x92\x40\x24\xf2\x33\x42\x98\x0a\x54\xd6\xe4\x90\x0a\x5b\xe1\x23\xa5\xd0\xf5\x87\xf9\x82\x48\xf9\x35\xe5\x11\x62\xc8\xe8\xa5\x6b\x2f\x3c\xa2\x20\xf3\xa8\x72\x92\xfb\x18\xc2\x12\xbb\xc3\x69\x30\x8d\x48\x38\xf5\xe1\xdc\x47\x2f\x84\x35\x60\xba\xe6\x8b\x80\x98\x50\xa2\x18\xfa\x3f\xac\x49\x90\x5f\x5e\x66\x41\x60\x57\x2a\xaa\x0b\xba\xa3\xcf\x6a\x23\x0c\xad\x39\x38\x15\x58\xec\x37\x82\x47\x33\xdc\x37\x30\x62\x89\x07\x1b\x48\x06\x60\x87\xe3\xb0\x8c\x90\x47\x42\x52\xc1\xbd\x23\x91\x05\x57\xc4\x84\x80\x7f\xee\xc2\x01\x2b\x23\x11\xc4\xe0\x3d\xc2\x3c\xda\x0a\x01\xcd\xc9\xd8\x47\xbd\x8e\x20\xa6\x38\x76\xb8\x71\x24\x9e\x3c\x92\x54\x94\xe0\x1a\x0e\xba\x51\x38\xa5\x0b\xc8\xcb\xce\xf9\xde\x9c\x34\xba\xcd\x76\x5b\xf8\x6f\x20\xe1\xe4\x11\x23\x8f\x76\xfe\x32\x80\x89\x79\xef\x3a\x94\x75\xd6\x18\xb5\x9f\x72\x77\xfd\xf4\x25\xb1\x02\x82\xc7\x60\xb5\x4c\x54\x34\x3c\xfc\x2e\xeb\x07\xa8\xba\xc1\xba\x50\x94\xb8\xe4\x37\x92\xa4\x2b\xde\xd5\x0c\x09\x64\x0f\xbe\xb2\x03\x87\x5e\x06\xae\x1f\x37\xe2\xa2\xcb\xef\xf6\x40\xc1\xb7\x43\xca\x9d\x8c\x8b\x36\x40\x1e\xdf\x0f\x06\x83\x41\x89\xbc\x21\x35\xf2\x9a\xd4\x77\xa5\x85\xcb\x26\xbf\x91\x5a\x5d\x31\xec\xf2\xde\xbe\xd8\x4b\xa8\x64\x32\xf5\xf1\xc5\xcc\x98\x82\xba\x8b\x5d\x62\x8d\xd4\x56\xa0\x42\x88\xf1\xf5\x3a\x93\x73\x0e\x9a\xc1\xe7\x5f\x25\x61\x48\x78\x87\xef\xd3\xff\xd4\xee\x0e\xe1\x6b\x4c\xe1\x8c\x47\x12\x63\xbc\x60\xba\x06\x2e\x2d\x1b\x7e\x9d\xfc\x9a\x7c\xff\x43\x49\xe6\x61\x8a\x0e\x21\x32\x95\x87\xa9\x1b\xe9\x4e\xb8\xe5\x64\xe0\x4a\x27\x50\xc8\x5f\x63\xd4\x44\xb6\xb9\xd7\x3c\x4c\xe4\x59\xba\x4b\x5c\x98\x5c\xf2\x22\xcb\x4f\x5d\xbc\x44\x27\xdd\x0c\xef\xa5\x99\x46\x67\x6b\x7a\x2c\x2b\xb1\x33\x9f\x95\x3f\x12\x93\x90\xee\x6f\xbd\x24\x36\xf4\x2e\xfe\xdf\x19\x0e\x5a\x26\xf0\xd7\x40\xfc\x72\xd5\x3b\xdc\x61\x37\x59\x87\x86\x05\x55\x38\x0b\xb8\xff\x5c\xf7\x2a\x4d\xb1\x2f\x9e\x59\x93\x45\xd1\xa4\x98\x65\x91\xd0\xc8\xb6\x26\x54\x82\x5d\x10\x19\xb8\x8d\x9e\x6a\x22\x3e\x42\xf9\x98\xb0\x5d\x10\x5e\xdb\x02\x0d\x11\x84\x5f\x2e\x6d\x6b\x02\x50\x54\x00\x84\x12\x0e\x02\xf6\xed\x50\x66\x57\xfe\x15\x71\x5f\x91\x84\x1b\xf8\x51\x99\x4c\x2c\x17\xe3\xfc\x92\x03\xa3\x4c\x68\x6c\xa7\x9c\x20\x92\xf6\xf9\x9f\x98\xac\x0f\xc0\x5c\x44\x40\xa7\xc7\x61\x2e\xef\x59\xa7\xca\x24\x1e\xc1\xc3\xa7\x0b\x7a\x17\x3e\xf5\x44\x80\xc2\x9e\xa4\x9c\x0c\x29\xa1\x51\x10\xd3\xd0\xb5\xd3\xac\x88\x12\x80\x4c\x44\x0d\x92\x5f\x80\xda\x28\xdc\xd5\x50\x71\x44\x71\x74\x02\x7b\x9d\x97\xee\x4a\x2a\x63\x67\x09\xd4\x5f\xc2\x42\x89\x1e\x28\xa2\x45\x45\x68\x6a\x6a\x56\xc4\x71\x73\xdd\xcb\x07\x04\x84\x69\x27\x22\xbc\x85\x03\xc8\xa5\x27\xcb\x88\xd4\x74\xe7\x86\xf1\x14\x7c\x19\x95\xb7\xad\x5f\xd7\xd3\x41\xfe\x69\x8c\x41\x59\x3c\xc9\x17\x03\xe5\x13\xfc\x0a\x4c\xf3\xad\xa4\x82\x90\x0f\xc0\x6a\x62\x67\x5e\xcd\x98\xd4\x59\xb8\x43\x5c\x5a\x21\x2c\x1e\x2b\xa6\x04\xd2\x4a\x01\x14\x60\xf2\x82\x68\x45\x31\xa6\x3c\xd6\x11\x01\x45\x6e\x79\xf8\x8a\x69\x75\x54\x00\xb5\x73\x98\xab\x89\x15\x45\x22\xed\xc9\x3c\x98\x86\x58\x92\x84\xc1\x34\x86\x38\xe7\xd0\x02\xe5\x07\xc2\xe2\x42\x0a\xe0\x79\x48\x01\xba\x9c\x90\xfd\x2a\x3d\x6f\x12\x48\x45\xe5\x4b\x35\xae\xe5\xba\x57\xb9\x94\x5f\x15\x93\xa2\x57\xfe\xad\x1f\xcc\xfc\xaf\x12\x9b\xbe\xe1\xcf\xc9\x2f\x1e\x36\x4a\xc6\x81\x03\x91\x4f\xd1\x2f\x72\x31\xa7\xc4\xb7\x2c\x83\xbc\x0b\x6f\xd8\xee\x41\x0a\x18\x24\x3d\xe2\x63\x46\xd3\xac\xa4\x43\x04\x26\x10\x8f\xa0\xc1\x4e\x34\xbb\xed\xaf\x72\x04\xbc\xed\x33\x5e\xe5\x2b\x77\xd5\x53\x7a\x17\x87\x96\xeb\xe9\xdd\xab\x10\xd2\xb5\xc6\x54\x4d\x14\x40\x99\xdc\x11\x8b\xa4\xc7\x52\x46\x4a\xf4\xde\xa6\x93\x58\x78\x37\x85\x94\x6f\xa2\x98\x53\x10\x6e\x22\xd3\x31\xac\x57\x2b\x1c\xc2\x0a\x4c\xa2\x63\x45\xfb\xe6\x2e\xbe\x1f\x51\x34\x47\x87\xf0\x2c\x8c\xb8\x60\x13\x11\x3a\xc3\xd9\x67\x83\xc7\x2d\xe3\xa9\x88\x2c\xcc\x60\xbb\x70\xe7\x16\xcf\x0b\x66\x98\x7d\x09\x94\x18\x44\x93\x53\xd3\x4b\x25\xb8\x9b\x29\x10\x46\x4c\x25\x3d\x73\x21\x63\x9b\x84\x64\x94\xf3\x88\xf9\x46\x2c\x9f\x5c\x74\x9b\x2a\x0a\x11\x5f\x4e\x91\xdd\x73\xc7\xf4\xd4\x1d\xbb\x10\xdd\x55\xaf\x56\xab\x55\xd1\x18\x3f\x1a\xd0\x55\xd8\x45\xf5\x19\x41\x45\x1c\xf8\x46\x7a\x35\xf0\x88\x96\x78\x20\x4e\x13\x21\x94\xa9\x43\x86\xfb\x26\xc9\xcd\x44\xf0\x10\x60\xec\xc4\x3c\x91\x9d\xb5\xbe\x1b\x4b\x74\x35\xed\x0a\x43\x08\xaf\xd9\xf0\xf3\x8a\x21\x9c\xba\xb2\xdb\x81\x4d\x78\x44\x58\xe1\x88\xf2\x6b\x3c\xa6\xc4\xfe\x55\x64\x61\x98\x05\xe1\x2d\x3b\x7f\x5e\x02\x49\x31\x45\x11\xe6\x5c\xa1\x73\x00\xc8\xc6\xa7\x83\x59\x80\x28\x2d\xf4\xfb\xd4\xbd\xb3\x3c\x99\xe2\xf1\x57\x72\x16\x44\x31\x64\xea\x8e\x48\x14\xbb\x9e\x87\x57\x00\xb1\x47\xc4\xb3\x60\x0d\x2a\xf2\x60\x57\x6d\x30\xef\x65\x1c\x6e\x6a\x4c\x20\x3d\xfd\xb9\x8c\xa0\x24\x32\x1c\x57\x05\x09\x86\x94\x21\x48\xc9\x8d\xa2\x29\x87\xad\x25\xbf\x58\xb6\xed\x3a\xd4\x8f\x2d\xef\x17\x32\x05\xf0\x4f\x9e\x78\x86\x5f\x59\x84\xe3\x7d\x5f\xfa\x7e\x20\xe8\x96\xd8\xe6\x25\x01\x56\x1d\x71\x26\x5d\xff\x2e\xf0\xee\x20\x62\x3d\x2e\x80\xc9\xc4\xf5\xad\x70\x2e\xc0\xc9\xd4\x8d\x1d\x1f\xb6\x77\xf6\xdd\x58\x9c\x78\x9a\x28\x9b\x44\x80\xad\x01\xe0\x16\x13\xd5\xad\x7a\xa2\x46\xa8\xe8\xce\x60\x0e\x81\x78\x02\x62\xcb\x7c\x40\xa6\xa6\x65\xb6\x20\x84\x85\x51\xb3\xf3\x8b\xc6\x3b\xca\x8a\x65\x53\x57\x00\x2f\x3f\x01\x54\x63\x27\x88\x8e\x5a\xf2\x09\x26\xf5\xd3\x88\x4c\x23\x9e\x0d\x1d\x61\x24\x0e\x5a\x4d\x72\x19\x02\x14\x23\xc2\xfe\xd7\xea\xc6\x6e\x1d\x50\xbb\x56\x37\xf3\x02\x6d\x26\x13\x00\x3f\x23\x02\x71\x4c\x18\x0a\xd8\x82\x86\xb8\x05\x8e\x2d\xa5\x64\x74\x61\x5d\x4f\xb5\x25\x97\x43\x4b\x90\xd9\x23\x85\x69\x3c\x58\xdb\x29\xe8\x6d\x9e\x59\xf7\x42\x69\xc7\x6d\x62\xea\x27\xc2\x40\x0e\x9a\xdd\x32\x9b\x8d\x32\xb9\x3c\x63\x3b\x5d\xe3\x32\xd9\x43\x04\xea\xeb\x8c\xc2\xd3\x06\x92\x9b\x4e\xc0\x18\xa1\x84\x95\xdb\xf8\x06\x21\x85\x1d\xc1\x0f\xd8\x8a\x62\x5b\x13\x8f\xb0\xe0\xb7\x59\x7e\xb4\x33\xa5\xb2\xd8\xed\x95\x49\xe1\xf3\xfd\x2b\xbb\x50\x26\xad\x6e\x93\x14\x3e\x7f\x2e\x94\xe0\x39\x93\x51\x29\xee\xb7\x4e\xe1\xfb\xea\xcb\x42\x49\xbd\xbd\x8f\x28\x4f\x94\x43\x7e\xe1\x56\x06\xd1\xdf\x5f\xc8\x38\xf0\x5d\x91\x5e\x31\x61\xd5\xd8\xba\xc7\xe6\x85\x92\x45\xf6\x48\xad\x5a\xdf\xd4\xf9\x24\xa3\xcb\xe9\x18\xf2\x15\x42\x1e\x15\x8e\x5c\x3d\x43\xf8\x38\xe0\x1c\x37\x65\xe8\x5b\x52\x10\xf2\x03\x01\x69\x25\x72\xcd\x96\xa1\x4c\x46\x18\x52\x3b\x18\xfa\xee\x03\xb8\x5a\xd2\xfb\x89\xe7\xda\x6e\xcc\x16\x1d\x30\x33\xd5\x6b\xd6\x83\x2b\x5f\xc1\x44\x35\x0a\x38\x58\x76\x78\xfc\x90\x88\x7f\x57\xfa\x35\xb6\x26\x11\x80\x6f\xc0\x0d\xe4\xa8\x5a\xa9\x54\x8e\x36\x20\x2d\xd5\xac\x94\x27\x50\x67\xac\x4e\x4a\xe5\x50\x6f\x09\x51\x7a\x93\xef\x29\xf1\x82\xa2\x09\xbd\x0b\x15\xb9\x0d\x2a\x09\x7d\xd8\x14\x5e\x75\xd7\xd1\x86\x32\xb6\x26\x98\x12\x07\x11\xb4\xad\x48\x64\xe0\x72\x87\x3e\xdf\xee\x40\x03\xe1\xcb\x51\x6c\xe0\x08\x25\xe3\xc6\x09\x1e\xf8\xc8\x92\xbb\xa6\xdc\x1d\xbd\x39\x89\x66\x2e\x84\xc2\x60\xb3\xc3\xd0\x9a\x8c\x5c\x3b\x42\x6a\x5a\x5f\x49\xb1\x19\x87\xde\xda\x79\xa9\x42\x40\x49\xe1\x89\xb5\xf8\x4c\x5a\x3e\x82\x1b\x8b\x5d\x5f\x10\x62\x35\x91\x18\xc4\x69\x89\xdd\x14\x53\x4c\x02\x08\xaa\x3f\x9f\x59\x73\x25\xcd\x53\x48\xc1\xdd\x8c\x0c\xa7\x56\x68\xf9\x31\xa5\x64\x06\x21\xf6\xa0\xa3\x5a\xfe\x1c\xa9\x89\x8b\x07\x9b\x12\x0b\x1f\x07\x2c\x20\x06\xe0\xf9\xae\x3d\xf5\xac\x50\xc0\x65\xab\x93\x79\x54\x15\x7a\xf1\x51\x4d\xfe\x56\x97\xbf\x6d\x90\x3d\x7e\x19\xcc\x4e\x7d\x65\x48\xe3\x33\x6b\x52\x2c\xec\x17\x0c\xf3\x8c\x07\xa8\x88\xb9\xd3\xb4\x34\x7d\x0f\xc0\x53\xcc\x62\x5d\x9f\xb0\x45\xca\xe1\xc0\xfa\xa0\x9c\x09\x0c\x4b\x71\xcf\x80\x28\x2a\xfe\x14\x74\x74\xca\x88\xf1\x99\x41\x9b\x1b\x7a\xd3\xbd\xda\x84\x93\x99\x7b\xfe\x55\xef\xeb\x35\x48\x0b\x75\xff\x32\xbd\xfb\x24\xc2\x08\xa4\x58\x3f\x0a\xfb\x85\x32\xb9\xea\xa2\xc1\x2e\xcd\xab\x53\xb6\x75\x1e\x55\x0b\xd9\xd1\xee\xfc\xf5\xa3\xed\xac\x38\x5a\x8b\x8f\x76\x90\x99\xea\x4e\x6e\xf7\x85\xc3\xaa\x3c\x69\xd2\x39\xeb\x74\x15\x05\xf4\x19\x0e\x94\x4f\x5a\xcd\xb3\xc6\xda\xc6\x16\xac\x2f\x50\x09\x21\x41\xdd\x30\x10\x1b\x3a\x7f\x30\x26\x4c\x92\x15\x95\x42\x36\xc5\x11\x9b\x20\xdf\x2d\x53\x42\x82\xf4\x76\x03\xc5\xba\x70\xce\x5f\xc5\x83\x9d\xaf\x99\xf0\x65\xb5\xc4\x29\x90\xc9\x28\xcb\x4d\x05\x07\x2a\xa4\x43\x58\x0d\xf4\x1e\x32\x76\x03\x54\x89\x1a\x01\x07\xd7\x23\xa6\x38\xa2\x9a\xa6\xee\xe1\x51\xe5\x59\x92\xe8\x4c\x40\xa1\xb8\x3e\xd1\x2e\x56\x8c\xda\xf7\xa9\x6b\xdf\x32\x26\x41\x36\x34\x61\x52\x4f\xe2\xf6\xee\x63\x24\x94\x39\x20\xa4\x0a\x6d\xdb\xb5\x4b\xa6\x81\x84\xfe\xd7\x34\xac\xcb\x14\x9c\x92\xc5\x71\x8e\x57\xbf\xa2\xbc\xce\x75\xad\x3b\xc0\xf8\x63\xdb\x83\xe8\xdf\x41\xab\xd9\x6d\x62\xdf\xf5\x01\x58\x3c\x33\x74\x1c\x10\x04\xd9\xb5\x10\x71\xe1\xba\x87\x14\xca\x6c\x4b\x72\x23\xf2\xab\x1f\xc4\xa8\xdc\x70\x98\x3e\x5d\xdf\x8f\x58\x9b\xe6\x3b\x28\xa6\x5d\x4a\x2e\xa1\xba\x93\xc4\x79\x90\xc9\x72\x9b\xd8\x20\x14\x37\x61\xe3\xa5\x1d\x6d\x8b\x82\x14\x1b\x63\xab\xc7\x15\xae\x6a\xb5\x2a\x8c\x23\xfc\xf6\x9f\x24\x66\x5e\x9f\x4e\x78\x73\x20\xc8\xab\xb5\xd9\x3c\x6d\x37\x4f\x98\x3a\x90\xdb\x60\x7d\x61\x83\x80\x73\x1d\xdc\xa1\xf5\x1b\x81\x4f\x2d\xc2\xf3\xfd\x03\x7a\xc3\xcc\x5f\x71\xf0\x9d\xc6\x11\x01\x5f\x07\x09\xf7\x27\x6f\xf9\x44\x81\x13\xd3\xac\x5c\xc2\xa1\x23\xb4\xec\xdb\x48\x07\x95\x50\x53\x54\x0a\xcb\x46\x3b\x86\x20\x98\x81\x4b\x3d\x27\x12\x52\xab\x06\x22\xf7\xa7\x83\x01\x53\xb1\x04\xa6\xbc\xb0\x44\x8a\xcf\xd9\x68\x25\x41\x69\x48\x4a\x9b\xab\xc4\xe7\x3f\xa4\xbf\xe3\xd4\xb7\xb5\x7d\x19\xea\x87\x1a\x01\x63\xc8\x6c\x7f\x3a\x48\x42\x65\x93\xf7\x2b\xf4\x54\xd7\xc6\x8b\x3d\x4c\xb1\x5a\xe1\xa0\x8a\x7e\x92\x74\x8a\xfd\x5d\x16\x2d\x19\xc2\x10\x84\xa3\xfa\x1e\x49\x7d\x92\x20\x3f\x4c\x07\x3c\xb0\x8c\xfd\xf6\xc7\x1f\xfa\x8a\x9e\x04\x91\x30\x94\xa3\x0f\x24\x63\x44\x3e\x31\x2b\x1c\x8a\x68\x54\x23\x50\x43\x8a\x6d\x65\x6d\x5e\xc4\x9c\xe5\xf2\x60\x11\x6a\x47\x96\x05\x50\x04\x2a\x1f\x4a\xef\x7d\x1d\x80\x6a\x7f\x3a\x28\x2a\x03\x2f\x14\x52\xdf\x37\x84\xb9\x25\x93\x3d\x38\x67\x3c\xa6\x65\x9b\xdf\x7d\xad\x6f\x79\x08\x24\xc8\x6f\xd3\x9c\xe6\x74\x09\x39\xaa\x31\x54\x76\xcb\x24\xa5\x9a\x84\xb2\x0d\x12\xe1\xdd\x00\x7f\x6a\x3a\x28\x8b\xa9\x06\x9d\x91\x89\xc6\xca\xc3\xdb\x07\xc1\x5a\x30\x41\x28\x79\xd2\x25\x91\x4f\x84\xea\x95\x48\xde\xc8\x8f\x5f\xe7\xc8\xa5\x91\x07\xd2\x4e\x46\x3c\x37\x8a\x17\x0e\x9f\xd1\xb7\xc2\xe1\xd7\x07\x1a\x06\x09\x1f\x44\xa2\xd1\x84\x17\x4c\xb2\x3f\x55\xbf\xac\x3c\x7a\x29\x3b\x69\x1e\x88\xc6\x14\x46\x30\xda\x15\xfd\x55\x4a\xf5\xd5\x54\x7b\xf8\x9c\x5d\x91\x7d\x87\x0e\x5c\x9f\x3a\x05\x25\xc1\x25\xef\x1f\x5f\xca\xa2\xbc\xc6\x9f\x23\x0a\x48\x91\x82\x39\x60\x92\xf4\x09\xf7\x86\xc8\x4b\x1c\x67\x85\x43\x7f\x3a\x46\x9b\x9e\xa8\xc8\x91\x0b\xc1\x9c\x18\x87\x2e\xbd\xa3\xab\xb0\xc5\xb5\x42\xed\x2d\x18\x29\x4b\x01\xbb\x66\xac\x4e\x1e\x87\xd1\x9b\x27\x19\x1a\x96\xfe\x22\x78\x23\x1f\x92\xf9\x53\x32\x6c\x06\xb0\x1a\xdb\x3e\x20\xf0\x96\x49\xad\x5a\x92\x11\x16\x0d\x65\xd8\xc1\x80\x00\x2b\xdd\x88\xc4\x1c\xd4\x8a\x6f\xc5\x62\x73\x87\x59\xaf\xc8\x17\x5f\x20\xbe\x47\xaa\xa5\x24\x0a\x27\xd9\x02\xa1\xdb\x6a\x76\x4d\xf6\x1f\x11\x10\xcd\x3f\xd1\x8b\x2a\x33\xd2\x70\xee\x2c\x61\x0a\xc0\x13\x49\xdd\x03\x8d\xfe\x2e\x70\x85\xc7\xb4\x1b\x38\x0b\xc1\x80\x6b\xd9\xec\xbe\x88\xf4\x56\x99\x0d\x5e\x54\x9d\x10\x20\xad\x88\x25\x5b\x63\x2f\xf6\xb0\xc5\xd4\x42\xe3\x31\x9d\x94\x84\x74\x6c\xb9\x00\x01\x07\xb9\xa9\x10\x41\x5c\xd9\x86\xb2\xc9\xa9\xe4\x58\x19\xa5\xcc\x70\x85\x37\x87\x9a\x5f\x64\x49\x1b\xab\x8c\x76\x42\xe9\x6d\x47\x90\x49\x6d\x4c\xba\x53\x27\xdf\x98\xc4\x63\xae\x60\x44\xfa\x00\x90\x0c\x80\x94\x3e\xe8\x05\xa2\xda\x77\xfd\x3f\x9b\x09\xd0\x4e\x4e\x03\xab\x72\xa0\x39\xb2\xc2\x47\x8f\xbc\x0c\xa9\x75\x9f\x3e\x78\x76\x10\x59\x69\x39\x57\x87\x0d\x96\x70\x26\xc2\x7f\xe9\xf8\x99\x02\x3a\x1d\xd3\x27\xb1\xe0\xc5\x8b\x5c\x26\x28\xae\xc6\x7c\xbc\x6e\x44\xe8\x78\x12\xcf\xc5\xdb\x93\xa2\x8a\x46\x64\x22\x72\x7b\xa6\x32\x5f\xe4\xee\x99\x51\x93\x27\x69\x59\xda\x69\x01\xf6\xc3\x34\x19\x39\x10\x7e\xa8\xfc\xb6\x27\x57\xb4\x1a\xfc\xaa\x5f\x82\xd4\x16\xee\xd4\x7d\xe0\x0e\x5e\x5d\xee\xe2\x5d\xf5\x52\x55\x2c\xe5\x53\x52\xa3\x28\xad\xbb\x5c\x14\x2d\xb4\x57\xef\xc9\x46\xe4\x3b\x2b\xd4\x42\x7a\x6a\xb2\xe6\x38\x0d\x0b\x9c\xad\x38\xa4\x71\x0a\x35\xaf\x84\x80\x7b\x2a\x1d\xb0\x96\xc8\xba\x47\xa7\xbb\x9a\x1d\x22\xf9\x42\xc1\x8c\x4d\x8c\x51\xf0\x4d\xa2\x0f\x27\xb6\x29\xf8\xa2\x96\x7c\x51\xd7\xbe\xa8\x27\x5f\x6c\x68\x5f\x6c\xac\xc4\x46\x91\xce\xc7\xcc\x49\x8d\x05\xbc\x28\x67\x9f\xc2\x69\x85\x03\x3a\xb3\x33\x3c\x33\x70\x5b\x70\x31\x45\x24\x61\xa5\xc2\x46\x64\x9e\xfc\xa2\x93\xaa\x92\xd8\xf5\xaa\x7a\x95\xc4\xcc\x57\xd3\xbf\x48\xac\x7e\x75\xfd\x8b\x8d\xc4\x1c\x98\x62\xe3\x6a\xf8\x7e\x49\x5f\x16\xd8\x0f\x33\x33\x6d\x2e\x5b\x55\xcb\xd6\x1f\x41\x77\x63\x85\xb2\x06\x43\x9f\xd1\x76\xf6\x04\x9b\xc7\xe3\x1d\x12\x94\x6d\xf0\x2d\x3c\xa1\x27\x0f\xc6\x69\x93\x09\xf8\x92\x72\x0c\x86\x5f\xd0\x47\xa2\xc7\xae\xfa\xae\x3f\xfc\x85\x44\xd4\x16\xa7\xf9\x27\xf0\x5f\x49\x6b\xd7\xa6\x8c\x20\xe8\x51\xa1\xce\x27\x4d\x01\x36\x69\x03\x59\x34\x12\x35\xcc\x48\xbe\x5d\xd3\xf1\x24\x08\xad\x70\x0e\x56\x27\x6b\x88\xca\x7f\x30\x0d\xe1\xe5\x3c\xf0\x23\xd0\x0b\x51\xe5\xc4\xbf\x45\x4d\xf1\x02\x8f\x99\x74\x84\x11\x8a\x95\x1c\x07\x8e\xaa\xd6\xd3\x4a\x34\x72\x07\xf1\x09\x9d\x63\x07\xd8\xd7\x7f\xec\x91\xcd\xe4\xfb\x31\x8d\xad\x13\x3a\x67\x3b\xb9\x9e\xba\x42\xe6\xc8\xaa\x58\x5e\xdc\x8e\xce\x68\x6c\x91\xbf\xfd\x8d\x50\xf6\x27\xa3\xa7\x11\xdc\x49\x08\xda\x71\xe8\xa5\xdb\xab\x6d\xcb\x31\x5f\x1c\x5c\x14\xc3\xa1\xeb\x3b\x56\xe9\x35\x79\x4f\xb5\x3c\x7b\xc2\x98\x2a\x8c\x49\x60\x4e\x5d\x0f\x42\xf6\xfb\x36\xd3\x39\xe9\x7d\x4c\xd1\xa8\x22\x0c\x87\x90\x9b\x88\x1d\x28\x80\xbd\x06\x56\xe2\x60\x3a\x1c\x95\xb9\x43\xc3\x04\x33\xa8\x5a\x18\x75\xf8\x6d\x1a\xc5\xc4\x22\x9e\x1b\xc7\x1e\x2d\x93\x36\x99\x59\x91\x5f\xe0\x46\x48\x91\xe1\x6f\x48\x63\x72\xe7\xc2\x93\xd3\xd8\xb2\xe5\xf3\x05\x77\xcc\x45\x6d\x30\xc2\x27\xcd\x48\x70\xfd\x9e\xec\xf1\x27\xbb\xca\x20\x0c\xc6\xec\xe0\x6f\x06\x0e\x2d\x72\x18\x61\xcf\x1a\x4f\x8a\x54\x72\x16\xdd\x1a\xc8\x0b\xb2\x51\x2f\xc3\xbf\xfa\xd6\x56\x49\x22\x70\xcd\x1f\x45\xab\x13\xcc\xb2\x84\x9e\x11\xf1\x80\xc3\x4a\xce\x27\x09\xaa\x91\x15\x51\x52\x80\xc4\xde\x85\xd7\xfc\x86\x01\xe2\xc4\xc1\xf3\xa9\x97\xba\xa9\x70\xdb\x5c\x8d\xb1\xa3\x4e\x26\xde\x14\xae\x71\x96\xe3\xb8\xfc\xf2\xba\xbd\x29\xf0\x02\xfa\x10\x29\x5a\xa4\x15\x87\x7a\xb1\xf5\x91\xfc\x4a\xd6\x6a\x25\xf2\x3b\xa9\xb2\x9b\x75\x95\xbc\x26\xb5\x12\x79\x41\x5e\x6d\x4b\xaf\x49\x26\x18\xe3\xc0\xd9\x95\x37\x1d\x94\x71\xb6\xc5\x7c\xbe\xaf\xf5\x3f\x9d\x15\xc8\x0b\x23\x27\xfa\x8c\xd0\x3d\x79\x41\xe6\xbb\xcf\x92\x41\x9c\x88\x34\xa4\x09\x4c\x44\x18\x8c\x79\x42\x73\x84\xa6\x86\x1f\x0a\xd9\x91\xa8\x1f\x2b\xf8\x30\xbc\x47\x21\xb5\x6e\x39\x49\xe4\x14\x2c\x6f\x27\x98\xf9\x2a\xb7\xf6\x81\x27\xf8\xc0\x24\xb3\x64\x49\x56\xf1\x9b\x12\xb0\x6a\xa3\x2e\x1a\x05\x9f\x63\xb2\x47\xce\xac\x78\x54\x19\xbb\x7e\x91\x56\xb0\x7c\x99\xd4\x4b\x30\x81\xea\x50\x1a\xbe\x43\xc6\xee\xbd\x50\x3c\xc7\xca\x6a\x8f\x2a\x19\xf6\xfd\x14\xff\x16\x8e\x7c\x3a\xc9\x4a\xc9\x74\x02\x56\x51\x3f\x10\xc8\x49\x7c\x57\x45\xc0\x41\xce\x84\x99\x15\x91\x90\x7a\xd4\x8a\xb8\x03\x85\xb1\x7f\x9f\xef\xeb\x1b\x85\x15\xbb\x32\x0e\xee\xa8\xec\xcc\x23\xb6\xdf\x4e\xe3\x08\x77\x2d\xec\x59\xa4\xfa\x2b\xaf\xaf\x93\x6e\x6c\xf9\x8e\x15\x3a\xa2\xe3\x7d\x97\x23\x54\x50\xf2\x81\x9d\x02\x04\x8e\x05\x3b\xe0\xde\x2b\x21\x34\xc5\x13\x42\xbb\x61\x14\xab\xb4\x38\x09\x78\x4e\xe1\xc8\x8e\xee\x00\xfd\xe7\xfe\x86\x8e\xb0\x20\x32\xf0\x3d\x75\xca\xfc\x23\x37\xe2\xef\xd9\x8e\xe2\x89\xcc\x93\x18\xb8\xb1\xf6\xc8\xa4\xb4\x4b\xe2\x51\x48\x29\x6f\x92\xf5\xb8\x3d\x20\x3e\xbb\xdb\xe0\xfe\x34\x66\x2d\xa9\xd4\x64\xa3\xf1\x88\xfa\x7c\x68\x03\xcf\x1a\xc2\x1b\x30\xb8\x8b\xf1\xe9\xaa\x10\xf2\x1e\x72\xa7\x3a\x81\x8c\x0b\xae\x48\x4a\x4c\x84\x15\x51\x45\x67\xc1\xd0\x0d\x42\x37\x9e\xc3\xd3\x96\xc4\xf3\x80\x26\x5e\xc3\xe8\xcb\x64\xec\x3a\x0e\xdb\x70\x43\x9e\x92\x8b\x24\xd3\x28\x27\x86\xfc\x8d\x54\xef\x6b\xea\xf4\x00\x75\x3e\xb9\xc0\x45\x2c\x59\x51\x0a\xf4\xc9\x0b\xe9\x59\x4d\x74\x2f\x78\x9d\xf0\x66\x1e\x61\xec\x5a\x1e\xe9\xda\x0a\xa4\xeb\x79\xa4\x71\x7e\x73\x28\xd7\x33\x94\x33\x44\x60\x3e\xc8\xc8\x1d\xb2\x73\x47\xcc\x74\x9a\xce\x86\x42\x47\x9b\x96\x86\xe3\x90\x8d\x3a\x3b\xbd\x04\xc2\x19\x57\x98\xc6\x01\xbf\xff\x6b\x64\x52\x93\xba\xca\x0e\x64\xd8\x83\x7e\x6e\x17\x92\x03\xc8\xee\x01\xb6\xe7\xda\xb7\x7c\xfd\xe3\x27\x4e\xdf\x53\x3f\xd4\x2b\x71\x23\x98\xf8\x4a\x24\x02\xa4\x61\x18\x84\xc5\x02\x7f\xa2\x54\x15\x48\xcc\x02\x88\x87\x65\x99\xd0\xf4\x91\xa0\xf8\xe7\x8b\x01\x2a\xe6\x50\xa9\x31\xb9\x81\x92\x40\x32\x29\xa9\x67\x9b\x10\xbe\xc6\xc9\x83\x68\x30\xd0\x9c\xb3\xf9\xbb\xb7\x30\xdd\x84\x34\x02\x93\x38\x4f\x08\x9b\xf8\x14\x3f\x53\xb3\xf8\xeb\xa8\xf2\x3d\xd5\x1e\x84\xf9\x1c\xd1\x43\xd1\x94\xcf\x91\xfb\x4f\x25\x29\x1d\x53\xf9\x1c\x8d\x4a\xb2\x74\x99\x56\xb5\x63\xdd\xe4\xae\xb8\xe4\x26\x4f\x20\xfc\x71\xc1\x06\x09\x98\x0e\xb8\xb6\xc2\x73\x20\x3e\xcf\xd4\x4b\x6c\x12\xc5\x92\x6a\x83\x55\x9f\x2a\xd4\xf2\xec\xf3\x24\xd2\x06\x0d\xf7\x99\x42\x60\x99\x10\x65\xf0\x61\x20\x53\xa6\x3f\x1d\x70\x59\x32\xb6\x51\xb1\x2d\xcf\x83\xc1\x94\x33\x05\x4a\xbc\xa2\x3c\xa5\xd2\x95\xd9\x51\x05\xff\x15\xc0\x36\xa9\xce\xb1\xef\xd9\x7f\x94\x20\x7c\x53\xff\x58\x31\xc9\x71\x92\xa4\x96\xbb\xc4\x77\x22\xc7\x75\x10\x09\xdf\x13\x9e\xbd\x70\x51\x78\x5e\x50\x91\x6a\x14\xc1\x44\x97\xd4\x44\x2a\xff\x24\x41\xe1\x9e\xb1\xa6\xb8\x2c\xc9\x20\x83\x73\x9e\xf4\xce\x33\xe0\xe0\x52\x35\xbf\x99\x0e\x2c\x19\x87\xda\x62\x03\x7a\x4a\x06\x3c\x31\xb4\x08\x7d\x34\xd4\x5b\x23\xbb\x80\xbc\x26\xa3\x38\x9e\x44\xaf\xd7\xd7\xa9\x5f\x99\xb9\xb7\xee\x84\x3a\xae\x55\x09\xc2\xe1\x3a\xfb\x6b\x1d\xa9\xe4\x8d\x34\xc9\xbb\x66\x1c\xad\x12\x6a\xa9\x67\x68\xd3\xf7\x07\x39\x0d\xe8\x58\xac\xc6\x40\x62\xf3\x4b\x38\xbd\xac\xfd\x8c\x67\xb2\x58\x8d\x99\x9e\x74\xa9\x30\x1f\xe6\xba\xc3\x18\x5f\xb9\x64\xf9\x74\xbe\x6e\xf9\x05\xa4\xe3\x8d\x73\x07\x12\xd1\x58\xf1\xd2\x4c\xee\xde\xfc\x33\x1c\x8e\xbc\xe0\x68\x9f\xe6\x6e\xfd\x33\x2b\xf4\x8b\x85\xb6\x0f\xb9\x4e\x94\xa7\xb6\x5f\xc4\x68\xa4\x54\xff\xc2\xcf\x02\x41\x77\x37\xd1\x80\x0f\x2d\xcf\x23\x49\x0a\x36\x79\x16\xb9\x51\xb0\x56\xaf\xd6\xeb\xf2\x2c\x5a\xee\xb2\x63\x2c\x95\x71\xdb\x49\x1d\x42\xa2\x3d\x58\x19\x6b\xe8\x2b\xb4\xbc\x4d\x35\x46\x6e\x41\x93\x6a\x31\x73\x8b\x7f\x5a\x53\xe6\xd1\x25\x59\x6a\xf3\x5c\x7b\x34\x9b\xf8\x20\xa4\xd1\x08\x43\x77\xd0\xdf\x81\xa9\x38\x32\xf5\x78\xe2\x58\x85\x81\x03\xb9\xc2\x66\x6a\x2b\x6b\xc1\x43\xcc\x3b\x8c\x2c\x40\xa7\xff\x1d\xb0\x00\x94\xb9\xab\x6a\x34\x05\x95\x0f\x1d\xe0\xd2\x91\x4e\x6c\xbf\x99\x81\x52\xed\xd3\x3b\xf0\xc9\x5c\x5f\x27\x11\x58\xaa\x82\x88\x92\xb5\x35\x74\xe5\x8c\x47\xe0\x9d\x3b\x12\x30\xb3\xac\x91\xe7\x02\x7c\xdb\xae\x91\x3d\x72\x81\x87\x3c\x53\xc2\x8a\x89\x99\xad\x59\x13\x8f\x85\x95\x81\xcb\x36\xfb\x62\x91\x96\xc8\xde\xef\x1c\xec\x2a\x3b\x4f\x7f\xfc\x41\x28\xec\xb9\x4c\x0f\x6b\xc4\xc5\x12\xf9\x8d\x54\xef\x77\xe4\x9b\x63\x65\x6c\x4d\x04\x8d\xc2\xe7\xcf\xf7\x6c\x39\xa0\xf5\xe1\x61\x62\x39\x45\xbd\x6e\x25\x0e\xb8\xbe\x53\xdb\x2e\xb1\xdb\xac\xa4\x82\xd0\xbf\x8a\xf5\x31\xe5\xcc\x45\x67\xa4\x43\x87\xad\xfb\x49\xf1\xbf\x3e\xfd\xe7\x3f\x6d\xbb\xf6\xe3\xcb\x7f\xa5\x52\x55\xa4\x9d\x60\x32\x4e\x34\xe0\xd7\x03\x2a\x0e\xf8\x98\xc5\x49\xe0\xb6\xf0\x32\xc3\xeb\x52\x2d\xeb\xc5\x86\x6f\x3b\xc5\x66\x75\xbd\x59\x4b\x85\x8f\x83\xe1\xe0\x53\xb3\xd7\x39\xfd\x22\xfd\x5a\x93\x0c\x02\x76\x00\x31\x77\xdc\xdb\x5b\xb8\x74\x0b\x45\x0b\x5e\x9b\x42\x17\x3c\x90\x53\x19\x46\xf9\xed\x4b\x40\x30\xe9\x1d\x91\x7a\x9a\x1b\x4d\xe0\x0e\x95\x7e\xb3\x51\x9e\xd7\x34\x3f\x3b\x45\x56\x13\x05\x41\x79\xdb\xa6\xde\x40\x66\x9b\x56\xe1\x24\xa1\x93\xea\xdb\x36\xc0\x04\xb0\xe2\x06\x91\xf9\xdb\xdf\x80\xd0\x27\xf8\xfa\xe8\xf4\x4b\xe5\xe8\x54\xcc\x33\x3e\x9e\xa7\xbf\x4d\x8e\x66\x02\xdf\x25\x4a\x72\xd2\x2e\x2c\x7a\xe9\xb0\x47\xad\xd0\x1e\x69\xce\x81\x6a\x0c\x7c\x9f\xed\x76\x10\xf5\x28\x27\x42\x18\xdf\x50\x83\x9b\x28\x4f\x5a\xa9\x07\xd8\xa2\xb4\xad\xf9\x1c\x9c\x00\xa3\x2f\xe0\xf5\x0d\x9a\x2d\xa6\xe5\x33\x81\x9a\xd2\xaa\xec\x91\xaa\xe0\x16\x40\x29\x16\xc0\x07\x70\x3a\xee\x7b\xd4\x11\xf7\x79\x76\x52\x1b\x7c\xde\x2b\x89\x32\x29\xa6\xb8\x58\x68\x36\x6b\x85\x32\x51\x5e\x01\xab\x65\x52\x2b\x95\x95\xc1\xf0\xe3\x47\x19\x1d\x7f\xdf\x2c\xd6\x4a\xbb\x9a\x4d\x59\xb9\xa3\xa4\xfa\xbc\x56\x53\x3a\xdd\x43\x87\xf1\x90\x12\x3f\x30\xc4\x14\xc9\xf4\x69\xb8\x8c\xb0\xd7\x38\x65\x4c\xd7\xcc\xf4\x06\x14\xfb\xa2\xb9\x2b\xb2\x9a\x32\x3a\xa5\x6b\xa5\x64\x67\x58\xc0\x11\xa5\x82\x91\x37\x06\xce\xa8\xc3\x7f\x91\x7e\x4c\xc5\xd8\x46\x4b\x86\x9d\xca\x20\x87\x36\xfb\xdb\x99\xda\x34\xc4\xf5\x6c\xf9\x8e\x5c\x8c\xc4\x8d\x55\x5d\xf1\x53\xb3\xdb\xfe\x82\x51\x6c\xc1\x18\xfc\x4b\x07\x53\x8f\xb8\xfe\x20\x08\xc7\x68\x10\xb3\xfa\xc1\x54\x04\xd9\xd9\xdc\x52\xbc\x60\x31\x37\xbb\xed\xa5\x0b\x19\xf0\xd6\x52\x52\xce\x2e\xd3\x89\x74\x73\x87\x38\x95\x23\xe1\x30\x4a\x70\xdb\x47\xe4\xf7\x3d\x52\xf8\x7b\x81\xad\x66\x1b\x1e\x6a\x0b\xff\x5d\xd0\x44\x03\xdd\x61\x71\xdb\x64\x87\xea\x12\xe9\xed\xb6\x0b\xe5\x9c\xe0\xc5\x17\x79\x21\x83\x2f\x88\x3d\x52\x43\xab\xc5\xcf\x22\x91\x37\x7b\xd7\x3d\xd3\x8c\x32\x36\x40\x30\x17\x76\xd5\x01\x5d\x32\xc5\x14\x82\x9a\x1d\xea\xb9\x63\x57\x0e\x24\x41\xe2\x4f\xf7\x4f\xc3\xd0\x35\xd4\x57\x02\x25\x33\xe1\x98\x60\x38\xb4\x20\x68\x8a\x4c\x2c\xc7\xf1\x5c\xbf\x20\x8c\x25\xab\x8c\xc6\x08\xb3\xf0\x5c\x71\xd8\x4a\x19\x2f\x7b\x23\x3a\x27\xc1\xd8\x8d\xe1\xac\x91\x67\x1d\xa8\xe3\x5a\x26\x99\x68\x3a\x99\x78\x73\x14\x62\xfe\x03\x54\x31\x9b\x40\xa1\x94\x31\xc0\x18\xbe\xfd\x91\xe5\x37\x93\xa6\xaa\x2a\x4d\xaf\x54\xe6\x9f\x03\xf2\xf2\x3c\x4e\xb2\xb7\x72\xe7\xd3\x89\xe0\x6a\xe5\xd9\x63\x26\xe3\x9c\xc7\xa5\xca\xea\x7f\xd9\x54\x3c\x72\x26\x12\x6f\x38\x7b\x24\x39\x99\xb6\xe9\x09\xbf\x32\xe9\x7b\xb7\x46\x6a\x5f\xc0\xe3\x69\xa4\xe3\x57\xe4\xf0\x99\xa8\x7c\x7e\x23\xfe\x78\xbe\x47\x0a\xaf\x55\xa6\xcb\x87\xc1\xd4\xca\xcd\xef\x7f\xce\xf2\x4d\x3a\x96\x1a\x4a\xde\xb2\x56\x2a\xa4\x46\x90\x3e\x5b\x2b\x31\x8d\xe2\xa2\x3d\x2a\x29\xfd\x6e\x3e\xe2\xb8\xb4\x47\xa9\x43\x20\x0d\x47\xb4\xbe\x4e\xae\x7c\x19\x37\xa8\xf9\xf1\x24\xe1\xdb\x7d\xcb\xf5\x48\x30\xe5\x4b\x62\x05\x99\xc0\x23\xcd\x7c\x0e\xab\xb7\xe6\x5b\x77\x82\xf1\xf2\x8a\x32\x3a\xf5\x63\xd7\x4b\xf4\x9a\xbc\xe8\xbe\x56\xb7\x49\x44\x50\xdf\xaf\x64\x9f\x7a\x9e\x1e\xd7\xa7\x9a\xf7\x12\xc8\x20\xcb\xb6\xa7\xe3\xa9\x67\xc5\x4a\x14\x46\xb2\xfd\x7f\xaa\x7e\xa9\x10\x72\x66\xdd\x52\x12\x4d\x43\xca\xe3\xb2\xf1\x6a\x0f\xd8\x71\xd2\x77\xb4\x08\xa1\x2a\x69\x4e\x48\xdf\xd2\x92\xd0\x78\x25\x74\x56\xe2\x2c\xcf\xfb\xf5\x31\x98\x42\x20\x8b\x43\x63\x8c\x22\xb5\x50\x6f\x47\x0b\x06\xe0\x48\x80\x7b\x51\x7f\x4e\xec\x11\x85\x97\xf9\x24\x39\xa9\xf4\xd5\x92\x1a\xea\xc8\x8a\xf8\xf5\x0d\xb1\xe6\xd3\xc9\xf6\xcc\x57\x02\xb8\xa7\x29\xf1\x87\x63\xd4\xd2\x2d\x9f\x64\x03\x1b\x55\xb3\xeb\x8c\xdd\xd8\x38\xaa\xfd\x33\x1e\xc3\xaa\xc5\x7e\xaa\xd1\xb7\x7d\x4a\x42\xba\x06\x1d\x70\x92\xc8\xea\x05\x0e\xfb\x66\xf4\x48\x19\x44\x29\xb9\x14\x91\xc0\x1f\x06\x60\x6d\x09\x25\xc3\xf0\x7d\x47\x26\x29\x2e\xdc\x25\x00\x52\xf7\x36\xa5\x0e\xdf\xfe\xc7\xd6\x3d\x49\xc5\x78\x2e\xbb\x43\xc4\xae\x87\x2c\x49\x64\x71\xa9\x22\xf2\x48\x7d\x5b\x91\x72\x4d\xe5\x5e\x2f\x7e\xbe\xaf\xf5\x3f\x7f\xfe\x83\xc9\x76\x69\x7d\x55\x2d\xc6\xb4\x8b\x25\x3b\x70\x81\x5b\x37\xe1\x93\xda\x17\x7e\xcd\x3c\xb0\x30\xe9\x73\x4a\x45\x56\x7b\x96\xd2\x92\xcf\x03\x19\x02\x1e\x84\xf0\xb2\x55\xe6\x01\xef\x29\x38\x01\xf4\x4a\xe4\xba\xb2\xd6\x99\x17\x30\x5a\x7e\xb0\xc3\xc0\xfa\x41\x18\x77\xa8\x15\x05\xbe\x62\x21\x16\x6b\x94\x1f\x0b\xbf\xe7\xc4\xe0\x8a\xdb\x96\x42\x84\x0d\x37\x0e\x02\xe2\x05\xfe\x10\x6d\x56\x3a\x2d\x43\x23\x00\xcb\x77\x31\x28\xc2\xd3\x4c\xa1\xc4\xce\x8f\xb5\x5a\x0e\x69\x3a\xee\x53\x87\x89\x16\x9a\x33\xf4\x16\x52\x84\x94\xa6\x12\x7e\x93\x35\x39\x0d\xbf\x1b\xc0\x15\xf2\x46\xe4\x8e\x29\xd3\x9d\xe9\xfd\xc4\x0d\xa9\x83\xcd\x9a\x88\xaa\xc3\x4b\x48\x24\x07\x9b\xb0\xfc\x79\xc1\xb0\x58\x58\x20\xee\xaf\xb1\x07\xae\x64\x62\x42\xcc\xa4\xa7\x72\x0e\x48\x9d\x29\x73\x17\x4a\x17\xd0\x71\x88\x15\x35\xcb\x70\x96\x24\x6e\x94\xda\x8d\x2a\x9b\xc3\x29\x25\x35\x2f\xd2\x2b\x2d\x57\x8c\xd4\xdb\x2b\x87\xfe\x50\x50\x31\xe0\xc8\x4a\x8e\xc8\x29\x04\x63\x23\x7a\x43\x3c\x72\xfd\x5b\xcc\xfa\x20\x84\xce\x7c\x74\x16\xe5\x02\x20\xc9\x8d\x31\xcd\x04\x18\x88\xbe\x52\x52\x97\xc4\x64\x30\x28\x5d\x2b\x9c\xd0\x39\x57\x41\x85\x2d\x2f\x0c\x13\x4a\x08\x29\xa6\xee\x9b\x49\x0d\x76\xe5\x84\x7b\x05\xc8\x39\x79\x43\xea\xe0\xc8\xa2\x3d\x3a\x64\x72\xc5\x1e\x88\x5b\x23\x3f\xaf\xe4\x81\xc6\x93\xc4\xfb\x8e\x47\x23\x09\x80\xdc\x6c\xd6\x20\xa0\x1f\x7c\x78\x9b\xdd\x36\xfb\xcf\x75\x6f\xab\x2e\x80\x02\x72\x8c\xfd\xa2\x0d\x15\xa1\x08\x1e\x2f\x6d\x30\x4b\x9a\x36\x6e\x6c\x99\x6d\xc3\x82\xe0\x27\x56\xe5\xcb\x27\x56\x45\x46\x3b\x3c\xe7\xc5\x54\xb3\x10\x08\x53\x26\xc2\xbe\x64\xb4\xb1\x8b\xd7\x55\xc8\x4f\x36\x9f\x50\xf2\x82\x14\xa0\x53\xb8\xbc\x8e\xbb\x17\xe7\x15\xdc\x30\xdd\xc1\xbc\xc8\xbe\x28\xe5\x5b\x32\x64\x97\x93\x3e\x57\xd0\x5d\xe2\xa9\xdd\x6b\xa3\xb3\xc5\x9f\xd3\xbd\x98\x63\x2e\x83\x66\x0a\x3a\x79\xe0\x50\xf2\x3b\x13\x97\x97\x83\x42\x92\x70\x20\x83\xfd\xa1\xac\xc3\x36\x5b\x52\xb7\x2e\x87\xa5\x21\x23\xae\xe8\x4c\xc0\x7e\xe0\x46\xfc\xf0\xe9\x4f\xe3\x4a\xa5\xc2\xeb\xc8\xaa\xc2\x24\x2d\xa4\x01\x1e\xb7\x78\x6f\x50\x0e\xd0\x8d\xa4\x10\x91\x61\x10\x1b\xd0\x5f\xca\x82\x14\xae\xf5\x02\x98\x85\x62\x74\x38\xe1\xe8\xfa\x38\x05\x12\x89\xc5\xa1\xd1\x1b\x42\x8e\xa7\x51\x2c\x40\x2d\xc4\xb5\x32\xe9\x17\x18\x12\xb8\x97\x15\x38\x8c\xd1\x30\xb4\xfc\x98\x14\x01\x3e\xa3\xf0\xf9\xfe\x55\xb5\x50\x2a\x93\x22\x00\x69\xb0\x3f\x1d\xf8\xf3\xf2\x0c\xff\xa2\x12\xd7\x82\x11\x2b\x36\x2e\x79\xa9\x41\xa1\x84\xa6\x59\x2f\x40\xdd\x71\x9a\x72\xf8\x62\x27\xb3\xb0\xfd\xba\x71\x24\xb1\x43\x24\xa9\x04\x43\x83\xb5\x90\x51\xae\xcd\xc2\xc2\x28\x66\x71\x68\x5e\x93\xea\x7d\xc1\xb4\xa1\xc0\xb2\x55\x2c\xe4\x55\xdd\x44\x6e\x16\x26\x2e\xe7\x15\x8b\x5d\xd4\xf9\xbb\xf2\xa7\x64\x0d\xe3\xaa\xfe\x92\x7d\x9f\x4b\x5c\x7e\x30\x8b\x0f\x0f\xd6\x52\x9d\x64\x1d\x8a\x5e\x4d\x42\x3d\xf6\xef\x82\x5b\x9e\xf3\x43\xf8\x6a\xc4\x01\xe9\x9e\xad\x77\xce\x44\x19\xe5\xf6\xc4\xe4\x67\xaa\xc1\x6a\xc0\xdb\x19\x7a\xbf\x45\xae\x47\xfd\x04\x91\x23\xdf\x62\xcd\xee\x11\xe7\xdd\xf6\x59\xea\x25\xd8\x16\x70\xb5\xb1\xe2\x57\x6b\xf3\x1c\x67\x9b\x25\xf2\x4f\x94\x72\x48\xb7\x47\xa0\x72\xb1\xdd\x39\x33\x79\x5e\x44\x34\xc6\x62\x67\xf8\x94\x29\xcc\x48\xea\x45\x9a\xd3\xad\x57\x05\xe1\xc6\x34\x0e\xc6\x80\x3d\x7b\x4e\x67\x90\xe6\xab\x78\x7a\x9e\x47\x9e\x15\x6e\x5a\x61\xe8\x5a\x43\x8a\x01\x19\xe6\x66\x72\xf6\x22\xe1\x80\x99\xda\x2a\x55\xc6\xc2\x04\x9e\xc9\x9d\x08\xb6\x9e\x2c\x58\x2e\x9b\xf4\x90\x5f\xe1\x94\xd9\x4f\xa3\xed\x2c\x9b\x6f\x0c\xdb\x5e\x3f\x68\x35\x3b\xdd\xde\xa2\x79\x3b\x68\x35\x97\x4e\x9b\x78\x8b\x95\x31\x71\x58\xa2\x56\x2d\x69\x8e\xa7\xb5\xd7\x88\xa2\xd5\x6a\x36\x4f\xce\x34\x73\x42\xd6\xe5\x78\x32\xf1\xb8\x73\x61\x53\x84\x6e\x40\x83\xb9\x6e\x82\x1b\x09\xf1\x8b\xd3\x33\xc5\x6c\x83\x61\x7d\x39\x70\x62\xaa\x1d\x27\x33\xe5\x88\x9e\x8a\x0f\x8b\x6f\x48\x6d\x83\x9d\xfd\x3b\xd5\x92\xe2\xed\xa4\x57\xb1\x3d\x6a\x85\x6f\x83\x31\x2d\x2a\x68\xa5\x19\xaa\xd7\xbd\x2e\xb8\xa4\x76\xe8\x10\x20\x9b\xa7\x9e\x57\x16\x99\xb3\xb1\xca\x8f\xbc\x31\x6e\xc9\x31\x76\x9b\xe7\x66\x0e\x46\x34\xee\x50\xc8\x27\x75\xed\x3a\x34\x50\x64\xd4\x48\x71\x5b\x52\xbc\xc8\xa5\x77\x11\xba\x43\xd7\x4f\x2d\x2c\x23\xb5\x97\x92\x5a\xe3\x7d\x2e\xb9\xf7\xa1\x35\x41\x7f\xec\x65\xe4\x6a\xf5\xd7\xc2\x49\x33\x8c\x11\x6b\x4a\x05\xbb\xd4\x67\x58\x01\x93\x2a\xe5\x33\x1f\x85\x69\x9f\x91\x5a\xd6\x7a\x3d\xe1\x76\xaf\xd9\xca\x1d\x0e\x52\xbc\x46\xcc\x93\x65\x34\x37\xaa\x7c\x44\xa3\x60\xc6\x3d\x93\xfb\x56\x98\x47\xba\x2b\x0a\xac\x48\x7d\x93\x53\x6f\x00\x6e\xd8\x4e\x95\xac\x81\xd0\x16\xf9\x9a\x28\xc1\xe6\x62\x6c\x6c\x01\xda\xde\xe2\x55\xb7\xc9\x99\xc4\x65\x6e\x6d\x26\x27\x37\xbf\xb1\x44\x44\x57\x17\x85\x6d\x2e\x5a\xfb\x96\x7d\x6b\x85\x61\x30\xc3\xc8\x07\xea\x3b\x11\x18\x6c\x30\xf3\x3a\x1b\xe9\xfe\xc9\x59\x69\xf1\xde\x22\xcb\x77\x59\xf5\x7d\x59\x7b\xd9\x58\x6b\xd5\x6a\xf5\xb5\xea\xe0\x19\x08\x17\x42\x70\x44\x94\x38\x1a\x49\xdb\x7a\x98\x4b\x51\xd1\x15\xc4\xa6\x92\xf5\x58\x46\x88\x8d\xd7\x8b\x42\x49\x76\xcd\x6c\x9d\xfb\x36\xb8\x68\x43\x06\x97\x05\x5e\xed\xb5\x6a\xb5\xbe\x70\x1c\xf0\xf2\x15\x5a\xc3\xe8\x67\xc7\x02\xde\xd7\x7f\xed\x50\x6a\x62\x45\xc1\x5a\x01\xd3\x5c\x10\xc7\xc1\x18\xdc\x25\xe3\x39\x09\xa6\xf1\x64\x1a\x9b\x5b\x81\x2a\x17\xfe\x05\x14\x59\x61\xfa\x6b\xb5\xfc\xb6\x98\x38\x82\x93\xf5\xc2\xa6\x4e\xe8\x3c\x8a\xc3\xe0\x76\x15\x61\xdb\xe0\x7b\x33\x93\x52\x00\x7c\x03\xdf\x16\x08\xc3\xe1\xaf\x1c\xec\x0e\x79\x4b\xe7\x8b\xa5\x7d\x4c\x63\x0b\x04\xbd\x85\x5e\x29\x2b\x34\xfc\xca\xd4\x70\xc3\x8b\xcd\xed\x62\x84\xbc\xd4\x05\x92\x0f\x9f\xe7\xf4\x88\x5d\x0c\xdc\x60\x1a\x35\xbc\x18\x3a\xf6\x7e\x64\xc5\x5f\x75\x27\xea\xc7\xd4\x94\xd8\x5c\x4b\x2a\x5b\x4a\xa5\xdd\xe5\x6d\xa9\xc5\xc1\x1c\x06\xec\x2b\xa8\xee\xd6\xfc\xbf\x29\xdd\xef\x09\x03\x5e\xa9\x0b\xcf\x56\x18\xa3\xb1\xa5\x3c\x5d\x64\x19\x5b\x25\x08\x06\x59\xa4\x93\x6c\xf2\x9d\xf9\x2a\xa2\x4c\x46\x68\x08\xd1\x58\x5d\x3b\xa4\xd4\x27\xfb\xe0\x83\xac\x0a\xd7\xe6\xcb\xd7\x79\x87\x82\xac\xbd\x8a\xaa\x51\xab\x6e\xee\xbc\x96\x48\x4f\x02\x8f\xd2\x8a\x34\x9c\x27\xd9\x8c\x12\xa5\x28\x03\x8a\x35\x5a\x5c\xe4\x59\xff\xc8\x0b\x20\xce\x34\x70\xa6\xcf\x55\x16\x89\x79\x2e\x71\x33\xc7\x97\x0c\xd2\xa8\x4f\x26\xd4\x32\x6f\x8a\x4f\x21\xae\x76\x96\x47\xef\x16\xb3\xef\xbf\x59\x65\xa8\x5a\xdd\xe4\x27\x70\x68\xd9\xb7\x94\xdd\x57\x26\x56\xc4\x2f\x1b\x95\xbc\x29\x95\x85\x2f\x59\xd9\x05\x73\x9a\xf2\xda\x5c\x6e\xd4\x59\x7c\x95\x52\x6f\x43\x86\x1b\x15\xd1\xdd\x0e\x95\xeb\x95\x44\xc8\x89\x46\x56\x88\x28\x90\x06\x1f\x19\x76\x40\x66\x9c\xfc\x10\x80\x11\x73\x7b\x98\xef\xc3\xdc\x5e\xa2\x3b\x17\xfe\x50\x31\xe4\x3d\x2f\x09\x53\x35\xb4\xcb\xb1\xda\xf0\x36\x67\x09\x30\x04\x15\xce\x80\xa3\xb9\xdb\xde\xd4\xe1\x49\x75\xd3\x6e\x6d\xec\xb3\x66\x15\x86\xd0\xac\x91\x88\x42\x8a\x44\xf0\x69\x01\x77\x37\x01\xc1\x09\x1e\x71\xec\x8e\x0f\x9e\x2c\x15\x42\x7a\x02\xe9\x57\x00\xf6\x8a\x9b\x67\xb3\xc6\x31\x74\x01\xb6\x9d\xdb\x1f\xf0\xc9\x9f\x11\x91\xa3\x67\x27\x89\x2d\x47\xa8\x3e\x65\xa2\xbd\x6a\xec\xd3\x71\xe0\xbb\x36\xc6\x11\x81\x63\x79\x24\x2d\xa8\x96\x78\x4e\x4c\x70\xab\x25\x34\x1d\x37\xa9\x21\x07\xd9\xcd\x97\xa0\x4d\x4d\xe0\x0d\x3b\x89\x4f\x13\x66\x1b\x18\x00\xee\x98\x8f\xee\xf1\x4a\x8f\x2d\x7f\xce\x07\xc5\x68\x49\xd7\x76\x47\x82\xd1\xa7\xbd\x78\x9a\xcd\x1a\xd9\x5b\x30\x85\x12\xe4\x18\x91\xc0\x42\xca\x7b\x9c\x08\x8d\x7c\x4b\x85\x37\xc4\x16\x6c\x5b\x6a\x0b\x8c\x69\x8b\x5a\x68\x76\xdb\xa4\xb8\xc0\x95\xa9\x94\xc5\xdb\x47\xbc\xd9\xa4\x0b\x7d\x3a\x74\x7d\x6c\x1f\x1e\xa0\x3f\x15\xd0\x6a\x38\xb6\xe6\x24\xb6\x6e\x29\x02\xd8\x04\xfc\x21\x55\x45\x05\xd7\x58\xd1\x6d\x2f\xec\xe8\x45\xb7\x49\x8a\x17\x98\x97\xc0\x1f\x12\xf4\x2d\x24\xd2\x1a\xfa\xe8\x5e\x7e\x29\x94\xc9\x20\x60\xd7\x16\x91\x2d\x42\x5a\xd9\x79\x04\x26\x60\x81\x60\x7a\xaa\x50\x01\x1a\x8f\xb1\x3c\x0f\xe7\xed\xf6\xd8\xc8\xf6\x5b\xa7\xa9\xe1\x5c\x2c\xe1\x3b\x18\xe8\x33\x9d\x7e\xcf\x14\x25\xd7\xc7\x6f\xd1\x3d\x98\x67\x3b\xd7\x73\x1b\xb8\x11\xbb\xab\xa6\xb7\x07\xa8\xa5\x37\x7a\x3e\xf5\x3c\x52\x3c\xbf\x3a\x95\x4f\xff\xdd\xc5\x26\xb7\x66\xb3\xf6\xa9\xf0\xf9\xbe\x5a\x2d\x7c\x21\x19\x93\xb9\x1a\x17\xf1\x7d\xea\x86\x73\x52\x6c\x9d\xbf\x4b\xbc\x0a\x42\xcb\x8f\xc6\x00\xbe\x1a\xcd\x68\x08\x2f\xee\x63\x1a\x45\xd6\x90\xaa\xab\x55\x3c\x72\x67\x4b\xb1\xa1\x43\x6c\x3d\x78\x25\xf8\x08\x4d\xc2\xd9\x0f\x70\x98\x33\x0a\x21\xd8\xc9\x0e\x89\x27\x86\x79\x08\x5b\x8b\x87\xd0\x61\x73\x2a\x5d\x24\x4a\x39\x44\x5e\x02\x11\x13\x1c\x43\x82\x61\xe1\xfa\x43\x46\x27\xe5\x60\x9e\xdc\x0b\x8b\xfb\x5d\xc9\xa3\xb3\xe0\x4e\x03\xc0\xe6\xfb\x13\x26\x49\xf0\x55\x60\x1a\x81\xc4\x52\x16\x69\x97\x11\x42\xd2\x92\x8e\x17\x50\x67\x6c\x85\x43\xd7\x2f\x33\xce\x61\x00\x2d\x9c\xb6\x7e\x00\x00\x93\x4c\xd4\x6c\xd6\x50\xce\xe0\x76\x96\x0f\x0e\xbb\x79\x4a\x07\x71\xda\x4f\xe5\x6d\x10\xba\x0f\x81\x1f\x5b\x1e\xe9\x59\x7d\x52\x7c\xdb\x5b\x36\x48\x78\xea\x8e\xad\x3e\x89\xe2\x60\x82\x88\x33\xf8\x05\x3a\xbe\xe2\x50\xd8\xd1\xed\x07\x64\x30\x0d\x11\x7e\xf8\x57\x59\x23\x92\xd1\xaf\x00\x8c\x85\x3e\x61\x9e\xeb\xa7\xdf\xb8\xc4\xe8\x5e\x2d\x1f\xdd\x20\x08\x67\x56\xe8\xf4\xac\x7e\x37\x0e\x26\xa9\x09\x3c\x75\x7d\x4a\x0e\x29\x75\x48\xf1\xf4\xb0\xa4\x1d\x90\x60\x0a\xb6\xad\x69\x04\x57\x19\xb0\xfc\x0e\x58\x41\xc8\xa0\x85\x30\xfd\xbe\x92\x45\xa5\x42\xc0\xeb\x53\x9a\x8b\x61\x65\xaa\x16\xe3\x9c\x11\x58\x2b\x8d\x60\xcc\xfa\x98\xea\xfb\x35\x0d\x63\xd7\x16\x53\x73\x9d\x4c\x8d\x8c\x1e\xc4\x98\xf3\xd3\xc3\x9c\xa6\xfb\xfa\xe2\x51\x7a\xa4\xe8\x3a\x41\x38\xe6\x0c\x3a\x3c\x7c\x74\x0b\xf6\x0a\x2d\x08\x7b\xb9\x40\x30\x2a\x36\x3b\xba\x90\x19\x56\x11\x17\xa3\x40\xf7\x19\x5c\x20\x27\xce\x72\x2e\x4b\x33\x1d\x9a\xb8\x8a\xd5\xd4\x43\xca\xc8\x1d\xc4\xe4\x62\x1a\x93\x62\xf7\xa2\x54\x26\xd6\xad\x45\x4e\x03\xfb\x96\x7f\x51\x25\xc5\xd3\x6e\xad\xa4\x1b\xd4\xc9\x51\x2d\x95\x74\xc3\xf5\xc9\x51\xfa\x18\x11\x7d\xa4\xb9\x7d\xe4\x20\x2b\xb5\x82\xa1\x47\x6d\x9f\x14\xbb\xed\x9c\x0e\x55\x33\x1d\xaa\x3e\xa2\x43\x83\x65\x1d\xaa\xea\x1d\x92\x67\xc3\x85\x4f\x8a\x1f\x2e\xce\x65\xe3\xe7\x41\x2c\x26\x89\x1d\x4a\x89\x0e\x2e\x17\x9c\x06\xf8\xd1\x16\x05\xde\x18\xfb\x55\xab\x2d\xde\xf4\x93\x6e\x0c\x06\xac\x1f\x8a\xdc\xfe\xc9\x1d\xd9\x58\xdc\x91\xa6\xe5\xdb\xd4\x23\xc5\x66\x23\x61\x45\x7b\x40\x60\x6b\x73\xa6\x18\x64\x28\x35\xf8\xc4\xa3\x42\xf5\xaf\x80\xc8\xff\xf1\x98\x3a\xae\x15\x53\x6f\xae\xe8\x27\xcf\x78\x4a\x57\xa6\x9e\xd2\x7b\x6a\x4f\x95\x51\xb4\x63\x84\x4a\xe1\xbb\x17\xbc\xe8\x86\x61\xa0\x38\x7c\x72\xf7\x34\x1e\x45\x9c\xa7\x21\xd4\x52\x87\x47\xda\x5f\x40\xbe\x2e\xdf\x51\x02\x10\x32\x52\xa9\xcf\x48\x7e\x19\x0b\xb0\x03\x0e\xb4\x01\xf0\x7c\x0f\x44\xe2\x9e\x44\x61\xc8\xe0\x81\xcb\x5b\x1e\x93\x39\x5c\x05\x5a\x12\x7a\x0d\x80\xe8\xc7\x6a\x3e\x20\xfa\xc2\xc7\x08\x84\xc2\x9b\x42\x6a\xc1\x4f\xfb\x51\xec\xc6\xd3\x98\x92\x62\xf7\x6a\x3f\x6f\xef\x6b\x36\xce\x73\x98\x67\x19\x37\x3f\xc6\x53\x45\xc7\xc2\x0b\x62\xb1\xd5\x6d\xe6\x1c\x10\xb5\xfe\xe2\x39\x48\x42\x75\xd8\x17\xad\x6e\x33\x53\xc2\x1c\x19\xa0\xc0\xcf\x15\x55\xd7\x2c\xee\x22\x8f\x2e\x5b\x9a\x77\x92\x1a\xea\x9c\xb8\xdb\xb6\xba\xcd\x1c\x77\x5b\xa4\xa7\x34\x29\xc2\x9a\x45\x4f\x4b\x39\xde\x51\x26\xbf\xda\xb4\x7b\x0f\x8f\xed\x16\xa4\x52\xd1\xb1\xe0\x40\x5a\x3c\xc8\x55\xf9\x5e\x0e\xf2\x56\xee\x3a\xd9\x21\xe6\x44\x3a\x02\xa9\xd9\x0d\x8d\x09\x6d\xca\x98\x01\xa2\x52\xa9\x28\x51\xfc\x0e\xbd\x27\xc5\xf6\xf9\x81\x14\x9e\x53\xf7\x96\xe9\x48\xa0\x16\x94\xf1\xf2\x79\x2b\x20\x69\x3e\x48\x75\xd0\xd8\xe7\x9d\x4d\xd6\x67\xed\xd6\xf7\xa9\x70\xb0\xfc\x5c\x63\x4d\x19\xb4\x07\xf0\xbc\x07\xf5\xa7\x78\xde\x3a\xcd\xe9\x60\x7f\x1a\x13\x27\xa0\x91\x5f\x88\x89\xe5\x38\x70\xc2\xe6\x28\x9a\x3b\x5b\x86\xee\xb5\x9e\x76\xec\x9a\x15\xd4\x83\x60\xe6\x2f\x56\x50\xa7\x1e\x06\xd6\x74\x69\xcc\x74\xd5\x6e\xce\xec\xef\xec\x18\xba\xfa\x76\xa5\xae\x0a\x2d\x52\xff\x62\x98\x1a\x43\x29\x1d\x86\x0a\x0f\x59\x42\x1e\x3a\x6d\x5d\xbf\x99\x4e\xe0\x56\x90\xaf\xbd\xec\x38\x86\xfe\x9e\xad\x70\x69\xc1\x76\x4f\xcd\x02\xd0\x45\xc3\x10\x6a\x0b\x75\x52\xec\x76\xeb\xc9\x05\x12\x73\x6c\x04\x03\x72\x54\x27\x32\x4f\x09\xf0\x55\x8f\xbd\x4b\x92\xb5\x28\x88\xc6\x0b\x4f\x59\xc3\xf0\xa8\x61\x78\xe7\x8b\x8f\x56\xad\xf3\x1b\xac\xf3\x1b\xa6\xce\x6f\xfc\xf5\x9d\x1f\x18\x3a\x7f\xb1\xb8\xf3\x07\xf4\xce\xb5\x69\x12\x5c\x86\xa6\x87\xe2\x41\xb3\xab\x1c\x32\x1c\x8e\xc5\x22\x07\xcd\x6e\xe2\xa9\x8d\x97\x0c\x24\xb0\x26\x08\x08\x21\x00\xbb\xf6\xa7\x0f\xbd\x56\xe7\x0c\x80\xeb\x1e\xab\xee\x34\x03\x3f\x72\x1d\x1a\x26\x25\x59\xbf\x0e\x5a\xcd\xce\xbb\x6e\xb7\x2c\x70\x46\x62\x11\xcd\x4c\xe9\x98\x70\x17\x8c\xbe\x97\x23\xba\xaf\xaa\x06\xf6\x5c\x2e\x3e\xd1\x72\x83\x0b\x32\x0e\x9c\x19\x80\x0f\xb3\xf3\xee\x6e\x2a\x91\x74\x88\xc2\x31\xb5\x42\x87\x3a\xa4\x11\x52\x8b\x14\xbb\x97\x0d\xc9\xfc\xf7\xae\xe7\x81\x5e\x25\xf9\x90\x33\xb8\x6d\xc3\xe0\xae\x97\x19\x55\x9c\x6c\xe3\xad\xa7\x34\xfe\xd2\xd0\xf8\xfb\x25\xab\x46\x8c\x5d\x88\x5c\xf7\xa2\xfb\xf8\x86\x4d\xbb\xe7\x87\x95\x96\x6b\xb2\x18\x95\x38\xca\x62\xb7\xd9\x2e\xa3\xbe\x7a\xd0\x6a\xb6\x93\xb3\x92\xdf\x07\x65\x42\xce\xf6\x41\x85\x90\x8b\x7e\x14\xc0\xe9\xce\x2e\xc5\x6c\x28\x68\x8e\x24\x76\x81\x14\x0f\x1a\x39\x1b\xfe\x2b\xcb\xd0\xe5\x9b\xe5\x1b\xa8\x0e\xd5\x83\x50\x45\x6f\x6a\xbb\x75\x3b\xa5\x2a\x2e\x0a\x13\x2d\x36\xbb\x6d\x2d\x26\xc7\xa3\x16\xcf\x6e\x39\x0e\xa2\x2c\x0e\x00\x5f\xe2\x10\x3d\x9a\x33\x9a\xbe\x61\x34\x9f\x7e\x6a\x4d\x99\xe3\xbb\x44\xa4\x44\x4e\x34\x97\xf8\x7a\xd1\x82\x6c\x76\xdb\xe9\xe5\x67\x88\x6a\x92\xfc\xb9\xe2\xee\xa4\xf2\x9a\xc3\x76\xbf\xf5\x8b\x6e\x73\xfd\xf2\x6c\xbd\x71\xd9\x24\x76\x30\x1e\x5b\xbe\x13\x71\x43\x98\x34\x3f\x0b\xcc\x16\xd5\xf0\xfc\x8c\x67\xc7\x82\xdd\x4a\xe4\x02\x15\x9e\xaa\x6e\xcc\x7d\x66\xad\x08\x5d\x5f\x93\x87\x00\xad\xfd\x40\x58\xa8\xd2\x13\x04\x60\x37\x0b\x36\x9d\x02\x4f\x41\x97\x33\x87\xb6\x61\x0e\x3f\x7f\x5e\xbc\x8a\x0c\x96\x71\xe0\x06\xf8\xc8\x96\x92\x54\xb9\x9c\x45\x21\xf5\xb0\x34\xb7\x9c\x04\xb2\x3a\x66\x02\xcc\xe9\x99\x49\xd9\xf8\xf2\x13\xd2\x95\xb9\xa3\x5c\x18\xef\x28\x89\x33\xc0\x02\xa6\xaa\xf5\xb4\xb8\x4f\x25\xd8\x4d\x5e\x9d\x67\x56\x3a\x0a\x41\xf5\xa8\x95\x0f\x99\x8b\x2e\x29\x8c\xaf\x6a\x33\xef\xa5\xf3\xb3\xc3\x54\x36\x11\x90\xa5\x04\xf1\xcd\x69\xbc\xa0\x2d\x49\x82\x55\xaf\xc8\xbb\x99\x15\xce\xb3\xc1\x4c\x9f\xaa\x5f\x2a\x00\x94\x57\x5c\xff\x47\xf1\xb3\xf3\xa2\xb4\x5b\xac\xfc\x5a\xfa\xcf\x75\xfe\x38\x89\x01\x1e\xf3\xa4\x7b\xd9\xea\x64\x8f\x51\xfe\x54\xff\xa2\x39\xd0\x24\x57\xb7\x0b\xb8\xba\xb1\x22\xb5\x2f\x06\x38\x81\xd4\x53\xb2\x19\x24\xe7\xa2\xdb\x34\xfa\xc4\x67\x7b\x53\x2a\x29\x98\x52\x8b\xae\x73\x17\xa9\xeb\x1c\xbc\xd1\xda\x73\x72\xc6\x1f\x10\x8a\x97\x67\x8f\x3f\xb4\x4c\x3a\xe6\x3f\xfe\x95\x7a\x48\x23\x71\x5e\x25\x97\x3c\x1f\x9e\x38\x47\x8a\x8d\xcb\xe6\xe3\x87\x68\xd2\x44\xbf\xfe\x2b\x87\x08\x91\xaa\xf7\xf5\x2a\x59\x23\x57\x3e\xf8\x29\x40\xf6\x30\x00\xe0\x41\x50\x94\x88\x92\x00\x1c\x47\xad\x98\x3a\x90\x23\x29\x72\xfb\x90\x31\x15\xdf\x88\x96\x2a\xe5\xaf\x31\xc6\x51\xb6\x74\x48\xd6\x84\xfe\xff\x92\x28\x30\x3b\xf8\xf8\xac\xb8\x37\x47\xa4\xd8\x7d\xd9\xac\xe1\xd1\xa3\x52\x38\x4a\x28\xec\x2c\xa5\xb0\xa3\x50\xd0\x7e\xce\xf7\x01\xb7\x38\xe9\xb3\x15\x45\xd3\x31\x25\xd0\x26\xb1\xbc\x99\x35\x8f\xf2\x27\x38\x3d\xaa\x53\xe8\x53\x8c\xce\xdf\x76\x80\x10\x12\x6c\x8b\xf3\xe8\x1d\xf5\x48\x2d\x3d\x86\xb3\xc5\xe5\xeb\xe9\xf2\xe7\x8b\xcb\x6f\x64\xdf\x9b\x99\xc0\xd5\xab\x2b\x0b\x17\x97\x9e\xdc\xa2\x2b\x99\xa8\x56\xf3\xf9\x58\xe4\xf1\x21\x8e\x86\xd7\x30\xf4\x2a\x1b\x3a\xb8\x7c\x8c\x56\x45\x93\x80\x9d\xeb\x87\x96\xd7\x0c\x15\xd0\xff\x28\xe8\x0f\xbd\x69\x6e\xfd\xc7\xbf\x86\x55\xdc\x98\xb7\x53\x28\x09\x2f\x65\xe1\x74\xd5\xf0\xdc\xa1\x0f\xd9\x67\x7a\xec\x4a\x57\x3c\x68\x35\x1b\xa7\xe7\x66\xa7\xd8\x81\xeb\x79\xc5\x42\x4b\x46\x70\x3e\x9e\x4d\x34\x72\x87\xa0\x4e\x5d\xc0\x4b\x77\x13\x51\xb7\xb8\x16\x53\x3c\xb8\x68\x66\x4c\x35\xc0\xb5\xff\xef\x7f\x96\x6b\xe2\x88\x96\x36\x6d\x91\x68\x51\x81\x0a\xe3\xf0\x4c\x00\x12\x4e\x79\x50\x3a\x66\xbb\x61\x8a\x18\x1e\xf9\x29\xf8\x10\x03\xbc\x59\x49\xc3\x8c\xe0\xb3\xb4\x5e\x48\xfc\x96\x16\x4f\xed\x8a\xf0\x14\x79\x2a\xc8\x65\x18\xd8\x34\x8a\x74\x08\xb4\x90\x89\x6f\xc4\x13\x73\xcb\x60\x0d\x5b\x01\x81\x40\x90\xb7\xbf\x4b\x80\x37\x74\xac\x93\x39\x60\x5b\xcd\xb3\x06\xd9\xd8\xaa\xa4\x5c\xc9\x12\x98\xbe\x62\x02\x81\xa7\x38\x9c\xa9\x0e\x5e\xa2\x8d\xa3\xbc\x36\x04\x20\x63\x6e\x0b\x1c\x0e\x72\x31\xf9\x75\x9d\xfc\x85\xcf\x74\xc5\x39\x89\x43\xcb\xe7\x89\x51\xe2\x00\x40\x7b\x10\x6c\x8d\x69\x41\x49\x9b\x2b\xac\xbc\x3c\x06\x6a\x03\x44\x7f\x48\x80\x6f\x3c\x95\xbb\x78\xaa\xd8\x5b\x43\xb1\x7a\xb6\x58\xdb\x50\x6c\xa3\xa2\xb9\x82\x62\x28\x2f\x60\xb6\x43\x16\x69\x2c\x0a\xdb\x7b\x64\x80\x70\x5e\xc0\x5c\x81\x28\x58\xda\xd5\x4a\xeb\x7c\x26\x59\x6f\x3d\xfc\x59\xc5\x67\x8f\x0f\xcd\x18\x2f\xca\xf6\xda\xff\x8f\xac\xcb\x8b\x9e\x39\x1e\x73\x54\x32\xf7\x4e\xfc\xf9\x23\x47\x3c\x32\x5d\x5e\xad\xbb\x8b\xba\xfa\x88\x8e\x2a\x9d\xcc\x06\x7f\xaf\xb6\xd1\xea\xd6\x4e\x54\x63\x98\x3c\x17\xbb\x8a\x6d\x11\x0f\xfe\x22\xb9\x8c\xf8\xb1\x9f\x79\x14\x2e\x5e\xf7\x6a\xd5\xaa\xaa\x1a\x95\x94\xd2\xe9\x37\xed\xe2\x75\xaf\x5e\xd7\x4a\xff\xaa\x94\xae\x2f\x2d\xfd\x42\x29\xbd\xb1\xb4\xf4\xda\xe2\x9e\x6c\xe8\xfd\xae\x2c\xee\x49\xaa\xf4\xfa\xe2\x9e\x88\xd2\xa0\xbe\x7b\x9e\xd1\x6d\x8b\xda\xa3\x20\x0b\xea\x67\x3a\xdc\x8a\x06\x75\xbd\x64\xf8\xec\x57\xc3\x67\x2f\x0c\x9f\xad\x19\x3e\xab\x18\x3e\x5b\xcf\x3b\x54\x31\x7e\xf4\x7f\x44\x21\xe1\xc8\x12\x86\xab\xeb\xa2\xd3\x2c\xd5\xa9\x85\xc7\x1c\xa4\x39\xb1\x26\x0b\x33\xd9\x48\xbd\x8f\xf5\x8c\x15\x7e\xbe\xb7\x47\x64\x2e\xc3\xd4\x19\xcd\x03\x43\x0b\xc5\x42\xc6\xb7\x1b\x92\xf6\x8c\xad\xc9\x6e\xd6\xd9\x5f\x56\x2b\x15\xc8\x1f\x7f\x10\xf9\xe7\x9a\x81\x4a\x6d\x39\x95\x5f\x75\x2a\x15\x03\x95\xfa\x72\x2a\x2f\x74\x2a\xeb\x06\x2a\x1b\x29\x2a\xcf\x88\x21\x88\x21\x37\x80\x35\x85\xab\x21\x6c\x05\xfa\x82\x02\x60\x5d\xe1\x71\x4d\x5e\x90\x02\xc7\xd4\x95\xb3\xf2\xd4\x4d\x70\xdf\xb2\x6f\xc5\x5b\xdb\x41\xab\xb9\x9f\x98\x5f\xaf\x7b\x9b\x75\xf4\x6a\x9e\x4e\x2a\x64\xe5\xa7\x1e\x58\x36\xdb\x4b\x2c\xdc\xd6\x1d\x25\x3c\x0a\xb5\x08\xb1\x05\x46\x8d\x36\xdf\xd5\xd0\x14\x20\xa0\xa7\x12\x85\x7c\x5b\x4a\x13\x1d\x73\x13\xf9\x0e\x7f\x39\x6e\xfd\x3f\x34\x6f\xaf\x99\x15\x3a\x0a\xf7\x0e\x55\xee\xd5\x6b\x4f\xe5\xde\xab\xc5\xdc\x53\x8d\x21\xb7\x74\x3e\xb1\x1c\x68\xfc\xe4\xb2\x91\xf1\x9b\x03\x72\x7b\xcb\x6d\xf7\xa6\x28\xe1\x13\x24\xbd\x97\x45\xe3\x38\x67\x37\x5e\x4f\x6f\x3b\xeb\xb3\x07\x6d\xff\xfe\x93\x6d\x73\x78\x13\xf5\xd4\x96\x0e\x6e\x5e\x30\xa3\x21\xba\xb8\xd9\x41\xe8\x63\x2a\xa1\x08\x6e\x6c\x8b\xcd\x41\xcf\x94\x8c\xf9\x3c\x09\x89\x1d\x0c\x7d\xf7\x01\x1d\x99\xd1\xe1\x56\xe2\x1e\x8f\x26\xa7\xac\x21\xd6\xce\xfe\x74\xd8\x0c\xc6\x13\x2b\x26\x21\xe5\x9e\xef\x6e\x84\xf6\xee\xb4\x9d\x09\x46\x7f\xb8\x78\x22\x0f\xa7\x9e\xc7\xd3\xde\x16\x3b\x6d\xf3\xad\xce\xce\x65\xa0\x82\x13\x9a\x7e\xc9\xe6\x5f\x28\x5c\x3b\xa3\xe3\x20\x9c\xc3\x1d\x6d\x7d\xea\xb3\xff\xac\x6c\x31\x83\x6e\x78\x86\xb3\x71\xbc\x78\x74\x8a\x7b\x5d\x9d\x14\x4f\xbb\xf5\x92\xee\x5d\x07\x8e\x4f\xe9\x07\x73\x2b\xca\x7a\xd8\x41\x63\xfe\x32\xf7\xba\xba\xee\x5e\xa7\xb4\xbe\xc1\x5a\xdf\x30\xb5\x9e\x7e\xf1\xce\x6d\x3d\x58\xd6\xfa\x46\x6e\xeb\xf5\x32\xe9\x80\x37\x2f\xeb\x44\x67\xd5\x5e\x74\x4c\xbd\xf8\x23\xbf\x17\x9d\x47\xf4\xa2\x6e\xec\x85\x69\x26\x8c\xbd\xf8\xb1\xac\x17\xf9\x33\x51\x53\x7a\x51\x33\xf6\xa2\xb6\x6a\x2f\xfe\x7b\x59\x2f\x52\xfe\x9f\x18\x7f\x4d\x5c\x3b\xf0\x11\x41\x9f\x6d\xcd\x33\xd7\x77\x82\x19\x89\xdd\xd8\xa3\xca\x23\x18\xec\x09\x08\x93\x07\xbd\x4a\x17\xd3\xa3\x1a\x3e\x15\x96\x98\xf6\x0c\x28\x08\x8c\x5e\x8f\x91\x33\x99\xfe\x4d\xfd\x5e\xd6\x85\xba\xbe\x16\x45\xb7\x34\x94\x8b\xf5\x90\x5a\x0e\xb1\x03\x2f\x08\xc9\xc4\xf2\x68\x1c\x1b\x49\x6d\x2e\x75\x63\x6c\x84\xc3\x88\xd8\xc1\x18\xc2\x13\x20\xd5\x11\x8f\x9b\x2a\x00\x88\x59\x6d\x37\x1c\xf6\x6b\xa4\x52\xa9\x90\x5d\xf8\xe0\x9c\x7d\x70\x5e\x50\x00\x90\xf1\x86\x1d\x4d\x3c\x57\xfa\xad\x47\x74\xec\xb2\xbe\xf9\x1c\x60\x87\x86\x56\x4c\x45\x6a\x00\x0e\x67\xe8\x86\x32\x3f\x9c\x19\xd3\xee\x53\xf5\x4b\x05\xa8\x16\x0b\xbb\xdc\x02\x07\x59\x4b\x2c\x37\x6c\x42\xe6\x65\x25\xcb\xb4\x0a\x1d\xba\x4e\xea\x12\x2d\x0f\x18\x74\x89\xfc\x11\x1a\x71\xbc\x30\x43\xa9\x52\x61\x37\x95\x5e\xb0\x11\x86\xd6\x9c\xa7\xd4\x7f\x46\x40\x8d\x2b\x8a\x1e\x9d\x63\x54\xcd\x1e\xa9\xee\xaa\x7f\xff\x96\x74\x77\x97\xbc\x78\x91\x7c\xa3\xdd\x20\x58\x9b\xa8\x78\xa4\x86\xf4\x49\x21\xf5\x2b\xa9\x0b\xd4\x34\x59\x09\xd2\x58\xc3\x63\x57\xa6\x2c\x79\x41\x34\x10\x38\xa5\x91\xdf\xf7\x34\xbe\x08\x48\xb5\x44\x81\x8d\x5d\x7f\x4a\xd3\x75\x79\x5b\x80\xaf\xaa\x3d\x0d\x16\xde\x14\xc8\x98\x5a\x7e\x04\x68\x68\x88\xcf\x8f\x99\xc0\x38\x2c\xa5\xe2\xa8\x8e\x02\xab\x24\xf5\x26\xfa\x40\x3c\xb7\x8f\x53\x10\x55\xc2\x61\xbf\x17\x7c\xa8\xd5\x8a\x6a\x5f\x3f\x25\xc3\x48\x20\xe4\xf4\x2e\x26\xf6\x09\x6d\xde\x10\xaf\x57\xe1\xc2\x0b\x52\xd8\x45\x25\x5c\xd6\x4c\xac\x65\x92\x07\x8a\x3a\x9e\xd7\xd1\xfb\x5a\xad\x17\x34\xbb\xdd\xa2\x46\x29\xbf\x63\x79\xe3\x21\x7b\x4a\x13\xbb\xa6\xa4\x4a\x38\x10\x75\xba\x96\x7a\x6d\x7c\xd9\x84\x41\xea\x14\x30\xf5\xc0\x6e\xa1\xc4\x98\x80\xf0\x4e\xda\x3e\xe5\xf6\x68\x38\xae\x93\x61\x18\xcc\x40\x9d\x70\x07\x5c\x95\x4b\x5b\xf8\x2f\x12\x0d\x77\xd1\x1e\x03\xfa\x19\x18\x8e\x9d\xe9\x78\x22\xcc\xaf\xb1\x1b\x52\x25\xe5\x0c\x40\x74\xca\x78\x2a\xbe\xfd\x41\xe3\xf3\xe2\x3f\x0b\xfd\xc0\x99\x17\x5e\x1b\xb6\x88\x1f\xc6\x2d\x16\xcc\x38\x98\x8f\x60\x10\x84\x74\x88\x98\x1b\xc0\x5e\xd3\x10\x6a\x4b\x76\xfd\x45\xfb\xa4\x08\xe0\xea\x03\x2a\x63\x1c\x5a\xb8\x9d\x41\xc2\x02\x7b\x04\x68\xfc\x3c\x4a\x13\xe2\xf1\x5c\x7f\x88\x04\x2f\xba\x4d\xed\xe5\xe4\x11\x3b\xa1\x02\xf5\x99\x49\x9c\x2a\xf7\x86\x46\x38\xd4\x76\xc1\x0f\xb5\x5a\x8e\xdc\xc2\xe6\x09\x4e\xea\xc5\x92\xa4\x2e\xea\xe4\xe0\x3d\x1d\x4a\xae\x36\x59\xc1\xa4\xf8\xae\x8a\xc1\x98\xc0\x76\xca\xc4\x00\x39\x8f\xf5\xc3\x28\x91\x4a\x5c\x3c\xa9\x19\xaa\x15\xbe\xe4\xc1\x7f\x7d\xc9\xe2\x40\x65\xc5\x80\x6d\x45\x4b\xc5\xa0\xf6\x7f\x62\xf0\x38\x31\xd8\x97\x5c\x35\x89\xc1\x3a\xbc\x5f\xd3\xd7\x1c\x74\x58\xe4\xaf\x65\x43\xae\xd5\x5f\x00\x56\xaf\xc3\x99\xc3\xbd\x92\x2a\x7f\x8d\xf0\xd4\x97\x0b\x0f\x61\xe2\x60\x48\xef\xc4\x63\xb0\xa2\x91\x35\x91\x6a\x65\x02\x7c\xef\x26\x28\x7a\x3c\xb0\x84\x47\x81\x80\x93\xde\x2f\x3c\xc7\x33\xab\xbb\x87\x71\xb7\xbf\x94\xb9\x0f\x00\x0f\xc3\xc5\x2b\x27\x22\x95\xbd\x96\x66\xea\x2a\x59\x23\xfb\xec\x62\x87\x7f\xd6\xc8\x1a\x69\xaf\xed\x53\x6b\x8c\x7f\xd7\xc1\xaf\xc0\xa1\xa1\xe7\xfa\x34\x75\x07\xb6\xe0\xe9\x1e\xb0\x12\x1d\xba\x36\xb0\xec\x38\x20\x91\x48\xe3\xc9\x67\x00\xaf\xc6\xb0\xcb\x93\x3a\xa8\x68\x27\xdc\x6a\x05\x1e\x5e\x10\x60\x03\xf9\xbe\xc0\x9c\x73\xd5\xed\x28\xb1\x54\x60\xcf\xc2\xce\x73\xe9\x16\x09\xd1\xb3\x21\x91\x98\x95\x44\xb2\x2e\xbd\xdc\xb6\x96\xec\xba\x8b\x57\x02\xf7\x10\x52\x59\x5c\xac\x94\xd6\xdd\xd4\xc2\x30\x22\xcb\x35\x41\x49\x61\x17\x65\x04\xc9\x66\x12\xb9\x55\x85\xc6\xd0\x14\x67\xd4\xe4\x49\x16\x98\x50\x3c\x76\x71\xd0\x5d\x3d\x91\x70\x8d\xbf\x4e\xa9\x5d\xac\xbd\xe6\x33\x99\x0b\x0a\xa1\x94\xe6\x59\x8c\x7a\x7a\x34\x00\x7c\x55\xd9\x6f\x35\xce\x16\xa4\xe6\xad\x1b\xda\xae\xbf\x4e\xa4\xe6\x67\x9b\xbf\x3a\x3f\x68\x75\x4e\xdb\xe7\xad\x85\x78\x15\x99\x2e\x54\x5f\xa3\x5c\xff\xf4\xe8\x4f\x2f\x9a\x27\x46\xf8\x3f\xbc\x18\xa1\x9f\x1f\xb1\x3d\x77\x82\xf6\x28\xe9\x59\x6b\x39\x6c\x95\x68\x36\x12\xea\x10\x67\x4a\x31\xed\x9a\x3d\x85\x64\xad\x36\x77\x08\xe7\x5a\x0f\x21\x0d\x12\xd2\x71\x10\x53\x62\x4d\x26\x10\xb6\x3b\xb2\x30\x60\x99\xa7\xc5\xee\x07\xf1\x88\xcc\x42\x97\xa3\x19\x40\x27\xf8\x2a\x90\x9d\x20\x36\x88\x1d\x8d\x22\xa6\xfc\x58\x9e\x37\x07\x4a\xd6\x2d\x45\x44\xfc\x79\x30\x0d\x49\x44\xa3\x28\x05\x00\x91\x10\x70\xac\xd8\x7a\x4a\xca\xca\x67\x90\x75\x29\x27\x19\x21\xae\xc5\xfa\x4f\xdc\x14\x65\x07\x77\xfb\xdb\x9b\x6b\xac\x93\xf2\x7e\x48\xf4\x11\x20\xa5\x89\xba\x7f\x0a\xcf\xd3\x08\x5d\x8f\xd0\xbd\x95\x83\x67\x7c\x48\x6a\x02\xd8\x85\xe5\x38\x21\x8d\xc0\x11\xd5\xf5\x6d\x9e\xe5\x3c\xc1\x65\x75\xfd\x98\x0e\xb9\xa7\x27\x60\x21\x7c\x00\xdc\x7a\x7c\xfc\xc5\xbc\xbf\x9e\xa7\x3d\xfa\xae\xb4\xc5\xfc\xe3\x93\x3d\x89\xaa\xb5\xfa\xc6\xe6\xd6\xf6\xcb\x2f\xbf\x82\x37\xe2\xfa\x0a\xe7\x2f\xcc\xd6\x1e\xbf\xee\x57\xac\x38\xe8\xcb\x7d\x42\x54\x66\x45\x4c\x47\xab\x1d\x4c\xe6\xdc\xc5\x2c\x68\x0a\x16\x68\xd9\x41\xa1\xa6\xae\xfb\x5e\x75\xee\xef\x62\x32\xa1\x21\xe0\x9a\x4e\x3d\x15\x2e\x22\x49\x5d\x23\xdc\xae\x71\x85\x00\xf7\xfb\x73\x12\xde\xdf\xc5\x6b\x53\xdf\x95\xb9\x7d\xdc\x38\xca\x90\x22\x17\x7d\x40\x42\xf2\xe6\x8c\xad\x32\xb5\x1b\x1c\xea\x50\x36\x08\x89\x3d\x8d\xe2\x60\x2c\x6a\x09\x5c\x03\xcf\x85\xd4\xf2\x03\x3a\x03\x47\x66\x08\xf4\x62\xa7\x5e\x24\x00\x55\xc8\xc0\xf5\x1d\x9e\x2a\x48\xf6\x9a\xda\x23\xdf\xb5\xd9\x42\x61\x3d\x0f\x29\xae\x5c\x82\x79\x84\x12\xe4\x5f\x74\x27\xe7\x2d\x92\xa0\x4f\xe7\xe0\x46\xf6\x1b\x7e\x02\x16\xa2\xdf\x77\xc5\x5f\x6c\x06\xca\x64\x1a\x4d\x81\xec\xae\x4c\x5d\xe3\xfc\x6e\x58\x15\x2f\x5f\xbe\x5c\xe5\x88\x9a\x0b\x0d\x6b\xca\xd8\x78\x16\x38\x4b\x74\xb7\x32\xa9\x95\x3e\x55\xbf\x68\x99\xe8\x45\x55\xfd\x08\xc1\xfb\x8f\x9a\x66\xfc\x10\x06\xaf\x7c\x80\x45\x76\xc1\x9a\xb4\xcb\x2f\x50\xfc\x5b\xd6\x25\xf8\xbc\x2c\x6e\x56\x62\xb3\x5e\xea\x77\xfb\xe9\x1f\xbb\x5f\x5e\xec\x16\xd9\x7f\x7e\x2d\x15\x77\x8b\x9f\x3e\x47\x9f\xbb\x5f\x7e\x2d\x95\xde\x48\x3f\x5c\x83\x27\x2e\xc1\xe6\xb8\xfb\x6d\xed\x4b\xf2\xc4\x2f\x30\x30\xf0\x9b\x8d\x2f\x69\xe0\xac\xd4\x75\x0f\xc8\x14\x5e\x8b\xde\x8b\xeb\x1f\xa7\xf2\x63\x15\x90\x24\xb3\x6f\x02\xb0\x99\xcb\xca\x92\xa3\x3e\x0f\x04\x89\x03\xee\x16\xfb\x9e\xe5\xdf\x96\xd4\x38\xc9\x62\xbb\xf9\x36\x13\x88\xd1\x6d\x7f\x2a\xfc\xfd\x31\x46\x45\x17\xe8\x77\x27\x96\xad\x59\x14\x5d\x2b\x1c\x62\x02\xb4\x92\xe9\x0d\xe5\x6a\x42\x8a\xcd\xab\x2b\x63\xf3\x8d\xc7\x34\x8f\xc7\xec\xd5\xe4\x11\x6d\x1f\x30\xce\x16\x9b\x57\x07\xc6\xd6\xf7\x1f\xdf\x3a\x04\x3c\xae\xde\xbe\x78\xbc\x2b\x36\xaf\x0e\x8d\x5d\x68\x3e\xbe\x0b\x60\xdb\x7e\x44\x1f\xd8\x4d\x48\x74\x62\xdf\xd8\x89\x83\xc7\x77\x02\x90\x49\x56\xef\x83\x12\xd9\xda\x3c\x3f\x2d\xa5\x77\x7f\xcf\xbd\xa5\xea\x94\x95\x21\x3f\xca\x44\xbb\xe7\x8c\x83\x3b\x2a\x71\xa5\x00\x55\xc8\x4f\x72\xdb\x32\x62\x00\xeb\x01\x19\x3b\xbd\xb4\x73\x07\x8c\xb2\xf5\x27\xcf\xf6\x23\xc1\x2a\xf8\xf0\x2e\x99\x0a\x04\x3a\x11\x67\xc7\xe5\x62\x76\x5c\x4d\xfe\x12\x66\x1c\xfe\xa9\x0b\xef\x69\xac\x48\xde\x60\x1a\xfd\x28\xf0\x20\xaa\xbf\xf9\x36\x1b\x30\xc6\xfa\x7b\xf4\xc8\xc7\x0f\xad\x79\x63\xb7\xc9\x5a\x3a\xc3\xa0\x98\x21\x1e\xf1\xcd\xd6\xcb\xa5\xb1\x33\x6f\x9f\xd4\x19\x41\x37\xbf\x3b\xa6\xb4\x25\xe9\x9f\x74\xe5\xda\xc2\xb1\x88\xfd\x47\x09\xc4\x2e\x36\x39\x62\x50\x7a\x54\xed\xe5\x0a\x85\xad\xbe\x6e\xa4\x47\xc0\xc4\x40\x14\xc0\xac\xb3\xb6\x67\x8d\x27\x45\xf8\xac\x4c\x6a\xe5\x2c\xb6\x2a\xa5\x7e\xd7\x7d\xa0\x95\x99\xeb\xf0\xcc\x29\xf2\xe9\xc2\xc5\x17\x0b\x97\xfc\x86\x44\x77\x89\xfb\xe2\x85\x86\x32\x11\xe7\xa3\x09\xa5\xce\xc5\x56\xc8\x54\x16\xd7\x87\x04\x1f\x9e\x35\x27\xc5\xd6\x41\x19\x91\xd4\xcd\x07\xc3\xb1\xfe\x0e\x0d\x9f\xbd\x39\x5e\xc5\x49\x8b\xab\xed\x46\x15\x46\x4b\x85\x44\xfe\xf8\x03\x0b\x2a\xa9\x49\xf5\x61\x51\xd6\xeb\x7d\xea\x05\xb3\x62\x1a\xab\x9e\x57\xac\x2d\xa8\xd8\xe8\x07\x02\xd1\x32\x5b\xb1\x6e\xae\xa8\xe0\x56\x66\xeb\x6c\xe8\xb9\x48\xb9\xff\x82\x13\xd8\x11\x89\xac\x39\xe2\xf4\xe1\x63\xcb\x2f\xc8\x6f\x70\x6d\x41\x78\x82\x5f\x44\x4e\x9a\x82\xe7\xa1\xb9\x1d\x9a\x12\xe4\x00\x6c\x84\x4f\x4d\xc4\xae\x4f\xe4\xd6\xf5\x3c\x19\xc5\xc5\xd1\xb4\xed\x5b\x88\x6f\x8e\x48\x38\x15\xc8\x95\xf9\xdd\x37\x4e\x3f\x02\x3f\xb5\x4e\xf9\xdc\x67\x91\x28\xd8\x3c\x9f\x98\xe6\xfe\xe4\x5f\x31\xf7\xbd\x00\x8f\xfa\x27\xcc\x7e\x2f\x80\x03\xfa\x71\xd3\x0f\x35\xd9\xa9\x64\xe0\x21\x57\x2d\xd9\xb7\x4c\x9b\x34\xb3\xee\xf4\xf1\xca\x24\x10\x5c\x45\x91\xe0\x00\x22\xbc\x03\x07\xe6\x0e\x9c\x3d\xa6\x03\x0e\x50\x7c\x6c\x07\x9a\x8a\x52\x7d\xc0\x95\xea\x67\x09\x3e\x19\x06\x7f\x82\xad\x3a\x92\x40\x69\xf0\x6a\x07\x29\x55\x3c\x3a\x88\xcb\x09\x78\xa4\xa5\x1d\xea\x02\x6a\xc4\x34\xb2\x25\xf1\xf9\xa6\x91\xb1\x9e\xae\x34\x32\x0e\x8b\xcd\xf4\xf4\xae\x59\x4d\xef\x3e\xa6\xf5\x3b\x8e\x7f\xbf\x9a\xa2\xce\x1b\x47\x45\xbd\x8b\xdb\x31\x69\x78\x51\x40\x0a\x6d\xdf\x8d\x5d\x2b\xa6\x64\xe4\x0e\x47\x1e\x62\xd5\x01\xdc\x79\x1c\x5a\x90\x47\xa6\x50\x21\x06\xc7\x22\xdc\x8a\x26\x56\x98\x09\xca\x63\x43\xe9\x2d\x1e\x4a\x2a\xf2\x54\xb5\xf6\xff\xc6\x96\x9c\x61\xd9\x88\xf1\xae\x7a\x35\xe8\x24\x29\x40\x38\x36\xe7\x80\x5a\xf1\x34\xa4\x12\x99\x15\xaf\xaa\x90\x0d\x24\x9d\x3a\x51\x3c\x50\x2b\x5e\xe3\x9f\xc8\xef\xe4\x32\x22\x3d\x19\x97\x17\x8e\x2d\xcf\x9b\x97\xc9\x2f\xe0\xa2\xf5\x8b\x80\xad\xe4\xf9\x81\xb1\xad\x0a\x69\x83\x95\x90\x87\xf7\x81\xa5\x90\x97\x93\x09\x26\xfb\xae\xe7\xc6\xf3\x24\xf1\xa4\xec\x26\x80\xeb\x8e\x27\x98\xb9\xd5\x22\x8e\x3b\x00\xfb\x5d\x2c\x7b\x29\x30\x3d\x60\x20\x8c\xd6\x98\x47\xea\xc5\x81\x1e\x44\x78\x19\xf1\xb4\x34\xaf\x93\xe7\x85\x83\x00\x53\x19\xd1\x98\x1b\xa8\xd6\xc1\x9d\xc6\xb3\xfa\xd4\x8b\xc8\x14\xa2\x7b\x47\xf4\xde\x72\xa8\xed\x8e\xd1\x8f\x9b\xbf\x44\xf0\x9a\xdf\xa7\x34\x9c\x3f\xa6\x6e\x7d\xc5\x56\x45\xa8\x0b\xab\xb3\xb1\x72\x7b\xb2\xd6\x6a\x91\xa3\x4c\x48\x7f\xef\x2d\x41\xac\x80\x13\x4d\xdd\x8a\x5a\x39\xf7\xfb\x0f\x8f\x59\xb9\xda\xa9\xf3\x84\x0b\xa6\xa6\x65\xee\x9b\xb5\xcc\x9b\xff\x57\xb5\xcc\x3e\x1f\x65\xbe\x9a\x99\xdc\x67\xe4\x15\x22\xb9\xd8\xbc\x55\xf0\x44\xba\xe0\x19\x16\x3d\xe5\x1e\xf4\x5f\x29\x00\x33\x7e\x37\x5a\xd8\x89\x0e\x80\x0e\xdc\x41\x27\x3a\x46\xaa\xd6\xcf\xdc\xae\x96\xe0\x2e\xe5\xe5\xee\x5b\x70\xa7\x31\x6e\x9a\x13\x11\xda\x37\x91\x37\xe8\x61\x68\x4d\x46\xae\xad\x25\x1f\x7e\x1c\x60\x10\x1b\x7c\x7f\x89\x17\x39\xf5\x1d\x01\x0f\x94\x38\x64\x91\xe2\x65\xe8\x8e\xad\x70\x4e\x0e\x92\x79\xd5\xa1\x7b\xc4\x6d\x7e\x64\x85\x0e\xbe\x87\xc0\x5b\x02\xcf\x54\x4b\x0a\xe8\x02\x00\xaf\x01\x0d\xcc\x7a\xe8\x10\xc8\xfd\x83\xb8\x12\x6c\x26\x0a\xa8\x37\xbb\x31\xa0\x6a\xf4\x29\x1e\x17\x76\x10\x86\x90\xa6\x97\x93\xb3\x08\x44\xe4\x24\x69\xa2\x02\x78\x81\xf8\x15\x8d\xd7\x9e\x47\x78\x4a\x7b\x52\xc8\xe5\x4b\x01\xce\x4b\x03\x36\x74\xc6\x35\xd8\x74\x60\x3e\x37\xbc\x7e\xff\xf1\x87\xf1\x4d\x3c\x57\xe3\x5d\x88\xeb\x92\x79\x4c\x33\x4f\x49\x97\xda\x81\xef\xfc\xfc\xa4\x14\x0c\x5c\x67\xa4\x56\x62\xbc\xc6\x75\x98\x2f\x9d\xed\xe0\xc6\xb4\x12\xe7\x7f\x5f\xc2\xfa\xe5\x0c\xfc\xbd\xba\x5b\xdf\xda\xde\xad\xa6\xc1\x71\xc0\xf4\x64\xd8\xa4\xae\x2f\xcd\xbb\x8e\xf3\xc8\xfd\x41\x50\xc4\x9d\xa0\x13\xcc\x56\x35\xc1\x28\xd8\x71\x4c\x8f\x96\x70\xba\x89\x4d\xe6\xed\xf5\x65\xde\x3e\xba\xdc\x70\x33\x30\xec\x9e\x6f\xd5\xdd\xb3\x67\xf5\x49\x13\x50\x11\x8a\xbd\xfd\x2c\xfc\x23\x2b\x3f\xfc\xab\xd6\xc3\xfa\x3a\x6f\x5a\x00\x2f\xb3\xeb\x01\x5e\x0d\x72\x6f\xbb\xfc\x30\x6a\xf0\x3d\xb7\x08\x81\x0c\xe9\x5b\x9f\xb9\xdd\x8d\x4c\xbb\xf0\x04\x29\x40\x9f\x73\x9b\x6c\x78\x1e\x6f\x35\x32\x9c\x81\x5d\x2a\x12\xfe\x75\xb3\xf0\xca\x8c\x7d\xa3\x25\xd0\x99\x86\x93\xd9\xac\x8f\x67\x8f\x6a\x25\x59\x61\x66\xcc\xee\x97\x32\x44\x98\x64\x7b\x9c\x4e\x39\x81\x48\x85\x98\x66\xcf\x38\x82\x37\x7f\xed\x10\x78\xde\xbe\x47\x8c\xe0\x8c\x3a\xae\x45\x9a\xc1\x64\x4e\x8a\x67\x28\xb4\xa9\xcf\xca\x08\x33\x30\xa1\xb6\x3b\x70\x6d\x15\xfa\x2a\xa2\x09\x7e\x93\xc0\xd7\xc4\x43\xd6\xf5\xd9\x81\x6a\xba\x60\x99\x98\xe2\x9a\xac\x26\xee\x12\x24\x78\xb8\x55\xa0\xb4\x74\xcc\xd2\xe2\xfd\xeb\xa4\x45\x59\x4a\x0b\xc5\x85\x47\xd6\x60\x42\x46\xb3\xc0\xfc\xb5\xa3\x58\x24\x30\x39\x83\x50\x34\x4e\xf5\xf8\x3c\x4a\x50\xbe\xdb\x06\xcf\x78\x78\x2a\x0f\x06\x09\xa2\x57\x19\xb0\x06\xe7\xc2\x50\x67\x09\x5a\x3c\xaa\x21\x22\x7d\x2b\x42\x54\x64\xee\x7d\x2f\x6a\xf2\x6b\x6c\xc5\xc4\xad\xf1\x8a\xd8\xba\x43\x1a\xd7\xb7\xb6\x8b\xae\x0a\x56\x95\x77\x73\x27\x2e\x79\x41\xea\xa6\x3d\xd8\x05\x6f\x74\xf2\x7c\x8f\x6c\xe9\xc8\xba\x3c\x89\x92\xe2\x3d\x91\x51\x53\x81\x68\x99\x54\x93\x04\xf5\x6a\xe7\x7a\xe1\x94\xa2\xeb\xe1\xea\x5d\xdc\x5a\xdc\xc5\xba\xb1\x8b\xe2\x3d\x3d\x34\x5c\x99\xb4\x2e\x62\xb1\x61\x4e\xb1\x0d\xbd\x58\x3f\xa7\xd8\x26\x16\x53\xf9\x52\x08\x87\xfd\x22\xf8\x72\x43\x4e\xe6\x32\xfb\x75\x98\xfc\xda\x67\xbf\x96\x0a\x92\x49\x60\x26\x8d\xe3\x30\x5a\x25\xec\x21\xb1\x9b\x9a\x19\x27\x58\x0b\x04\xd5\x60\xb5\x8c\x43\xdc\x13\x57\x99\xd1\xa8\x8b\xdc\x50\x38\x21\x8c\xab\xbf\x91\x8d\xaa\x1e\xa4\xac\xd8\x79\xe1\xa8\xe5\x51\x8d\x45\x6e\x2a\x29\x25\x00\x0f\x86\x21\xe4\x99\x7d\x31\xa1\x53\xe0\x39\xe9\xda\xfd\xc0\x4b\x62\x29\xf3\x28\xd4\x05\x85\x43\xcb\xf5\xe3\x34\x89\x01\xfb\x70\x29\x8d\x0d\x99\xe4\x37\xb6\x3c\xd7\x4e\x13\x71\xe1\xd3\xa5\x54\x64\xaa\xe0\x8c\xf7\x9f\x20\x34\x15\x5f\x2c\xa5\xb5\x25\xf9\xe2\xb9\xfe\x6d\x86\x31\xec\xc3\xa5\x34\x5e\x26\xa9\x8b\x01\xa6\x37\x33\x2c\xfc\x78\x29\x9d\x1d\x85\x0e\xa6\x00\x35\x50\xc2\x2f\x96\xd2\x7a\x25\x68\x35\xc3\x00\x52\x48\x05\xd3\xcc\x9c\x45\x71\xe8\xde\x52\xb1\x57\x2f\x9d\xff\x7a\x22\x8c\x31\x01\x91\xf9\x1b\x9c\xf0\x03\x93\x3c\x70\x91\xe2\x21\xb2\x66\x59\xd1\xbe\x34\x34\xb8\xa1\x36\xe8\x2e\x96\x98\x65\xb4\x36\x55\x5a\x52\x3c\x32\x2b\x41\x15\x9c\x65\x24\xb7\x34\x7e\x2c\x12\x9f\x65\x94\xa4\x00\x75\x63\x6a\x39\xf3\x7c\xf9\x59\x46\x48\x4a\xd0\xf5\x72\xf9\x59\x46\xeb\x95\x3a\x3c\x7b\x75\x29\xd2\xe9\x3e\x4b\xe3\x0d\xe0\x7e\xb7\x55\xd5\x42\xae\x38\x4c\xdb\x20\x08\xe9\x7a\x3a\xb0\x01\xf3\x98\xf1\xd4\x9b\x23\xcb\x1b\x30\x65\xa2\xb6\xad\xc7\x0a\x26\xa4\x44\x05\xa6\x38\xd4\xb7\x52\xc5\x20\xe5\x0b\xcf\x9a\xe7\xde\x51\x12\x81\x6e\x3b\xe7\x85\x5c\x9f\x0c\xa6\xe0\xc5\x2a\x88\x7d\x9f\x5a\x9e\x3b\x70\xa9\x43\xd8\x61\x15\x96\xc9\xb0\x4c\xfa\x25\x70\xd8\xab\xa4\x76\xeb\xdf\xc8\xc6\x8e\xea\x38\xc6\x45\x5d\x86\x95\x74\x31\x24\x1b\xdc\xfb\xc9\x1a\xd9\xa8\xca\xe0\x2c\xc3\x36\xa9\x51\x62\x5b\xae\x1b\x46\x31\xb1\x47\xd4\xbe\x45\x2b\x79\x38\xa5\xbc\xd3\x80\x71\xc1\xb1\xe6\xf9\x0f\xb8\xc9\x09\x3d\x82\xec\xa5\xd5\x8a\x64\x39\x02\xfe\x83\x2c\xf8\x1c\x53\x40\xea\x28\x47\xf9\xc3\x80\x2f\xba\x9d\xe6\xd7\xce\xd1\xfe\xee\x82\x1a\x7c\x63\x81\x36\x34\x58\x21\x97\xbc\xd8\x23\x5b\x0a\x96\x4f\x3a\xe1\x21\xee\x5f\x72\xd0\x72\x36\x95\x02\x60\xf8\xc5\x21\xa2\x5a\xa7\xf6\x04\xe2\x3d\x18\x3f\x61\x58\x9a\x3d\x31\x0b\x72\x04\xbd\xa9\xeb\x1f\x41\xfd\xdf\xc5\x58\x17\xc4\x18\xe2\x4f\x2a\xd2\x70\x09\x03\x6d\x15\xc5\x28\x5f\x14\x5e\xad\x26\x54\x72\x36\x0e\x5a\x87\x8d\xab\xd3\x5e\x9e\x74\xfd\x46\x36\x0d\x62\x9a\xac\xb9\x94\x98\x6e\x2e\x12\xd3\xcd\x7f\x37\x31\x35\x0d\x63\xb1\x98\x2a\x9b\xcd\xff\x89\xa9\x91\x81\x76\x16\x6c\x2b\xc3\x81\x15\xb8\x2f\xc5\x52\x90\x32\x9d\x0b\xbf\xef\x91\x57\x55\xf2\xb7\xbf\x81\xf0\xfd\xb6\x47\x5e\xbd\x4c\x66\x79\xc9\x7e\xfa\xaa\x4a\x5e\x90\x9d\xdd\x3c\xb2\xb5\xaa\x4a\xb7\x56\xcd\x10\xce\x5d\x01\xac\x26\x50\x16\x1c\x80\xae\xf3\xa3\x8f\xc6\x07\xa8\x90\x47\xd9\xf7\x8c\x74\x44\x61\xc9\xec\xa7\x95\xa9\x97\x0e\x41\x4b\xbf\x7c\xd3\x18\x1f\x43\xd7\x22\x6e\x98\x21\x02\xa4\x04\xdf\x4b\x1f\xf9\x66\xb8\x04\x28\x83\xdb\xcb\xd9\x05\x66\x1a\x89\x0c\xe2\xc5\x83\x6e\x27\xc7\x38\xb4\x45\xd6\xf4\xc2\x15\xd2\xa1\xd1\xd4\x8b\x49\xf1\xe2\xa4\x44\xdc\x08\x72\x58\x56\x09\x38\xcc\x6f\x93\x35\x41\x32\x6b\x8c\xbd\xec\x94\xc8\xa7\x30\x98\xed\xda\xf0\x24\xf4\x45\x12\xe2\x34\x42\xb2\x4b\x6c\xd2\x31\x8c\xc9\x7f\xf4\x63\x3d\x37\x6e\x6e\xad\xfc\xc8\x50\xf5\x0b\xab\xd9\x4b\xb7\xd5\x1b\x61\x18\xcc\x4c\xb7\xd7\xc4\xde\x5d\x62\x97\x76\x2d\x26\x3e\xbf\x7c\xf2\x52\x26\xaa\x2c\xb7\xec\xc3\x75\x3b\x98\xa9\xb1\xe2\xec\xf7\x8e\xe1\xb5\xe4\x80\x3f\xeb\xf3\x24\xe0\xa1\x0a\xd4\xde\xa7\x84\xfa\x90\xd3\x92\xdc\xb9\x16\x91\x82\xf4\x48\xd1\xf3\xff\x5c\xd1\xdb\x26\x8f\x11\x27\x78\x01\xe8\xb6\xc9\x1b\x45\x90\x48\x6d\x2b\x21\x71\x89\xb6\x4c\xc8\x9f\x3e\x8d\x92\xe2\x35\x26\xbd\xa4\x18\x32\x4d\xbd\x44\x82\xf0\x99\xc0\x0c\x16\x5f\xd7\xd8\xd7\x6c\xf4\x58\x04\x0c\xab\x75\x85\xf0\xd5\xc1\x49\x86\x68\x1d\x89\x22\xfa\x0d\x75\x18\x5d\xf9\x0d\xd0\xe3\x9f\x23\x31\x65\xdd\x9c\x88\xb5\x9f\xa5\xf8\x92\xec\x92\x1a\xd9\x25\x55\xf8\xe7\x93\xe2\x79\x10\xc6\x23\xd2\x18\xd3\xd0\xb5\x2d\x5f\x41\x3b\x86\x64\x06\x56\x14\x43\x3a\x24\x19\xcc\x14\xa1\x9d\x8e\xc4\x01\xb9\xee\x6d\xb2\x0d\x94\x4c\x27\x98\x2c\xd6\xa1\x7e\x10\xd3\x64\xe3\x81\x91\x4a\x72\xac\xc4\xe9\x49\xb5\x06\x2f\x5c\xd4\x66\x9a\x36\x66\x65\x21\x5b\x1b\x49\xcf\x4f\x03\x1b\xb2\x06\xa4\x3b\xbe\x45\x36\x88\x2f\xbf\xb5\xee\x2c\xd7\x63\xa2\x56\x66\x8b\x0c\xfd\x47\xa8\xb3\xe6\xfa\x65\xd9\x9c\x64\xd5\x16\x0c\xf3\x3c\x10\x95\xcb\x98\x9d\xd2\x28\x7c\x6f\x9e\xbc\x49\xfc\x3f\xb5\xa2\x97\x6d\x4f\xb5\xd5\xb7\xbc\x4f\x6f\x6a\xb5\x55\x77\xbd\xfa\x63\xc8\xd6\x57\x27\xbb\xfd\x98\xde\xd6\x77\x6b\xbb\xd5\xdd\x95\x77\xea\xad\x8d\x47\x10\xdf\x92\x64\xb5\xb4\x89\xfc\x99\x58\x04\xa1\xa1\xb3\x6b\x1c\x10\x87\xda\xae\x03\x68\xe9\x00\x34\x19\x07\x64\xc4\xfe\x86\x27\x93\x00\xb7\x99\x24\xa5\x3d\x77\xa4\x9a\x46\xac\xe4\x7c\x92\x9c\xe8\xd7\x10\xab\x8c\x9e\x4f\xd2\x59\x4a\x2e\x57\xc5\x17\xea\x9c\xde\xd1\x30\xd3\x84\xe2\xf2\xf4\x96\x7d\xe5\xa2\xdb\x98\xee\x1c\x07\x3a\x84\x88\x28\xe5\x9b\xbc\xe2\xef\xd4\x00\xbc\x73\x23\xe9\x67\x98\x13\xd1\x0f\xf4\x70\xc8\xa1\x7b\x47\xfd\x32\x67\x85\x4c\x62\xc8\xed\x98\x65\x7e\xa8\xb8\x11\x42\x9f\x3f\xda\x0b\xe3\xf7\xc9\x12\x37\x8c\x60\x10\x4b\xec\x4e\xee\x90\x06\xaf\x74\x3d\xb3\x4b\xcb\xf3\xc9\xe3\x21\xcd\xa2\x60\x10\x77\x0c\xb0\x66\x1d\xc4\x61\x46\x2c\x76\x7c\xaf\x82\x0c\x4c\x67\xab\x25\xb1\x4c\x77\xed\x3f\x73\x86\x9a\xda\xd7\xf2\x8a\xa9\xfa\x63\x16\x18\x1e\x81\x0e\x4f\x9f\xd6\xb3\x5f\x96\x34\x79\x1a\x58\x0e\x39\x6d\x1d\x44\xd0\xcc\xe9\x2a\xad\x10\x82\x21\xed\x7d\xaa\x85\x35\x5b\x11\xb9\x73\xc3\x78\x6a\x79\x48\x2f\xb8\xa3\xa1\x67\xcd\x01\x7c\xe2\x57\x0d\xa7\x95\x49\xb7\xe5\xcf\x21\x49\xb3\x15\x66\x53\xdd\xb1\x7e\x7f\x5f\x81\x53\x1c\x2d\x21\x9e\x7b\x94\x33\xe9\x8a\x29\x20\xd7\xbd\x2d\x0e\x66\x9b\x26\x4a\xbe\xaf\x04\x02\xb0\xd8\xdd\x5b\x98\xff\x15\x97\xef\x1c\xbf\xed\xa7\x84\x98\xe7\xd2\x00\x1b\x78\x31\x79\x2e\x5e\xd5\x05\xfc\x2f\xe8\x84\xd1\x25\x21\x1d\x53\xf0\x67\x05\xfb\x3f\x95\x1d\x9b\xff\xa3\x1d\x59\xc4\x92\x9c\xf3\xf6\x49\xf0\x0b\x4f\xe5\x46\xce\xe1\xfc\xe7\xf7\x21\xc3\x08\x13\x24\x86\x08\x90\x55\x57\x30\x06\xc8\x5a\xe1\xd0\xe4\x81\x02\x16\x68\x25\xa1\x7b\x18\xc4\x1c\x73\x3b\x79\xa1\xc6\x1d\xe0\x31\x29\xde\x60\x7f\x5c\x61\xa3\x41\x67\x70\x76\x00\x77\xe8\x10\x6e\x2c\x70\x4a\xed\x9b\x1d\x1c\xc2\xa7\x02\x8d\x88\xc0\x6e\x8c\x8e\xe9\x05\x13\x01\xb6\x56\xfd\x42\xde\xa4\xb0\xda\xaa\x5f\xca\xa4\x56\x2d\x91\xb5\x1a\x79\x2d\x1f\x8d\x93\xca\xfb\x68\x91\xe7\xf5\x6b\xd9\xfa\x35\x51\x9f\xa8\x04\x32\x33\x7b\xdd\xc3\xb1\xe3\xb8\x8b\xb2\x67\x65\xad\x9d\x45\xe1\x82\x32\x44\xae\x8a\x6f\xab\x06\xb0\xdd\x8c\xff\x05\x80\x92\x3d\xd2\x56\xf2\x26\x5c\x92\x25\x1a\x41\x9a\x14\xe7\x08\xd7\x27\x1d\x6a\xc7\x96\x3f\x9c\x7a\x56\xc8\x73\x04\x1e\xb4\x9a\xcd\x46\xa7\x51\x7a\x54\xdb\xff\xb9\xa4\x6d\x40\x2d\xe6\xb2\x5e\x64\x1a\x47\xa5\xfb\xb1\x5b\x32\x10\x8a\x9e\x8a\x5b\x0c\x2d\xfc\x39\x7c\x8c\x16\x8f\x05\x21\x28\xc9\xd8\xf2\xdd\x89\xf4\x0c\x87\x47\x1d\x27\x66\x75\xca\x22\x44\x95\xfd\x97\xde\xc7\xd4\x8f\xdc\xc0\x8f\x1e\xb9\x2a\xe3\x65\x6e\x46\xf8\xe8\xb6\xc2\x6c\x76\xd8\x6c\x3e\xae\xf1\xff\x5c\xd2\x7a\x77\xf5\x58\x8f\x47\x1a\x5d\x56\x68\x98\x6d\xa0\xae\x3f\x5c\xeb\x33\x16\xdf\xb1\x4b\x29\xdf\xf9\xde\xef\x5f\xab\xaa\xcf\xea\xad\x92\xa5\xcc\xc6\x65\x9a\x11\x60\x13\xb1\xe9\x4f\xc0\x62\xb3\xe1\x8d\xad\x70\xe8\xfa\xd9\xd1\x9d\x3d\x79\x74\xd3\x25\xfb\x42\x30\x99\xe7\xec\x03\x9d\x46\x99\x1b\x57\x10\x8d\xfb\xb1\x62\x74\xb7\x2c\x47\x29\xd8\xf0\x0e\x5d\x8f\x1d\x69\xbc\x0b\x5c\x93\x6d\x1d\x76\x1e\xd9\xda\xe7\xc2\x6c\xd9\x34\xe2\x8d\x47\x26\xfa\xbc\x4c\x6c\x49\xb0\x50\x5a\xef\x7a\x97\x8d\xce\x13\x2f\x40\xf7\xcb\x24\x17\x4e\x70\xb9\x5e\xc5\x76\xdc\x62\x1b\x04\xbf\xf5\x35\x9a\xad\x47\x8e\xf9\xd7\x25\xad\x1e\xba\x00\x93\x6d\x98\xdb\xc3\x4e\xa3\x54\xd6\x81\xea\x1f\x37\xb7\x4b\x5a\xbe\x8b\xbf\xc6\xae\x47\x01\x94\xa7\x68\x25\x46\x87\xf3\xc6\xc5\xc8\xb2\x6f\xa1\xcd\x2b\xff\x9c\xc6\x6f\x2d\xfb\x96\x9d\x04\xa4\x18\x51\x4a\x46\x71\x3c\x89\x5e\xaf\xaf\xfb\x34\x66\xc5\x66\xee\xad\x5b\xb1\x83\xf1\x3a\xfb\x65\xfd\x5a\xa1\x39\x10\x7b\x8f\xeb\x0f\x02\x09\x87\xac\x5f\xc6\x06\x56\x88\x7b\x31\x5c\xb2\x48\x11\x42\x14\x89\x45\x86\xde\x7c\x32\x82\x1e\xa0\xc3\x3b\xfc\x6d\x5c\xcc\x0f\x4f\x0f\xac\x13\x71\x75\x89\xc7\xd6\xe2\xbb\x55\xc6\xb3\x0a\x6a\x83\xd7\x85\xda\xeb\x22\xcf\x07\x89\x82\x8b\xc9\x92\xf1\x1b\x44\x89\x2b\x55\x96\x7b\xe5\xd5\xd3\xf9\xf6\x8d\x2f\x3d\x19\xb0\x5e\xc6\xfb\x03\x04\x59\x4a\x0f\x00\xb1\x67\x16\x84\xf3\xae\xaf\x43\x46\x62\x3e\x0a\x93\x1f\xf6\x92\x16\x85\x82\xa6\x07\x41\xe3\x06\x22\xac\xb1\x68\xba\xc5\x1c\xd7\xad\x66\xeb\xb4\xf3\xb4\x95\xfc\x99\x4f\xfb\x92\x48\x35\xe3\xb2\x6a\x89\x65\x55\x7d\xe2\xb2\x5a\xd2\x34\xdf\x46\xc4\x88\x5b\x77\x10\x81\x0b\xbb\xc7\x69\xeb\xa9\xc3\xfd\xe7\x6a\xfb\xa6\x68\x34\x79\xb6\x00\x83\xd1\xe9\xe5\x53\xdb\xfd\x63\x71\xbb\x3c\x3c\x1b\xed\xce\x38\xc8\x76\xf3\xa7\x36\xad\xcf\x1c\x81\x7d\xc1\xa3\x0e\xc4\x43\x5f\x92\x48\x6b\xf6\xe0\x67\x9b\xfd\x6f\x73\xb3\x6c\x75\x5f\x5c\x75\x9a\x2d\x72\xd8\x3e\x6d\xbd\xc6\x02\xeb\xdf\xa2\x75\xf8\xe5\xeb\x5d\xfc\x55\xde\xf8\xbe\x8e\xad\x49\xe5\x5b\xc4\xaa\xb0\x03\x3b\x44\x2c\x78\xbb\x44\xea\xd5\x5a\x1d\x9e\x48\x9a\xa3\x30\x18\xbb\xd3\x31\xb9\xe8\x92\xc6\x34\x1e\x05\x61\x54\x81\xf4\x41\x50\x36\x02\xf3\x62\x78\xc7\xe6\x62\x7d\x9d\x5c\x45\x14\x95\x35\x37\x22\x3c\x1d\x83\xcd\x4d\xab\xc3\xe0\x8e\x86\x3e\xee\xd6\x16\xd9\xef\x1e\xac\xa1\x7d\xc9\x73\x6d\xea\x47\x14\x21\xc4\x6c\xcb\x27\x7d\xca\x28\x0d\xc0\x3d\x81\xe3\x70\x9e\xb6\x9b\xad\xf3\x6e\x8b\x0c\x5c\x8f\x56\x9e\x3d\x2b\x4c\x23\x84\x6a\xb5\xe3\xc2\xee\xb3\x67\x9e\xdb\xaf\x84\xb1\x43\x27\xc5\x02\x44\x39\x02\xcc\x78\xc6\x7b\x7b\x6c\x4d\x48\xd0\xff\x46\x6d\x99\x70\xe2\xcc\x9a\x4c\xd8\xaa\x06\x25\x9b\xa3\xed\x39\x3c\xb8\x17\xf0\x15\x24\x97\xca\x78\xce\x38\x74\x42\x7d\x88\xa6\x13\x3e\xda\xf0\xcc\x03\x56\xea\x9e\x9e\x1e\x46\xb4\x71\xd4\x61\x0d\x63\x6e\x25\x5f\x13\x63\x89\xe2\x29\x8a\xfe\x1d\xb6\x5f\xf2\x4f\xc4\xdc\xfb\x41\x1c\x1a\xd9\xa1\x3b\xc1\xb0\x23\x32\x9a\x8e\x2d\x1f\x9e\x9c\x60\x6f\x52\xbf\x14\x0c\x67\x53\xa9\x12\xba\x80\xd1\xfe\x20\x43\x8f\x8d\x9d\xcd\xe5\xd1\x29\x2b\x94\x0c\xda\xf5\x27\x53\x08\xd1\x0a\xa6\x31\xfb\x2d\x41\xc1\x4a\xcb\x9b\x92\x7f\x48\x3d\xb9\x94\x6e\x94\xb1\x1d\x0e\x34\xc8\xb8\x4f\xd8\xc6\x32\x0a\xc2\x58\xeb\x2d\x9a\xf0\xdd\x48\xe7\x57\x99\xa3\xc6\xc1\xd7\x0e\xed\x4f\x87\x43\x0e\x4c\xcf\xfa\x21\x52\xff\x2a\x64\xf6\x54\xa2\x1c\xa7\x96\xb7\xc9\x46\x2a\xbd\xcb\xe3\x80\xd8\x10\xac\x13\x88\xfc\x21\xc8\x29\x26\x92\xae\x1f\xc5\x96\xe7\x51\x90\x33\x48\x33\xa1\xb6\x06\x79\x24\xa4\x67\xfb\xfa\xba\x78\x06\xb8\xa5\x74\x42\x2c\x9f\x4c\x7d\xfe\x4a\xec\x10\x09\xca\x28\x42\xd0\x71\x2a\x24\x6a\xb6\xe5\x79\xc1\x8c\x29\x2b\x10\x0e\x67\xf9\x14\x32\x9c\x44\x54\x60\xab\xf3\x04\xd7\x98\x4a\xd6\x83\xc7\x41\xf0\x62\x84\x7e\x00\x5b\xf7\xad\x88\x7e\x25\x7b\xc8\x63\xd1\xa1\xf3\x60\x46\xa2\xb9\x6f\x43\x6d\x78\x92\x90\xb5\x99\x82\xe2\x53\xea\xa0\xb3\x27\xde\x13\xe6\xbe\xfd\x35\x75\x33\x68\x8b\x4a\x23\xea\x4d\x68\x08\xdc\x0f\x29\x2b\xc9\x64\x44\x27\x59\x51\x93\x9c\xcb\x5c\x2c\x5c\x9e\x22\x1e\xc7\x90\x16\x66\x94\xc1\x37\x3f\x48\x30\x89\xbf\xa2\x20\x36\x1c\x07\xf6\x79\xcb\x4b\x2a\x33\x11\x44\xab\x36\x2c\xad\x60\xa2\xc0\x33\x81\x4b\x10\x3b\x19\x79\xe9\x05\xa2\x59\x99\x84\x41\x1c\xc4\xf3\x09\xc5\xd1\xaa\xa2\x2a\x3b\x20\xa1\x30\xdb\x03\x0e\x48\x88\x8b\x13\x16\x2a\xcf\x8f\x89\x93\x83\x79\xb1\x19\x37\xd9\x34\x09\x54\xe3\xe7\xe9\x59\xf9\xdb\xdf\xc8\xf3\x14\xf5\xac\x08\x11\xc0\xb6\x83\x63\x20\xa9\xff\xd5\xf4\x79\x48\xbf\x1a\x9d\xf2\xc1\x63\x14\x3b\x15\x6b\x6b\xb9\x42\x78\xca\xcf\x90\xe2\xc3\x13\xb1\x24\x80\x23\x96\xe0\xa3\xb2\x43\x0a\xa2\x81\xc4\x7c\x3a\xe3\x1b\x22\x3c\xcd\x05\x9e\xc3\xd1\xdb\xc3\x21\x75\x40\x82\x09\x4a\xef\xcc\x9a\xa3\xb2\xeb\x03\x14\x8d\xaf\x09\xaf\xe0\x4a\xc2\x80\x64\xf8\x38\x46\xb2\x47\x50\x0a\x2a\x56\x14\xb9\x43\xbf\xf8\xcf\x1f\xe5\xb4\x64\x97\x13\xf9\x00\x9b\x17\x53\xf8\x0c\x74\x52\xb5\x24\x46\xe7\xd0\x63\x9b\x49\x94\xb4\x74\x4b\xe7\xdc\x39\x09\xeb\x96\x2a\x63\x6b\x52\x2c\xde\xd2\x79\x89\xec\xfd\xce\xd5\xd4\xc2\xe7\xcf\xf7\x05\xf2\x82\x87\xc6\x3f\x4c\x2c\x87\x15\x80\x5c\x6b\xcd\xc0\xa1\x8d\xb8\x58\x2d\x55\xe2\x80\xbf\x81\xd6\xb6\x4b\x0a\x7c\x17\x4c\x13\x9b\x5c\x3a\x23\x1d\x3a\x6c\xdd\x4f\x8a\x05\x78\x96\xe6\x5d\xe1\x50\xd6\x08\xce\xff\xa5\x50\x26\x85\x21\xcf\x7e\x91\x08\x46\x31\x8a\x43\xd6\x1d\x76\x94\x55\x42\x3a\xf1\x2c\x9b\x16\x13\xea\x65\xcc\xbe\xb9\xf7\xbb\xca\x84\x4f\xf6\xe8\x8b\x09\x22\x83\x2d\x2c\xb1\x97\xc8\x7d\x44\x2e\xaf\xa2\xe3\x46\xb6\x85\xf0\xb2\xe1\xd4\x8f\xdd\x31\x25\xd3\x89\x63\xc5\x34\xb1\x1f\x09\xcf\x12\xc4\xc3\xb0\xfc\x39\xec\x9b\xb8\x63\xd1\xf8\xe2\x8e\x86\xa1\xeb\xd0\x28\x01\xae\x45\x92\x59\x25\xcc\xbc\x1e\x51\x62\x32\x16\x0c\x91\xae\x96\x8c\xac\x3b\xea\x17\x62\xd2\xa7\xd4\x5f\x2c\xc5\xb0\x66\x0b\xf0\x56\x3b\xe2\x78\xb9\x40\x5c\x48\xa2\x2a\x32\xcf\xf7\x32\x42\xa3\xc8\xa7\x69\x47\x3c\x63\xe2\x2f\x1a\x16\xb1\x59\xb0\x41\x27\x27\x2c\x8f\x07\xe4\xc7\x27\x63\x3d\xdb\x6a\x31\xaf\xfe\x14\x33\x66\xe1\x1a\xa5\xf7\x6e\x04\x17\x07\x39\x13\x56\x44\x5c\x70\xe6\xe2\xcb\x6c\xe6\xc6\x23\xf1\x8a\x27\x4b\x8b\xdd\x8e\x14\x67\x80\xab\x6a\x45\x7c\xe9\x62\xf9\x52\x85\x90\xee\xb4\x8f\x78\xf3\x71\x32\x4d\xac\x8b\x10\xca\xee\x02\x3e\x6e\x18\xcc\x88\xc5\xd6\xee\x24\xa4\x00\xf8\x0a\x5b\x2c\x9b\x44\x36\xa1\xac\xa1\xc8\xbc\x5b\xab\x1a\x43\x32\x03\x62\x8f\x06\x02\x99\x81\xad\xb8\x29\xab\x82\xa4\xc8\x82\xb2\x73\x2a\x13\x23\xb6\x03\x4d\xd8\x21\x8a\xca\x22\x76\x30\x99\xab\x8a\x8f\x38\x18\x60\x34\x3c\xd6\xea\x9f\xc6\xee\xfc\x20\x0d\x58\xb5\x66\xdd\x06\x54\x82\x2c\xba\x72\xce\x78\x6c\x2f\xc0\xa0\x09\x5d\xa8\x93\xe4\x8d\xb9\x0d\x15\xd3\x0a\x4d\x66\x4b\x94\xe8\xc2\x2b\xc9\x33\x93\x4c\x95\xbb\xda\xe6\xc7\x28\x71\x9e\x80\xf6\xf0\x43\x0b\xe2\xf6\x40\x65\xb7\x55\x45\x79\xd1\x74\x46\x39\x66\x48\x56\xed\xab\x16\x31\xae\xe5\xac\xe4\x2e\xa3\xec\xf7\x7f\xb1\x3e\xc5\x3a\x2a\xd4\xa9\xa4\xe7\xa9\x04\x59\xc1\x2d\x99\x4e\x88\x25\xd7\x0e\x34\x30\x74\xa3\x98\x86\xfc\x70\x4c\x2d\x9d\x2e\xd7\xda\x21\x93\x15\x5b\x39\xf0\x0b\x37\x5c\xf3\xe5\xe3\x05\xc1\xed\x94\xeb\xe8\x4b\x64\xb4\x87\xb5\xc0\x99\xcb\x8d\x0b\x11\xee\x8b\x49\x17\x16\x4d\x90\x22\xa0\x98\x29\x54\x9d\x31\xd6\xad\xc4\xca\x94\x8c\xbf\x32\xb2\xa2\x8b\x99\x7f\x19\x06\x13\x1a\xc6\x73\x2c\xa7\x9a\x9a\x14\x5e\x7d\x62\x5f\x7e\xd1\xce\x69\x5e\x46\x66\x1f\x4d\xad\x5a\xec\x36\xb1\x60\x41\x28\xdc\x6b\xf8\xf3\x7c\x16\x03\x78\x12\x2c\x70\xe0\xa5\xf1\xe0\x79\xcc\x14\x68\x97\xa3\x1c\xbe\x8b\x7d\x8f\xcf\x98\xe8\xd0\x8a\xec\xb6\x1c\xc7\xc0\xee\x32\x91\xbb\x9b\xce\x73\xb2\xb7\xb7\x97\x92\x49\xe5\x74\x12\x0b\x2a\x47\x79\x4a\xaa\xec\x6a\x4b\x10\x27\x47\xe4\x3f\xcd\x28\x0a\xa0\x3e\xc2\xa2\xb7\x7c\x07\x60\x0c\xdc\x38\xe2\xdc\x4e\xeb\x0f\x52\xed\x5f\x61\xe8\x39\xe7\x7b\x6a\xc0\x6c\xff\x5a\xbe\x41\x18\x98\xb0\xca\xae\xb2\xea\x29\x0e\xc3\xcf\x3b\xfa\x80\x13\x0d\xc0\xb6\x0a\x06\x39\x87\x04\x6a\xcd\x0b\x37\xc9\x15\x0e\x3d\xd6\xd2\x5f\x2a\x15\x6a\x20\x2f\x2c\x05\x17\xf6\xff\x48\x75\xe5\x54\x72\x0c\xf3\xac\xc2\xb0\xf0\x77\xa5\xb5\x77\x41\x5e\x61\xb3\xcc\xe1\xa1\x98\x44\xe5\xa6\x4b\xe9\xc7\x14\xfb\x02\x3f\x17\x59\x73\x93\x3d\x85\xd7\xc5\x45\xc5\x57\x52\xfe\x81\x5a\x00\xd7\x41\xa6\x82\xcb\x35\x27\x28\x9b\x7c\x16\x13\x98\x38\x3e\xd5\x49\x56\x95\xd5\x8f\x42\x55\xfe\xc8\x1e\xf9\xa7\xd2\x02\x22\x16\x1d\xa5\x51\x97\xe4\x3e\x34\x8a\xe3\xc9\xeb\xf5\xf5\xbb\xb8\x56\xad\x56\x7c\x1a\xaf\x3b\x81\x1d\xad\xdf\xc5\xf5\x7a\x75\x2d\x1c\xaf\x83\x8c\xd6\xd7\x36\x2b\xa3\x78\xec\xad\xd8\x03\x91\xf6\x30\x9f\x47\xc0\xd6\x02\x87\x82\x2a\x94\xe5\x4c\x16\x3e\xdf\x6f\x57\x0b\xaf\x0b\x9f\xa7\xf5\x2d\x7b\xbb\x50\x86\x93\xf6\xbf\xc8\xda\xef\xc4\x71\xad\x71\xe0\x3b\x4a\xb9\x1a\x2f\xf7\xaa\xce\xcb\x59\xac\xdc\x30\xa4\xf3\xb5\x7e\x70\xaf\x14\xac\x63\xc1\xcd\xea\x2b\x5e\xb0\xcf\x0a\x8e\xd6\x63\xa5\xcc\x86\x28\x63\xf3\x32\x36\x2b\x33\x58\x1f\x28\x65\x36\x45\x19\x87\x97\x71\x58\x19\x7b\x3d\x54\xca\x6c\x89\x32\x16\x2f\x43\x59\x19\x4f\xa3\xb3\x0d\x65\xaa\xd5\x7e\x95\x97\x19\xc0\x00\xe9\x30\xa4\x54\x29\xf6\x52\x14\xab\xf1\x62\x43\x56\xec\xc5\xfa\x9a\x52\x66\x87\x37\x57\xdf\xe4\x65\x46\xac\x8c\xbf\xee\x29\x65\x5e\x89\x2e\xf5\x79\x19\x97\x95\xb9\xd3\x86\x6f\x71\x5e\xd6\x76\x78\x99\x6f\xac\x0c\x46\x7d\xae\x81\x7d\x55\x29\xdc\x17\x85\x45\xff\x6f\x59\xe1\x38\x98\x64\x4a\xda\xbc\xa4\xe4\xaa\x27\x4a\x7a\x74\xa0\x16\x74\x04\x49\x31\x8e\xb1\xd2\x7e\xaa\x2c\xe5\x65\x37\x04\x51\x1f\x58\xec\xfa\x74\x0d\xe2\x64\x95\xa2\x03\x2c\xba\xd1\x17\xb3\x11\xb0\xa2\x91\x6d\xf9\xb5\xa4\xd4\xcb\xaa\x28\x25\x18\x34\x11\xa5\x36\x94\x52\x42\xdc\xaa\x62\xd4\xdf\x45\xa9\x2d\xa5\x54\x5d\xd0\x12\x9d\x0b\x45\xa9\x97\x4a\xa9\x0d\x51\x4a\x48\x52\x24\x4a\xbd\x52\x4a\x6d\x0a\xa6\x08\x5a\x31\x0c\x94\x0e\xe2\xb5\x58\x95\x94\x97\x5c\xe8\xb6\xa4\x14\x4c\x59\x41\x98\x8c\x54\xc9\x6d\xc1\x3b\x51\xf2\x4e\xe1\xb3\x5e\xf4\xa5\x20\x2a\x5a\x9f\x89\xb9\xd3\xcb\xed\x08\xbe\x88\x65\x78\x0f\xe2\xc5\x41\xa0\xd6\x30\xa7\x94\x2c\xcd\x85\xb1\xbe\x2d\x3a\x30\xc7\x31\x45\xd1\x1a\xfd\x3e\xb5\x14\xb9\x7d\x69\x89\xa2\x5b\xbc\xe8\x03\x5f\xdf\x56\x4c\xc3\x4c\x69\x14\xca\xea\x86\x2d\xa6\xe7\x9f\xac\xf4\xc4\x55\x8a\xd8\x82\xa0\x28\xf2\x07\x2c\x96\x20\xce\x10\x73\xf8\xd2\xb3\x36\x78\xc9\x1f\xc0\xa6\xd0\x8d\xdd\x68\xb4\x36\x09\xa6\xea\x46\xf4\x92\x8a\x85\xfa\x92\x97\xfe\x6f\x58\xcf\x01\x0a\xed\x0f\xe5\x11\x60\x1f\x29\x3c\x79\x17\xde\x7a\xdc\x2e\xdc\x58\x69\x17\xe6\xc3\xd2\x77\xe1\xfa\x46\xe1\x35\xd1\x79\xf0\x1f\x66\x1e\xa8\xe3\xbb\xea\x92\x46\xb7\xd9\x6e\xe3\x8d\xc1\x0f\x84\xc6\xb3\xea\xd1\x25\xb2\x3b\x2c\xeb\xf2\x34\x2a\x94\x31\x5e\x53\x79\xda\x9a\xc6\xf6\xd3\x39\xbb\xfd\x38\xce\x6e\xae\xd4\x4d\x87\x75\xe9\x29\x7c\x4d\xca\x6f\x56\x45\xf9\x3e\xe5\xe5\xff\xce\xca\x6f\xac\x6f\x2a\xa5\xb6\xfa\xbc\x54\x6d\x43\xac\xc2\x4f\xac\x54\xc1\xfd\x56\x20\x9e\x3b\x04\xef\x25\x52\xc4\x28\x80\x61\x00\xc6\xb3\x78\x44\x18\xd9\xc1\xe0\x4d\x49\x21\x64\xcb\xe6\xc4\xd6\xf4\x99\x11\xaa\xad\xd7\x95\x42\x8e\x28\xf4\x52\xec\x0d\x5f\xd4\x35\x4f\xfa\x56\xf8\x4c\x5f\x9a\x7c\xc8\x3b\xea\xda\x8c\x67\x01\x5b\x24\x91\xbe\x42\xb1\xe4\xf6\xb6\xba\x44\x07\xfa\xd2\xe4\x1d\xb4\xd5\xb5\x59\x5b\xdf\xd4\x57\x24\x2f\xb4\xa9\x2e\x49\xcb\x9e\x72\xac\x02\x55\x68\x0f\x5d\xdf\xff\x99\x45\xf9\xf2\x71\xa2\xd3\x4c\x81\x6e\xe5\x97\xdc\x5a\x49\xc8\x06\xd8\x7d\x5d\xcc\xa4\x40\x54\xed\x4d\x4d\x20\x1a\x05\x32\x1d\x7b\xd6\x34\x36\xcd\xb9\xb3\xad\xce\x79\xe1\xc2\x50\x56\xb2\xdf\xde\x52\xa7\x9e\xd1\x0d\x31\x09\xa5\x28\x29\xe7\xc0\xb1\xd5\x39\x28\x4c\x25\x55\x5d\xe7\xc3\xc2\xf4\x95\xaa\xf4\x15\x68\x81\x4f\x9a\x49\x9c\xe8\xa6\x2a\x4e\x05\x2b\xdb\xdd\x44\xa0\x06\x9a\x40\x15\x02\x43\x59\x39\x34\xba\xa5\x4a\x16\xa3\xab\x0f\x2d\x11\xaf\x41\xde\xd0\x32\x32\x16\x52\xff\x27\x76\xa7\x9d\xc7\x89\x58\x67\x35\xc1\x81\x3e\xfd\x59\xdb\x13\xad\xaa\xdb\x13\x63\xda\x30\xb4\xee\xa8\x69\x93\x4a\x14\xdf\x4f\xa8\xa7\x68\x72\x23\xa7\x8c\xbe\xd4\xa4\xd1\x2e\x10\x9b\x3a\xae\xe7\x59\x26\x71\xb4\x5e\xaa\xe2\x18\x71\xd7\xf1\x68\x3e\xee\x07\x1e\x29\x3a\xc1\xb4\xef\x51\x12\x95\xcc\x72\xf4\x4a\x93\x23\x29\x73\x26\x31\x7a\xa5\x89\xd1\x54\x8c\xd2\x24\x45\x3b\x9a\x14\xd1\x6c\x51\x9a\xd9\x17\x41\x8c\x16\x8b\x50\xd3\xf2\x2d\xc7\xb5\xfc\x27\xcb\xd2\xab\xc7\xc9\xd2\xbb\x47\xc8\x12\xb1\x79\xe7\x74\xa1\x7a\x9a\x90\x50\xfd\x24\xb3\x0a\xc4\x76\x43\x7b\x3a\x1e\x78\xf4\xfe\xa7\xc5\x85\x5a\xda\xee\x45\x73\x88\xcb\x19\xa2\xe2\xf0\xfd\x07\x1e\xab\x5a\x79\xd3\x3e\x36\xd8\xd4\xf6\xb1\x20\xa7\xc2\xbf\x91\x10\x0e\xfa\xe9\xbd\x2c\xc5\x12\x55\x18\x8f\x68\x38\xfe\x09\x19\xac\x55\x1f\x27\x84\x27\xab\x99\x13\xa0\x53\x79\xb2\x27\x77\x88\xbf\xaf\xba\x43\xfc\xf5\x87\xa8\xa3\xe9\x4f\x85\x2b\xc3\xd1\xf8\xd7\x1f\x77\x03\x4d\x91\x4a\x1d\x62\x29\x21\x71\x06\xaa\x90\xd0\xe8\x81\xc6\xd9\x9d\x0a\xd0\xe5\x7e\x46\x3a\x6a\x8f\x93\x8e\x8f\x2b\x49\x87\x8b\xbd\xfa\xb3\xce\xbb\x9f\x11\xa7\xbf\xe0\xfc\x93\xdb\xc7\x97\x3c\xbd\x49\xd9\x9b\x74\x1d\x6b\x9a\xdd\x85\x15\xa1\xab\xa6\x85\x2e\xbd\x81\x24\x32\x57\x4f\xcb\xdc\x9f\xb1\x2d\x51\x5d\xc5\x72\xd5\xa2\xaa\xd0\x9d\x07\xe1\x8c\x0e\x5d\xcb\x5f\x3f\xb0\x7e\x4a\x9d\xaf\xd5\x1f\x27\x7d\xad\x95\xf5\xf9\xed\x95\xe4\xd4\x97\x03\x71\xac\xac\x62\x9f\x08\xa0\xdc\x93\xfe\x9e\xda\x93\x8c\x1b\xd8\xb6\xbe\x81\xb5\x92\x6b\xa1\x71\x0f\xdb\x49\xef\x61\x51\x1c\x06\xb7\xf4\x4f\xba\x08\xfc\x23\x77\xb7\x53\x2e\x02\xfa\x01\x6a\x2d\xde\x1a\xb7\x75\x29\xa5\xa6\xe1\x29\x92\xba\x93\x96\xd4\xf4\xf0\xfe\xd2\xcb\x40\x77\xf2\x93\x12\xba\xf1\x38\x09\xbd\x59\x49\xee\xa2\x89\x41\xdc\xfe\x35\xfb\xa3\x55\xd3\xa4\xf5\x79\x81\x00\x06\x63\x4c\x1d\xa3\xb0\xd6\x34\x61\x3d\x2f\x90\xd8\xf5\x1c\xa3\xac\xf6\x07\x9a\xac\xbe\x51\x08\x9b\xc4\xaa\xaf\x6d\x7e\xa9\x79\x4f\xa4\xa9\xa6\x49\x93\x9f\x69\x5f\x11\xa6\x97\x9a\x30\xa5\xb6\x74\x4d\x46\x66\xd4\xf9\x29\x19\x79\xe4\x83\xcd\xcb\x95\x77\xb1\xb7\xab\x49\x13\xf6\x3f\x77\xf3\x7a\xa5\x6d\x5e\xad\xec\x71\xf5\x6f\x69\xc1\x58\x69\xe3\xfa\xdf\x69\xc1\xe8\xce\xdc\x28\x7a\xba\x38\x3e\xd2\x72\xbd\xb7\xa2\x90\xb9\x51\x94\xb7\x61\x49\x2d\xe7\x3f\xf2\xb4\x9c\x27\xde\x4b\x5f\x69\xe2\x98\xbd\xa8\xfd\x3b\x5c\x49\x93\xf2\x83\x8c\xce\xf5\x55\xd7\xb9\xfe\x9c\xdb\xeb\xbf\xc1\xdd\x64\xa5\x0b\x2c\x84\x68\x50\x8c\x08\xa9\x58\x8e\x53\x2c\x60\x4c\x8a\x35\x75\xdc\x60\xbd\x4f\x3d\xaf\x50\x26\x05\xfc\x2b\x18\x0e\x77\xfb\x56\x44\xb7\x37\x0b\xe5\x67\x85\x5e\xdd\xf1\xaf\x66\x8d\x66\x43\xfe\x1c\x8c\xbe\xbf\xdf\x3a\x81\x5f\xcf\x0e\xef\x5a\xdf\x3e\xee\xbf\x1d\x1e\xd6\xfb\x1b\xc7\xae\xf5\xe1\x0c\x8b\x7c\x6c\xbe\x94\xc5\xdf\xda\xfb\xf8\x4b\x73\xb3\x40\x5e\x3c\x2b\x34\xae\x5e\xf9\x37\xb5\xb3\x86\xfa\xb3\x69\x79\xd3\xee\xb0\x05\xbf\xd3\xa8\xbd\xd1\x6a\x6e\xac\x67\x7e\x76\x6e\x0f\x9c\xf1\xab\xf9\xc7\xb1\xf7\xf0\xf6\x5d\xa3\xd1\x38\x1c\x4d\x80\xa0\x7d\x34\x9c\xf6\x36\x8e\xfd\xf6\xd1\xfd\xe4\xa3\x77\x73\x67\x8f\x8f\x27\xf6\x7c\xff\xb8\x7d\xd0\x9e\x9d\x1d\xdc\xce\xce\x1f\x1a\x5b\xd8\x4c\xeb\x50\x10\x38\xb9\x3a\x3e\xb8\x1e\xb6\x70\x58\x07\x87\x67\xed\xb3\xf7\x8d\xea\xf1\xfe\x35\xf6\xb0\xd1\x78\xd7\x68\xec\x0f\x8f\x9b\xb7\x17\xb7\xf5\x9b\xe3\x13\xeb\xfd\x55\xd0\x1d\x6d\x8d\x8f\x3b\xed\x6e\x77\xec\x79\x67\x57\x33\xf7\xc6\xbd\x72\xed\xab\x8f\x1f\x37\x67\xf7\xf7\xa3\xd1\xb7\x6f\x07\x6f\x8f\x8e\x8e\x2e\xce\xda\x07\x9d\xdb\x43\x56\xbb\xd1\x6c\x9c\x34\xc6\x17\x40\x30\x78\x71\x73\x6c\x45\x9b\x5b\x37\xf7\x43\xff\x9b\x7f\x32\xbc\x78\xef\x5d\x5c\x9c\xd8\xc3\xfd\xcd\x49\x67\xf3\xe0\xf6\x78\x76\x77\x35\xfe\x58\xdf\x1e\xc7\x27\x37\x61\x3f\xda\x9c\x1c\xbf\x1b\x9e\xbf\x7f\x77\xd5\x68\x34\xda\x8d\x77\xad\xe1\x68\xd4\xe9\x74\xbb\xcd\xa3\xc3\xc3\xa3\x93\x36\x10\x6c\x7f\xfc\xf8\xf1\x63\x30\x1c\x8d\xee\xef\xe7\xf3\xe6\x91\xef\xbf\x6d\x9f\x9c\x7c\x77\x87\xc3\x61\x30\x9f\x37\x9b\x07\xbd\x83\xd3\xc9\xe4\xf8\xfc\xe2\x62\x3a\x0e\x82\xcd\xcd\xed\x6d\xd7\xad\x56\x5b\xed\xd3\xd3\x7e\xaf\xdb\xbd\x9d\xdd\xd7\xae\x6f\xbe\x85\x61\xf5\xe8\xc3\x87\xfb\x07\x20\xf8\xf0\xcd\xf7\xfd\xb7\x97\x17\x17\x94\xda\xf6\xce\xe6\xf1\xbb\xdb\xf3\xf7\x8d\x77\x8d\x21\x63\xda\xbb\xe1\xc7\x9b\x9b\xfd\xfd\x66\x93\xf5\xe0\xf0\xa4\x7d\x62\x59\x1f\x6d\xd6\x50\xfb\xe0\xdd\xed\xe1\x55\x83\x31\x71\x08\xfc\xdd\x7f\x7b\xdb\xe9\x1c\x03\xc1\xa8\xd3\x3b\x8d\x3a\x0f\xe7\xd5\x6e\xe7\x72\xc7\xbd\xef\xb4\x1e\x3e\x74\xce\xaa\xd7\xbd\xeb\x56\xed\x9a\xfd\x38\xd7\xb5\x0f\xce\xf8\xc3\x07\xc7\x67\xff\x6a\x37\xe3\xf6\x75\x7f\xfa\xb6\x76\x33\x6d\x5f\xf7\xeb\xed\x6b\xe7\xd5\xe6\xf5\xe8\xa8\x7d\x03\xff\x80\x20\xfb\xe5\xc5\xdb\x8d\xc1\xab\x0d\xf6\xaf\x3a\x3c\x3f\x7a\x77\xdd\x68\x36\xf6\x1b\x27\x8d\x6f\x17\x37\xfd\x6f\x27\x56\xdb\x3d\xfa\x7e\xea\x5e\x58\xed\x83\x51\xdb\x8a\x1a\xc3\xfd\x5b\xd6\xfb\x46\xb3\x71\x7c\xeb\xb6\x27\xb7\xdf\xcf\x8f\x27\xe3\x9b\xef\xe1\x78\xdc\x07\x82\xf1\xd8\x0d\xe3\xf1\xc6\x69\xe4\x3e\x9c\x46\xc3\x79\x6b\xf4\x7d\xc6\xa4\x61\x1f\x26\x9f\xfd\x9c\xec\x4f\xc6\xdf\x6f\xcc\xff\xc6\x37\x37\xde\xf8\x5a\xfe\x03\x82\xea\x07\x79\xff\xde\x1d\x7d\x6b\x9f\x0c\xf7\x1b\x8d\xe1\x7e\xe3\x7e\xa3\x65\xdf\x6f\xb4\x6e\x3b\xd7\xed\xdb\xfb\x8d\x76\xb4\x3f\xc3\x59\x9f\x37\x1a\x0d\x20\xc8\x46\x77\xe5\x3e\x1c\xda\xdf\x3a\x6f\xed\x87\xde\x5b\xfb\xe1\xe1\xad\xfd\x70\xff\xd6\x69\xf5\x8e\xbd\xd6\xc3\xf9\xab\xd6\xec\xb2\xd9\xa8\xdd\xec\xb3\x0e\x0f\x1b\x6d\xec\xf6\x7e\xe3\xac\xf3\x70\x68\x77\x1e\x8e\x19\xef\xaf\xdc\x8d\x9e\xfd\xed\xfa\x03\xae\x94\x87\x8d\x0f\x76\x75\xe3\x03\x63\xfe\xf5\x63\x7e\x3e\xbe\xc5\x99\x66\xac\x69\x1e\x39\x37\x93\x9b\xef\x40\x70\xd8\x18\x3e\xdc\x1e\xb5\x70\x32\xb0\xfd\x8f\xc1\xbb\xd1\xc1\x41\x43\x08\xf0\xbb\x46\xa3\xed\x8e\xb6\x9a\x4d\xab\x7a\x1c\x3e\x3c\xf4\x6e\x2f\xc6\xd3\xf7\xc3\xef\x9d\x6e\xbf\xba\x73\x74\x7c\x7d\x1c\xf9\x53\x6b\xfc\x71\xbc\x71\x89\x2b\x85\xc9\x5f\xff\x6c\xf3\x66\x73\xeb\xfe\xe1\xc1\xf5\x4f\xc6\xf6\xfb\xe1\xd8\x69\x5a\xf6\xce\xd6\xf1\xc1\xf1\x77\x2f\x38\xf6\xdf\x8d\xfd\xcb\x0b\xda\x39\xe9\xef\x6f\xd7\x27\xd5\xc9\xe4\xe1\x61\xe4\xfb\x7e\xe3\xe5\xd1\xd1\xfb\x23\xdb\xde\xd9\x9a\x54\x27\xc1\xdb\xef\x8e\xf7\x11\x08\x32\xca\xef\x9d\xa6\xb5\xf5\xdd\xdd\x3a\x3c\x8e\x1f\x1e\x82\xf1\xd5\x78\x4e\x6b\xd3\xeb\x6e\xdf\xde\xd9\xdc\xda\x62\x0d\x71\xe1\xff\x7e\xbd\x6d\x3f\x44\xad\xad\xcd\x9b\xfb\x87\x87\xc0\xb7\xc6\xf5\xe9\x56\xf3\xba\x6e\xdb\x3b\x2f\xb7\x6e\x8e\x1f\xa6\xb8\x52\xde\xf9\x23\x65\xa5\x20\x81\xa1\xd7\x7c\x57\xfb\xb8\xdf\x80\x1d\xac\x33\xaa\xef\x7f\x3b\xf2\x3f\xb6\x87\x83\x8f\x9b\x47\x1f\x47\xef\x46\x13\xf7\xa8\xf7\xd6\xef\x5e\x1e\x4c\x2e\x86\x67\xf6\x70\x32\xd9\xdf\x3e\xff\x76\x7b\x73\x02\x04\xbf\x7f\x3c\x7f\x77\x35\xba\xf5\x27\x1f\xba\x4d\xb6\x05\xc1\x5c\x36\x9a\xad\xd6\xe1\x71\xbb\xfd\xf1\xea\xea\xea\x56\x6e\x00\x47\x47\x47\x27\xed\xb6\x45\x6d\x7b\x18\x7c\xff\x7e\xd2\xed\xba\x6e\x78\x72\x72\x7a\x79\x76\x16\x45\x51\xb4\x33\x9b\x03\xc1\xf9\xf6\xc3\xc1\xc3\xb7\x30\x8c\xce\xce\xde\xbd\x9b\xcd\xee\xe3\xf3\xe3\x93\xd3\x83\x0f\xd7\xd7\xe3\x8b\xf3\x98\x5a\xd4\xde\xde\xdc\xea\x1e\x4d\xbd\xd8\xb9\xb1\x4e\xb6\xdf\x5f\x5d\xdd\x06\x93\x49\xb7\x51\xbd\xd9\xe7\x3b\x4e\x73\xff\xf6\xb6\xd5\x3a\x3a\xfa\x78\x75\x05\x04\xa1\x07\x93\xd1\x7c\xee\x8e\xfd\xa0\xdd\x3e\x49\xcb\xdc\x4e\xb3\x77\xd9\xea\x6c\x74\x52\xff\x2e\x77\x3a\xf7\x9d\x96\x7b\xdd\x69\xb9\x1f\x3a\x67\x6e\xad\x77\xf6\x50\xc3\x0d\xf6\xfa\xf0\xfa\x83\x33\xae\xdd\x78\x1b\x1f\xfa\xf1\xe6\xb5\x53\x7f\xfb\x61\x50\xdb\xd8\x18\xd4\x36\x6b\x83\xc3\xcd\x1b\xef\xfd\x4d\xf6\x5f\x93\xef\xd8\xd0\x62\xab\xdd\x6e\x7f\x7c\x07\xac\x01\x82\xa3\x9b\x8e\xfb\xed\xe0\xed\x5b\xbf\x7d\x7e\xf1\x6e\x38\xde\x97\x7c\xe4\x6b\xa2\xb3\xd1\xba\xba\xdf\x6a\xd9\xf3\x9b\xd6\x6d\xf7\x65\xfb\xb6\xe7\xb4\xa3\x87\x41\xbb\xda\x5b\x3f\xab\x56\x3b\xe7\x87\x57\xbd\xce\xf9\xd5\xfd\xb5\x53\xed\x5c\xd7\x80\x60\xf5\xfe\xc6\xbb\x7a\xb8\x71\xaa\x0f\xd7\x5e\xb5\x76\xed\xd5\x3e\xdc\x78\xf5\xfe\x8d\xf7\xfe\xa5\xf3\xea\x7d\xff\xe6\xd5\xc6\xba\xa3\xff\x7b\xe5\xd4\xf8\xd6\x3f\x6c\xbc\x6b\x0e\xdb\x0f\xe3\x6e\xdb\x1d\x77\xdb\xdf\xf8\x11\xb0\x59\x75\xbb\xfb\xed\xee\x51\xd8\x68\x37\x6e\x60\x95\x36\x87\x27\xed\x97\xee\x45\x7b\xf3\x5b\xf7\xa6\x7d\xfb\xfe\xa6\x3d\xa6\x37\x37\xbe\x7b\xf3\x7d\x32\xbe\x79\x39\xf9\x6e\xb5\x4f\x70\x1b\x83\x45\xd4\xe2\x47\xe8\xd0\x6a\x7f\xf7\x51\xb0\xdb\xdf\x7d\xb7\x1d\xfa\x6e\x7b\x33\x70\x6f\x6e\x26\xee\xcd\xf7\xef\x53\xeb\x38\x9a\x7f\x7f\x19\x4e\x1f\xf3\xef\x76\x3f\x40\xb1\x69\x06\x8d\x77\x70\xe0\x38\xf3\x63\xf8\x77\xdd\x3d\x6e\x5d\xcf\x8f\x1b\x76\xfb\xe0\xfa\xf6\xb0\x71\x36\x04\x96\xce\x0e\x5a\xf6\xbb\x5a\xfb\xf6\xfe\x65\x3b\xea\x0d\xce\x38\x0f\xcf\x5e\x55\x7b\x67\xaf\xae\x3f\x74\x0e\x0f\x67\xc3\x73\x20\x28\x4e\x30\xa1\x3a\xcc\x8e\x1b\x67\xdd\x97\x2d\xfb\xc1\x69\xdd\x5e\x5d\xb7\xe3\xda\x75\xbb\x56\xbb\x6e\xc7\xd7\xd7\xef\x5e\x2d\xdb\x80\x50\x6c\x94\x9f\x5a\xaf\x73\x5e\x7d\xe8\xee\x57\x8f\x9b\x6c\xa6\x19\x4b\xbf\xbd\x7b\xf7\xf1\x66\xb4\xdf\x3c\xb1\x27\xfb\xcd\xfe\xb7\xda\xc7\xe6\xc1\xdb\xf1\x71\xe3\xfd\xe8\xe2\x9d\x35\xba\xdf\x77\x5b\x93\xfb\xc6\xc3\xc1\xc1\xed\x79\xdb\xef\xbe\x03\x82\xef\xba\xf6\xab\xe9\x71\x7b\x6b\x36\x7b\x78\xd8\x3c\x6c\x07\x87\x57\x9d\xb3\xe1\x66\xd5\x3b\xdf\xdc\x1c\x1e\xd8\x27\xe3\x0f\x2d\xdf\xbb\x68\x8c\xd8\xda\x6e\x35\x0e\x5b\x6c\x30\xf7\xf3\x83\xb7\xad\xa3\xb7\xa7\x17\x5d\x7b\x3c\xec\x9c\x6d\xde\x37\x6f\xea\x57\xf3\x83\x5b\x9c\x94\xc9\xcd\x65\xb7\xdb\xbd\x8d\xbd\xd1\xf0\xe1\xa4\xfb\x7e\xdc\x1a\x5f\x7e\xf3\x4f\x2e\xbb\x5d\x7b\x7c\xeb\xed\x8f\x4e\xdd\x49\xfd\xb6\x35\xbe\x38\x0e\xdf\xc1\x22\x7f\xcb\xe4\xb3\xb9\xfd\xf6\xdd\xed\xfe\xd5\xfe\x3b\xb6\xa4\x8e\xda\x67\x57\xc3\x60\x32\xba\xe9\x74\x71\xb7\x71\xfd\xf1\xed\xe1\xe9\xc9\x19\xbd\xb2\xaf\x6e\x83\xad\xc9\xd6\x7d\xef\xe1\xdb\x6d\xfb\xed\xc7\xde\xc9\xd9\x3b\xcb\x19\xde\x37\x26\x93\xce\x7d\xef\xc1\xf5\xdf\xbe\x6d\xf7\xce\xde\xd1\xf7\xf6\xf0\xd5\xfe\x3e\x53\xcf\xda\x67\x4c\xca\x0e\x1a\xef\xdc\x61\xf5\xa6\x75\x85\x67\x4a\xab\x69\x37\x36\xdf\x36\x6e\x1f\xb6\xce\xaa\xdd\xfb\x77\x5e\xf7\xfe\xfc\xf0\xe1\xbe\xe3\xd5\xee\xcf\xcf\x6b\x5b\x57\xd5\x87\xde\xbb\xda\xd5\x75\xe7\x7a\x7e\x7f\x7e\x5d\xbb\xee\x5c\xd7\xef\x6f\xce\xaf\xfb\x1f\xbd\x5e\xe7\xfc\xbc\x37\xe8\x5c\x5d\x77\xce\x0f\xaf\x3b\xd7\xd7\xd5\xad\x1b\x9c\xe5\xeb\xfe\x75\xfc\xf0\xd0\xf1\xea\xd7\x9d\xeb\x8d\xce\xcd\x75\xad\x7f\xe3\xd5\xef\x6f\x5e\x5c\x6f\xdd\xd4\x36\x1e\xce\xcf\xdf\xb3\xcf\x1c\x46\xe4\xba\x56\xdb\xba\x79\xf5\xe1\xd5\x4d\xfc\xe1\x66\x28\x1b\xea\x75\x3a\xd8\xd0\xc3\x0d\xce\x72\xed\xe5\xc7\xda\xd5\x87\xce\xf5\xd5\xf5\xb5\xf7\xfe\xba\x73\xfd\xfe\xc3\x8d\xf7\x7e\xe0\x5c\x5f\xff\xff\xd8\xfb\xf3\x66\x37\x91\x34\x51\x1c\xfe\xbf\x3e\x85\xa6\xdf\x88\x6b\xd7\xc8\x65\x10\x68\xed\x1a\xf7\x44\xb2\x89\x45\x08\xb1\x0b\x3a\x3a\x2a\xd8\x04\x88\x7d\x47\xcc\xf4\x77\x7f\x43\xe2\x1c\x2f\xe7\xe8\xd8\xc7\xae\x9a\xe9\xba\x37\x7e\x8e\xa8\xb2\x0c\x99\x4f\x3e\xf9\xec\x4b\x4a\xb9\x31\x37\x72\x7f\x1d\xbc\xdf\x23\x92\xa6\x69\xb6\xa9\x21\x27\xad\xd6\x4c\x73\x33\x3f\x4a\xda\x51\x73\x63\xe4\xe4\x6a\xba\x64\x4e\xf5\x8d\x47\xcd\x4f\xe6\x66\x54\x3d\x29\xb8\x61\x30\xdb\x68\xb3\xeb\x60\xc3\x35\x63\xc3\x76\x67\xe8\x25\xc8\x93\x24\x2e\xb2\x22\x2c\x92\x30\x2c\x8a\x22\x29\xea\x04\x29\xca\x62\x66\x67\x4d\x58\x64\x45\xc9\x55\x89\x57\x94\xc5\xc0\x55\xc5\xb4\x2c\x93\xa1\x1c\x55\x2f\x0c\x8b\xb2\x08\x8b\x2a\xbc\x14\x45\x78\x29\xab\x62\x58\x15\xe1\x50\xd6\x45\x58\x34\x05\xca\x55\x25\x6e\x97\x45\x5b\xd6\xcd\x7a\xd7\x5d\x86\xb2\x49\xf1\xa2\x2c\x96\x65\xd5\x8c\xe3\x9a\x02\x2d\xfb\x94\x2e\x9b\x33\xb6\x1e\xc5\x26\x4c\x77\x79\xd1\x16\x4d\x91\x2c\x9b\x64\x55\x36\x29\xcd\xd7\x09\xec\x64\xcb\xb2\x68\xc3\x72\xd7\x95\x04\x57\x35\x50\xd9\x84\x53\xd8\x95\x29\x49\x3b\x1e\xdd\x98\x42\xcf\x1a\xa2\x99\x1b\x64\x76\x72\x17\x0b\x7b\x33\xd7\x2f\xb6\xd2\x40\x37\x80\xe5\xa9\xe5\x1c\xaf\x59\xc2\xad\xbf\x18\x90\xb5\xd3\xd8\x66\x4d\xef\xf6\xcd\x76\x35\xad\xa7\x6b\x7b\xe0\x86\x4d\x20\x30\xcb\xd8\x5c\x14\x88\x6d\x15\x45\x69\x36\x45\x31\x6d\x2e\x76\xd8\x12\xa5\x50\xe3\xaa\xa6\x6d\x8e\xa6\x16\xa3\x83\xeb\x8e\xba\x2c\xb9\x0d\x3a\x78\x82\xbe\xf1\xf6\x59\x51\x16\x4d\x58\xee\xda\x2b\x56\x67\xda\xe9\x93\xb5\xd3\x0c\xc0\x39\xba\x15\x72\x8e\xdb\x63\x6a\x73\x35\x8e\xce\xce\x97\x83\xc3\x0e\x48\x6b\xf7\x29\xbd\x12\x9a\x03\xe2\x5a\x42\x4b\x80\x94\xbe\x01\x3c\x77\x57\x0d\x20\x6f\x1a\x40\xae\x73\x90\xc9\x64\x09\x32\x30\x07\x22\xd8\x32\x9e\xa3\xaa\x3d\x28\x7a\x19\x83\x49\x6a\x57\x30\x9c\xa4\xf2\xa2\x11\x38\xf0\x82\xeb\xa5\x8b\xaa\x92\x79\xc1\x98\x8a\xca\x55\x86\xaf\x31\x8b\x31\xe0\xbc\xb0\x17\x85\x8c\xf2\x8c\x33\x15\x59\xf5\xbd\x20\xd7\x30\xce\x5a\x6e\xd5\x59\xcc\x96\x95\x65\xab\x46\x03\xfb\x39\x66\x72\x96\x8c\xa8\x70\x9c\x17\x85\x63\xab\x7a\xd6\x49\x46\x0f\x2e\x8b\xa5\x14\x0d\x51\xc4\xe6\xb6\xa8\xcb\x49\x54\x8f\xc1\x12\xbc\xe0\x16\x4b\x3c\x22\x22\x96\xcb\x2d\x51\x95\xe1\xac\xd6\xaa\x9e\xbd\x58\xf8\x19\x8e\x28\xa6\xb0\x44\x59\x85\x93\xbc\xbe\x2d\xa4\x47\x54\x54\x73\xbc\x6d\xa8\x3a\x32\xef\x67\x41\x7f\x5d\x28\x22\xe3\x9a\xe5\x1c\xe3\xc1\x8d\x22\x70\xdd\xe7\xd9\xb9\x0f\xb1\x68\x88\x52\x36\x65\x79\xf9\xba\x5a\xbc\x67\xad\x85\x19\xaa\xd7\x85\x12\x43\x90\xe5\xa8\xa8\x63\x93\x95\x07\xf6\xa2\xdc\x16\x32\x04\x41\x8e\xa2\xbc\xce\x59\x4e\xe1\xb6\xea\x2c\xca\xc7\xc8\xa1\x32\x34\x59\x4f\xba\x7e\x96\xf7\xb2\x4d\xe8\xd7\x6d\xb1\x9c\x63\xc9\x72\xd2\xd5\x7d\x9c\xdb\xca\x4e\x9b\x91\x54\xb6\x1b\xb7\x95\xd4\xb5\x66\x96\x56\x81\x6e\x55\x32\x2f\x59\x4b\x35\x64\xb8\xe8\x6b\xc9\x2c\xed\x33\x9d\x8c\x31\x76\x94\xe7\xa5\x25\xca\x3a\x9c\xe4\xbd\x64\xda\xe7\x10\xdd\x26\xf1\xbe\xdc\x5b\xb6\x6e\x25\xf3\x7e\x11\xe4\xb6\xad\xa0\x7a\x92\xee\xb9\xd2\xb5\x55\x35\xbb\xee\x28\x3f\xdb\x36\xaa\x25\x69\xdb\x32\xdc\x48\xbf\x78\xcf\x86\x37\x80\x56\x88\x6e\x67\x09\x57\x67\xa6\xa2\xcb\x61\xd1\xc7\x26\x6b\xd9\x04\x9d\x20\x71\xc1\x0b\xa6\x22\x1b\x51\x92\xf7\x26\x2b\x9f\xf1\xeb\x42\x75\xd5\x58\x96\x6e\x25\x5d\xbf\xc8\x73\x39\x5c\x1d\x13\x24\xdd\x57\xfb\x93\xad\xea\x45\x37\x32\xa5\xcf\x73\x45\x5e\x1d\x75\x3d\x15\x0e\xcd\x49\xd3\x01\x20\x80\x0f\x78\x20\x32\x80\x35\x2d\x42\x8c\x58\x15\xdc\x0c\x29\xb9\x65\xd4\x6a\xc1\x5a\x12\x76\x19\x88\xa8\xc0\xd5\x1d\x2f\xc8\x5e\xee\x44\x3d\xce\xc9\xb1\x36\x90\xe4\x98\x49\xb1\xf6\xf1\x4a\xdd\xbc\x77\x8d\x05\x8e\xeb\x31\x15\x55\xc5\xce\xd1\x74\xeb\x12\xe5\x57\xda\xec\x44\x00\xb2\x07\x43\x8a\x45\x08\xdb\x8b\x24\x47\x68\x11\x0b\x48\xf1\xfa\x6c\xcb\x5c\x05\x13\x18\x66\x2e\x85\xc4\x18\x39\x60\x61\x44\x6d\x79\x91\x29\x54\xe3\x2a\x42\xb9\x24\x9d\xaf\xdc\xde\xd2\xbc\x20\x86\x99\x69\xac\x17\x18\x87\x27\xa4\x4a\x66\x05\x67\xa8\xa2\x1c\x45\x71\x2e\x5e\xe3\x94\xcc\xb9\x7a\x78\x7b\x8f\xab\x3a\x76\xf1\x61\x16\x3c\x64\xa3\x2a\x50\xaf\xd9\xe8\x75\x2d\xde\x30\x7c\x97\x12\x2f\x5c\xb0\x25\x15\x32\x4b\x0b\x83\x14\x75\xbf\xa9\x5d\xd7\x94\xad\xe5\x91\x1a\xa8\xbc\x28\x6d\xc5\x10\x41\x58\x07\xae\x71\x91\x2f\xc7\xed\x8c\xca\x93\xd2\x91\x0d\x3d\xac\x46\x17\x00\x84\x01\x00\x91\xa8\x3a\x92\xc9\xf6\x5b\x31\x06\x2c\xa0\x01\x09\x8c\xac\x97\xce\xc3\x39\x4e\xc9\xed\x8e\x17\x3c\xdf\xd9\x03\xbf\x5f\x04\x17\x92\x08\xcb\x6d\xca\xf0\x82\xe8\xfb\xda\x15\x7b\x1c\xdf\x92\x03\x11\x5d\x23\xb0\x07\x37\xda\x18\x4e\x70\x4d\x10\xb9\x2d\x41\x92\x0c\x93\x9b\x8a\x2c\x8a\x7e\x10\x50\x2c\xb7\x94\x71\x92\x24\x99\x3c\x3f\x8a\xa2\xe8\x87\x41\x4c\x31\x57\xdf\x54\xdc\xf6\xba\xc3\x24\x93\x16\xf0\xc8\xc2\xae\x2e\x16\x07\x74\xf4\x80\x21\x03\x7a\xf9\x1c\xd1\x99\x29\x6d\x39\xc7\xf0\x63\x96\x95\xaf\xd8\x91\x64\xce\x16\x47\x86\x17\xc3\x28\xef\x35\x63\x81\x2d\xb7\x6a\x4c\x95\x15\xc3\x2a\x57\x45\x98\xb9\x01\xc6\x59\x32\xba\xd5\xa3\x3d\x57\x3a\x9a\x61\x2d\xe7\x63\x7c\x98\xbb\x66\x58\x12\xc7\xe3\x8c\x2a\xf8\xda\xb3\x2c\x0b\xce\xae\x1a\x52\x0e\x76\x04\xc0\xbe\xa3\xb0\x0e\xef\x40\x5f\x53\xfb\xd0\x31\x70\x39\x83\x4d\x5c\x05\x11\x70\x80\x8f\xe3\x11\xb5\x15\xae\x74\x57\x8d\x2c\xeb\x17\x8b\x7e\xe4\x32\x8e\xa7\x54\x42\x1f\x04\xce\x32\x8c\x31\x0b\xb8\x06\xa0\xd7\x34\x42\xe0\xf9\x87\xcc\xa0\xcf\x83\x5b\x6a\x41\x3f\x66\x0b\xf3\x2f\xd3\x8d\xc7\x0c\xe2\x06\x70\x4c\x23\x22\x00\xf0\xbc\xbb\xfa\xee\x8a\xa2\x22\x67\xce\x49\x19\x79\x0d\x7b\x19\x50\x5c\xe3\x6d\x8c\xd2\x8d\xac\xeb\xfb\xc0\xb7\xf1\x87\x7a\x03\xaf\x1a\xf2\xf8\x2c\x38\xdb\x0f\xcf\x6e\x00\x79\xc7\x32\x1e\x5f\x3c\x16\x27\x78\xc7\x78\x56\xb0\x78\xcd\xb3\xd1\x38\x50\x75\x59\xda\x47\x5d\x4f\x9a\xfa\x9a\x3a\x58\x4b\x64\x36\x8b\xf3\xb2\x14\x31\xd0\x76\x19\x0d\x0e\x6b\x7a\x3b\x1b\xf9\x89\x5f\xba\x1b\x0d\x49\x30\x07\x00\x3b\x13\x09\x2d\x08\x82\x68\xb8\x01\x63\xe4\x4b\x4e\x26\x6f\x00\xaf\x22\x94\xa9\x7b\x4e\x90\xfd\x38\xa0\x30\x8e\x93\xe3\x41\x89\x72\x2e\xb7\x64\x55\x8f\x0a\xd3\x99\xb1\x32\x17\xea\x71\x1c\x5f\x5d\x80\xa2\xea\x51\x76\x5b\x18\xbb\xe8\xf1\x2c\x66\x8b\x2b\x32\x82\x1f\xc6\xf5\x5e\xb2\x46\x6b\xb3\x44\x66\x08\x49\x31\x9c\x75\xd4\xf5\xac\xaa\xfb\x18\xe3\xe4\x02\x99\x21\x5b\x8e\xdf\x1b\xa6\xac\x26\x45\xdd\xbb\x41\x58\x12\xdb\x08\x8e\xd9\x6a\x77\xdd\xe6\xf2\x12\xc4\x7b\xd3\xb2\x86\xeb\xd6\xab\x9a\xb3\x8f\xba\x91\x5d\xc6\x2c\xe0\x2a\x22\xb2\x95\xcc\x66\x09\xb7\xdb\xbb\xa6\x85\x77\x84\x6f\xa7\x00\xf8\x64\xd8\x39\x86\xa5\xe5\xbb\x03\x0e\x7b\x0f\xc2\x8b\x93\x18\x00\x12\x3e\x4a\x01\x2f\x8a\xbe\x1f\xa8\x57\x91\x59\xe2\x37\xa5\x18\xeb\x36\xaa\xc4\xf1\x9e\xe1\xb8\x63\x39\x85\x3c\x13\x74\x9a\x31\xe3\xe0\x80\x05\xfd\x22\xe8\x61\x72\x4c\x6e\x44\xa1\x71\x1e\xb5\x8a\x54\xa3\x32\xa5\x69\xf1\x36\x2e\xa6\x30\xfc\xaa\x55\x63\x38\x47\x32\x4c\x66\x48\xb2\x1c\x46\xee\x75\x30\x77\x1b\x9c\xe5\xac\x71\x1d\x9c\xc4\x31\xc5\x72\x9c\xa5\x93\xe3\x38\x51\x96\xc3\x24\x8e\x6f\x40\x1f\xf2\x3e\x53\x94\x47\xa0\xec\xe8\x53\x38\xeb\xfa\x82\x61\x32\x53\x12\x6f\x83\x29\x96\xbb\x62\x3a\x0e\x96\x64\xd9\x8f\x82\x1b\xb3\xac\x11\x00\xf3\x08\xf4\xb6\x90\x7a\x0d\x91\x09\xac\xc3\x01\xc0\x0f\x63\x5a\xc1\x72\x07\x8e\x49\x3a\x78\xee\x30\x84\xba\x3d\x33\xb2\x8f\x03\x02\x00\xe0\xb8\x41\xb1\xbc\xa4\xfa\x05\x27\xa8\x94\x91\x75\x79\x2e\x8b\x4e\x80\x85\xbb\x80\x92\xc3\x73\x4c\x57\xba\xc6\x6c\x1d\xd5\x98\x99\x62\x9f\x4b\x92\xa2\x26\xed\x08\x30\xdd\x72\xbc\xaa\x4e\x5d\x03\xce\xfa\x6e\x79\x51\xb5\x28\xcb\x22\x63\x27\x3b\xc5\x65\xe6\x56\x1d\x76\x4d\x52\x70\x00\x3a\x12\x27\x07\x5f\x05\x18\x85\x9d\x99\x2b\x56\x01\x10\x73\xc0\xe1\x5d\xb7\x07\xfd\x11\x88\xe4\x02\x63\xc6\x7c\x19\xf7\x3b\xae\x9f\x4b\x03\x9c\x44\x04\xc0\x70\xf2\x02\x2e\x52\x48\xf9\x3c\x19\x08\x85\x6f\xb1\xa1\xe0\x63\xc6\x71\x4b\x30\xd8\x1c\xf0\x67\x03\x81\xc3\xae\xcd\xf8\x0a\x50\x47\xb7\x9f\x31\x8c\xe8\x63\xf8\x96\xe9\x45\x52\x8d\x18\x7c\x34\x0e\x24\xb2\x98\xcf\xfd\xd9\xa1\xe1\x49\x56\x88\xf4\x98\xf0\xc7\x34\x74\x0e\x00\xa0\x7d\x00\x22\x1f\xf6\x99\x90\xb3\x04\x63\x2e\x9c\xbb\xa9\x48\xb2\xa4\x14\x05\x9c\x42\x2e\x1e\x2a\x4f\x3b\x80\xf9\x60\x0d\x7c\x5c\xa4\x6e\x00\x43\x26\x64\xcc\x6c\x79\xee\xa6\x3c\xf1\x71\x2c\x10\xe3\xcf\x4b\xa8\x38\x78\x58\x05\x8c\xc9\x22\x0e\x82\x83\x89\xb8\x0a\x00\xa2\x21\x74\x0f\x6f\x84\xed\x58\x32\xb5\xa3\xec\x96\x95\x25\xce\x6a\x4e\x48\xfe\x65\x7f\xe6\x97\x1b\x05\x0c\x82\x12\xad\xe6\x6e\xba\x6b\x6c\xaf\xab\x6c\xcb\x4f\xcc\x70\x9f\xcf\x5d\x98\xb3\x2b\xb2\x97\x0d\x88\x41\x8f\xaa\xd2\xb1\x7e\xe4\x99\x6e\x3a\xa3\x8d\xf9\x90\x9d\x6f\x00\x51\x14\x2a\x36\x04\x55\xb7\xa8\x1a\xce\xa0\x73\xd2\xaf\x62\x5c\xad\x0f\xf5\x6c\x0d\x55\xc6\x69\xc3\x47\x3e\xa8\xc0\x56\xc2\x5c\xd4\xe7\xb7\x87\x79\xa5\x4e\x0b\xfc\x60\x60\x97\x8d\x56\x02\xd4\x28\xd8\xac\xd2\x51\x1d\x81\xbc\xd3\x2c\x1c\xf3\x65\xa8\x41\x1d\x7f\x6d\x6e\xa1\xc5\xea\xac\x4e\xf3\x43\x62\x6f\x49\x56\xf5\xa3\x53\x6a\x31\xe8\x86\xb0\x0f\x45\xef\xba\x66\x1e\xd8\xbc\x94\xe0\xce\xa2\xe4\xe2\x48\xe5\xa3\x4b\xbf\x0e\x99\xac\xf1\x17\x2e\xdb\xce\x04\x83\xde\x58\x8b\x8d\x33\x1d\x31\xdc\x7a\x6d\xe1\xac\x4c\xe4\x48\xb9\xc4\x79\x07\x15\xf4\x50\x4b\xa7\xb3\x4e\xea\x3d\x0b\x59\xe1\xd6\x1b\xce\x59\xd0\x6c\xe8\x0a\x37\x5d\x11\xe3\xec\x90\x86\xb5\x5a\x85\xd0\x64\xbd\x88\x89\x2d\xa2\x40\xd3\x3e\x32\x1d\x23\x3d\x4e\xc9\x11\xa0\x55\x0c\x2d\xd4\x2b\xbe\x90\x29\xd4\x76\xda\xaf\xe4\x7d\x21\xce\xf7\xd3\x0c\x00\x4c\xee\x1b\xed\xd8\xad\x56\xac\xbb\xb0\x93\x44\x49\x1a\xd6\x8a\x8e\xab\x05\xbc\xa1\x69\x38\xda\x1a\x5c\x0b\xa4\x43\xde\x9d\x04\x19\x1c\x2e\xf2\x01\x38\xc8\x28\x36\x51\xea\x11\x1d\x86\xd0\x1d\x00\x6c\x2c\x12\x06\xb7\x58\xac\x97\xfb\xd5\x66\xcb\xe2\xe7\x7e\x3e\xcd\x97\x16\xa1\xba\xc8\xea\x28\xb7\xd2\xe5\xb8\x63\x23\x06\x5f\x18\xe6\xec\xbc\x6b\x17\x71\x2e\x04\xa6\x32\xc0\xd5\x94\x48\x52\x6a\xe6\x8e\xd1\x57\x5e\x97\x29\xbf\x54\x09\x9f\xd1\x67\xb3\x63\xb0\x76\x68\xc5\x85\x21\x39\xb1\x7d\x01\xb8\xbd\x73\xd1\x3b\xfe\x9a\x71\x96\x26\x7a\xda\xcb\x27\xd3\x1e\xb8\xd0\x28\xb9\xf9\xb4\x3e\x14\x75\xca\x6b\x3b\xc1\xd3\x85\x2d\x12\x69\xad\x6a\x8c\x5b\xce\x91\x03\x0b\x05\x11\x1e\x2f\x2c\x4a\x12\xe6\xca\x6e\x6b\x1c\x4c\x87\x51\xd1\xd6\xe0\x67\x41\x16\xc8\xf3\x33\x4d\xc5\xe9\x45\x87\x10\x65\xc1\xae\xa2\x6d\x25\x07\x47\x5d\x59\xef\xe1\x85\x36\x45\x71\x68\x7b\x28\xd8\x99\xe8\xea\x61\xb5\x3d\x8c\x06\x96\x1c\xe8\xe2\xc8\xc8\xd8\x81\x09\x53\x9d\x50\xeb\x15\xe3\xb1\x2d\x74\x5a\x08\xf5\x80\xf5\xb9\x32\x98\xa6\x38\xc5\x0d\x32\xa0\x8f\xa7\x62\x3b\xb7\x00\x26\xc6\xe1\x0a\xd9\xb2\xc1\x7e\x9e\xb1\xed\x34\x38\x3a\x20\x07\xec\x35\x77\xd0\x6f\x00\xd7\x5b\xa4\xb4\xc0\x71\xbe\x57\x1d\x80\xa5\x5a\xbd\x5a\xe1\x83\x09\xb0\xe9\xae\xa2\x1d\xcd\x9b\x8a\xf3\x60\x2a\x62\xb3\x2e\x80\xcc\x92\x55\x0e\xbd\x8c\xb9\xcc\x3a\xf1\x15\x0f\xb8\x4a\x25\x0a\x19\xa5\x92\xa9\xbf\xc1\x68\x47\x3b\x04\xfd\x0d\xa0\x2c\x49\x46\xc4\xe9\x26\x7b\x14\x28\xe3\xb0\xd4\xe6\x80\x2c\xc3\x9c\xcd\xc8\xf3\xd1\x07\x48\xc7\x4a\x26\x2d\x93\x7d\xc2\x12\xc9\x9a\x82\xc1\xd2\x27\x8f\x95\xbf\xb0\xe6\x66\x05\x76\x4c\x5d\xf2\xd8\x6a\x7a\x0a\x56\x2a\xb7\x6b\x0d\x7d\xcc\xe8\xdd\xba\x22\x3a\xea\x34\x4b\x06\x63\x90\x67\xd4\x1a\xd9\xcf\x02\x44\xb8\xd4\x88\xb7\x5a\x62\x33\xd1\x95\x61\x19\x54\x62\xe8\xef\x0e\xbc\xe0\xb3\xf2\x86\x95\xf0\x55\x40\x1d\xc1\x32\x52\xab\x1d\xb5\xe7\x88\x85\x03\x16\x8e\x22\xb5\xbe\x3c\xd6\x60\x0f\x0e\x4a\xc5\x9b\x4d\xaf\xa3\xa2\x12\x42\x3c\x2d\xad\x09\x32\x59\xea\x69\x6b\x69\x22\x50\x3a\xa9\x90\xb8\xf3\xa5\x13\x37\x58\x59\x06\x8d\x2f\x21\x80\x53\xaa\x83\xe8\x89\x4e\x54\x02\xc1\x27\x84\xc0\x56\x48\xf9\x52\x1e\xc5\x05\x8c\xdf\x00\x46\xfb\xfc\xe8\xd6\xfa\x59\x5f\xe9\x08\x84\xaa\x67\xef\x88\xaa\x9b\x85\xcf\xb8\x56\x7c\x92\x40\x06\x92\x42\x25\xc3\x2e\x5f\xa0\x01\xee\x3a\x78\x17\xfb\xf3\xd5\xc9\xb1\x4f\x43\x9c\x88\x3c\xf0\x2d\x2c\x0a\x56\xce\xf4\xe4\x10\x3e\x35\x1d\xe5\xf0\xd4\x11\xc7\xd3\xe0\xf9\xbb\x83\xb3\x33\xd8\x0a\x00\x56\x04\xa5\x72\x3c\xa7\x01\xd4\x1c\xb7\x17\xb4\x9d\xd1\x11\x9a\x6b\x4b\x08\xad\x17\x65\xa3\xaf\x67\xa7\x65\x5e\x9e\x6c\x1e\x11\x51\x7d\xaf\x5d\x36\x6b\xac\x53\x6b\x1b\xef\x02\x2a\x18\xe3\x43\xbd\x39\x78\xed\x52\xf0\xa0\xb9\x69\x51\xa2\xea\xf8\x5c\xa9\x55\x73\xd7\x3b\x0d\xc1\x4c\x01\x04\x98\x11\x64\xb0\xb0\x51\x2d\x26\x2c\x12\xef\x16\xf6\xd4\x3e\x9c\x22\x2e\xab\xd0\x9a\x01\x8d\x87\xb6\xac\x29\x84\x01\xea\x5b\x68\xbc\x1c\xad\x0d\x7a\x90\x4f\x4c\x54\xee\x5a\xf8\x00\xe4\xf5\xf2\x70\x70\x77\x2b\x7f\x9d\x39\x08\x57\x7b\x7b\x8a\xe3\x06\x4e\xf2\x02\xa1\x45\x7c\x36\xa3\x76\xd8\xe1\x98\x58\xc7\xf6\x80\x89\xcc\xce\x67\xb3\x14\xb6\x6d\x1d\xab\x86\xd2\x30\x0d\xa3\x23\x57\x63\x7a\x1b\x23\xe7\x69\xab\xb8\xea\x4a\xcb\x23\x64\xb6\x0b\x55\x58\xb4\xce\x87\xe8\xd2\x01\x40\x17\xb6\x8a\xc3\x90\x51\x19\x82\x6b\xcf\xbd\x25\x26\xe4\x2b\x12\x76\xf0\x10\x9e\x83\x0c\x52\x7c\x62\x6d\x6a\x80\x0f\xdd\x65\x00\x81\x35\xe3\x61\x37\x80\xfb\x28\x5f\x42\x7d\x05\x00\x6e\x92\x3b\xd2\x60\xa2\xe9\xa5\x65\x96\xe2\x30\xdb\xef\x97\x31\x73\xaa\x31\x68\xc9\xf0\xfa\x59\x67\xf7\x42\x71\x50\x78\xcf\x05\xc9\xc5\x3a\x2f\xc9\x0a\x16\xb1\x28\x66\xf3\x50\xd6\x75\x3a\x15\x11\x3c\x33\xc6\xf6\xc7\x56\x07\x49\x3d\x85\xfd\x9d\x88\x51\x1c\x8e\xa5\x39\x22\xaa\xaa\x68\x42\xb3\x3a\xa8\x4d\x02\x63\xd5\x9c\xd2\x8d\x35\x32\xa0\xf3\xcc\xc9\x4a\x6c\x89\x64\xc7\x55\x81\x2d\x2e\x70\x76\x00\x2d\x74\xca\x7a\x1a\x59\x74\x5a\xe2\x33\xf4\x69\x34\x5f\x3d\x25\x94\xeb\xd8\x33\x1d\xac\x98\x71\x3d\x6a\xb6\x78\xb1\xc1\x7c\x6b\x89\x6e\x40\xdf\xd0\xcd\x61\xbf\x83\x56\x33\x03\xa7\xe6\xe4\xa5\x63\xf3\x82\xa6\xc0\x71\x79\xa4\xe0\xea\xac\xd9\x0d\xd8\xa7\x6d\xeb\xee\x9c\xb2\x39\x19\x9d\xc0\x8f\x45\x8c\x90\xb0\x96\x21\x98\x2f\xd7\xc0\x00\x00\x5b\x26\x7b\x8c\x3f\x3a\xbe\x42\xac\x69\x59\x2a\xd8\x79\xdb\xad\xf1\x33\x88\x71\xf2\x00\x70\x20\xc7\x47\x08\x1c\xba\x83\xc0\x72\xf1\xa6\xbf\xba\xd1\x43\x92\x7a\x2d\xe2\xe9\x39\x8a\x1e\xfd\xd1\xd1\x77\x28\xd1\x9e\x86\x65\x72\xd9\x46\x68\x76\x39\xac\x0d\x85\xab\x70\xa1\x1d\x80\x0f\x76\x62\x08\x67\x33\x67\xb9\x1f\x2a\x44\x40\x0e\x3e\x12\xcc\x01\xce\xb0\xc0\x07\xdb\x03\x6c\xed\xd3\x45\x0f\x63\x84\xaf\x9d\xe8\x55\x83\x28\xf5\xe5\x34\x3a\x7a\x47\x62\x1a\x03\x5c\xc4\x00\xa3\xa0\xb8\x95\x25\x50\xd7\x3e\x58\x2a\x07\x5b\x37\xc1\xc6\xb7\xd4\xd2\xd4\x81\x4a\x02\x30\x25\xfa\xf9\x4a\x44\xa1\x72\xbd\xa2\x7b\x55\x2d\xcc\x04\x83\xb1\x44\x6d\xf8\x38\x3b\x53\x67\xba\x9e\xf9\xc4\xd8\x5c\x48\xd3\xb6\x39\xae\x79\x26\xa9\xce\x72\xb1\xd0\xa3\x41\x1e\xb6\xf2\x12\x11\x48\x26\x16\x9a\x93\xae\x7b\x43\xaf\xe7\xed\x92\xc2\x7c\xc2\x67\xb5\xb8\x3e\x1d\x29\xa3\xde\x03\x90\x16\x2a\xdc\x8b\x19\x01\x1b\xbb\xf0\x98\x2d\x1c\x6a\x21\x8e\xc9\xe3\x1c\x4f\x8d\x59\x8d\xed\x40\x64\xe2\x02\xc0\x40\x60\x47\x10\xe0\xa7\x10\xe8\x64\x1c\x77\x63\x1d\x00\xc0\x3b\xd4\x59\x5e\x65\x9d\xbd\xde\x6a\xc4\xd0\x7a\x44\x68\xb6\x43\x6a\xd7\x48\x4d\xcd\xed\xdd\x22\x73\xf7\x33\x83\x8b\xd7\x6b\x65\x4c\xcd\x48\x80\xe1\x66\xdb\x9c\x8a\x8d\x81\x2b\x58\xcd\x77\x1a\x10\x55\x12\x74\xdb\x7a\x1f\xd7\x83\x6c\xd1\x2d\x20\x0c\x1c\x55\xfa\x9d\x76\x2e\x42\x09\x4c\x05\x13\xf0\xc1\xe0\x14\xa4\x2f\x39\x40\xe8\x32\xdc\x6f\x5d\xa5\xaf\x14\x7a\x37\x26\x8f\x24\xb5\x9c\x66\x82\x8d\x4c\x0f\x80\x59\x3b\xe1\x41\x74\x8e\xfe\x2a\x17\x8c\xe9\xee\xdc\x8b\x72\x8b\x9c\xce\x09\xd5\x9c\xd1\xb9\xbf\xed\x06\x74\x06\x43\xf6\x96\x5b\x0e\x68\xef\x2b\xeb\xf5\xca\xcb\x12\x5d\xdd\x91\x16\xe1\xc2\xf3\x8e\xf6\xc6\xbe\x9e\xd1\xbb\x67\xc7\xd7\x10\xb9\x6f\xe5\x2e\x85\xb5\xcc\x3c\xb2\x52\x11\x49\xf8\x02\xc8\x22\x94\x34\x5a\x06\xd4\xea\xb8\x02\x3e\x10\x79\x6c\x6f\x69\x1d\x00\x31\xc0\xa4\x5e\x81\x66\x87\xe4\x54\xec\x0a\x59\xda\x13\x76\x70\xb4\xe1\x51\x97\x6d\xaf\xcc\x31\xd4\xde\xcc\xcf\x79\xa3\x93\xe6\x19\xc3\x09\x44\x70\xdc\x23\x95\xe3\x1c\xe9\xe3\xc4\xc9\xa1\x0e\x7c\xb7\x06\x00\x10\x6a\xa7\xcc\xe3\x54\x4d\x16\x70\x9c\x74\x65\xce\xf3\xc1\x41\x64\xb8\xf3\xb2\x81\xc9\xf5\xa9\x44\xda\x31\x93\xc2\x52\x9f\xdf\xbb\x4c\x5c\x9a\x55\xe8\x9f\xad\x20\x3e\x37\xee\x12\x50\x9a\x3f\xad\x87\x63\xa7\xa6\xc7\x1d\xaa\xb0\xbb\xdc\x3a\x5b\x3a\x07\xe6\xda\xad\xd1\x1e\x52\xa7\x82\xf5\x39\x60\xc2\xeb\x63\x59\xcb\xa8\xdb\xd7\xe2\xde\x70\xc6\x70\xee\xd0\x1a\xe4\x76\x8d\xc7\x6d\x29\x4a\xac\x8f\x79\x79\xd0\xa5\x7b\x9d\x3d\xd7\xdb\x22\xc9\x97\x1a\x79\x90\x5b\xcc\x5b\x91\x58\xa8\xa2\x85\xcf\xda\x22\xe8\x88\xf9\xce\x5b\xef\x00\x4f\xf0\x01\x6d\xef\x01\x00\xb1\xcf\x4d\x6b\xaa\x5a\x8c\xf6\x70\x6a\x5c\x58\x67\x73\xc1\x53\xd6\x42\xcb\x7e\x77\x68\xe2\x6d\xda\x77\xd5\x51\xdb\x50\x55\x84\x44\xf3\x43\x58\xe1\x80\xc6\xd7\x54\xd4\xd9\x5b\x72\xe3\xb3\xb7\x2a\x49\x7a\x89\xaa\x33\x8c\xbb\x14\x6f\xee\x76\x7e\x36\xac\xf9\x29\xf5\xd0\x5f\x0e\x3b\x03\xf3\x99\x7e\x3a\xd0\x21\x8e\x01\x0e\xc4\x18\xb7\xcf\xa9\x59\x25\x6c\xd8\x5c\x73\x2e\x64\xb8\xb1\xca\xd9\xc2\x88\x69\xbf\x6c\xea\xc5\xe9\xc0\xa6\x91\xcb\x2e\x5b\xb2\x33\x0f\x17\x40\x8b\x18\x43\x12\x6a\x19\xf3\x0e\x06\xc0\x58\x90\x44\x38\x20\xc3\x62\x31\x65\x3b\xa9\x22\xe7\x80\x35\x6b\x3e\x05\xc4\x72\x9b\x0a\x46\x67\xc4\x02\x63\xb6\xf5\xa0\xee\xdd\x73\xe9\x61\xab\x53\xc8\x47\x3a\x03\xe3\x09\x86\x2d\x01\x03\x38\x07\x5d\x83\x4d\x56\x91\x54\xac\xc8\x5b\x12\x1f\x0d\xec\xd4\xb1\x3d\x89\xc0\x61\x4b\xca\x77\x74\xb1\x3f\xe4\xb1\xc3\x41\xab\xe5\xae\x4f\x91\x32\x4f\x8a\xcb\xb1\x32\x58\x5d\x0a\x21\x4a\xbc\xb5\x86\xc5\x68\xc3\xe3\x40\x08\xed\x52\xc4\x44\x40\xe0\x44\x55\xe4\x59\x76\x68\x6a\x77\x0a\x8f\x19\x3d\xee\x6d\xfc\x65\x48\xba\xa1\x71\xf4\xb5\x44\x04\xcc\x7c\x3a\xef\xaa\x88\xc4\xc8\x10\x8b\xb3\xbd\xb8\xe4\x42\x18\xe2\x14\x11\x16\xcf\xfa\xe9\xdc\x0f\xe1\x14\x78\xcd\x91\xcb\xf8\x33\xa9\x9d\x44\xc1\x1c\x4a\xf8\xb2\x99\xcf\x8a\x9d\xcf\x23\x0f\xaa\xd7\xb7\xb6\x29\x14\x4e\x6f\x2e\xd9\x65\x54\xc6\xe5\x79\x7e\x41\xce\x1b\xe0\xfa\x1c\xd1\x2f\xb7\x29\x5b\x69\xbb\xc0\x76\xe6\x48\x53\x2c\xd6\xf3\x69\xd6\xc8\xee\x1e\xcb\x33\x3c\xc4\x35\xba\x1c\xa6\xfa\xa0\x02\x88\x20\x6a\x62\x0d\x94\x87\xee\x2d\x1a\xc0\x31\x8f\x03\x30\x38\x54\x3b\x95\xa7\x27\x59\xde\x47\x9e\xa1\xc7\x4a\x6e\xa3\xf3\xe4\x84\x48\xa7\xa4\x28\x58\x8f\xf7\xa2\x38\xa0\xc1\xa9\x59\x69\x19\x20\x01\xee\x03\x90\x73\x52\x54\xef\xa6\x5c\x24\x12\x3a\xdf\x19\x63\xe4\xa0\xde\xce\x7b\xe0\x5c\x95\xaf\xe1\x3e\xc8\x37\x33\xf5\x5c\x88\x58\x87\xf6\xf3\x85\xe3\xd5\x45\x74\x16\xc9\x4b\x83\x6e\x37\xd8\x72\x3f\x95\x96\x0b\x58\x2d\xd6\x82\x16\xfa\xab\x4e\x48\x96\x7a\x93\xc2\x9e\x35\x8f\x39\xe2\x90\x59\x36\x5b\xdd\x00\x2e\xad\x5d\xe1\xdb\xc1\x61\xc8\xdb\x39\x27\xcd\x43\x81\x08\xe3\x6e\xbd\x36\x73\x63\x55\xcc\x18\x81\x77\x6c\x20\x03\x01\x68\x75\xe2\xe0\x69\x66\x3b\x65\xb4\x9d\x73\x5b\x79\x05\x99\x69\x15\x69\xba\xb4\xa7\x36\x2c\x2c\xa9\x34\x27\xa4\x23\x97\x2f\x97\x8d\x0e\xd6\x44\xbb\xdc\x5d\x93\x31\x89\xc7\x45\x15\xcc\xb7\x65\x58\x9f\x34\x1e\x89\x1d\xf3\x44\xa3\x22\xaa\x40\xad\x39\x5f\xb1\x88\x41\x07\x4e\x82\x59\xc3\xf9\xe4\x5e\x1a\x0d\x59\xf8\x3b\x30\x94\x0e\xec\x8c\xd9\xd4\xd8\x5f\xc6\x83\xe5\xc1\xbd\x3e\xd8\x5e\xf4\x33\xa5\xcf\x2f\xb2\x73\xb6\x74\x0b\x49\xb6\x4e\x76\xa2\x7b\xbd\xf7\x3a\x0e\xec\xfc\x58\xc7\xf2\x9d\xda\x76\x5d\x34\x55\x85\x60\xe1\xed\xb7\x17\x55\xa8\x66\x10\x49\x4d\x73\xb3\x9c\x36\xee\x42\x18\xc6\xf4\x76\xdb\x19\x2e\x00\x98\x8f\xe4\x0b\x64\x17\xca\x3e\x30\x20\x53\x8b\x85\x24\x8c\x49\x9f\x4e\x97\x5b\x54\x70\x3a\xe3\x3c\x30\xab\x56\x38\xcf\xea\x65\x5f\xf5\x73\x19\x8d\x31\x63\xb3\x24\x55\x11\xa3\x96\x80\xc1\x40\x72\x30\xe8\xf9\x21\x1b\xad\x8d\x81\x67\x2c\x00\x84\xee\x4d\x05\x93\x35\xc3\x15\xd4\xaf\x96\xd0\x85\x5e\xed\x86\xd3\x86\x5f\x1c\x07\x89\x4b\xa9\x43\xd2\x7a\x7c\x15\xc6\x22\xdd\x69\x0f\x67\x1f\xd0\x9d\x48\xac\x0f\xf8\x35\xa7\x24\x7c\x0b\x16\x9b\x33\xb6\x7b\x70\xa3\x83\xc7\xce\xad\xa5\x09\x91\x92\x86\x01\x35\x06\x24\x51\xb4\x19\xbf\xc2\x44\x0c\x34\xc0\x6f\x06\xaa\x60\x76\x75\x72\xa6\x51\xce\x9d\x77\x27\x2e\xb3\x53\x21\x00\xe8\xb0\x5e\x14\x7a\x26\x1d\x92\x4d\xd0\x65\x02\x9d\x11\x00\xc4\xa3\xd8\xd8\x1d\x01\xc0\x62\x49\xd1\xa0\x39\x9e\x62\x3a\x43\x4f\x1e\x52\xd7\xdb\xcd\x51\x25\x3c\xb0\x31\x12\x03\xc7\x44\x38\x3b\x94\xd0\x4c\xc4\xd7\x4c\xdb\xe0\x57\x7a\xe7\xb6\x0a\x44\x9c\x43\x10\x3e\x21\x51\x61\xb5\xd6\x80\x4d\x8b\xca\xd8\xf1\x39\x30\x87\x7d\xa6\x6c\x86\xbd\x83\xc6\x88\xe0\xad\x14\xa0\xed\xc0\x1e\x6b\x4e\xca\x9a\xbf\x9d\xee\xd8\x0e\xca\xfc\x20\xaf\xaf\x9f\x33\x72\xb7\xa5\x6d\xa4\xb1\xf0\xae\x23\xdb\x19\xa9\x07\x54\x19\xaa\x91\x0d\x2c\x60\x22\x2b\xe8\x34\x36\xb9\xcc\x54\x31\x8f\xb6\x3e\xa0\x58\xa7\xe7\x67\xd5\xe2\x4d\x4e\x3a\xaf\x5c\x13\x66\x21\xc8\x57\x3d\xc5\xcd\x35\xb2\x03\xc0\x14\xa8\x6a\xdf\x73\xe0\x2c\xca\x3e\x98\x02\xec\x90\x19\x6b\xf6\xbc\xb8\x20\xdd\xd9\x5b\xcf\xce\xd5\xd1\x81\xc6\xca\x92\x22\x88\xba\x42\x18\x26\x96\x80\x68\x4f\x84\x85\xd6\x35\x00\xd9\xb3\x9b\x2b\x46\x24\xc6\x81\x7a\xa3\x95\xd5\xa9\x82\x90\xfd\x6c\xc3\x0b\x9b\x99\xbc\x29\xdd\x35\x49\x2b\x26\x9d\x0e\xf8\x82\x37\x92\x93\x48\x02\xfc\x02\x51\x98\xf3\x50\x32\x05\x04\x58\x38\x73\x3f\x9c\x0f\x6b\x09\xec\x2b\x28\x59\x52\xfb\xa3\x96\x6d\x08\x6d\xbe\x64\xb7\x33\x0c\x23\x9a\xa8\x88\x3b\x48\xb3\x16\xdb\x95\x68\x37\x5b\x4d\x66\xa6\x88\x65\x5a\xd9\xee\xc8\x96\xae\x76\x46\x86\x18\xdf\x98\x0b\x91\x7c\x68\x14\x52\x03\xb4\x10\x07\x5f\x33\x47\x71\x87\xb2\xa3\xd3\x5f\xf0\xa5\x7e\x52\x9a\x29\xbc\xd1\x3c\xc8\x59\x2d\x97\xec\x5c\x53\xc0\x56\xa5\x12\xb0\x98\x4d\x35\xb0\xe7\x42\x48\x3c\x64\x87\xce\xf0\x0d\x10\x81\xd5\x6c\x21\xd0\x73\x19\x1e\xbb\x15\x0b\x8e\xa0\xdb\xf3\x66\xc3\xf3\xc5\x5a\x39\x50\x0e\x5a\x66\x9c\x99\x6e\x85\x4c\x99\xd9\x09\x13\x68\xbe\xb3\x3a\x02\x7e\x3c\x2c\xc6\x03\x7d\xa6\xd9\x62\x87\xfa\x56\x3e\x08\x39\xeb\x4e\x39\x17\x39\x39\xf3\x50\x16\x96\xc8\x69\xec\xf8\xb4\x9b\x69\x92\xb5\x4d\x38\xeb\xd4\xfd\x01\x9c\xe1\xc5\x66\x8f\x0a\x5a\x3f\x44\x73\x5f\x5b\xa1\x87\x84\x5c\x53\x0c\x40\xa8\x45\x22\x15\xe8\x8a\x6c\x9d\xd5\xb2\xdd\x1d\x4f\xd4\xbc\x24\x16\x2a\xcb\x82\x6e\xbe\x0c\xf4\xe5\xce\xc4\xed\x45\x35\xb6\x32\x77\x6e\x3f\x8d\x86\xab\x3d\xc4\xa6\xc1\xe9\xb2\x59\x4c\x37\xcb\x85\x89\xef\x0e\x2b\x0c\x85\xb4\x58\xa1\xf1\x96\x20\xb9\x5a\x0c\x94\x64\xce\x85\xb8\x0f\x48\x60\x97\x27\x5b\x57\x0e\x55\x75\x45\xfa\x98\x7b\xde\xac\xd6\xca\x6c\x30\x46\xe3\x90\xce\x67\x1d\x31\xb3\x3c\xa3\x8e\xb8\x53\xd5\xed\x17\x90\x7c\x3c\x08\x30\x4b\xa4\x81\x00\xcd\x63\x4b\xcd\xca\xba\x85\xaa\xf9\x0c\x39\x5d\x6c\x0f\x4a\x85\xbd\x9b\x3a\x19\x4e\xa7\x98\x16\x87\x0d\x8c\x8b\x5b\x4c\x8f\x0f\x06\xb4\xe0\xba\xd1\x38\x24\xc8\x0e\x8a\xca\xe6\xc0\x2f\xc5\x55\x36\xcc\xeb\x96\x10\x2f\x53\xdb\x44\xe9\x41\x08\xa7\xfe\x9e\x06\x73\xc2\x24\x7d\xf0\xe1\x36\xf8\xcd\x4f\x3f\x3f\xfe\x38\xf3\x9d\x93\x7f\x61\x62\xf9\x5e\x05\x85\x4e\x96\xfe\xb2\x59\xbe\x79\x37\x79\x73\x7b\x02\xe5\xe9\xe7\xa7\xff\x42\x0d\x13\xa4\x0e\xe6\xb6\x7e\x76\xdd\xe1\x5e\x56\x03\x52\xf5\xaf\x1a\x74\x3b\x6a\xe4\xe3\xd7\xd8\x1c\x10\x61\x42\x3b\xf3\xdb\x93\xad\x8b\x29\xd7\x90\x77\xb7\x3d\xe0\x50\x1f\xdc\x8e\x89\x00\x6a\x50\x23\x77\xd4\x75\xc0\xad\x04\x5a\x88\xae\x4f\x7d\x03\x0e\x64\x45\x04\xc0\x0b\x0d\x00\x18\x9c\x04\x80\x58\xde\x5e\x08\x3e\x00\xb4\xda\x01\x40\x14\x57\xf0\x42\xee\x03\x80\xb9\x5d\xba\xcb\xa5\xc3\x4d\x3c\xcc\x50\x86\xdd\xb1\x02\x0a\x0e\x6b\x00\x75\x04\x94\xed\x90\x34\xba\x89\x6a\xdc\xc9\x54\x3c\x00\x00\x1a\xa6\x03\x60\x17\xf2\x98\xc7\xa9\x90\xeb\x03\x40\x71\x01\x2b\x91\x94\xea\xed\xcb\xfa\x78\x8c\xab\x23\xef\x2e\x20\x14\x1e\xd6\xcb\xf9\xa6\x21\x86\x11\x60\xd2\x4b\x54\x68\x33\x95\x70\x34\xd7\x1a\x93\x2a\x2c\x65\xc8\x3a\x6a\x39\x35\x39\x73\x6a\x3d\x72\x6a\x92\x5a\x32\xb0\x26\x51\xa4\x0e\xb2\x30\x10\x33\x70\x16\xa9\x24\xc4\x32\x5f\xb7\x18\x12\x10\x14\x9e\x88\xc7\x28\xae\x33\x78\x3e\xba\x59\x01\x4e\x5d\x9d\x99\xdb\xbd\x69\xc5\x3a\xcd\x86\xa9\x62\xd4\x91\xc4\x52\x91\x53\x0f\xf1\x66\x70\x37\xab\xd5\x74\xed\xcc\x37\x53\xf5\xdc\x84\xb9\x8d\x13\xb3\xcb\x74\x33\xb5\xbc\xd5\xa2\x6d\x13\x36\x6e\x51\x5f\x40\x0c\xa9\xb9\xfd\x37\x5a\xf4\xeb\x3f\xd4\x06\xd4\x65\x86\xed\xd1\xf4\xe4\x71\x95\x25\x1f\xf5\xa6\xb4\xca\x56\x6a\xd5\x52\x49\x63\xc7\xd1\xa0\x85\x85\xc6\x84\xe4\x49\x1c\xe5\x3a\x73\xd3\x5a\xa6\x43\xab\x23\xf6\x4a\x60\xf2\xce\x0c\x56\x7b\x74\x15\xd2\xc6\x98\xa0\x1f\x86\xfa\xd2\x5e\xe6\x61\x01\x60\x58\x49\x7d\x48\x3f\xd2\xb3\x13\xba\x15\x2b\x2a\x0a\x61\xd1\x1e\xa6\x0e\xd0\x66\xc8\xd9\x93\x22\xa5\xeb\x54\x17\xb9\x9c\x2a\x8d\x59\x6f\x84\xb3\xbd\x2b\xbb\x34\x63\x99\x5d\xb7\x26\x33\x20\x30\x80\xf2\x47\x4d\xea\x08\x05\xef\x1d\xc0\x62\x24\xcb\x84\x0c\xf0\xb3\x90\xc1\x01\xe3\x33\x3e\x83\xb1\xdb\xdc\x3d\x48\xb8\x54\xa0\xd5\x01\xc7\x00\x0b\xc2\x70\x2d\xfa\x20\x82\x0e\x0c\x15\xc9\x18\x26\xb6\x01\x2a\x4a\x91\x78\xac\x49\x1c\xe3\xf2\xb1\x0c\x43\x6f\xec\x72\x11\xf0\x61\x14\x38\xfe\x5c\xd4\xe6\xae\x11\xf9\x40\xa2\x30\x39\x4a\x62\x35\x49\xf3\xd5\x2e\xd9\x1d\xd7\x65\xbc\x2e\x36\x0b\xe1\xc0\xb1\x30\x21\xe2\xd1\xc1\x53\x48\x47\x2c\x01\x31\x5b\x6d\xa6\xab\xe9\x6a\x57\x1d\xd0\xb6\x1e\x8d\x47\xb7\x01\x33\xb3\xb5\x3b\xea\x24\xf2\x50\x39\x83\xc0\x85\x58\xce\xb9\x1d\xd6\x2e\x58\x9a\xb1\x98\x8e\xc9\x99\xc5\x96\xb1\xbd\xd6\x5d\x23\x25\xcc\xa0\x02\x7f\x6e\xd9\x93\x90\x2d\x4e\x27\xbc\xe8\x66\x64\xc0\x48\xb1\x28\x86\xa8\x85\xae\xc6\x18\x1c\xb6\xea\x93\xa2\x61\x08\x72\x08\x98\x86\xae\x37\x8b\x3a\x4d\xb1\x72\xb5\x18\xe8\x3d\x04\xb6\x40\xce\x8c\xf3\xa5\xd7\x34\x05\x17\xf0\xc3\x49\xd0\xf7\x9b\x6a\x7b\x6a\xbc\xa9\x7b\x82\x76\xf3\x12\x1d\xd6\xbc\xbc\x55\x85\x16\xb5\x74\x83\x18\x7b\x05\xc5\x1c\xc5\xc8\xe3\x91\x14\xa5\x03\x2e\x72\x8b\x82\x8a\x3d\x8a\x77\xdd\x46\xe8\x78\x0d\xd5\x39\x15\x3b\x52\xda\x45\x3b\x06\x75\x82\x9e\xcb\x73\xdd\x76\x33\xb4\x6d\x76\xb3\xe6\x70\xdc\x02\xa0\xfa\x41\xb4\x8d\x77\x87\x23\xbb\x31\x5b\x73\x8c\xc1\x77\x2b\x74\x9d\x0d\x6b\xba\x12\x02\x8a\x42\x1a\xd4\xa2\x61\x72\xcd\x92\x2d\xd0\x03\x6f\x9a\x22\x07\x9a\x58\xc1\xe6\x0a\xea\x13\xc7\x39\xed\x30\x99\xdb\xf0\xb3\xf4\x08\x83\x22\x35\x28\x99\x0b\xb1\xd5\x89\x09\x85\xc1\x47\x23\x64\x86\x8d\x99\x96\x41\xeb\x33\x9f\x8f\xca\x19\x44\x60\xd8\x74\x49\x47\xdb\x9d\xd2\x27\xd2\xc9\xee\x4f\x9b\x69\xe1\x40\x6b\xbd\x1a\xf8\x4d\x3c\x50\x9b\xcd\x7c\xb9\xae\xbb\xde\xc4\x41\xb1\xe8\x6c\x31\xe4\x71\x89\xd4\x0f\x58\x44\x1c\x5d\x0f\xf5\x98\xf9\x7a\xf4\xdb\xd3\xc0\x83\xa6\xb3\x06\xf2\x6a\xc8\x41\x01\x37\x85\x1a\x79\xb8\xec\x94\xd6\xe7\x56\x65\x32\xad\x31\x72\x8e\x9b\x60\x46\x4b\x16\xa5\xac\xb2\x62\x2f\x72\x38\xee\x56\x05\x96\x2f\x67\x5b\x62\xe3\xd1\x18\xb1\x5a\x1d\x9b\x94\x9d\x2d\x33\x68\x2c\x58\x2e\x8b\x29\xe4\xec\x58\x63\x77\x40\x4e\xc1\x70\xda\x6e\x23\xc9\x08\x3b\x4c\xe2\x90\x53\xba\x83\xd0\x50\x1a\x56\x50\xa3\x40\xeb\xf4\xd4\x34\x03\xa2\xf4\xb1\xb5\x9e\x06\x47\xc9\x66\x97\xa2\xca\x61\xd6\xae\x61\x13\x5f\xdb\xb1\x12\xd7\xc8\x63\x23\x31\x66\xb0\xdc\xaa\x43\x92\x02\x39\xc0\x19\x8a\xa6\xa1\x18\x40\xd0\x9e\x3e\xa3\x68\xe1\xc1\xde\xa1\x15\xd9\x23\x69\x41\x6c\x4a\x93\x4c\x06\x30\xc3\xdd\x20\x0b\x68\x10\x0e\xa7\x29\x7b\xc6\x7a\x9e\xc5\x21\xe8\xd2\x1f\xa7\x5b\xc3\x32\x47\x4d\xd9\x02\xb3\xf2\x60\xb8\xf1\x66\x0d\x76\xb9\xe8\xbc\x58\x6e\xc9\xd8\xd5\x34\x0e\xd7\x6d\xd1\x07\x60\x29\xa4\x9e\x2f\x1e\x56\x9b\xcd\x6a\x68\xad\x03\x8d\xf8\xdb\x8a\xc9\xc5\xd0\xd5\x9b\x4c\xea\x00\x94\x21\x90\x4d\x0c\x2b\x38\x3b\x9d\xc6\x2d\xa7\x14\x63\x41\x27\x67\x18\x90\x43\x81\x04\x83\x6c\x4b\x51\xb5\xc3\xfb\x6a\xaf\xcc\x51\x8c\x59\x9d\x0d\x5c\x87\xc2\xc0\x85\x1c\x8c\xd3\x4d\xc5\x0c\x44\x87\xd2\x36\x05\x7f\x16\x61\x3f\x21\xbb\x64\x1e\x44\x45\x25\x68\xe4\x99\xc8\xfc\xb1\xbe\x88\xae\x6c\xe1\xdc\x5a\x64\x8c\x71\xbb\x70\x48\x0c\xcd\xe7\x74\x53\x87\x67\xf4\xd9\x13\x76\x5b\x0b\xd8\x6a\x98\x67\xac\xa2\xd3\x80\xeb\xac\x39\x67\xe4\x09\x8d\xb3\x2a\x06\xc7\x22\x9e\xa9\x70\xe5\x70\xb0\x8f\xf3\xac\x24\x17\x85\x30\xf6\x0a\x68\x2f\x86\xc9\xc2\xcc\x99\x9c\x62\x6c\x42\xf5\xf6\x5d\x27\xf0\xc8\x65\xe5\x0b\x73\x37\xd5\x83\x52\x1e\x34\x0a\x23\xc8\x81\xcf\x23\x75\xb7\xe7\xe1\x39\xc6\xf8\x54\x25\xcf\x7c\xbf\xdf\xab\x03\xa7\xc9\x21\x2e\x55\x24\x46\xaa\x64\xf6\xd0\x1e\x91\x0a\xa4\x5d\xd0\xfb\xe3\x99\x77\x67\xeb\x5c\xa6\x35\xcf\x4c\x9b\x26\x0d\x4d\x2b\xcb\x19\x46\xc4\x00\x13\xa4\x6a\xe1\xb7\xf6\xac\x56\x51\x01\xe3\xa8\x50\xc7\x5d\xfe\xe2\x02\x4c\xc7\xe8\xa9\xcd\x64\x78\x0b\x50\x69\xaf\x6e\xb8\x31\xc2\x25\x84\xd0\x0a\xb6\xc8\x11\x00\x30\x54\x83\x30\xdf\xd3\x91\xc9\xec\x1d\x0e\xec\x1a\xd7\x95\xe8\x10\xd5\x74\x4a\xf2\x76\x8e\x7e\x59\xbb\x41\x2f\x2c\x2c\x2a\x6f\xa3\xc0\x4a\x88\x05\x4d\x75\xa2\xd8\xc8\xb5\xdf\xed\x0e\x79\x25\x0c\xd6\x78\xe6\x7d\xb1\x25\xa0\x0b\x31\xe7\x89\x0e\x39\x6b\x78\x89\xf3\xb4\x1c\xa9\x5d\xd2\x55\x68\x84\xf3\x80\x20\xe0\x2d\x6e\xe6\xa1\x15\xf3\x5b\xd4\x0e\xad\x79\x5d\x6a\x15\x3b\xed\x23\x16\x70\xb2\x2a\xd7\x3c\x9c\xe9\x95\x2c\x96\xbe\xb2\x75\x1f\x5c\x00\x7f\x8c\x63\x32\xf1\x06\x0a\xa2\xa5\x60\x98\xe2\x73\x7b\x19\x5c\x48\xbf\x4c\x2f\x67\x6d\xb7\x1b\x02\x27\xc8\x66\x21\x55\x11\xe1\x36\x4b\x84\xa1\x9e\x12\x15\xb4\x1e\x56\x07\x66\x48\x4e\x12\xba\xf1\x0e\x33\x57\xd3\x64\x81\x0c\xcf\x12\x3c\x9e\x5c\x93\x2a\xaa\xf4\x67\x8c\x9c\x27\x51\x26\x6e\x1c\xa5\x39\xf5\x5c\x89\xd9\x74\x92\xa9\x19\x6b\xea\x49\x7c\x20\x8e\x92\xe9\xbb\x3c\xb1\xaf\xfa\x35\xdd\x1c\xed\xba\x47\x87\xb6\x0d\x24\x91\x53\x5c\x2a\xd9\x89\x00\xcf\x14\xc4\xed\x8c\xcd\x68\x1c\x4e\x92\x1e\xb7\x60\x96\xcc\x7a\xf6\x82\x30\xa4\xef\x47\x87\x32\x55\xdb\x23\xb6\xe1\xe1\x78\x1b\x59\xa1\xd6\x4f\x7b\x09\x02\x84\xd8\x1c\x24\x11\xe4\xb9\x65\xc0\xec\x69\x10\x30\x0c\x3e\x67\x14\xa8\xe6\xc2\xc5\x5e\x6c\x48\xd8\x58\xe5\x23\x97\xe7\x04\x41\xb8\x49\x37\x5f\xed\xfc\x8b\x2f\xd2\xb6\x5d\xad\x98\xf3\x9c\xcd\xb7\x3c\xd3\x9d\xb7\x12\xe5\x50\x70\x4f\xb1\x0e\xe1\x92\x70\xae\xda\xa8\x21\xce\x02\x43\xaf\x08\x4a\xee\x4f\xa7\x55\xeb\xd3\xfc\x45\x40\xa3\x88\xdf\x86\x16\x18\x9b\x0f\x83\xec\x80\x6e\xc0\x60\x43\x8b\x13\xd0\xd0\x19\x3a\x88\x74\xc4\x59\x6a\x9e\x2b\x34\x50\x45\x6c\x27\xa6\xc0\x48\xe6\xec\x7c\x76\xf2\xf0\xd8\x05\x5b\x8f\xf6\x10\xca\xc2\x8b\xcd\xc9\x3d\x8a\xfc\x61\x5d\xd4\x8b\x0a\x5b\x0a\xf1\xd6\x1e\x01\xce\xf3\x08\xeb\x06\xcc\xdf\xd2\x19\xc7\xbb\x0e\xb3\x5d\x23\x64\x07\x4b\xdc\x52\x2d\x94\x9e\x06\x2c\x49\xcb\x18\xbe\x4b\x34\x1a\xb7\xda\x63\xa7\x3a\xdd\x36\x3f\xf2\x2c\x23\x23\x46\xaa\x05\x65\x01\xcf\x1c\x20\x88\x7d\x84\xaf\x0c\x7e\x4c\xdd\x16\xe1\xb2\xed\xc2\xe5\x62\xa7\xcd\xeb\x92\xe1\x66\xf0\x96\xbd\xd0\xbb\x36\x57\x14\x09\x26\x4c\x33\x66\x6b\x92\xe4\x7b\x69\xca\x68\x2c\xab\xc8\x31\x05\x28\xd7\xdc\xcd\x57\xe7\x8c\xf2\xab\xae\x24\x4d\xf4\x08\x2f\x89\x16\xf5\x00\xbd\x1a\x0f\x9a\xad\xb4\x64\x0d\xd5\x70\xb5\x4e\xf9\xd8\xdd\x1c\xce\x58\x40\xe3\xfb\xd9\x76\xe5\xc6\xc9\x7c\x03\xfb\x68\xc9\x0c\x78\x0d\x2d\x2e\x34\xa3\x87\x60\xe1\xf6\x5b\x71\x41\x0b\xce\xd5\xe4\x35\xc6\xd6\x2c\x9a\x4e\x91\xf7\xca\x91\x07\x99\xaf\x8d\x01\xa9\xdc\x44\x0d\x38\x76\xf1\x40\xa9\xb9\x2c\xe1\x97\x78\xe6\xf4\x53\x2d\x13\xb0\x01\x32\xc3\x0d\xda\x5e\x3c\x82\x9c\x2d\xed\x7e\x16\x36\xbb\x8a\xa9\x04\x79\x27\xeb\x78\xd3\x75\x64\x00\x5b\x9b\x00\x6a\x7a\xa2\x9a\x22\xbe\x9e\xf6\xc4\x79\x34\x5f\xab\x8d\x2b\x72\xe7\x20\xf6\xe7\xb6\x19\x43\x6d\x14\x5a\x44\x52\x47\xed\x71\x4f\x85\x49\xa2\x4a\x3c\x3b\xd7\x0c\x21\xc2\x72\x39\x76\xe5\xc6\xdf\xcc\x14\xc2\x08\x19\xc2\x3d\x76\x35\xd9\x2a\x1e\xb1\x8f\x7b\xb3\x43\x2f\x10\x3a\x3f\x10\xa3\x60\xbb\xcd\x0e\x0f\x21\x7e\x3e\xf5\x44\xd8\xac\x17\x0e\xee\x32\xb3\x2d\x44\x71\x54\xef\x2f\x12\x9e\xdc\x48\xab\x52\xe2\x75\x25\x84\x40\x3d\x08\x87\x94\xdc\xef\xb8\xa3\x86\xd4\x97\x12\x4c\x63\xaa\x18\x22\x2e\x42\xb1\x3d\x03\x47\x28\xa6\x8f\xf1\xe1\xa2\xea\x88\x23\x58\x75\x71\x02\xdb\x14\x19\x91\x02\x61\x9f\x07\xfd\x30\x24\x44\xa1\x74\x73\x9a\x48\xed\xf3\xb0\x58\x55\x9d\x4b\x3b\x5c\xbe\x58\x4e\xcf\xb5\x07\x45\xb0\xd6\x94\xb5\xa4\x32\xa9\x7c\x60\x8f\x04\x6a\x6c\x60\xe3\x74\x74\xc6\x4a\xbc\x59\xaf\x98\xf9\xa6\x86\xf8\xf9\x62\xc7\x2e\x4c\x9f\x5a\xc5\x3c\xb0\xab\xfd\x06\x3b\x85\x47\x72\xd1\xd4\xc1\x91\x1c\x28\x8c\x9b\x2a\x39\x08\x4a\xad\x49\x01\x20\x3d\x32\x9f\x13\xe2\x3c\xbb\x5c\x44\x66\x7a\x8a\xe4\x73\x0a\xd5\xdb\xca\x1c\xb3\x55\xdd\x01\x9b\x33\x7a\x3c\xb7\x11\x04\x1b\xb5\xb7\x42\x5a\x62\x4d\x5d\xcc\x0e\x32\x10\xcd\x6a\xa4\x0a\x80\xf9\x1a\x65\x12\x22\x9d\x66\x14\xb2\x26\x76\xd0\x50\x50\x29\xda\xa5\x21\xd4\x3b\xa4\x2c\x67\x4a\x1b\x91\x7d\xef\x62\xd8\x3e\x8c\x6f\x00\xa9\x14\x07\xf1\x0e\xe3\xf9\x29\x1d\xb8\x11\x4a\xd7\x4a\x90\x31\xe4\x4c\x69\x62\xa5\x21\xe2\xca\x01\x3e\x68\xf6\x3d\x0e\x96\xc7\xfd\x82\x3e\x4c\x0f\xd6\x3a\xf0\xf4\x8a\x06\xbe\x2c\x5e\x00\x6c\x0e\x54\xb9\x66\xb6\x74\x40\xe3\x4d\xe4\x3d\xb8\x00\xf7\x94\xf0\x42\x6e\xaf\x3b\x3f\xbe\xc0\xc8\xec\x7c\x8c\x94\xea\x6c\x24\x1b\x1c\x36\xce\x7b\x56\xf6\xa9\x96\x6e\xc0\x61\x55\xd8\x3c\x40\x95\xdc\xe9\x40\x36\xcb\x32\x42\xe8\xba\x33\xa7\xd0\x88\x48\xb4\x0d\x14\xfb\x68\x8c\xa7\xdd\x58\xca\x5a\x6e\x9c\xde\x91\x73\xd6\x59\xbb\x26\x7b\xf0\x01\xee\x79\x0d\x30\x02\xff\x04\x1f\xdc\x25\x7b\xbe\xf0\xa0\x3c\x2e\xa0\x6d\x6c\xae\x2b\x1f\x41\xd5\x85\x82\x9f\xa6\xa4\x5c\xc3\x22\x85\xe3\x54\xa8\x1b\x0e\x35\x43\x67\x91\x32\x8f\x83\xb1\x50\x94\x13\xf2\x11\xf0\x97\x29\x59\xcc\x0e\xe0\x68\x00\xc6\xa0\xb1\x66\x23\xdc\xb4\xc4\x6b\x9d\x98\x3f\xad\x2e\x20\x5a\xad\x17\x83\xdc\x1c\xd7\xe1\xca\x58\xae\x4d\x21\xc3\xc1\xb2\x77\xf5\xf5\x1e\x81\x9a\xb9\x22\xb9\x88\xdb\xad\x16\xd4\x58\xda\x3f\x1c\x8a\xb4\x41\x89\xa4\x59\xed\xe7\x1b\xa9\x1a\xf4\x5d\x78\xd9\xb6\xfe\x56\x3a\xf1\xf3\x15\x7d\xde\xbb\x43\xe2\x2f\xd5\x65\x24\xed\x40\x05\x23\xdd\x16\x1c\xbb\xd0\xc3\x3a\xdf\xf7\x33\x8b\x57\x89\x55\xc6\x2c\x57\xa7\x84\xa4\xed\x73\x3b\x1e\x27\xf4\x4f\x49\x89\x29\x03\xba\x59\x9c\xba\x45\x54\xed\x38\x0e\x59\xe6\x89\x3f\x08\x70\x87\x57\x94\x63\x2e\x56\xcb\x63\xef\x29\xb9\xe9\x0e\xbd\x85\x9f\x9a\x29\x0d\x8e\x92\xbf\x44\xe6\x9e\xac\xc0\x43\x00\xb9\xd8\x92\x3a\x12\x67\x0e\x55\xd4\x31\x14\xd1\x3a\x51\x22\xd5\xac\x86\x01\x85\x93\x64\x8f\xaa\x6b\x33\xc3\x7c\x12\x68\x9d\x9b\xa9\x69\xe0\x51\xa9\xbe\xdd\x0d\x35\x98\x5d\xe6\xca\x19\x1a\x7a\x9c\xb9\xa8\x1d\x33\xf5\x92\xca\x3a\xa4\x8b\x94\x5a\x17\x97\x96\xa2\x2a\x98\x80\xf0\xd1\xda\xc0\x0b\x33\x0d\xd1\x73\x5e\xcc\x78\x03\x9a\x92\xf8\xea\x9c\xca\x3e\x74\x9a\x2e\x7c\x6c\xb9\xb9\x1c\x3b\x08\x73\x52\x03\x3b\x11\x8c\xc7\x97\x86\xb5\xd3\x97\x00\x07\x06\x95\x24\xe7\x3c\x5c\x19\x45\x9e\xe0\x92\xce\x17\x48\x62\xed\x7c\x66\x2c\x4b\x17\x94\xa3\x8a\x2b\x9e\x2c\xf3\x85\xd9\x17\x49\x6a\xc2\x6c\x0f\x4f\x19\x56\xdf\x63\x4c\xb9\x28\xf2\x6a\x88\xd7\x0b\x04\x3a\x75\xf9\x0a\x35\xf7\x38\x7a\xe8\x92\x80\xc3\x45\xa0\xea\xf8\x16\x34\x0b\xbe\xd9\xc7\x65\x48\x8a\xe4\x65\x39\x8c\x27\x86\x28\xab\xd9\x05\xb4\xbf\x14\xf1\x78\xef\x9d\x6b\x6f\x63\x88\x0c\xee\xec\x66\x21\x1a\xad\xa1\xb9\xca\xba\x90\x6d\x9a\x34\xa9\x6c\xbb\x2d\x6e\x70\xeb\xcb\x70\xee\xd0\x60\xde\xd2\x54\x02\x8e\x97\x64\xb6\x71\xfb\xd3\x9e\x84\xc9\xda\x29\xa2\x31\x4f\x51\xb4\x83\xe2\xba\x70\x41\x81\x5c\x3a\xec\x2d\xb2\x76\x7a\x11\x84\x00\x56\xbc\x18\xf7\xb8\x56\x22\x14\x39\x3b\xea\x8a\xc1\xda\x8b\x20\x5b\x2d\xa4\x02\x8e\x40\x6e\x77\x44\x99\x07\xa5\x20\x91\x2e\xcc\xe4\x0b\x20\x60\xcd\x25\x08\x47\x17\x40\x57\x75\x9d\x63\x73\x2c\x0b\x42\x35\x29\xcc\xdc\xf7\xe2\x39\xdf\xcf\x8a\xac\x29\x53\x03\xb7\x1d\xd5\x9f\x77\xf9\xce\x71\x54\xab\xd2\x4c\x0d\xdf\x01\x56\x35\x03\xce\x52\x95\x7c\x11\xb4\x8a\x8e\xe7\xc7\x14\x38\x24\x23\x54\x5b\x78\x2c\xc3\x9c\xfa\x46\x33\xa4\x62\xc9\x03\xd4\x3d\x2e\xd8\x06\xdf\xd6\x8b\x3e\x20\x41\xa1\x47\xc5\x9c\xc1\xe7\xfc\x74\x6b\xd8\x1a\x0c\xd9\x3b\x76\x19\x6c\x10\x37\x89\x2d\x96\xd9\x6e\x94\x20\xba\x0c\x36\xb9\xf1\x45\xb8\x34\xb0\x65\x9c\xcb\xbe\xea\x8c\x5c\xc6\x95\x35\x0e\xa7\xe2\x70\x50\x5b\x9c\x88\x90\x6c\x15\x5e\x2a\x55\x85\xfd\xa4\xa2\x1c\x19\xc7\x53\xd6\xac\x72\xaf\x58\x62\xf5\x41\x8d\x50\x5a\xee\xcb\x2d\x1e\x70\x66\x9e\x34\x90\x8a\xf8\x1d\x57\xf1\x87\x0c\x31\x21\x72\x8a\x6e\x56\x0f\x75\xee\x1d\xb5\x9b\xaf\x49\x9e\xa6\x8a\xad\x0b\x41\x3d\x1c\xcd\x37\xbe\xd1\x49\x53\x4d\x57\xb7\x6d\x02\xc4\x9e\x98\x21\x5b\xd3\xf4\xb3\x7e\x56\xe7\x61\x23\x5b\x4b\x5a\xc0\x59\x86\x5d\x37\x49\x9f\x2d\x02\x72\x27\xf4\xad\x4c\x1d\xc8\x70\x54\x3d\xa6\x77\xa4\x45\xe8\x1e\xf7\x83\x56\x14\x5d\x2a\x1e\x31\xd3\x0f\xca\x75\xb9\x48\x20\xce\xa6\xfd\x7e\xa8\xa6\xd9\x9e\x9c\x29\x50\x85\xb5\x81\xef\x87\xc0\xb9\x08\xe5\x14\x83\xa0\x29\x75\x51\x87\xea\x44\xc0\xa4\xc4\xaf\x24\x8a\x89\xce\x0f\x85\xf3\x33\x82\xed\x95\xc4\x4f\x03\x55\x3d\x3a\x2e\xb2\x9f\xcb\x39\xa6\xe6\x73\x7c\x49\x68\x34\xc0\x12\x8b\x2c\x17\xd3\xf5\x6e\x5a\xd6\xe1\x36\x56\x00\xa1\x72\x73\x66\x1d\xb1\xeb\xa3\x47\x10\x5e\x05\x71\xa0\x43\x57\xc3\x41\x95\x4b\x43\x1d\x9d\xd4\xa2\xce\x59\x81\x2d\xc8\xb9\x12\x08\x32\xc0\xd3\xa9\x34\x80\x6b\xec\x07\xe5\x2b\x90\xf8\x0c\x92\x07\x7a\x74\xf1\xb0\xb9\x59\x88\x21\xa8\x28\xb3\x8e\x28\xc1\x64\xa6\x20\x5b\xc9\xfe\xa5\xd6\x7c\x8f\xcd\x44\x0d\x8b\x4e\x53\x5a\x1a\xc5\xa6\xec\xb5\x40\xc3\xa8\x6d\x41\x9f\x91\x79\x98\xc8\x07\x34\xaf\x28\x15\x5c\x62\x03\x97\xc9\x4a\x97\x09\xb7\x41\x2e\xeb\xa5\xbe\x17\x9b\xa8\xb9\xd4\x09\xe3\x76\x5a\x81\xd6\x32\x9b\x2d\x86\xb2\x66\x60\x56\xe5\xcf\x21\x60\x07\xbb\xc4\xa0\x87\xfa\xe2\xda\x90\x52\x5c\xdf\xa7\x3b\x61\x8f\xb2\x0d\x75\x21\x43\xe6\xbc\x06\xa6\x97\x6e\x34\x07\xee\x76\x30\x1b\x49\x35\xef\x6f\xe3\xd3\x99\xa0\xb1\x8e\x90\x77\xdc\xd0\xe5\x2b\x57\x32\x77\x53\xcb\x08\x5b\xb3\x03\x20\x37\x63\x3d\x7d\x88\xbe\x6a\x58\xe9\x1b\xd9\xc0\xb8\xcc\xc1\xc1\x0c\xe3\xd4\x9e\xf1\x79\xec\x02\xd7\x96\x0a\x04\x3c\xd4\xc2\x28\x8c\xd5\x28\x4c\x61\x88\xb2\xa9\x94\x1c\xd0\xbe\x17\x77\x5b\xde\x5f\x96\xb9\x97\x1c\x37\xb9\x25\x26\xe8\xaa\x47\x88\x78\xb7\x1b\x0f\x3c\xaa\x4b\xc6\x64\x18\xa5\x13\x54\xbc\xb4\x48\xa0\x91\x52\x56\x4b\x73\xc7\xc9\x08\x91\x05\xcc\x8a\xd8\x62\x65\xd5\xaf\xf9\x03\x9a\x4d\xd3\x16\xd2\x36\x2e\x7d\x42\x31\xe0\xcc\x98\xb3\xdf\x08\x30\xec\x4e\x85\x9c\x3e\x9d\x8c\xb2\x5b\x84\xe3\x31\x7f\x78\xa3\xf3\xe1\xa2\x73\xe7\x07\x7c\x2d\xee\x08\xfa\x48\x6f\x13\x86\x2e\x67\xdb\xb5\xeb\x57\x82\xe0\x67\x17\x81\xc5\x36\x2b\x74\x77\x96\x20\x4e\xde\x19\x94\x51\x37\x97\xa4\x37\x70\x53\x50\xd5\x9a\x5f\x0f\x48\x08\x75\xf3\xb5\x73\xf0\x95\x51\x6c\xf8\x03\x41\xcc\x97\x9e\x78\x9c\x25\xdb\xd5\x72\x2d\x27\x45\x31\x2d\x00\x45\x4a\x42\xc7\x88\x32\x90\x4d\xcd\xc5\x40\x28\x32\xa2\xef\x33\xeb\x62\x35\x75\x20\x70\x96\x71\xd2\x37\x31\x3f\x81\x14\xdf\x44\xab\x3a\x6b\xb9\xcb\x5c\xaa\x8a\x87\x8c\x1e\xe3\xcf\x42\xe7\x49\x72\x78\x0c\xf6\x02\xd5\x49\x21\x8c\x27\xac\x1d\x90\x08\xa6\x24\x10\x57\xe5\x7b\x11\xce\x9d\x92\xd7\x2c\x35\x22\xce\x10\x7c\x4a\x07\x1f\x3e\xc0\x59\x1c\x15\x41\x35\x9d\x5b\xab\x59\x9f\x79\x00\xde\x71\x78\x33\x6e\x99\x29\x83\xe4\x84\x94\xec\xe0\x58\x1b\x27\x86\xd5\x04\x55\xe1\xc2\xcc\x40\xb1\xef\x34\x64\x01\xe4\x4d\x4e\xba\x29\x40\x18\xbf\xe1\xe7\x11\xb5\xc3\x37\x0b\xdb\xd8\x1d\xc2\x90\x35\x98\x73\x4d\x32\x6b\x14\xf3\x7d\x9d\xb3\xf2\xab\x90\x8d\x87\x02\x50\x12\xa9\xfb\x30\x8d\x0f\xac\xd0\x6f\x86\x75\xb4\x02\x36\xa6\x2a\x98\x2c\x45\x65\xbc\xae\xdb\xe9\x56\x75\x09\x06\x8f\xa3\x2a\x0f\xa8\xaa\xdd\x4d\x4d\xcb\xe1\x76\xe9\xcc\xdf\xa1\x1a\x4c\x30\x78\x29\x34\xe2\xb1\x95\xb3\x40\xdd\x8f\xd1\x17\x52\xa6\xc3\x7c\x26\x16\x8e\x7b\xd8\xd7\x5a\x25\x6d\x49\xcc\x16\xfc\xd4\x76\xa3\xb3\xa2\x71\xaa\xa9\xfb\x7a\x21\xa5\xf3\x13\x0d\x30\x21\xd3\x30\x67\x4f\x22\x43\x4d\x1f\xd2\x6c\xb7\xda\x83\x13\x0d\xf6\xb4\xbc\x76\x0f\x03\x09\x57\xfd\x28\x36\x6e\xc5\xec\x8a\xb6\xda\x96\xc7\xcc\x21\xb7\x92\x71\xa4\xfa\xe5\xea\xa4\x0e\x8b\xcb\x0a\xd9\x78\x2b\xa3\x9b\x03\xe2\xdc\x24\x36\x02\xd8\x4c\x2f\x90\x1e\xaf\xcb\xce\x0d\x60\x45\x94\x86\xd5\xdc\x48\x76\xb9\xc9\x6c\xe8\xb0\xa6\xcf\x0a\x3e\x56\x38\x2d\x98\x33\xc1\x9e\xdb\x66\xc7\xf5\x3a\x56\xb3\x69\x8e\x27\x71\x80\x01\xd9\xe0\x13\x70\x26\x57\x4b\xd2\x9a\xe3\xd9\xfe\xe2\x95\x84\xd1\xa8\x26\x2d\x1d\xbb\xb0\x40\x0e\x56\xba\x2e\xa1\xcb\x3e\x72\x78\x10\x16\x6d\x3b\xcd\x3b\x8a\xd2\xc7\x53\xf9\xb9\x58\xd8\xf1\x32\xac\xac\x22\xd3\xb4\xda\x3a\x57\xec\x09\x83\xf3\xf0\xd8\xe1\x64\xe8\x06\x17\x3a\x5f\x42\x07\x3a\x6f\xdc\xf4\x54\xad\x7d\x22\x99\xdb\xf0\xaa\x3f\x4e\xfb\x23\x96\x92\xfa\x1c\x3d\xb7\x88\x70\xce\x56\x28\x84\xc0\xfd\x74\x8c\xbe\x06\x67\xbe\xa2\x2e\x4b\x7e\x0f\x31\xc2\xd1\x9c\x9a\x3d\xd6\x32\xe4\xd2\xf3\xf0\xac\xb5\x53\x98\x3a\x0e\xe7\x63\x51\xcf\x9b\x92\xac\xb4\x78\x5b\x1d\xc4\xf5\x9e\xa2\x0f\xb0\x74\x80\x5c\x6f\x98\x57\x2d\xb4\xd9\xae\xcd\x86\x5b\x77\x05\xd2\x8c\x87\x46\xfb\x3a\x92\xaa\xe9\x7c\xee\xec\xab\x95\x87\xd6\xcb\xd9\x9e\x3c\x1e\x3b\x8d\xd1\xd4\x8b\x37\xcb\xa6\xa7\x69\x9a\x1e\x2b\x65\x66\xc6\x65\x17\xd2\x1b\x97\x3b\xef\xf2\xa9\x62\x6a\x41\x26\xed\x2f\x10\x6b\x2f\x0e\xe5\xe1\x1c\x5f\x4e\x60\x20\xc2\x31\x9c\x3b\x21\xeb\xd6\x27\xe6\x40\x9b\x82\x46\x5e\xb8\xc5\xc2\x6a\x50\xaa\x91\x21\x06\x66\xb0\x25\x86\xda\xfc\x6a\xb7\xea\x2a\x1d\x65\x58\x19\x3b\xb7\x36\x12\x57\xb0\x6f\xa3\x86\xcf\x84\x97\x04\x0e\x42\x68\xcf\x24\x18\x94\x2f\xf8\x3c\x84\xc7\xca\x92\x50\x4e\x3b\x0f\x2b\x9a\x29\x1e\x87\xb4\x51\xf7\x50\xd9\xe0\xf9\x56\x37\x1b\xd4\x11\x08\x48\x76\xbc\x06\x5e\x87\x99\x1a\x52\x81\x73\x9c\x21\x25\xad\x5c\x60\x91\x3c\x2a\x6e\xc7\x69\x3b\x6d\x85\x41\x28\xb2\xac\x6b\xf4\x44\xa7\x6d\x32\x66\xa3\x92\xc8\x37\xeb\x16\x46\x2d\x40\x4a\xcc\x59\xb9\xe0\x0b\x06\xd4\xec\xd6\xf5\xa1\x6a\x25\x9c\x77\x89\x4d\x1b\xd8\x51\x43\x36\x8a\x56\x2f\x1b\x4a\xc3\x66\xa8\xc6\x1f\xcd\x9a\xea\x4a\xa6\xe3\xf7\x00\x75\x5b\xdb\xd9\xf6\x16\xa0\x0c\x71\xcc\x02\x36\x3b\x72\x21\x02\x8a\x59\xed\xa3\x8d\xe3\xbb\xe0\x22\x78\x3b\x04\xa7\x62\x79\x7d\x3c\x94\x36\xa1\x66\xa6\x82\xcf\x63\xc6\xeb\x35\x86\xed\xe0\xc3\x86\xe9\x08\xd9\xc1\xb4\x7e\xd0\x04\x65\x23\xfa\x7e\x6b\x87\x4d\xab\x0b\x67\x63\x93\x8e\xaa\x77\xc0\xfa\x64\x87\xc3\xb5\xed\x4c\xb7\xb3\x0e\xe4\xac\x7e\xa1\x79\x45\xb0\x7b\xe7\xdc\x19\xd8\x14\xec\x7c\x4c\xc1\xf7\xeb\xa9\xae\x18\xb9\x05\x8b\x40\x54\x15\xa2\x81\x3d\x7a\x7a\x71\x92\x7c\x81\x09\xf5\x65\xab\xc9\x09\x5c\xce\xb1\x70\x8c\x0f\x97\x9d\x91\xb0\x85\xd1\xed\xf7\xca\x89\xb1\x8e\x55\x85\xa0\x2b\x82\x64\x24\x8d\x37\x28\x55\x64\xc8\x34\x25\x3a\x61\x8b\x75\xd9\x76\x73\x3a\xcd\x36\x87\x69\x7d\x54\x16\x08\x66\x86\x5a\x8d\x4b\x3b\x79\x49\xac\x3b\x1e\x1e\xa4\x7e\x79\x62\xc7\xc3\x29\x90\x30\x6c\x36\xb3\xb3\x2b\x0c\x39\x7a\xcc\x11\x6b\x13\x6a\x5c\xac\xc4\xd6\x45\xa4\xa4\xf5\xe6\x60\x1c\x94\x7c\xdd\xed\x58\xfe\x52\xcd\x6b\xa6\xde\x37\x06\xbd\x98\x9e\x8a\xb6\xdf\xac\x0c\x9a\x11\x45\xf8\xe8\x9c\xd4\x5a\x4a\x22\xd5\x4f\xc7\x52\xd5\x6a\xba\x76\x1b\x25\x9b\x95\xd6\x56\x38\xcf\x40\x8c\xc1\x4a\x0a\x84\x64\x63\x2c\x05\x74\x71\x64\x17\x3c\xa8\xa2\x68\x1d\xd7\x6b\x9b\x17\x12\x7e\x10\x3a\x9a\x34\x6e\xb4\xbc\xb8\x42\x7a\x36\xa4\x65\x86\x2f\x31\x40\x70\x8b\x8e\x18\xc5\xc6\x5b\xbb\x08\xa1\x2d\x17\x82\x8f\xba\x3c\xb7\x55\x9b\x46\x55\x1d\xbc\xa5\x22\xe7\x00\xa0\x43\x87\x4b\xa9\x21\x10\x80\xcd\x00\x0a\xdc\xbd\x74\x99\x59\xe9\x16\x60\x38\x58\x09\x9b\x96\xbe\xbe\x73\xcb\x7e\x3d\xaf\x5c\x1f\x6b\xec\x51\x97\x17\xa5\xb1\x60\x70\x6b\x9e\x40\x6b\x39\x9a\x79\x29\xaf\x88\x30\x0c\x10\x7f\xbb\xc6\x6c\x4e\x70\x70\x2c\xc9\x07\x1f\xc8\xfe\x79\x3e\xe7\x57\x53\x28\xb3\xd8\xd3\x31\x4f\x4e\x12\x5a\x2f\xfa\x0b\xbc\x02\x7a\xa5\x52\x81\xca\x48\xf1\xc5\x1b\x01\x3a\x82\xe3\x7a\x1b\x21\xd7\x68\xd6\xb7\xf4\x74\x41\x59\x5d\xe0\x17\xbb\x53\x10\x25\xc2\xd9\x43\x96\xa9\x99\x48\x97\xfe\x28\xd6\xde\x21\x39\xa9\x68\xaf\x65\x54\x9e\xd8\x3e\x72\x30\x6a\x5e\x9f\x95\xe5\x72\x8a\x7a\xde\x71\x91\x0b\x56\x31\x1a\x58\xff\xa2\xb3\x72\x40\x47\xec\x26\xef\x91\xcd\x4a\x3a\xba\x6e\x5a\x85\xa1\x6e\xe3\x5d\xb3\x6b\x17\x6a\xc8\x6e\xac\x23\x64\x1b\x32\x16\x93\xab\x54\x5b\x08\x86\x87\xb8\xa0\x20\xc0\x0a\x59\x0d\xf1\x66\x5e\x2d\x18\x60\xca\x4c\xc6\xb5\x9b\x51\x53\x98\x84\xae\x91\x72\xbf\xca\x89\x6a\xb5\x9f\x43\xf1\x42\xd7\x18\xc1\xab\xa4\x8e\x5e\x2b\x76\x85\x14\x7e\xd7\x1e\xc3\x65\xc3\x95\x9b\x03\x36\x6d\xd6\xcd\x39\x4b\x64\x8f\x8b\xb3\xd4\xdc\xc2\x52\x22\xc5\x4b\xe0\x1c\x68\x47\x01\x22\xbe\x7e\x38\x3e\x03\x35\x5b\xd2\x5e\x48\x07\x25\x0b\xe6\xcb\x33\x6a\x07\x78\xef\xa0\x81\x8f\x6e\x30\x3f\xdd\xa4\x76\xd5\x1d\x72\x0d\xe3\x16\x28\x59\x9a\x12\x52\x17\x82\x86\x2e\xd6\x9e\xd6\xcf\x8f\x48\x37\x48\x52\x8f\x70\x33\x18\x2d\x66\xc8\x85\x3c\x8e\x45\x8c\x05\xd6\x3a\xe5\x65\xb3\x61\xe6\x5e\xd7\x30\x8b\xc8\x70\xab\xf3\x52\x66\x84\x5e\x5b\x64\xc9\x51\xe8\xf2\x40\x5e\x36\xe7\xcc\x0f\x78\xa2\x83\x49\xd0\x1e\xc9\x36\x93\x7d\xe5\x04\xb8\xf2\x64\xa9\x3c\xd8\x50\xf0\x59\x5c\xb9\xa8\x8b\x3a\x63\x95\x38\x82\xd3\x73\x26\x4e\x37\xf6\x1a\xdd\x87\x1c\xac\x29\x29\xed\xa5\xae\x50\xb8\xe9\xce\x65\x18\x63\xc5\xa1\x06\x0b\xef\xd7\x79\xee\x85\xbd\xed\x39\xbc\x11\xf6\x54\x4e\x5b\x7b\x82\x99\x26\x2a\x9c\xa2\xb9\x1b\xaf\xad\x4d\x3a\xdd\xf7\xec\x43\xdd\xa6\x39\xb7\x2b\x18\x85\x5d\x61\x6d\xb4\xf4\x6e\x96\x94\xeb\x41\xaf\x0c\x2c\x36\x4b\xf3\x92\x28\x32\x67\xa9\xb1\xb8\xdf\x01\x2d\x83\xda\xa4\xaf\x98\x1e\xd7\xe0\x7a\xe7\xb1\x43\xb5\x42\xec\x6c\x0d\xec\x4c\xa6\x57\xb3\xa2\xcc\xe4\x7a\x3c\x75\x25\xaf\x9b\xc5\x72\x75\x18\x2e\xdc\x7a\xb9\xdd\x64\x3d\x8a\x5c\xce\xfa\x2c\x56\x97\x50\xa5\x94\x06\x15\x24\x62\xa1\x9b\xf2\xd6\x95\x13\xb3\xc8\x35\x33\x2e\x34\x94\x19\x9c\x3e\x32\x97\x5e\xab\xe8\x54\xee\xd9\x7a\xa2\x20\xd3\xfa\xbc\xe4\x47\x2e\xaf\x96\x42\xed\xda\xf2\x6e\x39\xf3\x2f\x03\x71\x54\x62\x13\x0e\x38\x72\x23\x6e\x4a\x72\x5b\x96\xdc\xba\x21\x77\x9e\x33\xd3\x9c\xa9\xed\xb0\x4c\x7b\x92\xba\x0b\x3f\xeb\xf2\xb0\xbc\x20\x95\xba\xc8\xf2\x56\x2a\x8c\x1a\x77\x1a\x95\xc3\xe4\xd1\xa7\xb0\x86\x78\x82\xc4\xc1\xa1\x8e\x30\x2e\xed\x61\xc9\x59\xbb\x87\x94\x58\x14\xac\xb9\xca\x22\x8d\xc3\x69\xc3\x5d\x6b\xc8\x0a\x92\x24\x87\xdf\xf8\x00\x78\x9d\x03\x21\x76\xb5\xa3\xa7\xdb\x14\x3f\x4d\x8f\x39\x74\x48\xa8\x8a\xaa\x49\xac\x19\x35\x65\x57\x54\xd5\x3a\x53\x98\xe3\x26\x1e\x54\x0a\x17\xd9\x4d\x09\xc2\xb3\xa4\x6d\x10\xad\x3e\x2b\x3d\x7d\x29\x9a\x22\xe7\x86\xdd\x39\x9d\x52\xcd\xb4\xaf\xb8\x8b\xba\x1b\x76\xc3\xa5\x0f\x9a\x63\x1a\xc9\xfb\xdd\x72\xa9\xa7\x86\x84\x4d\xb9\x74\x74\xf4\xc4\xfe\xe2\xd2\x07\xc8\x35\x87\x1c\x57\x57\xba\xae\x36\x60\x3b\xf4\xdd\xb9\x8d\x0d\x73\xe3\xec\xf4\x64\xee\xd8\x3d\xaf\xe6\x04\xd2\x46\x85\x38\x0c\x91\xd6\x91\x2a\x83\xaf\xb6\x36\x14\x1e\xc5\xd6\x1b\xd0\x93\x6c\xc4\xba\x04\x1b\xe6\xc8\x94\x46\x55\xdb\xc8\xa0\xbb\xf9\x02\x9d\xb2\x5b\x6e\x43\x72\xae\x52\xba\x0a\x4c\xd8\x88\xa2\x6f\x70\x61\x49\x78\x5b\xf9\x12\xd0\x5e\xad\x1f\xb5\x42\x38\xb5\x47\x50\xac\x12\xb8\x35\x36\x7d\x8b\xe9\x53\x64\x2d\xb5\x2c\x7a\xf1\x0f\x73\xc7\x42\x6f\x00\x39\x27\x67\x55\x75\xd5\x91\x12\xa4\x01\x11\x2b\x38\x84\x86\x08\xc9\x9c\x06\x55\x4e\x78\xeb\x19\x69\x70\x95\x58\x99\xda\x4c\xf3\x57\x19\xb7\xe7\xce\x97\xad\xe7\x57\xc7\x7d\x43\x09\x24\x0a\x23\x46\x57\x42\xdb\x35\xe5\x21\x79\x31\x3f\x8d\x06\x96\x39\x99\x89\xd8\x9e\x6d\xda\x36\x97\x60\x3b\x10\xfb\x64\xfc\x0f\xe9\x95\x29\x3d\x5d\xa8\xca\x4a\xb9\xf4\x0e\x42\x03\x00\x00\x7b\x94\x28\x9d\x96\x22\xe3\x28\xc5\x42\xb2\xbf\x98\x3a\x05\x9b\x22\xb8\xf0\x04\x89\xec\x14\x30\xd6\xb1\x77\x0a\xdf\x69\x04\xd9\x0b\x67\xb5\x13\xce\xe0\xb2\x53\x00\x2c\x9c\x41\x27\x58\x72\x84\xfb\x00\x00\x5c\x83\x25\x2d\x80\xcd\x2d\x05\x9b\x4a\x5e\xdb\x88\x94\x9b\x69\x04\xf8\x33\xe8\xf9\x0b\xdc\xf3\x32\xdc\xf1\x9a\xd8\xf3\x44\x36\x86\xc4\x02\x91\x5d\xf6\x38\xdc\xed\x89\xac\xe3\xf7\xb6\xb5\xc6\x6e\xad\x79\x20\xab\x9a\x20\x71\x0b\xdc\x60\x98\xd7\x74\xc7\x9d\x2c\x75\xac\x1a\x72\xad\xda\x7b\xf3\x6e\xf2\xa6\xf6\xfa\x1a\xca\x63\x2b\x4c\x6f\x3f\x89\xd3\x78\xef\x26\x08\x32\x01\x8d\x3f\x41\xe0\xd9\x6a\x02\x2f\xff\x3a\x47\xfe\x8a\xce\x26\x53\x18\x7e\x48\xb3\xbf\x01\xfe\x76\x3f\x40\x9c\xf9\x50\xeb\x95\x55\x98\xa5\xcf\x17\x99\xbd\x5f\x7d\x1f\xa4\xfb\xb8\x5e\xf1\xfb\x05\x5e\xff\x32\x5b\xbe\x02\x98\x1f\xd6\x10\x4d\x02\xe2\x39\x18\x3f\xac\x27\xa5\xd7\xfe\x72\xbb\x20\x7e\x72\x1b\xf3\x09\xdc\x37\xae\xbb\xf6\xfa\x3c\x2b\xeb\xf7\xe7\xea\xa7\x24\x73\x9b\xd8\x7b\x3f\x3e\xb8\x5d\xd8\x73\xfb\x81\xa2\xdb\xb0\x87\x69\xef\x6e\x4f\xe2\xd0\xfe\xeb\xf5\x7f\xb7\x2b\x83\x6e\xbf\xc5\xf5\xef\xd0\xe4\x9f\x3f\xbf\xfb\x09\xfa\xf7\xc9\x6c\x31\xf9\x77\xe8\xe1\xd1\xdb\x4f\x97\x39\xdd\x40\xbf\x9b\x3c\xc0\x7e\x37\xf9\xed\xb7\xce\xb3\x73\xcb\x89\x7e\x2b\xbd\xa2\x09\x4b\xef\xb7\xdf\x7e\x9e\xfc\xd7\x4f\x3f\xfd\xe5\xd3\xdd\xd5\x7f\xf9\xf5\xa7\x9f\x1e\xae\x71\x1a\xef\x56\xfa\x78\xf9\xda\x47\x28\x7f\xf9\xed\x37\xaf\xe2\x6f\xb0\xff\xf2\x6e\xf2\x5f\x93\xd6\x8a\x1b\xef\xaf\x93\xba\x6c\xbc\xdb\xef\x2a\xb5\x56\x39\xe2\xfd\xdb\x6c\xf2\xe1\xde\x9a\x6f\x67\xf0\xc3\xb0\xfe\xeb\xc3\xd0\x87\x61\x9d\x67\xd7\xf5\xe5\xe5\x71\xc8\xa7\x71\x55\xe6\x44\x5e\xfd\xf2\xd0\xd9\xc3\x50\x2f\xf6\x92\xc9\x87\x89\x9b\x39\xcd\xed\x2a\x73\xdf\xab\xc9\xf1\x56\x73\xec\xc2\xb8\x6f\xff\xf2\x78\x57\xff\x5f\x7e\xfe\xf5\xa7\xf0\x34\x79\x7b\x1b\xff\x6f\x1f\xc6\x9b\x73\x3f\xbf\xac\xea\x3a\xf0\xd3\xcd\x54\x7e\x76\x45\xf4\x76\xb7\xc2\x87\x0f\x93\xbf\xdc\xc8\xf0\x97\x4f\xb7\x53\x4d\x26\xe3\xab\x4f\x3f\x67\xf6\xdb\xec\x3d\x7d\xfd\xfb\xb6\xc0\xe3\x75\x53\xb7\xff\x7b\x71\xe5\xdd\x9f\xf8\x40\xb5\xf7\xc7\xfb\x13\x47\xfa\xd7\x79\x45\xa6\x96\x1d\x7b\xee\xe4\xc3\xa4\x0b\x53\x37\xeb\xde\xc7\x99\x63\x5d\x25\x63\xbc\x08\xcc\xc9\xe2\x07\x24\xeb\xbc\xfa\xeb\x5f\x7e\xfd\x38\xb9\x29\xe3\xc9\x87\xc9\xdb\x2f\x60\xfc\xe7\xe4\x4d\x57\x55\x7f\x85\xa0\x37\x93\xbf\x5e\x3f\x5e\x3f\xfd\x3c\x99\x3e\x83\x1c\x64\x55\x7d\xe7\x71\x6e\xd5\xc1\xed\xba\xaf\xe9\x75\xf2\x9b\x4f\x6b\x59\xa5\x5f\xdd\x41\xb0\xf2\xac\xd2\x09\x3e\x0d\x3b\x59\x4e\x9d\x95\x97\x07\x02\x7c\xc6\xe7\xf7\x78\x96\xa6\xe3\x2f\x4a\x52\xe3\x98\xb7\x4d\x19\xbf\xfb\x28\x32\x1f\xb7\x5a\xfd\xfc\x09\x5a\x57\x7f\x02\x34\x8e\xd2\x3d\x5b\x51\x8c\xb7\x37\x6d\x7b\x5c\xec\xdd\x0d\xb9\x77\x93\x91\xa7\x56\x53\x07\xbf\xd5\x59\xe4\xa5\x9f\x01\x72\xe2\xac\xf2\xca\x9b\xb4\x75\xf5\xfb\x2c\xf7\xd2\xc7\x3b\xc6\x1e\x36\x64\xb9\x2e\xd9\x7a\x69\xbd\x0b\xab\xda\x4b\xbd\xf2\xed\x5f\x9a\x34\xce\x2c\xf7\x2f\xef\x3e\xdd\x06\xfe\xf6\x73\xf9\x78\x84\xf8\xe9\xae\xb2\x91\xf5\xef\x6f\x2f\x1e\x9f\x5e\xd5\xec\x9f\x3f\xfd\xfa\xcc\x0c\x2c\xff\x64\x66\x00\xcf\x92\x3c\xab\x6e\x37\x6b\xd3\xe3\x65\xde\x1f\x3e\x21\xf6\x69\xe3\x1f\x9f\x3c\x1b\xff\xf6\x6a\x72\xad\xd2\xb3\xde\x4d\x9c\x4f\xef\xb4\xd0\xeb\xde\x4d\x1e\x55\xf4\x0b\xf5\x0a\xc2\xea\xfd\xe3\x9c\xc9\x87\xc9\xe3\xc7\x5f\xbf\x1c\xf1\x04\xd6\xe4\xc3\x53\xe8\xbf\x3e\x85\x38\x2e\x75\x83\x38\x7e\x7c\x32\x22\xac\x1e\x70\x4f\xfd\xc9\x87\xc9\xc9\x8a\x2b\xef\xd9\x08\x79\xbc\xa8\xff\xb3\x4d\xbe\x30\xf4\x33\x64\x0e\x9f\x46\xfe\xd7\xa4\xaa\xad\xb2\xfe\xeb\xcd\x04\xbd\x9b\x78\xa9\x3b\x7e\x9c\xfc\xf3\x73\xed\x7f\x46\xc2\xcf\xaf\x86\xfd\xf4\xee\x06\xea\xb3\x9b\xff\xbe\x94\xc2\x3b\x5b\xba\xf2\xf5\xdb\x68\xbe\x7f\x84\xfb\x05\x23\xde\xdf\x64\xe3\x7d\xec\xa5\x7e\x1d\x7c\x9d\x15\xb7\x39\x78\x96\xd6\x5e\x7a\x05\xf3\xe6\xcd\x37\x86\x3b\xb1\x55\x55\x57\xed\x1a\x7d\xb6\xe5\xd4\x61\xeb\xbd\x79\x54\x93\x5f\xbf\x87\x24\xe3\xe5\xd3\x5f\xd0\xc4\x6b\x3f\xa7\xca\x55\xa2\x7f\xbb\xdd\xd6\x38\xee\xef\xbb\x76\xe2\xb5\xef\x5d\xab\x7e\x2a\x88\xe3\x9a\x9f\x21\xf8\xe0\x84\xaa\xcf\xf5\xbf\xf2\x6a\x25\x4c\xbc\xac\xa9\xef\xe8\xce\xe3\x9f\xdf\x5e\x64\x89\x97\x5e\x5d\xc0\x6f\xaf\xe1\xc8\x3f\xdf\x4d\xe0\x1f\xa2\xdd\xb8\xc6\x57\x84\xe9\x74\xd5\x99\x70\xf8\x7c\xab\x6f\xaf\x22\xf5\xfa\xd5\x22\xef\xe2\x66\x5d\xfa\x15\xfe\x7c\xbc\xb2\xf2\x73\xc9\xfd\xef\xff\x7e\x59\xfd\x9e\xd2\xf0\xe6\xe8\xdb\xeb\x4a\x78\xe6\x7a\xb7\x3b\x2f\x11\x64\xf3\x74\xd4\xe4\xd3\xd5\xb2\x4f\x94\xf7\x93\x16\x3e\xfe\xb9\x39\xf1\x3b\x60\x67\xcb\x2b\x62\x4f\x1f\xae\xee\x3d\x5c\xff\xee\xf5\x9f\x4f\x7f\x91\x25\x37\x80\x3f\xbf\x04\xf1\x9f\x3f\x7d\x1f\xa5\x6e\xcb\x04\x56\xea\xc6\x1e\x48\x2f\xca\x83\xec\xe1\xe3\x45\x60\x6f\x9f\x2c\x73\x7f\x4b\x9f\x96\x7c\xbc\xf1\xf7\xa3\x1d\x7a\x85\xcc\xdc\xd9\xe2\x17\xf2\xd3\x59\x61\x4d\x65\xe5\xd5\xb9\x65\xbe\xf5\x54\x24\xbe\x53\xdf\x3f\x99\xa2\xd2\x4b\xb2\xd6\x7b\x6a\x8d\x26\xaf\xf7\x15\x4e\xec\x59\xe5\x23\xbd\x1e\x15\xf9\x73\x82\x5d\xe9\xff\x6f\x5f\xc7\x7e\xf2\x7d\x8e\xe7\x71\xc3\xe3\xfd\xf1\xf7\x0d\x78\xd5\xd8\xd5\xed\x3e\xe3\xb7\x5f\xb7\xff\xef\x5e\xf6\x0f\x5e\xea\x3e\xe1\xfb\x17\x0e\xf6\x41\x5a\xca\xb7\x37\x34\x7e\xbe\x27\x07\x77\x44\xfa\x16\x8a\x35\x65\xe9\xa5\x35\xfe\x7c\xcd\x5b\x78\xf6\x5c\x07\x1e\x9c\xe9\x37\x76\xf2\x6c\xda\xcd\xed\x7e\x6d\x7b\x5f\x4e\xf9\xe7\x9d\xcd\xbe\xc0\x90\x2f\x3d\xec\xe4\xb5\x86\xff\x51\x1c\x7e\x7b\xb5\x99\x7b\xfc\xf3\xf2\x8c\xfb\xe2\x71\x4f\x4c\xda\x2c\x74\x27\xf0\xfd\x71\x9f\x63\xf5\x51\xe2\x5f\x42\xe6\x36\xe1\x01\xe8\x5d\x5f\xf5\x49\xf8\xbe\xc6\xea\x47\x01\xfc\xea\x98\xe7\x42\xf8\x91\x5d\x77\x9f\xbe\x60\x45\xff\x70\xb4\xbf\x0b\xa9\xdf\x5e\xa7\x38\xf7\x81\x7c\xe6\xe8\x3f\xbd\x7c\x85\x41\x7d\xc9\x98\xbf\xe8\xfc\x5f\xb6\xa1\xd7\x37\x59\xec\x6a\x57\x2a\xdd\xb7\x37\xdf\x19\x01\xdd\x6c\xe2\xab\xe4\xed\x76\xf9\xb4\xd7\x3d\x2e\x7d\x8f\x6f\xcf\x09\x78\x9d\xe4\x86\xa7\xd3\x98\x3a\xde\xe6\xbe\x2f\xbd\x3c\xb6\x1c\xef\xed\xe3\x3e\xde\x4d\xde\xbc\xb9\x43\xfb\x2b\x66\xd7\xa9\x0f\xf1\xd6\xe4\x6f\x13\xf8\xeb\x3a\xf9\x8c\xab\xd7\xd9\xdf\x66\xea\x0f\xc6\x71\x2f\x06\xa1\x5f\x70\xd5\xcd\xd2\x5a\xf2\x9c\xa6\xac\xbc\xd7\x31\xf8\xc6\x8f\x6f\xb1\x63\xf4\xea\xf7\xec\xfc\x83\x51\xaf\xb2\xf2\x93\x74\x3c\x50\xc5\x1b\xf1\x7b\x5f\x34\x5e\x79\x91\xbd\xd8\xbb\xe6\xeb\x6f\xdf\x7c\x1c\xf0\xcb\x38\xef\xcd\x13\x87\x39\x3e\x7d\x8a\xc1\xc7\x3a\x94\x94\x75\xd5\xab\x97\xba\xcd\xf8\xa5\xcc\xba\xea\x29\xc3\x3f\xe1\xad\x64\xf9\xe4\xc3\x27\xd8\xef\xb3\xd3\xe9\x2a\xc8\x59\x3e\x99\x3e\x8c\xf8\xf4\xe8\x8e\x9b\x78\x1a\x5f\x54\xf5\x25\xbe\x86\xec\xa7\xab\xad\xf9\x62\xfe\xee\xfa\x6c\x3a\x79\x93\xf7\x6f\x5e\x0d\xa7\xbe\x21\xf7\x09\xd1\xef\x9c\x1e\x78\xa1\x1f\x3c\x43\x84\x1e\x9f\x7e\x27\xac\x38\x4c\x3d\xfa\x7b\xe1\xdd\xc8\xfc\x25\x38\x2c\x6b\x52\xf7\x23\x0b\x9f\xae\xe5\x7b\xf5\x6d\xc0\xd5\xd3\xc5\xa1\x77\x13\xe6\xfa\x69\x10\xfa\xa5\x25\xf8\x51\x8a\x3f\x01\xf0\x6a\x52\x3f\x99\xd7\x85\x6e\x1d\x3c\xaf\x4d\x8c\xdb\x7c\x78\xfb\x5a\x58\x9f\xf8\x75\x17\x58\xf0\x0d\xc6\x3d\x25\xc9\x17\x1c\xfb\x1e\x88\x5f\xa6\x10\xff\xf6\x82\x51\x99\x7c\xc5\xe6\x3f\x26\x02\xbf\x7d\x23\x81\x1e\xb3\xcb\xaf\x7a\xba\x57\xa4\xb8\xf7\x02\xf1\xaf\x67\xba\xf7\xa5\xe7\x59\x21\xe3\xae\x8c\x3c\x8e\xfa\x02\xbf\x87\xfd\x3e\x43\xf3\xd7\x9f\xfe\xf9\xf6\xe7\x9f\x7f\xfd\xe9\xa1\x22\xf7\xfe\x5e\xb1\xed\xce\xa4\x9f\x20\xe8\xff\x37\x19\xfb\x1c\xbc\x95\xe7\x61\xea\xab\xd2\xee\xc3\x73\x22\x9c\xab\xf7\x89\x95\x3f\x2b\x31\xae\xfe\x64\x25\x46\xb2\x72\xac\xdc\x93\xbd\xa2\xf1\x52\xc7\xab\x5e\xac\xfc\x3f\xf6\x08\xf0\xc0\x2a\x2b\xaf\x7e\x79\xe0\x63\xd3\x81\xb9\x06\x52\xf4\xe8\x7f\xbf\x51\xb6\xfc\x7c\xe8\xdb\xdf\x5e\xac\x4b\xfe\xf6\x59\x19\xf1\xb7\x2f\xeb\x88\xa3\x58\x7e\x0e\xe7\x33\x21\xb4\x5c\xf7\x8a\xf5\x17\x62\xe7\x04\x56\xf9\x6e\xe2\x64\xae\xf7\xb4\x02\x72\x7d\x33\xf9\xdb\x87\xc9\x9b\xc9\x9b\x7b\xae\xce\x09\x7e\x7b\xb4\x2b\x9d\x73\xfb\xf4\xf6\x06\xe5\xd7\x67\xb1\xd4\x97\x38\xbf\x77\x46\xc2\x4d\xfe\xcf\xff\x99\xdc\x7f\xf3\xf7\xeb\xdf\xff\xb8\x17\xd8\x38\x23\xf6\x5f\x9b\xf6\xb5\x22\xc6\x15\xed\x32\xeb\x9e\x43\xb8\x4c\xa6\xcf\x1e\xd9\xd6\xd3\xb4\xe5\x66\x68\x3e\x6e\xfb\x39\xfa\xfd\x4b\x19\xd5\x93\x71\x57\xa3\x57\x5d\xdd\xc8\xdb\x32\xeb\x7e\xfe\xfb\x53\x28\x93\x5f\x26\xb3\xbb\xbb\x9f\x7c\x11\x0b\x7d\x1f\xbc\xbf\x23\x2f\x82\xfc\x61\x2c\x91\x7f\xfc\xfc\x22\xc0\xc9\x33\x59\x7d\x15\xc0\xbf\xcf\xfe\x31\x99\x7e\xb8\xf1\xf9\x0f\xcc\xab\x7e\x84\x5e\x3f\x86\xc8\x13\x58\xa3\x53\x91\xae\x99\xcd\x53\xf2\x5e\xbe\x19\x85\x4f\xee\x44\xb5\xcf\x47\xdd\xe1\x5c\x7f\x0d\x0b\x1f\xc5\xf4\x97\xc9\xec\xaa\xc4\x4f\x55\x26\x8b\xab\x57\x4a\x6b\x57\x5a\xb9\x55\x5e\x7d\x31\xff\xc4\x48\x7c\x65\xe3\xfd\xe4\xc3\x4b\xc9\xfc\x53\x3a\x4c\xa7\x2f\x27\xfd\xcf\xd4\xf4\x6f\x4f\xa7\x57\x4e\x99\xc5\x31\x96\xd5\x75\x96\x7c\x4d\xc0\x9f\x42\xfa\xe5\x97\xfb\xab\xde\x19\x3b\x2e\xf1\x79\x91\xf9\xe9\x9f\x3f\x56\x28\x9f\x09\xca\xfb\xb0\xd2\x4b\x2b\xcf\x6f\x1d\xd8\xe7\xc5\x9d\x97\xb1\x78\xfe\xe4\x2b\x38\x8d\x26\xff\xd1\xa6\x7f\xf8\x30\x41\x5e\xd6\xee\x7b\x62\xf9\x7c\xc1\x2f\xff\xf5\x3b\x0d\xef\x93\x51\x61\x5a\x79\x65\xfd\x92\x44\x9e\xb2\x72\xf2\xf6\x6a\xed\x93\xac\xbd\xd5\x14\xe0\x5f\x1f\x3e\xfe\xc7\x47\xcd\xf8\x75\x32\x9d\xde\x9e\xbd\x24\x36\x37\x6f\x71\x2b\xc0\xba\xcf\x11\x7f\x99\x5d\x2f\xec\xe8\xe7\xf7\x79\x96\x3f\xcd\x12\x3e\xdf\xe0\xc3\x52\x7f\x47\xfe\x71\xa3\x3e\xfc\x22\xf1\x9f\x3b\x9e\xaf\x1b\xb4\xab\xae\xdf\x8c\xeb\x1f\x0f\xf1\x11\x59\xe4\x3b\x54\xef\x95\xa0\x27\x1f\x26\xcf\xde\x35\x25\xa8\xeb\xf2\xdd\x35\x22\x79\x37\x99\xfd\xe3\x77\x18\xe6\x2f\x91\x78\x5f\xe5\x71\xe8\x3c\x33\xd1\xfd\xbb\x09\xfc\xee\x9b\x58\x7c\x47\x35\xe5\xbb\xa9\xd1\x7f\x95\x0c\x0f\xa1\xdb\x83\x3c\xff\xe3\x4e\xb6\xf5\x19\xa4\xa7\x66\xf6\xc7\x3d\xd5\x1d\x43\xf1\x52\x67\xe8\x8f\xd9\xe7\x9b\x37\xef\x26\xf0\x1d\x6e\x7f\x6b\x8b\x4f\xfb\x4d\x0f\xc9\xd0\x0b\xc1\xb1\xed\xc5\xf1\x0f\x54\x1f\xef\x05\x64\x6d\x58\x35\x56\x8c\x79\x71\xfc\xfa\x2a\xd5\x13\x10\x8f\xe5\xa2\x31\xa9\xb3\xb3\xd2\xf5\x4a\x3c\x8b\x6f\x35\xac\x37\x5d\x10\xd6\xde\x9b\x6f\x57\x35\xbf\xcc\x70\x5f\x09\xfc\xcd\x2d\xd5\x9d\xc1\x4f\x6a\x5e\x4f\x40\xe4\x59\x2e\xa4\xf7\x76\xf8\x64\xdc\x29\x73\x9a\x2f\x3a\x74\xaf\x61\xc5\x55\x58\x28\xcf\x7b\xb9\x13\x7c\x2f\xab\xc8\x6e\xb7\xae\x92\xd9\xb7\x30\x7a\x12\x9a\xbc\xc8\x81\x2f\x02\x93\xdf\x1f\x8c\x7c\x2b\x00\xb9\x1f\x74\xdc\x6d\x5c\xdd\x0d\xf9\x5e\x17\xe3\x3d\x9d\xf6\x39\x16\xaf\xe1\x8c\x63\x95\x65\x68\xf9\x9e\x34\x0a\xd6\x57\xeb\x17\x77\x49\xfe\x0d\x1d\xb4\x9c\xa8\xca\x2d\xc7\xfb\x1e\xce\xf7\xf7\xca\xe0\xbf\x77\xa3\xb5\x65\x7f\xcf\xee\x9e\x3c\x4a\xbd\xbe\x96\xeb\x4f\xfe\xfe\xeb\x6b\x55\x41\x78\xaa\x85\xe6\x1b\xa7\x68\x3e\x93\x0d\xaf\xf6\x77\x5e\xeb\xc5\x6f\x67\xaf\x87\xcf\xbc\x9a\x5b\x9f\xc0\xc3\xaf\x02\x3f\x86\x62\xb7\x72\xc8\x17\x4b\xe4\x56\x69\x25\xd5\x53\x2b\x7a\x7b\xfa\xee\x1a\x0d\xbe\x9b\x9c\xaf\xde\xeb\x13\x5f\x6e\xaf\x26\x1f\xc6\xbf\xab\xbf\x7f\x6e\xf2\xaf\x6c\x1f\x5f\xff\xc7\x64\xf6\x65\x5c\xfa\x38\x6b\xf6\x69\xf4\x0f\x86\x9a\xe7\xe7\x93\xfa\x4f\x6f\x9d\xe0\x8e\x8f\xf2\x4a\xab\xf2\xae\x5e\xea\xed\xcf\x77\xc2\x92\x2e\x08\x63\xef\x01\xf1\x5f\x7e\xb9\x86\x59\xe7\xc9\x7f\xfc\x80\x9a\xde\x8f\x56\xce\xd3\xe9\x2d\x40\x71\x82\x7b\xb5\xe7\x17\x67\x3f\x09\x43\x5f\xa5\xf5\xb7\x8a\xb3\x9a\xbf\x96\xbd\xaf\xe1\xe1\x93\x1d\xdf\xe1\xe2\xcb\x96\x79\xf2\xcb\xc3\x02\xdf\x30\xd0\xff\xf1\x4d\xbb\x70\xb9\xe7\x0c\x5e\x43\x0c\xe2\xe9\x09\xa2\x7f\x25\x39\xa6\xaf\x23\xc7\x73\x17\x51\x66\xdd\xb7\x64\xef\xf2\x5c\x29\xae\xb3\x26\xbf\xdc\xc7\xed\x5f\xe9\x9b\x6e\x8c\xa1\xb2\xb2\xb3\x4a\xf7\x4f\xc2\x9b\xfe\x75\xbc\xf9\x51\x12\xdd\xa9\x85\x8e\xf9\xd3\x33\xdc\x5e\x43\x3a\xcc\x72\xa2\x7f\x25\xed\xfe\x47\x65\xe7\x2e\xf9\x5e\x65\x47\xfa\x57\xd8\x91\xbb\x41\xe5\x6b\x68\xbe\xf7\xfa\x7a\x17\xa6\xde\x9f\x44\x5e\xff\x54\xb6\xe4\x9b\x51\xe4\x2b\xe8\x7b\x28\x3d\xc7\x73\xc3\xd4\xff\x53\x11\xf9\x7f\xd6\x7f\xfd\x51\xb4\xbb\x86\x74\xc0\xae\xb2\xb8\xa9\xff\x2c\xa4\xeb\x1f\xe1\x7f\x92\x99\xd7\x68\xd9\xdd\x86\xeb\xfd\x5d\xdc\x02\x53\x27\x8b\x9f\x46\x93\x1f\x77\xf5\xa5\xb4\x7e\xdc\x59\xf5\xf1\x4c\xce\x9d\x82\xc8\xed\x1b\x32\x8f\x20\x66\xff\x78\x49\xe0\xef\x54\x67\xc7\x99\x77\x59\x7c\x2b\x1a\x66\xdd\x3d\x29\x19\x51\xbe\x3b\xeb\xe3\x41\xe2\xeb\x98\xd7\x69\xf1\xdd\x70\xfa\x5b\x41\xc0\x15\xf1\x3b\x98\x7d\x65\x3f\x1f\x31\xbb\x8e\x79\x9d\xd9\x1f\xa1\xbd\xd2\x05\x4e\xee\x8b\xd3\x17\xbc\xbe\xa3\x5e\x65\xd6\xbd\x5e\xd0\x1e\xa2\x0f\xe5\x49\xf6\xf8\x4a\x85\x99\xfc\xf7\x7f\x7f\x8e\xf6\x97\xe9\xc3\xf7\xc7\x02\x4f\xb3\xd0\xc9\x2b\x3d\xd3\x2d\xa9\x61\x52\x22\xac\xf2\xd8\xba\xbc\x62\x23\xe7\xcf\x4a\x51\x5d\x58\x3b\xc1\xe3\xc0\xbf\xc3\xcf\xba\x8e\x8e\x55\x79\x13\xf8\xaf\x5f\x3c\xbb\xb3\x9d\x1b\x0e\x52\xe8\x07\xcf\x0a\xec\xfd\xbb\x67\x5c\xba\x53\x82\xbd\x93\xcb\x5d\x13\xc0\xd9\xf3\x91\xb7\x5e\xc1\xaf\xf7\x32\xb3\xab\x88\xff\x3a\x39\x4f\xa7\xaf\x6c\x7a\xdd\x70\xbe\xfa\x99\xb7\xe7\x57\x35\xf7\xec\xd2\xb3\xa2\x5f\x9f\x53\x67\xf6\x3a\xea\xec\xbc\xd3\x1f\x48\x9c\xe7\xa3\x1e\xc4\xef\xfc\x5c\xf4\xfe\x87\xf7\x8f\x3c\xdf\xff\x1d\x8c\x6f\xdc\xf9\x1a\xd2\xbf\x1f\xe5\x97\x10\x44\x9f\x23\x78\x55\x83\x87\xf2\x9f\xe5\x44\x72\x38\x78\x2f\xf5\x8c\x1e\xdc\xc4\x2f\xaf\xdb\xcf\xd5\x1e\x3e\x81\xfb\x95\x43\x9f\x77\x17\xac\xcb\x30\x91\x6b\xab\xac\x9f\x00\x7a\xa1\x17\x75\xaf\x46\x32\xf9\x30\xe1\xad\x3a\x78\x9f\x58\xfd\xb3\x28\xe5\xf6\xfe\x97\x27\x9b\xff\xf2\xac\xd4\xd7\xc0\xbb\x61\x95\x7f\x0d\xfc\xed\xfd\xeb\xc0\x7f\x53\xc2\xbe\xc3\xf8\xbd\x22\x5c\xfc\xb3\x98\xba\x7f\x99\x19\xf9\x0e\xfd\x7d\x51\xed\xbe\x7f\x99\xd7\x30\x71\x2c\x49\x5e\x17\xf8\xee\x92\xe4\x0f\x94\x23\xbf\x27\x9e\xfd\xe3\x4a\x93\x8f\x01\xd8\x73\x4b\xf2\x79\x1b\xe2\x75\x20\xee\x2f\x3f\xf9\x65\x72\xfe\xd2\x67\x7e\x3d\x22\x79\xf1\x10\xd1\x83\xc9\xfb\xf0\xe1\x05\x93\x98\x58\xfd\xee\x36\xe4\xd5\x8d\xc4\x4f\x36\x6d\x76\x47\x62\xee\x6d\xe6\xde\x81\x8f\x7b\xb6\xe6\xde\xb8\x32\xeb\xee\x3d\x3e\x3f\x7d\xf8\x8a\x4e\xef\x43\xed\xf6\x26\x6b\xf0\x33\x2d\xb3\x63\x2b\x8d\x46\xbd\x28\x1b\xef\xe7\xd7\xd4\x75\x1f\x8b\xc1\xef\x26\xb3\xbb\xcd\xa2\x1f\xeb\xf3\xbe\x7e\xd6\x17\x3d\xaf\xd7\x04\xca\xae\x17\x7b\xb5\xf7\xff\xe9\xe6\xef\xd7\xcd\xff\x27\xf4\x72\xf2\xcb\x87\x7b\x51\xf9\xfd\x30\xe0\xd9\xd0\xd7\x6b\xdc\xcd\x92\xfd\xb1\x3a\x77\x13\xca\xff\xab\xb4\xee\x47\x9a\x74\x3f\xd4\xa1\xfb\x5f\x50\xbb\xdf\xdd\x8f\xfb\xa1\xa6\xdb\xf3\x40\xe9\xa9\xa0\x7f\xa3\xfb\xd6\x54\xc1\xdb\x2f\x3a\x76\xaf\x89\x67\x46\x76\xff\x58\x03\xee\xf7\x14\x15\xbe\x10\xf7\xbb\xda\xfb\x8c\x4b\x23\xaa\x4a\x96\xbf\x92\x32\x3f\x00\x7c\x14\xfb\xaf\xeb\xf2\xcf\xbf\x53\x2d\x3f\x6e\xe3\x7f\x47\x3d\xc7\x09\x3f\xda\x54\xfc\x97\xb0\xf8\x91\x0b\xff\x53\x5c\xbe\x89\xd0\xff\x43\x2c\xbe\x99\xa6\xff\xcd\x53\x12\xff\x9a\xd0\xe7\xcf\x78\x62\xe2\xef\xe7\xe9\xf4\x1f\x93\x0f\x5f\x90\xf1\xfb\xdb\xa2\x7f\x8e\xa2\x6e\x5e\x7a\xed\x8f\x14\x75\x9d\xc0\x2a\x0f\x59\xf5\xe7\xef\xe7\x4c\xfe\x9c\x2d\x72\xfa\xb1\x87\x24\x79\xb1\x55\x87\xed\x9f\x87\x82\xff\x57\x9c\x30\x28\xbd\xdc\xb3\xea\x8f\xdd\xd8\xab\x1d\xb4\x9c\xda\x2b\x7f\x58\xa3\xde\x4d\xe2\xb1\x44\xf7\xa2\xe6\xbf\xce\xd9\x5c\x7e\x7e\x37\x1a\xaa\xeb\xc4\xfb\xdf\x05\xba\xae\xf7\xf4\x8d\xeb\x9d\x5e\x38\x8b\xfe\x75\x05\xbf\xbb\xca\x8f\x59\xa7\xca\x4b\x5d\xc2\x6b\x43\xe7\x66\x4e\x43\xbb\xa9\xbf\x99\x51\x7f\xea\x56\x5e\xc9\x78\xa7\x90\xfc\xf2\xf9\xe4\x7b\xe7\x9c\xf3\xd2\x3b\x85\xcf\xbe\xf5\x76\xef\xdb\x1a\xd5\xdb\x37\xb7\xaf\xaf\xbf\xf9\xf9\xe3\xef\x28\x7d\xf9\xb6\xec\xdb\xfa\x97\x26\x0d\x9d\xcc\xf5\x5e\x1c\x54\x39\xa5\xe7\xa5\x6f\x7e\x7e\x45\x3a\x7a\x25\xce\xdb\x67\x5f\xe9\x7c\x8f\xc3\xef\x49\x19\x9f\x4c\x27\x6f\xfe\xfe\x9f\xb3\x5f\x11\xe7\xe9\x77\xee\x5f\xf8\xd1\xa5\x3b\xb8\xc4\x61\xda\xf4\x7f\x14\x2a\xcb\xaf\x20\x72\xa7\x41\x7a\x97\x0d\xb7\x34\xfe\xcd\xdf\x9e\x7d\x57\xf3\xeb\xec\xf8\x43\xf0\xff\x1b\xfc\x2b\xb2\x5a\xfe\x0a\xff\x0e\x72\x7e\xc9\xff\x3f\x06\xab\xf5\xe2\xd7\xcd\xe2\x77\x61\xf5\x9d\x4c\xfe\xa4\x5a\xd3\xc9\x9b\xdf\xb1\xec\x1f\x2a\xe7\x7f\x5b\xa3\xbf\xce\x61\x18\x46\xbf\x4a\x89\xd7\x1e\xcb\xff\xf3\x85\x10\x97\x57\x87\x10\xff\xf3\xa7\x96\xbe\x4e\x3f\xed\x4f\x1a\x42\xfc\xa9\x0e\x7d\xfd\x0b\x0f\x90\xd2\xda\x2b\xcf\x09\x7d\xe9\x46\xef\x9f\x48\xbf\xbd\xfa\x70\xff\xa8\xd0\xdf\x67\x2f\xcf\x9a\x3d\x99\xf5\x92\xb4\xdf\x3f\x8a\xf4\x2f\x61\xd9\x4b\x31\xfd\xf3\xa3\x4e\x7f\xc2\xc0\xb4\xb6\x6c\x3c\xf6\xac\x1f\x0a\x44\xef\xea\xe2\x87\xe7\x51\xd5\x58\x7c\x7d\x8a\x6f\x6d\xd9\xd5\xf3\x2f\xc2\xdd\x23\xf0\x47\x5f\xf1\x80\xc1\x87\x0f\x13\xf4\x1b\xf4\xb9\x02\x9f\x7c\x98\xfc\xd7\x3f\xbf\x37\xa6\xbc\x7d\xa7\xf6\xd5\xf2\xff\xe9\x87\xa8\x9e\x59\xa0\x8f\xdf\xc1\x0d\xc7\xef\xdf\x86\x93\xff\x98\x7c\x31\xe9\xd7\x49\x78\xff\x68\xcd\x6d\x2b\x0f\x98\xbc\xfd\xfb\x03\xb5\xc3\x7f\x3c\xfd\xa6\xe5\x3f\xff\xf0\xc8\xf5\x9b\x1d\xfd\xc9\x63\x8b\x7b\xfe\xbc\xc5\x7d\x87\x09\x9f\xbe\xa4\xfc\xd5\x2f\x6e\xdf\xe9\xa3\x7f\x5c\x08\xb9\x73\x7e\xe0\x85\x39\x3f\x1a\x32\xfe\xe7\xb3\x90\xf1\xf5\x74\xb8\x73\xc6\xe0\x0e\x1d\xac\x3c\x8f\xc3\xf1\x07\xb9\xf1\x8f\x3f\xc4\xf5\x63\xe4\x78\xd5\x7a\x95\x57\xfb\x0f\x3f\xcf\xf2\x16\x7e\xf7\xd9\x2f\xb5\xbc\x27\x48\x0a\xa8\x3b\xe5\x37\x9c\x06\x92\x4c\x2a\xaf\x3b\xa3\xf2\x39\xb8\xd9\x1f\x0b\x0e\xf9\x63\xc1\xa1\x3f\x00\xee\x6b\xe4\xbe\x73\xd0\xe9\x1e\x06\x56\xeb\xb9\xf8\xd5\xfa\xde\xb5\xc9\xaf\xda\x45\xe9\x55\xe1\xe0\xbd\x9d\xa1\xc8\xb3\x8a\xef\xcd\x61\x7d\x3f\xee\xcb\x57\xe1\x9e\x95\xa1\xff\xff\x67\xef\xdd\xdf\xda\xc8\x91\x05\xd0\x9f\x37\x7f\x85\xc2\xce\xc6\x76\x30\xc6\x36\x6f\x88\x93\x63\x1b\x33\xe1\x0c\x79\x5c\x60\x5e\x17\x38\x3e\x8d\x5b\xb6\x7b\x62\xba\x3d\xdd\xed\x00\x9b\xb0\x7f\xfb\xfd\xf4\x6c\xbd\xbb\xdb\x90\x99\xb9\x7b\x96\xef\x9b\x09\xa8\xa5\xaa\x52\xa9\x54\x2a\x49\x55\xa5\x20\x7c\xd4\x14\xdd\x29\x84\x48\x4e\xa3\xb1\x34\xb2\x96\x65\x06\x38\x39\x51\x8c\x15\xb3\x68\x52\xad\x9c\xc1\x38\xf0\x66\x60\x1e\xc5\x29\x88\xd1\x86\x22\x49\xa1\x0f\x84\x09\x0c\x3e\xc1\xfb\xb9\xe7\x37\x4c\xe9\x09\x0d\x40\x85\x96\x3f\xe0\x86\xce\x9e\x2b\x8d\x3f\x07\xf0\x16\x3f\x6f\x91\xdc\x87\xa3\x33\x7c\xe0\xde\x8d\xa1\x67\xcb\xa2\xe0\xe2\xc1\x9e\xce\x02\xc2\xcf\x66\xd3\xa0\x61\xd9\x27\x03\xb3\xd9\xa7\x62\x53\xe3\xae\xd5\x7c\x17\x2d\xb0\x03\x9d\x60\x15\x76\x3a\x60\xaf\x18\x03\xd2\x76\xd3\x02\x00\x11\x5e\x08\x46\x18\xc5\x37\xde\x4c\x07\xf2\xba\x38\x88\x1b\xd4\x18\x3f\x3f\x90\x94\x19\x3e\x16\x66\xae\xa4\x56\x87\xf8\x25\x88\x35\x0c\x74\x0d\x62\xa8\x05\x85\x29\xc1\x69\x13\x83\x28\x7c\xe7\x85\xde\x04\xc6\x0d\x3f\x48\x10\x2c\x9b\x40\x98\x04\xbc\x17\xe0\xcc\x7d\x20\x8d\x00\xa6\x00\x10\x0a\xac\xf2\xec\x9c\x8c\xcd\x66\x31\x43\x00\xed\xd2\x8f\xa2\xd1\xc2\xcd\xbe\x1c\x54\x5b\x85\x50\x2d\xd2\x31\x1b\xeb\xa5\x31\x15\xd3\x17\xc9\x24\x7e\x2c\xa6\x56\xc1\x3e\xc5\x77\x9f\xd3\xc7\xe1\x6a\x17\xc3\x44\x6e\x7c\xde\x06\xbe\x0f\x73\x72\x17\xbb\x3b\xb6\x69\xd0\x37\x80\x47\xdd\x68\x0d\x36\x0d\x6b\x08\x83\x64\x59\x5e\x4c\x56\x2d\x99\xea\xae\x5c\x2c\x38\x61\x2d\xae\x65\x4c\x65\x2d\xfe\xe0\x83\xf4\x7d\xe3\xf1\xba\x9e\xcc\x5a\xfc\xc1\x07\xed\x5a\x43\x5c\x9a\xd3\xd0\x0f\x92\xb9\xde\x10\x95\xba\x1b\xde\x69\x8d\xee\x72\x30\xe9\x58\xdc\x0d\xf8\x5d\xb1\xd6\x30\xbb\xac\x2e\x00\x80\x5c\x17\x5b\x60\xd0\x0b\x75\x27\x18\xb4\xad\xd3\x9a\xa3\x42\x6b\xab\x07\xb3\xf8\x02\xa3\x09\x06\xb5\x3c\xa6\x8e\xfa\x25\x57\x67\x03\x04\x2e\x89\xe4\x97\xc2\xed\x92\x69\x74\x4b\x36\x12\x36\x64\xe6\x24\x40\x05\x36\x4d\x79\xb7\x58\x7f\x9d\x0d\x32\xa7\xe5\xdf\x67\x8b\xbc\xa4\xba\xfd\xb7\xdd\x23\x2f\xc9\x0f\x8b\x69\x6a\x4c\x9a\x83\x36\x6d\xc8\x9a\xdc\x68\x1b\xb2\x80\xf1\x8d\x5d\x89\xf4\x5e\x74\x23\x67\x83\x54\x66\x77\x67\x9e\xc4\xe6\xc3\x34\x8e\xe0\x0f\xd9\x28\x2e\x39\x30\x4b\xee\x14\x97\xb5\x42\xbe\xf5\x56\x11\xcf\x00\x64\x4b\x5f\x7b\xa3\x4f\xc8\xa0\xa6\xfa\xfc\xf1\x3b\x44\x47\x8f\xff\x9d\xb7\x88\x25\xba\x2d\x6e\x0c\x8b\x37\x93\xf7\x82\xc5\xdb\xc9\x1b\xc0\xe2\xed\xf4\x1d\x20\x7b\xd1\xe6\x09\x37\x81\x04\xd4\x32\x23\xbe\xd4\xfe\x6d\xe9\x3d\x41\xf9\x0d\xdc\xf2\xa8\x4a\xef\xe0\x96\x46\xb5\xcc\x16\x6e\xd9\x75\x7e\xa9\x3d\xdc\xb2\x7b\xd3\x3f\x66\x0b\x57\x7a\x07\x67\xda\x8f\x19\x42\xbf\x31\x1c\xf2\xb5\xb0\x59\xcd\x42\x3d\xcd\xb0\x0c\x79\x59\x5d\xb0\x68\x5c\xa7\x05\x16\xfa\x5a\x18\x96\x29\xb4\x9d\xc0\xb9\x2b\x4e\x8f\x9d\x96\xe2\xdb\x0e\xb6\xd5\xb3\xc2\xe2\x35\x4a\xc2\x24\x5b\xbf\x1c\xb0\x6a\xd0\x50\x0e\x64\x7a\x03\x68\x86\x88\x3e\x2e\xb1\x4d\x5b\xcc\x4a\x6c\xd2\x54\x3d\x9d\xc0\xb4\xb7\x18\x8f\x61\x6c\x0c\x46\x2a\xbe\x6b\x8c\xe1\x38\x86\xc9\xb4\xaa\xfb\x86\xb3\x4b\xea\x3f\x72\x0f\xfb\xa7\xed\x45\x47\x53\x2f\x5e\xc2\xf1\x4f\x0c\xfa\x6a\x21\x9b\x5f\x3e\x56\xce\x4b\x38\x43\x93\xb2\xea\x82\x45\x1d\x22\x0f\x0a\xee\x38\xd1\xbe\x37\xcb\x89\x42\x89\xaa\x93\xad\x70\x1d\x8c\x67\xde\xc4\x74\x9b\x44\x91\xbf\x7e\x0d\x5a\xbb\x75\x30\x9e\x80\x8e\xbe\xa5\xc9\xea\xec\xd5\xc0\x0b\xd0\xbc\x6b\x8d\xc7\x75\x70\x3d\xb1\x83\xe3\x95\x84\x69\x4b\xb3\x42\xa0\x3d\xf9\xcc\xb8\x0f\x9f\x67\x87\xe9\x81\x92\x9b\x16\x33\x1b\xbc\xee\x80\x8d\x26\x66\x30\x78\xd5\x01\x1b\x3b\xc6\x3c\xd5\x88\xaa\x39\x58\x03\x1b\x4d\xd7\xc6\x3d\xbb\xff\x47\x50\x37\x33\xa8\x9b\x46\xa8\xd7\x0c\xea\x66\x09\xa8\x7b\x19\xd4\x3d\x23\xd4\x39\x58\xed\x80\x5d\x5d\xc4\x79\x1f\xf6\x4a\x60\x6b\x35\x33\x74\xad\x66\x29\x7c\xbc\x77\x2d\xf5\xf6\xc2\x8a\xd0\x28\xd8\x98\x76\xb3\x9c\x51\x59\x26\x72\x66\xe9\xb1\x2a\x77\x42\x9b\x4c\xee\x2c\xd4\x5b\x9a\x1a\x1b\x39\x3b\xa5\x9d\x29\x65\x9d\xfa\x9a\x13\x2b\xa9\x40\xda\x74\x42\x6a\x97\x80\xb4\xe5\x84\xb4\x59\x02\x92\x79\xca\x30\x48\xbb\x25\x20\x19\x9f\x3e\xcd\xf8\xb4\x5d\x02\x54\xdb\x98\xed\x9a\xc0\x7a\xd1\x01\xff\x2a\xc3\xf4\xb6\x83\xeb\x08\x56\x19\xb6\xb7\x1d\x7c\x47\xb0\xca\x30\xbe\xed\xe0\x3c\x82\x55\x86\xf5\x6d\x07\xef\x31\xbf\xca\x30\x7f\xc3\xf8\x86\xee\xb2\xf3\xd1\x3d\x21\x8c\xa8\x9e\x76\xfa\x6e\x18\x79\x23\xf8\x09\x06\x60\x15\xb4\x72\x52\xec\x07\x48\x4f\xb6\xcd\xa6\xc7\xd8\x40\xee\x8d\x97\x8e\xa6\x38\xdb\x37\xc7\x72\x85\x69\xc7\x2b\xa0\x84\xd7\x50\xda\x66\xa5\x8e\x97\x0c\x10\xd6\x4e\x07\xac\xb5\xec\x0f\x48\x60\xc2\x2c\x2a\xd2\xd5\x29\xcb\x8b\x16\x66\x96\x19\x67\x44\x1e\xcb\xa4\x75\x9d\xf6\xd5\xc1\x5c\x83\xa5\xef\xca\xfe\xaf\x0a\xd9\xb7\x16\x00\x93\xbc\x7e\x7b\x01\xb8\xce\x17\x80\xeb\x7f\x03\x01\xb8\x7e\xbc\x00\xb4\x9a\x66\xbb\xe4\x4f\xb6\x30\x72\xc3\x0e\x60\x1c\x47\x71\xb5\xf2\x63\xf8\x29\x8c\x6e\x43\x70\xf6\xfd\x29\xf0\xd8\x5e\x64\x1f\xfc\xc3\x6f\x54\xea\x60\x5e\x20\xa4\xc5\xba\xbb\xa8\x92\x15\xe2\xd5\x2b\xfc\x6e\xf9\x57\xac\x54\x5e\xbd\x42\x1d\xff\x0a\xae\x27\x07\x05\xf6\x47\x3e\x0e\x8d\x3a\x4b\xbd\x74\x51\x64\x77\xf4\xd4\xd7\x5f\xc5\xce\xaa\xf2\xc3\x37\x9a\xe1\x32\x9e\x29\x05\xcf\xff\x72\xb1\x57\xac\x13\x78\xd5\xe0\x6c\xbe\xaa\xfa\xb4\xcb\x0d\x2a\x07\x65\xc0\xdd\xe5\x82\x3b\x2d\xc1\x99\x3f\xe3\xe2\xef\xa9\x06\xe1\xcd\xbf\xcd\x28\x00\x7e\x28\x6a\x99\x1e\xcb\x1c\xff\x3a\xdb\x58\xc6\xc0\xd5\x66\xcb\x72\x6f\xf3\xe8\x13\x9b\x24\x1a\xa7\xa7\x30\x81\x69\x8e\x3a\x2a\xe5\x93\x54\xe2\x3e\xbd\xc4\x8d\x66\x39\xe7\xd5\xf2\x37\x7a\xe5\x8f\xe1\xca\x5f\x97\x3b\x4e\x6f\x9b\x39\xb5\x6c\xe7\xb1\x7a\x14\xcc\xd2\xc7\x63\xf9\x67\xdc\xf7\x4e\x42\xd9\x2b\x9a\xea\xa9\xac\x52\x6d\x32\x83\x9f\xe1\xac\x08\x24\xb4\x48\x5e\x20\x58\x57\x45\x56\xd7\x04\xa6\x84\xef\x67\xe9\xfd\x6c\xa9\x40\x36\xf0\x0a\xb4\xc0\x1b\xd0\x02\xfb\xa6\x80\x1a\x49\xcb\x1a\x13\x2b\x2a\x6e\x15\x05\x33\x0f\x26\x30\xfd\x30\xc7\x4f\xcd\x56\x46\x19\xfd\x95\x3a\xa8\x5c\xcf\xa2\xd1\x27\x93\x2e\x2b\x98\x05\xd4\xe6\xf4\x52\x98\x80\x45\xe8\xc3\x78\x16\x84\xb0\x0c\x11\x5b\x06\x22\x0c\x3a\xaf\x38\x17\xbc\xb8\x00\x7a\xf9\x1c\x37\x48\x7a\xb3\x20\xfc\x14\x84\x13\x1e\x8a\xf9\x0f\xd0\x26\xf6\xad\x7d\xa2\xa9\x24\x60\x18\x95\xba\x00\xad\x58\xe6\x1c\x98\x12\x85\x71\x0a\x27\xc5\x22\xf7\xcc\x86\x9e\xd4\x65\xf5\xdc\xda\xa1\x4a\xaa\x72\x5a\x82\x9a\x53\x3d\x28\xda\x45\x08\x07\xcc\x0e\xe2\x5b\x57\xe0\x95\x59\xf1\xbc\x11\xaa\x68\x4e\x80\x24\xac\xcf\x85\xfc\xce\xa9\x05\xee\x8b\xbe\xd1\x94\x78\x9f\x61\xa6\x72\x8b\x2f\x63\xd8\x43\xe7\x17\x67\xc2\x18\x53\x8b\x5f\xad\xb9\x8a\x73\x5d\xf5\xd2\x28\x5e\x8a\x52\x83\x2e\xa6\xc4\x7f\xfd\x9a\xc3\x41\x73\x0f\xb2\x66\x94\x66\xfa\x2e\x9b\x48\xba\xfa\x08\xb7\xf2\x6a\xb4\x5c\x15\xcd\x3a\xfa\xe8\xb2\xfc\xa2\x74\x34\x4f\x79\xcf\xf0\x23\xd5\x1f\xde\xf5\x8e\xdf\x1f\xbf\xff\x1e\x29\x77\x4e\xf8\x45\xf3\xae\xb9\xd1\x6c\xd6\x01\xfa\x77\xfb\xe8\xaa\x8e\x4b\x36\x77\x37\x70\xc9\xe6\xee\x36\x2f\xd9\xa5\x25\x7b\x57\x75\xa9\xf5\xd6\x5e\x0b\x7f\xd9\xea\x1d\xd2\xba\x5b\xbd\x23\x5a\xc2\xe0\x6d\xf5\x69\x9d\x7e\x5b\x6d\xdd\xdf\xa4\x5f\xb6\x78\xdd\x1d\x5a\xb2\x43\x4b\xb6\x29\x7d\xdb\xcd\x0d\xa5\xf5\x76\x8b\x7e\x69\xb1\xd6\xdb\x9b\x3d\x52\xb2\x35\x60\x25\x3b\xb4\xce\x4e\x53\x6d\x7d\xb8\x4d\xbe\x0c\x36\x59\xdd\xc1\x0e\x2d\xd9\xe5\x25\x5d\x5a\x72\xa8\xb4\xde\x69\x92\x5e\xee\x34\x59\x2f\x77\x5a\xa4\x97\x3b\xad\x16\x2b\xd9\x20\xb8\x77\x36\xbb\x6a\xeb\x2e\xc1\xbd\xd3\x6b\xb2\xba\x03\x42\xf9\xce\xd1\x06\x2d\xd9\x6b\x12\x78\x7b\x4d\x95\x6b\x7b\x1b\x7d\xf2\x65\xa3\xcf\xea\x6e\xd2\xba\x9b\xbb\xbc\xe4\x90\x96\xa8\x94\xef\x6d\xd1\xba\x5b\xac\xdf\x7b\xdb\x6d\x52\xb2\xcd\x71\xef\xd2\x3a\xbb\x2d\xb5\x75\x8f\xe2\xee\x71\xdc\x74\x74\xf7\xfa\x1c\x5e\x9f\xe2\xee\x6b\xb8\x07\x14\xd3\x80\x61\xea\xd2\x5e\x76\x51\x2f\x49\x09\xed\x5d\x17\xf5\x4e\x6a\xdd\xa5\xbd\xec\x6e\xf2\xba\x9b\x3b\xb4\x64\x97\x97\xf4\x68\x89\x8a\xbb\x4b\x25\xa1\xbb\xc3\xc6\xa7\x4b\x7b\xd9\xdd\xe5\xf0\x68\xef\xba\x3d\x0d\x37\xed\x65\x97\x4b\x6a\x97\x4a\x6a\xb7\xcf\x71\xd3\x7e\x77\xb5\x7e\x77\x69\xbf\xbb\xbc\xdf\x3d\xda\xef\x5e\x93\x51\xd3\xa3\xfd\xee\x69\xfd\xee\x6d\x1c\xd1\x2f\x4c\xd6\x7a\x94\x13\xbd\x4d\x0e\x8f\x8e\x77\x4f\xeb\x77\x6f\x8b\xc8\x5a\x6f\x8b\xcd\xe6\xde\x2e\xa1\xa6\xc7\xfb\xdd\xeb\x13\xde\xf4\xfa\xea\x2c\xe9\xd1\x3e\xf5\xfa\x6c\x7e\xf7\x37\x06\xb8\xa4\xbf\xc9\x64\xb7\xbf\xb9\x4d\x4b\x76\x95\xd6\xfd\xcd\x2e\xfd\xc2\x5b\x6f\x6d\x91\x12\x4e\x4d\x9f\xf2\xbc\xaf\xf1\xbc\x4f\x35\x49\x9f\x6b\x92\x7e\x9f\x62\xea\xf3\xd6\x7d\xda\x5a\xe3\x79\x9f\xf2\xbc\xcf\x79\x7e\x48\xb9\x76\xb8\x99\x95\x1c\xd2\x12\xb5\xf5\x61\x9f\x50\x7e\xd8\xef\xb2\xba\x87\x04\xde\xe1\xe1\x26\x2f\xd9\xa6\x25\xdb\x4a\xeb\xc1\x06\xc1\x34\xd8\x60\xa3\x3b\xd8\xd8\xa4\x25\x0c\xde\x80\xca\xee\x60\x73\xa0\xb6\xee\xd1\xd6\x3d\xde\xba\x47\x5b\xf7\xf6\x78\x49\x8f\x96\xa8\x5c\x1b\xf4\x89\xae\x1e\xf0\x11\x3b\x6a\x91\x92\xa3\x16\x6b\x7d\xb4\x41\x46\xe1\x68\x63\x4b\x69\x7d\xb4\xb1\x43\xbf\xec\xf0\xba\x7b\xb4\x84\xb7\xde\x21\xf4\x1d\xed\xa8\x94\x1f\xed\x12\x39\x3a\xda\x65\x3c\x3a\xda\xdd\xa6\x25\x1c\xde\x1e\xad\xb3\xb7\xa3\xb6\xde\xa3\x98\xb8\x6e\x39\xa2\xe3\x7d\xc4\xc6\xbb\xd5\x6c\xe3\x11\x6b\x35\x37\x14\x49\x6d\x35\x37\xda\xf4\x4b\x9b\xd5\xdd\xd8\xa6\x25\x3b\xbc\x64\x8f\x96\xec\xa9\xad\xb7\x76\xc9\x97\x2d\xda\xcb\x56\x6b\x1b\xd3\xd9\x6a\x1d\x51\xe9\x6b\x6d\x6c\x61\x79\x44\xff\x2a\xad\x77\x5a\x04\xf7\x4e\x8b\xf6\xbb\xb5\x43\xa9\xd9\xd9\xe0\x25\x5b\xb4\x64\x6b\x43\x6d\xbd\x43\xbf\xec\x6c\xb0\xba\x64\xbc\x5b\x3b\xbd\x2d\x5e\xb2\x43\x4b\x0e\xd5\xd6\x84\x47\xe8\x5f\x56\xb7\x4f\x7a\xb9\x73\xc8\xe1\x1d\x1e\xd2\x12\xb5\xf5\x6e\x13\xcb\x51\x6b\xb7\x49\xa5\xa5\xb5\xdb\x25\xad\x77\xbb\x8c\x13\x7b\x6d\xc2\x89\xbd\xb6\xb2\x12\xb5\xf6\xda\x3b\xf4\xcb\x2e\xab\x4b\xfb\xbd\xc7\x47\x61\x8f\xf2\x7c\x6f\xa3\xa7\xb4\xee\xb6\x48\xeb\x6e\x8b\xb5\xee\x91\xb5\xbe\xd5\x6b\x32\xca\x7b\x64\xde\xa0\x7f\x95\xd6\x3d\x3a\xba\x3d\x36\xa3\x5a\x54\x83\xb6\x7a\x6c\x5d\x6c\xf5\x36\x09\x35\xbd\x4d\x95\xf2\xde\x36\xe9\x77\x8f\xf3\xfc\x90\xe8\xc0\x16\x9f\xf1\xad\xc3\xa3\x01\x29\x39\x52\xc6\xbb\xdd\x24\x5c\x6b\x37\xd9\xea\xdf\x6e\xb6\xbb\xa4\xa4\x3d\x60\x25\x44\x7e\xda\xcd\xed\x0d\xb5\xf5\x36\xad\xbb\xcd\x5b\x1f\xd2\xba\x03\x5a\xb2\x41\xe1\x6d\x34\xdb\x0a\xee\x8d\x26\x99\x25\x1b\xcd\x3d\x4a\x67\x77\xb7\x89\x39\x81\xfe\xe5\x25\x3d\x5a\xa2\xf0\xbc\xbb\xdb\xde\x22\x5f\xda\xb4\xee\x51\xaf\x85\x7b\x89\xfe\xa5\x25\x03\x32\x0a\x47\x83\xa6\x82\xfb\x68\xd0\xa6\x5f\xda\x1b\xac\xee\xd1\x11\x29\x61\xb3\xe4\xe8\xe8\x08\xd3\x77\x74\x74\xa4\x8e\x37\x5b\xec\xd1\x2f\x8c\xeb\xcd\x6e\x73\x8b\x95\x6d\x67\x65\x7d\x56\xa6\xce\xb4\x66\x77\x83\x4e\xd4\x2e\x1f\xf7\x66\x97\x2c\x90\xf8\x17\x36\x76\xad\x6d\x22\x5c\x87\xad\x6d\x75\xae\x1f\xb6\x76\x36\xe8\x37\xb6\x02\xa2\x5f\xb7\x58\x59\x8f\x97\x75\xbb\xb4\xac\xab\xce\x9b\xc3\x36\x15\xad\xc3\xf6\x26\x9d\xe1\x83\x66\x93\xf4\x0f\xff\xc2\xcb\x08\xcb\x06\xcd\xe6\x8e\xd2\x97\x41\xb3\xd5\xa4\xdf\x5a\x83\x23\xf2\x28\x3b\x3d\xf8\xe0\x76\xfc\x75\x90\x40\x2f\x1e\x4d\xab\x8b\x91\x76\x90\x72\x13\x84\xf2\x46\x0e\x17\x7a\x68\xd3\xc2\xad\xfd\xec\x91\x91\x96\x52\x2f\xf0\x0f\xa4\xcd\xf0\x62\x94\x80\x57\x59\xc3\x8b\xe6\x15\xdd\xc9\xa2\x0f\xaf\x85\x0f\x37\xde\xdd\xd5\x45\xeb\xca\xb4\x4f\x56\x0f\xde\x68\x06\x3c\x44\xd3\xeb\x0e\xa2\x57\x3d\xbf\xb9\x09\x7c\xf6\xe4\xc7\x78\x16\x45\x71\xb5\x8a\x3a\xb5\x8a\x7a\x51\x03\xeb\xa0\x6d\x78\x70\x5c\x23\x27\xf0\x75\x72\x08\x6c\xc4\x1e\x84\x41\x7b\xed\x87\x9f\xf7\xab\x9d\xc6\xc0\x9a\x26\x60\x98\xad\x08\xd8\x9a\x09\x98\x56\x9f\xf2\x43\x3e\x1d\x15\xb2\xac\x6a\xec\x7a\x90\xc7\x9d\xee\xe9\xd4\x61\x67\x34\x13\x3f\x26\xd3\x08\xa0\x7d\x5f\x23\x5c\xcc\x4c\x83\xbb\xd1\x46\xe3\x49\x38\xd8\x01\xcd\xbb\x9d\x31\x78\xf1\x02\x90\x6f\xcd\x3b\xaf\x59\xb3\x43\x1c\x45\x61\x1a\x47\x0a\x54\x49\x38\x8d\x6d\x9b\x72\x83\x20\xf9\x39\xf0\x21\xa9\x6e\xcc\x37\x28\x5e\xc5\x6a\xdc\x6a\x19\x39\x25\xc0\x14\x40\xd2\x26\x59\x5f\x5b\xd4\xd1\x8c\xb0\x82\x94\x6c\x8d\xc1\xd7\xaf\x12\x15\x9c\xb7\x77\xed\x8d\xf6\x9e\xf3\xab\xa7\x7e\xcd\x70\xb5\xe1\x6e\x93\x73\x16\x15\x78\x9b\x23\xce\xea\xe7\x18\xc0\x46\x73\x63\x5c\xb3\x43\xf0\x46\x4d\x19\x82\xbf\xe3\x6d\x38\xea\x8f\xf7\x94\xfa\x63\x6f\xec\x82\x3f\x86\x2d\xa5\x3e\x6c\xed\x39\xeb\x6f\xa8\xf5\xb7\x9d\xf0\xc7\x2a\x3d\xe3\xed\xa6\xb3\x3e\x54\xeb\xc3\x6d\x47\xfd\x76\xb3\xa9\x20\x68\x8f\xc7\x63\xdf\xd1\x62\x43\x6b\xb1\x81\x5b\xb0\xdc\xd1\x0f\xe2\x71\x0c\x9d\x7d\x07\xcf\x1e\x6a\xd5\x2f\x20\x5c\xcc\xf6\xf1\xf3\xca\x64\x0e\xec\x83\x26\x78\xa8\x1d\x3c\x7b\xb6\xbe\xfe\x77\x90\x44\x8b\x78\x04\xdf\x79\xf3\x79\x10\x4e\x7e\x3c\x3d\xe9\x48\x87\x50\xbf\x25\x8d\x1b\x6f\xfe\xec\xd9\xb3\xf5\x97\x2f\x5f\xae\x83\x87\x5a\xfd\xd9\xfa\x4b\xd0\xda\x05\x2f\xd7\x69\x11\x3f\xb1\xa9\xde\x44\xfe\x62\x06\xeb\x80\x1e\xfb\xd4\xc1\x70\x78\x0b\xaf\xe7\xde\xe8\xd3\x30\x86\xbf\x2f\x82\x18\x0e\x87\x48\xc2\x9f\xad\x2c\x12\x08\x92\x34\x0e\x46\xe9\xca\xc1\xb3\x67\x1f\xae\x7f\x83\xa3\xb4\xe1\xc3\x71\x10\xc2\x8f\x71\x34\x87\x71\x7a\x5f\xe5\x50\x56\x86\x43\x98\xbc\xc3\xb0\x57\xea\xe0\x0b\xf8\xec\xcd\x16\x70\x1f\x2b\x26\xdc\x0b\xb4\x16\x1c\xbf\xff\xa9\x7b\x72\x7c\x38\x3c\x39\x7e\xff\xc3\xb0\x7f\xd2\x3d\x3b\x03\x1d\x40\xf2\x42\xae\x05\xe1\x67\x6f\x16\xf8\x6b\xf8\x4c\x96\x54\xc7\x47\x6b\xa3\x68\xd6\x9f\x79\x24\x8a\xa3\x52\x9d\xa6\xe9\x3c\x79\xb3\x7f\x79\xb9\x7e\x79\xb9\x5e\xa3\xf5\xfc\xe8\xc6\x0b\x42\x9e\xe0\xf5\x0c\xdf\x51\x54\x2e\x2e\x2f\x7d\x6f\xed\x9f\x97\x97\x8d\xb5\xab\x55\x5a\x33\x84\x13\x2f\x85\xfe\xa1\xb9\xc1\xff\x18\x5a\x10\xd8\xbd\xc8\xbf\x17\xa8\xa8\x80\x55\x13\xd2\x55\x50\x61\x24\xa5\x33\x5f\xa8\x7f\x41\xa0\x5e\x7d\x69\xd7\xb7\x1f\x58\x95\x60\x2e\xd4\xa8\x5e\x5e\xfa\x5f\x5a\xf5\x8d\x87\xcb\xcb\x46\xed\x0b\xfa\x87\xfc\xc9\x2a\xcf\xa2\x91\x37\x7b\x1b\x25\xa9\xd0\x06\x97\x4d\xa3\x24\x65\x95\xd0\x48\x08\xdf\xf7\x09\x90\x2d\x0e\x64\x2a\xb7\x17\xba\x21\xf4\x6f\x15\x54\x2e\x2f\x1b\xe8\x53\xd6\x07\xd4\xb1\xaf\xa8\x88\xd3\xbc\x0a\x2a\xb8\x40\xa5\x0b\xb3\x00\xac\x8a\xa4\xac\x82\xca\x1b\x46\xa0\x97\x4e\x05\x02\x2e\x2f\xd7\x2f\xf0\x48\xde\x5e\x5e\x36\x2e\x2f\xd7\xfe\xf1\xaf\xab\x97\xb5\x97\xb4\xee\xef\x0b\x18\xdf\x9f\xa5\x71\x10\x4e\xde\x7a\xc9\xf4\x28\xf6\x26\x37\x30\x4c\xb5\x41\x6b\xae\xed\x61\x00\x17\x97\x97\x57\x97\x97\xd5\xcb\xcb\x1a\x06\xf9\xe6\xf2\xf2\xf9\xdf\xff\xeb\xbb\x7f\xbc\xb8\xac\xbc\x5c\xad\xef\x1f\xfc\xeb\xf2\xb2\x43\xb0\x5c\x19\x30\x48\x44\xbd\x41\x1d\x28\x82\x1e\x75\x96\x75\x6d\x2a\x56\xca\xa0\xfd\x7d\x19\x58\x54\x4a\x3f\x22\x6e\x19\x64\x54\x60\x18\x17\xd3\x6b\x51\x40\xa7\xe2\x78\x08\x3c\x5f\x35\x74\x79\xd5\x40\x39\x01\x99\xa4\x5e\x8c\x71\x56\xdf\xec\xff\x0f\x1e\x6c\xfb\xec\x41\xd4\x57\x29\x29\x30\x44\xa6\x56\xa5\x56\xfd\x4e\x6c\xa4\x75\x46\x98\x2c\x44\xc7\xfc\x18\xcf\x4e\xe1\x04\x22\xf3\x27\x84\xb7\xe0\x14\x4e\x06\x77\xf3\x2a\xa1\x62\x55\xd5\x05\xab\x62\x8f\x57\x11\x4e\xaa\x62\xde\xfe\xfa\x71\x70\x7a\x3e\xf8\xe5\x9c\x28\x99\x77\xdd\xf3\xfe\xdb\xc1\xe9\xf0\xf8\x90\x58\xb0\xa8\xca\x49\x10\x7e\x0a\xc6\x01\x8c\xe5\x83\x6c\xb6\xaa\xf3\x12\x5e\xaf\xaa\x9f\xdc\x87\xe4\x11\xe5\x4f\xef\xbc\x74\x34\x85\xf1\x31\xea\xb2\x15\xb5\x7a\x7e\x1f\x47\xb7\xe7\xc1\x0d\x8c\x16\xe9\xb1\x8f\xef\x40\xaf\xd4\x1a\xb3\x0c\xb4\xb1\x42\x0c\x27\x41\x92\xc2\x58\x20\xa1\x2a\x73\xb1\x8e\x2f\x69\x91\x22\xc6\xce\x77\xc7\xa1\x0f\xef\xf6\x41\x0b\xab\xe2\x6c\x19\xe2\x5d\x14\xae\x31\xbc\x34\xf5\x46\xd3\xf3\xe8\x10\x5f\x18\x65\xfc\xf1\xa3\xd1\x02\xc9\x08\x7e\x23\xc0\x70\x99\xc1\xbe\x83\x0e\x60\xbf\x1a\x3a\x9e\x90\xf7\x4d\x13\xe9\x72\xc2\x44\x06\xbe\x91\x1b\xdf\x9f\xe2\x67\x02\x32\x2a\xe2\xe8\x16\xf7\xc5\xe2\x4c\xc5\x30\x17\xcf\x32\x8d\xb5\x35\x1b\x0d\x7e\x9f\x22\x0d\xd1\x05\x43\xaa\xa4\x5f\xe4\xcd\xb4\xdb\xe2\x19\xf4\x62\xda\x5e\xa8\x65\x42\xef\x44\x07\x3a\x20\x81\x29\x07\xc4\x45\x83\xf0\xa5\x71\x1d\x84\x3e\x2e\xc5\x43\x42\xd8\x52\x17\x98\x79\x7e\xfc\x6e\x30\xec\x0d\x8e\x3e\x9c\x0e\xb0\x48\x1e\x1f\xfd\x5a\xcb\xe5\x7b\x02\xd3\xb7\xf7\x68\x6d\xa7\x12\x9e\x5d\x08\x65\x83\x30\x25\x65\xba\x0c\x88\x72\x7b\x61\x9d\x0f\x57\x8d\x29\x07\x3a\x65\x17\x4c\x25\xc8\xfa\x09\x19\x0a\xc4\x11\xc3\x9b\xcd\x70\x28\xb8\x48\xdd\x88\x16\x2e\x4f\xde\x67\x13\x02\x06\x36\x97\x54\xc3\xe4\x94\x45\x98\xcc\x4f\xda\xf3\x3a\xda\xf7\x04\x51\xa8\x6d\xbf\x68\x31\xde\x08\x7c\x8e\x02\x1f\xc7\x93\x00\x5e\x0a\xbe\x3c\x1c\x18\x93\xd8\xea\xaa\x09\xed\x04\xec\x7a\xf1\xc5\x0b\xf0\xdc\x30\xa0\x84\x6b\x71\x74\x8b\xb5\xf1\x80\x78\x5f\xb2\x71\xbb\x59\x24\x29\xb8\x86\x80\x18\x83\x7e\xc5\x28\xda\xe4\x94\x80\xf5\x5f\x49\x11\xee\xef\xdb\x34\xe9\xea\x6a\x5d\x99\xba\x13\xa4\xba\x08\xd7\xa4\x2f\x94\x9a\x7d\xce\x4a\x79\xcb\x2f\xe8\x3d\xca\xb5\x46\x56\x26\xd7\xd5\x07\x3c\x6b\xa3\x7f\x93\xdb\xce\xe3\x20\x8a\x83\xf4\x3e\x6b\xc1\x4a\xf0\x2d\x6c\xc6\x18\x55\x1b\x7a\xbe\x2f\x74\xfc\x3c\x3a\x09\x92\xb4\x4a\x19\x26\x30\x94\x6e\x15\xe8\x87\x06\x3b\x4e\x71\x08\xa0\x11\xb2\x24\x82\x0c\x8b\xd1\x4f\x41\x9c\x25\x62\xec\x9e\x25\x50\x4f\xaa\x8e\x1f\x9b\xd2\xfb\x00\x9c\x2a\x58\x4a\x4b\x63\xa7\x61\x0d\xb4\x0e\x40\x80\x77\x59\x07\x20\x30\x3f\x3a\xc7\xb8\xc4\x87\xe0\x95\x09\xe2\x45\x70\xc5\x6b\xd8\x33\x9e\x4b\x34\xd0\xe7\x84\x02\xfe\xa6\x9b\xb9\x93\xa6\x8e\x02\xa7\x27\xb2\x09\x4b\xd3\x80\xc1\x31\xde\x3e\xcc\x53\x39\x37\x6c\x72\x89\xbd\x95\xd8\xde\x22\x91\x87\x56\xee\x1b\x23\x12\xcd\x32\x83\xb8\x1b\xf8\x58\x64\x8c\x78\x0b\x70\x59\x7f\xe3\x09\xd8\xce\xba\x6c\xdc\x35\x9c\x7c\x39\x66\x4c\x09\x6b\x83\x3e\xd9\x2f\x9a\x0a\x56\x0b\xe1\x79\x1c\xdd\x96\x34\x45\xe0\x5d\x4a\x4c\xa4\x06\xfa\xb5\x1f\x85\xa9\x64\x48\x99\x52\x38\x95\x1b\x34\x59\x2d\x1b\x87\xef\x40\x6b\x80\x2a\x0c\x48\x6a\x8d\x2c\x7a\xd1\x8f\x4e\x38\xdb\xc8\xd3\x84\xe6\x49\x81\x38\x21\x02\xc8\x32\x54\x19\x43\x11\xc4\x79\xac\x2b\x5f\x5b\x80\x05\xa2\x72\x38\x8b\xa2\xf9\xb0\x25\x0d\xe1\x6f\x79\xc9\xe9\x68\xc6\x10\xf2\x1e\x0b\xa7\xf1\xe2\xb7\x2b\xb3\x8f\x31\x60\x4b\x8b\x91\xba\x2a\xcb\x3f\x22\x0c\x5e\x9d\xa1\xa8\x0b\x64\x05\x09\xb6\x62\x5c\xc4\x31\x5e\x3c\x2f\x58\x17\xe0\x33\x62\x53\x02\x4c\xfd\xdc\xc5\x11\x6d\x0e\xac\x01\xe4\xf8\x8b\x2d\xe4\xdc\x12\xb1\xc4\xc4\xf5\x37\x22\xae\xbf\x81\x57\xc0\x20\x0a\xce\x37\xef\xd1\x0f\x1d\x59\xe3\x9b\xe9\x66\x82\xf5\x92\x22\x7a\xd9\xa5\x23\x44\x71\x57\xb5\x44\x26\xfa\xaa\xa6\x80\xc9\x62\x96\x2a\x7b\x38\xe2\xc2\xf8\x36\x4d\xe7\xb2\xc2\xce\xd6\x78\xac\x3d\x0b\x6c\x28\x49\x76\x45\x1f\xd2\x6d\x55\x63\x34\x0d\x66\xfe\x7b\x54\xa0\xde\xd6\xa4\xf8\xc9\x21\x45\xaf\x10\x83\x88\xcf\x36\x6c\x63\xd5\x14\x15\x46\x9a\x7e\xfd\x4a\x60\x38\x0d\x02\xaa\x73\x49\x9f\x6d\x1a\x6e\x11\x07\xac\xab\x17\x88\xb1\xd1\x98\xf7\x3b\x33\xcf\xb0\xcd\x5a\x09\x17\x37\xd7\x30\xae\x80\x37\xa0\x09\xf6\x0d\xb5\x14\x96\xc6\xd1\x2d\x7e\x09\x96\x40\xa0\x38\x1a\x01\xfe\x6b\x15\xe1\x65\xd2\xe6\xd4\xa6\x98\x9d\x79\x0a\x34\x24\x4e\xe9\xb8\xae\x51\x61\x92\x0b\x0b\x46\x09\xaa\x27\xf1\x1d\x13\xf5\x61\x5c\x5d\xc4\x81\x41\x59\x8a\x8d\x5f\x5b\x02\xc9\x15\xad\xcc\x95\xf2\x28\x86\x5e\x0a\xbb\xe1\x68\x1a\xc5\xf4\x1b\xc2\xc2\x05\xb4\xc1\xf7\x1d\x9a\x04\x1a\xe6\x16\xa2\x46\x23\x5e\x10\x81\x8c\xa9\xd6\xc0\x37\x06\x01\xfd\xef\xfc\x7e\x0e\xcd\x8f\x09\x88\x3f\x74\x5d\x85\xf3\x99\x37\x82\x48\x98\x31\x80\xba\xd8\xdd\x52\x89\x2f\x2c\x01\x66\x22\x27\xb3\x45\x00\xa1\xb2\x2b\x47\xd4\x1b\xa6\x63\x51\xcd\xf7\xde\x0d\xe9\x50\xa5\xab\x85\xed\xa8\x3f\x96\xd9\x51\xac\x0f\x40\x50\xee\x41\x18\xc2\xf8\xed\xf9\xbb\x13\xd0\x01\x95\x8a\x1d\x12\xab\xef\xcd\xe7\x30\xf4\xfb\x48\x35\x54\x97\xe1\xa1\x23\x02\x12\x8f\x6c\xa6\x74\x1c\xb9\x27\xd9\x8f\x69\x45\x30\x43\xc9\x5d\x14\x10\x14\xde\x8a\xcd\xb2\x0c\x8c\x73\x09\xe7\x6d\xcf\xa4\x89\xca\x5b\x17\x9c\xad\xe2\x0f\xe2\x87\x06\xf2\x39\x89\x4a\xcd\x11\x0d\x4d\xe2\xcf\x16\xd7\x09\x3e\xa6\xfd\x39\x48\xa7\x78\x0a\x70\xca\xa4\x79\x50\x07\x78\x6e\xab\x68\x73\x96\x77\x4b\x2c\x12\xfb\x31\x4b\x60\x61\xb9\xb0\xdb\x67\x58\x5d\x76\x7d\x1f\x0a\x07\x6d\xae\x3e\x6b\xd3\x9e\x76\x37\xc9\xed\x29\x0e\xb7\xcd\xd0\xe9\x95\x4c\xe6\x01\x9a\x97\x64\x07\xeb\x9e\x25\xb6\xc5\x34\x61\x1d\xa8\x4a\x2b\x51\x2d\x67\x95\xe5\x34\x97\x5c\x6d\x33\xc2\x9d\x7a\x45\xef\xe9\xb7\x59\x81\x39\x39\xd2\x2a\xbc\x5a\x64\x19\x06\xee\x3d\x9c\xd8\x33\x97\x81\x66\x58\xfa\x24\x3b\x0d\xcb\x8e\xb8\xfc\x19\xce\x39\x55\xfb\x0d\x2a\xcb\x2b\x3b\x60\x6e\x10\x64\x6c\x85\xad\x78\xe2\x19\x98\x61\x13\x00\xf0\x5a\xa9\x57\xf1\x63\x6f\x32\xf1\xae\x67\x86\x88\x38\xe2\xc8\x90\x47\xa4\x08\x6c\x1a\xc3\xb1\x8a\x48\xa2\xc7\x8b\x27\xe4\x1e\x69\x88\x1f\x35\xae\x98\xab\x79\xbe\x8f\x33\x2f\xa2\xfd\x03\x0c\x61\x5c\xad\x8c\x66\xc1\xe8\x53\x45\xdc\xbf\xe0\x04\x8a\xb6\xdd\x9b\xe5\x38\x51\x19\x56\x5a\x8b\x80\xc2\x33\xdb\x30\x29\x94\xc8\x76\xe3\x41\xa3\x41\xeb\x3c\x59\x57\xf4\x0d\xd5\x28\x0a\x53\x2f\x08\x13\xd3\xae\xca\xdd\xe3\x62\x5a\xa8\x18\x6f\xcc\x9c\xa0\xad\x29\xd1\xf9\x33\x46\xd0\xbe\xd2\x4c\x89\xc8\x52\xa3\x4e\x86\x10\xde\xbe\xa7\x9b\x0d\x71\x3b\xc3\x97\xf4\x21\x3d\x49\x1a\x22\x3b\xda\x8b\x27\x0b\x79\x8f\x37\x34\x18\xd3\x0c\xe4\xc5\x30\x20\x2f\x9f\x76\xb2\x86\x17\xc3\xc0\xf8\x38\x15\x0d\xee\x23\xb3\x8a\x92\xda\x20\x05\xef\x25\xeb\xcd\x68\xde\x53\x84\x2e\x0b\x9f\xc0\xa2\x91\xad\x3d\x38\x8e\x62\x58\xe5\x84\x06\x57\x75\x86\xd4\x38\x06\xb4\x31\x49\x3b\x4a\x8c\x2e\xb9\x7a\xc1\x01\xd1\x96\x43\x69\x84\xc8\x54\x26\xf6\x00\x25\xad\x0e\xf8\x02\x24\xfc\x6a\xbc\x2d\xcb\x5a\x1b\x8c\x37\x63\x9a\xa7\xac\x05\x52\x85\xa6\xe6\x52\x30\xe5\x83\x0d\x1d\xdf\x05\x3c\x37\x3f\x29\xa6\x5c\x38\x08\x68\xd9\x9d\x83\x47\xce\xc8\xf0\x0e\x2c\x8a\x41\x14\xce\xee\x01\x9d\x93\xc0\x03\x49\x10\x4e\x66\x30\xab\x62\xbf\x9a\x18\x2f\x66\xb3\x73\x72\xda\x26\xd0\x67\x3c\x74\xc3\x7b\x32\x89\xa1\xe6\x15\x19\x6f\x42\x83\xc9\x34\x45\x70\xe9\x39\x14\x41\x22\xd8\x06\xfc\x37\xb6\x71\xd2\x37\x8f\x1c\x06\x22\x09\xc3\x31\x2e\x3e\xac\x46\x55\xc0\x69\x7c\x1a\x5f\xdc\x4a\x19\x05\x47\x41\x68\x3c\xb9\x17\x7d\xec\x1e\xf2\x58\x63\xe6\x68\x76\x92\xaf\x31\xc1\xc0\xc9\x19\x1c\x3b\x19\xd9\xd4\xa4\xdc\x70\x6e\x49\x61\x14\x64\x64\x86\xb2\x14\x1f\x65\x2c\x9c\xaf\x25\xd8\x28\xd2\x5a\xbe\xb7\x6a\x4f\x0b\xf7\x53\x81\xc1\xc5\x20\x47\x72\xa9\x69\xa7\x8f\xa2\x05\x5c\x21\x9a\x78\x6d\x2d\x04\xbf\x08\xdb\x6d\xc2\xac\x5f\xa4\xb5\x4c\x71\x91\x5c\x19\xb3\xa0\x48\xe7\x2d\x3a\xe8\x80\x76\xb3\x99\x45\x4e\x8a\x1e\x25\x02\x24\xb3\xe3\x5e\x06\xd9\xe2\xb5\xb7\xf7\x17\xf3\xda\xd3\x32\x85\x80\x8e\x09\x7b\xb5\x4d\xeb\x67\xef\xc1\x59\x2a\x6e\xd0\x8a\x24\xcb\xeb\x59\xea\xa5\x30\xf3\x32\xf8\xf2\x70\xf0\x4c\xff\x70\x61\x4c\x57\xd2\x1b\x9c\x5c\xa9\x81\xb6\x09\xb2\xed\x33\x03\x54\x31\xa8\x1a\xd7\x70\x36\xab\xd6\x0e\x40\x09\x2c\x27\x47\x65\x91\xcc\x82\x10\x1e\x41\xe8\x97\x44\xf4\xd3\xf9\x15\x7f\x99\xa4\x10\x59\xc5\x41\x1f\x1d\x7d\x33\xd0\xfd\xd3\xb2\xec\x19\x79\x71\x1c\x78\x13\x78\x8a\x8b\x4b\x32\xa9\x77\x56\x7a\xc8\xbd\xd1\xa7\x64\xee\x8d\x60\x49\x4c\x6f\xcf\xcb\x62\x4a\xbd\xeb\x92\x38\xce\x3e\x94\xc5\x91\x4c\x83\x71\xfa\x61\x91\x96\x45\x74\xbc\x14\xa2\xe3\xb2\xc3\x33\x38\xeb\x17\x45\x44\xbe\xe0\x74\x0a\x08\x6c\xf5\x23\xfe\x1b\xff\x8e\xc0\x74\x3f\x0e\x0e\x09\x6e\xbc\x0f\xc7\xc8\x7c\x83\xb2\x30\x7c\xb9\xa8\x5c\x54\xcc\x54\xb0\x38\x79\x66\x6f\x64\x39\x19\x70\x88\xbe\xb0\xb1\x11\x13\xac\x20\x83\xfe\x23\xcd\x26\x42\x97\x6f\x17\xf1\xfd\xb3\xe3\xe1\xc7\xee\x69\xf7\x5d\xed\xe0\x99\x8d\xc0\xab\x3f\x93\xc0\x0f\x67\x7d\x07\x69\x1f\xff\x4c\xd2\x0e\xfb\x67\x0e\xd2\x86\x05\x49\x73\x61\x38\xfe\xfe\xfd\x87\xd3\x81\x03\xc9\xff\xfc\x11\x48\x46\x65\x99\xcc\xdf\xca\xb2\x41\x1c\x94\x85\x28\x64\xe7\x10\x92\x39\xf9\xf0\x8e\x25\x41\x72\x75\xf0\xfd\x87\xd3\x77\xdd\x13\x07\x39\x87\x65\xc9\x79\x3a\xd4\xef\xca\xf3\xf6\x33\x8c\x13\x78\xfc\x64\x14\xfc\xa3\x2c\x05\x09\x4c\x27\x27\xf0\x33\x9c\x55\x9b\xb5\x03\xfd\x53\x99\xa7\x85\x0b\x11\x2e\x56\xfc\x14\xcc\xdf\xa3\x3d\xda\xd4\x8b\x1d\xf2\x65\x5e\xfb\xbb\xef\x4d\x1d\x2d\xa8\xe4\x19\x35\x4c\xc7\x8f\x92\x00\x6b\x0a\x83\x92\x37\x7d\xba\xa8\xbc\x31\xb2\xd9\x88\xfd\x23\xce\xb9\x53\xad\xbc\xa9\x10\x7c\x66\x80\xaf\xcb\x03\x7c\xed\x04\xf8\xbc\x3c\xc0\xe7\x4e\x80\xcd\x12\x00\x51\x6b\x5a\xa1\x31\x61\x7f\xd7\xc0\x4b\xd0\x6a\xba\x50\xb4\x9e\x06\x05\x4e\xe3\xe7\x40\xd3\x7e\x32\x34\x6d\x17\x9a\x8d\x27\x43\xb3\xe1\x42\xb3\xf9\x64\x68\x36\x5d\x68\xb6\x9e\x0c\xcd\x96\x0b\xcd\xf6\x93\xa1\xd9\x76\xa1\xd9\x79\x32\x34\x3b\x2e\x34\xbb\x4f\x86\x66\xd7\x85\x66\xef\xc9\xd0\xec\xb9\xd0\x7c\x57\x02\x4d\x94\xa4\x58\xa7\x7c\xe7\xd4\x29\x2b\x4b\x40\x5c\x71\x42\x04\x4b\x40\x04\x4e\x88\x97\x95\x25\x40\x5e\x56\x9c\x30\x0f\x0a\x82\x1c\xa3\x75\x38\xf8\x27\xa4\xa3\x64\x87\xf8\xc7\xac\x91\xe6\xe5\x51\xee\xda\x7f\x29\x5d\xe3\xb7\x9e\xc4\x56\xaf\x03\x9e\x6c\x58\xdd\xf6\x91\x4b\x0f\x6c\x65\xb0\xbc\x65\xac\xc3\x32\x8a\xee\xd2\x28\x48\xf6\xbd\x1f\xe7\x6e\xf8\xbd\x47\xc2\x3f\x8c\x6e\x43\x37\x86\xfe\x23\x31\x1c\x45\xf1\xad\x17\xfb\x6e\x24\xaa\x1d\x5c\x16\x49\xcf\x1b\x7d\xca\xc7\xa2\x1a\xff\x65\xb1\xbc\x27\x17\xcc\xd0\x8d\xe5\xe8\x91\x58\x3e\xc6\x70\x04\xfd\x20\x9c\xe4\xa3\xfa\xfe\x91\xa8\x90\x00\x77\xaf\x93\x68\xb6\x48\x73\x30\xbd\x7d\x6c\xa7\xa2\x24\xc0\x47\xb4\x4e\x2c\xc7\x4f\x23\x6b\xe7\xde\xb5\x1b\xcf\x7f\x2f\x8d\x07\xc6\x1e\xda\x02\x1d\x06\xc9\x7c\xe6\xdd\xbb\xb1\xfc\xf0\x58\x2c\xf9\x02\x70\xf2\x48\x0d\x86\x30\xe4\x68\x30\x75\x9f\x58\x1c\x05\x79\x11\xb6\x00\x0a\xf5\x2c\xa5\x2c\x8a\x02\x7a\xf8\x6c\x69\x14\x24\x37\x68\x9e\x1e\x3e\x2f\x0c\xff\x19\x30\xbe\xfb\xf5\x0a\xe0\x97\x7e\x9f\xeb\xf9\xed\x65\x42\x24\x85\x4d\xee\x68\x9e\x99\x08\xfa\xe5\x71\xc2\x57\x80\xa5\xff\xef\x13\xe9\xec\xdc\xd9\xfa\xbf\xcb\x23\x9a\x7a\x48\xf3\x14\x53\x71\xde\xd2\x68\xde\x32\xed\x76\x0a\x67\x5e\x1a\x7c\xce\x41\x74\xbd\x34\xa2\x18\xce\xa1\x97\xf2\x05\x82\x87\x8a\xbb\xf1\xa9\xa7\x68\x25\x64\x1f\x86\xfe\x21\x7e\xaf\x21\x7b\xd1\xce\x8d\xcb\x5f\x1a\xd7\x2c\x08\x61\xe1\xb1\x82\x4b\xa3\xf9\xa9\xdc\x58\x8d\x97\x17\x8a\x9f\x8a\xad\x79\x93\xa5\x31\xa4\xde\x75\x7f\x06\xbd\x9c\xd1\x9f\x3e\x62\xf4\xc9\x3b\xf6\x4e\xf0\xb3\x47\x08\x73\x21\x04\x37\x8f\x9a\xfd\x45\xe5\x36\x7c\xc4\x12\x94\xbd\x67\xe2\xc6\x31\x2f\xb7\x46\xf0\x54\xeb\xda\x8a\x80\xb3\x89\x57\x9e\x57\xe4\x7c\xe2\x7c\xd8\xd8\x73\x06\xf2\x32\xc1\x7e\x04\xb7\x66\xf3\xca\xf1\x7b\x31\x32\xeb\x60\x4e\x76\x90\xd2\x9a\x46\x8a\x88\xb3\x3f\xa8\x18\x97\x31\x29\x43\x7d\x91\xa5\x2c\x76\x13\x64\x96\x5c\x31\xf9\xb8\x7b\x58\x92\xf2\xe0\x79\xaa\x6d\x37\xe4\x45\x69\xc8\x52\x76\x6c\x27\xf0\x62\xbb\xe8\xbc\xb1\xab\x83\x47\xed\xb3\x85\x6f\x07\xcf\x84\x2c\x21\x42\x39\x13\x01\xa1\xe8\x42\xfc\x7d\x85\xc0\x5c\x41\x74\x37\xd1\xff\x58\xc1\x81\xbb\x19\xbd\xfb\xc4\xed\xb0\x43\x24\x2f\xc9\x69\xc8\xef\x1d\x71\xd3\x36\x6e\x9a\x95\xe5\x37\xc6\xcd\x36\x58\xb3\xbc\x06\x1f\xce\xfa\xb8\xc1\x26\x6e\x80\xfe\xca\xc3\x40\xae\x29\x70\xa3\x2d\x82\x85\x96\xe4\x34\x3c\xec\x9f\xe1\x46\xdb\xb8\x11\xfa\x2b\xa7\x01\xb9\x7d\xc3\x6d\x76\x70\x1b\x5a\x80\xf3\x6c\x09\x35\x71\x96\x3a\xf1\xef\x0e\xf8\xf2\x50\xab\x89\x12\x90\x93\x23\x86\x54\xaa\x0e\x03\x21\x1b\x57\x1d\x0c\xd5\x7b\x9e\xcc\x97\x29\x90\x93\xac\x4b\x7f\xab\x7e\x4f\x0c\x0a\xaa\xc7\x7e\x57\xeb\x24\x94\x6e\x5d\x96\x99\xde\xc9\x38\x25\x38\x9a\xe2\xa9\x20\xa7\x77\xf1\x52\x4f\xf5\xf7\x45\x98\x51\x39\x7f\x2c\xf7\xb7\x3a\x18\x25\x75\x30\x9a\xd6\xc1\x88\xb8\x60\x45\xb7\x2a\x45\x73\x6a\x1b\xc8\x29\x23\x0d\xcf\x20\x24\x8b\x38\x8e\x26\x5e\x0a\x87\xd3\x60\xa2\x79\x00\x22\xbc\x86\xf4\xf6\x52\x1b\xb0\x8a\xab\x99\x5c\xf5\x6c\x2d\xe4\x88\x29\x25\x07\xc1\x81\xda\x05\xfc\x14\xaf\x5c\xa6\x7b\x0b\xe3\x58\x10\x44\xc7\x85\x5c\x53\x89\x8d\x18\x11\x27\x38\xcc\x4f\xb4\x7e\xf7\x23\x1f\x76\x59\x56\x17\xd6\xc6\x10\x0c\xd8\xbc\x3b\xdc\x6d\x36\xc1\xab\x0e\x81\xf0\xe2\x05\xf9\x17\xa7\x96\x3b\xec\x1d\x1d\x99\x7c\xce\x67\x38\x42\xd5\x8d\x8a\xdc\xcf\x18\x9d\xde\x83\xe4\xbd\xf7\xbe\x3a\x8b\x6e\xad\x0e\xed\x79\x4c\x1e\x4d\xcd\x71\x39\xa3\x28\x4c\x83\xd0\xf4\x3c\xbe\xee\x0a\x4f\x19\x56\xad\xe2\x5f\xd6\x00\x61\x44\x0d\xbc\x04\xcd\xbb\x4d\xf4\xcb\x2a\x40\x34\x92\x2f\x7d\x52\xd0\xbc\x6b\x35\x9b\xea\x2b\xbd\x74\x90\x56\x05\x8e\x14\xe1\xc6\x83\x69\x28\xfa\xd6\xa1\x38\x3a\x3a\xd2\xd3\x79\x9a\xfb\xcb\xec\x1f\x61\x0a\x5b\x9f\xf4\xd2\x27\xb6\xfd\x69\xff\xd1\x14\x04\xa1\xc1\xcb\xcb\x15\x7e\x66\x70\xec\x19\x4d\xaf\x68\x5a\x21\x5d\x67\x3d\x65\xe0\xa5\x0e\xbd\xe1\xf9\x3e\xbe\x87\x66\x1a\xe6\xb1\x0f\x9c\x03\x13\x1b\xe9\x72\x9a\xc7\x47\xc3\x2d\xb8\x8b\x91\xa6\x4b\x73\x95\x93\x7c\x5d\xb0\x07\xdf\x39\x62\xf3\xcc\xbd\x66\xc2\x34\xb2\x86\xe0\x72\x26\x54\xaa\x15\x73\xa7\xb3\x1a\xb5\xdc\x1a\x2f\x73\x6b\xac\xe6\xd6\x58\xcb\xad\xd1\x70\xd4\x00\x85\x7b\x2d\xc3\x74\xf5\x5e\xfc\x51\x1f\xb4\xca\x1e\xbe\x32\x28\x16\xd3\x4f\x4e\x7c\xa5\x4c\x95\x8b\xe3\xc5\xa8\x6a\x7d\x03\xaa\x5c\xa3\x5c\x8c\x2a\xcb\x63\xa7\x8f\xa2\xca\x25\x59\xc5\xa8\xda\xf8\x06\x54\xb9\xa4\xb9\x18\x55\xdf\x62\x04\xf3\x66\x50\x3e\x55\x4f\x37\x82\xf6\x98\x76\xe0\xb4\x64\xe9\x06\xe1\x51\xd1\xcc\x84\x1b\xeb\x39\xdc\x58\x5a\x62\x1e\x49\xbc\x6c\x85\xac\xad\x3d\x41\x57\xdf\xe7\x74\xb5\x10\x90\x0f\x4f\x01\x24\x2c\xc7\xf4\xcc\x09\x4e\xcd\xc7\xbe\x14\xf6\x68\x59\xec\x1b\x4f\x81\xfd\xeb\x9f\x8a\xfd\xe1\x4f\xe5\xfc\xbf\x96\xc5\x6e\xda\x90\x94\xc6\xbe\x53\x08\xbb\x64\x76\x0a\xc7\x5e\x39\x14\x14\xdb\x75\x3f\x8a\xfe\xdd\xf2\xf4\xcb\x87\x6b\x7f\x7e\x17\xfe\x5e\xa8\x0b\xcb\x92\xa0\x6e\xc8\x9f\x80\xe0\xb7\xe5\x24\x36\xf5\xae\xcf\x88\x37\xf6\xb7\xeb\x65\x21\xba\x3b\xe5\xe8\x9e\x45\x93\x6a\xe5\x0c\xc6\x81\x37\xc3\x29\xba\x41\x0c\x7f\x5f\xc0\x24\x85\x3e\x10\x9e\xb7\x05\x9f\xf0\x1b\xba\x0d\xdb\x33\xcb\x16\xe0\xa6\x47\x78\xf5\x5c\x7d\x39\x40\x0a\xbc\xcb\x6b\x87\xf2\x4d\x59\xfd\x7a\x19\x56\xe3\x5d\x4a\x10\x4e\x00\x4e\x22\x9b\x46\x74\xbb\xfd\x84\x1c\x56\x92\x46\x14\x80\xf2\x57\x64\xb1\x0f\xc7\xde\x62\x96\x7e\x7b\xad\xc1\xb9\x00\x49\x80\xf9\x8f\xe1\xa7\x30\xba\x0d\xc1\xe0\xac\x9f\xbd\xbb\xf0\x8f\xa4\x51\xa9\x83\x91\x1a\x9a\x5d\xa2\x4f\x8f\x3b\xa0\xa0\x96\x63\xde\x01\x85\x10\x0a\x40\x5b\x9c\x39\x8f\x00\x12\xd0\x31\xb5\xb9\x18\x4d\x1d\x89\x92\x28\x3a\x7c\xed\xb5\x9e\x9b\xe3\x0a\x33\x59\x8d\x28\xb0\x55\x2e\x9a\x67\x08\xe4\x1f\x25\xa9\x7d\x53\x42\x23\xca\x0c\x92\xc1\x38\x61\xe1\x17\x96\x4d\x42\x1d\x8c\xd4\xab\x48\x0b\xb0\x89\xed\x0d\x6d\xbd\x4d\x59\x31\x2f\x2a\x5b\x1f\xce\xfa\x4e\xb9\x42\x03\x6d\x8b\xec\x03\x5f\xbf\x02\x57\x95\xde\xe0\xc4\x25\x20\x05\x30\xd8\xdf\xfd\x07\xa5\x16\x7e\xf5\xc5\x65\xe2\x90\x84\x73\x3b\xe9\xef\xa7\xf3\x10\x35\x87\xac\xca\x47\xb6\x0a\xe0\x8b\xe6\x55\xde\xc4\xc0\xe3\xd0\x74\xeb\x37\xd3\x23\xe3\xc6\x3a\x86\x47\xc7\xd5\x1f\xd3\xb3\xd3\xec\x29\xe7\x22\x27\x66\xc0\x60\xf4\x04\xe9\x0c\xea\x57\x32\x1c\x6c\xb1\xd3\x02\xa5\x35\xb9\xc6\x3d\x47\xa0\x55\x7a\x31\xbe\x1c\x15\x0c\x72\x0f\x17\x40\xb1\x13\x0a\xd3\xfb\xea\x8f\x01\x65\x78\x96\x5d\xab\xb3\xf5\x74\xe8\x5a\x85\x44\xab\x88\x6c\xb5\x72\x84\x8b\x54\xca\xe1\x14\xa9\x54\x84\x07\xad\x1c\x26\x90\x4a\x86\xf7\xe5\xf5\x4a\x3b\x45\x2a\xed\x16\xa9\xb4\xf7\x84\x72\x90\x43\x7a\x19\x58\x5b\x39\x83\x5c\x0a\x56\x8e\x2c\x94\x82\x55\x40\x1f\x15\x17\xe4\x42\x52\xd3\x2c\x24\x36\x05\x67\x45\xa1\x69\x51\x6c\x5e\x14\x9b\x18\xc5\x66\x46\xb1\xa9\x51\x6c\x6e\x14\x9b\x1c\x79\xb3\x03\x2c\x9b\x3b\x12\xd8\x96\x64\x25\x93\x58\x4e\x1b\x73\x38\xb9\xbd\x61\x59\x1b\x6a\x29\xd3\x53\x78\x7d\x46\xb5\x37\xdc\x99\x71\x45\x00\xa3\x29\x78\xdd\x01\x95\x66\x05\x5f\x2a\x4f\xc1\xab\x0e\xa8\xec\xe5\x5a\xdb\x20\x8f\x45\xcb\xac\xc8\x12\x04\x1a\x90\x36\x9a\x8a\x7e\x04\xcd\x1a\x58\x03\x9b\xbb\x8f\x39\xf2\xe7\x09\x64\xd9\xd6\xe2\x60\x99\xce\x3e\xde\xac\x2b\xc2\x03\x77\x92\x5d\x77\x5f\x5d\xc9\x7c\x9d\x52\x95\x47\xd4\xaa\xdd\xc7\xc2\x8e\xf7\x91\xbb\x52\xe6\x4a\x96\xb7\x2f\x35\xc5\xc6\xb9\x37\xa6\x86\x58\x3a\x76\x75\xfe\x94\x57\xe5\x98\xa1\x6a\x34\x5f\xc9\x3d\x58\xff\xec\xb8\x18\xaf\x0a\x70\xa9\x04\x83\x8c\xbc\x69\x28\x7e\x67\xc6\xe9\xa1\x17\x53\x47\x49\xb5\x98\xf9\x4d\x3a\xb8\xfe\x08\x37\x0f\xdb\xc1\x4b\xff\xec\x18\x7b\x7a\xe4\x9e\xba\xb8\x76\xeb\x65\x15\xbd\x91\x23\x8e\x89\x6e\x66\x95\xa3\x41\xd1\x39\x75\xd8\x3f\xfb\x3f\xb0\x1b\xc7\x09\x3b\x53\xc0\xde\xb1\x72\x57\xc4\x8f\x6a\x14\xa8\x6b\xdb\x91\x6b\x3e\xe5\xa6\x1f\x72\xa4\x5b\xe0\x86\xbc\xa8\xdd\x5a\xf9\xee\xf7\x02\xd0\xe6\xa9\xbe\x7f\x16\xd5\x7a\xfe\x42\xc5\xb8\x53\xe0\xd8\x17\x88\x9e\xf6\xc6\x04\xb7\xf6\xde\xac\x14\xe9\x8d\xd4\xab\x4a\x73\xe5\xf7\x9c\x65\x52\xfc\x29\xe8\xca\x20\x50\x34\x2f\x4d\xd1\x76\x6b\x65\xfe\x2d\x49\x8a\x4b\x53\x54\x29\x5c\x1f\xfd\xac\xea\x2e\xb3\xf8\xb4\xfe\x3c\x9a\x63\x77\xc5\x92\xc0\x2a\x07\x4f\x83\xbe\x17\xa5\x69\x74\xb3\x14\x05\xf1\xb7\x1c\x8e\x9b\xf2\x22\x7b\xf3\x6d\xe8\x29\x74\x9b\x21\xfe\xb8\x97\xc8\xc3\xfe\x19\xf8\x98\xb2\x05\x72\x6e\x7b\xb8\xc1\xf4\x43\xc5\xee\xc9\x7b\x99\x7f\xe6\xa6\x1d\xa3\x87\x7e\xd5\xba\x92\xad\x82\xca\xc7\x0a\x58\x05\xab\x44\xbd\xad\x82\xca\x77\x31\x7e\x46\x38\x05\xab\xf6\xf5\x0f\x3f\x55\x9c\x77\x85\x56\xb0\x53\xd4\xbf\xac\x88\x92\x29\x0e\xed\x2f\xb9\x24\x3c\x72\x60\x56\xff\xe0\x81\x29\x3c\x97\xf2\xe7\x10\x31\x0d\xd8\x3c\x32\xdb\x0d\x8f\xa6\xb9\xf0\x01\x48\xd9\xc3\x8c\xe2\xd6\x2a\xf8\x16\x07\x20\xa6\x63\x0e\x69\x93\x5d\xf6\x88\x84\xf4\x82\x1c\x77\xe0\xb7\x26\xbe\xab\x88\x7f\xad\x16\xbb\x6b\xb4\xf2\xb3\xfc\xee\x58\xea\xaa\x91\x5a\x31\x43\x7a\xfb\x4f\x23\xaf\x14\x5a\xca\xe6\x27\x3c\x2e\x28\xb7\xdb\x2b\x7a\x68\xf1\xb8\xa3\x09\x12\xdf\xf5\x7f\x60\x27\xf5\x94\xd3\xda\xc0\x5c\xc7\x23\x2c\x02\x66\xd2\x86\x26\xd0\xd6\x42\xcb\x58\x78\xa5\x14\x5d\xa6\xc5\xb8\xc8\x1d\x29\x06\xf6\x23\x53\x7c\x42\x2e\x25\x6d\xb7\x67\x53\x96\xe4\x97\x7c\x1c\x7c\x6b\x2f\x20\x91\xa3\x81\x4d\x58\x78\x2b\xfa\x5b\x3e\x1e\xaa\x07\xa4\xb4\x50\xb2\x16\x75\x2b\x90\x79\x66\x1c\xd8\xd0\x4c\x4c\x68\x44\x0c\xd2\xd0\x3a\xac\x0f\x1b\x02\xe9\x28\xcd\x8a\xe5\xd1\x87\xb6\x85\x16\x4e\x2b\xaf\x05\x67\x94\x1c\x12\xd5\x09\x28\xa7\x88\x27\x90\x59\x7e\x78\x96\xfa\x9d\x47\x89\xb2\xcf\xe6\xa4\xef\x94\x2c\x73\xc6\xf7\x76\xf3\x2f\x96\xf1\xfd\x30\xba\xa1\x0f\x1b\x11\x60\x1f\xa3\x68\x66\xcf\xe6\xce\xd2\xb9\xbf\xeb\xfe\x32\x3c\x1d\x1c\x9d\x0e\xce\xde\x0e\x8f\x4e\xbb\xef\x06\xc3\xb3\x1f\x8e\x3f\x82\x0e\xd8\x22\xdf\x8f\x4e\xba\xdf\x9f\x49\xc1\xd4\xb8\x84\x8d\x03\xfe\xe3\x82\xfc\x7f\xa5\xf7\xe1\x44\x0c\x80\xc6\x7f\x1e\xe8\xd5\x7e\x7c\x7f\x38\x38\x3d\x39\x7e\x3f\x10\x22\x9e\xb3\x32\x43\x83\xde\xc9\xf1\xfb\x1f\x84\xb0\x65\xf2\xb7\xa1\xe2\xf1\xfb\x9f\x06\xa7\x67\x04\xee\x2e\x89\x21\xa6\x25\xe6\xca\xc7\x67\xc7\xbd\x13\x52\xbd\xb5\xcd\xea\xd3\x42\x1c\x76\x8c\xab\xe2\x80\x63\xf2\x1b\x0b\x35\x26\xbc\xb9\x8e\xa3\x4f\x30\xec\x45\x33\x9f\xbb\x06\xa1\xe2\x53\x18\xfa\x30\xce\x8d\x42\x66\xd5\xaa\x8e\xc0\xe3\x22\xc1\xc4\x31\x1c\xc7\x30\x99\x9e\x46\xb7\xc9\xff\xb3\x80\x0b\xa8\xdc\xce\x49\x95\x8e\x62\xef\x06\x26\x67\x9f\x82\xf9\x1c\x3f\xe7\xd6\xb4\xd4\xeb\x86\xc1\x0d\xf6\x58\xc4\x0d\x34\xc7\x27\xba\x0e\xcc\xbd\x50\x93\x38\x54\x17\xde\x5a\x84\xb1\x61\x2a\xae\x56\x10\xa0\x8a\xf2\x82\xa9\xc8\xdb\x0e\xc1\xaf\xae\xe6\x12\xfb\x47\x53\x38\xfa\x84\x7e\xef\xe1\x52\x55\x49\x41\xed\x5d\x38\xf5\x49\xef\x6f\xd2\x1b\x82\x84\x8d\xb4\xa0\xe0\x7e\x47\x23\x75\x4a\x98\xad\xae\xb9\x71\x5a\x07\x30\xf4\x75\x69\x50\x47\x9a\xa8\xe3\x2f\x00\xb7\xd9\x07\x59\xd3\x7d\xf4\x3f\xe9\xb5\x29\xc1\x98\x37\x0e\xb1\xf9\x95\x78\x9b\x34\xdc\x06\xa1\x1f\xdd\x36\xa8\x1f\xb2\xfc\xb9\x2a\x35\x3d\x89\xa2\x79\xe3\x3a\x08\x7d\x72\x2d\xa4\xf1\x9f\x6a\x6b\x03\x87\x44\x08\xd6\x25\x00\x3f\xda\xfa\x29\x98\x33\xc2\x94\x51\xbf\x8d\x83\x14\xf6\x16\xe3\x31\x8c\x85\xe7\xab\xd1\x86\xc5\x3e\x2b\x56\x57\xc1\xab\x8e\x45\x2d\xca\xfc\xe4\x88\xff\x78\xe6\x01\xe7\x93\xe4\x45\xa7\x3c\xe6\x1e\x12\x1a\xb9\x08\x86\xbe\xdc\x51\x8b\xf4\x71\x8e\x6e\xaa\x0c\xc0\x40\xf5\xed\x31\x12\x4a\x6d\x8c\xe2\xe8\x36\x01\x6b\x62\x30\x9d\xf3\x8d\x38\x06\xda\x4c\xd3\x45\xf3\xaa\xa1\xf4\x48\x45\x6c\x6a\x22\xf5\x18\x38\x5f\xd9\xb7\x70\xc1\xf8\x22\x99\x9b\x7f\x17\x01\xa5\x15\xbc\x22\xbd\xb2\xed\x56\x72\xba\x1c\x18\xbb\x0c\x8c\x3b\x08\x37\x35\x88\x4d\xaf\x55\xd5\x53\x98\x8f\x81\x81\x8f\x3a\x15\xa6\xcd\x4a\xf9\x75\xac\xd0\xfa\x44\xeb\x8a\x2a\xf5\xa0\xa0\xd2\x29\xa0\x92\xb3\xf7\xec\xe4\xc9\x82\x78\xb4\x46\xc7\xec\xb5\x59\xda\xd7\xf5\x73\x08\xfe\x32\x9e\x79\xdd\x32\x3e\x94\x07\xb2\xc4\x7d\x96\xb7\x10\x2d\xc0\xc4\x57\xee\x74\xfa\xfa\xe4\x59\x36\x2d\x6b\x80\x69\xe4\x10\x13\x6e\x03\x3f\x9d\x1a\x8e\x43\xa3\x99\xf2\x9c\xf9\x3d\xd9\x33\xc6\x06\x86\x99\x19\x65\xd6\xab\x72\xb0\xc6\xff\xc2\xd0\xff\x5f\x10\x24\x20\x8d\x22\x30\xf3\xe2\x09\x6c\x80\x77\x51\x92\x82\x59\xf0\x09\xce\xee\x81\x07\xae\x3d\x1f\xf4\xcf\x4e\xb5\xb0\x8d\xd2\xda\x88\x66\x1b\xb9\x47\xeb\x03\x92\x74\x70\x6f\x7e\x66\x3c\xc6\x79\x3c\xee\xc1\xaa\x0a\xfc\xde\x0f\x92\xf9\x81\x56\x7f\x16\x84\x86\xb5\x0b\x95\x26\x68\x37\x58\x8d\xa3\x5b\xc3\x23\x69\x77\x96\xdb\x56\xc3\x39\xd8\x3d\x36\xa1\xee\xc1\x9a\xfe\xe5\xda\x4b\x20\x58\x33\x12\x5a\x03\x2f\x5e\xe4\x49\xd4\x88\x66\xce\xf2\x52\x68\xaa\x6d\x38\x7a\x4c\xa2\xf8\x6d\xe0\xfb\x30\x34\xc9\xeb\x9d\xce\x86\x3b\x9b\x10\x02\xfb\xa9\x16\x02\xb3\xd6\x72\x35\x44\x0c\xf4\xd2\x34\xd6\xf1\xf9\x70\xdc\x4d\xd3\x58\xe7\x37\x7b\x01\xed\x28\xf6\x26\xf4\x71\x59\xe5\x51\xb4\x43\xa5\x86\xea\xa6\x82\xd7\x13\xc7\x2b\xe0\x38\x53\x34\xd9\x26\x67\x0f\xe1\x9a\x86\xf8\x76\x1a\xcc\xa0\x36\x96\xf8\x51\xc7\x18\x86\x17\xf7\x57\xfc\x77\x87\x33\x1b\x7f\x4b\xdb\x30\x75\x0d\x90\xa4\x87\x22\xd9\x8f\xa3\x9d\xa8\x63\x70\xb9\xe1\x90\xde\x61\x78\x37\x62\x38\x83\x5e\x02\x8d\x6d\x1f\xec\x6b\x35\x7d\x2f\x14\xeb\x24\xeb\x9a\x8c\x87\x93\x64\x2a\x42\xb3\xec\x22\xb8\x32\xf6\x8e\x70\x48\xa8\x64\xf2\x96\x27\x95\x86\x4c\x09\xb2\xaa\x6d\x43\x55\x6c\x83\xb3\xba\xb6\x25\xb6\x4c\xae\x1d\x9c\xf5\x07\xcf\x6d\xab\xeb\x04\xed\xa6\x3a\x1b\xec\xf0\x70\x83\xe7\x9d\x0e\x9e\x1e\x36\xa8\xa8\x22\x9e\x3e\xa8\xa2\x79\x02\xe5\x1d\xbd\xf2\x89\x90\xeb\xf4\x21\xcd\x08\xe9\x19\x7d\xfe\xbb\xfb\xfe\xa7\xe8\xcb\xfb\xf6\x13\x7c\x75\xee\x4b\x8f\xf3\xcb\x04\x3a\xee\xa2\xb4\xb9\x6d\x8f\x26\x32\x93\x22\x8d\xcf\x23\xd9\x8e\x93\xfb\x2a\xa4\x97\x1a\x09\xae\x36\xcc\xf3\xd7\x1b\xe1\xa3\xa6\xf2\x91\x64\x8c\xd2\x72\xb4\x95\x12\x29\xbd\x33\xcb\x88\x15\x28\x21\x5a\x20\xf7\xf6\xfd\x69\x44\xcc\x8e\xe3\xa9\x07\x8f\xcb\x22\x52\x3f\x6b\xda\xcb\xc3\x6e\xf4\xc2\xc3\xdc\x9e\xef\x57\x2b\xf4\x29\xa7\xb5\xcf\x81\x0f\xa3\xbc\x2b\x68\x37\x28\x36\x21\xd6\x88\xad\xe1\x02\xf6\xa8\x1b\x3b\x7c\xfe\x37\xa1\xf9\xda\xc0\x0b\xd0\xbc\x6b\x8d\xc7\x6e\xc2\xf1\xfb\xc5\xa8\x09\x61\xdc\xeb\xd7\x60\xaf\x56\xa2\xe5\xcc\x9b\x24\x0c\xdf\xeb\xd7\xa0\x95\xe3\xca\x8d\x06\x88\xb4\x79\x41\xce\x3d\x1b\xbd\x0f\x27\x87\x45\xa6\x06\x5e\xa7\xb2\xc3\xb5\xc2\x3e\x68\xce\x71\xb9\x43\x03\xb3\x76\x1d\xcd\xfc\x22\x2e\x06\xf9\x9e\x2a\xb8\x7b\x13\xf0\x0a\xec\x16\xa5\x6f\x3c\x01\xab\x1d\x90\xc3\xb5\x7c\xe4\xee\xaf\x3a\xd7\xf9\xc9\xf6\x12\x5a\xc9\xc8\xc3\x05\xda\xb5\x22\x3b\x23\x8f\x91\x65\x29\xc5\xc7\xea\x4f\x45\xe5\xf5\x2c\x08\x3f\x3d\x35\x85\xf4\x34\xbf\x08\x8d\x68\xca\xa4\xf0\x66\x0e\x3a\xe0\x7a\x52\xc0\x3f\x04\xcd\xcb\x71\x81\x8a\x78\x02\x23\xc0\x05\x16\x87\x31\xa8\xf2\x0e\xb4\xd0\x76\x0a\xfc\xff\x42\x62\xf9\x1d\xc8\x53\xc9\xc2\x14\x6f\xf8\xfe\x44\x61\xc0\x17\x0a\x13\xe2\x01\xb2\xb5\x53\x94\xfd\x58\x26\x5a\x5b\x4f\xa8\xad\x08\x01\xdb\x25\xc6\xbf\x50\xf6\xba\xc7\x0e\xff\x35\x92\xca\x82\x74\x39\xc7\x7b\x85\xce\xfd\xc9\xda\x28\x9a\x45\xf1\xda\x0a\x58\x05\xd7\x93\xc7\x8f\xfb\x13\xd3\x97\x11\x37\x5e\x9e\xb8\xa2\xde\x37\xe6\x6d\x56\xb6\x65\x74\x79\x25\x65\xe6\xe5\x6a\x07\xac\xbc\x42\xc6\x1a\xc0\x3d\xea\x5c\xd2\xae\xdc\x06\x3e\x5c\x1b\x4d\xbd\xf8\x72\xe5\xf5\x0a\x8e\xf9\x02\xab\x60\xe5\xd5\x3a\xaa\xfa\x7a\xa5\xc8\xa6\x4f\x08\xea\x52\xc2\xc5\x5e\x83\xf6\xd6\xd6\xf2\xa4\x91\xa4\x29\x4f\x40\x9c\xe5\x54\xbc\x44\x06\xcd\x17\x39\x2e\x9d\x52\x67\x2a\x2f\xbc\x9b\xf9\x41\x8e\x31\x5f\x28\xf9\xcc\xab\x72\x68\x67\xe9\x93\x60\xcd\x4b\x79\xa3\x60\x9d\x3c\x16\x6b\x21\x5f\x4f\xea\x6d\xf5\x4a\x4b\xc3\x5f\x90\xca\xf0\x3a\xc9\x1d\x93\x02\xc1\x8b\x25\xf1\xba\xbc\xef\xf2\x31\x96\x8a\x74\xd3\x4b\xe8\xf9\xa4\x9e\x2b\x5b\x4f\x71\x5c\x76\x57\xff\x14\x9b\x41\x9d\x8a\x7c\xbc\x85\x76\xe9\xcb\xef\xcc\xf3\x76\xe3\x3a\x8f\x1f\xb7\xeb\x2e\x70\xa0\x23\xa3\x74\x9c\x97\x8a\x88\x55\xaa\x8c\x5e\x0b\xf6\x9b\x1f\xcb\xad\x8f\x88\xa1\xd8\xad\x8f\x7a\x43\x97\x81\xbc\x09\x52\xb4\x6b\xc7\x77\x65\x95\x3a\xf8\x02\x28\x92\x7d\x0b\xf2\x7a\x9e\x8f\x02\xbd\x92\xb3\x5e\xcc\x51\x5c\x67\x70\x06\x47\x34\x4f\x7d\xde\x05\x9d\xf9\x94\x3c\x61\x10\x78\x87\xf3\x0e\xcb\xf3\x01\x38\xee\xd3\x1c\xe8\x2e\x9a\x57\xd6\x81\x7d\x4e\xee\x0f\xbf\x7e\x05\xcf\x0d\xd7\xb1\xf6\x9b\x7f\x1c\x8a\x47\x33\x85\x9d\x21\x10\xa7\xf8\x2e\x0a\x43\xbb\x68\x5d\x59\x6e\x7a\x0e\x8c\xed\x07\xa1\x4f\x5a\xc3\xd0\x2f\xdb\xb6\x8f\x84\xcd\x17\x28\x78\xe7\xa5\xd3\xc6\x8d\x77\x57\x55\xa9\xab\x83\x66\xcd\x05\x83\x53\x41\x20\x04\x61\x55\xa6\x4f\x0b\x09\x60\x37\x78\x8a\xf3\x8b\x85\x32\xcb\x0d\xed\xd7\xaf\x66\x32\x5e\x81\x66\xb9\xc1\x78\xdc\xad\x11\x77\xd0\xe8\x63\x57\x24\x7d\x64\x3b\x1d\x1b\xcb\xdf\xd0\x41\x6f\x5e\x81\x7d\xd5\xe7\x03\xa9\x01\x09\xa0\x3a\x5c\x1a\x58\xda\xfd\x37\x58\x16\x30\x48\xe7\x6d\xaf\x53\xad\x92\x96\xa4\xf3\x7c\x3e\x53\x1d\x6a\x19\xa6\x3a\xe7\x42\x9d\x12\x5f\x53\xb8\x74\x13\xf8\xfe\x0c\x9e\x46\xb7\x49\x3f\x5a\x90\x8b\x33\x53\x07\xd6\x6c\x5d\x96\xae\x7c\x9f\x9a\x7c\xb0\x0a\x5a\x75\xd0\xd4\x44\x15\x31\xad\xae\x92\x5e\x2b\x26\xb8\xcf\x2d\x63\x64\xba\x90\x26\x2c\xc3\xbe\xa0\xea\xe4\x7e\xec\x48\x3f\x25\xbb\xd8\x84\x6e\xd6\x39\xc5\xba\xc3\x58\x31\x8d\x5c\x60\x35\x75\x38\x81\x98\xa9\x95\x96\x9c\x18\x11\x3a\x8a\x66\x67\x64\xe9\x19\x45\xb3\x41\xe8\xd7\x01\x5e\x48\x17\xf2\x92\x8c\x06\x91\x95\x13\x86\xe3\x2b\x5d\xfc\xc4\x11\x2f\x06\xad\x03\x45\x73\x40\x8e\x55\x51\x18\x8c\x79\x15\x3f\xf8\x2c\x9e\xa9\xb0\x75\x3e\x49\xef\x67\xb0\x31\x85\xc1\x64\x8a\x5a\x73\x1c\x2f\x75\xf3\xc3\x8b\xdf\x41\x2f\x59\xc4\xbc\xfa\x2a\x58\x99\xdf\xad\xd8\x60\xa6\xd8\x13\x2f\x8e\x6e\x9f\x00\xd6\x0c\x8e\x11\x75\x8c\x85\x6e\x88\x64\xab\xec\x06\x68\x73\x43\xd1\xc0\xbc\x04\x55\x32\x5c\x60\x8d\xa3\xaf\x69\xc0\xa9\xff\x38\xc5\x61\x72\x2d\x67\x92\xa3\x3a\x97\x0b\xee\xbf\x59\x15\x2e\x39\x9a\x9f\xaa\xe2\xfb\x2b\x2e\x1a\xf8\xa4\x91\xf6\x23\xba\x0d\x61\xcc\xd6\x8a\x83\x67\x99\x94\x38\x04\x44\xf4\x44\x85\x33\xc9\x92\xae\x4c\xe1\x6c\x16\x81\xdb\x28\x9e\xf9\xd4\x52\x16\x13\x96\xf2\xc9\x03\xd9\xab\x17\xd8\xd3\x07\x69\x10\x38\x6b\x44\xe3\x71\x02\xd3\x9f\xf1\x1d\x3b\xff\x38\x95\x3e\xbe\xc5\x32\xc0\x51\x93\x21\x1a\x47\x61\xfa\x33\x93\xcb\x0a\xbe\x0b\x10\x80\xb7\x5d\xc0\xdb\x36\xe0\xd9\xba\x2d\x18\x61\x9c\x6a\x3a\x54\xb7\x2d\xac\x2f\x6f\xdb\x68\x61\x9f\x92\x3f\xa6\xed\x83\x67\x0f\x16\xc7\x7f\xae\x14\x2c\xae\xff\xad\xa7\x74\xfd\x47\xfd\x1b\x0e\xe1\x5d\x0a\x43\x3f\x01\x1d\x62\xb1\x66\x3e\xaa\xec\x4b\x0d\xbb\xa1\xeb\x6e\xb0\x58\x0a\x70\x95\xb3\xd4\x4b\x03\x9c\x53\x93\x46\x13\xe0\xe8\x1b\xaa\xd5\x3e\x8c\xc1\xd7\xaf\x5c\xba\xab\x5f\xc0\x70\x88\x35\xde\x70\xb8\x0f\x2e\xae\xc0\x03\x08\xc2\x24\xf5\xc2\x11\x8c\xc6\xa0\x1b\xc7\xde\x3d\x3e\xae\xce\x1e\x9a\xaa\x83\x6b\xa4\xb1\xfc\x06\x6f\x07\x3a\xe0\xfa\x00\x3c\xd4\x44\xb8\x7a\x03\xee\x9d\x31\x07\x41\x88\x8a\xf0\x81\x63\x63\xea\x25\x1f\x6e\x43\x1e\xe8\x30\xaf\xd5\x80\x7f\x31\xbf\x42\x30\x2f\xe6\x57\x07\xca\x54\xd3\xc0\x66\x3a\x40\xec\x39\xf9\x7a\xa0\x53\x33\x1c\x22\x76\x11\x86\x8e\xa2\x30\x49\xe3\xc5\x28\x8d\xf0\xee\x5a\x54\xbb\x7e\xb6\x08\x20\x42\xb8\xe3\x39\x78\xc3\x38\x4a\x26\x58\xf5\xba\x06\xf6\x41\x75\x38\x94\xeb\x67\x7f\xd5\xb1\xd7\x38\xc2\x9a\x2d\x36\x0f\x35\x64\xd9\x3d\x41\x9c\xc7\xbb\x68\x81\x5f\x01\x33\x85\x75\xec\xd1\x3a\x3d\x64\xc5\x92\xb7\xca\x0c\xb5\x76\x69\xad\xc1\x67\xb4\x7b\xbd\x09\xd2\x14\xc6\xd6\x48\x91\x16\xad\xcc\x97\xc3\x77\x91\x0f\xed\x81\x25\xed\x36\x0b\x47\x39\xed\x7e\x3f\x3c\xeb\x9f\x7e\x38\x39\x19\xbe\xeb\xfe\x32\x3c\x7f\x7b\x3a\x38\x7b\xfb\xe1\xe4\x10\x74\xc0\x56\xd3\x5c\xe7\xec\xe3\x60\x70\x48\x0f\xdd\xd5\xef\xc7\xef\xcf\x07\xa7\x3f\x75\x4f\x84\xe6\xfd\x93\x41\xf7\x74\xf8\xee\xc3\x8f\x67\x83\xe1\xe1\x87\x9f\xdf\x0f\xcf\x8f\xdf\x0d\x40\x07\x6c\x36\x4d\x15\x8e\xcf\xce\xbb\xef\xfb\xe8\x7b\x8b\x7e\xfe\xf9\xc3\xe9\xe1\xf0\x6c\xf0\xb1\x7b\xda\x3d\xff\x70\x7a\x86\x94\x12\xa8\xd6\x2e\xae\xbe\x3c\x5c\x56\x56\x2a\xa4\xce\xc9\xf1\xfb\xc1\xf0\xb0\x7b\xde\xc5\x59\x69\x87\xc7\xef\x0f\x07\xbf\x90\xb7\x3f\xe4\xaf\x3f\x1f\x1f\x9e\xbf\xe5\x9f\xdb\xe4\xf3\xfb\x0f\xef\x87\xbd\xd3\x41\xf7\x87\xe3\xf7\xdf\x0f\xcf\x3e\x76\xfb\x03\x0c\x05\x74\xc0\x59\x1a\x07\xe1\xa4\x31\x8e\xa3\x9b\x3e\x3d\x74\xad\xb6\xb6\x9b\x94\x77\xdd\x93\x93\xa1\xa1\xed\xe9\xe0\x7b\x0c\x1d\x09\xd7\x29\x9c\x0c\xee\xe6\x55\x0b\x86\x3a\xa8\x4c\x2a\xa6\x81\x93\x22\x79\xa4\x2f\x6c\x56\x49\x85\x17\xf2\x5f\x39\x8f\x23\x3a\x9b\x22\x66\x0b\xc1\x41\xf8\xcf\x02\xcd\x94\x38\x21\x1a\x22\xf4\x50\x93\x89\xc7\xba\x51\x2e\x11\x5f\x05\xcc\xbe\x78\xa1\x37\x51\x23\x73\x86\xc9\x62\x9e\xa5\x72\xe2\x0a\xb7\xaa\xb6\xaa\x03\x5a\x93\x90\xcd\x01\xa8\xf5\xb2\x80\x9e\x3a\x18\x5e\xe3\xe8\x83\x3a\x18\x8a\x67\x2c\x75\x30\x14\xec\x12\xd5\xab\x78\x88\x17\x80\x0e\xc5\xd6\x18\x79\xb3\x19\x09\x00\x40\xbd\x44\xbf\x64\x1a\x6e\x58\x24\x4c\x88\x56\x22\x94\xa0\x2a\xe4\x37\xad\x82\x48\x21\xaa\x26\xfe\xad\x55\x16\xe8\x47\x75\x85\x3f\xb5\xaa\x41\x18\xa4\x27\x41\x92\xc2\x10\xc6\x89\xb8\xbd\x25\xdf\x61\xe8\x5d\xcf\xa0\x5e\x3e\xbc\x41\x8a\x86\x8a\xbb\xaa\x7d\x1a\x72\x41\xd5\xf4\x48\x17\x05\x33\xf3\x92\x14\xeb\xcc\xc3\xe8\x36\x3c\x0f\xb0\xbb\x78\x53\xab\xe5\x8d\xd2\xe0\x33\x54\x45\x48\xfa\x5b\x8b\xd6\xa5\xab\xd3\x30\x1b\x93\x07\x45\xa0\x89\x40\x88\x7b\x0b\x89\x19\xce\xb8\x16\x26\x06\xf2\x88\x8b\x63\x79\x1e\x07\x37\x0c\x96\x04\xca\xbb\xa1\x9b\x10\x89\xc4\xc6\x30\x0a\x51\x13\xf6\x99\xaf\xb2\x19\xdc\x1b\xc4\xa7\x77\xd1\x67\x68\x04\x0b\x3f\x43\x33\xd4\x77\xac\x19\xad\x62\x83\x8c\x46\x60\x09\xc8\xf8\x8d\x79\x37\xe4\x1f\xe7\x4b\xc0\xfd\x71\xae\x42\x7d\x50\x35\x92\x36\x80\x7e\x90\x20\x71\x75\x07\xa5\x8e\x66\xd0\x8b\x39\x90\xaa\x16\x15\x4b\x86\x0f\x59\xb3\xd5\x4a\x1a\x07\x37\x3c\xb1\x85\x3e\xae\x5a\x5b\x71\x56\x52\xa3\x17\xaf\xe3\xac\x41\xb5\x82\x19\xe2\x47\xb7\x21\x07\xab\x31\xbf\x56\xb4\xbb\x64\x72\xe6\x84\xe0\xb2\xee\x84\x8f\xec\x8d\xe7\xfb\xdf\xb0\x2b\x09\x4c\x7b\x4c\x05\x66\xbd\x21\x34\xda\xfa\x84\xcc\x3a\x45\x59\x3a\x06\x98\xd2\x60\xb6\xf1\xec\x94\xd5\xc1\xca\xd4\x4b\xf8\x77\x64\xf8\x71\x6c\x13\x98\xee\x5b\x78\x0f\xc4\x03\x42\xbe\xf1\xc5\x4a\x93\xc4\x78\x73\x88\x67\x7a\x78\x10\x3d\x16\x72\x36\x1b\xa8\xd1\x3c\xf9\x27\xd3\x82\x56\x34\x24\xb6\x79\x30\x1c\x9c\x66\xc7\x94\x68\x53\x46\x0f\x9d\xbe\x7e\xcd\x8e\xac\x59\xb1\xe8\x7c\xfd\x50\xcf\x36\x00\xe1\xe2\x06\xc6\x48\x48\x89\x99\x9c\x7d\x19\x45\xe1\x38\x98\x2c\x84\x6f\x64\x90\x6a\x4b\x8f\x12\x3f\x68\x3a\x87\x77\xe9\xbf\xc9\x30\xa9\xf7\x64\x7a\x9c\x44\x42\x8f\x1c\x07\xec\xd4\x98\x0f\x4d\x87\x0f\x8d\x78\x5e\xa8\x5f\x82\xe1\xa0\x18\x98\x2c\x66\xa9\x21\x73\x30\xf9\x20\x65\x16\x88\xbd\x30\x99\x79\x2c\x72\xf3\x24\x08\xe1\x79\x44\x0c\xe6\xaa\xa4\x70\x26\x30\xad\x32\x62\x6a\x75\x32\xfc\x5c\x9e\xea\x0a\xe1\x6a\xf8\xa4\x14\x36\xc0\xbb\xb4\x4a\xa3\xfd\x84\x5b\x8f\x96\x33\x8e\xe0\x9a\xd3\xc8\x07\x49\xa0\x2e\x30\xdc\x1a\xb2\x90\x1f\x24\x44\xd9\x79\x95\xa3\xcf\x19\x0a\xd2\x47\xcb\xfb\xbf\x59\xb5\x46\x90\xfc\x1c\xe3\x23\x55\xdb\x1d\x2b\x61\xfa\x05\xe5\x3d\x0d\xe4\x5c\x43\xa6\xf9\x6a\x87\x13\xf7\x48\x07\x0d\x71\x60\x19\x48\x03\xe9\xb6\xf0\x40\xd6\x2d\x83\x22\x58\x6e\x2c\x68\xdb\x6f\x30\x20\xec\xc8\x5a\xbe\xd1\x13\x3b\xf1\x6f\x38\x36\xd8\x27\x39\x8a\x6f\xbc\x34\x85\xfe\x29\x9b\xdd\x14\xf0\x8d\x37\x17\x36\x58\x08\x83\x43\x05\xa1\xcf\x8d\x18\xce\x67\xde\x08\x56\x5d\x5b\xdf\x3a\x76\x1e\x51\xf4\x55\xad\xf1\x5b\x14\x84\x55\x7a\xe2\xd1\x08\x92\x77\x67\x3f\xe3\x08\xeb\x04\xbc\x01\x95\xcb\xf8\x32\xac\x80\x7d\x50\xb9\xd4\xfc\x0f\xd9\x3a\x25\xf7\xe1\x69\x17\x19\x87\x39\x22\x9b\x10\x39\x16\x16\xd1\xfb\x79\x66\x25\xb1\x06\xdf\xa9\x16\x52\xa2\xd5\x64\x91\xb1\x85\x6d\x27\xd7\x74\x90\x48\x9f\xd1\x49\x11\xdc\x9c\x06\x93\x69\x6a\xb8\xb8\x53\x6e\x46\xb2\xeb\x4d\xe9\x66\x44\xb8\xf5\x6c\x1e\x28\x97\xe3\xec\xfa\x52\x6a\xc0\xef\x34\xf1\xf2\xa3\xdc\xa5\x20\xaa\x38\xb1\xe2\x8a\xc7\xe3\x57\xbb\xfe\x6f\x8b\x24\xa5\xf7\x6b\xc2\x32\xd7\x8f\x66\x8e\xda\x7c\x49\x24\xd8\x85\x93\x47\x43\x4c\x1a\x16\x73\x47\xb4\x38\x89\x24\xc3\xf9\x6e\x68\x14\x99\x2c\xaf\x42\x27\xb0\x6b\x92\x17\x5f\x98\x0e\xa7\xae\x74\x63\x40\xa9\x2b\x1c\x55\x91\x35\x5c\xbb\xd3\xd6\x06\xe7\x75\x07\x04\x36\x7d\x65\xe4\x9f\xe9\x4d\x54\xb3\x27\x24\x1d\xb8\xc2\x18\x08\xcf\xf3\xe1\xdb\xc2\x95\xb1\xf1\xc4\x07\xce\x34\x9c\x5f\xbf\x4a\x63\x25\xc9\x1e\x97\x6c\x63\xe0\x2f\xfa\xf0\xf3\x34\x48\x61\x32\xf7\x46\xf0\x38\xf4\xe1\x1d\x1d\x4d\x7a\xde\x97\x40\x2f\x1e\x4d\xab\xeb\x97\xc9\xea\x77\xeb\x35\x7d\xa4\x8c\x10\x9e\x5b\x23\x6c\xe4\xbe\x70\x0f\x09\xa1\xb8\x6e\x24\x2a\xd7\x95\x4b\x04\xfc\xaa\x63\x1e\xe2\xa5\x8c\x4a\x2d\x43\x99\xc8\x9c\xc5\x75\x42\x16\x58\x23\xbe\xba\xd8\xdd\xc2\x9a\xcb\x14\xd0\x1f\x24\xef\xe1\x2d\x6f\x53\xec\xdc\xe5\x0f\x4c\xa0\x22\x2d\x04\xca\xc9\x45\xa6\xb9\xa5\xf4\x2e\xb2\x82\xcc\xd6\xc2\x93\x20\x5c\xe0\x74\x8d\xf6\x2e\xb3\x6e\x4b\x9b\x1b\x66\x06\x49\x85\xba\xb8\x4a\x9f\x1d\xb1\xc6\xe4\x9c\x0f\x3b\x8d\x85\xf0\x96\xb7\x62\x9b\x7a\x09\x4c\x4e\xd6\x81\x02\x6b\x95\x69\xc8\xad\xc9\x74\x8a\x64\x92\xd0\xdd\xdd\xa8\x37\x5b\xce\x5e\x8e\xfa\xb9\x39\xb7\x6e\xaa\x07\x9c\xf3\x00\x03\x7d\xea\xce\x66\x85\x8c\x85\x80\x9e\x28\x74\x67\xb3\x2e\x3e\xdb\xd4\x1e\xf6\x5c\xd2\x14\x20\x87\x88\xe6\xf3\x46\x69\x22\x85\x10\xfa\x49\x96\xe3\x48\x24\x4e\x39\x88\x94\xa4\x57\x6c\x66\x9c\x55\x0a\xc9\xa5\x64\x63\x02\xc9\x59\x30\x31\x63\xfa\x51\x14\xfb\x89\xf1\xc4\x50\xea\xc9\x88\xd5\xc3\x6d\xd1\x6e\x82\xb4\x24\xb5\xeb\x86\xb3\x2c\x56\x26\x9c\x8b\x5b\xdc\x7f\x0c\xee\x67\xda\x36\x8f\xe0\xbf\x68\x5e\x89\xcb\x1e\x2d\x6c\x99\x0b\x91\x8d\xe0\xf6\xd7\xa3\x8a\x85\xb4\x28\x3c\xfa\x8c\x81\xf8\xa0\x8e\xbe\x43\x7a\x43\x7d\x58\x72\xb8\x48\x2e\xef\x75\x2e\x9e\xc2\x99\x87\x04\xf4\x3c\x62\x9e\x0b\x56\xb6\xd6\xa4\x63\x20\x12\xe3\x45\x7a\xf7\x96\xf9\x15\x98\xdc\xf9\x5e\xea\xa3\x41\xbd\x54\x64\xd1\xa3\x14\xbe\xee\x90\x24\x51\xf4\xcf\x57\x1d\x05\x8b\xd9\x05\x50\xbc\x54\x78\x30\x82\xcd\x01\x43\xab\xad\xa9\xe8\x4c\x60\x33\x5e\xb2\x45\x9f\x7b\x58\x92\x4f\x75\xb0\x66\xbd\x81\xad\xd5\xed\xb7\xb3\x82\xd4\x51\x1c\xeb\x1d\x7b\x6d\x4d\x9a\x58\x5f\xd7\x09\x61\xde\x75\x42\x4b\x6a\x35\xb0\x4a\xca\xe2\x68\x11\xfa\xac\xde\x4b\x50\x35\x5f\x02\xaf\x81\x56\xad\x8c\x4e\xe2\xbb\x1e\xb7\x1c\x62\x8b\x13\x15\x36\xae\x17\x69\x1a\x85\xd8\xb8\x2a\xe1\xd3\x49\xda\xce\x63\xfc\xef\x21\x89\x7c\xd0\x37\x62\x7e\xec\x4d\x94\xb9\xa1\x65\xda\x4b\xe8\x44\xea\xcf\x82\xd1\x27\xec\xa1\xc5\x2e\x23\x0c\xc4\x26\xd3\x60\x9c\xfe\x00\xef\xcd\x56\x46\x14\x9e\xa1\xef\x18\x92\x06\xc4\x99\x4d\x2b\x4b\x16\x33\xe2\x64\xe0\x2d\x81\xd1\xdc\xe4\xd8\x82\x70\x32\x83\x66\x74\xc0\x9c\xa4\xc5\x8a\xc8\x18\xfb\xc4\x10\x1d\x46\x8b\xeb\xa7\x42\xb4\xe1\x42\x74\x1e\x07\xf3\x62\x88\x54\x2f\x44\xcf\xf7\x4b\x6c\xb8\x05\xbd\x5e\x40\xaa\x8d\xb0\x97\xbe\x33\x94\xae\x5a\x24\x77\x32\xdb\xc5\xcb\x4d\xf4\x19\xca\x17\x2f\xe2\xd5\xa0\xfb\x2e\xa7\x10\x82\xc5\x5c\x06\x9f\xdd\xe2\x39\xa6\xd4\x71\x98\xc2\xf8\xb3\x37\x3b\x0f\x6e\xf0\x05\x4d\x02\x53\x56\xe4\x34\x9d\x33\x08\xd8\x7a\xae\x1b\xbd\x4b\x8a\x0f\x8e\xed\xb0\x25\xcf\xec\xb4\x33\xc9\x7e\x99\xf7\x74\x03\x61\xc7\x51\x68\x2c\xf0\x09\x14\xe7\xb6\x73\x64\x4a\x8c\x60\x66\x72\x17\x52\xf5\x99\xb2\xcb\xd7\xf5\xa2\xd1\x99\x48\xc6\xb9\x59\x95\x2a\x35\x07\xc2\xdd\x8b\xc9\x74\xb4\x68\xdb\x62\xdd\xc8\xb4\xa8\xbb\x1f\xf6\x3e\x9c\xd0\xcc\xf6\xfa\xea\x62\xdf\x03\x28\xf7\x72\xcb\x7b\x3f\xd8\xc9\x2a\xc7\xb2\x27\x1b\x26\xf3\xc5\x13\x3d\x52\xd3\xae\x03\xec\x28\x2f\x5a\x57\xb5\x0b\xc7\xe7\xe6\xd5\x53\x9d\xb1\x39\x91\xa8\x19\xe5\x97\xd8\x09\x4b\x2b\x68\x89\x6d\x4e\xc9\xd1\x23\xed\xcc\x23\x55\x44\xb2\x7e\xfe\x70\x7a\x78\x60\x68\x4b\x58\xf2\x73\x14\xfb\xdd\x94\x21\x59\x6a\xaa\x09\xcb\xfb\x5f\x97\x0b\x48\x78\xec\x5c\x38\x09\x42\xc8\xb9\x20\xdf\x63\x15\x66\x84\x6e\x72\x16\xe0\x06\x89\x71\xa4\x7e\x53\x55\x9c\x0d\xd9\x4b\x61\xb5\x56\x43\xb3\x08\x15\x57\x55\x3e\x08\x2d\x58\xcc\x98\xee\x83\xf5\xda\xe2\xbd\x49\x5d\xdc\x1a\x43\x3f\x20\xfe\xc8\x47\x71\x74\x73\xc2\x9a\x7f\xa4\xc9\xde\x19\xad\xaf\x8d\x2e\x9e\xe6\x31\x10\xed\x41\xf3\x5e\xcd\xee\x2f\x26\xf4\x49\x55\x80\x33\x95\x36\xd0\x01\x17\x74\x9b\xe0\x4d\xe0\x2f\x75\x90\xfd\xf1\xab\x96\xcf\x34\x23\x4a\xc9\x5f\xef\x1a\x47\x27\x6b\xf2\x87\x94\x5f\xc5\xf3\x2d\x23\xdf\xab\x59\xba\x74\xd1\xbc\x02\x6b\x42\x3f\x7e\xa9\xd5\x41\x6e\x9b\x96\xdc\xe6\x57\xf1\x02\x9e\x5a\x66\xb1\x70\xe5\x56\x7c\x97\x87\x6c\x9f\xfc\x5e\xa2\x3d\x5a\x10\x2d\x92\x33\xd3\x5a\x6e\x58\x3f\xde\x00\xb3\xce\x1f\xe0\x7b\xdd\xba\xb5\xe1\x45\xeb\x4a\xf7\x7a\x78\x1a\x63\x22\x5b\x19\x8d\xfa\xa3\x63\xd2\x20\xaa\xec\x5b\x57\x57\x42\x3a\xcf\x6b\x6c\x5b\x08\x8b\xae\x5a\x84\x4d\x7a\xbe\x92\x42\x09\x3b\xdd\x10\x0d\xc7\x66\xf9\xbb\x33\x65\x33\x58\x8c\x81\x68\x21\x32\x2b\x0f\x42\xd5\x79\x44\x17\x23\x1b\xc1\x8e\x70\x35\xc3\x99\x80\x2c\x0a\xda\x89\x9a\x43\x1e\x34\x60\xaf\x75\x03\xa3\x34\x53\x9d\x59\xb8\x1d\xb8\x0d\x41\xb1\x85\x45\xe4\x21\xdf\x0c\x54\x04\xf5\x5a\x4c\xe7\xee\xb8\x43\x2d\x66\xf0\x11\xe0\x16\x73\x8f\x10\x6c\x31\xf6\xc8\xb3\x57\x5e\x7c\xd1\x2e\x6b\xe0\x11\xb0\x79\xe6\x1d\xc3\xf5\xdc\xa8\xc8\x84\x98\x1b\xf4\x63\xaa\xc3\x7c\xea\x5c\x63\x51\x04\x4c\x2b\x07\x8c\xae\x24\x6c\x47\x1e\xa0\x8c\xb1\x92\x89\x99\x75\x47\x6d\x97\xc9\xbc\x18\x7e\x5c\xf5\x30\x48\xe6\x96\xf6\x75\xb2\x4d\x32\xdc\xd0\x16\x9f\x7f\xae\xf1\x47\x36\x82\x65\x06\x6a\x37\x02\xf8\xd8\x5e\x4f\x26\x1d\x47\xb7\xc9\xd5\x13\xea\x5a\x44\x92\x1e\xa2\x8c\x91\x3b\xd1\x3c\xfa\x4a\x86\x3b\x63\x17\xd9\x05\xe7\xb9\xb8\x14\xc0\x37\x8a\xc2\xcf\x30\x4e\x7f\x62\xb1\xc7\xd1\xec\x3c\xea\x4f\xbd\xd8\x1b\xa5\x30\x66\x77\xf6\xaa\x83\x30\x71\xf6\xd2\x4d\x7c\xa6\x70\x58\x3b\x7e\x53\x63\xf7\x05\xe1\x55\xb0\xcf\x43\x9e\x2b\x48\x86\x5e\x73\x08\x59\x7a\xdb\xc9\x09\x56\xbd\x28\x1c\xf7\xf4\xbc\x4d\x99\x9b\x22\xb2\x5a\x4a\xec\x34\xb3\xd0\xed\xb9\x67\xda\xf4\xe8\x89\xd3\x0b\x3a\xec\xa9\x13\x9b\xba\xd8\xb2\x01\xa4\x66\x79\xae\x8c\x98\xe4\x42\x06\x8a\xef\x88\x19\x58\x86\xe1\x40\x93\x9c\x0f\xec\x26\x27\x93\x8b\x35\xa1\xad\xd2\x63\x38\x4e\x7f\x0e\x7c\x48\x62\xc6\xb4\xad\x4c\xe6\x84\x62\xaf\x83\xa4\x06\xbb\xb7\x20\xe4\x5d\xea\x40\x4b\xbc\x42\xb0\xc4\x18\xf2\x33\xd1\x4c\x2a\x42\x87\xe8\x2b\x2a\x66\x38\xf8\xee\xc6\x06\x0b\xb0\x07\x2d\x72\x04\x50\xc0\xcb\x47\x47\xf2\xa1\x52\xf1\xf3\x5a\xab\x39\xd8\x59\xc5\x22\x0b\xb0\x41\x87\x2a\x39\x39\x0c\x13\x1e\xa8\x69\x36\x2c\x75\x64\xc7\xd0\x0b\x06\xf4\xaa\xf4\x7c\xd6\xa4\xc2\xf4\x18\x61\x62\xf1\xcc\xd2\x9d\x7f\x04\x9a\x48\x17\x9c\x14\x19\x2f\x70\x74\x21\x34\x91\x44\xa0\xdb\xc7\x01\xb8\x64\x8f\x3a\xe3\x04\x09\x42\x81\x14\xcd\x19\x9c\x7b\xb1\x97\x46\xb1\x45\xbc\xc9\x95\xa2\xcd\xd5\xcd\x30\x10\xd8\xe9\xb6\xf4\x60\x14\x1e\x10\xd7\xa0\xe8\x7c\x00\xce\x79\xe3\x82\xe5\x9e\x53\xab\xa0\xa5\xcf\xab\x82\xbc\x95\xa6\x5c\x11\xce\xd2\x19\xb1\x9a\xc3\x57\x6b\x3e\xc4\x62\x62\x05\xac\xa2\x65\x66\xab\x4d\x21\xd8\xe1\xd8\x7c\x0b\x59\x8c\x87\x20\x74\xab\xa2\x92\x5f\xd3\x25\x43\xd5\xef\xf4\x40\x9f\x5f\xeb\x73\x1e\xaf\xc9\x50\xf5\x95\x60\xd5\xa4\xfa\x57\x0d\x06\x25\xb2\x34\xf5\xb3\x18\xf5\x19\x31\x42\xca\x3e\x23\xa9\x70\x80\x9c\x74\x6a\x5b\x60\xe9\xbf\x8d\x62\x5f\x38\xbb\xe2\x7b\x62\xdb\xb1\xaf\xf3\xda\xe1\x42\x84\xd6\x48\x58\x72\x16\x6a\x3e\x68\xa7\x6f\xce\x3b\x15\x09\x94\xe8\x0b\x5a\x98\x07\xec\xb8\xe0\x8f\xe2\x82\xb4\xb1\x20\xdf\xbc\x38\x3b\xf4\xf8\xc9\x9b\x2d\x60\x72\x4a\x72\xad\xfb\xd5\x1a\x78\x03\x74\x76\x81\x7d\x50\x35\x94\xae\x9a\xd8\x51\xd3\x79\x5b\x80\x37\x06\xad\x22\x33\x68\xea\x49\xf1\x78\x54\x3e\x95\x60\xfd\x46\x80\x26\xc2\x87\x31\xad\xfe\x5a\x7d\x52\x34\x7f\x74\xc8\x89\xba\xe6\xbd\x5e\xec\xe6\x8d\xee\x96\x50\x83\x72\x52\x65\x3d\xcc\x92\x33\x5e\xa8\xe4\x1f\x3c\x7b\xa8\xca\xe9\x1a\x1a\xe2\x9f\x62\xfe\x19\x43\xb0\xbb\x0e\xcd\x9c\xf7\x44\x63\x9a\x25\xff\x49\xfb\x2f\xf6\xf4\xa9\x1c\x0c\x9e\xf3\xee\xa6\x35\x72\x5c\x1b\xf8\x02\xaf\x6f\x5a\x02\x41\x15\x11\xc4\x02\xb1\x5c\xe8\x87\x26\x76\x86\x83\x66\xe7\x3d\x28\xae\x51\xf4\x22\xd8\x7d\xbd\x5c\x30\xbe\x55\xee\x6d\x1d\xac\x18\x5c\x63\xcb\x44\x4f\xf2\x63\x17\xad\x17\x0e\x17\x74\x34\x3b\x55\x83\x5b\x37\x75\x9f\xeb\xfc\xfb\xfa\x15\x3c\x37\xf0\xc2\x81\xca\x50\xdb\x85\x57\x6c\x95\xa3\x9e\x75\xea\xf6\xdd\xd8\xfe\x88\xc0\xd8\x9c\xe1\x1d\x84\xfe\xb7\x1f\x5c\x83\x16\xd5\x8f\xae\xf0\xdb\x66\xc6\x73\x33\x6c\xd9\x97\x94\x8d\x3c\x29\xc8\xcb\xfd\x6a\x17\xb7\x5c\x49\xc8\xe5\x84\xe6\x3b\xc0\xba\x6d\x9a\xcf\xaa\xd3\x3d\xbb\xea\xc9\x65\x88\x15\xa2\xcd\xf2\xd7\x7a\xcb\x82\x86\xcd\x04\xd8\x03\x22\x49\x57\xf9\x75\xe5\xe3\xfb\x4c\x8e\xbf\x6b\xa6\x62\x8d\x11\x3a\x33\xec\xf3\x59\x84\xf4\xb4\xb3\xd2\xba\x98\xd8\x05\xc7\xfd\x6a\xae\xe8\xa8\x63\x53\x27\x4a\xf8\xb9\xb9\x77\x52\x1c\x7f\xeb\x8a\xbc\x20\x8a\x7e\xf9\xfa\x55\x88\xde\x15\x62\xc5\x5f\xbc\xc8\x82\xfe\x5f\xcb\x71\xb3\x9a\xf1\xa6\x74\xb6\x50\xec\x81\x45\x56\x8d\x77\x02\x9a\x10\x82\xb5\x0e\x20\x20\x9d\x97\x54\xd2\xa5\x9f\x13\x30\x15\xfb\xf2\x60\x79\x0a\x38\xfd\x26\xcc\x7c\xdf\x66\x0f\x0f\x15\xc5\x54\x0a\x01\x71\x91\x40\x0c\x0e\x8d\x08\xce\x28\x1b\x19\x7a\x4d\xcb\x8d\x9f\x9e\x28\xc2\x66\x03\x23\x29\x50\xd3\x2c\x6a\x36\x9f\x5a\x3d\xcf\xc4\xc5\xa2\x65\x31\x70\x37\xfe\x62\x06\x2e\x3b\x88\xce\x31\x6d\x59\xb5\x6a\x96\x80\x8a\x27\x7c\xe5\x89\xb8\xc9\xb5\x55\x0c\xbd\x3a\x28\x90\x84\x2a\xd5\x3d\x89\x05\xb3\xd8\x62\x15\x2b\x48\xc5\xbc\xb3\x62\x3e\xcd\x4c\x64\x38\x4d\xa0\x23\x10\xa8\xda\xda\x52\xca\x29\x63\xc6\x29\x52\x8f\x38\xeb\x9c\x46\xb7\x3c\x28\x44\xf5\x8f\x9c\x79\x49\x7a\x0a\x47\x51\xec\x43\x9f\xde\x17\xd8\x5c\x29\xc5\xaa\x8c\xbf\x56\xb8\x59\xba\xce\xb0\x5a\x21\x1d\xe1\x41\x6e\xf7\xe1\xe8\x8c\x77\xcd\xfc\xac\xb7\x0e\x23\x86\x49\xf0\x4f\x58\x1a\x86\xc2\x6e\x83\xff\xb5\x4c\x5c\x14\x12\xb0\x66\x90\x09\x71\xf4\x8a\x16\xa9\xcb\xc1\x5a\x26\x8e\xfa\x58\x37\xa5\x1d\x11\xe3\x5f\x4e\x7c\xa6\x51\x99\x1b\x32\xcc\x1a\x2e\x5d\xe9\xfb\xbb\x64\x80\xfa\x53\x2f\x9c\x40\xbe\x7c\x19\x20\xf0\x8b\x6d\x55\x66\xf4\x93\x7a\x15\xaa\xf5\xba\xd7\x20\x7e\x16\xf4\xba\x9d\x61\x1c\x3c\x9a\x30\x37\x08\x61\x1e\x40\xb0\x0a\x2a\xf3\x3b\xc3\xcb\x07\xb2\x60\x49\xfe\xe1\x8f\x84\xae\x27\x85\xf8\x2c\x4d\x12\x65\x0c\x1c\xb3\x89\x8f\x85\x64\xaa\xe7\x0f\x84\x98\xac\xbd\xd8\x08\x39\xa7\x74\x1e\x09\x39\xc3\x34\xcd\x63\xe2\x4b\x03\x86\x82\xe3\x66\x48\x74\x6d\x42\xea\x22\x2c\xf7\x26\x3f\xd3\xbe\x2a\x6c\xeb\x34\x7c\xe9\xd6\xa9\x35\xad\x77\x92\x6b\x80\x41\x27\xc8\x9a\x24\x5f\x35\x58\xb5\xb9\x2e\x52\xe4\x55\x6d\xc7\x43\x0f\x8e\x95\xc1\x0e\xc9\xe0\xb6\x6b\xf5\x88\x00\x9a\x47\x55\xe9\x39\x51\x2e\x2a\x16\xe4\x84\x7e\x95\x51\x8b\xd6\x29\x65\xc0\x0e\x5c\x17\x25\x78\x74\xcf\x71\x3e\x71\xb9\x7f\xc4\xdb\xe5\x65\x9e\x56\xe6\xd4\x6b\xc2\xce\x21\xa3\x4e\xf0\xbf\x8c\x2c\xb3\xb7\x15\x5a\x16\x17\x5b\xb6\x88\x2a\x7e\x2c\x7a\x58\xf4\xad\xf0\xa2\x05\x89\x86\xcc\x21\x67\xdd\x32\x1a\xf2\x4e\xcd\x0f\xc6\x63\x92\x2e\x93\xbc\x68\x60\x60\xac\xcd\xd4\x10\x1c\xa2\x10\x14\x29\x00\xd9\xd5\xe1\x9f\xa7\x10\xba\xfa\x4b\x22\x18\x1b\x3e\x9c\xa5\xde\xaf\xe6\x3b\x53\xf7\xfb\x19\x37\x8b\x59\x1a\xcc\x67\x01\x3e\xc6\x6e\x1d\x18\x01\x73\x67\x4e\x4c\x0d\xb6\x73\x1a\x87\x1f\xde\x0d\x0f\x07\x27\xe7\xdd\xa1\xc9\x29\x56\x82\x9a\x23\x69\x86\x59\x5b\x0c\xf1\xc7\xee\xf7\x4b\x20\x36\xae\x0f\x56\xaf\x52\xbb\xc8\xac\x76\x40\xc6\xf8\x97\x02\xe2\x0c\x16\xfc\x6c\x09\x64\x95\x1e\xe3\x31\x8e\xfb\x79\xb4\x18\x4d\xd9\x89\xb4\x6d\xf0\xb9\x72\xc3\xb5\x7f\x05\x98\xa2\x14\xfd\x0e\x93\x8b\xe6\x15\xf1\x0a\x2f\x85\xd1\xe0\xf9\xad\xce\x2e\x26\x6a\x1a\xf6\x35\x3b\xf6\x92\xc4\x32\xf9\x5b\x4e\xaa\xf3\xc7\x8d\xc0\x2d\x3b\x4e\xd4\x16\x67\xcc\x53\xb7\xcb\xc2\x0e\x32\xab\x62\xde\x22\x73\xfe\x5b\x36\xc7\x9b\x8f\xda\x1c\xe3\x59\xed\x21\x15\xfb\xe5\xd9\xdf\x56\x1a\xeb\x5e\x9a\x7a\xa3\x29\xfd\x67\x65\x1f\x6c\xd6\xf5\xe2\xc6\x6f\x89\xf6\x05\x81\xf6\x26\xb0\xf1\x5b\x12\x85\x2b\xfb\xa0\xbd\x45\xbe\x8e\x83\x14\xfd\xb7\xb2\x0f\xe4\x02\x02\x42\x28\x53\xdb\x6f\xd3\x4f\x8b\xd9\x2c\x19\xc5\x10\x86\xc2\xaf\x2b\xfb\xc0\xf5\xb9\x31\x4a\x10\xf0\xf6\x8e\xab\x0e\xc6\xaf\x43\x51\xc9\xd8\x25\x35\xe8\xf4\xf7\x23\xad\xc2\x9e\x5a\x81\xff\xb6\xb2\x0f\x76\xac\x1f\x09\xfe\x9d\x67\x0f\xc2\x5b\x14\x74\x80\x90\x35\x09\xef\xd2\x6a\x0c\x7f\x47\x23\xf4\x37\xb6\xab\x33\x64\x77\x97\x5b\x9c\xc2\x24\x9a\x7d\x86\xb8\x61\xed\xc0\x01\x5a\xac\x88\x30\x60\x6f\x48\xb4\x27\xb8\xf1\xe6\x17\x31\xfc\xfd\xea\xe0\xd9\xdf\x82\x71\xf5\x79\x35\xf0\x89\x2f\x09\x58\x5f\x27\x2f\x65\x60\xef\xc9\x70\x71\x73\x0d\x63\x10\xc5\x80\xe4\x07\x7a\xf6\xb7\xbf\xa5\xd3\x38\xba\xc5\x99\xa1\x07\x71\x1c\xc5\xd5\x95\xbe\x17\x86\x51\x0a\xc6\x41\xe8\x03\x22\x8b\xa0\xb2\x02\x56\x41\x0c\x7f\x07\xab\x60\xa5\xd2\x58\xa9\x1d\xf0\xae\x05\x3e\xa6\x56\x26\xb2\xf1\x09\xde\x4b\xd1\xbb\xf2\xe7\x1f\xe0\x7d\x52\x15\xf9\x43\x8f\x75\x50\xab\xea\x8d\x37\xaf\x99\x40\xc6\xa4\xe3\xa0\x63\x66\xc8\xc1\x33\x42\x6a\x83\xce\x1a\xad\x9e\x06\x10\x73\xad\xbd\x79\xa0\xce\xc9\xad\x02\x73\x12\x4f\x3f\x0d\xe1\x97\x95\xd0\xbb\x81\x2b\xfb\xe4\xd5\xce\x06\x9d\x87\xf5\x95\x1b\x2f\x08\x57\xf6\x57\xb2\x09\x58\x5f\x99\xc7\xc1\x67\x2f\x85\x2b\xfb\xc8\x3a\x78\x50\x49\xd8\x7e\x2a\x12\xd0\xf4\xe5\xf8\xe9\xd4\xcd\x43\xbe\x53\x14\xb9\x26\x38\xe4\xe4\x0d\xcc\xbd\x38\x81\x60\xec\x05\x33\xe8\xef\x83\xf5\x69\x74\x03\xd7\xef\x17\xbe\x17\xac\x7b\xf1\x68\x1a\x7c\x86\xeb\xf3\x38\xf2\x17\xa3\x34\x59\x6f\x37\x5b\x5b\xeb\x93\x28\x4d\xef\xd7\x93\x78\xb4\x3e\x09\xd2\xe9\xe2\xba\x31\x8a\x6e\x68\x03\xf2\xe9\xb7\x64\x3d\x8c\x7c\x38\x24\x44\x24\xeb\xb8\x6f\xeb\xb3\xe0\x7a\xdd\xf3\xfd\x28\x4c\xec\xaa\x04\xfc\x18\xc2\xbb\x39\x1c\xa5\xd0\x07\x69\xf4\x09\x86\xa0\xda\xda\x6f\xd6\x2e\xc3\x5f\xa3\x05\xb8\xf1\xee\x71\x62\x1d\xe0\x85\xc0\x9b\xcf\xe3\x68\x1e\x07\x5e\x0a\xc1\x2c\xf2\x7c\x18\x83\x34\x02\x53\x2f\xf4\x67\x10\xaf\x33\x60\x1c\xa0\xdf\xd0\x0a\x7a\x19\x7e\x05\x0d\xca\x5f\x8e\x0d\x7c\x41\xc5\xe8\x67\x4e\x3d\x3b\xf6\xc1\x38\xb8\x83\xfe\x01\x2b\x4f\xa3\xf9\x3e\x68\x1e\xa0\xc9\xa3\x70\x7c\xf7\xc9\x86\x3b\x53\xb3\xd9\xa8\x4b\x7a\x33\x6f\xf0\xf7\x9e\x8a\x94\x4c\x95\x72\x4a\x24\x05\x9a\x43\xc8\x46\xf3\x2f\x74\x6c\xcc\xd5\xd8\x3c\x86\x73\x2f\xc6\x29\x3e\x8f\xa2\xf8\x9c\xda\x95\x55\xa4\x4e\xea\x40\x48\x97\xc9\x4c\x18\xfc\x48\xa7\x5e\x2c\xd8\x18\x54\xb5\x91\x84\x9d\xeb\x97\xf1\x9b\xcb\x70\x7d\x52\x07\x95\xcb\xb8\x22\x1d\xf7\x09\xd5\x0f\x9e\x3d\x70\x53\xc4\x4c\x10\xe8\x58\x28\x15\x1f\x4f\x8a\xe6\xf7\x6f\xb1\x78\xc7\x55\xf8\xb9\x8e\x8f\x9f\xeb\x59\xe6\x32\xea\xb5\x22\x76\x04\x0f\xeb\xb5\x90\x1b\xf4\x58\xb2\xc9\x69\x1e\xb6\xd1\x2c\x98\x5f\x47\x5e\xec\x1f\x7a\xa9\xd7\x48\x60\x8a\xfe\xad\x56\x10\x21\x15\x1d\xbe\x31\x5f\x19\xe9\xb1\xb2\xcf\x86\x9f\x6d\xa0\x11\x4f\xd6\xe7\x33\x2f\x08\x4b\x22\x30\xd9\x82\x19\x6b\x05\x06\x61\xbf\x63\xfe\x97\x28\x0f\x5e\x92\x42\x95\x8b\x8c\x29\xf0\x73\x23\x49\xa3\x39\x12\x37\x6f\xe2\x89\xf7\x48\x24\xd9\xd2\x9d\xf0\xf6\x14\xda\x50\x7a\xe9\x68\xfa\x11\x01\x94\xcc\x72\x54\x4f\xda\x09\x90\x94\x72\x4e\x49\xd4\x46\x8a\xc9\x9f\x60\xa3\xa3\x2a\x53\x4a\x79\x2a\xe7\x8a\xa3\xf3\xf7\x2e\xf5\x62\xe8\x35\xf0\x64\x50\x72\x7d\xe2\x1a\x24\x95\x1b\x66\x41\xa5\x0e\x14\x18\x5c\x5e\xe3\x9b\xc6\xc8\x0b\x47\x70\x86\x36\x18\x92\xad\x5d\x40\xa6\x50\x15\x93\x5c\x69\x47\x10\x84\x29\x46\x11\x9c\x48\x22\xa8\x1c\xaa\x48\x7c\x57\xf9\xf0\x60\x97\x46\xba\x75\x2d\x42\x94\x26\xb8\x13\x83\xe0\x2e\x43\x96\xa0\x05\x04\x31\x44\xb2\x21\xfc\x29\x08\xeb\x4d\xf4\x19\xcb\x4b\x37\x86\xde\x8f\xa1\x0f\x63\x12\xc0\xbe\x88\x93\x88\x09\x2f\x19\x72\xd6\x11\x2e\x02\xe4\xf4\x72\x9e\xf9\x54\x56\xf0\xca\xc6\x1f\x3b\x93\xaa\xb1\xc7\xe3\x2a\xed\x26\x3f\xa9\x54\xaa\xf0\x73\x50\x47\x1d\xfa\xa8\x1d\xe5\x32\x0c\xd3\x5f\xc0\x1a\x68\x35\xe5\x13\x50\xa5\x0d\x79\x54\x2f\x6b\xf2\x6b\x7e\x93\x7f\xb2\xa8\x92\x4a\xab\xd9\x6c\xaa\x75\xc6\xd1\x68\xc1\xe3\xa1\x6c\x57\x37\xd2\xd4\x34\xf3\x4b\x71\x23\x33\x33\xcc\x59\x89\xb3\xcc\x59\x8b\x32\xcd\x59\x87\x30\xc9\x59\x85\x33\x45\xc8\x26\x53\x07\x9b\x92\x7a\x74\x49\x13\xda\x8d\x38\x3e\x0b\x32\x89\xdd\xac\x71\x0e\x05\x59\x8b\x12\x72\xec\xeb\x51\x71\x59\x56\x46\x94\x69\x33\xf7\x3a\xa1\x8a\x0a\xfe\x26\x2f\x0f\x1a\xe5\xa0\xa3\xf7\xc6\x76\x2c\xd0\x67\x0a\xc1\x72\x2e\xb0\xf1\x9f\x57\xf1\xfe\xf3\x2a\xde\x9f\xf6\x2a\x9e\xe4\x1c\xfd\x5b\x92\xfb\x9c\x5d\x5f\x72\x26\x28\xf0\x1a\x58\x5f\xcc\xe4\x69\x7e\x08\x4c\xa8\xc2\x5f\x9d\xad\x03\xf2\x48\xbb\xe1\x55\xfc\xe5\xde\xfa\x12\x1e\x07\xf5\xa5\xe7\x40\x85\x3a\x12\x4a\xbc\xb8\x0a\x7f\x6b\xf6\x8e\xf6\x7e\x95\x79\x38\x84\xde\x49\xee\x9f\x78\x29\x28\xe3\xf2\x29\x3a\xcc\x0d\x6f\xb3\x87\x3e\xc1\x37\x75\x60\xb5\x91\x4f\x16\xa9\xa5\xe9\x57\xaf\x55\x9f\xa2\x03\x46\x52\x1b\x37\x5c\x5a\xcb\xe6\xff\x13\x72\x57\x53\x20\x06\x69\x04\x59\xfc\x82\x54\x87\xc7\x2c\x14\x79\x65\xd6\x05\xc8\x60\x91\x79\xd7\x49\x34\x5b\xa4\xb0\x52\xb8\x35\x31\x04\x2a\xcd\xe2\x2d\xa8\x79\x51\x59\xdb\xdb\xdb\xdb\x83\x37\x45\x1a\xa2\x35\x14\x1f\xb8\xe1\xde\x57\x7e\x2e\x84\x0c\xa6\xdd\x34\x8d\x83\xeb\x45\x0a\xab\x15\x2f\x0e\xbc\xb5\x69\xe0\xfb\x10\xed\xef\x2a\x68\x84\xcd\x2c\x92\x66\xa6\xe1\xe1\x6c\x65\xbc\x64\x10\xc5\xfc\x72\x86\x7e\xc4\x94\x92\xec\x93\x03\xf2\xae\x88\xf5\xe6\xaa\x3d\xef\x92\xd7\xac\xa1\x53\x64\x27\x30\xba\x81\x69\x7c\x9f\xe5\xe6\x91\x19\x3b\x81\x69\x2f\x5a\x84\x7e\x10\x4e\xfa\xd8\x40\x3e\xa5\x66\x8d\x28\xdd\x0c\x08\xb3\x4b\x3b\x1d\xd0\x44\x1a\x94\x97\x33\x53\xb4\xdc\x5d\x4d\x96\xf0\x81\xc0\x7d\xde\xe9\x00\x05\x15\xcf\x57\x25\x5c\x9d\x2b\x58\xcd\xb3\x8c\x59\xd0\x32\x3c\x93\x8c\x70\x33\x5a\x81\x6b\xa8\x4b\xb6\xb7\xa3\xa9\x17\x27\xc1\x3f\xe1\x88\xf8\xc1\x54\x6c\xe3\x46\xc5\xa4\x2f\x7a\xd2\x29\x61\x46\x68\x25\xb5\x46\x1a\xc9\x6b\xa8\x04\xc6\x62\x42\x0a\x82\x62\x31\x22\x9f\x34\xb4\xe8\x3f\x46\xe4\x7f\x8c\xc8\xa5\x8d\xc8\x5c\x0b\x32\x88\x47\x8b\x99\x17\x9f\x04\x49\x5a\xd0\x84\x14\x5a\x58\x6d\x48\xa1\x4e\xf5\xc6\xbb\xd3\x23\x2c\x96\x33\x1b\x3d\x2c\x78\xe4\x31\x55\x2c\x84\x02\x70\xad\xb2\x94\xba\x42\x7f\x2b\x75\x66\xf0\x95\x2d\x69\x4b\x0a\xbd\x94\xac\x31\x4e\xd4\xd2\x06\x19\xee\xa8\xe6\x97\x25\x98\x65\x89\x0c\x2c\x84\xb7\xef\x4c\x6c\x06\x99\xbb\x4e\x57\xe3\x9d\xd4\x48\xd6\xc3\xa6\xa7\x7f\x78\x34\xb7\xd8\x8e\xba\xde\x52\x5f\x34\xeb\x23\x73\x0c\xff\x45\x90\xa5\xed\xc2\x7d\xa4\x41\x50\x13\x98\xf6\xef\x47\xb3\x60\x44\xd2\x92\x04\xb5\xfc\x6c\x3d\xa2\x30\x60\xd8\xa6\x55\xc7\x26\x03\xdf\xd0\x42\xb7\x09\xc5\xec\x71\x12\x51\x4a\x16\xcc\x82\x40\xde\xa5\xa0\x1f\xc1\x6b\x09\xb0\x69\xd0\x24\x21\x90\xa8\xc0\xf2\xc0\x41\x59\x47\x5d\x19\x2b\x32\xf8\x8b\x90\x70\xcc\xd7\x1d\x45\x5d\x01\x4a\xca\xa4\xcd\x90\xff\x99\x63\x3a\x8e\xe2\x01\xbe\x68\x2e\x3e\xa8\xf6\x0d\x0e\x30\xad\x67\x48\x29\x5e\x7b\xa3\x4f\x63\xed\xb9\x1b\x06\x2c\xd0\xd3\x15\x02\x35\x11\xc3\x50\x98\xa4\x7a\xd5\x6c\x9c\xf1\x72\x81\xa6\xfb\x10\xe7\xd3\x60\xa3\x3b\x6c\xd9\xc7\x37\x23\xb0\x4a\xb0\xe0\x17\x23\x87\xad\x5a\x1d\xb5\xcb\x7f\x8e\xef\x89\x37\x9d\xc6\x91\x42\x34\xc9\x6f\x27\x91\x4c\x41\xfa\x9d\x60\xae\x62\xc2\x0d\xe5\x34\x01\x16\x9c\x89\x09\x67\x9d\xac\xd8\x7a\x94\x76\x3e\x4e\xd0\x21\x6d\x8b\xe0\x9e\x2f\x94\x60\x84\xf2\x58\x25\xe5\xa0\x20\x07\xd2\xae\x82\x49\x19\x73\xb7\x35\xae\xf7\xc0\xa0\x92\xd5\x84\x24\x19\x48\x51\x6d\xe7\x82\x35\x81\xce\x4b\xe1\x29\xec\x33\xe8\x63\xcf\xad\x72\xfb\x49\xd2\x69\xb1\x07\x0f\x45\xc6\x25\x9a\x5b\xb7\x91\x45\x45\x50\xc4\xbf\xb6\x86\xf3\x01\x15\x93\xc7\xf9\x2c\x18\xc9\xbb\x58\x9a\x5a\xc4\x87\x33\x98\xc2\xbe\xe9\xf5\xa3\x20\x85\x37\x89\xf2\xde\x2d\x57\x17\x43\xa4\x7a\xda\x07\xe8\xdf\x57\xc0\x8b\x27\xf8\x60\x85\xab\x19\x30\x34\xac\x0a\x18\xde\xc5\x30\x00\x6b\xa0\x8d\x84\x8a\xb7\xba\x18\x8a\x89\xe1\xe4\xcd\xab\x85\x3e\x60\x7c\xff\x96\xac\x4d\x92\x64\xae\x89\x3d\xb4\x2e\x56\x45\x8c\x92\x42\xb6\x0b\x58\x95\x38\x5a\xc0\x92\x61\x74\x76\x24\x42\x2d\xdc\x20\x43\xf2\xe2\x05\xe1\xa5\x25\x0a\xc0\xba\x74\xd3\xa7\x80\xc1\xeb\x8c\x5d\x6b\x6b\xcb\xb1\x03\xac\xca\x24\x3c\x85\x65\x67\xb2\x3b\x45\x24\xcb\x8f\x1e\xcb\x00\x43\x46\x91\xc8\xa1\x9a\x8b\xd0\x12\x2d\xce\x58\x27\xf7\x97\x19\x50\x4e\xbd\x44\x52\xb1\x2f\xc2\xf4\x3c\xa2\x31\xbf\x2e\x90\x35\xe6\xef\xce\x61\xea\xcb\xa7\xa6\xe9\x56\x3b\x22\x06\x5b\x83\x99\x14\xff\x91\x07\x5f\xd2\x8c\x02\xf4\xfc\x97\x6b\x6c\x23\xc3\xfa\xdb\x91\x87\xd3\x02\xae\x88\x2e\x45\xd4\xe9\xce\xdb\x23\x53\x1c\xf5\x88\x66\x37\x75\x19\xbc\x23\x29\x9d\xb1\x66\x6d\x3f\xcb\xe5\xbf\xe2\x85\x2d\x4c\x6a\xd3\x67\x9d\xc3\xb5\x42\x4a\x7c\x1a\x8c\xd9\x41\x6b\x62\xd2\xe5\x23\x92\xf8\x95\x3e\x57\x65\xe4\xc3\xab\xd2\xa7\x87\x64\xee\xbc\x22\xa7\x91\xe4\x8f\xd7\x1d\x27\x37\x55\x07\xc5\x0a\x69\xc5\xd4\x3d\x88\x16\x29\x88\xc6\x20\xf6\xc2\x09\xd4\x4f\xf6\x64\xbc\xab\xfc\x09\x33\x53\xac\xb6\x82\x87\x7a\xd0\x62\x3e\x01\xc8\x18\x15\x84\x60\x16\x24\x29\xb8\x86\xf7\x51\xe8\x03\x6c\x51\x81\xa6\x1d\x31\x7f\xeb\x4c\x43\x28\x29\x28\xc2\xcf\x4c\xa3\x36\xdd\xda\x34\x61\x2f\xbd\xa3\x69\xcf\xbb\x45\x77\xd0\x13\xf1\xa3\xfa\xcc\xbb\x1e\x9f\x08\xef\xe6\x5e\xe8\x23\xe9\xe8\xa1\x3d\x30\x6f\x3a\xa2\x09\xd3\x98\x00\xac\x59\x04\x9a\xf5\x54\x82\xe3\xcc\xff\x9b\xcd\x60\xb1\x8d\xae\x40\x68\x6e\x3e\xa9\x51\x11\x55\xa9\x62\x32\x65\x07\x04\x05\xac\x48\xa9\x9e\xd5\xc4\x33\x73\xb6\x60\xf6\x4c\xd3\x2a\x35\xca\x37\x2e\x9e\x62\xfc\x8b\x68\x46\x65\xe9\x2b\xb4\xf3\xd1\x0d\xef\x55\x40\xeb\xfe\xc3\xb8\x66\x28\xa7\xef\x02\x25\x25\xb2\x7c\x29\xa7\x8f\x32\x14\xcb\xe9\xbb\xd8\x67\xcb\xf1\xfb\x5f\x2d\xf1\xc1\x61\x74\x43\x75\x36\x01\xf6\x31\x8a\xf2\xf2\x7b\x99\x9a\x54\xd1\xe8\x6a\x9b\x38\x7a\xba\x8c\xfe\x51\x97\x20\xc7\xa7\x39\x21\xe1\x42\xcb\xfb\x16\x84\x3f\x26\xa8\xd1\x97\x07\xf1\x00\xd4\x44\x8e\x98\xbe\x65\x84\x19\xe8\xbc\x22\x83\xea\xc5\x7d\x66\x5f\x21\x62\x1a\xc2\x36\x52\xd3\x42\x50\xb9\xc5\x25\xc7\xec\xef\xe1\x6d\xe1\x40\x51\x15\x02\x46\x39\x8f\xe6\x66\x00\x02\x2b\x2e\x60\x76\x85\x97\xdd\x8d\x1a\xf9\xf1\xa1\xf7\xdf\x83\xfe\xf9\xf0\xf8\x70\xd8\x3d\x3f\x3f\x3d\xee\xfd\x78\x3e\xc0\xc6\xa6\xd6\x73\x3a\x69\xa4\x72\xca\xee\x1c\x46\xc7\x70\x06\xbd\x44\x09\x1f\xd3\xaf\xc1\x85\xbb\xf2\x27\xe9\x44\xfe\xb2\x1b\x2d\x66\x3e\x40\x2b\x2f\xa3\xd0\xe3\xfd\xc3\xc5\xf7\x30\x05\x54\x4a\x0c\x57\x79\xe8\x87\x6c\x7d\x9e\x92\xf5\xaa\x68\x8f\x66\xd0\x0b\xf9\xeb\xac\xda\x65\xb4\x28\x18\x8b\x64\xaa\xd4\x28\x36\x3e\x99\x64\x16\x99\x0b\x82\xf7\x8b\xe2\x8f\x90\xcd\x5f\x25\x3c\x16\x87\xce\x18\x89\x18\x46\xf8\x77\x2d\xa1\x2c\x34\xdd\xed\x17\x65\x62\x1d\x04\x7e\x23\x65\x19\xc8\x5b\x4d\xc3\xf3\x37\x4b\x48\xb1\x34\x12\x79\xb2\xcc\xe8\x1f\xcd\xbc\x24\x79\x4f\x9e\xb7\x16\x3d\xa2\xd9\xf7\x20\x0c\x61\xfc\xf6\xfc\xdd\x89\xf0\x5d\x5e\xa4\x4c\x54\xb1\x08\xc3\xa2\x0c\x41\xc0\x7d\x2f\xf5\xd6\xa2\xeb\xdf\xd6\x02\xbf\x62\x69\x29\x0e\x06\x39\x8b\x62\x4b\x9e\x65\x2d\x30\xd3\x66\x5e\x02\x8d\x18\x2d\x4b\xe1\xe3\xc2\x1c\xbf\x51\x30\xc7\x88\x64\x7e\x48\xaa\x5e\x1c\xd7\x01\xe4\x49\x2b\xe9\x38\x79\x71\xcc\x13\xa3\xa2\x8f\x24\x2d\xaa\x18\x1f\x40\x9a\x63\x0b\x9c\xfc\x7a\xf0\xcc\xc6\xac\xef\x61\x08\xe3\x60\xa4\xf3\x07\xff\x82\x7f\xbf\xaa\x1d\x98\xdb\x5e\x2f\x42\x7f\xc6\x2e\xf9\xff\xbf\x00\x00\x00\xff\xff\xd0\x34\x07\xda\xad\xcc\x0b\x00") - -func staticJsBundleJsBytes() ([]byte, error) { - return bindataRead( - _staticJsBundleJs, - "static/js/bundle.js", - ) -} - -func staticJsBundleJs() (*asset, error) { - bytes, err := staticJsBundleJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/js/bundle.js", size: 773293, mode: os.FileMode(436), modTime: time.Unix(1503385152, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _staticJsGottyBundleJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xfd\x79\x77\xe3\x38\xb2\x28\x88\x9f\xdf\x32\x33\xe7\xbc\x3f\x66\xdf\x57\x9a\xdd\x4f\x45\x96\x60\x99\xd4\xe2\x45\x32\xd3\x4f\x69\xd9\x95\x7e\xed\xb4\xf3\xda\xce\xae\x5b\xa3\x54\x67\xd3\x52\xc8\x62\x27\x45\xaa\x41\xc8\x4e\xb7\xa5\x3b\x5f\x7d\x0e\x56\x02\x24\x25\xbb\xea\x76\xdf\x99\xca\x92\x4c\x21\xb0\x04\x02\x81\x40\x44\x20\x40\xec\x4c\x97\xc9\x98\x44\x69\xe2\x80\xfb\x22\x9f\x2d\xe2\x44\xee\x4b\x34\x75\xf0\x30\x1a\xb9\x18\xc8\x12\x27\x16\x7d\x6e\xc0\xf7\x45\x8a\x49\xd6\x7b\x0c\xb1\x95\x06\x34\x29\x78\x89\xba\x11\x8a\xbb\x3b\x3e\x12\xc0\xee\xcb\x7a\xdd\x13\x85\x80\x16\x1a\x87\x71\xec\xa4\xb2\x2c\x4a\x51\xfe\x4c\x5c\x94\x36\xe2\x60\xc7\xcb\xd3\xd6\xb4\x6e\x1c\xbc\xac\x7b\xa4\x31\x0f\x00\x91\xc6\x38\xc0\x88\x34\xa2\x40\x47\x55\xd6\xbf\x46\xa4\x31\xd1\x20\x08\xa3\xc8\x7d\x21\x8d\x94\x3e\xba\xab\xd5\xf5\xfd\x5f\x60\x4c\x1a\x13\x98\x46\x09\x7c\xc2\xe9\x02\x30\x79\x66\xd9\x5e\xc6\x69\x32\x8d\x1e\x96\x38\xbc\x8f\x81\xa1\x9f\x2c\xe7\x20\x7e\x79\xe8\x01\x48\x37\x5a\xbb\xb4\xfe\xc4\x68\x99\xa3\x07\xb5\x1a\x34\xbe\x7e\x85\xec\x63\x3a\x59\xc6\x70\xa2\x72\xe4\xa8\xd1\x46\xc3\x65\x4c\xd6\xdd\x0a\xa0\xa2\x10\x69\x4c\x1c\x8c\xec\xd0\x46\xd8\x45\x98\x36\x97\xea\xdd\x21\xaa\x88\xe8\xc9\x02\xa7\x24\x25\xcf\x0b\x68\xcc\xc2\xec\xfa\x29\x91\x7d\xe2\x54\xa6\x05\x68\x1d\x8b\xc0\xb6\x11\x71\x48\x23\x0b\x9a\x87\xee\xda\x19\xea\x55\x22\xec\xbe\xd8\xcb\x0c\xac\x8c\xe0\x68\x4c\xec\x9e\x1a\xf7\x48\x76\x90\x04\x64\x16\x65\xbd\x68\xea\xec\x38\xf4\xc9\x8a\x92\x8c\x84\xc9\x18\xd2\xa9\x15\xb9\x92\x25\x12\x78\xb2\x22\x27\xc4\x0f\xcb\x39\x24\x24\x1b\x7a\x23\x94\xff\xf0\xf5\x1f\xcd\x91\xdb\x23\x8d\x7b\x9c\x3e\x65\x80\x83\x5b\x3a\xa8\xb4\xb6\x38\x88\xc4\x03\x5a\x36\xce\x1e\x21\x21\x67\xf3\x88\x10\xc0\xbc\x37\xb4\x65\x17\xd9\xc9\x72\x7e\x0f\xd8\x0e\x02\xda\xed\x74\x6a\x41\xad\xe6\x40\xf0\x32\x4e\xe3\xac\x6b\x34\x4e\xab\xef\x1a\x18\xcc\xc2\x64\x12\x03\xee\xea\x98\xac\x5d\x04\x01\xac\x56\x2f\x6b\x24\x68\xfa\x0d\x9e\x33\x27\x92\xe3\x95\xb9\x8d\x69\x8a\xcf\xc2\xf1\xcc\x51\x54\xc3\xee\x4b\xb2\x8c\xe3\x20\x80\x21\x1e\xd1\xe6\x87\x78\x14\x44\x8d\x74\x41\xa1\xd9\x10\x8f\x50\x34\xc4\xa3\x9d\x20\xc8\x6b\xd1\x33\x0e\xf1\xc8\x75\x11\xa1\xcf\x34\x61\xed\xa2\xc3\x20\x08\xa0\x31\x4e\xe3\x14\x67\x8d\x18\x92\x07\x32\x3b\x91\xbf\x73\xc0\x38\x4d\xc6\x21\x71\xa2\xc6\x57\x91\x90\xc5\xd1\x18\x9c\x43\xd7\xed\xfa\xfb\xff\x9a\x1a\xfc\x7d\x5a\x85\xf7\xa6\x2a\x78\x09\x0f\xed\x36\xdd\x8d\x08\x51\x20\x2a\x94\xd8\x6d\xd2\x36\x2a\x3a\x4a\xc9\xf2\x76\x44\x37\x55\xed\x22\xca\x1e\xc5\x7a\x78\xa2\x18\x17\x2a\x3d\xe8\xcf\x45\x88\x21\x21\x01\x34\xee\xd3\xc9\xf3\x6a\x05\x22\x61\xb5\x72\xfa\x27\xfd\xc6\x03\x90\xb3\x18\x18\x77\xbc\x7f\xbe\x0b\x1f\xae\xc2\x39\x38\x36\xcd\x6a\xbb\x43\x6f\xd4\xa5\x03\x9f\x37\x26\x9a\xca\x68\x35\x0f\x90\xce\x81\xe0\x67\xca\x7b\x0c\x4e\x19\x30\x00\xf6\xc7\x80\xfb\x02\x2e\x13\x82\xa1\xaa\x2e\x2f\x38\x42\x74\x4e\x33\x7e\xad\xd5\x78\x37\x12\xc7\x9e\x84\x24\xb4\x73\x88\x40\xe4\xf9\x3e\xcc\x20\xf0\xc4\x8f\x49\x94\x2d\xe4\x8f\xef\x2a\x55\x3e\x8c\x97\x38\x4b\xf1\x2d\x09\x09\x98\x49\x1f\xa2\xc9\x04\x92\x60\xc7\x97\x9d\x4b\x1e\x01\x93\xb3\x34\xe6\xbf\xff\xba\x84\x25\x30\x39\x42\x7f\x65\x63\x9c\xc6\xf1\x5d\xaa\x1a\xe2\x09\xef\x53\x42\xd2\x79\xa0\x3a\xb1\x2b\x2b\x5b\x66\x24\x9d\xff\x01\x9e\xd9\xac\xfe\xc0\x91\x0f\x28\x29\x75\x0c\xde\xc7\x51\xf2\xed\x22\x21\x80\x1f\xc3\x58\x83\x86\x8b\x45\x1c\x8d\x43\x3a\x88\x7f\x80\xe7\x45\x38\x51\x48\x6a\x90\x53\x56\x85\x82\xa4\x38\x7a\x88\x92\x8f\xe9\x04\x54\x52\x94\x64\x80\x89\x91\xf4\x84\xc3\x45\x88\xd3\x65\x32\xe1\xc9\xa2\x33\x49\x8a\xe7\x06\x06\xe3\x59\x88\x33\x20\x5a\xca\x43\x45\x52\x0c\x8f\x10\x2b\xa2\x72\x78\x16\x0c\x69\x0e\x31\xe2\x13\x18\x5f\xa6\xe3\x90\xa4\x58\x0c\x8f\xef\x7d\x4c\x97\x99\x60\xcc\x47\xd2\xf4\xcc\xdf\x2d\xe3\x37\x47\x4b\x4b\x98\xd3\x47\x46\x52\xc1\x38\x19\x24\x93\xf3\x74\xbc\x14\x3f\x97\x64\xaa\xe5\xce\x1e\xb0\xf6\x6b\x89\xbf\x3f\x12\xed\x37\x70\xa6\x97\xc8\x47\xf1\x04\x43\x22\xd8\x11\xa6\x18\xb2\xd9\x2d\x09\x31\x31\x52\xce\x92\x89\xa8\x3a\x7c\x84\xc9\x3f\x6b\xcf\xbf\x68\xcf\xa7\x39\x5f\x43\x38\xa1\x2b\xaa\x22\xf4\x13\x8e\x88\x91\x30\x81\x69\x9f\x10\x1c\xf8\x2d\xff\xb0\x9d\xb3\x27\x4b\xd3\x33\xa8\x99\x1c\xce\xb3\x60\x38\x52\x19\xe9\x44\xfe\x44\x53\xe5\x30\x2c\x30\x4c\xa3\xef\x8a\x6f\x17\x69\x46\xf4\xdf\x51\xb2\x58\xe6\xfc\x08\x4f\xd6\xbc\x71\xa1\x25\x89\x35\x47\x36\x96\x89\x4c\xcf\x8d\x4f\xec\x87\x53\xaa\x03\x69\x05\x30\x24\x13\xc0\x20\x10\x97\xbf\x56\xab\x9c\x63\x32\x88\x81\xad\x28\x1f\xc3\x24\x7c\x90\x39\x8b\xa9\x7a\x09\x3a\x43\xa2\x69\x24\xb3\xaa\x9f\xab\x15\xc5\xeb\x6b\xe3\x52\x26\xe4\xf4\x85\xf7\xcb\xe9\x14\xb0\xa2\x12\x4b\xbb\xa0\x9a\xc2\x03\x86\x2c\x53\x73\xe1\x7b\x3a\x9d\xde\x42\x42\xee\xd2\xd3\x90\x8c\x67\x9f\x17\xda\x2c\x89\x08\xdc\x92\x74\xb1\x80\x7c\xea\x65\x4b\x8c\xd3\x87\x90\xc0\xd7\x59\xf4\x30\x53\x04\x8d\xa3\x04\x32\x46\xa4\x69\xe3\x34\xc2\xe3\x65\x1c\xe2\xcb\x28\x23\x8e\x26\x25\xee\xc3\xf1\x37\xb7\x37\x4d\xb1\xc3\xb5\x27\x25\x2e\x7a\x78\x77\xb7\xe7\xe6\xf5\x34\x16\xcb\x6c\xc6\x4b\xde\xc7\x61\xf2\xed\x32\x4a\xc0\x71\xdd\x5e\x25\x99\x84\x94\x2c\x26\x37\x32\x20\x9c\x02\x4e\x5e\xb1\x18\x21\x12\xde\xab\x89\x43\x96\x0b\xda\xc5\xcc\x11\xb0\x65\x06\xf8\x96\xa1\x1b\x25\x0f\xc1\x8e\xbf\x56\x6a\x51\xca\xb5\x26\xaa\x59\xf6\x31\x0e\x9f\x1b\x51\xc6\xfe\x3a\xe0\xae\x56\x0e\x04\x43\x18\xd1\x25\xaa\xa4\x35\x80\xfb\x02\x8d\x70\x32\x61\x13\x96\xd2\x04\x12\x8a\x14\xad\x69\xb5\xda\xf1\xdd\xb5\x9b\xb7\x91\xe5\x6d\x40\x03\xc3\x3c\x7d\x84\x8d\xc5\x54\x21\xa1\x21\xaa\xdf\xd8\x71\x5f\xa4\x2c\xcf\x08\x5e\x8e\x49\x8a\x03\x58\xe3\x5c\x6b\x0c\x34\x0d\x12\x81\x96\x4e\x07\x10\xe7\x35\x87\xbc\x66\xa1\xec\x4a\xcd\xad\x11\x65\x1f\xc3\x71\xad\x46\x1a\x61\x4c\xfe\x00\xcf\xb5\xda\x0e\x69\x8c\x09\x8e\xe5\xf3\x1c\x48\xf8\x07\x60\x6b\xac\x56\xe4\xf6\xe7\x28\x99\xa4\x4f\x99\x5e\xb0\xb2\x9c\x50\x8a\xed\x6f\xf0\xbc\xa0\xac\x4a\x75\xbe\x06\x45\xef\x04\x77\x71\xad\xe6\xec\x30\x5d\xed\x34\x9d\xc0\x6a\xa5\x1e\xdf\xb5\x0f\x34\x92\xc4\x52\xc3\xe5\x26\x0a\x1c\x1f\xfb\xfb\x2b\x72\x7c\x7c\xb8\xc2\x54\x9d\xa5\x13\x6b\x27\x88\x1b\x5f\xc7\xe1\x78\x06\xc3\x54\x99\x37\x5a\x92\x62\xd4\x0c\x25\x28\x44\x33\x34\x46\xcb\xc0\xdf\xf3\xd0\x24\xd8\xf5\xd1\x22\xf0\x7a\x8b\xe3\xa8\xf1\x68\xe8\x34\xbd\x45\xbd\xce\x4c\xa6\x2c\x50\xa0\xe1\x62\x84\x92\x80\xab\xc5\x01\x57\x47\x03\xaa\x80\x22\xaa\x77\x39\xe3\x20\x6e\x4c\x22\xae\x55\x8b\xb1\x67\xad\xb9\xae\xfb\x32\x09\x16\xbd\x7b\x0c\xe1\xb7\xf5\xf8\x78\x59\xab\x39\xcb\x60\x8c\x26\xc1\xc2\x5d\x97\x91\x0d\x26\x79\xdf\x67\x9a\x65\x24\xf4\x43\x45\x2e\xff\xa0\xf0\xfb\x50\xff\xbd\xde\xfb\x71\xe7\xdf\x59\x3f\x5a\xdf\x09\xe0\xb9\xe5\xcc\x08\x59\x64\xdd\xbd\xbd\x64\x31\xff\x0b\x65\xa6\xf9\xde\x22\x1c\x7f\x0b\x1f\x60\x8f\x65\x70\x69\xd6\xff\x40\x35\xb1\x24\x03\xeb\xe3\xc5\x1d\xfb\xfd\x08\x38\xa3\x58\x34\x1b\x87\x0d\x9f\xa6\x04\x01\xcb\xbd\x77\x79\x71\x7a\x76\x75\x7b\x16\x04\x34\xf1\x34\x5d\x3c\xe3\xe8\x61\x46\x2c\x67\xec\x5a\x4d\xcf\x6f\xef\x36\x3d\x7f\x1f\x59\xb7\xe9\x12\x8f\xe1\x32\x8c\xb0\xf5\x09\x47\x8f\x21\x01\xeb\x34\x9d\x2f\xc2\xe4\x39\xc7\xe7\xe9\xe9\xa9\x91\xb1\x7c\x71\x18\x61\x8a\x98\x5b\x59\x67\x93\xd6\xd9\x42\xd6\xe9\x0c\x47\x19\x49\x17\x33\xc0\xd6\x7f\x84\xe9\x14\x83\x56\xd9\x43\x44\x66\xcb\x7b\xd6\xbb\xf1\xec\x2f\x7f\xd9\x63\x55\xd1\xcf\x27\xc0\xf3\x28\x63\x7d\x89\x32\x6b\x06\x18\xee\x9f\xad\x07\x1c\x26\x04\x26\xc8\x9a\x62\x00\x2b\x9d\x5a\x74\xb9\x7f\x00\x64\x91\xd4\xa2\x38\x2e\x00\x67\x54\x54\xdc\x93\x30\x4a\xa2\xe4\xc1\x0a\xad\x71\xba\x78\xa6\xf5\xa5\x53\x8b\xd9\x50\x59\x3a\x25\x4f\x21\x06\x2b\x4c\x26\x56\x98\x65\xe9\x38\x0a\x09\x4c\xac\x49\x3a\x66\xc6\x09\xd3\x6a\xac\x69\x14\x43\x66\x39\x64\x06\x96\x7d\x2b\x4a\xd8\x2e\x6b\x67\x02\x61\x4c\x2b\x8c\x12\x8b\x82\x25\xd4\x7a\x8a\xc8\x2c\x5d\x12\x0b\x03\xb7\xe8\xa2\x34\x41\x56\x94\x8c\xe3\xe5\x84\x62\x22\xc1\x71\x34\x8f\x44\x23\xb4\x38\xa3\x58\x46\xeb\x23\xa9\x45\xb5\x02\x86\x30\xb2\xe6\xe9\x24\x9a\xd2\xbf\xc0\xfa\xb7\x58\xde\xc7\x51\x36\x43\x16\x65\x56\x1c\xdd\x2f\x09\x20\x2b\xa3\x89\x6c\xf8\x11\xed\xcd\x5e\x8a\xad\x0c\x62\x86\xdc\x38\x5d\x44\x90\xf1\x4e\xe7\x38\xb2\x6c\xb4\xa1\x05\x25\x2e\x11\xe4\xca\x68\xca\xd3\x2c\x9d\x9b\xfd\x89\x18\x56\xd3\x25\x4e\xa2\x6c\x06\xac\xd8\x24\xb5\xb2\x94\xb5\x4b\x2d\x36\x9a\x42\x4b\x4c\xd3\x38\x4e\x9f\x68\x1f\xc7\x69\x32\x89\x98\xd2\xdf\x95\xc3\x78\x37\x03\x2b\xbc\x4f\x1f\x81\xf5\x8b\xf3\x47\x92\x92\x68\xcc\x07\x80\x0d\xc9\x22\x1f\x6a\x01\xca\x66\x61\x1c\x5b\xf7\x20\xe8\x07\x13\x2b\x4a\x68\x6d\x34\x55\x76\x0d\x53\x3c\xe8\xcc\x25\x51\x18\x5b\x8b\x14\xb3\x86\x8b\x5d\x6e\x28\x44\x3e\x9c\x59\xb7\xd7\xe7\x77\x3f\xf7\x6f\xce\xac\x8b\x5b\xeb\xd3\xcd\xf5\x1f\x2f\x06\x67\x03\xcb\xee\xdf\x5a\x17\xb7\x36\xb2\x7e\xbe\xb8\xfb\x70\xfd\xf9\xce\xfa\xb9\x7f\x73\xd3\xbf\xba\xfb\xc5\xba\x3e\xb7\xfa\x57\xbf\x58\x7f\xb8\xb8\x1a\x20\xeb\xec\x9f\x3f\xdd\x9c\xdd\xde\x5a\xd7\x37\xb4\xb6\x8b\x8f\x9f\x2e\x2f\xce\x06\xc8\xba\xb8\x3a\xbd\xfc\x3c\xb8\xb8\xfa\xc9\x7a\xff\xf9\xce\xba\xba\xbe\xb3\x2e\x2f\x3e\x5e\xdc\x9d\x0d\xac\xbb\x6b\xd6\xa6\xa8\xed\xe2\xec\x96\xd6\xf7\xf1\xec\xe6\xf4\x43\xff\xea\xae\xff\xfe\xe2\xf2\xe2\xee\x17\x44\xeb\x3a\xbf\xb8\xbb\xa2\x35\x9f\x5f\xdf\x58\x7d\xeb\x53\xff\xe6\xee\xe2\xf4\xf3\x65\xff\xc6\xfa\xf4\xf9\xe6\xd3\xf5\xed\x99\xd5\xbf\x1a\x58\x57\xd7\x57\x17\x57\xe7\x37\x17\x57\x3f\x9d\x7d\x3c\xbb\xba\x6b\x58\x17\x57\xd6\xd5\xb5\x75\xf6\xc7\xb3\xab\x3b\xeb\xf6\x43\xff\xf2\x92\xb6\x46\xab\xeb\x7f\xbe\xfb\x70\x7d\x43\x11\xb5\x4e\xaf\x3f\xfd\x72\x73\xf1\xd3\x87\x3b\xeb\xc3\xf5\xe5\xe0\xec\xe6\xd6\x7a\x7f\x66\x5d\x5e\xf4\xdf\x5f\x9e\xf1\xd6\xae\x7e\xb1\x4e\x2f\xfb\x17\x1f\x91\x35\xe8\x7f\xec\xff\x74\xc6\x4a\x5d\xdf\x7d\x38\x63\x9d\xa4\x39\x39\x9a\xd6\xcf\x1f\xce\x68\x2a\x6d\xb5\x7f\x65\xf5\x4f\xef\x2e\xae\xaf\x68\x7f\x4e\xaf\xaf\xee\x6e\xfa\xa7\x77\xc8\xba\xbb\xbe\xb9\x53\xa5\x7f\xbe\xb8\x3d\x43\x56\xff\xe6\xe2\x96\x52\xe6\xfc\xe6\xfa\x23\xeb\x29\xa5\xee\xf5\x39\xcd\x75\x71\x45\x8b\x5e\x9d\xf1\x8a\x28\xe5\xcd\x01\xba\xbe\x61\xbf\x3f\xdf\x9e\xa9\x3a\xad\xc1\x59\xff\xf2\xe2\xea\xa7\x5b\xeb\xe2\xaa\x38\xa0\x74\x94\xf7\xfe\x5d\xb5\x9b\x89\x20\x3b\x77\x11\xd9\xe8\xe5\x31\x8c\x97\xd0\xdd\xf1\xd6\x2e\x73\xa0\x8d\x03\xec\xf8\x1d\x17\x2d\xe9\x5f\x17\x4d\x02\xec\x34\x9b\x2e\x5a\xd0\xbf\x2d\x17\x4d\xe9\xdf\x8e\x8b\x1e\xe8\x5f\x17\xcd\x69\xae\x7d\x17\x3d\xd3\xbf\x87\x2e\xba\xa7\x7f\x8f\x5c\xf4\x95\xfe\x3d\x70\xd1\x29\xcd\xe6\xb9\xe8\x89\xfe\x6d\xbb\xe8\x36\xc0\xce\x91\x8b\x1e\x29\xd8\x73\x51\x3f\xb0\x97\x09\xc7\x6f\x62\xef\x48\x57\xca\x13\x5b\x98\x4f\xf8\x9f\x86\x14\x44\xcc\xe4\xed\x25\x4e\x54\xf0\xca\xb8\x28\xd2\xfc\x4f\x80\xc3\x0c\x98\x9e\x5e\xf2\x6f\xed\x76\xfc\x66\x4d\xd7\xde\x57\x1d\xdf\xaf\xe9\xba\xfd\x1a\x45\x0d\x12\x26\x0f\xe9\x29\xb7\xdf\x87\xf6\xef\x9a\xd0\x6a\xb7\xf6\x6d\x64\xff\x6e\x3c\xf6\x3c\xcf\xa3\x4f\x6d\x38\x0a\x3d\x9e\xd6\x0e\x45\x5a\xab\xbd\xdf\x09\xdb\xf4\xe9\xa0\xd3\xf1\x0e\xee\xe9\x93\xb7\x7f\x74\x78\x14\xd2\xa7\x49\x6b\x72\x30\x9e\xd2\xa7\x4e\xa7\x73\xd0\x69\xd1\x27\x98\x36\x8f\x9a\x47\xf4\xe9\x30\x84\x66\x8b\x95\x9d\x8e\xe1\xa8\xcd\xf2\x1d\x34\x8f\xa6\xbc\x44\x38\x39\x98\x86\x87\xbc\x0d\x68\x42\x93\x95\xa5\xff\x8d\xed\x11\x8a\xa4\xab\x41\xeb\xad\x5a\x79\x41\x7a\x1e\x53\xae\xc1\xda\xbf\xb3\xeb\xc4\x01\xb7\x4e\x1c\x4c\xbf\x22\x57\x53\x51\x48\xbe\x4c\x3b\x10\x40\x83\xa4\xb7\x04\x47\xc9\x03\xf3\xca\x08\x7d\xe2\xb8\x79\x62\x7b\x76\x1d\xba\xc0\xfd\xa1\x28\x0d\x0c\x82\x09\x47\x88\x8b\xb2\x60\xe8\xa1\xa3\x0e\xf2\x5b\x1d\xe4\x1f\x74\x50\xd3\xef\xa0\x66\xa7\xc3\x95\x18\x1c\x78\x3d\x7c\xdc\xf4\xf7\x7b\xb8\x5e\x77\xc1\xc9\x86\x78\xaf\xb5\xff\xef\xf7\x57\xde\x08\xd1\xe7\xfc\xf1\xdf\xef\x8f\x5c\xbd\x48\x5b\x96\x08\x0e\xeb\xbe\xf7\x23\x46\x19\xca\x5c\xe9\xb3\x4c\xd7\x0e\x65\x05\xe1\xa9\x09\x22\xd3\x39\x43\x41\x8f\x15\xb4\x12\x4a\x15\x20\x42\x2d\x13\xac\x8a\xa1\x34\xf0\x7a\xe9\x71\xb3\xb3\xdf\x4b\x69\x9b\x01\xb3\xbb\x2e\x12\xe2\xe0\x61\x3a\x6a\x30\x51\xcb\xc9\xe3\x22\x3a\x01\x08\x27\xf1\x10\xde\xbd\xf3\xf7\x6b\xcd\x4e\x07\xc1\xbb\x77\x87\xec\xa1\xd9\xe9\xd4\x60\xa4\xf0\x24\x1c\x4f\xe9\x91\x63\x2e\xc3\x14\x67\xdd\x28\x77\x16\xc1\x1c\xba\xb6\xc8\x60\xa3\xdc\x05\xd2\xa5\x56\x0f\xe0\xf9\x55\x48\x33\x30\x3d\xc6\x46\xd2\x7d\xd3\x1d\x1e\x7a\xa8\xd9\x1e\x21\xcd\x8b\x41\x0b\x48\x4f\xcb\x73\x0c\x5d\xfb\x3e\x4e\xc7\xdf\x6c\xf4\x18\x65\xcb\x30\x7e\x0f\x31\xab\x72\x91\x2e\xae\x13\xf9\x23\xb7\x8d\xba\x3e\xb4\xe8\x4f\x80\xe4\x0f\xf0\x9c\x51\xe0\x04\xee\x97\x0f\xac\x52\xe6\x1f\xe5\x36\x3f\x03\x44\x19\x35\xa0\x6f\xc9\x24\x4a\xe8\xef\x65\x06\xe7\x71\xfa\x74\x9a\x26\x04\x0b\xbc\xc3\x7b\x6a\xd8\xfc\x1c\x4d\xc8\xac\x7b\x48\x67\x9a\xf4\x87\xbd\xd0\x1f\xd3\x74\xbc\xcc\xb8\x17\xa3\xe8\x15\x8e\xa6\x8e\x32\x63\x5c\xe5\xc7\x96\x76\x0d\xcd\xa2\x74\xe3\x28\xf0\x7a\xd1\x31\x48\xf5\x37\xaa\xd7\x5d\xc2\xbd\xb6\x18\xc1\x30\x1a\xa1\x08\x81\xbb\x36\x6c\xa1\x68\xea\x68\x0e\x57\xd7\xf4\x6b\x33\x1f\x2c\x70\xc1\x48\x10\x35\x5e\x59\x53\x84\x2a\x3b\xe0\xbe\xd9\xf9\x5d\xab\x61\x61\x43\x2a\x2e\xc0\x6b\xdd\xb7\x8b\x0c\x8c\x86\x30\xd2\x5d\xb6\x30\xca\x89\x55\x02\xad\x4d\xf1\xc7\xc9\x58\x76\xed\x73\x3b\x13\xbe\x93\x10\x43\xc8\x73\x39\xee\xda\x28\xfa\x00\xe4\x9a\x35\x52\xf0\xf4\x33\x77\x3b\xd5\x3c\x2c\x0d\x61\x97\xcc\x70\xfa\xc4\x7c\xed\x67\x18\xa7\xd8\xf9\xe1\x2a\xb5\x38\x8e\x4c\xb3\xb3\xbe\xc1\xb3\x65\xff\x50\x87\xfa\x0f\xf6\x0f\xaa\xd3\x8f\x69\x34\xb1\xbc\x9d\x20\xd0\xfd\xa1\x43\x18\x9d\x14\x7e\x77\xe9\x6f\xda\x39\x03\xc1\xec\x1f\x88\x60\xf6\x14\x91\x31\xb3\x54\xc6\x61\x06\x76\x3e\x09\xec\x6e\x34\x75\xc8\xb1\xf2\x0d\x48\xeb\xd3\xbe\x05\x42\xa8\x8e\x47\x95\xab\x3c\xbb\xc5\x56\x53\x2b\x86\x2c\xb3\xc8\x2c\xe4\x3a\x2d\xdf\x2a\xa0\x9a\x18\xad\xc1\xb2\x15\x0f\xd4\x03\xdb\xb1\xeb\xaa\xee\xba\xed\x52\xdd\x3e\x49\x09\x55\xec\xd2\x27\x98\x34\xd8\xec\xcf\xd2\x18\x1a\x4f\x21\x4e\x1c\xec\xa2\x1d\x7f\x4d\x31\x32\x09\x46\x49\xca\x08\xa1\x39\x2d\xf8\x1c\x78\x47\xa4\xd1\x59\x02\xed\x12\x94\x05\xb9\xaf\x76\x37\x3d\xf6\x7a\x5a\x26\x82\xa3\x39\xf3\xb5\x39\xa9\xe1\xdf\xfd\x18\x92\x59\x63\x1e\x7e\x77\xf2\xb4\xdd\x14\x79\xae\xee\xf6\x2d\xe4\xe1\xd5\xd3\x3c\x99\x70\x8f\x08\xcf\x9d\xe3\x21\xcd\x49\xeb\xae\xb5\xe6\xe7\xe1\xf7\x4b\x86\x66\x20\x9c\x7d\x8f\x11\x3c\x51\xad\xb6\x91\x3d\x27\x63\xee\x12\xe9\x63\x08\x1d\x77\xbd\x16\xa3\x27\xb8\x46\x16\xd0\xa6\x0c\x41\x72\x64\x35\xe1\x68\x77\xa5\xcf\xe5\x34\x4f\xa4\x22\x9d\xb8\xdc\xce\xed\x69\x25\x98\xfc\x14\x25\x84\x8f\xb2\x31\x8e\xc3\x2c\xbb\x8c\x32\xd2\x20\xe9\xc3\x43\x0c\x0e\x17\xc9\xbb\xbc\xc4\x6e\x46\x8b\xec\x52\xfd\x06\xd3\x2e\xd9\xc8\xce\x9f\x03\x3a\x60\xe8\xd7\xd7\x76\x1f\x62\x1b\xd9\xf4\x9b\xd5\xa0\xe3\xa9\x0b\xd8\xbc\x6b\xca\x9d\xb4\x36\x27\x13\xb5\xca\x42\x5c\xe8\xb9\x2e\x38\x36\xd1\x46\xa3\xac\xee\x2f\x77\x4b\x73\x75\x53\xd5\x90\x33\xea\x1b\xbb\x7e\xcf\x46\x0b\x81\xdc\xef\x88\x21\xc4\x66\xed\xd2\x5b\xef\xb8\xc8\xdc\x2b\xdc\xe8\xd6\xcf\x80\xa8\x42\x7a\xaf\x7f\x15\x4e\xbb\x69\x62\xbb\x6b\xb4\xef\x79\x45\xf2\x6e\xc1\xb1\x44\xe4\x72\x8b\xdc\xd3\xb6\xb1\xc5\x8d\x9b\x15\xb5\x9a\xc3\x1a\x56\x3d\xdb\x94\x71\x73\x15\x6c\x09\x66\x83\x79\x1f\x09\x27\xbe\x31\x74\xa9\x03\x6a\x1d\x41\x36\x5b\x48\xec\x7c\xf5\x22\xee\x0b\xe4\xde\xff\x5a\x8d\xff\x70\x1e\x1a\xa7\x5e\xe3\xec\xf6\xb4\x6e\x0f\x2f\x6c\x17\x41\x45\x97\xc3\xc9\xc4\x11\xd5\xd1\x0c\xd9\x2c\x7d\xe2\xe4\xa3\x43\x5a\xcd\xad\x6c\xdb\xe5\xd9\x01\x57\xa9\x0f\x40\xab\x9e\x47\x44\xd6\x84\x5e\x28\x01\xa3\x24\x8c\xbb\xb0\x76\xd7\x05\x1e\xbd\x8f\x97\x15\x56\x42\x61\xa9\xa4\x99\x1c\x45\x8f\xf7\x46\x91\x12\x39\x68\xe6\x22\x35\xa4\xa4\x83\xc6\x33\x82\xc6\x33\xeb\xdc\x36\x02\x5d\x6f\x20\x90\xe4\x89\x9c\x46\x5b\x78\xac\x4c\x1a\xa6\x59\x49\xea\x70\x3c\xb7\x12\x27\x4a\x22\xf2\x53\x9c\xde\x9b\xfc\xca\x54\x65\x36\xb3\x90\xdc\x8c\x67\x74\xa1\xfa\xa1\xd8\xa4\xd0\x18\xc7\x48\xa1\xa4\x13\x09\xa9\x31\xfb\x91\x3d\x4e\x17\xcf\x1a\xd9\x30\x25\x9b\xb6\xa7\xb4\x5a\x2d\x1a\x34\x8b\xdc\x0c\xc1\x88\x30\x22\x9a\x0e\x76\x57\xd8\xaf\xb8\x2a\x22\x63\xd1\x58\x84\x19\x01\x59\x03\x0b\x48\xe8\x09\x34\xf2\xe1\x63\x79\x58\xc8\x43\x11\xc3\x1c\x42\x34\x17\xf2\x79\x84\x61\x9a\x7e\x3f\x29\xe6\x66\xb8\x4f\xd2\xa7\xc4\xe4\x85\x66\x10\x90\xc6\xfd\x92\x90\x34\xa9\xd5\x16\x0d\xe6\xfb\x39\x8d\xa3\xf1\x37\xb5\xcb\x83\x34\x66\xaa\xec\x61\xb7\x4c\xba\x84\x96\x98\x43\xb2\x34\x1b\xfb\x6d\xf5\x1b\xdd\xbb\x8c\x92\xe5\xf7\x5a\xad\xd8\x64\xb8\xfc\x3e\xa6\xb5\x9a\xed\xf9\x81\xd9\x3b\xca\xac\x77\xf0\x9d\xd0\x25\xfa\x33\x5d\xf6\xd8\x1e\x9f\x98\xd2\xaf\x23\x22\x27\x1c\x65\xac\xd2\x84\x53\xa8\x7c\x83\xe7\x32\x99\xfb\x8d\x70\x4c\xa2\x47\x10\xdb\xe7\x5c\xd9\xa4\x33\xed\x1b\x3c\x0f\xd2\x27\x9a\x67\x8d\x76\x3c\x3a\xc8\x66\x55\xdc\xb9\xff\xe6\xba\x3e\xd1\xec\x1b\x2b\x5b\x2e\xcc\x9a\xa8\xee\xbf\x5a\x09\x05\xdd\x01\xad\x54\xce\x7f\x95\xdd\xa9\xc6\xdb\x28\x54\x81\xb8\x81\xa1\xd0\x9f\xa8\x66\x1a\xd8\x76\x55\x25\xe3\x74\xbe\x48\x33\xee\xaa\xa4\x82\xd6\x66\xb1\x0d\x2a\xed\x03\xc4\x0b\xc0\x8d\x62\x2e\x36\x42\x4e\x45\x4e\x77\x4b\xfd\xcb\xc5\x24\xa4\x73\xe9\x95\x06\x78\xb6\xdf\xd4\x02\x24\x93\x57\xab\x87\x64\xb2\xad\x6e\x60\x51\x0e\x42\x74\x57\x57\xc6\x11\x3c\xcd\xd3\x65\xb8\xc6\xaf\xa8\xd7\x1c\x31\x16\xda\x20\x76\x4e\x79\x30\x81\x43\x1a\x19\xdf\xed\x6e\x40\x32\xa9\x90\xd1\x19\x60\x72\x93\x3e\x55\x88\x3c\x3b\x65\xc6\x69\xee\x54\xe3\xf1\x49\xfd\xc6\x18\x43\x48\x24\x43\x3b\xf6\x24\x7a\xb4\x65\xd4\x0a\xe6\x06\x7b\x18\x25\x80\xe9\x0a\x02\xc9\xe4\x74\x16\xc5\x13\x47\x69\x5e\x62\x3f\x9e\x1b\xb3\xe0\x22\x30\x11\x4a\x17\x50\x34\xce\xf2\xad\x55\x14\xf1\x3f\x19\xb5\xd1\x85\x02\x28\x63\x60\x56\x2b\xed\x27\xda\xd1\x7e\x94\xec\x38\xfb\x4e\xac\x5a\x16\x86\xbf\x2e\x23\x0c\x99\x15\x5a\x3c\xaf\x25\x57\x4d\x9b\x7b\x04\xe4\xa6\x23\xe5\x92\x40\xab\xb3\x91\x3e\x25\x80\x07\xc2\xaf\x28\x6d\xc6\x3f\x46\xf0\x24\x76\xff\x05\x64\x73\x19\x9e\xef\x3e\x9d\x3c\x07\x46\x89\xd7\xc2\x76\x0c\x8d\xbf\x50\xb4\x6a\x60\x36\x59\x08\x4c\x5b\x92\xcb\xf7\x2b\xd9\xb8\x9b\xe8\x0d\x79\x76\x99\xe3\x69\x57\x18\xa4\xec\x87\x8b\x7e\xad\x19\x60\x36\x93\x01\xe9\x13\xb1\x3f\xe3\x50\x0b\x25\x4a\x26\xf0\xdd\x56\xd6\xa2\xb4\xe9\xa4\x7c\xad\x66\xcf\xca\xbc\xd5\x5d\x90\x99\x8a\xfd\xd5\xb9\xb9\xaa\xb6\x42\x1b\xb9\x79\xf9\x26\x94\xf2\xec\xd5\x58\x71\xff\xc0\x2e\x95\x54\x9b\x7a\xb3\x11\xc1\xbc\x6e\xb7\x10\xad\xa1\xe6\xea\x56\x1c\xcb\xd9\x37\xe0\x28\xf3\xbd\x4a\xba\x72\x8d\x15\xf2\x63\x2b\x4e\x86\xa0\xa9\xc4\x86\x2a\x21\xaf\x22\xa2\x57\x53\x90\x50\x2a\xcc\x44\x85\xa6\x34\x42\x42\xc2\xf1\xec\x2e\x1d\xa4\x73\xa7\x6f\xe6\x16\x85\x67\x4c\x4c\xbf\xad\x0b\x85\xbc\xd5\xbd\xe0\x99\x5e\xef\x48\xa1\x32\x19\x16\x22\x16\xb7\x32\x1e\x12\x62\x17\x72\x6e\xc3\x62\x77\x63\x21\x73\x92\x86\x4b\x92\x8e\x53\x8c\xe9\xe2\x81\xec\x74\x3a\x7d\x4b\xfe\x70\x11\x91\x30\x8e\xfe\x06\x6f\x2a\x92\x2d\x20\x8e\xc7\x33\xa0\x3a\xa4\x3d\x0d\xe3\x0c\x4a\x05\x48\x78\x7f\x41\x45\x85\x8c\x9f\x52\x80\x52\xe0\x4a\xc9\x06\x75\x5f\xa2\x4d\x46\x60\xb4\x66\x3a\xee\x2b\x15\x16\xac\xb8\xbc\xbe\xa2\xd9\xa4\x55\x57\x64\x87\xd2\x10\xcb\xf6\x54\xcc\xa6\x52\x0e\xe8\xba\xb3\x95\xd5\x0a\x79\x8b\x83\xac\x81\x99\xf8\xab\x28\xc6\xf5\x0f\x16\x4d\x33\x6e\x9c\x16\xd3\x0b\x66\x50\x55\x9b\x7a\x3c\xd9\xab\x5d\x2d\x94\x75\xf3\x40\xc4\xdb\xe8\x6f\xc0\x1c\x69\x1b\xe5\x3d\xf3\x72\x6d\x9a\x63\xe5\x96\x2a\xea\x74\x7b\x59\xee\xad\xed\x65\xf5\x3a\x0f\xe4\x52\xba\x92\xe3\x16\xb4\x8f\x72\xb5\x60\xac\x09\xb4\x91\x8f\x10\x66\x4b\xcc\xe3\x91\x9e\x1a\xa7\x79\x8a\x94\x24\xd5\x33\x58\x2b\xca\x14\x3f\x16\x8c\x19\xfd\x0d\xc6\xb3\x30\x79\x80\x49\x81\xc9\x84\x46\xa9\xf7\x29\x73\x14\x87\xe9\x75\xcd\x45\xe3\x85\xb5\x84\xa1\x37\x69\xfc\x51\xfc\x74\xb8\x9d\x5e\xb1\xda\x6c\x5a\xbd\x4a\x2d\x15\x43\x08\x69\x03\xf7\x8d\x1b\xf1\x53\x0f\x4b\x2c\xc5\x10\xd2\xac\xa7\x8d\xdb\x42\xb2\x86\x13\x73\xf3\x96\xd7\x83\x4d\x38\x94\x02\xea\xaa\x35\x69\xaa\x00\x2b\x7c\x55\xc8\xa8\x2c\xeb\x80\x50\xa8\x41\x28\xd4\x5b\xea\x4e\xe0\x29\x5f\x13\x0b\x0d\x28\xe9\xc1\x8d\x2a\x40\xb8\xb4\xb9\xa2\x27\xf1\x7a\xf2\xb1\xa4\xd5\x73\x9d\xc0\x60\x01\xb9\x2d\x50\xc6\x47\x3a\x91\x54\x0d\x25\xf5\xa1\x24\xc5\xfe\x75\xf5\x57\xfb\xe7\x65\xb0\xaa\x74\x0d\x39\x2e\xe2\x5b\x3a\xcc\x19\xcd\x74\xfd\x24\xb0\x7f\x49\x97\xd6\x24\x9a\xb0\x7d\x8c\x45\xc8\x36\x42\xc0\xfa\x33\x23\xcb\x9f\x2d\x79\xe6\xc1\x8a\x12\xeb\xcf\x52\x95\x2f\x98\x10\x8e\xfb\xe7\xc6\x97\xc4\xee\x25\xf5\xc0\xbe\xab\x2a\x9b\xa4\x4f\x96\xdc\xe9\xb1\x48\x6a\xfd\x99\xe0\x25\xfc\xd9\xba\x5f\x12\x8b\x0d\xaf\x8c\x2f\xe2\x91\x63\x8d\xbf\x64\x56\xab\xe1\x59\x36\xa2\x15\x46\xc4\x7a\x8a\xe2\x58\x96\x67\xc5\xd9\x1a\xf4\xe7\xe2\x66\x0b\x55\x0b\x82\x1d\x6f\x4d\xc4\x9e\x85\x1c\xd8\x92\x0f\xa6\xe0\x0d\x91\x6e\x32\x16\xc4\x9f\xb3\x1e\xad\x0d\x1a\x51\x76\x9a\xc6\x71\xb8\xc8\x60\xd2\xa3\x86\x41\x1a\x43\x98\xe4\xa7\x48\xc8\xc9\x0e\xe9\xda\x37\x54\x3c\xd8\x41\x00\x2c\xcc\xd0\x5d\xad\x22\xb5\x65\x27\xc6\x80\x2a\xd2\xcc\xa3\x22\x65\x00\x5f\xa1\x28\xf5\x6c\x66\x25\xc6\x69\x38\xe9\x4f\x26\xa5\xcd\x32\xc9\x03\x4e\xf3\xc8\x75\xec\xc6\x9e\x5d\x87\xba\x4d\xbf\x0b\xb6\x65\x95\x30\x2a\x79\xae\xab\xe4\x2f\xe3\x7a\x3a\x9b\xa9\x7c\xb7\x1b\x5c\x05\x79\x8a\x26\xb0\x4b\x73\xbf\x3c\xb1\xfd\x5f\xbb\xde\xfc\xb1\x24\xd5\x18\xa8\x6e\x2f\xbe\xf7\xd6\xa2\x18\x8f\x34\x37\x0b\xbe\xa1\x18\xdb\x65\x7b\x67\x4d\xa2\xc7\x97\x19\x44\x0f\x33\x52\x55\x8c\x43\x78\x39\xbb\xe0\x18\x96\xc4\xdd\x14\x55\x21\xb6\x18\x10\x0b\xde\x24\x01\x15\x0a\x08\x07\x8f\x74\xbc\x6f\xc2\xa7\xf7\xcf\x04\x4e\xd3\x14\x4f\x32\x07\x50\x6c\x0a\xb7\x58\xc7\x81\xfe\x4a\xe3\x8c\xe7\xc9\x5c\x57\x6c\x63\x45\x6c\x4f\x1b\x41\x23\x7d\x04\x8c\xa3\x09\xdc\x3d\x2f\x60\xb5\x12\xcc\xc0\xb7\xb1\x72\x17\x63\x77\x16\x10\x7d\x1b\x88\x41\x96\x0b\x9a\xde\x6a\xae\x0b\xf1\x1d\x72\x1f\x7b\xd6\x73\xc8\xbf\x1e\xdf\x5a\x2d\x72\x70\x3d\x68\x35\x11\xd1\x02\x49\xb0\xda\x95\x8d\x55\xe4\x3f\xfb\xd9\xf4\xda\x07\x4c\x50\xa8\x3d\x7c\xe6\x46\xf0\xdc\x1e\x39\xf6\x9b\x07\x27\x20\xf7\xc8\xbb\x0e\x79\x47\x33\xd7\x6a\x0e\x09\xe8\x03\x25\x06\x83\xf9\x47\xcd\x15\x79\xf7\x6e\x3f\x4f\x68\x1e\xae\xf6\x5b\x35\xe2\xba\x6b\x88\x33\x60\xcd\x74\x3a\x1b\x5a\x79\xe7\x37\x79\x9d\x7e\x33\xaf\x92\xb8\x1a\x91\x22\x0d\xf7\xfc\xd8\x83\xfb\x02\xb5\xa0\x85\x48\xe3\xfb\x2e\xeb\x6c\xe3\x99\xfe\xed\xf1\x80\x03\xcd\x75\xdf\x6c\xdb\x94\x21\xd8\x01\x26\x37\xaa\x07\xb6\x6f\xf7\x28\x56\x56\x34\x75\x7c\x95\xd8\xca\x13\x9b\x2a\xb1\xc3\x13\x69\xcb\x2d\x96\xc8\xb1\xef\x51\x98\x67\xcb\x08\x5b\xfa\xeb\x5f\x86\x76\x9d\x34\xbe\xd7\x6d\x44\xff\x3e\xd7\xed\xd1\x17\x6c\x73\x31\x1c\xf3\xcd\x84\x48\x8b\xc8\xcd\x4f\x7a\x9c\x38\x55\x9d\x60\x51\xbf\x70\x02\x41\xb3\xeb\x8b\xa7\x76\xb7\x29\x9e\xf6\xbb\x0c\x17\xe6\x38\x6a\xb9\x46\x1b\x5a\xaf\x99\x04\xe9\xd9\x75\x8e\xf8\x49\xbb\xeb\xb9\xec\x37\x43\xae\x27\x90\xa5\x70\xd2\x58\x84\x0f\xb0\x5a\x51\x78\xed\xc9\x76\xdd\x6e\xac\x1d\xff\x38\x71\x8a\xa8\xd1\x82\x75\xfa\xab\x5e\x7f\xad\x6d\xd9\x06\x6b\xf3\x23\xaf\x5a\x9e\x33\x29\x57\xbc\xa1\xb2\x63\xbb\xee\xd0\x4e\x38\xad\x1a\xb8\x27\xbb\xed\x1a\x74\xc1\xdd\x6d\x35\xdd\x52\x13\x79\x2e\x7b\x6e\x77\x59\x83\x6e\xd7\xc1\x4e\x44\xcd\x4e\x2a\x0b\x9c\x88\x62\x2f\x1f\x9e\x37\xd2\xee\xa3\x5d\xe7\x51\x56\x8d\x29\x4e\xe7\x54\xda\x9e\xa6\x13\x10\xbb\x37\x1c\x82\x22\xd7\x35\x83\xeb\xd5\x34\x46\x11\x4a\x51\xa6\x62\x17\xde\x28\x2f\xf8\x59\xa1\x9d\x00\x84\xb7\xfe\xa4\x2e\x9f\xba\x12\xf0\x34\x8b\xc6\xb3\x13\xf1\x77\xd7\x67\xe9\x28\x36\x82\xe7\x2f\xce\xf8\x4c\xa2\x53\xed\xc4\xeb\xb6\xd9\x5f\xbf\x6b\x6e\x49\x2b\x59\x44\x82\x96\x9e\x3e\xb8\xfe\xc8\x86\x86\x6b\x9e\x14\x0c\x8d\x09\x90\x30\x8a\x8f\xbd\x93\xfd\x76\x77\xbf\xa3\xe7\x7e\x9a\x01\x88\x4c\xec\x71\x00\x31\x09\x7f\x79\x27\x72\x4a\x5e\xc7\x01\x34\xb2\x59\x34\x25\x7f\x80\x67\xca\x84\x28\x0a\x40\x46\xf0\x9f\x1c\x76\x3d\x94\x06\x20\xa3\xfb\x4f\xfc\xfd\xae\x87\xb2\x00\xaf\xa2\x55\x8a\x62\xed\xc4\xd3\x49\x56\x0b\xd2\x6e\xac\x9f\x71\x5a\xad\x9c\x2c\xf0\xe8\xea\xdd\x6a\xd6\x9d\xec\xf8\xb8\xe9\xd6\x09\x8b\x7f\x0b\x03\x43\x11\x88\xb9\x7f\x93\xca\xdd\x5e\xea\x84\xd5\xfb\x40\x58\x48\x17\x6d\x7f\x4b\x49\x2a\x07\xbb\x28\x56\x6a\x86\x81\x96\x83\x8d\xd1\x0d\x14\x69\x91\x28\xc5\x03\xb2\x1c\x4c\x19\xd1\x40\xbf\x56\x4b\x9d\x58\x79\x19\x05\x52\xf3\xf4\x11\x6c\x44\x68\x41\x79\xf6\x6b\xb5\xaa\xc8\xa7\xef\x62\x58\xd8\x89\xf2\xa3\xc2\x4e\x44\x0b\x1b\xed\x64\x5b\xda\xa9\x80\xd1\xba\x75\xd4\x23\xaa\xdc\xe8\x1d\x59\x53\x55\x2b\x44\x62\xfc\x0d\x67\x79\x91\x84\xb5\xda\x8e\xa3\x77\x45\x97\xde\xf4\x57\x2e\x06\xdd\x9c\xda\x44\x6b\x8e\x6c\x6c\x8d\xaf\x5d\x3b\x95\x23\x16\xe7\x41\x29\x69\xf2\x33\x2d\x48\x35\x01\x55\x29\xa8\x4a\x49\xba\x1c\xcf\xc4\xce\xca\xaf\xaf\xf9\x8e\x96\xe6\xa1\x38\x5b\xaa\xe7\xb4\xfe\x8d\xb5\x7f\x4c\x1f\xa1\x54\xb9\xa9\x15\x4d\x20\x23\x38\x7d\x2e\x29\x81\xf9\x69\x3a\xbf\x78\x9a\x4e\x24\x7c\x05\xd6\x7a\xf0\xb2\x16\xc6\xb2\x38\xe8\xa6\xd5\xb4\xd6\x8e\x78\x55\xa4\x8b\x29\x26\x14\x71\xe9\x47\xe3\xf6\xfb\x55\x3a\x81\x8d\x00\xb1\x6d\x5e\x61\xdc\x17\xc3\x61\x98\xbd\x53\x50\x96\x0d\xe3\x57\x45\x2e\x09\xdb\x92\x6d\xd7\xdc\xc8\xdd\x7d\x54\xac\xb1\xbc\x9b\x53\x0e\x5b\x33\x3d\x94\x6e\x7e\x14\x0d\x7a\xf8\x38\x20\x2c\xda\xb5\xe0\xc5\xe4\x4f\xcf\x37\xe9\x93\x83\x8b\x31\x37\x2a\x66\xa2\xac\xa8\xe7\xa7\x6d\x57\x2b\xa7\x98\x14\xf8\xa6\xd1\xc7\x7e\x3c\x8b\x78\x2e\xb7\xd8\x0a\x93\xd9\xa5\x97\x0f\x10\x3d\x74\x8c\xc7\x97\x05\x81\x1e\x73\xa6\xe2\xb9\xe8\xba\x31\xab\x88\x32\xf3\xf5\x28\xb3\xdd\x5d\xa4\xe2\x04\x59\xf8\x98\xa0\x3e\x0f\x25\xdb\xd5\xb3\x52\x1d\x61\x56\x3c\x29\x27\x7b\xc9\xc3\xd1\xf2\xcc\xae\x88\x5b\x10\x45\x35\xe3\x16\x39\x64\x57\x3f\x31\xbc\xcb\x3d\x03\xda\x79\x62\xd7\xec\x90\x38\x9a\xae\xa5\x54\x1d\x13\xe4\xf6\x31\x02\xd7\xed\x6a\x39\xb3\x05\x0b\x4a\x26\x48\xd8\xd7\x55\xf9\x73\x02\xa8\x53\xce\xb5\x9a\x93\x53\x85\x76\x40\xd2\x52\xd2\xec\x57\x10\xc2\x45\x15\xf8\x14\x28\xa3\x1a\x46\xbe\xcc\xcf\xed\x42\x66\xa0\x3a\x66\x9e\xed\x19\x04\x09\x75\x63\x55\x7a\x28\x72\xfc\x2a\x59\x6d\x40\x11\x2f\x4d\x1d\x38\xf6\xd8\x5f\x2f\xd0\xb9\x44\xaa\xcd\x65\x3a\x50\x43\x9e\xa9\xdd\xa2\x6b\x2c\xfb\xbb\x0a\x52\x16\x0f\x5c\x8a\x63\x9e\x2c\x7f\x5d\x9e\xdd\xe7\xa5\xf3\xc2\x27\x95\x34\xee\xe6\xa9\xc7\x9e\x1a\x2a\x7e\x2e\xde\x45\x44\x6c\x7a\x6e\x24\xc6\x36\x4f\x4c\x15\xa1\x3e\x85\x0f\x60\x06\x4b\x68\xf4\xa7\x54\x74\xe0\x47\x47\xaf\xa4\xb2\x96\xbb\xf4\x2e\x5d\x94\x03\x01\xf3\x4a\x76\x5f\x19\xaf\xbb\x54\x1c\xbf\xdf\x52\x87\xc6\xb4\x1b\x6b\x2b\xac\x05\x5a\xd8\xa0\x76\x9c\x58\xed\x44\x73\xbf\x9a\xd8\x90\x34\xa3\xcf\x6b\x35\xbe\xa1\x5c\x3a\x59\x2c\x64\x8a\x5e\x9d\x08\x9a\x0d\x3a\x72\xb8\x72\x8d\x7d\x70\xda\x72\x37\x1e\x51\xf6\x5c\xb1\x6b\x5d\x38\xd6\xbc\xb9\x09\x4f\x50\xa5\x74\x0e\xda\xeb\x69\xf1\x8b\x19\x90\xbb\x68\x0e\xe9\x92\x98\x51\x8a\x51\x92\x00\xfe\x99\x16\x75\xe8\x42\x5d\x8c\x0b\x90\xc0\xca\xa3\x0e\x41\x09\x25\x31\xfd\x3d\xd4\xf2\x3c\xb7\x07\x0a\xc5\x9e\x8c\xa5\x14\xaa\xb5\xe3\xf6\x88\x8c\xad\xdf\x44\x52\xfe\xfa\x0e\xf9\x4e\x0d\x35\x3d\xcb\x14\xa8\xa2\xb0\xbf\x99\xc2\xbe\x39\x1f\xd8\x9a\x11\xe8\x2b\x55\xfe\x32\x00\x91\xdc\xd3\x8e\x75\xf3\x53\xf3\xfc\x8f\x43\xc4\x9c\x16\x89\x19\x10\xb6\x0c\x3a\x78\x93\x08\x7b\x76\x2b\x16\xc8\x6d\xaf\x23\x70\xd7\x55\xbc\x9a\x8f\x3c\x77\x1d\x6c\x19\xe1\xc8\x1c\x61\xe4\x71\xff\x86\x55\xcd\x32\x7e\xc5\xcc\x89\x93\xb2\x28\x60\x00\x07\xea\xf6\x17\xfc\x45\xf8\x09\xf3\x52\x7c\x7f\xf4\x54\xbe\x22\x83\xda\x2d\x1f\x8a\x8a\x1a\x35\x27\x75\x17\xa9\xbd\xb9\x90\xc3\x62\xd9\x07\x67\x9f\x6e\xce\x4e\xfb\x77\x67\x03\x76\xbc\x91\x79\x5e\xef\xc1\xe2\x5a\xd9\xc4\xca\xd2\x34\x69\x58\x9f\x62\x08\x33\xb0\x96\x19\x58\x85\xfa\xf4\xf7\x74\xd0\x0a\x93\x8c\x40\x38\x69\xc8\x0d\xa2\x6d\xb9\x8b\x0e\xcd\x2d\x79\xcb\x84\xaa\x7e\x51\x08\x94\x62\x9c\x3f\x3c\x2f\x00\x13\xf8\x4e\xa8\xa2\x57\x55\x1b\x55\xc1\x0b\x5a\x5e\x29\xa0\xe5\x34\x4c\x58\xc8\x3f\x43\xd0\x0a\xad\x99\xac\xd4\xa2\x85\x2c\xa1\x2d\x5b\xf7\x30\x4d\x31\x58\xca\x67\x9e\x2e\x80\x1d\x05\x1e\x87\x71\x0c\x13\xdb\xed\x15\x34\xc5\x0d\xe8\x39\xf0\x6b\x16\x16\xad\x8e\x3f\x86\x71\x34\xe1\xef\x38\x09\xf9\x61\x87\xbf\x63\x4f\x1f\x55\xe5\xac\x3f\xec\x28\xc5\xbf\xa6\xc3\x65\x64\x7f\x55\xbf\x31\x3c\x44\x19\x01\x4c\xe9\xf6\x91\x4a\x20\x63\x58\xd5\xb1\xa4\x42\x7f\xb5\x69\xad\xa1\x55\x51\x97\xa8\xa2\xa7\x47\x1c\x6f\xd8\x71\x89\xd6\x45\x2b\x6c\x3b\x6e\x82\x81\x55\xf3\x62\x01\xca\xd1\xa9\xac\xc0\x01\x77\xfb\xc1\x0c\x03\x87\x59\x98\xa9\x6d\x8d\x4d\x01\xd4\xa5\x2d\x26\xbd\x50\xe9\xe0\xd1\xaf\xaf\x4e\x25\xdc\xc1\x77\x52\x11\x7b\x5f\x59\x63\x75\x55\x66\xfe\xe2\xb1\x28\x9e\xbd\x1f\x97\xe3\xf6\x37\xe0\xd4\x8f\xe3\x62\x1d\x22\x82\xb3\x52\x99\xa9\x14\x35\xb5\xda\x8e\x2f\x57\xce\xca\x0c\x0e\x48\x47\xc6\x8e\xaf\xf6\xb3\x2b\xa3\xe4\x1d\xa9\x99\x94\x43\x18\x45\xbc\x29\x0f\x58\xac\xce\xe3\xe6\x0d\x59\xb9\xd2\x56\x65\x99\x99\xca\x1f\x6d\xd5\xd7\x14\x99\x06\x3c\x86\xf1\x32\x24\x40\xfb\x91\x8d\xc3\x05\xdc\xc2\x5f\x97\xc0\xde\x32\x91\xcf\x03\x8a\x51\x10\x04\x52\xdd\x3a\xc9\x17\x2d\xf5\xda\x17\xaf\x5b\xc8\xe5\x4b\x3d\xa2\xf0\x7a\x18\x17\x11\x4d\xe3\x3c\x71\x4a\x2a\xa8\xf6\x43\x6e\xb1\x0b\xd7\x07\xda\xf1\x5c\xb7\xbb\xb3\x13\xf2\xdd\x6a\xf6\x3e\x15\xf9\x6e\x38\xd1\x5b\x3d\x2b\xe2\x2f\x00\x91\x96\x16\xd7\xe7\x55\x2c\x2f\x18\x36\xcf\x37\x78\xb6\x11\xcb\xae\x00\xc6\x51\x07\x96\x32\x93\xf1\xda\x34\x5f\x15\x6e\x05\xf6\xda\x48\xdb\xb2\x95\x1e\xbc\xf0\x8a\xba\x3b\x3e\xfa\x06\xcf\x5d\x61\x6e\xe6\xa4\x10\x29\x6b\xa4\xfb\x53\x8f\x8f\xbd\x15\x88\x97\xa4\x1c\x1f\xfb\x2b\xe5\x48\x3d\x3e\x6e\xae\x94\x97\xf5\xf8\xb8\x95\xfb\xa2\xc5\x2b\x3c\xb8\xfb\xd9\x3a\xec\xb2\x43\x9c\xb2\x3e\xaa\xc1\xd2\x41\x64\x43\xf8\xfe\x56\xbc\x55\x44\x4b\x1b\x9c\x5d\x6a\x1e\x60\xeb\x68\x4b\x71\xee\x48\xff\x3f\xed\x72\x25\x1f\xee\xf2\x37\xfa\xed\x78\x7a\x7d\x7e\xab\xab\xe5\x3b\xbd\xd9\x94\xaf\x79\xd0\x35\x5b\xda\x94\xb1\x75\xd0\xc5\x27\x4e\x09\x2b\xbf\x67\xd7\x1d\x5c\xf7\xdd\xba\x3d\x10\xc3\x1e\x98\xf0\xd6\xc0\xa6\xfc\xcb\x20\xdc\x13\xa0\xbf\xd3\xe6\x24\xcf\x7b\x6f\x77\x8d\x82\x9d\x81\x2d\x5d\x0a\xa5\xb7\x8f\x9d\x14\x11\xb9\x1e\xd8\xdd\x12\x72\x03\xdb\xe8\xc1\xd1\x6b\x3d\x38\xdd\xd0\x83\xd3\x37\xf6\x60\x5a\xec\xc1\xe9\xaf\xe9\xc1\x69\x45\x0f\x4e\xcd\x1e\x1c\xbe\xd6\x83\xfe\x86\x1e\xf4\xf3\x1e\x98\x18\xf6\x7f\x0d\x86\xfd\x0a\x0c\xfb\x06\x86\x6d\xef\x35\x0c\xdf\x6f\xc0\xf0\xfd\x26\x0c\xdf\xff\x1a\x0c\xdf\x57\x60\xf8\xde\xc4\xb0\xd3\xcd\xa7\xd9\x2a\x9f\xe7\x4c\x00\x16\x4a\x36\xff\xc5\x76\x8d\xb2\xfb\xa2\x76\xac\x0d\xfa\xb0\x95\x77\xee\x5f\x0c\x06\x68\xfd\x8b\x39\x7a\xfb\xdd\x32\xc6\x3a\x69\x3e\xd8\x6f\xee\xe7\x87\x8a\x7e\x7e\x30\x5b\xeb\xbc\xd2\xda\xf9\xdb\x5b\x3b\xaf\x68\xed\xdc\x6c\xad\xa5\x51\xf5\x44\x5f\x78\x82\x5d\xc3\x21\x53\xae\xa8\x53\xa0\x52\x7b\x63\x4d\x5a\x3d\xe5\x6a\xf6\xcd\x6a\x7c\xbf\x59\x35\x56\x5a\xff\x3f\xe9\x63\x75\xfd\xa9\x50\xba\xf5\x4a\xe9\x7f\x32\x4a\xff\x53\xa1\x74\xfb\x95\xd2\x37\x46\xe9\x9b\x42\xe9\xce\x2b\xa5\x6f\x8d\xd2\xb7\x85\xd2\x95\x3c\xea\x77\x36\x31\xa9\xdf\x29\x12\xee\xa0\xb2\x82\x83\x8d\x15\x1c\x14\x2b\x38\xac\xac\xe0\x70\x63\x05\x87\xc5\x0a\x8e\x2a\x2b\x38\xda\x58\xc1\x51\xa1\x82\xa6\x57\x55\x41\xd3\xdb\x54\x41\xd3\x2b\x56\xe0\x57\x56\xe0\x6f\xac\xc0\x2f\x56\x50\xc9\x7d\xcd\x8d\xa2\xa2\xd9\x2a\x56\x50\xc9\x80\xcd\xf6\xc6\x0a\xda\xaa\x02\x11\xf6\xd5\xdd\xd1\x64\x9b\x29\xf2\xb8\x9a\xb3\xca\xf5\x9a\x93\xf2\xb2\xb6\x5a\xed\xe8\x19\xb5\x9a\x36\x97\xa9\xd5\x54\x19\xf6\xa8\xde\x34\xa7\x0a\xd5\x6a\xfb\x1d\xfd\xfd\x67\xc6\xab\x04\x99\x59\xd1\x55\xb0\x77\xc1\x7e\x47\x1c\x44\xa3\x3f\x8f\x83\x23\xaf\x28\x9a\x2a\x22\x0b\x72\xc5\xac\xde\x6a\xba\x5d\xff\xa8\xa9\xb7\x57\x92\x6d\x7f\xb6\xf5\x06\xdb\x87\x46\x83\x9d\x83\xf2\x9a\x94\xd7\xbf\xdb\x3e\x74\xdf\x84\xee\x56\x2c\x77\xf7\xdb\x6e\xb7\x55\x85\x64\x55\x31\xcf\x68\xb0\xe3\x9b\xe8\x76\xde\xd4\x60\xc7\xaf\x37\x0f\xdc\x6e\x67\xff\x8d\x6d\xfa\x34\x77\xd3\x3f\x7a\x63\x76\x96\xbb\xe9\xbd\x35\xf7\x21\xcd\xed\x9b\x3c\xe1\x6c\xc9\x7f\xe4\xaa\xd8\x1f\x52\xf2\xe4\x3c\x5c\xb2\x17\xc3\x96\x7c\x05\xe2\x85\xb1\x90\x47\xde\x66\x20\xac\x36\xf9\xf6\xd8\xaa\x77\x71\x3c\x9c\x8a\x9c\x15\x7b\xa6\x5a\x39\xf9\x36\x06\xd1\x0a\x8f\x27\x32\x5b\x2a\x5b\xcb\xec\xe4\x62\xc5\x1e\xe3\x3f\xc0\x68\x56\xfb\xdd\x08\x18\x46\xcc\x6a\x21\x41\xfe\x43\x45\x6b\x89\x77\x6d\xf3\xa8\x18\x96\x45\x8c\x89\x0a\xdd\xe2\xe3\xca\xe0\xab\x95\x78\x8f\xb5\xac\x52\x35\x4c\x64\x16\x31\x52\x3b\xce\x0e\x59\xad\x9c\xed\xf2\xc4\xad\xd5\x72\x73\xd4\x65\xa1\x37\x55\x0c\x40\x8a\xc6\xa6\x38\x1a\x4a\x2a\xcd\xd0\xb7\x98\xa0\x2e\x35\x38\x8b\x63\x9f\x4c\x2a\x2c\x4b\xa2\xde\xb7\xc0\xb6\xbe\x57\xab\x4d\x7b\x17\xb9\x79\xcb\x32\x52\x43\x5d\xbe\xd5\x79\x8d\xa4\x9b\x9f\xa5\xd4\x8b\x2e\xd7\x7b\x30\xfd\x30\x72\x10\xf3\xf7\x19\xe9\x67\xd4\x39\x36\xea\x2c\x1a\x79\x8e\xa1\x71\x9f\xe2\x09\x60\xf6\xba\xaa\xc0\x7e\x9a\x45\x04\x6c\x54\x8d\x28\x6c\x2b\x49\x31\x95\x87\xd8\xd4\xeb\x93\xcc\x38\xe1\x82\xe3\x2e\x4e\x1f\xaa\x30\x67\x6f\x54\x92\x4e\x05\x7e\x54\xb1\x21\x5c\xec\xd5\xa9\xb4\x22\x15\x61\xcc\xde\xfb\xaa\x8d\x4c\x1c\x8d\x81\xbf\x76\x48\xbd\x5b\x5e\xb8\x49\x2b\x6a\x11\x61\x66\x55\x60\x04\x45\xf4\x01\x63\x33\xae\xe0\xb7\x77\x80\x55\xf5\x77\xe8\x02\xab\xe7\x57\x75\x02\x43\x16\xfd\x0d\x2a\x5e\x1f\x14\x65\x57\xe1\x15\x73\x82\x8a\x47\xe2\xba\x2f\x84\x6f\xf0\xaa\xf7\x22\x39\xfa\x6b\x81\x5c\xb5\x38\x57\x41\x11\x11\x2f\x23\xe0\x21\x7a\x28\xa1\xe2\x46\xb9\xcd\xf8\x9b\xda\x89\xfc\xc9\x5f\x2b\xc4\xf6\xb4\x7d\x16\x6b\x49\xe7\x00\x7b\x24\xf4\xd1\x49\xf3\x52\xee\x31\xb0\x28\x91\x4c\xbc\xab\x5d\xbe\x86\xda\xb6\x6c\xe4\x8f\x50\x54\x8e\x4f\xe8\x45\xbb\xbb\x3d\x56\x46\x0f\xd0\x78\x00\xe2\x44\xea\xad\x6e\x60\xbc\xec\x58\xc0\xd8\xc6\x6a\x96\x1f\x96\xe1\x6f\x99\x2f\xbd\xa6\x38\x47\x0d\xa5\x79\x77\x50\x12\x78\x28\x3d\x26\x2e\x7f\x79\x9b\x3e\x0f\x7b\x69\xbd\x7e\x4c\x8c\x16\x05\x1a\xa4\x9e\x7b\x18\x8d\xc0\x86\x77\x5e\xee\xc5\xce\xb3\x97\xe2\x38\x9e\xeb\x49\xdd\x3f\x31\x03\x22\x12\x19\x1d\xc2\x77\xec\xbd\x42\x18\x89\x1e\x93\x51\xfd\x92\xe7\xe2\xc9\x67\x89\xab\xa8\x48\x3f\x56\xc4\xd6\x09\x46\xe9\x74\x77\xd7\x7a\x47\x7a\x6e\xf5\x0b\x99\x2a\xba\x69\x66\x28\xf5\xcb\x37\xa2\x4c\xd2\x85\xe3\x76\xf5\x58\x0d\xbd\x8b\xf5\xfa\x06\x94\xdf\xc9\x37\x65\xe1\xc0\x04\x8b\x9d\x5d\xd7\xa5\xd3\x27\x4a\x96\xd0\xc3\x9b\x02\xa8\xb0\x78\x43\x13\xbb\x51\x40\xac\xeb\xcf\xef\x02\xa2\x46\x2b\x20\xbb\xbe\x8b\x12\xf5\xbb\x1e\xc8\xb3\x95\xdf\xdf\xe5\x0b\xff\xf7\x00\xd4\x61\x92\x57\xde\xe0\xaf\xde\xdc\xbf\xf9\xf4\xd3\xb6\xa3\x2a\xa5\x37\xe8\xbf\x72\xd7\x81\xb6\x44\x72\x59\xa1\x1f\xf7\x63\xab\x2f\xbb\xdf\x03\xf8\xa5\x1e\x64\xed\xae\xd7\x55\xc7\x26\xd8\xd6\xb1\xb1\x44\xc2\xb1\x8e\x2b\xdb\x33\x96\xd4\x30\x36\xb4\xa9\x1a\xf2\x4e\x4f\x3e\x4b\x26\x85\x8c\x67\xc9\x24\x28\x6e\x6e\xce\xc3\xef\x85\x36\x55\xf0\x9a\x56\xb9\x57\xbd\x51\xce\x29\x56\xd2\xef\xc4\x0c\x37\xba\x41\xb9\x5b\x04\x09\x73\x96\x24\xe1\x3d\x55\xf2\xd8\x0b\xc7\xf9\x62\x88\xe1\x91\x96\xa3\xba\x96\x60\x52\x9a\x27\x78\x59\x23\x08\x3c\xb7\x27\x08\x41\xc9\xd8\x83\x7a\x50\x94\xb0\xc6\x4b\xac\x5c\x57\x6f\x23\xd8\xf1\x4c\x1c\x65\x53\x95\x18\xca\xb8\x75\xce\x70\x6e\x6f\x27\xaf\x6a\x77\x17\x46\xb5\x1a\xbc\xf3\x7a\x6a\xe7\x01\xde\xe5\x32\xf6\x44\x3d\xed\xfa\x5d\x38\xf6\x4e\xbc\x6e\x41\x0b\x49\xe0\x3b\xf9\x2d\x0d\xd7\xeb\xac\x61\x8d\x02\xbf\x11\x01\xf6\x92\xd3\x9b\xe8\x61\x56\x54\xbe\xb5\x88\x87\x5c\x98\xeb\xf2\x84\xc9\x73\x9c\x07\x83\x44\x62\x22\xa8\xd7\xa6\x3a\xae\x58\x4c\x0a\x23\x55\x77\x31\x7b\xf7\xa0\x08\xad\xd2\x23\x24\xca\xaa\x42\x98\xc1\x25\x4c\x7f\x33\x72\xaf\x20\x46\x71\x87\x7a\xbd\x07\x74\x65\x7b\x33\x56\x6c\x97\xaf\xa0\xc0\x98\xc1\x74\xab\x55\xfe\x3b\xdf\x46\x05\xb6\xdc\x49\xe9\x52\x8d\x38\x2f\x62\x44\xd4\x89\x10\x48\x5f\x13\xcd\xea\x0e\x14\xe3\x9a\x94\xc0\xeb\xe5\x91\x39\xbe\xa4\x3a\x3b\xbc\x0a\x5a\xf8\xe7\x2b\xb7\x10\x6c\x13\x82\x9b\xa3\xed\xaa\xc6\x2d\x4a\xa0\x6c\x22\xe6\x0c\xe7\x78\xa8\x28\x7c\x14\x36\x95\xe3\x3d\x14\x92\x42\x1b\xc8\x6e\xb5\xee\x32\x1c\xb1\x97\xae\xb2\x37\x77\xd4\x6a\x4e\xd4\x88\xb2\x9f\x71\xc8\xb6\xf3\x88\xdb\x4b\x35\x76\x4c\xeb\x75\x37\x1a\xa6\xa3\x00\xcb\xf9\x13\x15\x06\x7b\x56\x79\x2f\xd7\xc9\x26\x9e\xea\x56\xa9\x53\x85\xa0\xaa\xac\xaa\x4a\xf6\xd2\x7c\x3e\xc3\xc5\x7b\x59\xeb\xb6\xed\x36\xd8\x6b\x2e\xae\xa7\xa5\x20\x94\x52\xe4\xb3\x24\xb0\x8c\x5c\xd3\xdf\xa3\xaa\x42\x37\xdf\xbc\xe5\xaa\x0d\xb7\xb8\xa1\xa7\xb8\x55\xc8\x11\xb8\x8b\x48\x5c\x35\xca\xac\x24\xa1\x40\xbb\x34\xca\xac\x4b\xfa\xfc\xa9\x0b\xbe\x7f\x57\x5a\xb6\xd5\xf2\x2f\x23\x52\x39\xd0\x71\x73\x5d\x40\x8d\xa5\xe8\xca\xf7\xdd\xdd\xa2\xaa\xfe\x08\xec\x85\xbb\x85\x56\xc5\xa4\x29\x46\xc6\x9e\xe8\x7a\x14\xd3\x68\xe4\x6b\x58\xa4\x26\x92\x93\x52\x9f\x22\xca\xde\xcc\x67\xfa\x86\xfc\xf9\x9c\xdb\xf1\xfe\x4e\xc1\xb0\x62\x22\x3c\x97\xfb\x6e\xb8\x55\x0a\x2c\xc2\x95\x2f\xa5\x69\x1b\x30\xa6\xa4\xe7\xf3\x44\x0b\xf7\xab\x74\x88\xc8\x60\xe8\x8a\xf7\x00\xf6\xa2\xfc\xb6\x33\xa3\x0d\xf5\xea\xc0\xca\x08\x29\xb4\xa9\xbe\x80\xbc\xae\xad\x6d\x7e\xc3\xa7\x41\x1e\xaa\x23\x54\xd0\x87\x2d\xb1\x9c\x99\xca\xba\xc2\x3c\x24\xe3\x19\xb7\xdd\x63\x24\x2f\xaa\xa0\x4a\x49\x7e\xdd\x45\x21\xc0\x87\x5b\x6e\x6a\xa2\xb3\x37\x9a\x2e\xd2\x27\xa7\xe5\xfd\xe8\xc0\x6e\xe4\xa2\xa6\x5b\x57\x89\x9d\xa3\x1f\x1d\xb2\x9b\x9a\x89\xbe\xff\xa3\x83\x77\x33\x9a\x48\x91\xd1\xdf\x59\x1e\x98\xaf\x30\x47\x51\x23\x4a\x66\x80\x23\x92\x05\x09\x8a\x1a\x69\x12\xa4\xf4\xcf\x74\x1a\x64\x48\x5e\x46\xb7\xe1\xf8\x80\xfe\x26\xe6\xd5\x4a\x3f\xf6\x88\xd9\xb1\x8b\x01\x77\x78\xb3\xd7\x28\x66\x24\x5d\x7c\xc2\xe9\x22\x7c\x08\xc5\x91\xe4\x1d\x7f\x8d\x40\x5e\x72\x18\x44\xeb\xd2\xcb\x97\x8d\x2b\xf9\x7e\xd3\x0b\xe5\xa3\x0d\xa7\x68\xc5\xb0\xc9\xc3\x21\xfa\x8f\xd5\xea\x65\xbd\xd6\x3a\xa2\x0e\x87\x17\xcf\x50\xe8\x85\x98\xaf\xd1\xfc\xbd\x5a\xc9\xd7\xc0\xe4\x69\xea\xd4\x27\x32\x6a\x9e\x4e\x37\xd0\x37\x2f\xe9\x16\xae\x0a\xca\x21\x28\x0a\xb0\x61\x6f\x8b\x5b\x2a\xa9\x98\x5a\xad\xd8\x1d\x95\xb1\x38\x98\xaf\x1f\x4d\x65\xa1\x16\x2a\xfa\x36\x42\x7e\x01\x29\x6e\x7a\xf5\xe3\x58\x9e\xea\xaf\x88\xee\xce\x91\xa8\xd5\x26\x10\x03\x11\x31\xa2\x79\x7a\xa1\xa3\x45\x4e\x2f\x5c\xd4\xc3\x47\xec\x6d\x5e\x19\x3d\x2e\x28\x9d\x4e\xd9\xe5\x96\x88\x68\x1e\x19\x94\x1f\x45\xc5\x39\x05\x88\x7a\x09\x02\x2d\x60\xa2\x47\x97\xa0\x92\x5a\xcd\xfd\x8b\xec\xf5\xec\x7e\x0f\x1f\x2b\x0c\x24\xc9\xd9\x31\x99\x21\xde\xf5\x47\x41\x7e\xa5\x22\x1e\xf5\xb6\x0c\x61\x54\x1a\x42\xfe\xbe\xf7\x48\xd6\x29\x55\x0c\xbd\x37\x45\xa6\x89\x2b\x87\x45\xa7\x8a\xc9\x8a\x6b\x04\x6b\x16\x42\x6d\x88\x82\xbf\xfb\xa4\x33\x6e\x4f\x85\xc6\xd5\xe7\xcb\xc0\xfe\xe2\xd9\x08\x1a\xb7\xd7\x1f\x02\xfb\xff\xc3\x9e\xee\xfe\x39\xb0\xff\xbf\xf4\xe9\x8c\x3e\xfd\xff\xd8\xd3\xf5\x5d\x60\xff\xff\xd9\xd3\xd5\x3f\x05\xf6\x7f\x42\x9f\xfa\xa7\x7f\x08\xec\xff\x94\x3e\xbd\x3f\xbb\x0c\xec\xff\x8c\x3d\xdd\x06\xf6\x97\x7b\xfa\xf4\xe1\x2e\xb0\xbf\xb0\x97\x05\x5e\x9e\x07\xf6\x97\x84\x3e\xfd\x91\xa6\x3d\xd2\xa7\x73\x9a\x36\xa5\x4f\xa7\x37\x81\xfd\x05\x73\x0c\x02\xfb\x3f\x67\x0f\x17\x81\xfd\x5f\xd0\x87\xc1\xe5\x59\x60\xff\x97\xec\xe9\xd4\x0f\xec\xff\x8a\x3f\x35\x03\xfb\xbf\xe6\x4f\xad\xc0\xfe\x6f\xf8\x53\x3b\xb0\xff\x5b\xfa\x74\xd5\xff\x43\x60\xff\x77\xac\x92\x5f\xae\x02\xfb\xbf\xe7\xbd\x78\x1f\xd8\xff\x03\x6b\xab\x7f\x15\xd8\xff\x23\x4b\xfb\x18\xd8\xff\x13\xcb\xf6\xf9\x7d\x60\xff\xcf\x2c\xe9\xf6\x34\xb0\xff\x17\x86\xdc\x6d\x60\xff\xaf\xf4\xe1\xa7\xdb\xc0\xfe\xdf\xe8\xc3\xcd\x6d\x60\xff\xef\xf4\xe1\xf3\x6d\x60\xff\x1f\xac\xdc\xa7\x80\x6a\x82\xd0\x18\xd0\xbe\xff\x5f\xf6\xda\x21\x8d\x53\x8f\xc5\x42\x9c\x7a\xc1\xcb\x9a\x2a\x57\x5b\x87\x4e\xdc\x5f\x14\x47\xf7\xe1\x62\x91\x6d\xbb\xc1\x48\x64\x31\xef\x30\x7a\x7f\x3b\xd8\x6d\xed\x9e\xc6\xe1\x32\x03\xe3\x32\x23\xbf\x71\xe0\x35\x3c\x7e\x9b\x91\x28\x69\xde\x67\xb4\xb7\x57\xba\x7e\xc8\xdb\xdf\x6d\x7a\xde\x11\xbb\x80\xe6\x74\x86\xd3\x79\xb4\x9c\x5b\xd7\xb7\x56\x7f\x49\x66\x29\xce\x1a\x56\x3f\x8e\xc5\xed\x3b\x16\x55\x40\xf0\x23\x4c\x1a\xbc\x2e\x51\xe3\x0d\xa8\xcb\x76\xd8\x65\x5c\xc9\x84\x85\x6c\x47\x89\xc5\x6f\x3f\x62\x29\xf7\x51\x12\xe2\x67\x6b\x9a\xe2\x79\x86\xf8\x4b\x38\x52\x2c\x2f\xfb\x11\x15\xb1\xbb\x7c\x44\x54\x05\xb2\x42\x0c\xe2\xfe\x1d\x02\x13\x6b\x81\xd3\xc7\x68\x02\x13\x8b\xcc\x42\xb2\xf1\x3a\x1d\x5a\x48\x56\x06\xa4\x6b\xa0\x69\x59\xd6\x8f\x05\x5c\xd9\x2d\x38\x02\xc9\x71\x3a\x01\x6b\xbe\xcc\x88\x85\x81\x84\xe2\xd2\xa2\xc2\x8d\x3c\xa2\x26\x7e\xf9\x0e\xe2\x97\xf2\xd0\xc9\xce\x6e\x58\xd2\x90\x60\x17\xf6\xe8\x18\x4e\xa2\x6c\x1c\x87\xd1\x1c\x70\x63\x1b\x36\x51\xa2\xd3\x49\x62\xb3\xc0\xe9\x64\x39\x86\x1c\x21\x51\x45\xf1\xa2\xa0\xdf\x86\x90\xa8\x4c\x74\xd8\xbc\xdd\x49\x5c\x96\x94\x92\x19\x60\x6b\x1e\x12\xc0\x51\x18\x67\xf9\x58\xb0\x61\x24\x33\x89\x90\xde\x19\xa3\x9f\x57\x10\xb1\x2a\xd8\x4b\xef\xc3\x39\xbb\x91\xea\xa7\x34\x7d\x88\xc1\xba\x48\xc6\x0d\x2b\x49\x73\x18\x1b\x93\x88\x5f\xf5\xc4\x3a\x99\xf0\x3a\x53\x9c\x59\xf3\xf0\xd9\xba\x67\x07\x02\xd8\x35\x4b\x90\x4c\x52\x9c\x01\x65\xa4\x05\x4e\xe7\x29\x01\x8b\xd3\x8a\x64\xd6\x04\x70\xf4\x08\x13\x6b\x8a\xd3\xb9\xa8\x8a\x18\xd7\x5a\xc9\x7b\xa6\xb2\x05\x8c\x29\xd7\x59\x0b\x1c\x51\x8e\xc4\x94\xdf\x12\xed\xae\x25\x93\xd9\xef\x3e\x5c\xdc\x56\xdf\x8f\xf4\xfe\x17\x76\xd5\x4e\xf9\x2e\xa1\xfe\xd5\x80\xdf\xff\x73\xf1\xfe\xf3\xdd\xf5\xcd\xad\xa8\x49\xdc\xa7\xc4\xc0\xfd\xab\x5f\xb4\x8b\x93\xe4\xad\x49\xda\x9d\x48\xda\x05\x4a\x48\xde\xa0\x24\xea\xc9\xef\x51\x42\x0c\x81\x72\xe1\x8a\x0b\x95\x58\xab\xda\x85\x4a\xa2\xae\xea\x6b\x95\x6e\xce\xac\xc1\xc5\x2d\xbb\x00\xe9\x6c\xb0\xe1\x46\xa5\xbc\xdf\xa2\xaa\xeb\x9f\xaf\xce\x6e\xf8\xe5\x4a\x79\xd7\x2b\xee\x55\x1a\x5c\xdc\x9c\x9d\xde\xd1\xfe\xe5\x4f\xa7\x17\x83\xb3\xab\xbb\xfe\x25\x12\x75\xdd\x7e\x3a\x3b\xbd\xe8\x5f\x22\xeb\xec\x9f\xcf\x3e\x7e\xba\xec\xdf\xfc\x82\x44\xcd\xb7\x67\xff\xf4\xf9\xec\xea\xee\xa2\x7f\xa9\x6e\x66\x72\xde\x44\xa9\x4f\x37\xd7\xa7\x9f\x6f\xd8\x1d\x51\x94\x3c\xb7\x9f\xdf\xdf\xde\x5d\xdc\x7d\xbe\x3b\xb3\x7e\xba\xbe\x1e\xb0\x51\xb8\x3d\xbb\xf9\xe3\xc5\xe9\xd9\x6d\xcf\xba\xbc\xbe\x65\x44\xfc\x7c\x7b\x26\x51\x1a\xf4\xef\xfa\x0c\x89\x4f\x37\xd7\xe7\x17\x77\xb7\x3d\xfa\xfc\xfe\xf3\xed\x05\xa3\xe8\xc5\xd5\xdd\xd9\xcd\xcd\xe7\x4f\x77\x17\xd7\x57\xae\xf5\xe1\xfa\xe7\xb3\x3f\x9e\xdd\x58\xa7\xfd\xcf\xb7\x67\x03\x46\xfa\xeb\x2b\xda\x79\xc5\x53\x67\xd7\x37\xec\x1a\xad\xea\x9b\xa4\xf2\xcb\xa3\x6e\xef\x6e\x2e\x4e\xef\xf4\x6c\xd7\x37\xec\x46\x29\x51\x53\xde\x77\xeb\xea\xec\xa7\xcb\x8b\x9f\xce\xae\x4e\xcf\x8c\xdb\xa6\x5c\x75\xdb\x14\xbb\xa2\xea\x17\xeb\xe7\xfe\x2f\xf2\xbe\x29\x71\x93\x94\x1c\xc0\x73\x93\xd9\x11\x1b\x72\xeb\xe2\xdc\xea\x0f\xfe\x78\x41\x3b\x22\x8a\x7c\xba\xbe\xbd\xbd\x10\x6c\xc5\x48\x79\xfa\x41\x0c\x06\xbf\x6e\x2a\x9a\x3a\xea\x82\x8f\xa8\x7c\xff\x06\x7f\x65\x94\x65\xc7\xd1\xbd\x6d\xf1\xb7\xd3\x5a\x61\x8c\x21\x9c\x3c\x5b\xf0\x3d\xca\x48\xd6\xf8\x41\x5a\x0c\x2f\xeb\x5e\xd4\xc0\xcb\x84\x44\x73\x18\xc0\x02\x92\x09\x24\xe3\x08\xb2\xaf\xfc\xb2\x98\x28\x89\x88\x3c\xd7\x91\x7d\xa5\x9a\x61\xd4\xc0\x64\x02\x8b\xaa\x63\xc9\xf8\xf9\xa5\x80\xcb\x7a\x1c\x8a\xcb\x3e\xe4\x4d\x92\x19\x09\xc7\xdf\x98\x22\x4e\x1c\xaa\xc7\xb8\x3d\x12\xe4\x87\x01\x5b\x27\x78\xd8\x1c\x35\x30\x2c\xe2\x70\x0c\xce\xde\x9f\xbe\x64\x3f\x86\xe4\x4b\x56\xdf\x43\xb6\xed\x76\xf1\xd0\x2f\x00\x1f\x78\x57\xe9\x52\xf3\x1f\x58\x9e\xb5\xd4\x3b\xb9\x96\x59\xd2\x60\xa9\xb6\xc9\x90\xc9\x34\x0d\x36\x65\x1a\xac\x71\xcb\x39\xd3\xcb\x5d\xd1\x59\xa1\x9a\x46\x28\xe3\x7b\x4f\xe2\xfd\x5b\xdc\xae\xae\xa0\xdd\x30\x1b\xf5\x92\xd5\xca\xd9\x9e\x25\x18\x8e\x5c\x94\xe4\xef\xc6\xa1\xf4\x86\x24\x5b\x62\xb8\xa9\x1a\x8f\xd2\x5b\xaf\x76\x72\x7f\x26\xe1\x77\xb2\x54\x35\xa4\xd9\x52\xd5\x19\x86\x84\xaa\xe4\x44\x8e\x49\xc3\x76\x51\x16\xf0\x1b\xc1\x56\xab\x0c\xe2\x29\x4a\x02\xaf\x97\x1c\xa7\x92\x84\x89\xb8\xea\x72\xc7\x49\x87\xc9\x88\x2a\x25\x6e\xe1\xb0\xda\x0f\x1f\xa9\xa0\x4f\x1e\x2c\xfb\x87\x3a\xa9\xff\x60\xb3\xbb\x56\x00\xe8\x02\x77\xff\xfc\x03\x7b\xe5\x52\xb0\xe3\x8b\x38\xf2\x2c\xc8\x86\xb4\xa2\xd1\x9a\xd6\x09\xe5\xb3\x4c\xe7\x61\x14\xc3\xc4\x12\xb8\x5b\x13\x89\xfc\xb3\xc5\xdf\x6c\xc9\x6c\x7e\x79\xd4\xe6\x22\x89\x8a\xde\x70\xe9\xb8\x2c\x30\xb3\xbc\x46\x0a\x91\x91\x8b\x88\x64\xf6\x4a\xcf\x6a\xb1\x28\x4a\x0b\xee\x6d\xc9\xc1\x92\xb5\x70\x7e\x8a\xb3\x56\x23\x8e\x4d\x8b\x77\x2d\xbb\x9e\x0d\xbd\x91\x8b\xb2\xa1\x3f\x72\xa2\xc6\xb4\x11\xc6\x21\x9e\x3b\xa9\x78\xa5\x12\xb5\xd4\xd7\x94\x11\x6d\x59\xb9\xf6\x4e\xe9\x32\x59\x24\x8d\x53\x6c\x45\x09\x3b\xd5\xa5\x5e\xdb\xd6\xb5\xd2\x84\x12\xc2\x76\x7b\xdb\x58\xca\x71\xf5\x80\x8c\x14\x79\xee\x1a\x89\x58\x17\x6d\xef\x27\x9c\xb0\x3d\xad\xd5\xca\xd9\x08\xab\x24\xb8\x03\xe2\x94\xbf\x20\xcd\x71\xe0\x9d\x88\x8b\xce\x68\xb2\xdb\x75\xf2\x37\xda\xb1\x1d\x78\xdb\xb2\xd9\x9e\x9c\x76\x6a\x35\x20\x74\xba\x43\x48\x1c\xd8\x93\xe9\x75\x76\x42\x5e\x5d\x4b\x0f\x6e\x5d\xaf\xd5\x5d\xbb\x95\x7d\x38\x4b\x26\x1b\x7a\x70\x66\xc4\xd8\xfc\x1b\xe1\xaf\x57\x54\xd7\x3b\xe3\xb2\x6b\xa6\xc4\xf5\x69\x4c\x04\x8b\xcb\xd5\x30\x7c\x0d\x5e\x66\xf0\xdd\xdf\xef\xee\xfd\xce\x19\x86\xbb\x53\x6f\xf7\x68\xe4\x56\x3d\xed\x45\x68\x06\xdf\x9b\x6d\x3d\xe3\x4b\x73\xed\x6e\xfe\xb1\x17\x21\xfc\x70\xdf\xa5\xdc\x75\x03\x0f\x67\xdf\x17\x8e\xfd\xa7\xbd\xec\x47\xfc\x70\xbf\x97\xfd\xb8\xe7\xec\x65\x3f\x3a\x7b\x93\x17\x1f\xb5\xd6\xee\x5e\xf6\x23\x7a\xe5\xf7\x1e\xfd\xfa\xbd\x9d\x4b\xea\x2f\x7b\x7b\x0f\xc8\xfe\xf2\xc5\x76\x91\x1d\xd9\x2e\x6d\x2b\xac\x6a\x2c\xfc\x2d\xad\x39\x27\x5d\x91\x54\x77\x4e\xba\x7b\x8d\xbd\x49\xdd\x3d\xa1\x00\xf7\x2d\x78\x7c\xaf\xc4\xe3\xe4\xef\x8b\xc8\xc9\xab\x98\x7c\xf7\x7d\x3a\x00\x6c\x4d\xa3\x0f\xf9\xe8\xf8\xa8\xbd\x76\xbf\xec\xbd\x9a\x90\xfd\xf8\xfb\xbd\x08\x51\x7d\xbf\xbb\x37\x0c\x77\xff\x36\xa2\x5f\xde\xee\xd1\x97\x6c\x54\xdf\xd3\xf9\xe8\xe1\xfe\x2e\xfd\x67\xdf\x37\x7d\x3f\xc6\xbb\xeb\xa4\x3f\x30\x70\x9a\x9d\x83\x1f\xf9\x0d\x53\x11\x9d\x1b\xcd\x4e\xc7\x75\x8d\xfb\x0a\x11\x15\x63\x7f\x5b\x84\x13\x07\x50\xdb\x5d\xcb\x55\x9e\x39\x81\x1d\x9d\x77\x69\xbb\xdf\xf3\x3b\xd9\x4e\x6c\xda\x4b\xbb\x4e\x1c\xba\xa6\xbb\xec\xc5\x88\xf4\xb9\xa9\x3d\xb7\x46\x2e\x7b\x1f\x96\x86\xfc\x77\xdf\xff\x00\xdf\xef\xd2\xd3\xdb\xdb\xd2\x91\x58\xf1\xc2\xd1\xec\xe7\x88\xb0\x0b\x18\xd5\x69\x3a\x76\x9b\x65\x34\x65\x77\x2d\xf2\xdb\x04\x1d\xdf\x45\xbb\x7e\x10\x0c\x5b\x68\x1f\x1d\x21\xbf\x39\xca\xf7\x91\xe4\x74\x2f\x95\x16\x9d\xda\x1b\xfe\x49\x10\x7e\x2f\x32\x33\xc9\x03\xfc\xbc\x82\xbd\x16\x3f\xd8\xc5\x1b\xf4\x10\x71\xd9\x7b\xb1\xc4\x6f\xc2\x5e\xd5\xa4\xfd\xae\xd3\x14\xb5\xc7\x26\xfb\x1b\x52\x2d\xe4\x2e\xbd\xf9\xe9\x7d\xdf\x19\x62\x94\xa2\x6c\xd4\x98\x87\x0b\xa7\x6a\xcb\x2d\xbf\x37\x11\xd8\x3d\x89\xcd\x20\x20\x27\xd0\xf5\xd9\x9f\xe3\xe3\x76\x17\xde\xbd\x6b\xff\xe8\x90\xdd\xa6\xbb\xe6\x9b\x55\x39\x51\xcb\x14\x95\x9d\xa9\x18\x49\xce\xab\xb9\x53\xf2\xc4\x21\xf9\x7b\x0d\xfc\x5c\x7c\x19\xd8\x93\x4d\x78\xfb\xf9\x4b\x0c\x4e\xf2\x1e\xd4\x59\x1f\xba\xcd\x4a\x20\x03\x39\x2d\xfd\xed\x07\x0e\xd4\x73\x62\x36\x5d\x17\x31\xae\xc5\xe9\x32\x99\x38\x66\xc1\xbd\x66\xe7\x80\x4a\x59\x16\x33\x5d\xe0\x98\x93\x2a\x46\x73\xc0\x55\x37\x46\x36\xe8\xfc\x62\x3d\x12\x1b\x8e\x22\x79\x46\xf3\xde\xfc\xf4\x7e\xcb\xa4\x6a\x9b\xe8\x06\xa0\x84\x01\x46\xc5\xfd\x10\x75\xb5\xc4\xef\xec\x3a\xa9\x93\x3a\xae\xe3\x7a\x54\x8f\xd6\xae\xdb\x33\xc7\x25\xd5\x46\x81\xce\x28\xc7\xae\xab\xde\x92\xa1\x3f\xa2\x1d\xae\xdb\xc8\x32\x92\x9b\xd5\xc9\x2d\x91\xec\xda\x7c\xd6\x49\xd5\x47\x1b\x79\xb6\xfc\xb0\xab\x48\xcd\xc4\x66\x9b\xcd\x90\xb2\xfe\xac\x6e\x52\x0f\xbc\x5e\x96\xdf\x16\x99\xd5\xeb\x2e\x50\x0d\x98\x38\xf4\x8f\x08\xe8\x02\xfa\x33\x8f\xd3\x28\xca\xac\x0f\xfa\xf6\x64\x89\xbc\x9c\x2e\xaa\xc4\x18\x87\xe3\x6f\x7c\x98\x34\x0a\xfd\xce\xae\x2b\x79\xe5\x68\x5d\xf7\x46\x2e\xbb\x27\xde\xa0\x9d\x7b\x7c\x7c\xb8\x32\xc8\xe6\x1e\x1f\x7b\x05\xf1\xb7\x2f\x44\xd4\xf6\xee\xf3\x4b\x55\x41\xf7\xa2\xc3\x10\xf3\xee\xe3\xd7\xbb\xcf\x63\xab\xa2\xbf\x41\x71\x92\xaa\x8d\x9b\x8d\x7c\x2c\x19\xd3\x60\x62\x29\x8e\x1b\x04\x32\xda\xe6\x09\xbc\xca\xe0\xda\x54\xae\x14\x13\xc2\x80\x6b\x9d\xc0\xb0\x35\xea\xfa\xf2\x22\x7f\xba\x96\x3a\x76\x1d\x86\xde\x88\xf3\x1b\x0c\x7d\xf5\xd4\x14\x4f\x84\xf2\x9c\xd6\x56\x06\xa4\x1f\x2f\x66\xe1\x06\x55\x7c\xf3\x08\xd3\x25\x23\x20\xd5\xf2\x07\xeb\xbd\x99\x47\xdf\x4b\x2f\x19\xc8\xed\xc6\xaa\x26\x50\x56\x91\x4c\x5c\x61\x1a\xb5\x7b\xf5\x7a\xc2\x31\x0c\x83\x6c\x98\x8c\x76\xa9\x41\xd3\xa3\x5f\x41\x95\x20\xa2\x00\xb7\x1e\xfe\x88\xd5\xa6\x4d\x25\xce\xa9\x8e\xb3\x6c\xb5\xb8\xee\x99\x83\x4f\x09\x6e\xbb\x7c\x4f\x6d\xe3\x3a\x1c\xe6\x07\xcd\xa5\x9d\x82\xc8\x5a\x19\xb6\x9b\x0b\xf2\x18\xd5\x8a\xc2\xe2\x15\xb1\xb4\x1a\x01\x34\x42\x87\x1d\xfb\x34\x5d\xc6\x93\xe4\x07\x62\xb1\x6e\x50\x53\x08\x5c\x54\x58\xdc\x15\xeb\x55\xf2\x38\xb7\x70\x25\x31\xe8\x9f\xab\x70\x0e\xd9\x49\x45\xda\x10\x46\x5d\x71\xb3\xf2\x65\xfa\x04\xf8\x34\xcc\xc0\x71\xdd\xdf\x50\x41\xae\xaf\x65\x75\xaa\xb0\xd9\xbf\xb6\x96\x42\x17\x33\x92\x8e\xbf\xb1\xcd\xf1\x4f\x61\x0c\x84\x40\x50\x9e\xa9\x43\xfb\x77\x9e\x27\x2f\xc0\x3e\x3d\x55\x57\x61\x9f\x1d\xf5\xf9\x55\xd8\xa7\xed\xbe\x76\x15\x76\x3f\xbf\x0a\xfb\xbd\xba\x0a\xbb\x4f\x9f\x06\xad\xc1\xc1\xe9\xb9\x79\x15\xf6\xd9\xb9\xbc\x0a\xdb\xf3\xde\xf7\x7d\x96\x76\x7e\x7a\x76\xd4\x3e\x17\x57\x61\x9f\xf3\x12\xe7\x4d\xcf\x3b\x7d\x2f\xf2\x75\xde\x0f\x58\x59\xfa\xdf\x29\x4f\x93\x58\xd1\xbf\x9d\x73\xf9\x74\x78\x20\x9f\xfa\x2a\x6d\xa0\xd2\xce\x45\x5a\xe7\x5c\x96\xed\x9c\x77\x54\x9a\x2c\xdb\x39\xef\xab\xb4\x81\x4a\x93\x65\x0f\x0f\x64\xd9\xc3\x83\x8e\x4a\x93\x65\x0f\x0f\xfa\x2a\x6d\xa0\xd2\x64\xd9\xbe\x6a\xb7\xaf\xda\xed\xab\x76\xfb\xaa\xdd\xbe\x6a\xb7\xaf\xda\x1d\xa8\x76\x07\xaa\xdd\x81\x6a\x77\xa0\xda\x1d\xa8\x76\x07\xaa\xdd\x73\xd5\xee\xb9\x6a\xf7\x5c\xb5\x7b\xae\xda\x3d\x57\xed\x9e\x8b\x76\x29\xa5\x78\x59\xfa\xd4\x51\x69\xbc\x2c\x7d\xea\xab\xb4\x81\x4a\x93\x65\x25\x9d\xe9\x53\x47\xa5\xc9\xb2\x92\xce\xf4\x69\xa0\xd2\x64\x59\x49\x67\xfa\xd4\x51\x69\xb2\xac\xa4\x33\x7d\x1a\xa8\x34\x59\xb6\xaf\xda\xed\xab\x76\xfb\xaa\xdd\xbe\x6a\xb7\xaf\xda\xed\xab\x76\x07\xaa\xdd\x81\x6a\x77\xa0\xda\x1d\xa8\x76\x07\xaa\xdd\x81\x6a\xf7\x5c\xb5\x7b\xae\xda\x3d\x57\xed\x9e\xab\x76\xcf\x55\xbb\x92\xce\xb4\xb7\xbc\x2c\x7d\xea\xa8\x34\x5e\x96\x3e\xf5\x55\xda\x40\xa5\xc9\xb2\x92\xce\xf4\xa9\xa3\xd2\x64\x59\x49\x67\xfa\x34\x50\x69\xb2\xac\xa4\x33\x7d\xea\xa8\x34\x59\x56\xd2\x99\x3e\x0d\x54\x9a\x2c\xdb\x57\xed\xf6\x55\xbb\x7d\xd5\x6e\x5f\xb5\xdb\x57\xed\xf6\x55\xbb\x03\xd5\xee\x40\xb5\x3b\x50\xed\x0e\x54\xbb\x03\xd5\xee\x40\xb5\x7b\xae\xda\x3d\x57\xed\x9e\xab\x76\xcf\x55\xbb\xe7\xaa\x5d\x49\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\xbe\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x81\xe2\xe7\x73\xc5\xcf\xe7\x8a\x9f\xcf\x15\x3f\x9f\x2b\x7e\x3e\x57\xfc\x7c\xae\xf8\xf9\x5c\xf1\xf3\xb9\xe2\xe7\x73\xc5\xcf\xe7\x8a\x9f\xcf\x15\x3f\x9f\x2b\x7e\x3e\x57\xfc\x7c\xae\xf8\xf9\x5c\xf1\xf3\xb9\xe2\xe7\x73\xc5\xcf\xe7\x8a\x9f\xcf\x15\x3f\x9f\x2b\x7e\x3e\x57\xfc\x7c\xae\xf8\xf9\x5c\xf1\xf3\xb9\xe2\xe7\x73\xc5\xcf\xe7\x8a\x9f\xcf\x15\x3f\x9f\x2b\x7e\x3e\x57\xfc\x7c\xae\xf8\xf9\x5c\xf1\xf3\xb9\xe2\xe7\x73\xc5\xcf\xe7\x8a\x9f\xcf\x15\x3f\x9f\x2b\x7e\xf6\x0e\xe9\x3f\xfa\xe4\x37\xe9\x3f\xf6\x74\x4a\xff\xd1\xa7\xe6\x3e\xfd\x47\x9f\x5a\x1e\xfd\xc7\x9e\xfa\xf4\x1f\x7d\x6a\xb3\xff\xd8\xd3\x19\xfd\x47\x9f\x3a\x87\xf4\x1f\x7d\x62\x45\x59\x7d\xfb\xa7\xf4\x1f\x7d\x3a\xd8\xa7\xff\x98\xe4\x62\x0d\xb3\xa7\x3e\xfd\x47\x9f\x8e\xda\xf4\x1f\x7b\x3a\xa3\xff\xd8\xcc\x63\x60\xfa\xf4\xbe\x49\xff\xb1\xa7\x53\xfa\x8f\x3e\xb1\x8a\x59\x7d\x03\x8f\xfe\x63\x4f\x7d\xfa\x8f\x3e\x31\xa4\x58\x7d\x4c\xbf\x3a\xb3\x47\x9a\x07\x65\x5c\xa9\x2a\x96\xb4\x48\x54\xa1\x7d\x06\x2f\x61\x1c\x8d\xe1\x3e\x5e\x42\x97\xb9\x06\x9a\x6d\x0f\x59\xcd\xf6\x21\xb2\x9a\x9d\x8e\x6b\xa3\x30\x21\xd1\x5f\x97\xc0\x4e\x66\x8a\x1c\x1d\x9a\xa3\xd5\x41\x56\xd3\x2f\xe6\xf0\x65\x16\x0a\x6d\x1d\xd1\x2c\x47\x85\x2c\x4d\x91\xa5\x45\x9b\x68\xb6\x90\xd5\xf4\xda\x85\x2c\x2d\x91\xc5\xeb\x20\xcb\x3f\x6a\x22\xcb\x3f\xd8\x2f\x64\x69\xf3\x2c\x3e\x6d\xc3\x6f\xf9\xc8\xf2\x9b\x1e\xcd\xf2\xd7\x65\x38\x0f\x71\x94\x08\x5c\xfd\xe6\x01\xeb\x08\x45\xa4\x69\xc0\xfd\xd7\x32\x08\x3c\x7d\x9f\xe2\x49\x91\xf5\x8f\x0e\x8d\x0c\x02\x4b\xdf\x6b\xd2\x3e\x50\x54\x0f\x4c\x14\x04\x8e\xfb\x0c\x45\xfa\xe5\xb3\x5e\xfc\x6d\x89\x0d\x5a\xb3\xc6\x39\xad\x29\xc8\xdf\x02\x93\xb4\x6b\xb6\x05\x4e\xcd\xd6\xa1\x84\x49\x74\x8e\x5a\x02\x9d\xa6\xa7\xca\x29\x6a\xf9\x12\x95\x16\x1d\x96\x7b\x88\x1e\x14\x2a\xb4\x04\xfb\x62\x84\xbc\x8f\xb2\xbf\x2a\x96\x60\x58\x34\x19\x09\xf6\x15\xcc\xdf\x06\x34\x06\xd9\x6f\x21\xcb\x3f\x6c\x29\xa0\x31\xbc\x87\x14\xd8\x39\x54\x40\x63\x60\x9b\x34\x87\x77\x40\x81\x31\x35\x08\x19\xc8\x43\x16\xfd\x9f\x27\x26\xe3\x19\x4c\xc2\x78\x9e\x26\x13\x83\xf5\x54\xff\x73\xce\xe6\xe5\x38\x35\x69\xaa\x5f\x9d\xdc\x34\x92\x19\x7d\x69\x72\xcb\x48\x56\x55\xb7\xf5\x64\x41\xd5\x78\x09\x8f\x51\x1a\x03\x91\x5d\x39\x44\x56\x9b\x8e\x4a\x93\x11\x08\xa7\x4f\x89\x80\xec\x77\x90\xd5\x6e\xd2\x8f\x04\xe8\x54\xdd\x6f\xd3\x8f\x84\xe8\x24\xed\x1c\xd1\x8f\x84\xe8\xf4\xec\xf8\xf4\x23\x21\x3a\x31\x29\x49\x5a\x0c\xed\x25\x8e\x9f\x9f\xd2\x54\x12\xac\x49\x27\xd8\x61\x9b\xa2\x6f\x80\x8d\x01\xf6\x29\xe7\x74\x0c\xb8\x8e\x90\x7f\x74\x80\x2c\xbf\x6d\xc0\x8d\x61\x3e\xf0\xd8\x70\xea\x70\x63\xa4\xfd\x0e\xb2\x0e\x29\x78\x1c\x4e\x80\xe4\x83\x76\xd4\x61\xec\x81\x2c\x7f\xdf\xd3\xa1\x72\xfa\x76\x9a\x92\x6d\x3b\x46\x69\x39\x7b\x29\x75\x9b\xcd\x23\x39\x92\x0a\x2e\x67\x0b\xeb\x3c\x45\x9e\x0f\xa9\x82\x0b\xe4\x18\x77\xb6\xda\x72\x68\xc7\xb3\x10\x13\x0c\xcb\xac\x24\x5e\x3c\x03\x5a\x12\x2e\x26\xb8\x24\x5a\x4c\x70\x49\xb0\x98\xe0\xa2\x58\xe1\xd0\x74\x9c\xc6\xa1\x12\xd1\x3e\x25\x37\x2d\xda\x32\xa0\xfa\x90\x32\xe4\x5a\xfb\x3a\xd8\x18\x51\x8a\x5c\xab\xa5\x83\x8d\x01\x65\xc8\x1d\xe9\x60\x7d\x3c\x19\x72\x0c\x9a\xe2\x30\x2e\xb6\x7a\xe8\x49\x88\x81\x90\xdf\x46\xd6\xe1\xbe\x04\x19\xc8\x78\xfb\x7a\x29\x1d\x91\x23\x9f\xb6\x26\x21\x06\x0e\x74\x62\x1d\x70\x48\x32\x8d\xd3\x27\xc0\x39\x5f\xf9\x1e\xa5\x50\x9b\x31\x86\xcc\x93\x45\xf1\x37\x9d\xe7\xd9\x22\xd8\xf4\x34\xa8\xbf\x1d\x6c\x48\xbd\x56\x53\x31\x95\x00\xeb\x68\x37\x59\xfb\x07\x7a\xd3\xe6\x92\xb6\x2f\x97\xb4\xf1\x73\x98\x28\x21\xa3\x2d\x08\x34\xdd\xdf\x04\xc8\x85\x98\xb6\x4c\x50\x40\x2e\xc6\xb4\x35\x82\x02\x72\x41\xa6\x2d\x10\x93\x10\x7f\x2b\x0a\xd0\x1c\x62\x60\x56\x28\xf5\x90\xc6\x13\x48\xb0\x14\x32\x42\xbe\xd0\x2f\xbf\x98\xc3\xe0\x81\x43\x36\xdf\x8b\x59\x0c\x5e\x38\xa0\x73\xb2\x5d\xcc\x62\x30\x67\x9b\x2d\x1e\xc5\x2c\x06\x81\x3d\x1f\x59\x87\x32\x07\x0e\x9f\xa5\x44\xa6\x30\xf1\xa5\xa0\x00\x5a\x3f\x3d\xb1\xf8\x08\xd0\x96\x82\xdf\x66\xe1\xb7\x48\xf6\xff\x48\xae\x75\x6c\x39\xa3\xe0\x79\xf8\x00\x09\x09\x35\xa4\x0c\xea\xa6\x71\xf4\x08\x5a\xdb\x87\x7c\x2d\x14\x3c\x6d\xe6\x90\x24\x64\x93\x92\xcf\xa5\x66\x29\x93\x94\x3a\x87\x4a\xa1\xf1\xda\xa5\x4c\x52\xf6\xec\x4b\xd9\x73\xe4\x95\xf2\x48\x3a\xfa\x72\xd8\xf7\xe5\x98\xa6\x38\x4c\x1e\x74\xad\xc1\x6f\x6b\xd4\xe2\xd0\x92\x0c\x32\xc1\x25\x19\x64\x82\x4b\x32\xc8\x04\x17\x65\x50\x0e\x1d\xcf\x22\xc9\x8b\x9d\x16\xb2\x98\x0e\x9b\xf7\x9f\x81\xa5\xd4\x66\x22\xa5\x29\xa7\x53\x0e\x97\x04\x3c\xa0\x2b\xb0\x9a\x55\x39\x5c\xd2\xae\xd3\x96\xf5\x9b\xe5\x25\x72\x5e\x1b\x59\xf9\x9a\x42\xe1\x18\x26\x26\x1b\x48\xbc\x33\xa6\xda\x48\x92\x30\x55\x89\x2d\xa4\x72\x74\x33\x08\x35\x16\xf1\xdb\x4c\xd3\xa2\x94\x6b\xb7\x0a\x39\x7c\x5d\x3d\x64\xb4\x3f\x2a\x66\x51\x0c\x22\xc5\x86\x7f\xe8\x15\xb2\xa8\x2e\x76\xa4\xce\xab\x68\x24\xb3\xa8\x5e\x76\xa4\x50\x50\x64\xc8\xe8\x32\x91\xcb\x93\x83\x26\x65\x1d\x9d\x0e\x2c\x43\x3e\x1b\xdb\x07\xc8\x3a\x38\xa2\x9f\x22\x5c\x2d\xff\xbe\x21\xfa\x8c\x3c\x4a\x05\xf0\x0d\x29\x68\xe4\x51\x6a\x80\x6f\x08\x44\x23\x8f\x54\x05\x9a\x25\x21\x27\xb2\xc0\x26\x74\xc9\x12\xff\x75\x99\x46\x19\x68\x42\x77\x9f\x7e\xc9\x0c\x86\x9a\x48\xd7\x13\x8f\xa9\x5a\x14\x0a\xf7\x51\x98\x28\xbe\x68\x52\xfd\x88\xae\x9c\x1c\x06\x8b\x45\x94\x18\x6b\x15\x5b\xcd\x0e\x34\xa0\xbf\x15\x6a\xcc\x32\xfa\x69\xe9\x50\x63\x92\xed\xb3\x79\xa8\x41\x4d\x31\x2a\xd6\x65\x0a\xcc\xbe\x3d\x1b\x8b\x05\x9b\x48\x62\x60\x72\xb0\xff\x0a\x3c\x5f\xba\xd8\x44\x13\x83\x96\xc3\xf3\x15\x8c\x4d\x34\x31\x60\x39\x5c\x5b\xc8\xbc\x7c\x92\x45\x73\x4d\xc8\x73\xe1\xd1\x51\xac\x49\x81\xb0\x09\x98\x4e\x1e\x74\xc5\xa1\xc5\x68\xd9\x56\x88\x2b\xb0\xff\x0a\x5c\x92\xfc\x50\x2c\x84\xa2\x63\x0a\x2e\x89\xce\xd6\xc8\x7d\xd5\x31\x05\x97\x64\xdf\x47\xd6\xc1\xa1\xec\xd7\x34\xc2\x70\x8f\x23\x69\x1a\x31\x8a\xb5\x98\x78\xd1\x81\x3a\x2f\x50\x2e\x6b\x1f\xea\x50\x9d\x17\x28\xe2\x6d\xa3\xac\xce\x0b\x34\x47\xcb\x28\xab\xf3\x42\x93\x22\x4d\xd5\xb7\x69\x4c\x55\x31\xc3\x63\xc0\x66\x28\x73\x2c\x50\x66\x99\xa6\x18\x32\xa2\x09\x2e\x21\x0d\x05\xde\x0f\x61\x94\x64\xf7\x29\x4e\xa5\x81\xe2\x31\x45\x4b\x6a\x5b\x0f\xb3\x34\x23\x7a\xed\x4c\x11\xcb\x3d\x16\x74\xbd\x37\x4c\x17\xa1\x41\xd3\x74\x7f\x13\xc0\x50\xdd\xa8\x6e\x20\x01\xa6\x15\xd3\xca\x01\xa6\xf9\x72\x90\x03\x34\xb5\xa7\xc9\xe6\x16\xb5\xf2\x5a\x4d\x1d\x6a\xac\x81\x54\x22\xb3\xe9\x57\xad\xee\x50\x69\xcc\xc9\x52\xa9\xea\xb0\x9e\x1c\xe9\x60\x73\x7e\xb2\xe9\x4f\xc1\x39\xfb\x1f\xb1\xb9\xc7\xbf\x04\xc4\xd3\x35\x3c\x99\x28\x39\x1a\x59\xf4\x7f\x99\x28\xb2\xf2\xd1\x16\x23\xce\x01\x9e\x31\xda\x4a\x28\x33\xa0\x9f\x73\x3f\xff\x48\x80\xe8\x6b\xcb\x47\x16\xff\x48\x80\xe8\x25\x5d\xf4\xf8\x47\x02\x44\xff\xa8\x86\xcc\x3f\x12\xd0\x11\x80\x43\x8d\x53\x19\x60\x5f\xc8\x67\x1f\x59\xfc\x23\x01\x07\x02\xd0\xe2\x06\x7a\x5b\xb5\x71\x28\x00\xfb\xc8\xe2\x1f\x09\x38\x12\x80\x43\x6d\x26\x69\x8b\x0d\xb5\xc0\x91\x25\x7b\xdd\x14\x14\xe1\x46\xb9\x30\xcc\x19\x40\x90\x83\x69\x0a\xec\x23\x01\xb2\x9e\x7d\x64\xf1\x8f\x04\x08\x72\x70\xcb\x5f\x58\xff\x0c\x20\xcd\x41\x9f\x2f\xa6\xfb\xaa\x0d\x41\x0e\xee\x45\x10\x9e\x04\x06\x10\xe4\xd8\xdf\x47\x16\xff\x48\xc0\x41\x6e\x59\xf2\x8f\x04\x08\x72\x1c\xf8\xc8\xe2\x1f\x09\x10\xe4\x38\x68\x23\x8b\x7f\x04\x40\x60\x7b\x88\xac\x43\xae\x66\xb3\x44\x41\x8e\x03\xba\x4e\xb2\x8f\x04\x08\x72\xf0\xc5\x53\x2c\xa0\x0c\xd0\xcc\xd7\x5e\xfe\x91\x00\xd9\x00\x35\x19\xd9\x47\x02\xe4\x6a\x4d\x17\x4b\xf6\x91\x00\x41\x0e\xaa\x88\xf3\x8f\x04\x08\x72\x1c\x35\x91\xc5\x3f\x12\x20\xc8\x71\xd4\x46\x16\xff\x48\x80\x20\xc7\xd1\x01\xb2\xf8\x47\x02\x04\x39\x8e\x8e\x90\xc5\x3f\x02\xa0\x74\x22\xbe\x62\xfa\x72\x86\xb5\x3d\x09\x68\x0a\x75\xd6\xf7\x64\xf3\x6d\xbf\x7a\x41\x62\x30\xa9\xdb\x50\x7b\x40\x7e\x49\x58\x4b\x57\xcf\xc5\x97\x84\x29\xd5\xbd\xc9\x6c\x04\x69\x28\x30\x58\x47\xc2\x3a\xc2\x1f\xe3\xfb\xaa\xbd\x7d\x09\x3b\x10\xc2\xce\xf7\x55\x7b\x07\x52\x87\x62\x9a\xa9\x27\xed\x56\x06\x3b\x94\xb0\x26\xd3\x5a\xa5\xea\xca\x60\x47\x12\xd6\x91\x9e\xbe\xa6\x6c\x4f\xa2\xc2\xbc\x2f\xf4\x23\xd3\x25\xbd\xa8\xdd\x20\xbf\x24\x4c\xd2\x8b\xad\xc0\xe2\x4b\xc2\x24\xbd\x98\x0a\x2d\xbe\x24\x4c\xd2\xab\xc5\x14\xd6\x8e\xf4\x83\x31\x98\x92\xa5\x6c\xc5\xe5\x5f\x12\x26\x91\x6c\x7b\xc2\xce\xf1\xdb\xaa\xbd\x7d\x5d\x21\x17\x5f\x12\x26\xe9\xd5\x66\xf6\x51\x47\xfa\xcd\x18\xec\x50\xd3\x05\xe5\x97\x84\x49\x7a\x31\x0b\x40\x7c\x09\x98\x6c\x8e\x2d\x08\xc2\x80\x66\xe9\x9e\x66\xf2\xc8\x2f\x09\x53\x3a\x34\xd5\xf0\xc4\x97\x84\x49\x7a\x31\xcf\x9b\xf8\x92\x30\x65\x22\x52\xd5\x5d\x7c\x49\x98\x52\x52\x68\x53\xe2\x4b\xc2\x24\xbd\xa8\xcc\x91\x5f\x12\x26\x3b\xb0\xcf\xd6\x4b\xfe\x25\x61\x92\x5e\x54\xf2\xc8\x2f\x09\x93\xf4\x62\x3e\x01\xf1\x25\x61\x92\x5e\x07\xfb\x6c\x03\x41\xee\x22\x50\x98\xac\x52\x6a\xbf\xb2\xad\x03\x49\x2f\x2a\x85\xe4\x97\x84\x49\x7a\x1d\x52\x14\xc4\x97\x84\x29\xd3\xa9\x2d\x7d\xa9\x4a\x22\x1d\x48\x7a\x1d\x52\x14\xc4\x97\x84\x49\x7a\x71\xf7\x00\xff\x92\x30\x49\x2f\xaa\x25\xcb\x2f\x09\x93\xf4\xa2\x72\x49\x7e\x49\x98\xec\xdc\xd1\x3e\xf3\xc9\x4b\xc7\x3c\x83\x49\x7a\x1d\x31\xff\x1c\xff\x92\xb0\x23\xa9\x56\xf8\x42\x05\x6a\x7a\xb2\xbd\x43\x09\xe2\xb6\x84\x9a\xdf\x87\x72\xc9\xf7\x98\x26\xde\x96\x36\x35\x83\x29\xa7\x04\xf3\xae\xf2\x2f\x09\x93\x1a\x8e\x77\xc4\xcc\x21\x69\x13\x31\x98\x54\x6f\xa8\x78\x92\x5f\x12\xd6\x96\x30\xda\x94\xf8\x92\xb0\x8e\x84\xd1\xa6\xc4\x97\x84\xed\x4b\x18\xdf\x92\x92\xfb\x52\x0c\x76\x20\xd5\x4c\xe6\x2a\xe6\x5f\x12\x26\x3b\xce\x36\x5c\xc4\x97\x84\x49\x7a\x31\x27\xaf\xf8\x12\x30\x09\xa2\xb6\x36\xfb\xc8\x74\x49\x2f\xe6\x91\x16\x5f\x12\x26\xe9\xc5\x1c\x87\xe2\x4b\xc2\x94\x46\xa8\x36\x37\x94\x8c\x3a\x92\xf4\x6a\x1d\x30\x67\xa6\xf4\x68\x32\x98\xa4\x17\xdf\xd4\x53\x0a\x38\x83\x49\x7a\x31\x17\xb9\xf8\x92\x30\x49\xaf\x7c\x57\x48\xc9\xa8\x23\x49\x2f\x6a\xee\xca\x2f\x09\x93\xf4\x62\xba\xbe\xf8\x92\x30\x49\x14\xe6\xb2\x17\x5f\x0c\xa6\xbb\xd7\x94\xb7\x5c\x77\x5a\x94\xd2\x0b\xee\x4d\x95\x5e\xf0\x6e\xaa\xf4\x82\x73\x53\xa5\x3f\x43\x1c\xa7\x4f\x9a\x0c\xe1\x26\x12\xef\x0e\x6c\xd4\x97\xa1\x4a\x5f\x86\x2a\x7d\x19\x36\xe9\xcb\xb0\x4d\x5f\x86\x4d\xfa\x32\x6c\xd2\x97\x61\x93\xbe\x0c\x9b\xf4\x65\xd8\xa4\x2f\xc3\x26\x7d\x19\x36\xe9\xcb\xb0\x49\x5f\x86\x4d\xfa\x32\x54\xe9\xcb\xb0\x49\x5f\x86\x4d\xfa\x32\x6c\xd2\x97\x61\x93\xbe\x0c\x9b\xf4\x65\xd8\xa4\x2f\xc3\x26\x7d\x19\x36\xe9\xcb\xb0\x49\x5f\x86\x4d\xfa\x32\x54\xe9\xcb\xb0\x49\x5f\x86\x4d\xfa\x32\x6c\xd2\x97\x61\x93\xbe\x0c\x9b\xf4\x65\xd8\xa4\x2f\xc3\x26\x7d\x19\x36\xe9\xcb\xb0\x49\x5f\x86\x4d\xfa\x32\x6c\xd0\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa0\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x41\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\x83\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x06\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x0d\xfa\x32\x6c\xd1\x97\x61\x8b\xbe\x0c\x5b\xf4\x65\xd8\xa2\x2f\xc3\x16\x7d\x19\xb6\xe8\xcb\xb0\x45\x5f\x86\x2d\xfa\x32\x6c\xd1\x97\x61\xa3\xbe\x3c\x4b\x13\x78\x9e\xc0\x93\x8e\x29\x8f\x47\xf0\x34\x68\x39\x8a\xcc\x00\x97\x03\xc9\xd8\x38\x49\x70\x29\x96\x8c\x6f\x16\x4a\x70\x45\x38\x99\xcf\xc0\xa4\xb0\x2d\xc5\x97\xe1\x43\x2f\x07\x9a\x01\x1f\x5e\x01\x5a\x8a\xf9\xf0\xf7\x0f\x72\xa8\x11\xf6\xb1\xcf\xb6\x59\x72\xa0\xee\xf5\xa6\x02\x98\x05\xeb\x45\xc9\xc4\xd8\x45\x63\x25\xa5\xce\xa2\x80\x06\x4e\xac\x55\x6f\x5f\x87\xeb\x58\x29\x35\x45\x41\x75\xac\x0e\x65\x14\x93\x82\x16\xd1\x62\xcb\x42\xf4\x98\xe2\xe7\x92\xf2\xcf\x06\x88\x81\xfc\x2d\x30\x33\xc6\x44\x8d\x1c\x83\x99\x01\x26\x6a\xd8\x18\xcc\x8c\x2e\x51\x63\xa6\xc5\x28\x70\x5e\x69\xa9\x85\x99\x81\xcc\x88\x97\x7d\xb9\x30\x33\x98\x89\x8a\x27\x95\x04\x06\x33\x43\x38\x0f\xa5\x72\xc4\x60\x26\x2a\x54\x0d\xa6\x44\x89\xc3\x47\x48\x26\x80\x65\xa5\x12\x19\x3e\x23\x24\xf4\x3e\x5e\x66\x33\x03\x27\x4f\x4e\x36\x23\x8b\xff\x86\x3c\x66\x24\x6a\x5b\x0a\x17\x23\x8f\xd9\x8f\x16\x0b\x16\x2b\xe6\x29\xc7\xa2\xb2\xfd\x9a\x38\x7c\x4a\xf4\xcd\x79\xd6\x42\x47\x84\x2c\xc4\x30\x4f\x93\xf1\x2c\x9a\x4e\xd5\xf6\x7e\xbe\x49\xc6\xf4\x56\x3d\x87\xff\x7a\x16\x73\x30\x5a\x72\xf5\xd3\xb3\x98\xec\xc1\x14\x91\x62\x2d\x66\x57\x0e\xa4\xbe\x1b\x47\x0f\x33\x2d\x28\x8f\x9b\xca\x6c\x93\x92\xa9\x8c\x0a\xac\x47\x50\xf0\xf0\x5f\x66\xd1\x2a\xb8\x1e\x41\xc1\x63\x7f\x99\x7a\xa8\xe0\x7a\x04\x05\x0b\xfc\x15\xfd\x94\x70\x3d\x82\x42\x4a\x1f\x09\xd7\x23\xcd\x98\x76\xc9\x76\x5a\x9b\xaa\xfe\x3c\x5a\x89\x8f\x75\x6e\x70\x2b\xb0\xff\x0a\xdc\x58\x85\xf3\x88\x02\x05\x57\x9a\x8b\x19\x5e\xa5\xe0\x6d\x5d\xbb\xcf\x43\x09\x18\xbc\xb8\x73\xc8\x99\xd2\x97\x5a\xb9\x99\xc7\x0c\xb3\xde\xaf\xae\xc8\x64\x6f\xaf\xba\x26\x93\xbf\x3d\x63\xc0\xab\x77\x14\xe9\x2a\xcc\x14\x43\x33\x8f\xee\x4a\xd1\x96\x33\x3f\x6f\x52\x6d\x40\xb2\x60\x52\xf9\x95\x83\xb5\x30\x16\xb9\x2a\x71\x09\x2f\xe1\xdb\x8a\x17\x17\x1e\x16\xad\xc1\xa4\x9f\x02\x1b\x62\xfe\x80\xe9\x9c\x1d\x1d\x6e\x2c\x3e\xfb\x4d\xa9\x1b\x2b\xb8\x19\x61\xc6\xc3\x07\x75\xb8\x4e\x25\x16\xb6\xea\x29\xec\x8c\x30\x1e\xd6\xfe\xbe\x0a\xe3\xd1\x32\xf8\xaf\xe6\x30\x70\x64\x51\x6e\x7e\xdb\xcc\x61\x60\x49\xc7\xea\xe8\xd0\xcc\xa0\xa3\x49\x2d\xfe\x7d\x35\x96\x66\x30\x51\xab\x29\x22\x30\x78\x58\x3b\xcf\xa1\x47\x78\xf8\x3c\xc8\x7a\x5f\x89\x68\x2d\x87\xaf\xd9\x12\x4d\xe6\xf6\xca\x67\x92\x19\xe7\xe1\xef\xb7\xe5\x68\xe6\x93\xc9\x0c\xf5\x60\x11\x3c\x6c\x44\xb5\xf9\x64\x46\x7b\x30\x75\xa0\xd9\x32\x26\x42\x21\xda\xc8\x6f\x49\x1b\x5e\xc7\xc5\x0c\x38\xf2\x7d\x15\x7b\xd9\x69\x15\xf2\xc0\xd6\x3c\x04\x20\xd6\x05\xa4\xb4\x25\x9a\xda\x08\xca\x3c\x46\xb4\x5e\xd3\x14\x33\x2a\x93\x11\xad\xe7\x7b\x26\x79\x64\x26\x3d\x5a\x8f\x99\x58\x3a\x81\x64\x26\x23\x5c\xaf\x40\x23\x73\xd6\x2a\x75\xa3\xd9\x36\x33\x94\x15\x92\x62\x8e\xb2\x5a\xe2\x15\x1a\x29\x2b\x27\x87\x9e\x99\xa3\xac\xa2\x08\xe2\xcd\xf5\x38\xc8\x8e\x14\xae\x82\xe9\x12\x48\x74\xa9\x23\x94\x18\xd7\x46\x46\x7c\x25\xf7\x1f\x4b\x52\x0b\x90\xbf\x05\xa6\x77\x48\x51\x5f\xc0\xf4\xae\xa8\xc5\x58\xc0\xf4\x4e\xa8\x78\xce\x79\x88\x53\x39\xff\x19\x6f\xb4\xa9\x2a\xb9\xaf\x20\x3a\x22\x9d\xa6\xb4\xa2\x39\xcc\x08\xcf\x39\x94\x2a\x31\x87\xe9\x88\xb0\x49\xc2\xe4\x25\x87\x19\xa1\x39\x52\x21\x9e\xc3\x24\x5a\xce\x4b\xa7\x64\x0a\x47\x58\x78\xae\xd2\xc9\x09\xde\x4d\x06\x33\xe2\x29\xa9\x8d\x7e\xd8\x91\xe2\x58\xcf\xa0\x2f\xa8\xbe\xa7\xa6\x9e\x9e\x45\x5f\x53\x8f\x3a\x8a\xd0\x5a\x0e\x7d\x55\xcd\x85\x80\x9e\x43\x5f\x57\x3b\x1d\x45\x74\x96\x63\xb1\xc4\x8b\x58\xf6\xb3\x7d\x20\x45\x80\x5f\xcc\xa1\x24\x96\x2f\xbc\x61\x3a\xaa\x3c\x8b\x72\xf2\x30\xd6\xf4\x4d\x5c\x79\x16\xe5\x1b\x3b\x10\xe1\x67\x3a\xb2\x3c\x8b\x94\x58\x2d\xee\x1b\xd6\x71\x35\x05\x30\x5b\x00\x98\x4f\x85\xf9\xf3\x44\x96\x82\x50\x63\xf3\xd9\x6b\x9b\xb8\x64\x0b\x1c\x25\x0f\xc5\x8d\x15\x1e\x31\xa7\x32\x15\x82\x13\x0f\x9a\xca\xb3\x90\xe7\xe1\xf1\x89\x79\x74\xea\x11\xf3\x04\x48\x45\x7f\x1e\x4d\x12\x53\x31\xe4\xc2\x4c\x2a\x11\xf3\x28\x21\x63\x0c\xe1\x5c\x37\x8e\x85\x0a\xcb\xc0\x19\x79\xc6\x69\x56\x3a\x65\xd4\x64\x7e\x4d\x05\x2e\x1d\x34\x2a\xc0\x4b\x67\x8d\xb8\xd2\xa1\xe0\xe5\xe3\x46\xcc\x0f\xa5\xe0\xe5\x13\x47\xcc\xff\x30\x4f\xc7\xe3\x30\x8b\x92\x62\xeb\xbc\x74\x12\x3e\x86\x7f\x49\x4b\x31\x6e\x4d\xa5\x36\x68\x19\xfc\x57\x73\x98\xd1\x67\x07\xd2\x45\xa8\xe5\x30\xc3\xd0\x94\xea\xa8\xe5\x30\xbb\xe1\x0b\xff\x7b\x12\x3e\x3e\xeb\x93\x98\x2b\xc4\x34\xb5\x14\xd7\xcf\x20\x69\x3c\x89\xc3\xb1\xea\x53\x4b\xba\x33\x98\x44\x65\x21\xe0\x13\x1c\xde\x4b\xb1\xc1\x0e\xfd\x34\xc5\xb9\x22\x05\x55\x56\x80\x8c\x46\xdf\x6f\xea\x60\x65\x04\x48\x2d\xba\x73\xa8\x83\x75\x1b\x20\x97\xf3\x0a\x5c\x0a\x2f\x66\xb6\x56\x39\xf0\x7c\x5f\xec\xff\x55\x04\x9d\x9b\x20\x43\xa5\xa2\x8d\xe6\x20\x83\xe8\xad\x96\x0e\x32\x94\x3d\x4f\x87\xe4\xde\x06\xd6\xf5\xa3\x02\xcc\xdf\x06\xd4\x71\xd9\x6f\x17\x80\xc6\x31\xaf\x4e\x01\x68\x9c\xf4\x3a\x90\xc0\x5c\x48\xf3\x48\x44\x2e\xfa\xda\x0a\x66\x90\xa5\xe5\xcb\x99\x69\x4a\x66\x46\x18\xe6\xe7\x63\xb3\xde\x10\xca\x4d\xb5\xd9\xc2\x9d\x9f\xa6\x3c\xa6\xc8\x70\x19\x47\x97\xac\x45\x18\x43\xa5\x95\xc3\x35\x4d\x4f\x66\xd1\x0c\x01\xee\xf5\x62\x47\xcf\x9a\x3a\xd8\xd7\x79\x84\x21\xcf\x04\x9b\x82\x37\xab\x0d\x09\x05\x6f\xe9\x26\x39\xd7\x94\x0d\xb8\xdc\x14\x93\x61\xa9\x87\x12\x5a\x10\x9a\xfe\x41\xc7\xb0\x04\x8d\x2c\xca\xff\x7d\x60\x58\x93\x46\x1e\x35\x17\xda\x9b\xeb\x51\x13\xc2\xb4\x2a\x8d\x3c\x6d\x6d\x21\xd7\x2c\x4b\x9a\xa7\x20\xc3\x99\x37\x97\x6f\x65\xb5\x0f\x8a\x59\x4c\x7e\xf0\xe4\xd6\x81\x91\xc7\x64\x0b\x36\x36\xa5\xa6\x4c\xee\x68\xeb\x1c\xa0\xf2\x14\x99\x84\x19\x6b\x8b\x70\x11\x3e\x87\x4f\xb3\x68\x61\x58\xb8\x6c\xd9\x61\x70\x08\xc7\xb3\xc5\x72\x3a\xd5\xc1\x7c\x4b\xa2\xa3\x83\xfd\x57\xe0\xa6\xc0\x55\xfb\x20\x0a\x6e\x8a\xdb\x8e\xb4\xf5\x14\xdc\x0c\xfe\x3d\x92\xc6\xde\x02\xf0\xb2\x28\x33\xd8\x86\x4e\xd1\x3c\xe5\xbe\x0d\x09\x31\x4f\x40\xf9\xd2\xc9\x54\x36\x4a\x8f\xe4\x46\x49\xd9\x1e\xed\xc8\x3d\xa7\x92\x29\xca\xb0\x63\x90\x78\x29\x97\x62\x36\x6e\xfb\x2c\xa4\xda\x17\x10\x13\x89\x03\xc5\xae\xf1\x72\x6e\x1e\xbf\x52\xca\x06\x05\x99\xb1\xc8\x4a\x4b\xa4\x20\x33\x0e\xb9\xa9\x78\x32\x7d\x9a\x18\x27\xf1\xb8\x8d\xd8\x96\x8b\x8c\xa1\xb0\x51\x14\x99\x6b\xbf\x9d\x83\xd4\xe4\x17\xd1\xec\x02\x4f\x43\x45\xa3\xe4\x68\xe7\x88\x1a\xba\x59\x53\x44\xb2\x0b\x4c\x75\xa5\x8c\x69\xb1\xca\x9d\x62\x4a\x72\x21\xe4\x0b\xb3\x24\x4f\x2d\x18\x0c\x22\xb5\x60\x2a\x88\xd4\x82\x91\xc0\x52\xd3\xec\x59\x3f\x1a\x2c\x4e\xf1\x48\x87\xab\x02\x97\x42\xc7\xb9\x97\x43\xc1\x4b\xb1\xe3\xdc\xcc\x52\xf0\x52\xf0\x38\x3f\xc1\xa3\xe0\xa5\xe8\x71\xbe\x8b\x8e\xd3\xe7\x50\x33\x70\xf7\x95\xd8\x6f\x1a\x50\x3f\x57\x26\xf9\xe9\xd6\x8e\x01\x16\xc8\xed\x1f\x08\xe7\x3f\x1f\x1e\x05\x96\x31\x1b\x87\xc2\x14\x30\x5b\x96\x71\x2c\x47\x7c\x6d\xe4\x63\x94\x85\x93\x49\x0c\x3a\xe1\x8c\xe3\xa7\xa6\xe3\x45\x79\x05\xd9\x12\x58\xe1\x73\x69\x7b\xb2\xbf\x15\xee\x16\x2a\x0f\x99\x11\x55\xe1\x68\xa1\xf2\xf4\x30\xaf\xd4\x90\x6d\xfb\xc8\xea\x1c\x30\x50\x32\xd1\x87\xb8\x49\x19\x94\xb9\x3f\x98\x25\x68\x2a\xff\xed\x7d\xb9\xf4\x1c\x68\x30\x3f\x5f\x97\xc4\xb2\x77\xa4\x41\x05\xb6\x07\xea\x7c\x1f\xdb\x0b\x2f\x1c\xdd\xda\x3f\x50\x4b\x9e\x0e\x6d\x6f\x68\x36\x9b\x41\xac\x9f\xdf\x15\xda\xe0\xa1\x06\xf5\xb7\x83\x4d\x37\xe4\x91\x74\x89\x48\xb0\xe9\x80\x3c\x90\x7e\x6b\x09\x2e\xed\x15\x70\x27\x66\x16\x41\x92\x84\x9a\x90\xa0\x86\x21\xf3\xf0\x73\x48\x69\x21\x63\xeb\x18\x87\x95\x16\x30\xe6\x01\xe3\xb0\xd2\xc2\xc5\x47\x8e\xc1\x8a\x0b\x16\xef\xe5\x06\x8f\x18\xd3\x88\x0b\xce\x30\xcd\x5f\xa6\x41\xa5\xc8\x62\x72\x87\xad\x0b\x7a\xc5\xea\x2c\xf8\xa1\x08\x02\xe0\x93\xc2\xf4\x7e\x31\x67\xa6\xaf\x24\x6c\xd1\x46\xa4\x4d\x1e\x29\xd1\xac\xa0\x0a\x2d\xba\x16\xf8\xea\x28\x96\x82\x2b\xc4\x58\x98\x8d\x72\xd6\x2b\x78\x4b\xd3\xc4\x0f\x8f\x4a\xd5\x4b\xdc\x28\x81\x3d\x03\x35\xdd\xdf\xd6\x94\x53\x92\x29\x68\xa5\xf3\x7d\x47\x87\x86\xff\xb0\x74\xb6\xef\xb0\x63\x38\x0f\x4b\xe7\xfa\x98\xa9\x9e\x3b\x0d\x8a\x67\xfa\x38\x59\x73\x9f\x58\xc9\xd5\x57\x40\x2f\x29\xf8\xca\xd4\xf6\x14\x85\x94\x37\x69\x14\xa8\xb4\x39\xc3\x55\x69\x0a\x2a\x6d\xca\x70\x45\x9a\x82\xca\x9b\x31\x4c\x8b\xaa\xb6\xee\x3b\x32\xb6\x47\x03\xfb\xaf\xc0\x0b\x61\x94\xfc\x98\x9f\x06\x2f\x84\x53\xf2\x58\x2b\x0d\x5e\x08\xab\x64\xf1\x6f\x05\x4f\xe8\x81\x0a\x2e\x62\xcb\x50\xd1\x07\x7a\x74\x24\xe2\x3f\xc4\xf8\x16\xbc\x9f\xfc\xdd\x2f\xf9\x9c\x28\xf8\x3d\x99\x1d\xdc\x56\x4b\x79\xd1\xe3\xc9\x76\x91\x3c\xc5\x7b\x44\xed\xff\x88\x7d\x67\xb9\xd1\x49\xc2\xa4\x64\x1f\x1e\x88\x12\x25\xeb\x90\xe9\x89\x24\x4c\x4a\xb6\xe1\xbe\x00\x14\x2d\x43\xb6\x7c\x93\x59\x94\x91\x58\xbd\x9d\x61\x5f\x1e\x7e\x64\x6f\x84\x11\x40\xd3\x4d\xa0\xec\x05\x01\x35\xbd\x1c\x6a\xed\x14\x50\xd3\xc7\xa1\x1c\xc1\x02\x6a\xba\x06\x14\xb7\x93\x74\x1e\x92\x54\x6b\xf5\xe8\x48\x08\x4a\x0e\xf1\x37\x83\x8c\x2d\xf1\xa6\x10\xa1\x1c\xa4\xa3\x42\x07\x88\x49\x50\x0e\x32\x36\xc3\xdb\x42\x82\x16\x4c\xaa\x7d\x15\x39\xe2\x19\x50\x8d\x97\xf3\xd7\x7d\x14\xed\x28\xcf\x78\xd9\x47\xd1\x82\xf2\x8c\x57\x7d\x14\x6d\x27\xcf\x78\xd3\x87\x7e\x32\x37\x5f\xfe\x79\xbd\x45\x8b\x8a\x0a\x11\x66\xc3\x32\x21\x51\x69\x4c\x31\x07\x3d\x13\x07\x95\x76\x14\x8b\x18\x6b\x1b\x60\xc3\xda\x57\x41\x82\x95\xd6\x13\xc5\x9a\x45\x7a\x3e\xcd\x20\x94\x38\xb7\x73\x67\xd3\x91\x04\x99\xdb\x86\xbe\x8c\xac\x62\x30\x93\xbf\x58\xf4\x57\x5b\xc2\x4c\xee\xda\x97\x5d\x61\x30\x93\xb7\xf6\xa5\x94\x28\x9f\xfe\x54\x83\xc6\x40\xd9\x3c\xfd\x56\x7e\xf5\x10\x5b\xc1\xab\xf7\x24\x3c\x05\x29\x6d\x46\xe4\xa0\xd2\x2e\x44\x0e\x2a\x6d\x3f\xe4\xa0\xd2\xbe\x43\x0e\x32\x9c\x11\xba\x43\x6a\x8d\xa2\xc6\x94\xdf\xbc\x30\x6d\x8c\x31\x84\x04\xce\x92\xe5\xbc\xea\x9d\xb4\x09\x3c\x59\xe2\x5d\xd0\xfc\x65\xc9\x53\xf9\xc2\xd8\x3f\x86\xc6\x55\x85\xda\x2d\x24\xda\x3b\x65\xff\xbd\xc3\xde\xd3\xff\xa3\xfb\xc5\x71\x86\x7f\xfa\xe2\x8e\xea\xee\x17\x77\xef\x21\xd2\x5f\x07\x8e\x51\xca\x5e\xe6\x9b\x5f\x35\x31\x4c\x47\xfc\x2e\x10\xfb\x73\xf2\x2d\x49\x9f\x12\xeb\x31\xc4\x51\x78\x1f\x43\xd7\xb2\xeb\x69\x8f\xbf\x6e\x9b\x88\x3b\x6d\x30\x7f\x6d\xae\x81\x58\x43\xd6\x9f\xb9\x59\xb0\x11\x36\xc4\x23\x47\x5c\x77\x63\xb1\xcb\xc2\xcd\x46\x21\x1b\x87\x0b\xb0\x64\x76\xda\xb6\xba\x22\x3a\x5b\x97\xa9\x91\x57\x1c\xbc\x40\x32\x4e\x27\xf0\xf9\xe6\xa2\xab\x9e\x90\x7a\x3a\x4d\xe7\x8b\x34\x81\x84\x74\xcb\x49\x88\xb7\xfa\xe1\xee\xe3\x65\xb7\xfc\x16\xea\x17\xfb\xd8\xee\xda\xb5\x98\xf4\x6c\x64\xbf\xa3\x8f\x0f\xec\xb1\x46\x1f\xc3\xf9\xa2\x67\xa3\x1f\xec\x1f\xba\x76\xed\xaf\xcb\x94\x01\x7e\xa0\x80\xdf\xb5\x8e\x7a\xf6\xba\x57\x1e\x9e\xe1\xf1\xbb\xda\x17\xfb\xcb\x0f\xa3\xbd\x07\x54\x75\xeb\xe4\x10\x46\x6b\x7e\xb1\xf7\xb4\xf1\x00\xa4\x3f\x1e\xc3\x82\x5c\x86\xc9\xc3\x32\x7c\x00\xf3\xa2\xca\xea\x2c\x8d\xf1\x0c\xa7\x73\xb8\x5d\x2e\x16\x29\x26\x30\x71\xdc\x13\x9e\xd2\x88\xfc\xc3\xa4\xa2\x80\x03\x6e\x57\xbb\xb0\x45\xbb\x82\x06\x9c\x61\x12\x3e\x46\x0f\x21\x49\x71\x23\x16\xf9\xf3\xae\xec\xee\x3d\x20\xfb\xab\xed\x8e\xdc\x35\xbb\xe4\xe5\x6d\xf8\xe8\x77\xdc\x88\x4e\xf3\x6b\x81\x44\xc6\x5a\x4d\x43\x97\x57\xca\xde\x70\xfd\x4f\x4b\xc0\xcf\x81\x79\x35\xa6\xfe\x8e\xea\x13\xdb\x15\x6f\xc0\x57\xb7\x31\xb8\xf9\x4d\x46\x74\xea\xb1\x8b\x13\xf8\x75\x44\x35\xdb\x45\x51\xe0\xf5\xa2\xe3\xfc\xde\x57\x79\x85\x53\x1a\xb0\x0b\x5f\x45\xce\xc0\x76\x7b\x64\x38\x81\x22\xd3\x38\xe9\xd0\x1b\xb9\xa3\xa0\x12\xe2\x8f\xd4\x2b\xb8\x89\xa2\xcb\xe7\x9b\xcb\xaa\xe9\x9e\x43\x37\x8f\x9c\xb8\xa4\x48\xe4\xa3\x03\x06\x7a\xb5\xbf\x99\xc4\xa2\xde\xe2\x6f\x51\xad\x10\x56\x71\x38\x5f\x94\xde\x6b\x2e\x19\xfb\x98\x9c\x90\x2e\xbc\xc3\x27\x58\xa2\xf4\xb7\x45\x58\x7d\xf3\x4d\x2e\xd4\xd4\x0d\x3f\x0e\x41\xb6\x67\xe7\xac\xf3\x33\x13\xf5\x8b\x70\x0c\xa5\xf7\x91\x1f\x07\x9e\x78\x43\xb8\x6d\x8b\xeb\x0a\xd8\x35\x3a\x46\x29\x7e\xf7\x7c\xe3\x49\x25\xb0\xbb\x3e\xf3\x9f\x81\x6d\xa9\xff\x6c\xb7\x07\xef\x74\xa0\x64\x04\x57\x4f\xac\x07\xfa\x2f\xf5\xd2\x7f\xbd\x98\xba\x8b\x43\x4a\x6b\x76\xff\x52\xe5\x6b\xe6\xc9\x6a\xd5\x81\x16\xbb\xea\x80\xf5\xf7\x96\x84\xe3\x6f\x8e\xaf\x5e\x35\x5f\xb8\x8c\x8b\x04\xd5\xf3\x92\xdf\xb1\x66\x67\x8c\x9e\x76\xa0\x6e\x73\x3a\x89\xba\xc0\xde\x77\xde\x8b\x82\xe8\xc4\xa6\xd2\x33\xea\xda\x36\x32\x6e\xd1\xb2\xe3\xe8\x5e\x22\xd9\xb5\x08\xaf\xdd\x82\xef\x8b\x88\x6a\x28\x54\xe0\xee\xf9\xd0\xaa\xdb\x99\x5d\x8f\x5c\x55\x34\x4e\x1f\x9c\xd4\x45\x24\xe0\xaf\x1e\xc7\x74\xfa\x54\x30\x73\x99\xf1\x48\xad\xe6\x8c\x63\x08\xb1\xec\x07\x91\xb5\xb8\x08\xc4\x0d\x68\xf4\x17\xca\xef\x25\x5e\x4b\xb9\x59\xd9\xc3\x88\xae\x8a\x4e\xce\x33\x8c\x86\xe5\xdb\x03\xe8\x6c\x3f\x81\x7a\xb3\xdb\xdc\x7e\x83\x1c\xa9\xba\x3d\x6e\x9d\x5f\x33\xfc\xb2\x46\x69\x80\x7b\xe9\x31\x29\xdc\x2c\xbc\x8b\x47\x6c\x3d\xdc\x74\xad\x9c\xba\x75\x85\x63\x9a\xcd\x43\x4c\xce\xe3\x34\xc5\x83\xe8\x31\x9a\x14\xef\x70\x16\x57\xdc\xec\x11\x14\xf1\x77\xfb\x8f\x21\x8a\x1d\x9c\xd7\xb2\x8b\x8f\x7d\xd8\x6d\x9f\x44\x5d\x06\x9e\xd2\x9a\xc4\xf5\x03\xd3\x06\x0e\x93\x49\x3a\xbf\x48\x36\xdc\x51\xa6\x95\xe0\xf7\x06\xb0\xec\x8e\xfb\xa3\x43\x76\xa1\xee\xbb\x6e\x9d\xcd\xdd\x8f\x90\x65\xe1\x03\x7c\x0c\x93\xf0\x01\x70\xf9\xaa\x6a\xb9\x02\x64\x5f\xd9\xab\xfc\xab\xef\x8b\x29\x2f\x0f\x6b\x7e\x2b\x4e\xa1\x0a\x75\x35\x8e\x0d\x09\x95\xdc\x45\xf0\x32\xe1\xd7\x00\x30\x30\xbf\x70\x7a\xce\xf1\xcb\x82\x97\x75\x19\x5d\xed\xf6\xad\x70\x32\xf9\x28\xb3\x56\x5e\x45\x4d\xb5\x97\xfc\xf2\xc0\x21\x19\xf5\x70\x83\x21\x3d\x4b\xe3\x09\xe0\xec\xc4\x68\x6e\x48\x46\x01\x96\xbf\xb4\x77\xf7\xff\x9e\x2b\x5a\xc3\x3f\x7d\xc9\xbe\xfc\x9e\x6a\x59\xbf\x37\xb4\x2c\xed\xc2\x15\x8b\xb6\x61\xb4\x30\x8c\xcc\x5b\x04\x46\x8d\x71\x9a\x10\x48\xc8\xda\xed\x6e\x6e\x7c\x7b\xb7\xa7\x51\x32\xe9\x27\x93\xcb\x34\xac\xea\x7e\xe1\xa2\x70\xba\x7c\x9e\x50\x39\x24\x2e\x5b\xe8\x66\xf9\x33\x92\x97\x68\x9f\x24\x8e\xdb\x25\x4e\x8a\x32\x7e\x07\x53\x54\x1a\xc4\x71\x9a\x8c\x43\x5a\x24\x0d\x86\x23\x94\xd1\xaf\xa4\x74\xb1\x7f\xac\x61\xc4\x2f\xf4\x16\x44\xbc\x81\x29\x60\x48\xc6\x54\x07\x41\x91\x8b\x70\xe3\x3e\x4a\x26\xfc\xae\xee\x1d\xaf\xf0\xdb\x77\xdd\x75\xfe\xdb\xed\x25\x5c\x06\x6c\x24\x47\xbc\x89\x0e\x74\xf9\xe2\xbd\xa1\xe2\xe0\x9f\x3f\x5e\x7e\x20\x64\x71\x03\x7f\x5d\x42\x46\x7a\x51\x23\x4d\x68\x49\x48\x8c\x55\xb4\xe9\x79\x01\x25\x10\x09\xc9\x32\x3b\xe1\x9d\xd0\xd8\xcc\xf9\x8f\xb7\xd7\x57\x5c\x4d\x71\xa2\x06\x86\x6c\x91\x26\x19\xdc\xc1\x77\xe2\xba\x88\x38\xae\xdb\xc5\xb5\x1a\x76\x64\x05\x46\x47\x50\xd4\x48\x17\x90\x38\xf6\x4f\x67\x77\x36\x02\xfa\x3b\x83\x64\x52\xd9\xbb\x12\xdd\x5e\xb5\x06\xbe\xfc\xde\xf9\x32\xa9\xbb\x86\xb2\xa9\xad\xdf\xfc\xd6\xf5\xf5\x76\x4a\x96\x5b\x7d\x1d\xb1\x6d\xf5\x3d\x00\xa9\x1e\x10\x79\xdd\x8f\x65\x4c\x01\x57\xb0\x9d\x9a\x12\x30\x52\xf6\x83\xa1\xd6\x30\x8d\xb1\x56\x73\xa2\xa0\xa0\xf0\x0a\x4c\x1c\x70\x5d\xb4\x13\xb9\x85\xbb\x44\xf8\xaa\x28\x2d\x10\xd1\x8a\xb8\x4b\x44\x19\x48\xf8\x04\xba\x58\xbf\x9b\xaa\x74\x2d\x0f\x55\x35\x82\x21\xbb\xf5\xb1\x9a\xc5\x23\x44\x5c\xb7\x1b\x6d\x25\xf5\x02\xa7\x63\xc8\xb2\x0b\xff\x30\xe9\x13\x7e\x9f\xf2\x26\x21\x16\x40\xe3\xaf\x54\x25\xbe\x85\x18\xc6\x24\xc5\xfd\x38\x76\xec\x21\xed\xf2\xc8\x76\x11\xbf\x1b\x88\x18\x37\xec\x53\xb4\xaa\x1a\x70\xc8\x10\x8f\xb6\xb3\x40\x55\xb1\xca\x1b\x7b\xa8\xfe\xaf\xea\xb5\x29\x36\xb6\xb8\xde\xe5\x85\x2d\xc3\x81\x36\x53\x88\x2b\x96\x61\xec\x8a\xf5\xb9\x78\xbd\x4b\x98\xfc\x40\x2c\x96\x99\x0e\x47\x83\x84\x0f\x57\xe1\x1c\xea\xf6\xef\xe8\xaf\x68\x52\x67\x2a\x0e\x71\x11\x56\x0b\x36\xb3\x4c\x89\x9c\xe0\x18\xa5\x01\xed\x5c\x2f\x35\x4c\x85\x80\x99\x0a\x0c\x14\xa4\xb9\xb9\x30\x72\x91\x99\xef\xf7\x22\xdf\xdb\xd6\xb9\x06\x49\x3f\x2f\x16\x52\xa2\xaf\x9d\x02\x31\xb4\x86\xdc\xba\xfd\xd5\xae\x63\x71\xef\x56\xa6\x14\x59\x27\x75\x7b\xf6\x57\x3b\x08\xa2\x13\x68\x10\xf8\x4e\x4e\xf9\xa2\x10\x64\x5d\x60\xf7\x17\xa9\xca\x22\x2a\x92\xd9\x72\xf0\x09\x4b\x0e\x2b\xaf\xdb\x54\x24\xb0\xba\x33\x92\xe2\xf0\x01\x02\x40\xfa\xcf\xeb\x7b\x76\x4b\x3c\xfe\xca\x11\x48\x93\x5b\x9e\x7e\x3a\x0b\x93\x07\xf8\xaa\xcb\x28\x96\x21\xca\xfa\x63\x12\x3d\xc2\xd7\x60\xc7\xe7\x29\x21\xfd\x1d\x12\x70\x44\x0e\x82\xa9\x92\xbd\xe3\xf7\x94\xba\x6b\xef\xd9\x3d\xdc\x80\x64\x22\x48\xba\x67\xbb\xab\x95\x83\xeb\x01\x7d\x42\x82\x25\x61\x1a\x7d\x0f\x70\xfe\xeb\x06\xc6\x29\x9e\xf0\xcb\x82\x39\x6d\xd8\x7d\xbc\x12\x5f\x7e\x63\x30\x03\x8c\x67\x51\x3c\x39\x0f\x29\xff\xcb\xdb\x85\xf3\xf4\xcb\x28\x23\x2c\xad\x92\x4e\x1a\x77\x0f\xce\xce\xfb\x9f\x2f\xef\xbe\xfe\xb1\x7f\xf9\xf9\x2c\x30\x3d\x34\x8e\x2d\xa0\xd4\x62\xac\xa8\x85\xe3\x5a\x45\x74\xaa\x88\x4b\x8a\x4f\x60\x1a\x2e\x63\xf2\xc7\x30\x5e\x42\x40\x04\x8e\x4b\x8c\x21\x91\x69\x34\xc5\xc0\x83\x67\x4a\x65\x9f\x83\xe1\xa8\xba\x1b\x1c\x81\x2d\xbd\x79\x73\xcf\xdf\x56\x7d\x38\x99\xc8\x81\x28\xab\x88\x0a\x5d\x7e\x75\x13\xb7\x88\xde\x50\x29\x86\x79\xfa\x08\x95\xf5\x6a\xb6\x5e\x5e\xbb\xba\x57\xd1\xed\x91\x77\x81\x27\xd4\xc7\x1c\x2e\x2e\x0e\x24\xc8\x7f\x2b\x06\xc6\xa2\x94\xaf\x8f\xa5\x81\x0a\x2a\x86\xea\x64\xef\x4f\x0e\x37\x55\x56\xc9\x72\x7e\x0f\xd8\xfd\xfd\x1e\xbf\x05\x4d\xd8\x2d\x25\x1e\x70\x4f\x4a\x49\x5d\x9b\xdf\xa9\x9d\x5b\x3b\xa5\x2c\x27\x9a\xf0\x64\x8f\xbc\xd1\x68\xfa\xec\x94\x5b\x10\x8a\xa4\xd1\x44\xa9\x3b\xaf\xcd\x8c\x09\xc8\x29\x5e\xb8\x9a\x78\xc7\x94\x08\xe5\x7b\x84\xaf\x52\x62\xc9\xb2\x13\xdb\xed\x6d\x90\x20\x42\x14\x15\x18\xc0\xa9\x14\x53\x1b\x86\x52\x63\xcd\x6a\x5c\x5f\x43\xb5\x2f\x2e\x31\xdf\x86\xae\x67\xa2\xab\x4d\x82\xdf\x88\x2b\x6d\x52\xc8\xdb\x4d\xf7\x0f\xba\x2f\x5e\x10\xec\xee\xe2\x5a\x0d\x6a\x35\xba\xa4\x88\x4b\xff\x50\x14\x5c\x33\x56\x69\x7c\x83\x67\xa1\x51\xeb\x62\xd3\xdd\x64\x9c\x69\xe2\xb6\x0e\xba\x0e\x2a\xfa\xcb\xc4\x77\xad\xa6\xdb\xfc\x76\xde\x87\xcc\xa2\x38\xb3\x15\x37\xaf\xc7\x35\xe9\xf2\x00\xe4\x82\xc0\x9c\x2a\x3b\xaa\xfd\x48\xba\xd5\xb4\x62\x52\x2f\x51\x37\x39\x32\x87\xb2\x2b\x6e\x40\x8f\x86\xd9\x08\x85\x41\x26\x57\xcc\xd4\x45\x71\x10\x2a\xc5\x50\x13\xee\xb5\x5a\x61\x1e\x24\xee\x4e\x50\x35\x35\x74\xfa\x0c\xc3\x91\x31\x09\x44\xef\xb7\x65\x09\x12\x14\xd7\x6a\x0e\xae\xd7\x45\x7f\x9f\x93\xf1\xa9\x44\xc3\x09\xa9\x66\xb7\xf6\x82\x80\x0f\x95\xe6\xb4\x01\x43\xd5\x7f\x95\x29\x26\x30\x8d\x12\xc8\x73\x54\xaa\xc9\x1a\x21\x15\xba\x30\xea\xa5\x27\x82\x38\x74\xf1\x1e\xf0\x59\xcf\x56\xa3\x6e\x75\x01\x66\xfd\x6c\x16\x8d\xac\x28\xc2\xb5\x5a\x6a\x30\x3b\xfe\xd5\x7d\xd8\xa4\xbe\x7a\x3d\x92\xdf\x5d\x49\xa4\x7e\x5a\x2c\xed\x50\xd3\x79\xe8\x8d\x10\xfb\xeb\x8b\xbf\xcd\xd1\x1b\xd1\x60\x63\x84\x21\xa9\x5a\x9f\xcb\x4d\x21\xa9\x56\xa4\x89\x1a\xdc\x92\x32\x84\xa8\x15\x51\xa5\x7c\x50\x9a\x92\x92\xfa\x41\x53\x5f\xd7\x40\x34\x12\x17\x6d\x3a\x6a\x13\xd5\x6a\x6f\xbb\xbc\xfd\x42\xdc\xd8\xbe\x08\x71\x38\xef\x5a\x5c\x6d\xca\xb8\x06\x0e\x62\x91\x2c\xea\x52\x72\xa5\x46\xc4\x2d\x2a\xd1\xec\x36\x7e\xac\xe6\x9d\x21\x63\xca\x8d\x4b\x0b\x6a\xa1\xfa\xc9\xbc\x89\x55\xb3\x0b\x8f\x4c\x09\xca\xec\x8f\xd7\x68\x94\xa4\x24\x9a\x3e\xf7\xe3\x58\x17\xef\x12\x65\xa8\xc6\x92\x2b\x62\xac\xa0\x18\xc8\x8d\x3a\x49\xb1\x21\x91\x7f\x93\x2e\x52\x9c\x7e\x6c\x4d\x7c\x2b\x51\x20\xdf\x99\xc0\x01\x61\xaa\xbf\xdc\x8f\xa8\x1e\x23\x6d\x8f\xa2\x32\xc3\x30\x1a\x31\xbb\x9e\x55\x2b\x2a\xd2\xd4\x21\xbd\x78\x9e\x4c\x0b\x61\xc4\x35\xd4\x57\x89\xc2\x35\x62\x36\x2d\xaa\xa5\x12\xd2\xec\x18\x60\x1c\x87\x19\x07\xa5\x01\x46\xbb\xfe\x4e\x90\x2b\x6d\x69\x05\xf3\x0c\x96\x54\x63\x0b\x09\x58\x6c\xee\x30\x22\x71\xf3\x2e\x75\xd9\x1d\xa2\x16\xed\x59\x6f\x27\x5d\xad\x8a\x95\xf5\x5c\xee\x4f\x57\x4e\x50\xc7\x47\xfb\x9d\x4e\xab\x53\xb8\x54\x97\xe7\x62\xb7\xf4\xa6\xa8\xed\x22\xc2\x6d\xc0\xba\xdd\xa5\x8d\xf4\xf8\xd2\xb3\x61\x62\xf3\x99\x9f\xdf\x8b\x9c\x08\x53\x27\x5f\x36\x51\xd2\xc0\xc0\xee\x98\x8d\x1d\xb7\x4a\x0a\x0c\xd3\x51\x90\x20\xa1\x18\xa7\x72\xdd\xa4\xc4\x42\x99\x8b\x92\xd7\xf5\x05\xaa\x20\x95\xe9\x2f\x84\xd9\x03\x10\x06\x63\x49\x1a\x26\xd2\x12\xcb\x47\x06\x45\x01\x56\xd4\x23\x6e\x8f\x92\x33\xa2\x6b\x9b\x54\x9a\x23\xe4\x1b\xd8\x61\xd7\x45\x13\x88\x81\x40\x69\xf9\xa5\xdd\x22\x1b\xec\x12\x43\xb5\xae\xe6\x1b\x26\x5f\xa0\x6a\x5d\xdf\x22\x5e\x58\x2e\x2b\x8e\x32\x22\x66\x92\xe6\x99\x34\x51\x63\x73\x92\x79\x6a\xac\xc8\x35\xf7\xbb\x71\xa9\xfe\x1f\x64\xfd\xf6\x0f\x75\xa8\xff\x60\x4b\x3e\xfc\xa1\x9e\x5f\xa0\x8e\xd5\xbd\xba\x1b\x7b\x3d\x89\xa6\x53\xb5\x76\x94\xfc\xaf\x6a\xce\xbf\x84\x93\x09\x4c\xba\x2f\x6b\xc4\xc7\x95\x3d\x8e\xd3\xf9\x3c\x4d\xba\x6c\xb5\x60\x53\x18\xf4\x89\x4b\xc7\x89\xe4\x86\xcf\x30\x1a\xb9\x27\xb8\xc1\xcb\x0c\xe9\xcf\x51\xb0\xe3\x75\x71\x83\xd5\xac\x12\x0c\x81\xa0\x8b\x81\x61\x34\x8a\x12\x4b\x64\x5f\xad\xd4\x6f\x5e\x21\xb5\xd1\x05\xcb\x4d\x86\x44\xd4\xa5\xd1\xe1\x95\x11\x37\xd4\xa3\x8d\x44\xf0\x50\x6a\x30\x66\x56\x56\x6b\xcd\x01\x75\x51\x12\x38\xaf\x53\x9d\x39\xac\x91\xe7\xf6\x92\xe3\x54\xf6\x39\x91\xbb\xbb\x61\x90\x0e\x93\x11\x8a\x35\x11\x12\x32\x69\x15\x33\x3b\x52\x99\x8e\x31\x9d\x05\x3b\x55\x0c\x1f\x8e\x78\x4d\xb3\xed\xc2\x82\xd7\xba\x33\x73\x5f\x8a\x8e\xc6\xf0\x3e\x06\x8b\xa4\x16\x06\xaa\x36\x97\x25\x5e\xe8\xf6\xc6\x69\x42\xa2\x64\x09\xeb\x59\x59\xd0\x54\xe3\x14\xcc\x10\xd5\x4e\x67\xba\x61\xa1\xef\x19\x4a\x53\x82\xd4\x6a\xc4\x71\xd7\xee\x9a\xb9\xcc\xf8\x45\xd3\x99\x4e\xa5\x2d\x53\x3d\x1b\x26\xa3\x51\x6f\x87\xd7\xa2\x69\xb9\xe4\x0d\xd6\x4e\x66\x38\x7d\xff\xae\x4b\x69\x85\x21\x49\x8d\x10\xc7\x30\x77\x5c\x44\x0c\x8d\x7e\xa7\xca\x90\xaf\xd5\x1c\xf2\x36\xbf\x4c\x51\xa7\x78\x1b\x05\x0a\xca\x0b\x53\x5c\x82\xe1\xa8\x67\xec\x4c\x95\x64\xe1\x8b\x26\xc3\xf5\x11\x21\x79\xc1\x88\x16\xc4\x2e\x0b\x5c\xc8\x85\xbf\xf2\x8a\xa6\x5b\xb4\x23\x83\xfa\xe9\xe8\x6d\x44\x7a\xad\x60\x15\xdd\x40\x2e\x7d\xd2\xed\xf9\x8f\x31\x62\xcb\x8c\x90\x39\x99\x8b\xa0\x31\x4d\xf1\x59\x38\x9e\x39\xe5\xf1\xfb\x55\x26\x5a\x34\x9d\x56\xef\xba\x48\xb5\x5c\x29\xe8\x64\xb5\xda\xd9\xfb\x93\xb3\x4c\xb8\xa5\x31\x59\xdd\xa7\x69\x0c\x61\x22\x9c\x44\x2b\x6e\xa2\x16\x7d\x45\xe0\xae\x56\x8c\xf0\xaf\x6a\x64\xba\xa5\x57\x1d\x6e\xb0\x69\x76\x95\x97\xbf\x57\x66\x17\xed\xb5\x83\x0d\x67\x12\x22\x2e\xd3\x1a\x5e\xf7\x8e\x15\x0a\x4a\x23\xa9\x34\x85\xba\xc5\x7c\xaf\x2b\xa5\x3a\x09\xb6\x6e\xf6\x56\xd8\xc6\x84\xd9\x92\xaf\xb6\x91\xc1\x3f\x90\xb8\x62\x9b\x82\x5b\x00\x1a\xa9\x23\x4e\xdd\x2d\xb4\x3f\x29\x92\x9e\x98\x9e\x98\x8c\x7b\x62\x4c\x21\xc8\x76\xa0\x4a\x05\x37\x88\xb8\x57\x25\xaa\x8b\xf4\x35\x60\xcb\xac\x42\x40\x97\xe3\x57\x29\xfd\xf0\x8f\x5b\x22\x54\xdc\x0e\x23\xf4\x6b\x88\xc0\xf7\x45\x8a\x49\x3f\xfb\x8f\x59\x9a\x94\xe5\xf5\xcb\xba\x42\x5e\x1b\xa2\x2b\x9a\x3a\x1b\x24\x39\xe5\x38\x5d\xe0\x6b\x9a\x39\x79\x2d\x22\xad\xc7\xa3\x08\xa8\x0c\x7d\x89\x26\xdd\x14\xfd\x25\x4b\x93\xae\xa9\xfd\x13\x94\xba\x06\xfa\x7c\xa9\xa7\x06\xd4\x8b\xb6\xd7\x64\x90\x93\x8c\x7a\x59\x41\xea\x57\x0a\x7d\x86\xbb\x99\x53\x45\xb9\xbd\xea\x48\x8e\xe6\x14\xa7\x73\x9c\xce\x4d\xa2\x96\x67\xea\x46\xe2\xe5\x34\xa3\x98\xbc\x16\xbe\x17\x4d\xa4\x41\x6a\x2e\x99\xc3\x74\xd4\xcb\x56\x2b\x47\x02\x73\xb3\xd6\x21\x88\x05\x22\xa5\x94\xb1\x0b\x08\x3b\xac\x4e\x4a\x70\x61\x8d\x2a\xfb\xe8\x8d\x52\xa4\xec\x51\x2a\x6f\x9e\x98\x4e\xc5\xd7\xfd\x14\xc5\x0d\xbb\x57\xa8\xba\xa3\xcd\xde\xd5\xca\x0b\x02\xd2\x88\xc3\x8c\x5c\x48\x53\x30\x87\xd2\xc9\x2a\xa5\x9c\xf4\xc1\x96\x9d\xb7\xae\x8a\x04\x2e\xcf\x80\x17\xcd\x28\x2b\x78\x7e\x50\xca\xc6\xaf\x91\xc0\x13\x97\x65\x59\x10\x19\x4c\xd5\xcb\x82\x20\x88\x4a\xec\x97\x05\xdc\x7a\x13\xb6\x29\x93\x8a\xd4\x24\xaf\xd5\x1c\xb3\x7c\xa0\xac\xbc\x74\xb5\xa2\x23\x4a\x9f\x4e\x0a\x15\x76\xd3\xaa\x45\x08\xbb\x62\x57\x15\x43\x96\x2e\xf1\x18\x82\x17\xf9\x94\x7d\xe5\x86\x99\x02\x51\xcb\xa9\x6c\xd1\xe6\xe0\xbc\x20\x73\x01\xd2\x11\xeb\x12\x94\x84\x73\xe8\x02\x9a\x84\x24\xec\x62\xb3\xbe\x62\x58\x84\x6e\x1f\x57\xd6\x5b\xb0\x69\x49\x21\x96\x5a\x66\x64\x22\x50\x49\x40\x65\xc2\x6e\xc0\xb4\x88\xd2\x20\x24\xe1\xff\x0b\xd0\x6a\x50\x8a\x55\xe1\xf6\x19\xc7\x95\xcb\xb3\x99\x93\x41\x64\x54\x21\x23\xbe\x5d\xc7\x0d\x3a\x26\x75\x1b\xd1\x47\x59\xbd\xdc\x92\xa1\x8b\x0a\xd7\x4f\xf3\xc4\xc6\x29\x0b\x2b\xa9\x98\xb8\x1c\xfe\x55\xee\xf6\xa6\xc6\x46\xb5\x08\x46\x91\xcb\x29\x95\x04\x94\xdb\x26\x94\x81\xe8\x4c\x87\x44\x6e\x22\x29\x50\x49\x23\x35\x31\x28\xc8\x15\x5e\xa4\x3c\x48\x66\xc3\x54\x7a\x07\x06\xba\x9a\x44\x65\xc1\x22\x26\xea\xa5\xd0\x91\x1c\x34\xc4\x23\x21\x9e\x36\xe2\xf5\xb6\x5d\xe2\xaf\xfa\x36\xf1\xc6\xba\x7e\xe5\xe6\xf0\x57\x7d\x77\x98\x79\x4d\x8a\xdb\xc3\x5f\x8b\xfb\xc3\x1b\x9b\x66\x91\xab\x9b\x07\x9c\xc3\x1d\x17\x15\x76\x7d\x44\x38\xfc\xc6\x6a\xc5\x36\xd9\x96\x50\x8d\xaf\x8a\x6b\xdf\x52\x51\xd1\xd1\xf4\x1b\x6a\xca\x2a\x50\xca\x23\xe5\x5e\xd6\xbd\x48\xdb\xdf\x50\x55\xd3\x15\x30\x42\xf8\x4d\x55\x6f\x47\x32\x7b\x0b\x92\xb9\x2a\xba\xb5\x2e\x9e\xed\xd7\x54\xb7\x1d\xb7\x0d\xf5\x5d\xa6\xe3\x30\x2e\x45\x3b\xa6\xe5\x28\x15\x25\x1f\x44\xb8\x5a\x4c\x0b\x8a\x5a\x90\x48\x0b\x27\x93\xb3\x47\x48\x88\x92\x08\xb6\x28\x65\xcb\x2d\xa9\x5b\x89\xce\x06\xd9\xc0\xd0\xa9\x52\x0f\xbe\x96\x82\xe9\x25\x46\x7d\x0c\x61\x51\x28\xa8\x50\xae\x34\x9e\x94\xa2\x0e\xf2\x54\xb7\x9b\x3f\xb3\x93\x15\x72\x3d\x37\xb3\xcb\x54\x9a\x5d\xad\xf8\x92\x9f\xa8\xe9\x3f\x0a\x5e\x64\x35\x74\x79\x14\x59\xba\x38\x57\xb2\xd3\xc0\xeb\xa5\x9b\xa4\x53\x5a\x21\x9d\xd2\x91\x13\xf1\xed\xa4\x4d\xa4\xf9\x57\x48\xa7\x62\x55\xff\x76\xc2\xa9\xd8\xf2\xdf\x47\x36\x15\x6b\xad\x16\x4d\x9a\xad\xa2\x8b\x15\x66\x14\xf2\xcd\x9e\x52\xac\x3e\x76\x09\x7e\x7e\xc1\x7a\xc0\x1f\x76\xf3\xb8\xfb\xb5\x6e\x3b\x72\x96\x66\xda\x37\x76\xdf\x86\xe0\x16\xdf\xfa\x1a\x45\x81\x74\x9d\xef\xfa\xbd\xe8\x1d\xb5\x14\x76\x77\xa5\x79\x00\xc3\x68\x24\x6d\x83\x52\x67\xd2\xea\xce\x64\xbc\x33\xc3\x74\xa4\xf7\x27\xd3\xfa\xc3\x60\x19\x37\x0e\x40\xdf\x4a\xf9\xcd\x1d\xdd\x24\x91\x4b\x72\x93\x8f\x02\x2a\x86\x3d\xb8\x6c\xfb\x5e\x6b\x1d\xbf\xad\xc1\x8d\x94\xd5\x3c\x29\xa5\xe6\x71\xb1\x79\x18\xe2\x91\xeb\xf6\x0a\x8e\xe2\x57\x30\xf8\x55\xf2\x5d\x30\x1f\xfa\xad\x4d\x6c\xe6\x20\xaa\x0d\x41\x49\xff\xa9\x6c\x9e\xf6\xf2\x95\x4e\x7e\x84\x79\xaa\x9f\x5c\x7b\xc3\x3a\xf1\xb2\x2e\x57\xf0\xf7\x11\x5f\xa5\xba\xfe\xed\xe4\x57\xa9\xe9\xb2\x00\x93\x47\xf5\x7a\x66\x24\x82\xb1\x3e\x91\x21\x36\xd6\x0c\x1d\x48\xcd\x4b\xb5\x84\x70\x0b\x64\xdd\x2b\x92\x16\x55\x1f\xaa\x52\x91\x04\x81\xd7\x83\x4d\xcb\x0d\x54\x2c\x37\x30\x72\x88\x19\xd1\xef\xbd\x26\x74\x4b\xa4\x78\xb3\xd4\x15\xce\xaf\x7f\x98\xb4\xdd\x84\xd9\xdf\x57\xdc\x8a\x63\xc4\xff\x8f\x88\xd9\x52\x0f\xb7\x6b\xbe\x25\xea\x17\x13\x4a\xe1\x66\xdc\xab\x9b\x52\x36\x4e\x99\xe9\xaf\x78\x35\xca\x99\x93\xfc\x23\xd8\x30\x2d\xb1\xe1\xf6\x05\x60\x13\x29\x8a\x83\x2d\x07\xda\xdc\x6e\x02\xb6\xdd\xb4\x71\x2a\x46\xda\x54\xa4\x3c\xb0\x46\x45\x78\x91\x72\x6c\x4f\xbb\xf7\xf7\x27\x0b\x36\x83\xf0\x5e\x59\x30\x36\x48\xc8\x8a\xe9\xa9\xef\x94\x6a\x0c\xf1\xdb\xeb\xff\x15\x2b\x52\x75\xdb\x43\x3c\x1a\x6d\x58\x8d\xee\x20\x23\x9b\x4f\xf6\xa5\x0f\x01\xac\x56\x3c\x22\x50\xcb\xd9\xb8\x4c\x1f\x0a\x85\x4b\x21\x41\x14\x76\xb3\x4c\x36\xbd\xc9\xc0\x2c\x2c\x32\xcb\x5d\x81\xcd\x75\xa7\x89\xc8\x7a\x9a\xce\x17\xb4\xab\x46\xfd\x9b\xcb\x11\xc8\xc8\x27\x0c\xe1\xfc\x3e\x2e\x1e\xb1\x7c\xa5\x50\x9a\x91\xb7\x94\xba\x4c\x1f\xb4\x1c\x81\xd8\xdb\x97\x1a\x4a\xf8\x08\x2a\xb4\x79\x12\x92\x30\xb0\x6d\xfd\x90\xc3\xd7\xc2\x6f\x76\x76\xf5\x6b\x20\x82\x8b\x45\x5d\x5f\x03\x40\x43\x3b\x4e\x1f\x6c\x64\x4f\xe0\x7e\x49\xff\x46\xc9\x34\xb5\x91\xfd\x14\xe2\xc4\x46\x36\x3b\x1e\x63\x8f\xd4\x8e\x26\x04\xef\x5e\x62\x20\x16\x09\x6c\xbb\x97\x3d\x45\x42\x56\x8e\xc3\x0c\x44\x0d\x5d\xf6\xcc\x8a\xf3\x47\x5e\x45\x97\xda\x79\xc6\xb1\x15\x16\x81\xb0\xa6\x98\x10\xb5\xe5\x2c\xd0\x92\xc2\x8f\xf9\x01\x0a\x80\xc0\x71\x1a\x8d\x06\xb8\xc1\xbb\x9c\x10\x6a\xff\x2a\x24\x61\x5d\x0f\xfe\xfd\x5a\x27\x75\x68\xfc\x25\x8d\x12\xc7\xb6\x6c\xb7\xce\x8e\xdc\x22\x2c\x0e\x03\x1b\x55\x53\x1e\x71\xd7\x2e\x1a\xda\x0f\x38\x5d\x2e\x6c\xc4\xff\x9e\xa6\x71\x1c\x2e\x32\x98\x14\x88\xc0\xf1\x26\xbf\x0a\x6f\x08\x6c\x9b\xe1\xcd\x74\xc9\x37\x20\x0f\x02\x61\x73\x5c\x2d\xcb\x6e\x60\x58\x40\x48\x9c\x7a\xbd\x34\xc4\xac\x17\xbd\x4a\xf4\x1a\xac\x47\x67\xc9\x84\xaf\x2c\xf2\xd7\x86\x4c\x81\xe3\x70\x64\xb7\xb4\xbf\xbb\x5b\xd9\x7e\x81\x91\x6f\x97\x11\xd9\x18\x7a\x9e\x1b\x1a\x24\x2f\xf2\x55\xb9\x7f\x68\xd1\x2b\xed\x78\x4b\x06\x64\xb9\xa0\x72\x56\xed\xb3\x19\x59\xa8\xc2\x4a\x9b\x0e\x2a\x30\x90\x30\x44\x1a\x93\x28\x0b\xef\x63\xd8\x98\x53\x83\x23\xb6\x93\xb7\x31\xa7\x80\xe5\xb9\x58\x1c\xd2\x96\x9c\x14\x8e\x08\xeb\x2c\x7d\xe4\x2a\xb9\xe8\xfb\x82\x1f\x2b\xca\xe5\x85\x0c\x5c\xe0\xf2\xcf\xa9\xaa\x56\xe5\x65\x61\x27\x74\xd8\xf1\x72\x4c\x52\x5c\x85\x43\xd5\xb8\x34\xb2\xe5\xfd\x38\x0e\xb3\x0c\x44\xc0\x20\x71\x11\xa9\x1c\x41\x2d\x27\x45\x7a\x0b\x85\x2b\xe2\x8a\x95\x76\x2d\x7b\x2a\x7c\xf5\x79\x34\x26\x05\x58\x6c\xd3\x82\xb9\xeb\xf9\x6a\x54\x2d\xd7\x85\x50\x47\x44\x9e\x26\x10\x75\xd2\x69\x26\x0e\x77\x29\xfa\xf2\x4e\xe1\x6a\xa6\x34\x18\xe1\xdf\x0e\x69\xe3\xd8\xc3\x80\xa3\x30\x61\x75\xb1\x38\xe6\xc6\x74\x19\xc7\x94\xa3\x37\x20\x2d\xf9\x71\x53\xc8\x8a\x46\x8e\xad\x15\x98\x21\x73\xe5\x3a\x18\xfd\xaa\x6b\x30\x14\xb9\x8a\xa8\x88\x92\x35\x4f\x98\xba\x44\x0d\x2a\x6e\xdc\x9f\x50\x0d\xa2\x4b\x2d\xac\x37\x34\xb0\x5c\x6c\x5d\x93\x8b\x25\x16\x6f\x5b\x95\x4b\xc5\xde\xb8\x2e\x97\x98\x25\x77\x95\xd0\x1a\x4f\xe9\x14\x91\xe2\x8a\x92\x91\xc9\x26\x21\xcf\xe4\xc8\xb2\x77\xc7\x08\xb9\x55\xb7\x87\x76\x9d\xd4\xed\x91\x9d\x97\x39\x17\xd5\x7f\x0d\x70\x55\xf3\xba\x4e\x57\x50\x88\xf8\x2b\x28\x8a\xd5\x88\x15\x4f\xb4\x8a\x86\x80\xb8\x2e\x72\xb3\x4c\x1a\xe3\xef\x23\x69\xf6\x70\xbe\x37\x4e\x1c\x9b\x8d\xdf\x40\xb6\x8c\x09\x4b\x92\xea\x92\x38\xe4\xdc\xa3\xa4\x8c\x12\x12\x27\x8e\x4d\xc1\x16\x0e\xa3\x0c\x26\x56\x98\x58\xf0\x7d\x0c\x0b\x22\x5e\xb2\x44\xc5\x0b\x7f\x0d\x06\x0b\x81\x63\x4f\xa5\x13\xce\x27\x79\x65\x22\x8b\x58\xc4\xe9\x72\xe8\x76\x4b\x50\xd7\x45\xd0\x18\x0b\x84\x68\xeb\x5f\x1d\x68\x9c\xf7\x2f\x2e\xcf\x06\x68\xc7\xe7\x1e\xda\x0a\xe5\xb0\xca\xf5\xa3\xad\x42\x72\x10\x99\xce\x4a\xbf\x85\xf2\xf4\x3d\x20\xab\x95\x3c\xff\x39\x0d\xa3\x78\x89\xb9\x48\xe4\x8b\xa1\x92\x90\x42\x65\x0e\x31\x19\x84\x04\xd8\x9b\x48\x84\xbe\xb6\xc4\x21\x6d\x56\x4b\x12\xdb\xca\x9c\xbe\x5a\xfa\x3c\xfc\x7e\x2e\x5b\xf0\x64\x03\x49\x34\x56\xba\x1f\xc5\xf7\x9f\x96\xb0\x84\xaf\xe2\xdc\x66\x45\x3f\x35\x76\xe9\x5f\x5e\x7e\xbd\x3b\xbb\xbd\xbb\x2d\x1d\x3e\x3d\x0e\xe3\x78\x97\xd6\x96\xbd\x63\x07\x50\xb7\xd7\x93\xb1\xb3\xe0\x25\x31\x54\x40\x49\xf7\x0b\xbd\xa5\xbe\xa2\xa6\x60\x9a\x26\x64\xb5\x62\xf5\xab\x3e\xa0\x88\x45\xf6\x1a\x02\xcd\x71\x51\x16\x78\xbd\x2c\x0f\xc8\xcd\x64\xbc\x46\x12\xa4\xc3\x8c\xbf\x55\x4c\x86\x1b\xaa\xaa\x5c\x11\x61\xa0\xf8\xf0\x06\x1e\xce\xbe\x2f\xf8\x16\x34\xe6\x61\x73\x89\x9a\xce\xae\xab\xc2\x66\xe5\xfb\x01\x72\xe0\x4e\x80\x15\x58\xd8\xf0\x8a\x58\x4e\xe2\xa2\xa8\x5e\x5f\xeb\x6f\x6c\x79\x0b\x61\x3e\x85\x84\x00\xde\x10\xcd\x12\x78\xe2\x10\xfe\x2b\xcb\xbb\xee\x66\x14\x9a\xa6\x46\xf6\x4a\xed\x22\x2f\x3d\xc4\x23\xa4\x85\x37\x89\xa1\x88\xd3\x07\x11\x6c\x7c\x95\xb2\x05\x2c\xb3\xe6\x54\x92\xc0\xff\xcd\xde\xbb\x6d\xc7\xad\x23\x89\x82\x0f\xf3\x30\x6f\xf3\x38\x2f\xf5\x30\x14\xba\x2b\x4d\x96\x90\x69\x92\x79\x63\x32\x4d\xab\x65\x59\xda\xdb\xed\x9b\x4a\x92\xed\xea\x4a\x69\xfb\x50\x99\x48\x89\x6d\x26\x99\x4d\x22\x75\xd9\x96\xaa\xd7\x9a\xbf\x38\x6b\xcd\x17\x9c\x7f\x98\x35\xff\x72\x7e\x60\x7e\x61\x56\x04\x00\xde\x33\x25\x79\xef\x7d\xd6\x3c\x1c\x57\xed\x14\x08\x06\x02\x81\x40\x20\x22\x00\x02\x81\x99\x26\x50\x83\x93\x37\x4d\x02\xce\x92\xc0\x97\x91\x0e\x6a\xde\x45\xbd\xd1\x71\xf4\x29\x9a\xfa\xab\x8b\x4b\xbe\xaf\x74\xc7\xd7\xa6\x3d\xfd\xa6\xe7\xb1\x3c\xbc\x8b\x2a\xa3\x85\xc1\xf9\x43\x5a\x8b\x18\xe2\x78\x47\xa1\xb8\x88\x98\xe1\x6a\x38\x80\x67\xc4\x90\x8a\x6d\xcb\x1c\xab\x93\x9d\xa5\x41\xda\x6a\xb1\x2d\x2f\xaf\x53\x9e\x55\x2c\x81\x74\xd8\xcd\x92\x4d\x39\x9b\xe1\xa6\x31\x19\xf2\x20\xdb\xb2\x42\x66\x2b\x5c\x93\x1a\x37\x9c\x00\x96\xe5\x05\x49\x72\x97\x54\xf9\xd5\xe1\xfe\x87\xd7\x6f\x3e\xfc\x84\x41\x28\x88\x3f\xe7\x2c\x51\x13\x05\xe8\x13\xa6\x76\xa9\x49\xea\x32\x15\xac\x91\xed\x60\x9b\x08\xbf\x05\xa6\x67\x6e\x33\xe1\xf0\x3e\x77\x43\xaa\x78\xd9\x36\xa1\x1a\xda\x2c\x97\x6c\x27\x46\x83\x06\xab\x28\xe3\x06\x80\x5c\x3b\xd3\x2d\x6b\x9d\x82\xde\x34\x4d\x2f\x7f\x6b\x64\x32\x54\x4a\xae\x5a\xd9\xb5\x06\x6a\xb7\x5d\xd6\xc2\x79\x53\xd4\x3c\x47\x2f\x34\x0f\x26\xbf\x7a\x41\x8b\xcb\x21\xb3\x4d\xa4\x50\x50\xc5\x2d\xa5\xf5\x73\x00\xc8\x29\x00\x2c\xd2\x93\xf8\x98\x4d\xe3\x68\x96\x7e\x2d\x53\xa6\xce\xf4\xa5\xab\xc5\xc2\x4f\x82\x5f\x99\x6e\xa8\x2f\xb3\x71\x84\xfc\x2d\xa8\xff\x82\x35\xaa\x73\x40\xae\x32\xb9\xd5\xbd\x91\x75\x56\x95\xd6\xea\xe8\x56\x6d\x9d\xa6\x91\xdf\xa2\xa3\x1a\x57\x45\x4a\x4e\x86\xc2\x51\x5a\xdb\xd0\xd5\xe9\x81\x1b\x30\xcd\xa9\x70\xb5\x6a\x2f\xf9\x4d\x61\xc1\xb5\x2e\xbc\x6a\xf8\x14\xc4\x37\x88\xb4\x0c\x0d\xc8\xae\x2e\x63\x6a\xed\xc8\xbf\x6e\x76\x66\x52\x9a\x49\xf3\x5e\x7e\x86\x16\x23\x89\x75\x0e\x77\x8f\x8f\xf7\x5f\xef\x54\x45\x5a\x05\xcc\x71\x59\xd6\x53\x2f\xfb\xa6\x3a\xef\x9f\xeb\xb9\xe3\x30\xbe\x16\xc3\x87\xc7\xf1\xb7\xc6\xee\x66\xb5\xbe\xae\xc8\x9b\xaa\x0c\xb4\x97\x18\x07\x46\x59\xaa\xb2\x83\x92\x85\x71\x23\x6c\x23\x88\x06\xc6\xa4\xf9\xde\xd8\x2c\xa3\xa8\x4b\x4a\xbc\xcc\xb6\x44\xad\x42\xae\x29\x55\x87\xa1\x4e\x8a\x43\x5d\x1c\x0b\xc9\x98\x51\xe6\xe4\xb8\x38\x32\x94\x65\xc7\xbc\x64\x15\x7d\x60\x37\x5c\x0c\xf6\x27\x08\xd7\x11\x6b\x10\xaf\xcc\x15\x2b\xd0\xff\x0e\xcf\xeb\x49\x58\x6d\x1e\x27\xd9\x6c\xa9\xb1\x01\xbc\x74\x1a\x4d\x52\x5c\xf8\x9c\x94\xe0\x09\x9c\xd2\x48\x97\x0b\xfc\x49\x76\x24\xad\xda\x19\x8f\x68\x56\x91\x0d\x4d\x91\x01\x90\x91\x77\x77\x5b\x55\x2f\x49\xee\x72\x2c\xf6\x5d\x7d\x0c\xeb\x46\x66\x87\x0a\x4e\xa1\x94\xcf\x8a\x3e\x7a\xe9\x55\xe1\xd6\x09\xc6\x7b\xff\x26\x58\xac\x16\x9a\x44\xa0\x4d\xe3\x55\xc4\xb5\x84\xf9\x60\xc3\xa9\xe6\x9f\xc7\x09\x0f\xa2\x0b\x21\xf1\xc9\x2a\xea\x28\x2b\xd3\x48\xa0\x58\x37\xaf\x34\x6f\x62\x9e\x51\xde\x60\xc2\x76\x9a\x0c\x1e\x08\xb9\x8b\x42\x8e\x3a\xa6\xd5\x2a\x4d\x46\x58\x61\x8a\x75\x77\xa7\xf3\xc2\xe8\x6c\x52\xe7\x98\xa7\x17\x0b\xe5\xb3\x2e\x8c\x0d\xc8\xae\x4b\x28\xf5\xaa\x4e\xcb\x74\x58\xf1\xbb\x50\x33\x23\x33\x47\x45\x13\x66\x5d\xc3\x79\xeb\xe3\x54\x94\x08\xfe\xb4\x96\xad\xf7\x99\xba\x2d\x36\x2a\xf3\x45\x1b\x27\x10\xb5\x25\x08\xf1\x42\x2c\x42\x70\xaa\x4a\xd5\xf4\xb7\x9c\x3a\x37\x58\xec\x5c\x9f\xf3\x6c\x86\xbd\x19\xac\x22\xe5\x32\xe6\xdb\x83\x9c\x6c\xd4\xfb\x92\xa9\x28\x86\xaa\xf6\xcd\xcc\x6d\x12\x8a\x27\x33\xbc\x2c\x9d\xc9\x2a\xd2\x9f\x6a\xb0\x8a\x84\x27\xab\xe8\x91\x36\xeb\x51\xba\xa6\x21\xfc\x9d\x74\x61\xc8\xd1\x2a\x8a\xa0\x5a\x69\x9e\x6a\xba\x46\xba\x80\x7a\x6a\x90\x9a\xf7\x21\xd9\x52\xf7\xc0\x6b\x61\x9a\x0a\x73\x5b\xe9\x6d\xd1\x1f\x32\x07\x45\xeb\xd9\xb0\xaa\xa5\xb3\xe7\x16\xeb\x1a\x1d\x1e\x1f\x04\x37\x6c\xa6\xdb\xc6\x36\x49\xc9\x23\xa6\x4e\xca\xc3\x6a\xd2\xc5\x15\x8d\x69\x34\x7c\xf6\xab\x80\xe4\x1f\xfd\x0a\x7d\x2e\xcc\xb7\x5b\xf5\x0b\x27\xec\xac\xe2\x43\x8f\x9b\x3b\xa2\xe6\x5f\x9c\x48\x41\xd1\x82\x48\xd9\x3b\xf7\x11\xdd\xa8\x5d\xb3\x84\x69\x51\xac\x94\x74\x95\x3b\x52\x2f\x34\x2e\x5b\xc9\x85\xa0\x6c\x89\x1d\x1d\x0d\x9e\x8f\x5f\xb5\xa6\xfa\xc8\xa5\x0c\xe9\xdb\x60\x5a\xce\x52\xc4\x8b\xc6\xd9\x90\x0c\xf3\xda\xb8\xcc\x94\x77\xa5\xc4\xe3\x91\x25\x8b\x66\x30\x69\x7a\xa8\x80\xe8\x17\x4f\xf6\xcf\x83\xe0\xc2\x7b\xf2\x88\x9c\xfb\x35\x83\x17\xe7\x8f\xf5\x55\x0f\xe1\x5a\x79\x6c\x4d\x5b\x8a\x85\x8b\x1f\x04\x65\xdc\x80\xfa\x3a\x2c\x79\xc4\x2c\x36\x93\x8c\xa4\x61\xda\x06\x93\xb4\xdc\xd1\x2b\x82\x89\xdc\x07\x99\xde\xa4\x62\xd6\x0d\x79\xac\x39\x91\xdf\x5b\x8d\xa2\x20\x6c\x95\x24\x41\xae\x1b\xc8\x60\xc0\x5f\xc1\x88\xa3\xe2\x2b\x2d\x1d\xce\x82\x99\x10\x65\x61\x20\x7c\xed\xca\x0f\x57\x4c\xf3\xa3\x59\xe1\x15\x46\xd1\xd4\x16\x71\xc2\x30\xb4\x70\xe6\x98\x34\xcc\x3c\xf3\xb9\xe6\x9a\x71\x51\x3e\x91\xc5\xa6\xbc\x28\xa2\xf5\xae\x6e\x16\xe4\x75\x3d\x5f\x9a\xc3\xca\x76\xd7\xf8\xaa\x18\x52\x1f\x47\x25\xf6\xe5\x27\x62\x8b\xfc\x82\xc2\x33\x2d\x5e\xf1\xdf\x8b\x09\x92\xbb\x40\x6d\xc3\xf2\x9e\x24\xb5\xd5\x2a\x47\x5b\x2e\xbe\x53\xd6\x5f\xb5\xaa\x61\x8a\x2a\x5f\x15\x8d\x4a\x7d\xa1\xb0\x46\x59\xa9\x61\xf5\x4f\x36\x6b\x19\xf7\xa4\xe5\x01\x89\xa0\x20\xda\x60\x58\xaa\x33\x62\x35\xfd\x6e\x04\xca\x67\x36\xd9\xb9\xc4\x2c\xec\xb4\x54\xde\x2f\xec\xbb\xbb\xe2\xc9\xc2\x07\xd5\x86\xa8\xf0\x41\x16\xf9\x49\xe2\xdf\xee\xff\xb5\x81\x3b\x5b\x0c\x26\x1f\x6a\x5d\x8b\xb5\x5a\x5b\x1c\xe3\xf5\x48\x82\xb6\x3c\x5e\x9e\x8a\x6c\x59\xe3\x35\x1b\x43\xb6\xb7\x13\x03\x4a\x4e\x92\xb3\x2d\x8c\x7b\x99\x97\x50\xab\x66\x0f\xd3\x99\xa6\x2c\xe1\xfb\x7f\xad\x19\xa5\xec\xeb\x70\x20\x77\x91\x13\x71\x8c\xb9\x10\x9d\x5b\x4d\x67\x98\x0c\xd0\x9e\x07\x7c\x2f\xc4\xd6\x5e\x77\xae\xbb\xba\x19\xc8\xb8\x2f\x1c\xdb\x94\x13\x28\x6b\x07\x50\x6c\xf3\xc2\x77\x07\xb7\xf8\x80\xab\x0a\x5b\x9e\xc7\x5b\xad\xad\x86\x10\xad\xd2\xac\xab\xae\xc0\x1e\x30\xb2\x53\x83\x3b\x64\x42\xb6\x93\x6d\x72\x46\x5c\x42\xc6\x99\xe3\xa0\x13\xc5\x12\xb2\x1d\xcb\x89\xec\xa5\x3c\x73\xe9\x87\x21\x4b\xde\xc5\x53\x94\xde\xaf\xba\x25\xb6\x4f\x6c\x03\x87\xb6\x89\xb6\xe5\x79\xf8\xc0\x8d\xfa\xb7\x8e\x35\x7c\x6f\x90\x0e\x73\xcb\xf3\xb2\x60\xd5\x7c\x27\xfb\x2c\xd5\x48\x24\x36\xe0\x31\x24\x66\x5d\xf3\x08\xd2\xea\x68\x1a\x96\x9d\x9a\xc2\xab\x27\x6a\x47\x67\x52\x0f\xb1\x3e\x61\xdb\xf6\x59\x07\x97\xa5\xf5\xe7\xfa\xe4\x97\xe7\x67\xdb\xee\xe9\x6c\xdb\x80\x9f\x53\x63\xe7\x9f\x9f\xe7\xbd\xbf\xc3\x27\xd6\x99\x4b\x76\x76\x76\xc8\xc3\xc4\x4a\x1d\xdc\xfc\xfd\x03\x74\x41\xe6\x8e\x3f\x42\xaf\x01\x6b\x4b\x98\xaa\xda\x42\x4a\x94\x52\xfc\xec\x61\x45\x5f\x5f\xe5\xab\x37\xc1\x4f\xd3\x9a\x29\x6a\x40\x29\xdc\x23\x85\xf2\xd3\xc9\x81\xf3\x1a\x2f\xa3\x48\x6a\x85\xcf\x6f\x39\x4b\xdf\xb1\x39\xcf\xb7\x1a\xcd\xd8\x61\x1c\x44\x59\x46\x18\x5f\xb3\xe4\x55\xbc\x8a\x66\x9e\x59\xc1\x56\x0a\xaa\x06\x39\x6b\xbe\x77\x10\x42\x1b\x36\xaa\xc9\x65\x75\x3c\xab\x9f\xec\xc5\x33\xb6\xcb\xf5\x04\x17\x4d\x4c\x69\x0b\x32\xe2\x8c\xe0\x85\x67\xd9\xc3\x1d\xbe\x2d\xc1\x11\xd4\xb5\x46\xf6\x0b\x2f\x68\xb5\x82\x17\x9e\x6d\x77\x77\xf4\x4a\x03\x82\xb6\x35\xb2\x69\xa5\x99\x56\xad\x55\x96\xed\x18\xae\x6d\xf7\x32\x54\xdd\x51\x03\x2a\xdb\xee\x55\x51\xd9\x35\x54\xb6\xd9\x03\x5c\x3d\x33\xc3\xd5\x1b\x36\xe1\xea\x99\x55\x5c\xdd\x1a\xae\x41\xbf\xdf\x1d\x00\x32\x27\x43\xd6\xb7\x1a\x91\x39\x55\x64\xbd\x06\xc2\x46\x43\xab\x6f\x1b\xae\xdd\xcf\x59\xd6\x6f\x62\x99\xdd\xaf\xb1\xac\x5f\xa7\x6d\x68\x99\x8e\x33\xe8\x19\x2e\xdf\xf6\xc8\xff\xfb\xff\xfc\xdf\x24\x8b\xbb\x6d\xd9\x19\xbd\xd6\xc8\xca\x8d\x7c\x86\xae\xdd\xae\x0a\x5a\x85\x88\x17\x2f\x06\xc6\xb6\x1e\xb4\xa1\x5f\x68\x5d\x14\x8a\x91\x0e\xb3\x32\xea\x18\x50\x4e\xe3\xdd\x5d\xbf\x6f\x8f\x06\x2f\xbc\xb8\xd5\x8a\x5f\x78\xfd\x61\xb7\xd7\xbd\xbb\x8b\x5f\x5a\x96\xd5\xb3\x2c\x6b\x47\x11\xee\xc6\x2f\x90\xd3\x90\x21\x54\x5f\x67\x9e\xc4\x8b\x3d\x29\x93\x7a\x6c\xb8\x7a\xdc\x16\xbd\x41\xd7\xc0\x60\x4d\xdb\x7a\xfc\xf2\xe5\x4b\xcb\x6c\x59\xa6\xdd\x35\x68\x7f\xd0\xb5\xcd\x6d\x1d\x1e\x5a\xb1\x61\xc8\xa3\xf6\x9a\xaa\xb6\xca\x63\x93\x26\xed\x76\xe9\x66\x18\x79\x7d\xcc\xc9\x81\xd3\x34\xc5\x16\x0e\x48\x61\x2c\x1a\xb2\x80\x54\x5e\xf2\x2e\xa3\x6a\xe9\x1f\x1f\x93\xd8\x1e\xd5\xb3\xc8\x4d\x23\x40\xae\x74\xb3\xae\x97\x0c\x97\x20\x83\xae\x35\xc2\xaf\xb4\xdb\x56\x56\x47\xb6\xf3\xbb\x84\x7f\xdb\x32\xc6\x12\x7d\xa1\xb3\x76\x74\x81\x7f\xb0\xad\x0b\x2e\x06\xc6\x8b\x17\x96\x69\x64\x3c\xa5\x40\xb0\x2b\x89\x90\xdf\x75\x25\x45\x18\xd0\x00\xa8\x16\x7a\xc3\x28\xeb\x8d\x71\x16\x35\x0e\x46\x81\x89\x43\xb4\xb9\x63\xad\x91\x7d\x17\xbc\x7c\xf9\x72\x60\xd0\xd4\xb3\x0c\x37\x78\x81\x15\xf4\xd7\x16\xb0\xed\x1e\x16\xb0\x6c\x28\x61\x1b\xee\x5a\xc0\x9e\x29\x00\x1d\x00\xec\x1a\xe3\xf4\xa5\x39\x36\x52\x18\x1c\x6b\x48\xb1\x1d\x41\xca\x5f\xd2\xd6\xa0\x5b\xbe\x44\xe8\x7a\x2a\xee\x0f\xbb\x9e\x76\xa2\x55\xf8\x25\x98\xf1\x4b\xcf\x14\xcf\xd3\x38\xe2\x49\x5c\xce\x4b\xd8\x85\x9f\xcc\xf6\xfe\xfd\xdb\xee\xe2\x3c\xb8\x58\xc5\xab\xd4\xdb\xb2\x24\x78\x21\x53\x94\xb1\x15\x9e\xc5\x79\x10\xc1\xc4\x77\x32\x19\x0e\x1c\xea\x0c\x47\x67\x74\x62\x59\xfd\x3e\xb5\xac\xbe\x83\xe9\x81\x49\x2d\x6b\x60\x41\xba\x67\xf7\xa9\xd5\x1b\x20\x4c\x6f\x68\x51\xf8\x11\xe9\x2e\xa4\x7b\x22\x3d\x80\xf4\x50\xa4\x47\x90\x46\x78\x18\x68\x56\xbf\x2b\xd2\x7d\x9b\x5a\xfd\x3e\xc2\x0c\x2c\x8b\x5a\x83\xae\x89\xe9\x9e\x43\xe1\x07\xd2\xc3\xbe\x49\xad\xe1\x00\x71\x0e\x07\x43\x48\x8b\xfc\x21\xe4\x0f\xbb\x90\x76\xcc\x21\x85\x1f\x91\x1e\x41\x1a\xf1\x3b\x3d\x93\x5a\xce\x60\x00\xe9\x51\xdf\xa1\xd6\x08\xcb\xda\xa6\x3d\xa4\xb6\xd9\xed\x43\xba\x6b\xf6\xa9\xdd\x35\x07\x98\x1e\xf4\x28\xfc\x88\xf4\x88\xda\xdd\xa1\xc8\x77\x2c\x0a\x3f\x22\x0d\xf0\x0e\xe2\xe9\x99\x36\xb5\x7b\x66\x17\xd3\xdd\x2e\x85\x1f\x4c\x8f\x20\x7f\x64\x8b\xf4\x90\xda\x7d\x13\xda\x65\xf7\xcd\x11\xa4\x47\x98\xee\x9a\xd4\xee\x77\x11\x67\x7f\x60\x51\xbb\x3f\x40\xf8\x81\x6d\x52\xf8\x11\xe9\x3e\xa4\x91\x86\x41\xd7\xa2\xf6\xa0\x2b\x60\xba\x90\xdf\x1d\x62\x7a\x68\x53\x7b\x80\x7c\xb0\x07\xce\x88\xda\x83\x11\x96\x1d\xf6\x1c\x0a\x3f\x98\xee\x77\xa9\x3d\x44\x3e\xdb\xc3\xfe\x88\xda\xc3\x81\x80\x19\xf4\x21\x8d\x7c\x18\x3a\x03\x6a\x0f\x1d\x84\x71\xac\x21\x85\x1f\x4c\x0f\x07\x14\x7e\x44\x7a\x04\x69\xa4\xdf\x01\x9e\x38\x0e\xd6\xeb\x8c\xba\x14\x7e\x20\x3d\x02\x9e\x8c\x4c\xa4\x73\xd4\x1b\x50\xf8\x39\xa3\x93\xae\x69\x3a\x14\x7e\x30\x6d\x5b\x14\x7e\x20\x6d\x75\x7b\xb4\x6b\x75\x11\xc6\xea\xd9\xb4\x6b\xf5\x7a\x22\x3d\x80\xf4\x08\xd3\xfd\x21\xed\x0a\x39\xec\xda\x03\x93\xc2\x8f\x48\x77\x21\xdd\xc5\xf4\x10\xf2\x87\x22\x7f\x38\x80\xf4\x10\xd3\x23\x87\x76\xed\x11\xe2\xe9\x8e\xba\xb4\xdb\x1d\x41\x7b\xbb\x3d\xb3\x4f\xe1\x07\xd2\xd0\x17\xf0\x23\xd2\x0e\xed\xf6\x7b\x22\x0d\xf4\xf4\x7b\xd0\x96\xee\xa0\xdb\xa5\xf0\x23\xd2\x03\xda\x1d\xc8\xfc\x7e\x9f\x76\x07\xd8\x77\xdd\xe1\xc0\xa2\xf0\x23\xd2\x3d\x48\x63\xbd\xc3\x21\xe4\x0f\x05\x8c\x03\xf9\x0e\xe6\x3b\x00\xe3\x20\xff\xbb\xc0\xc3\xae\xe0\x61\xd7\x19\xf5\x21\x2d\xf3\x87\x90\xc6\xb6\x8c\xfa\x5d\xda\x1d\xa1\x3c\x77\x47\x03\x87\x76\x47\x02\xe7\x68\xd8\x83\x34\xc2\x8f\x00\xff\x68\x84\x34\x8c\x46\x5d\xda\x33\x6d\xe0\x5b\xcf\xec\x3a\x14\x7e\x20\x6d\xf5\x2c\xda\x13\x7c\xee\x01\x9f\xe1\x07\xd3\x7d\x93\xf6\xac\xbe\x25\xd2\x5d\x48\x77\x31\xed\xf4\x68\xcf\x72\x00\x7f\xaf\xd7\x73\x68\x6f\x80\x63\xad\x37\xea\x8f\x28\xfc\x9c\xd1\x49\x7f\x64\x0e\x68\x7f\x84\xfd\xdb\x1f\x75\x1d\xda\x1f\x21\x0f\xfb\xa3\xa1\x49\xfb\x23\xd4\x0f\x03\xd3\xb4\xe9\xc0\xc4\xf1\x32\x30\x07\x0e\x1d\x98\xc8\x9f\x81\x39\xb4\xe8\xc0\xc4\xfe\x1a\x98\xce\x80\xc2\x8f\x48\x8f\xe8\xc0\xc4\xbe\x1b\x58\xe6\x88\xc2\x0f\xa6\xfb\x7d\x3a\xb0\x50\x9e\x07\x5d\xab\x4b\xe1\x07\xd2\xbd\xae\x4d\x07\xbd\x6e\x4f\xa4\x47\x74\xd0\x43\x1a\x06\xbd\xbe\x49\xe1\x47\xa4\x87\x90\x46\x3c\x83\xe1\x88\x0e\x06\x0e\xe6\x8f\x2c\x9b\x0e\x46\x56\x1f\xd3\x83\x1e\x85\x1f\x91\x1e\xd0\xc1\x68\x28\x60\x86\x00\x83\x3c\x1f\x8c\x86\x0e\xa4\xa1\xbd\x43\xd3\x1a\xd1\xa1\x69\x03\x3d\xc3\x81\x35\xa0\x43\x31\x66\x87\x83\xa1\x43\x87\x03\x1c\x2f\x8e\x6d\x76\xa9\x63\x23\xdf\x1c\xbb\xdb\xa3\x8e\x8d\x7d\xe1\xd8\x8e\x43\x1d\x1b\xfb\xcb\x01\x59\x75\xba\xc8\x1f\xa7\x67\x9a\xd4\xe9\xa1\x7e\xb0\xec\x6e\xd7\xa4\xf0\xdb\xc7\xa7\x5e\xcf\xa2\xf0\x0b\x74\xf4\xba\xa6\xd5\xa3\xf8\x2b\x9f\x46\xf8\x34\x12\x4f\xbd\x3e\x3c\x61\xef\x0e\x7a\x36\xb0\x16\x7e\xe1\xa9\x6f\xda\x3d\x3a\xe8\x9b\xa8\x89\x07\x7d\xb3\x3f\x80\x27\xc1\x97\xbe\x0d\x8c\x81\x5f\x7c\xea\xdb\x23\x0c\xac\x8a\x7d\xe8\x98\xa3\x21\x85\x5f\x7c\xe7\x58\xa6\x45\xe1\xd7\x96\x4f\x0e\x3c\x59\x02\xd2\xea\xdb\xf0\xd4\xef\xc9\xa7\x11\x3e\x09\xcb\x32\xb2\x7a\x5d\x8a\x7f\xfa\xf2\x19\x6d\xcd\xc8\x42\x4e\x63\x42\xbc\x97\x96\x68\x64\x5b\x60\x7f\x46\x36\xf6\xb4\x65\x8d\xba\x03\x9b\xe2\x1f\xc0\x3e\x02\x33\xd1\xa7\xe2\x8f\x7c\xee\x0e\xe0\x79\x80\x54\x8f\xac\xe1\x70\x60\xc2\xf3\x68\x34\x3a\x3b\x13\x46\xcf\xcf\xec\xe3\x04\xcc\x0f\x95\xc6\x6d\xd0\x03\xdb\x83\xa9\x21\xb5\xa4\xb1\x01\x5b\x83\x84\x0d\x7b\xd4\x1a\x4a\x63\x04\x76\x06\xcd\x8c\x0d\x56\x06\x53\x60\x63\x10\xcb\x08\x52\xc2\xd8\x38\xd4\xc6\x61\x61\x5b\x7d\x6a\x5b\xa8\x48\x6d\x9b\xda\xb6\x34\x3f\x60\x7d\x30\x65\x53\xbb\x2b\x4d\x0f\x58\x1e\x61\x60\xc0\xbe\x60\x0a\x2c\x8a\x30\x2e\x68\x4f\xd0\x6c\xd8\xd4\xee\xa3\xa2\xed\xf7\xa8\x8d\x6c\xb6\xfb\xf0\x56\x28\x7a\xd0\xf9\x5d\xa1\xf2\x41\xfb\xa3\xa2\x06\x3d\x2d\xd4\x74\x8f\xda\xa8\x60\xec\xd1\x88\x4a\xf5\x08\x1a\x11\x05\xb4\x6b\x81\x1e\x46\xd5\x62\x8d\x68\xd7\xc6\x94\xdd\xa3\x5d\x1b\x55\xb3\xed\xd0\x2e\xb2\xb5\x0b\x3a\x51\xa8\x44\xd0\x9a\x28\x4a\xdd\x3e\xe8\xcf\x91\x50\x93\xa0\x31\x41\x10\x07\x36\xed\xa1\x8a\xec\x0d\x7a\xb4\x87\xdc\xed\x0d\x06\xb4\x87\xaa\xac\x37\x00\x8d\x82\x8a\x69\x68\xd2\x1e\xf2\xb9\x37\xb4\x69\x0f\x07\x5a\x6f\xd8\xa3\xc2\xa5\x00\x8f\xa2\x87\x86\xa8\x3f\xea\xd2\xfe\x48\xa8\x11\xd4\x10\x38\x08\x1d\x3a\x44\x3e\x0f\x2d\x8b\x0e\x51\x04\x87\x56\x97\x0e\x71\x48\x0f\xad\x21\x1d\xa2\x41\x1b\xda\x26\x1d\xa2\x79\x1d\xda\x0e\x1d\x62\x3b\x86\xdd\x2e\x1d\x62\x3b\x86\xdd\x3e\x1d\x76\x85\x08\x75\xe9\xc8\x06\xcc\xa3\xae\x45\x47\xd8\x1f\xa3\x5e\x9f\x8e\x50\x4a\x46\x83\x2e\x1d\x09\x07\xc8\x04\x67\xc8\xc4\xde\xb4\x4c\x70\x38\x2c\x53\x88\xa8\x09\x02\x8d\xe2\xe8\x80\x10\x38\x42\x0a\x1c\xdb\xb2\xa8\x63\xe3\x70\x75\x6c\x6b\x00\x69\xa1\x14\x6c\x93\x3a\xb6\x2d\x14\x81\x0d\x0a\x02\x95\x88\x63\xdb\x50\xb6\x2b\xf2\x7b\x00\x83\x12\xe1\x80\x48\x38\x42\x26\x1c\xbb\xd7\x87\xb4\xa8\xab\x0f\xf8\xfb\x02\xbe\x0f\x78\x50\x32\x9c\xae\x89\xca\x05\x69\x80\x6e\x85\x1f\x4c\xdb\x16\x75\x44\xcf\x3a\xe0\x00\x39\x62\x48\x39\x3d\xc0\xd3\x13\x78\x7a\xfd\x2e\xa4\x85\x62\xea\x0f\x21\x8d\x34\xf7\x06\x90\x1e\x88\xf4\x10\x14\x16\xf6\x9e\xd3\x73\xa0\xac\x63\x8b\xf4\x00\xd2\xd8\x96\xde\x08\xf2\x85\xb2\xeb\x77\x2d\xea\xf4\xd1\xa1\x71\xfa\xdd\x11\x75\x84\xa1\x75\xfa\xbd\x1e\x75\xfa\x7d\x6c\x4b\x7f\x60\x52\xa7\x8f\x7c\x76\xfa\x23\x9b\x3a\x03\x13\xcb\x0e\xba\x90\xc6\x1e\x73\x06\x7d\x87\xc2\x0f\xa6\x01\x7e\x80\xce\x81\x03\xca\xdd\x91\xca\x77\x68\xf6\x28\xfc\x88\xf4\x00\xd2\x48\x33\x88\x8a\x33\x44\x49\x77\x86\x56\x1f\xd2\x7d\x91\x1e\x41\x5a\x94\x05\xfe\x0c\x45\xbf\x0c\x6d\x80\xb1\x05\x4c\xd7\xa4\xf0\x23\xd2\x5d\x48\x0f\x44\x1a\xca\x76\x45\xd9\x1e\x94\xed\x89\xb2\x3d\x80\x41\x87\xcc\x01\xa7\x16\x7e\x44\x1a\xe8\xe9\x0b\x78\xe0\xbf\x70\xc8\x9c\xe1\x10\xf2\x87\x02\xa7\x03\xf0\x8e\x80\x07\x7e\x0e\x05\x3f\x1d\x30\x12\x8e\xe0\x89\x03\x6d\x14\x4e\xb0\xe3\x58\x90\x6f\x89\x7c\x0b\xf2\x45\xbb\x1c\x30\x3c\x4e\x57\xa6\x1d\x48\x63\xbd\x0e\xf4\xaf\x23\xfa\xd7\x81\xfe\x75\x44\xff\x3a\x83\x11\x85\x1f\x4c\x8f\xfa\xd4\x11\x4e\x89\x03\xc6\xcf\x11\xc6\x6f\x04\xca\x62\xd4\x43\x47\x6d\x04\x32\x33\xea\xf7\x70\xac\x80\x73\x3f\xea\xa3\x43\x39\x1a\x98\x26\x0c\x1c\x1c\x57\x03\xcb\xa1\xa3\x81\x2d\x47\x91\x4d\x47\xa2\x1f\x47\xe0\xd4\x8e\x06\x3d\x91\xdf\x07\xf8\xbe\x4c\xf7\x20\x2d\xca\x82\x12\x1f\xc8\x11\x38\x80\xfc\x81\xc8\x1f\x42\x3e\xea\x8b\xd1\x60\x08\x78\x86\x32\x1f\xea\x72\x04\xfc\xc8\xa1\xa3\x21\xf2\x6a\x04\xfd\x3e\x12\x3a\x62\x04\x7d\x37\x1a\xa2\xe6\x1d\x0d\xbb\x43\x48\x23\xcd\xc3\x9e\x4d\x47\x43\x1c\x5f\x23\x70\xa6\x47\x43\xd1\x46\xe8\x2f\xf8\x11\x69\xc8\x47\xd9\x1b\x0d\x47\x00\x8f\x4e\xff\x68\x38\xea\x41\x1a\x71\x3a\x76\x8f\x8e\x1c\x94\x99\x91\x63\x0f\x21\x8d\x78\x1c\x50\x2b\x8e\xa8\xd7\x01\x63\xe5\x88\x7a\x9d\xee\x08\xd2\x42\xb7\x80\x01\xc7\x5f\x7c\xb2\x4c\x9b\x5a\xa6\x30\xaf\x30\x8b\xee\xd1\x41\x57\x50\x88\x13\x63\x34\xd2\x5d\x81\x03\x35\x91\xd9\x73\xfa\x62\x86\x84\xa9\x01\xc5\xe5\x11\x33\xb3\x80\x41\x7a\x5c\xbb\x73\x55\x5d\xa2\x69\x62\xdc\xf4\xe2\xdc\xb0\x70\xd4\x7b\xae\xb3\x17\xe5\x97\x13\xf3\x6c\x62\x9e\xdd\xdd\xb1\x97\x95\xfc\xf8\x6c\x62\x9d\x95\xbf\x60\x8c\xe3\x97\x5e\x32\xc6\x80\x7f\x5e\xe1\x8a\x4a\x3d\xd9\x8e\x8d\xe7\xb6\x41\x6b\x38\xb8\xc0\xe1\xf1\x6d\x2b\xdb\x6d\xb7\x55\x27\x01\x2f\x8c\x28\x6c\x14\x8e\x3d\xde\xb6\xee\x55\xd5\xf7\xaa\xcd\xa5\xa9\xf1\xc6\xa6\x67\x1e\x42\x53\xd3\xb3\x97\x95\xa6\xe7\xf9\x3f\xde\xf4\x1c\xc7\xc6\xa6\x97\xc0\x1e\x6e\xfa\xf4\xd2\x4f\xc4\xb4\xbf\xe1\x33\xcc\x9a\xb5\x83\x9d\x72\xc9\x23\x04\xc8\xde\xea\xcc\x70\xcb\x00\xaf\x83\x34\xa9\xc1\x54\xeb\xaf\x03\x35\x51\x64\x7a\x9e\xc7\x76\x4a\xeb\x1e\x2e\x7b\xd1\xb5\x81\xd3\x9e\x65\x0f\x5b\x2d\xf6\xc2\x1a\x98\x3b\xb5\x95\x10\x97\xbd\xb0\xec\xe1\x8e\xe5\x16\x85\x5c\x67\xc6\x8e\xe9\x5a\xdb\x3a\x7b\xe9\xf5\xba\x7d\xbb\xd5\xd2\xd9\x0b\xaf\xd7\xeb\x0d\xef\xee\x46\xa6\x69\x79\x1e\xc3\x84\x8d\x09\xa8\xc1\x1a\x99\x3d\xa8\xc3\xeb\xd9\xd6\xc8\x6a\xb5\x2c\xbb\xdb\xb7\xb6\xe4\xdb\x5e\xcf\xec\xda\xf8\xb6\xdf\xb7\xcd\x2e\xe6\xc1\x60\x14\x25\x06\x3d\xbb\xdf\x17\x79\x7d\xb3\x67\x8a\xbc\xbe\xd9\x1b\xa9\xbc\xa1\x2d\xf3\xac\xae\x82\xb3\x1d\x05\xd7\x1d\x0e\x64\x5e\x5f\x52\x30\xe8\xf7\x2d\x53\x50\xd5\xb5\x54\x61\x0b\xd4\xa1\x28\x8d\x49\x07\x73\xed\x81\x6d\xf5\xe4\x57\xe5\x0d\x3d\xb7\x56\x04\xca\xe3\x03\xb8\xd6\xbc\x74\xf4\x84\x7e\x4f\x79\x83\xd8\x65\x6b\x95\x72\xc0\x99\xe3\x38\x5f\xac\x34\x64\xd0\x52\x96\xaf\x01\xef\x72\x19\xa3\x47\xe7\x5e\xb9\x6a\x3d\x35\x8c\x17\xea\x92\xe8\xb6\x35\x4e\xb6\x3d\x4e\xe3\x6d\x2f\x55\xcb\x79\x96\x6b\xdf\x17\x23\xd8\x03\x49\x18\xdc\x72\xdd\x85\x16\x34\xc2\xc1\x1a\x7b\x26\x8d\x4a\x84\xb5\x5a\x5b\xba\x1e\x6d\x57\x09\x28\x2d\x78\xc6\x86\x61\xbc\xe4\x06\x46\xa8\x1a\x67\x01\x11\xb7\xbc\x44\xb4\x39\xf5\x62\x44\x9a\x16\x90\x46\x2f\xbc\x64\xfc\x00\xda\xd4\x30\x68\x0a\x28\xd5\x19\xfb\x97\x49\xab\x95\xb6\xdb\x54\x5d\x44\x1d\x44\x17\xe2\xc6\xd6\xec\xa6\xc2\xec\x16\xa5\x52\xa3\x4b\xdb\x5b\xca\xb7\x7a\x17\xa0\xc4\x9b\xb6\x08\x7c\x56\x0c\x7d\x89\xf7\x48\xcf\x62\xfe\x5c\x04\x55\x0e\xe3\x8b\xe7\x57\x2c\x49\x83\x38\x22\x94\x70\x76\xc3\x9f\x2f\x43\x3f\x80\x07\xab\x63\x0d\xf0\xec\xd2\x03\xc5\x67\x3e\x67\xd5\xb2\xb6\x69\x0d\xdb\xa6\xd3\x56\x18\xf8\x8c\x2d\xc5\x0d\xd6\x32\x9c\x02\x29\x46\xdb\xe8\x88\x3d\x73\x27\xb7\x4b\xb9\x19\x2a\xee\xfc\x1a\xc7\x8b\x2f\x7e\x02\x76\x41\x6d\x1c\x21\x7f\xff\xf8\xf1\xbd\xb6\xe5\x69\x96\x69\xfe\x99\xd0\x58\xc5\x00\x8d\x97\xb7\x19\xc8\x7f\xff\xbf\xfe\x4f\x78\x33\x63\xe9\x37\x1e\x2f\x3f\x00\x40\x20\xbe\x7d\x9e\x04\x3c\x04\x80\xff\xfa\xdf\xb4\x3f\xeb\x1c\x1e\x0c\xed\xbf\xff\xd7\xff\x06\xd0\x9c\xa5\xfc\x35\x5b\xa6\xde\x84\x5c\x72\x96\x2c\x3a\xc7\xd3\x24\x0e\xc3\xc3\x38\x11\x3b\x06\x52\x42\xf3\x17\x8c\x45\x95\xcc\x13\x96\x2c\x82\xc8\x0f\x2b\xd9\x9f\x4f\xea\x19\x7b\x7e\x14\xb1\x99\xc8\x3e\x43\xce\x5e\x04\x29\x67\xc9\x9b\x28\xe0\xba\x00\x23\x74\xdd\xd1\x6e\xe3\x7b\x89\x51\x1c\xc3\x60\xd2\x6a\xb4\x9a\x58\x05\x9c\x96\x8c\xbe\xbb\xd3\x9b\xef\x90\x97\xd1\x27\xaa\xcf\x18\xcd\x76\xa7\x8a\x45\x6e\x81\x2d\x47\xe4\xd3\x1b\x4a\x1a\xee\x03\x45\x31\xae\x93\xda\x50\xbe\x85\x06\xf9\xc9\x77\xdc\xbf\xf7\xa3\x60\xce\x52\xae\xd4\xcc\x7a\x08\xdd\x18\x27\x5e\xda\xf1\x97\xcb\x56\x0b\xff\x74\xce\xfd\xe9\xb7\x8b\x24\x5e\x45\xb3\xfb\x64\x67\x4d\xec\x19\x11\xf4\x95\x2c\xe3\xe5\x6a\x49\xee\x0d\x6a\x1a\x6e\x33\x8d\xdc\x3f\x4f\x77\x0a\x69\xfc\xe4\x2e\x36\xb9\xe6\x5b\x25\x60\x7c\xb6\x5a\x25\x04\xaa\x8c\xc8\x14\x71\xa4\x13\xf9\xf4\x66\x26\xc2\x19\x73\xc3\xd5\x4b\x1d\x4e\xa2\x38\x59\xf8\x21\xa9\x76\xb9\x71\x5f\x3e\xb4\x52\x6f\x88\x2c\x88\x2d\xb9\x37\x68\x8c\x64\x86\x01\x8b\xf8\x71\x69\x3f\x67\xf1\x9a\xd4\x0b\xc6\xf1\x4b\x5d\x10\x5d\x08\xd0\x23\x36\xc5\x10\xdc\x85\xd2\x6b\x9d\x91\xb5\xc5\x3b\xd7\x50\xa4\x84\xe4\x67\x16\x5c\x5c\x36\x1e\xbf\x5e\x8f\xe5\x12\xcb\x00\x9a\x69\xbc\x94\x37\xe9\xc2\x18\x8f\xf7\xc2\x60\x79\x1e\xfb\xa5\x8b\x3d\xc5\x4e\x07\xd6\x61\x37\x6c\xba\x17\x2f\x16\x7e\x34\xd3\x09\x94\x23\xc5\x40\x4b\x80\x6c\xe9\xa7\x9c\x1d\x24\xf1\x62\x3d\x9a\x8c\xb4\x12\x36\x2c\x48\x6a\x9b\xb1\xf1\x28\x96\xd2\x53\x0d\x01\xb3\x70\xb3\x88\xf7\x52\x59\x18\x8f\xed\x30\x97\x8f\xf3\xc7\x56\x0b\x7a\x71\x0b\x3d\x1a\x9d\x79\xdf\xef\xd5\xb8\xf9\x7e\x1e\xcf\x6e\x5d\xd6\x81\x3f\x34\x98\xc6\x91\xcb\x75\xd6\x81\x44\x73\xa4\x5d\xa9\x5b\x9e\x07\x0b\xff\x82\xa5\xcf\x01\xb0\x3d\x1a\x10\xf0\x32\x52\x0f\x8a\xa2\x42\x54\x5b\x97\x67\xf1\x14\x37\x4b\x88\x5c\x43\x86\xdd\x96\xea\xc9\xc0\xb8\xcf\x73\x75\x8d\xee\x67\x3f\x49\xf5\xf5\x0a\x97\x7e\x47\x1c\x6e\x7a\xaf\x2e\x6a\x02\x6d\x50\x04\xd3\x53\x9a\x14\xae\x67\x8a\xa3\x69\x18\x4c\xbf\x15\x77\x42\x48\xaa\xe6\xf1\x74\x95\x66\x57\x34\x85\x31\x5e\xd6\x4b\x23\x60\x70\x45\x8a\xb3\x23\x2f\x28\x6c\x6a\xe3\x99\x90\x19\x8f\xab\x02\xe5\x3b\x3e\x7e\x23\x86\x69\x18\x47\xac\xe1\xf4\x3f\xb4\x56\x00\xeb\x39\xbe\x22\x36\xa3\x01\x19\x0c\xe6\xb8\xbe\x11\x46\xd2\x52\xc7\xe1\xb1\xc2\x80\xa8\xe0\x62\xff\xb1\xf2\xc3\x46\x6f\xb1\x80\x53\x21\x95\xbb\x62\x24\xd6\x4d\x68\x37\x6c\xb4\x9d\x48\x53\x19\xfc\x9a\x6f\xa8\x45\xec\xf2\x98\x63\x5e\xc3\x36\x39\x23\x80\xfb\x28\xbe\xde\x8b\xc3\xe6\xdd\xd4\x49\x7c\xad\xd8\x3f\x8d\xc3\xd5\x22\x52\x5b\xa9\xe3\x2b\x96\xcc\xc3\xf8\xda\xdb\xda\x4a\x72\x24\xc5\x6d\xf0\xf1\x55\xfd\x1e\xc6\xdf\x88\x73\x73\x37\x0b\x70\x5d\xd5\x51\xac\xa1\x8c\xdf\x68\x44\xbe\xa6\xdb\x91\xda\x2a\x3e\xf4\xac\xeb\x88\x3d\x96\x25\x1b\xab\x78\x40\x1a\xa0\x2a\x51\x97\x94\x04\x59\x59\x56\x9b\x8a\x19\xa8\xaa\x7b\xa8\xbe\x87\xc5\x44\x14\xc9\xb7\x54\xc7\xd7\x05\x31\x11\x95\x16\x32\x54\x65\x42\x72\x4a\x7e\xe5\x9c\x80\x61\x3b\x48\xfc\xc5\x9a\x5e\xe7\xd2\x4d\xcb\xa2\x7d\xcf\x82\xab\xaf\x1e\xc3\x3f\x22\x63\x95\x84\x99\x24\xe0\x19\x8d\xd4\x4b\xf2\xd0\x04\xc1\x1c\x70\x17\xb7\x14\xc3\x9c\xd5\x0f\x22\x96\x14\x33\xe5\x3d\xf4\x7b\x97\xe0\xea\x85\x6a\x43\xbe\xa4\xac\xb4\x7b\x39\xdb\xea\x5c\xec\x0e\x15\x05\x0a\x03\x18\xe1\x55\xd4\x32\x1e\x54\xb0\x9c\xb6\x83\x28\xe0\xed\xf8\x1b\x71\x65\xa7\xe5\xe7\x6e\x52\x16\xcd\x94\x1f\xfa\x26\x9a\xc7\x5f\x75\x63\x8c\xc5\x54\xab\xdb\x41\x34\x8f\x8b\x65\x2b\x2d\xe8\xa4\xfc\x36\xc4\x08\x2e\xcb\xd0\xbf\xf5\xc8\x3c\x64\x37\xa4\xb1\x45\x9d\x65\x9c\x70\xab\x13\x47\x32\x5f\x9d\x70\x91\xcd\x29\xee\x40\x2e\x9e\x0b\x7a\x17\xfb\x33\xdd\x18\x4b\xdf\xb0\xd4\x82\x52\x00\x97\xca\x7d\xfe\xda\x3c\x89\x17\x1a\xb2\xde\x25\x54\xb0\xc5\xb8\xdf\xc8\xd0\xa2\xb0\x35\x03\x02\x2d\xf5\x4d\xe3\xb5\x9e\x63\xd7\xda\xfb\x52\xde\x8f\xf0\xa3\x7e\xce\xa7\xb9\x3c\x6e\x9a\x56\xe6\x4d\xca\x1a\xf6\x0f\xfa\x59\x68\x01\x97\x71\xca\x25\x56\xfd\x3b\x86\xc9\xc9\xa4\x82\x50\x3f\xb9\xb8\x72\x27\xdf\x25\x72\x98\xbb\xb8\x6b\x6b\xb3\xef\x55\x54\xbf\x55\x12\xd2\xc9\x7a\xb8\x33\x63\x3d\x03\x1f\x62\x73\x4d\x24\x4b\xe7\x86\x3a\x73\xbc\x65\x7f\x3a\x65\x4b\xfe\xce\x8f\x2e\x56\xe0\x98\xe8\x35\xe5\x57\x6c\x72\x59\x96\x09\x9d\x7c\xf7\xcb\xc5\x5d\x46\xe7\x71\xc2\x84\x77\xbf\x17\x87\x71\xe2\x96\x47\x3e\x54\x79\x50\x86\xd0\x0d\x9a\xcf\x08\xd6\x95\x79\x55\x86\xd0\x0d\x3a\x5d\x25\x69\x9c\xac\x83\xdf\xcb\xdf\xea\x06\x9d\xc7\xc2\xcf\x6e\x24\x46\xbc\x92\x50\x07\xfe\x22\x08\x6f\xd7\xc0\x89\x97\x48\x6f\xca\x3e\x1d\xbd\x73\x25\x0f\x3f\x1d\xbd\xc3\xeb\xf9\xef\xcf\xaa\x77\x16\x37\xf5\xdc\x1e\x38\x4e\x7b\xe0\x62\xb1\x86\x21\x90\xb9\x55\xf5\xa2\xf8\xaa\x61\x77\xab\x52\x20\x99\xc5\xc8\x34\xca\xd2\x87\x79\xd0\x87\x78\x96\x05\x65\x6b\x7c\x59\xbc\x21\xb3\x0a\x96\x9d\x8e\xdd\x13\x84\x6d\x6a\xd4\x43\xf2\x58\x10\xa5\x86\xdd\xda\x4d\x63\xa0\x7e\x4f\x91\x2c\xaf\x4d\x05\x84\x16\xa4\x78\x7c\x26\x65\x5c\x5b\x2d\x3b\xea\xfa\xf1\xe6\x01\x5e\x1f\xbd\x4c\x0c\x5a\x7e\xdf\xd8\xac\xf4\x32\xbe\x2e\xb6\x29\x5b\x0a\x60\x78\xb7\x67\x36\x13\xc1\x78\x50\xca\x60\xed\x64\xa9\x09\x3b\x73\x93\xfb\x3c\x14\xb0\x3c\x34\x9c\x47\xdf\x78\x54\xcf\x19\x4a\x37\xab\x03\x7a\x40\xa4\xe6\xcb\x8b\xd7\xaf\x82\x34\x38\x0f\x19\x11\x7b\xf6\xe4\x56\xf7\xca\xec\x52\xcf\x6c\xad\x41\x03\x8f\xe9\x04\x7d\x41\x42\x07\x3d\x13\xa6\x12\x4c\x27\xc2\x19\x24\xb4\xe7\x98\x78\x51\x64\x22\x3d\xdc\x44\xba\x89\xb4\x32\x1e\xd4\xf4\xe4\xab\x41\x7d\xaf\x66\x88\x55\x14\x9e\x90\x01\x8c\x4e\x66\xc1\x15\x31\xc6\xbe\xb4\x6f\xd3\x34\x3d\x61\x37\xdc\x23\xcb\x38\x0d\x44\x10\x25\xff\x3c\x8d\xc3\x15\x67\x63\x69\xfb\x5c\x2d\x8a\x23\x36\x06\x03\xd8\x9e\x05\x89\x98\x59\xba\x9a\xf0\x45\xc6\x3c\x5e\xba\x9a\x65\xfe\x79\x1c\xb2\x39\x77\xb5\xde\x9f\xc7\x48\xac\xab\x8d\xcc\x3f\x8f\x05\xbd\xae\xe6\x98\x7f\x1e\x2f\x82\xa8\xad\x9e\x6d\x78\xf6\x6f\xda\xc5\xf7\xe7\xf1\x4d\x3b\xbd\xf4\x67\xf1\xb5\xab\x99\x9a\xa9\xd9\xcb\x9b\xfc\x60\xe2\x26\x7d\xb5\x4d\xc6\xe7\x71\x32\x63\x89\xfb\x94\x32\x5a\x1a\x87\xc1\x6c\x4c\x70\x16\x16\x7a\x65\x8f\xa6\xca\x33\xf1\x82\x18\xe3\xb0\x13\x47\x21\xe8\xfa\x82\x11\x2f\x19\xb4\xb0\xca\xd7\x8c\x89\xc0\x3f\x64\xa2\xab\x59\x8a\x47\x62\xe1\x2e\x04\x4f\x77\x97\xf3\x24\x38\x5f\x71\xa6\x93\x34\x99\x92\xcc\x1a\x19\xf5\xd7\xcc\x5f\x84\x2c\x4d\x09\xdd\x32\x0d\xea\x77\xfc\xe5\x92\x45\x33\xa1\x2e\x42\x23\x77\xe5\x4a\x2f\x7c\x71\x3c\x42\xfa\x87\xc2\xd5\x7c\xcb\x6e\x71\x4e\x0f\x89\xf7\xfe\x12\xfd\x45\x95\xd7\x74\xec\x40\x30\x54\x79\x8b\xdf\x24\xa4\x64\x52\xd1\xe5\xbb\xf4\xa3\x59\x28\x02\x82\x4f\x08\x4e\x53\xe3\x15\xcf\xae\x7f\x38\x80\x8c\x8f\xe5\xb3\x59\x67\x74\x42\xbe\xb1\xdb\x59\x7c\x1d\x65\x70\x6f\xd9\xed\xeb\xf8\x3a\x6a\x00\x5b\x26\xd8\xfc\x1c\xee\x10\x32\x1a\x00\x57\xcb\x22\xd4\xa7\x65\x15\x84\xb3\x1b\xfe\x26\x5a\x16\x88\x3b\x51\x39\x25\xd0\xb3\xac\xc9\xef\xfd\xa5\x27\x26\x37\x15\xee\x15\x1d\x1a\x28\x19\x44\x17\x69\x15\xf2\x95\xcc\x2f\xc2\xfa\x21\xff\x29\x79\x1f\xcf\x70\x39\x2b\x52\x97\x64\xe0\x61\xf6\x37\x51\xca\x12\x7e\xe8\xa7\x9c\x79\x5b\x72\x0b\xfe\x65\xbc\x60\x6f\xd9\x6d\x2a\x56\x64\xb3\x30\x5d\x4b\xff\xa2\x29\x7b\xca\x93\xf0\x30\x5c\xa5\xef\x83\x68\x95\xfe\x9d\x25\xf1\xdf\xe3\x78\x91\xe1\x82\xb7\x7b\x7b\xf1\xf2\xb6\x04\xff\x59\x56\x28\xb3\xfc\xa5\x08\x46\x18\x20\x0b\x97\xfe\xac\xe9\x8d\xb0\xef\xd9\x1b\x70\x20\xd2\xa5\x3f\x65\xc7\x2c\x9a\xa5\xaf\xd4\x53\x5e\xcd\xa5\x9f\xf8\x53\xce\x92\xfd\x68\x1a\x03\x47\x3c\xb2\xe2\xf3\xb6\x93\xf9\xd7\xdc\xc7\x92\xfb\xe9\xd4\x5f\xe6\x6d\x5f\xfa\x69\xfa\x9e\x71\xff\x73\x96\xe3\x87\x1c\x01\xbf\x5c\xfa\xdc\x23\x0c\xc1\x49\xf6\xea\x0d\x42\xe7\xf4\x86\x3c\x23\x45\xbc\xaa\x53\xe6\x87\x5c\x89\x13\x9b\xa9\x23\x25\x0b\x36\x0b\x7c\xe0\xee\x6e\xc2\x0e\xe0\x6f\xce\xf6\x84\x5d\x05\xf1\x2a\xdd\x2d\xd0\x91\xcf\x70\x8a\x12\xb2\x3b\x15\xf3\xa7\xef\x7b\xbb\x1f\xf6\xf6\x85\xaf\x52\x0c\x8f\x26\xb2\x89\x41\xe5\xe5\x5e\x35\x00\x99\x4f\x0c\x7a\xb8\x7b\x7c\x5c\x7b\x0d\x99\xc4\xa0\xc7\x27\x47\x6f\x0e\x6b\x2f\x31\x97\x18\x25\x9a\x0a\x73\xe0\xa8\x76\x16\x46\x4e\x49\x45\xa7\x78\x5e\x73\xa7\xed\x94\xd4\x42\xe7\x8a\x17\x76\xf1\xeb\xcc\x70\xd9\x9a\xfa\xf0\x30\x5b\x18\x36\x6a\x1a\x71\xec\xad\x51\xbf\x18\xdf\x99\x34\xcc\xd5\x37\x32\xbb\x82\x17\x17\x7c\xf3\xeb\xe9\xb9\x67\x8e\xf9\x8b\xb2\x7a\x52\x5f\xe7\xb8\x3a\x4a\x20\xa3\x13\x64\x00\x13\x7e\x36\x66\x3b\xac\x7e\xa7\x4d\x32\x31\xcf\x68\x32\xb1\xce\xe4\xf9\xcc\x2a\x49\xd2\x87\x5b\x57\xe8\xbe\x59\x83\xb2\xfb\x35\x2c\x5b\x45\x6b\x99\x26\xb5\x73\x63\xe3\xd7\x60\x2b\x6a\xb9\x72\x94\x2b\x9c\x4d\xb6\x5a\x72\xb2\x2d\x0f\xb9\x11\xa3\x7c\xe3\x6c\xd6\xe3\x71\xf4\xf9\x04\x86\x03\x4f\xe2\x6f\x85\x69\x6e\x06\x60\xac\x27\x20\xd3\xd9\x0d\x8b\xc0\x4d\xc7\x09\x58\xe7\xfa\x32\x98\x5e\x1a\x1d\x1e\xbf\x8b\xaf\x55\x8c\x67\xbc\x3d\x93\xa1\xd6\x7a\xcb\x6e\x5b\xad\x2d\x86\xba\xe3\x2d\xbb\xbd\xbb\x23\x53\x82\x77\x3a\x90\x2b\xf8\x2b\x6f\x0b\x12\xc3\xbb\xd5\x22\xe7\x49\x7c\x9d\xb2\xa4\xfd\x8d\xdd\x2a\xf9\x2e\xea\x92\x56\x0b\x43\xbf\xa9\xaf\x95\x4a\x38\x9a\x29\xfb\xc6\x6e\x11\x68\xcc\x84\xda\xc6\xea\xf5\xc4\x4b\xca\xc4\x1a\x34\x29\x7e\xfe\x34\x8d\x6d\xcb\x76\x54\xfc\x7f\xf5\xe2\xa5\xd7\xb5\x5b\x2d\x3d\x29\x56\x3e\x4e\xa4\x80\x37\x33\x5e\x6f\xa2\x2a\xc1\x90\x95\xa0\x9e\x58\xa4\x02\xa8\xca\xc8\x50\xf1\xf2\x30\x89\x97\xfe\x85\x58\x6c\x36\xd6\x89\x9c\x2c\x2b\x3e\x6c\xed\x2e\x97\x1f\xe2\x68\x8f\x27\xe1\x31\xb4\x50\x22\x2c\x77\x5e\xe5\x83\x50\xe9\x51\x7c\x6f\xaa\x65\xc9\x8f\x39\xad\x96\x5e\xe8\xc4\x22\x17\xeb\x4d\x58\x2f\x52\x99\x5b\x51\x77\x5d\x2a\x5a\x7d\x93\x54\x7e\x5a\x96\xcb\x5b\x0e\x08\x82\xec\x62\x35\x6d\x2b\xe3\xab\x67\xb5\xfe\xa1\x5b\x2f\x5e\x30\xbc\x1e\x0b\x10\xb5\x2d\xc3\xa0\xf6\xb0\x84\x29\xb3\x1f\x0f\x31\x19\xb7\x1d\xac\x27\x18\x5d\xa4\x75\xd1\xaf\x63\xe3\x7b\xe0\xc5\xf2\x43\x43\x32\x89\xcf\xd4\xcd\x81\x0a\x26\x3f\xf3\x1c\xb5\x5a\x7a\xe4\x45\x32\x92\xab\xf2\x75\xe8\x84\xd1\xe4\xcc\x80\x69\x88\xe7\xf9\xad\x96\xfa\x72\xb6\xe5\xc5\x08\xcf\x75\x95\x03\x30\xf7\x3f\xc4\xad\xbb\x2a\xaf\x7e\x0b\xab\x8a\x81\xb9\x44\x13\xe0\xcf\x6b\x36\x4f\x27\x19\x46\x11\xa3\x53\x1d\x1e\x43\xb7\x55\xc4\x13\xa1\x91\xd7\x68\xb5\x3b\xc2\x3a\x53\x7f\xcd\x6b\x69\x9b\x69\xb8\xe6\x3d\x18\x67\x7a\xb9\xe6\x25\x1a\x67\x3a\xf5\xb2\x21\x40\x57\xde\x56\xd9\x85\x81\x41\x21\x58\x46\x73\x06\x8a\x57\x3b\xea\x0d\x0c\x16\xa9\xfc\xdc\x2c\x45\x97\xde\xd6\xf3\x5f\x4e\x27\xa7\xd7\xdb\xa7\x67\xea\x7a\xee\x04\xf9\xe0\x2f\x0d\x15\x61\xbf\xec\x87\xca\xe5\x55\x20\xa6\xed\x87\x9c\xb8\xcb\x56\x6b\xda\x6a\xad\x5a\x2d\x1d\xc3\xc2\xae\xbc\x2d\xcb\x18\x9f\x27\xcc\xff\x26\x56\x54\x13\x98\xc3\x65\xa0\x76\x45\x57\x29\x23\x57\x19\x21\xeb\x90\xc1\x2c\x32\xc3\x65\x3d\x1d\x17\x4e\xf0\xe7\xe3\xb9\xc7\xf5\xe9\x0e\x91\x9b\xa8\x88\xbb\xda\x21\x88\x74\xb6\x43\x80\x35\x24\xfb\x04\x2c\x04\xe6\xc2\x03\xd3\xe1\xa7\xdf\x8e\xa5\xea\x29\xaa\x21\xba\xf0\xbe\x4b\xc9\x71\x33\x19\xa2\xf8\xd6\x2d\x40\x01\xc3\xdc\x29\xf5\x43\xee\xae\x28\x54\xe2\xce\xee\xe9\xad\x57\x9a\x10\xe0\xda\x99\x48\xeb\x0b\x34\x5f\xb7\xad\x96\x7e\xe1\x4d\xbd\x95\x87\x8e\x75\x90\x7f\xd4\xae\x8f\x51\x7d\xee\xdd\x76\x7c\xcc\x33\x5a\x2d\x7d\xee\xcd\x3b\x53\x3f\x0c\x65\xd0\xad\x22\xa7\xe8\xc2\x30\x0c\xba\x7a\x8c\xa1\x9b\xe3\xb8\xd6\xe7\x5e\x68\xd0\xf9\x96\xe7\x85\xf0\xb0\xe5\x79\xfe\xdd\xdd\xf4\xee\x6e\x75\x77\x37\x13\x75\x79\xde\x65\xab\xa5\xaf\x3c\x64\x75\x23\x6d\x49\x47\x90\xae\x68\x2b\xdc\x82\x50\x51\x26\xa2\x4e\xdb\xf3\x94\x28\x66\x1b\x87\x10\x8d\xcc\x93\xfb\x76\x2e\x76\x2c\xd7\xa4\x96\xf1\x68\x8b\x86\xcd\x88\x0c\x23\x98\x23\xd9\xfe\xdd\x5d\xed\x7a\x9e\xb9\x88\xfb\xa0\xc4\xc3\xf3\x82\x1d\x68\x97\x8b\x42\x02\x4f\x2b\x7c\x42\x51\xf1\xbc\xa0\xd5\xd2\xa1\x77\x0c\x4a\xfe\x34\x21\x9e\x37\x57\xa4\x99\xd4\x86\xc6\xae\x90\x55\x17\x32\x00\xc3\xf9\x78\xeb\x02\x19\x37\xdd\xd9\x5a\xdd\xdd\x5d\x40\xe2\x02\xc7\xcf\xd6\x74\xe7\xdc\x23\xe3\x1e\x71\xb7\xa6\xf8\x62\x05\x2f\xa6\xad\xd6\xd6\x0a\x5f\x0c\x88\xbb\x12\xcf\x17\xf8\x3c\x24\xae\x28\x38\x6d\xb5\x74\xc8\x70\x88\xe1\xc2\xdf\x3e\xc1\x3f\x5d\xf1\xc7\x26\x74\xee\x75\x81\x2c\xc1\xc5\x1d\xf2\xa7\x89\x45\xb6\xcf\xb7\x33\x3a\x6d\x6a\x19\x6e\x81\xea\x79\xb6\xfd\xd3\x28\x82\x15\xb2\xef\xd5\xd6\xcc\xb9\xa7\xe4\x63\x5d\xbf\x50\xa0\xee\x6b\xed\x35\xbc\x2a\xfb\x3b\xc6\x4b\x6f\xd0\x6b\xb5\xbe\xbe\xf0\x46\x7d\xc4\xd8\xe4\xb8\x7c\x6d\x0f\x7a\x4a\x76\x9d\xf6\x79\xc0\x9b\xa5\xd6\xca\x9b\x2b\xb8\xfe\x15\x06\x43\xd5\xbb\x1a\xaf\xa9\xc3\xb8\xd7\x01\xbf\x9c\x2f\x36\x54\x70\x77\x37\x93\x66\xa7\x32\x17\x15\xb2\x4d\xfe\x44\xb6\xe7\xd2\x89\x5f\xe3\x94\xcd\xe5\xf5\xda\x6a\xb9\x50\x44\xdf\x7a\x13\x5d\xf9\x61\x30\xd3\x7c\xb9\x86\x46\xb6\x2b\xc1\x42\xe6\x46\x63\xb9\x0f\xb1\x36\x63\xf3\x20\xc2\x15\x3a\x8c\x4f\xa9\x14\x12\x86\xa8\x54\x1e\x68\xc9\x4f\x50\x8b\x0d\xf5\x18\x0a\xf2\x85\xb8\x9d\xad\xa1\xc4\xfa\x9b\xcd\x7e\x00\x83\x3f\x9b\xc9\xdc\x6a\xc4\x18\x79\x9b\x01\x98\xdf\xa0\xac\x26\xbf\x56\x6c\x75\x90\x85\x4f\x13\xb1\xb7\x83\x62\xec\x6d\x78\x3f\x49\xcf\xa0\x80\x0c\x63\x2d\x82\x71\xbc\xcd\x9e\x75\x66\x18\xdf\x13\x0f\xa0\x84\xa9\xb9\x4f\x76\x12\xa9\x48\x3d\xee\xea\x09\xea\x77\x09\xec\x32\x2a\x7b\x87\xdf\xd3\x40\x46\x1c\x68\x22\x4c\xdd\xfc\x40\x83\x4e\x1a\x27\x85\xed\x4d\xd8\x38\xb9\x18\x5d\x36\xf9\x8a\x3e\x80\xdf\x8b\x17\x4b\x3f\x91\xf3\x07\xf9\x82\xf2\xc2\x83\x71\xaf\x82\xff\x34\xd5\xee\x4d\x92\xb3\xe6\xfe\x6e\xe4\x7d\x7d\x81\xbf\xa6\x13\xb3\x59\x8e\x58\xb4\x3a\xf4\x93\x94\x25\xe3\xa4\x93\x30\xbc\xd1\x56\x18\xca\x00\xe3\x66\x06\x5e\x22\x6e\x34\x7b\xcb\x6e\x8f\xd9\x7f\xac\x58\x34\x65\x0d\x91\x17\x4b\xdf\x32\x65\x1c\x5c\x8c\x6c\x93\x74\x82\x34\x8b\x3a\x64\x34\x93\x03\x3c\x94\x75\x73\x43\x44\xeb\x2c\xd4\xba\x2b\xe5\xf1\x91\x75\xde\x97\x6b\x14\x2b\x17\x05\xc9\xd4\xeb\x4b\x7a\x4a\x76\x02\x83\x72\xc3\x2d\x63\x4c\xf2\xa8\x9c\x2a\x20\x63\x34\xd3\xe2\xb9\x96\x4a\x66\x60\xec\x9c\xea\x50\xfe\x91\xb2\x35\x42\xc5\xd5\xbd\x8f\xed\xf6\xb4\x79\x87\x72\xe1\xfe\xcb\x1c\x56\xe7\x94\x4d\xf8\xc3\x42\x95\xbb\x30\xeb\xee\x58\x5c\x37\x8c\xb3\xd8\x50\x1a\x46\x60\xad\x5c\xda\xdd\x10\xd7\x81\x4f\x12\x31\xfe\x9b\x06\x37\x4c\x7c\x60\x64\x67\xb1\xee\x0b\xb8\x37\x2e\x75\x4b\xc7\xbb\xb4\xdc\x2d\x17\x71\xeb\x53\x47\xe5\x72\x16\x56\xbd\x61\x32\xe1\xa9\x4d\x10\x42\x42\x8d\xea\x72\x1f\xcc\x3b\x4a\x1d\xf2\x16\xcb\x55\x86\x61\x7e\x03\x8c\x44\xdb\x6a\x95\xf5\x7e\x7e\x13\x4c\x51\xdf\x1b\x25\x52\xf0\x36\xa8\x47\xd6\xbf\x46\x1e\x70\x69\xac\x1a\x11\x08\x57\xc5\x94\x8c\x88\xe2\x7a\x06\x23\xce\x67\xd0\xef\xc2\xe6\xbb\xa5\x7c\xeb\x8c\x0a\x47\xb0\x9c\x6d\x9f\x51\xe9\x6f\x95\xf3\xbb\x67\xe8\x33\x97\xf2\x7a\x67\xc2\x83\x2e\x65\xf6\xcf\xee\x1f\xe0\x33\x76\xc6\xda\x4f\x84\x85\x8d\xe1\x0d\xf3\x5f\x5c\xe6\x43\x8f\x75\x4a\x27\x1c\xfc\x54\x97\xdd\x57\x2f\x92\x92\x22\x96\xd5\x10\xd0\x38\xff\xee\xa8\x07\x85\x95\x8b\x40\xcd\xe6\x20\xa9\x66\x68\x41\xbe\x3c\xb5\x35\x2d\xcc\x66\xaa\x0b\xe9\x3b\xdc\x4d\x28\xe0\xbe\xcf\x29\x48\x1e\x43\x41\x01\xe9\x9a\x35\xf8\x9d\xc4\xe5\x55\xd4\xc1\x06\xd4\xc2\xe8\xe6\x2d\x83\xf2\xe3\x6c\x77\x7d\x71\xca\xe4\x6d\x99\x94\xe9\x69\x15\x79\xfa\x38\xce\x09\x16\x35\x51\x17\xfd\xbe\xac\x6f\xaa\xc2\x2f\x18\x90\xe6\x35\xbe\x92\x6b\x09\x2e\x6a\x5e\x38\x2c\x14\xce\xa8\x2b\x92\xcc\xc5\x95\x6d\x98\x57\xa8\x14\xaf\xc3\xa9\x96\x4b\x68\x90\x65\x16\x3a\xb3\xf6\x05\x62\x87\x01\x3a\x1a\x18\xae\x35\x18\xa8\x79\x54\x3c\x63\x77\x77\xd6\x60\x58\x79\x76\x0a\xcf\x3b\x9b\xd6\x37\xdc\xf5\xab\x17\xf7\xf7\x15\xed\x87\xde\xc0\x54\xac\x9a\xac\x36\xaf\x9a\xcc\x1e\x58\x35\x59\x6e\x5a\x35\x99\x6f\x5a\x35\x19\x97\xd5\x53\xaa\x4f\x4c\x4a\x26\x9f\x3e\xbc\xfd\xf0\xf1\xcb\x87\x33\x42\x97\xe2\x7f\x78\x64\x9c\x92\xc9\xfe\xf1\xde\x19\xa1\xe4\x4f\x84\xce\xe0\x7f\x78\xa6\xd9\xa6\x64\x72\x60\x9d\x11\x1a\xe9\xe4\x4f\x1f\x0f\xe1\xf5\xe4\x90\x18\x74\x06\x09\xbb\xfb\x0f\x22\xe1\xba\x00\x67\x2b\xb8\xbf\x22\xdc\x5f\x33\xb8\x5e\x06\xd7\x03\xb8\xae\x82\x3b\x42\xb8\xa3\x0c\xae\x9f\xc1\xf5\x01\xae\xa7\xe0\x8e\x11\xee\x38\x83\x1b\x64\x70\x03\x80\xeb\x23\xd9\x13\x0b\x8b\x23\x80\x93\x01\x40\xc3\x0e\x06\x12\x60\x98\x01\x8c\x32\x00\x07\x00\x86\x12\xc0\x51\x00\x5d\x2b\x03\x18\x01\x80\x23\x01\x46\x19\x80\xad\x00\x6c\x60\xea\xc1\x48\x00\xd8\x66\x06\x90\x31\xc7\xb6\x90\x89\xa6\x84\xb0\x32\x88\x8c\x2d\xb6\x60\xb3\x25\x21\xba\x0a\xa2\x97\x57\x82\x0c\xb6\x6c\x09\xd1\xcb\x20\xb2\x5a\x46\x36\x25\xff\x05\xb3\x03\xdd\xd7\xc9\xbf\x10\x83\xfa\x3a\xf9\x85\x18\xc0\xb4\x25\x46\xef\xa0\xc4\xda\x02\x80\x50\x27\x62\x75\xf0\xc3\x6a\xf1\x95\x18\xe2\x79\x37\xe4\xc5\xc7\xf7\x8c\xfb\xe2\xf9\x8c\x4e\xfa\x26\x25\xf6\xbf\xfc\x58\x51\x8b\x92\xee\x3f\xfd\x58\x51\x9b\x92\xde\x3f\xff\x58\xd1\x2e\x25\xfd\x3f\xff\x58\xd1\x1e\x25\x83\x5f\x7e\xac\x68\x9f\x92\x61\xeb\xc7\x8a\x0e\x28\x71\xfe\xf2\x63\x45\x87\x94\x8c\xf4\x1f\x2a\xda\x73\x28\x31\x8d\xac\x68\xe9\x53\xf8\x3a\x04\x55\x20\x0c\x83\x31\xa2\xa4\xfd\x75\x3d\x9e\x35\xf9\x58\x74\x48\x89\xb7\xfd\x43\x45\x87\xdd\x1f\xad\x75\x60\xfd\x78\xa5\x16\x25\xdb\x7f\xf9\x91\xa2\xa0\x68\x5e\xbd\x3d\x3e\x3c\x23\x34\xd1\xc9\x7f\x12\x4a\x4e\xcf\x89\x01\xe9\xd3\x73\x42\xc9\x7f\x62\x61\x18\xca\xa0\x70\x4e\x76\x5f\x9d\x11\x1a\xe8\xe4\x94\xe3\x88\xff\x3b\x31\xe8\x9c\x2e\xf1\xbd\x63\x51\xf2\x1f\x7f\x05\x12\x7c\x9d\xfc\x35\x2b\x06\x9c\xbc\xfe\x22\xb3\xbf\x64\xd9\x83\x11\x25\x6c\x5f\x66\xef\xe7\xd0\x36\x25\xc9\x91\xcc\x3e\xca\xb3\x7b\x94\xf0\x13\x99\x7d\x92\x67\x8f\x28\xb9\xfd\x37\x99\xfd\x6f\x79\x76\x9f\x92\xd5\x27\x99\xfd\x29\xcb\x86\x8e\x09\xde\xc8\xec\x37\x79\xf6\x88\x92\xf8\xa3\xcc\xfe\x98\x23\x31\x29\x59\x1e\xca\xec\xc3\x2c\xdb\x46\xc5\xfb\x5d\xe6\x4f\xf2\x7c\x50\xa7\x67\xf7\x32\xff\xac\x90\x6f\x52\x72\x7a\x7a\x27\x5f\x9c\x9e\xe6\x6f\x40\x41\xef\xed\x1e\x1e\x67\x26\x0f\xf9\xd2\xa7\xc4\xdf\x95\xd0\xbb\x39\x35\x5d\x4a\xd2\x63\x99\x7d\x9c\x73\xd1\xa1\x64\xf6\x5a\x66\xbf\xce\x9b\x64\x52\x32\x3f\x90\xd9\x07\x79\xb6\x45\xc9\xc5\x4f\x32\xfb\xa7\x3c\xdb\xa6\xe4\xf2\x67\x99\xfd\x73\x9e\xdd\xa3\xe4\xdf\xff\x35\xd3\xdc\xff\x4a\x0c\xba\xcc\xde\xf5\x29\xf9\xf6\x36\x7b\xf7\x56\x8d\xc2\xbd\x90\xf9\xc9\x57\xa1\xdc\x11\x6e\x40\x49\xf8\x2e\x83\x7b\x57\xc4\x61\x39\x03\x4a\xc6\x2e\xbc\x9c\x67\xcc\xb2\x29\x79\x76\x4a\x8a\x79\x68\xc3\xf7\x3f\x9c\xec\x1f\x81\x91\x39\x4d\x08\x5d\xd1\x95\x78\x03\x56\xf6\xf8\xe7\x37\x07\x27\x25\x0e\x8e\x4c\x4a\x7e\xfd\xbb\x6c\xce\xdf\x73\x0e\x3a\x94\xdc\xfc\x4d\x66\xff\x2d\xe7\xe0\x90\x92\xe9\x5e\x49\x4d\xed\x15\x06\x0c\xe8\xa5\x3d\x39\x50\x06\x94\x5c\x7d\x2e\x41\x7e\xae\x40\x7e\x96\xe3\x78\x40\xc9\xf9\xab\xac\xd5\xaf\x54\xab\x03\x7d\x46\x97\x00\x30\x74\x28\x89\x3e\x94\x75\x63\x05\xd5\x07\x81\x6a\x38\xa4\x64\xf1\x5e\x52\xfd\x9e\xe4\xbc\x73\x28\xa1\x2f\x20\x3f\xd5\xe7\x05\x9e\x42\xe3\x3b\x2f\x1b\xf2\x2d\x4a\x9e\xef\x64\x24\x7d\x15\x66\x78\x27\xef\x29\xf4\x48\xf6\x4e\x8e\xde\x95\x1c\x30\x74\x43\x76\xdf\x9d\x94\x32\x01\xd7\xe4\xdd\xee\x61\x19\xb4\x6b\x53\xa2\x49\x42\xff\x25\x57\x1a\xe0\x42\x1c\x55\x61\x47\xd0\xa7\x47\xef\xf7\x3f\x7c\x2a\x65\xf7\x00\xf8\xf0\xe8\xe4\x78\xef\xa8\x4c\x45\x0f\xfc\xae\xe3\xbd\xa3\x77\x6f\xcb\xf9\x30\x14\x5f\x1d\xed\xef\x96\xb3\x11\xfa\xcd\x87\xe3\xfd\x23\xa0\x1b\x39\xfa\x96\xdd\x8a\x6d\x59\x82\xcb\x82\xb6\x2e\xc8\xcf\xcf\x1f\xdf\xef\x17\xa0\x7e\x8e\x17\xac\x04\x03\x94\x1e\xfe\xf4\xe9\xb0\x00\x73\xe8\x5f\xb0\x4f\xcb\x22\x54\x0f\x30\xbd\xde\x7f\x57\x00\x7a\xcd\xc2\x12\x9e\x3e\x4a\xf1\xeb\x02\xc4\x7e\x34\x2b\x41\xf4\xb0\xa6\xd7\xc2\x07\x2e\xd6\x85\xdf\x8a\x8b\x90\xd0\x29\x25\x8a\x76\x93\x24\xbe\xae\x90\x04\xda\xa5\x82\x0c\xc1\x6a\xd8\x80\x89\x47\x6f\x7e\xfa\x19\x98\xc5\x75\xf2\xa7\xc9\x1e\xa8\xf6\x8f\x7b\x45\x18\x10\x8e\x77\xfb\x07\x19\xc8\x6b\x04\x79\x5d\x00\xb1\x7a\x40\xff\x87\x4f\xef\xdf\x7d\xdc\x2b\x77\xc7\x08\x98\xf3\xf6\x10\xfc\xcc\x59\x06\x3e\x1a\x62\xa6\x55\xce\x74\x30\xd3\x2e\x67\x8e\x30\xb3\x5b\xca\xb4\x4c\x13\x73\x7b\x95\x5c\x0b\x73\xfb\x95\x5c\x1b\x73\x07\x95\xdc\x2e\xe6\x0e\x2b\xb9\x3d\xcc\x75\x2a\xb9\x7d\xcc\x1d\x55\x72\x45\x1b\xb6\xcf\x7e\xc8\x62\x9b\xa2\x5d\xed\x1f\x2c\x2d\x98\xfa\x97\x32\x45\x96\x68\xff\xf3\x4a\xae\xe0\x55\xa7\x9c\x0b\x4a\x6a\xf2\x6a\x17\x3b\xeb\x52\x2f\xcf\xa3\x6a\x13\xa9\x01\xce\x57\xbe\xbc\xce\x61\xb3\xb9\x54\x6d\x32\x05\x36\x69\x72\xb4\xff\xee\xe3\x6e\x01\x3c\x9b\x52\xd5\xe6\x54\x0e\x4e\x21\xc4\x90\x97\xc0\xd9\xbc\xaa\x36\xb1\x02\xf7\x60\xf2\xe5\xcd\x87\x63\x04\x96\x93\x2b\xa3\x32\xbb\xb2\xd1\x30\xbc\x3a\x7a\x73\xd2\xce\xc0\x86\x39\xd8\x28\x03\x1b\x4a\xb0\xed\x0c\xcc\xc9\xc0\xe4\x4c\xeb\x81\xa5\xab\xa2\x66\x59\x7b\x1c\x2d\x5b\x0f\xa8\x6e\x0f\x2d\x7e\xae\x5e\x33\xc5\xc7\x5d\x83\x40\xf5\x3f\xc8\x23\x28\x41\xed\xd5\x40\xc7\x56\x99\x8e\xf2\x6e\xd4\x5f\x0a\x44\xe0\xb6\x04\xb1\x2b\x21\x5b\x8d\x29\xee\xec\xa9\x20\xaa\x2f\x81\x91\x3f\x4d\x7e\x26\x2e\xf9\xd3\xc7\x9f\x89\xab\x97\x81\xb3\x4f\x6e\x29\x56\x0b\xb4\xea\xd5\xc5\xdc\xf2\x1a\xc4\x63\x98\x0f\x5a\xf4\x37\xb7\xf8\xed\x6f\x6c\xf2\x01\x36\xf9\xe0\xa1\x26\x8b\x3b\xa7\x7e\x6b\x8b\xa5\xf9\x79\xb8\xd1\xe5\xdd\xc5\xc5\x46\x93\x3f\x4d\xfa\xff\x78\x88\x5a\x51\xcf\xef\x40\x30\x98\xc2\x87\x07\xc7\x86\x7d\xbe\x95\x0d\xa4\xd5\x7d\x24\x5b\xaa\x0f\x77\xc8\x9f\xfe\x13\x7a\x62\xd2\x7d\xd4\x68\xc9\x6c\xeb\x6f\x64\xe5\xe0\x51\xac\xc4\x0f\x1f\xbf\x9d\x99\xca\xd4\x3f\x4c\x73\x4d\x52\x4b\xea\x66\x33\xc1\xef\x82\xe8\x11\x7d\xef\x96\x37\xfd\x15\x86\x4f\x6d\x73\xd3\xe3\xc6\xd1\x2e\x8e\xa3\xdd\xc7\x74\x5e\xee\xcb\xfc\xf1\x9c\x78\x4c\xd7\xfd\xee\xbc\x78\x85\xbc\x78\xf5\x20\x2f\xc4\x94\xcb\x6b\xfc\x8e\xbd\xa6\x65\xd7\xc1\x92\xed\x89\x23\x99\xe9\x03\xed\x7a\xb0\x76\xb9\xac\x53\xbd\x9e\x3b\xff\xfe\xf1\xf4\x35\x7a\x75\xb4\xab\x4e\xf8\xd2\x4f\x53\x59\xe3\x39\x4b\x70\xe4\x2b\xa6\x1b\x8d\x9f\xee\x8b\x66\x34\xdb\x37\xd7\xb0\xe5\x45\xee\x9e\xb3\xd4\xb1\x62\x62\x11\xb1\xb1\xcd\xce\x0e\x1a\x27\x38\xad\x11\xb9\xdd\x62\xee\x44\xe5\xf6\x8a\xb9\x30\xd1\x17\xd9\xfd\x62\xf6\x99\xca\x1d\x14\x73\x7f\x51\xb9\xc3\x62\xee\x57\x95\xeb\x64\x64\xfd\xa7\x24\x6b\x94\xe5\x8c\xc8\xfd\x43\x7d\x24\x57\xca\x9e\x24\x22\xc0\x69\x51\xae\xca\xe8\x4d\x8e\xca\xc6\x2f\x06\x0f\x91\xa9\x96\x00\x9f\x4c\xa7\x2c\xf8\x3f\x8c\x50\xb1\x46\xd0\xb8\x2d\x66\x0d\x95\x17\x8c\xbf\x96\xa7\xfd\x74\x03\x9e\xb2\x50\x2f\x72\x37\xbc\xd8\xe8\x10\x86\xfe\x32\x65\xb3\xfc\x3a\x8b\x0c\x53\x76\xe6\xa7\x51\xe6\xd7\xd4\x8a\xbb\x80\xb2\x9a\x76\xe7\x9c\x25\x02\x45\x21\xca\x4e\xd2\x99\xca\x6a\x4f\xe2\xfd\x68\x26\x8e\x03\x24\x06\xed\x9b\xeb\xf4\x02\x0e\xa5\xec\xa8\x69\x13\x85\xff\xc3\x08\x5c\x87\x76\x4d\x2c\x9d\x87\x54\x9d\x1c\x51\xff\xcb\xc3\x2a\x17\xd7\x6b\x9a\xe5\xb4\x68\x58\xd4\x15\x9a\x4b\x16\xe9\x59\x30\x1a\xb5\x63\xba\x73\x99\xb0\x39\x25\x84\x12\xb1\xb3\xde\x8b\x62\x2a\x0e\x27\xdf\xb2\x94\xca\x50\x2e\x90\x14\x76\xe8\xdc\x4f\x52\x7c\x5c\x04\x51\xb0\x08\x7e\xf5\xcf\x43\xf1\x5a\x84\x3e\x21\xdb\xb2\xb2\x20\x8a\x98\x88\xdb\xb6\x4d\xa8\x8c\x80\x52\x7e\x29\x02\x15\x3d\x64\xce\xc8\xff\xf6\x28\x36\x7c\x6e\x66\x43\x41\x48\xab\xce\x5b\x7e\x58\xad\xe8\x67\xb7\x5a\x0d\xf2\x24\xc0\x76\xd6\x0f\x7d\xdc\x15\xf4\x83\xdf\x46\x5d\xf2\xbf\x3f\xd8\x42\xb1\x10\xf7\xff\xcf\x8e\x8e\x57\x7c\x7d\x47\xe3\xcb\xc7\x75\xf4\x6f\xd6\xd9\xbf\x41\x15\x8e\x6b\xbc\xbc\xbb\x4b\x2a\xfa\xb1\xa8\x19\x77\xaa\xb6\xbb\xd0\x09\x62\x5b\xeb\x5a\x47\xfc\x31\xba\xa6\x18\xdd\xa5\x4a\x45\x49\x0b\xe9\xc6\xfd\x03\x1a\xf2\x41\x57\x5e\x2c\x17\x3f\x28\x5a\x1b\xe4\xb7\x3a\x43\x91\xa7\x2c\xff\x30\xb3\x57\x5e\x86\x6a\x88\x3d\xd0\x60\xb3\x6a\xa7\x58\x0b\x53\x27\xb5\x07\x8c\xb4\xbf\x12\xcf\x53\x3d\xbb\x43\xfe\x0f\xb2\x86\x4e\x21\xb1\x60\x7b\xac\xad\x0d\xe2\x05\xd5\x1c\xf8\x53\x1e\x27\xba\xf1\x08\xaf\x50\x4a\x6b\x83\x53\x08\x35\x11\x93\x78\x5e\x62\xac\x9b\x22\x14\x42\x5f\x98\x85\xe8\x01\xc1\x06\xf2\xf2\x58\x19\x63\xd2\x06\xe4\x77\x77\x72\x1d\xb0\xc0\x84\xa0\xed\x59\x6e\xb0\xad\xee\x11\xdb\x5c\x73\x90\xc5\xda\x7c\x8a\x27\x2f\x37\xe6\x35\xc5\xe7\x0a\x67\x53\x3f\x99\xed\xc5\xab\xfc\x7e\x36\xb9\x11\x25\x3f\xdf\xd3\x8c\xad\xb3\x88\x67\xc1\x3c\x60\x49\x9a\x1d\x3e\xcc\x37\xd7\x08\xfc\x13\x7e\xe6\xb1\x09\x3f\xbb\xbb\xdb\xb2\x28\xf9\x8b\xdc\xc7\x3d\xe1\x67\xd2\x50\x94\xaa\xdf\xde\xae\xc5\x02\xd9\x58\xab\x37\x21\x28\x5e\xa0\x6c\x79\x12\x12\x8a\x47\x03\xa8\x38\x12\x70\xb6\xa6\x74\x61\x5f\xef\xba\xf1\x58\x22\xea\x05\x2f\x3f\xef\xb4\x2d\xb7\x02\xf2\xb2\x0a\x62\xb9\xe6\x3a\xe2\x0b\xa1\xbe\x7c\x3e\xbd\x5c\x77\x7f\xa9\xe4\xfb\x56\xde\x05\x79\x48\x67\x19\x85\xd2\x1c\x6f\xdc\xbf\xbc\xa1\x6f\x02\x75\x67\x56\x80\x9b\x4c\x5b\x2d\x36\x09\xce\xc6\x49\xab\xa5\xf3\xbb\x3b\xf2\x17\x22\xc6\xdb\x24\x38\x33\x44\x2f\x4d\x82\x33\x71\x96\x2c\xc1\xd3\x3b\xc5\x3e\xa2\xc9\x23\x1b\x2a\x37\x83\xae\x5d\x19\x12\xdc\xd0\x19\x85\x1a\x1e\x8d\xb2\x49\xac\x9b\xb1\x9a\x88\xf5\xa3\x8c\x90\x55\x1f\x06\x89\xbf\xf4\x31\xf8\x84\xb7\x85\xae\x4a\x9e\xa1\xf6\x90\x5e\xb1\x24\x65\x5f\x0a\x70\x5b\xb8\xa4\x5b\x7b\x21\xa3\x14\x24\xc1\x45\x10\x61\xcc\x00\x09\x98\xe7\xc8\x63\xec\x2b\x1e\xef\xf9\x49\x12\xf8\x17\xec\x08\x69\x56\x90\xf5\x37\xd9\xfd\xfe\x69\x9c\x7c\x16\xf1\x4b\x14\x70\x29\xb3\x08\xf7\x2a\x0c\xa2\x6f\x65\x28\xcc\xa2\xea\x2c\x32\x4b\x78\x91\xbe\x3c\xa7\xd4\xe2\xcf\xc1\x8c\xc5\x95\xc6\x62\x9e\x0c\x23\x90\xf8\xd3\x6f\x8c\xb3\x99\x8c\x48\x20\xe0\xca\xb9\x8f\xde\xe9\x2b\xf6\xb3\xd7\x2f\x9c\xc6\xc8\x90\x1e\x91\x51\x03\x96\x71\x9a\xdd\x2c\x79\x99\x1d\xe4\x17\x65\x8b\x47\xe6\xf1\x26\xfb\x06\xc9\x28\x84\xc6\xc1\x42\x1a\x42\x6a\x3e\x57\x61\x49\x96\x71\x2a\xee\x2d\x15\xa7\x35\x6a\x98\xf3\x6d\xea\x0d\x51\xf5\x32\x12\xbd\x02\xed\x72\xbb\x6e\x23\xb6\xca\x86\xd8\x3c\x8c\xa3\x6c\x36\xcb\x5b\xcd\xef\xee\xf2\x86\xb3\xa2\xf5\x6a\xc4\x5c\xdd\xfe\x5f\xa4\x56\xdc\x73\x9f\x9d\x99\x43\x2e\x8e\x4b\x9b\xcf\x33\x84\xc1\x8c\x45\x5c\xea\x12\xa5\x55\xde\xb2\xdb\xd4\x60\x93\x07\x61\x26\xfc\xec\xcc\x53\x61\xe8\x55\x3b\x5e\xd4\x39\x33\x56\x6d\xfe\x16\x2c\x45\xe4\xf4\xd2\x29\x51\x6c\xc9\x49\xfc\x8d\xc9\x29\x34\x09\x22\xce\x2e\xf0\x3a\xe0\x04\x23\x0a\x1b\x99\x9e\xf4\x92\x0e\x5e\x15\x9e\x5d\x21\x48\x72\xda\x72\x70\x69\xb8\x25\x6c\x87\xc7\x9f\x96\xcb\xe2\x89\xf5\xe0\x51\x1c\x68\xb5\x1e\x04\xe9\x5c\xfa\xe9\xc7\xeb\xe8\x30\x89\x97\x2c\xe1\xb7\x7a\x60\xa8\xfd\xba\x0f\xf3\x2e\xc0\x8d\xf5\x6c\x92\x9e\xb5\x5a\xa8\x96\x21\x29\xe3\x3b\x21\x5b\xe4\x29\x85\x7c\x07\xba\x2a\x0e\xc2\x2b\xdb\x66\x8c\xa1\x94\xb7\x65\xde\xe7\x91\xfc\xd7\xb7\x4e\x32\x71\x5d\xcb\xd4\xeb\x86\x56\x35\xd0\xa5\xa2\xe2\x7d\x63\xb7\x65\x82\xb2\xbe\xda\x58\xc9\x24\x38\xbb\xcf\x88\x26\xe9\xed\xe2\x3c\x0e\xc9\x96\xea\xc1\x7a\x75\xd9\x61\x0d\x29\x1c\x5a\x9c\x68\x85\xbe\x17\x82\xf3\x17\xc4\x20\x08\x69\xa2\x58\xdd\xeb\xae\x89\xfa\x4a\x74\xab\xe1\x11\x3d\x6e\x78\x60\x3f\xfb\x8f\xe8\xe7\xe8\x6c\xcc\x26\xfe\xd9\xdd\x9d\x0e\x7f\x3c\xf2\x17\x62\xdc\x67\xeb\xa2\x85\x11\x41\x49\x5b\xda\xe6\xce\xf4\xd2\x10\x07\x72\x83\xb9\x2e\xc2\xed\xe6\x8e\x42\x13\x67\x78\xe2\x17\x4f\xa7\xf9\x30\x23\xd2\xb8\x9f\x5c\x30\x0e\xdd\xa3\x82\x80\xf9\xb3\x2b\x3f\x9a\x32\xdd\xc2\x75\x59\x40\xec\x6d\x44\xfc\x3e\x48\xd3\x20\xba\x28\x63\x52\x7e\xd4\x46\x9d\x24\xd4\x7e\x5d\xd5\x57\xc6\x3f\x5b\x33\xfe\xb3\x93\x48\x4c\x48\x43\xe6\xbb\x89\xb1\x5f\x1b\xf6\x12\x4c\x44\x98\x40\x98\xb5\x7d\x28\x4e\x96\xad\x1b\x01\xf2\x6d\x75\x00\x48\xa4\x85\x29\xc8\xfa\xb2\x13\x09\x7c\x36\xde\x38\x64\x0a\x07\x10\x15\xf6\xfb\x0d\x42\x2f\x38\x52\x95\xf9\xe6\x3e\x60\xec\xdb\xda\x10\xa7\xcf\xf2\x58\x32\x77\x77\xcf\xc8\xb3\xec\x69\x2d\xaa\x37\x59\x7d\xeb\xcc\xe1\xf4\x52\xdd\xbd\x3d\xf1\xdb\xbf\x7e\x3d\x7b\x1e\xac\x27\xec\x8d\x18\xbc\x8f\x40\x65\xb6\x47\x67\xcf\x37\x58\x3e\x94\x97\x52\xfc\x46\x1c\xff\x59\x83\x32\x23\x28\xe2\x8d\x4b\x05\x43\x91\xd5\xae\x6a\xf4\xb8\x58\x79\x3e\x3c\x28\xcb\x06\x68\x99\x05\xd9\x2c\x54\x62\x2d\x74\x46\x11\x33\x12\x58\x2c\x75\x3f\x2e\xe2\x93\x17\xa6\x57\x70\x49\xa1\xaf\xe1\x51\xd0\x65\x1c\x92\x91\x35\x82\xa4\xe5\xac\x53\xa3\xe0\xef\x1b\xe5\x32\x53\x8c\x1c\xd8\xba\x4e\xb2\xca\xcd\xaa\x30\x7f\xab\x99\x5f\x9b\x34\x79\x51\x7d\x97\x1c\x2c\xa8\x48\x1d\xff\x43\xa9\x32\xdb\xa3\xaf\x67\xdb\xcf\x2f\xd6\x89\x56\xa1\x89\x0d\x52\x6f\xe6\x62\xa1\x62\x59\x34\xfa\x29\x6d\xab\xd5\x22\x37\xa4\xec\xdc\x49\x3f\x2c\xf3\x1d\x2d\x6a\x19\x3b\xaa\x42\xbd\x81\x5e\xf3\x06\x84\xd7\x6f\xcf\x05\xc1\x86\xbb\x09\xf8\x74\xb6\xfd\xfc\xc2\xd8\xd0\xaa\xfa\x50\x16\x72\x0d\xfe\xb2\x6a\x14\x48\xc6\x33\xf2\x4c\x44\xdb\x79\x86\xd1\x76\xea\x6c\x17\x88\x34\xd5\xd3\x75\xa3\x50\x38\x0e\x08\x4e\xf4\x11\xbb\xd8\xbf\x59\xea\x64\x72\x7a\x7a\x7a\x4a\xb6\x31\x34\x36\x25\x17\xaa\xdc\x5a\x4f\x0f\x4f\x97\x86\x7e\xca\xdf\x44\x33\x76\xe3\x29\x60\xba\x95\x60\x80\x7a\xbd\x50\xa8\xd9\xad\x90\x0b\x23\x05\xb5\x17\x06\x9c\x25\x18\x2a\x02\x34\xfc\x76\x43\xf7\xe0\xe9\x49\x55\x53\xa1\xfa\xb6\xa5\x82\xbc\xc9\x66\x16\xdf\xa9\x02\x00\x24\xd8\x77\x77\x47\x4e\x4f\x0b\x56\x18\x74\x0a\xf2\xb3\xfa\x22\x9b\xca\x4f\x2f\x3d\x8f\x1b\x6b\xd5\x88\x08\x2e\xb4\xad\xca\xd1\x2a\xcb\x8b\x47\x4c\xf3\x62\xdb\x05\xbb\x28\x4e\xbd\xeb\x4d\xd6\x61\x23\xab\xd6\x4b\x94\x8c\xe9\x56\x9f\x2e\x3c\x23\xcf\xdc\x67\xe4\x19\x25\xcf\x88\x4b\x9e\x11\x0a\x4d\x76\xe1\x87\xfa\x2e\xf9\x5f\x09\x3d\x77\x71\x1f\x39\x73\xc9\x9f\x08\x9d\xbb\xe4\x74\x4e\x68\xe4\x92\xd3\x88\xd0\xc4\xc5\xed\xbc\xdc\xc5\xdd\xe4\x57\x2e\x39\xbd\x22\xf4\xc6\xad\xd5\xb1\x7e\x78\x9f\x7d\xb7\xef\x61\xb8\x8c\x37\x7c\x61\xce\x06\x12\xa3\xd6\x00\x06\xcd\xea\x69\x35\xf4\x9e\x5c\x03\x2a\xdd\x2d\xd5\xd5\x6a\x41\xa5\xea\x1f\x28\xa9\xd8\xe4\x26\x8b\x50\x07\x59\x54\xf1\xe9\xa5\x70\x81\xb8\xc7\x26\x32\xe3\x6c\x9d\x35\x6a\x38\x2b\xc9\x5b\x2d\x9d\x7b\x3c\x8f\x3e\x62\x18\x94\xaf\xef\xf2\xa6\x95\x14\x11\xb9\xeb\x22\x8c\xcf\xfd\xb0\x81\x6e\xd0\xa6\x49\xe4\x87\x62\xfe\xec\x6a\xc7\x4b\x3f\xd2\x96\x02\x4f\xaa\x2d\x56\x29\xd7\xce\x99\x26\x8a\x13\xf0\xfa\xeb\x43\x5e\x35\xb0\x3e\xee\xc5\x47\xc7\xbb\x3b\x56\x1c\x8d\x13\xf3\x4c\x6a\x91\xad\x0c\xc5\x26\xf3\x81\x9e\x82\x36\x8f\x13\x31\x99\x1f\x57\xa7\xe8\x45\xe4\x56\x75\xe4\x51\xa8\xae\x91\x61\x12\xa6\xbe\x8a\x04\xca\x3f\x0b\xd2\x7f\xb9\xc9\x46\xac\x9b\xb2\x67\xfe\x6f\xb5\x23\x9e\x9f\xa6\x32\x34\x50\x26\x4a\xf2\x38\xf7\xf3\xd3\x74\xfb\xf9\xc5\x62\xcc\xd7\xf1\x37\x29\x12\x82\x2e\x82\x60\x77\x62\xa8\xe8\x4f\xb8\xb6\x90\x17\x37\x1e\xd9\x02\xca\x5a\xad\xb6\x95\x19\xce\x4e\x00\x85\x3f\xce\xf5\x46\xad\x9d\x75\x4a\x1c\x31\x2d\x9e\x43\x87\x6c\x13\xaa\xcd\xe3\x55\x34\x2b\xca\xfc\x7d\x81\x2f\x05\xe7\xd9\xfb\xde\x9c\x5f\x9a\x49\x79\xdf\xf1\x80\x80\xab\x96\x85\xf7\x4e\x8e\xde\xb9\x72\x6d\x78\xef\xe3\x87\x93\xa3\x8f\xd9\xe3\xee\xbb\x13\x11\x49\x86\xbe\xdf\x3f\xd9\x95\x61\x64\xd6\x54\xa1\x26\xa4\xde\xf7\xfd\xe3\xbd\xdd\xc3\x7d\xd7\x1e\xd2\xfd\xe3\x3d\xf8\x73\x60\xb9\x96\x65\xd3\x03\xdb\xb5\xac\x2e\x3d\xe8\xba\x96\xd5\xa3\x07\x3d\xd7\xb2\xfa\xf4\xa0\xef\x5a\xd6\x80\x1e\x0c\x5c\xcb\x1a\xd2\x83\xa1\x6b\x59\x0e\x3d\x70\x5c\xcb\x1a\xd1\x83\x91\x6b\xd9\x26\x3d\xb0\x4c\xd7\xb2\x2d\x7a\x60\x59\xae\x65\xdb\xf4\xc0\xb2\x5d\xcb\xee\xd2\x8f\x1f\xf6\xdd\xde\x88\x9e\x7c\xf9\xe8\xf6\x4d\x7a\xf2\xf3\xd1\xfe\xbe\xdb\xb7\xe8\xc1\xc7\x4f\x47\x6e\xdf\xa6\x07\x6f\x3e\xef\xbb\xfd\x2e\x3d\x7e\xf3\x37\xb7\xdf\xa3\xc7\xfb\x9f\xf7\x3f\xb8\xfd\x3e\xdd\x7f\xf3\xd3\xcf\x27\x6e\x7f\x40\x3f\xbc\xf9\xb0\xef\xf6\x87\xf4\xef\xfb\x47\x1f\xdd\x9e\x43\x5f\xed\xee\xbd\x3d\x3e\xdc\xdd\xdb\x77\x1d\xfa\xea\xed\xf1\x21\xfc\x39\x76\x1d\x7a\xb2\xfb\xca\x1d\xd1\xbf\xba\x8e\x45\xbf\xb8\xce\x90\xee\xbb\x83\x11\x3d\x72\x1d\x9b\x9e\xb8\x4e\x8f\xfe\x9b\xeb\x8c\xe8\x27\xd7\xe9\xd3\x37\xee\xb0\x4b\x3f\xba\xc3\x11\x3d\x74\x1d\x93\xee\xed\x1e\x1e\x7f\x7d\xf7\x71\xef\xad\x6b\x8b\x87\x62\x1a\xfe\xee\xba\x83\x3e\x3d\x76\x9d\x2e\x7d\xed\x0e\x1c\x7a\xe0\x0e\x4d\xfa\x93\x3b\xb4\xe8\xcf\xee\xd0\xa6\xff\xea\x0e\x7b\xf4\xad\x3b\xec\xd3\x77\xee\x70\x40\xf1\xbc\x87\x6b\x75\x21\x01\x7f\x8e\xf6\x4f\x3e\x1d\x7d\x90\x29\xf8\xf3\x77\x77\x64\xd2\xbf\xb9\x8e\x43\xf7\xdc\xc1\x90\x7e\x76\x9d\x01\x7d\xe5\x0e\x06\xf4\x83\x3b\x74\xe8\x7b\x77\x38\xa4\xa2\x75\x5d\x9b\x1e\x1f\xc2\xef\xe1\xd1\x9b\x0f\x27\x5f\x8f\xf7\x8e\xf6\xf7\x3f\xb8\x3d\x78\x3e\x39\xde\x83\xc4\xf1\xde\xd1\xc7\x77\xef\x04\xed\x56\xaf\x4f\xf1\x9c\x01\xa6\xf0\x68\x81\x6b\x8d\xe8\xab\x23\xfc\x23\xce\x14\xb8\xbd\x3e\xa4\xe0\xcf\xcf\x1f\xdf\xef\xbb\xdd\x01\x3d\xdc\xfd\x69\xff\xeb\xa7\x43\xb7\xdb\xa5\x87\x3f\x89\xbf\xaf\xf7\xdf\xed\x9f\xec\xbb\xbd\x01\xa4\xe0\xcf\xfe\x87\xd7\x6e\xb7\x2f\x40\x5f\x7f\xfc\xf2\xc1\xed\xf6\xa8\xd8\xee\x2f\x53\xf8\x17\x0a\x3b\x14\x73\x7b\x26\xc5\x6d\xf9\x6e\x77\x44\xdf\xed\x1f\x9c\xb8\xdd\x21\x95\xfb\xeb\x5d\xab\xd7\xa3\x6f\x0f\x4d\x77\x34\xa0\x6f\x0f\x2d\x77\x34\xa4\x6f\x0f\x6d\x77\xe4\xd0\xb7\x87\x5d\x77\x34\xa2\x6f\x0f\x7b\xae\x65\x9a\xf4\xed\x61\xdf\xb5\x4c\x8b\xbe\x3d\x1c\xb8\x96\x69\xd3\xb7\x87\x43\xd7\x32\xbb\xf4\xed\xa1\xe3\x5a\x26\xe0\x18\xb9\x96\xd9\xa7\x6f\x0f\xbf\x1e\xbe\xfb\x74\xec\x5a\x26\x60\xfa\xba\xfb\xfa\xb5\x4a\xbe\x7f\xf3\x01\xf3\x01\xe7\xd7\xe3\x4f\xaf\x4e\x8e\x76\xf7\x4e\xb2\xe7\x93\xdd\x23\xd7\x32\x07\x08\xf8\xe9\xdd\xc9\x9b\xc3\x77\xff\xa6\x9e\x5f\xbf\xf9\xfc\xe6\xf5\xbe\x6b\x59\x16\x3e\xed\xef\xbd\x79\xbf\xfb\xce\xb5\x2c\x13\x2b\xdb\x3f\x7a\xf3\xf1\x35\x3e\x7d\xd8\xfd\xfc\xe6\xa7\xdd\x93\xfd\xaf\x20\x91\xae\x05\x5d\xa8\x72\x0e\x3e\x1e\x7d\xd9\x3d\x7a\xed\x5a\x83\x21\x15\x1b\xca\x5d\x0b\x44\xe7\xd3\xbb\x77\xaa\x23\x2d\xa7\x4b\xbf\xbc\xf9\xf0\xfa\xe3\x97\xaf\x1f\x3f\xef\x1f\x7d\x7e\xb3\xff\xc5\xb5\x1c\x9b\xbe\x42\xd6\x7d\xd8\x3f\x3e\x86\x7e\xb1\xad\x41\x31\x07\xd9\x6b\x5b\xc3\x35\x83\x5b\x4e\xca\xb3\xa0\xaf\x1b\x8f\x49\xab\xc0\xaf\x9b\x0f\x4b\x6f\xf8\xfa\x8a\xe7\xa5\x8b\x3b\x6e\xdd\xc6\x2b\xa4\x9e\xb0\x27\xf7\x9e\x96\x77\x9d\x3e\x84\xf0\x11\xdb\x1b\x15\xca\x93\xf8\x24\xde\x48\xe0\xc3\x5b\x9c\x73\x54\xaf\x62\xce\xe3\xc5\x6f\xc5\x26\x3e\xec\xcb\xad\x13\xd3\x6f\xcd\xe8\x9e\xb2\xe3\xb1\x76\x21\x0b\x2d\x5f\xf8\x07\x42\x93\xb0\x39\x4b\x58\x34\x65\xef\xfd\xc8\x2f\xcd\x1f\xc1\x36\xd7\xdf\x17\x22\xbe\x55\xef\x95\xa3\xe4\xb9\xb8\xd4\x6a\x99\xc4\xf3\x20\x64\xe9\x73\x74\x4c\x84\x25\x6f\xa8\x4a\x15\xcf\x5f\xa4\xe3\x8f\xe7\xff\xce\xa6\xf8\xf1\x38\xd5\xb9\x51\xff\xbc\xa7\xbc\x11\x5c\xef\x63\x79\x49\x9d\x51\x3e\x61\x78\xb5\x6b\xed\x3b\x6b\x53\x1b\x38\xbb\x88\x93\x80\x29\xd3\xbb\x01\x22\x63\xb0\x47\x54\x8a\x3c\x54\x64\x77\xb9\x64\x7e\x82\x7e\x14\xc9\xd3\x0f\x16\xdb\x8b\x97\xb7\xe2\x53\x13\xc9\x92\x0f\x16\x3a\x06\x27\x23\xf5\x88\xf8\xfb\x30\x38\xca\x17\x86\xbc\xce\x92\x0f\x16\xca\xc3\x64\xab\xd4\x83\x45\xde\x07\xe9\x94\x85\xa1\x1f\xb1\x78\x95\x7a\xa4\xf4\xb8\xb1\xf0\xed\xeb\x6c\x29\x37\xf5\x26\xdf\x83\x99\xfb\x68\x66\x53\xce\x6e\xb8\x5b\xe0\xb8\xa6\xcf\xe3\x88\xa7\x54\x9b\xc6\x61\x9c\xa4\x54\x13\xd7\xad\x19\xe4\x9e\x3e\x02\x71\xd6\x07\x12\x2f\x3c\x6b\x2d\x4d\x74\xcb\xa3\x30\x28\x6e\x49\x04\x19\xf3\x1e\x55\x58\x49\x9b\x2c\x9c\x09\xdf\xa3\x0a\x67\x7d\x2b\x4b\xe7\x7d\xfd\xb8\xe2\x28\x4c\xaa\xac\x90\xac\x47\x15\x2c\xf5\xb3\x2c\x0f\x79\x1d\x72\x7f\xd6\xd8\xeb\x75\x1d\xe0\x7d\x07\xdf\xb5\x7d\x91\xb4\x17\xf1\x8c\x11\x77\xf2\x58\x3e\x61\x24\xb7\x09\xfe\xca\x50\xf6\x79\x10\x51\x9a\x07\xf6\xa4\x85\x80\xa1\x67\x94\x88\xad\x51\x9a\x1f\x69\xbb\x21\xff\x29\xd1\x66\x8c\x33\x19\x20\xc5\x9f\x7e\xfb\xe5\xcb\x25\x5b\x25\x41\xca\x83\x69\xe7\x34\x3a\x8d\x9e\x01\xfa\x67\xae\xb6\xbb\xe2\xb1\x80\xd4\xce\xfd\x14\x3d\x7f\x2d\xf2\xaf\x82\x0b\x9f\xc7\x49\x27\x94\x17\xe0\xb8\xa7\x91\x86\xff\x9e\xb1\xa8\xbd\x4a\x9f\x69\xde\x4b\xed\x19\x90\xf6\x8c\x6a\xb8\xf6\x01\xcf\x19\x35\xcf\x00\x3d\xbc\x74\xb5\xd7\x41\xea\x9f\x87\x4c\xf3\xa3\x5b\x49\x56\xc2\x42\x5c\xe8\x58\xac\xa2\x0b\x98\xb7\x9f\x46\xcf\x54\xe3\x80\x9c\x34\x5d\x2d\x98\xb6\xc7\x93\x70\x7b\x37\xe4\xda\x82\xf9\x51\x2a\x4a\x02\xa4\x6a\x7b\x0e\x09\x39\x5a\x03\x64\x4e\x4c\x06\x8a\x59\x0d\xb0\xc0\x3c\xe8\xa8\x2c\xd0\x4f\x3b\x48\xdb\x30\xd5\xc8\x73\x9e\xd0\x79\x5b\x16\x25\xe7\x71\x1c\x12\x4a\xde\xcc\xb5\x94\x71\xaa\xad\xa2\x59\xcc\x52\x8d\x5f\x32\x4d\x44\xdd\xd5\x3e\x1e\x43\xed\xed\xec\x38\x4d\xfb\xe5\xeb\xfd\x77\x5a\xc2\x16\xfe\x92\x6a\x69\xac\xf1\x4b\x9f\x6b\x25\x9a\x34\x98\xb7\xb1\x99\x16\xa4\xe5\xfc\x8e\xa2\x5e\xd2\xfc\x63\x94\x1e\x33\xae\x5d\x5f\x32\x7e\xc9\x12\x24\xd3\x0f\xb9\xfa\xba\x91\x6a\x7e\xaa\xf9\x1a\xe0\xc6\xac\x38\x11\x19\x33\x90\xa5\x68\xca\x15\x6c\x46\x48\xca\xa2\x59\xda\xbe\xbe\xf4\xf9\x13\x68\xc9\xae\x1c\x98\x64\x29\x19\xb5\x92\x96\x22\xaf\x9e\x51\xb2\x27\x62\x5f\xa5\xda\x25\x4e\x5e\x73\x62\x83\x54\x13\xf1\xe6\x67\x28\xe1\x9a\x5c\xab\xe9\x88\x7f\xda\x31\x8b\x66\x30\x3a\xf6\x8f\xf7\xb4\x65\xc2\xe6\xc1\x4d\x07\x80\xb0\x96\x8e\x02\xda\x9d\xcd\x34\xcb\x76\x34\x1e\x23\xea\x55\x84\x93\x54\x36\xd3\xb2\xa0\xfd\xd0\xfa\x20\xd2\x6e\x70\x8f\x04\x20\x28\x90\xd7\xe9\x68\x5f\xfc\x80\x63\x5c\x49\x28\xae\x6e\xd8\xd0\x30\xd6\xaa\xe6\x47\x33\x2d\x65\x4c\x03\xde\xe0\x7b\x59\x54\x53\xa3\x2b\xff\x97\xfa\xb7\x69\x47\xd3\xf4\x93\xcb\x20\xd5\xae\xe3\xe8\x19\xd7\xae\xe3\xe4\x9b\x76\xcd\xc2\x10\x86\xe8\x32\xf4\xf9\x3c\x4e\x16\x29\x74\x5b\xc2\x10\x5b\x1d\x8b\xc2\xbf\x64\x89\x00\xc6\xef\x8b\xa0\xa6\xe4\x77\x2b\xa4\x34\x8d\x17\x82\x89\x2a\x70\x5e\xda\x31\xb0\x33\x57\xb3\xe0\x3c\x64\xed\x73\x16\x86\xed\x14\x74\xe7\xc3\x1d\x2a\xf5\x2d\xb8\x67\x6d\x75\x5b\xa8\x2b\x9c\x29\x40\x17\x3f\x07\x64\x84\x92\x15\xee\x04\xfb\x74\xf4\x4e\x8b\xe7\x48\xbc\xda\x46\xa7\x01\x80\x86\xb5\x75\x34\x6d\x7f\xb1\xe4\xb7\x6a\x4d\x14\x68\x8d\x62\x4d\x92\x85\x80\x28\x74\xf2\x86\xd0\x76\x54\xb8\xfb\x13\x89\x7e\x34\xb9\xf9\x48\x78\xf6\x66\xae\xf1\x64\xc5\x68\x99\xa0\x54\xc4\x97\x63\x5a\x7e\xa3\x97\x76\x1d\x84\xa1\x26\x2e\x87\xd0\x7c\xed\x0b\x3b\x2f\x5d\x3e\xda\xd1\x2e\x39\x5f\xa6\xee\xf3\xe7\xd7\xd7\xd7\x9d\xeb\x6e\x27\x4e\x2e\x9e\x9f\x1c\x3d\x2f\x12\x99\x3e\x07\x39\x7d\x2d\xee\xb5\x81\x16\x96\x5e\x6a\x09\xfb\x8f\x55\x90\xb0\x14\xba\x6f\x11\xa4\x29\xf6\x57\x12\x2f\x84\x64\xc2\x14\x49\xfb\x72\xc9\xc4\x4a\x99\x26\xee\x66\x82\x31\x90\x32\x8e\xe2\x8b\xad\x40\xd6\x0b\x52\x7d\xce\xd9\x62\x89\xef\xfc\xf4\x5b\x86\x04\xd9\x5a\xa8\x21\x98\x6b\x11\x9b\xb2\x34\xf5\x93\xdb\x0e\x34\x29\x13\xd3\x54\x5b\xf8\xb7\xe2\x56\xaa\x4b\xb9\x6e\x54\x2c\x08\xe4\xb2\x94\x03\x82\x80\x6b\xb3\x60\x86\xa0\x62\x43\x15\xf0\x08\x49\xf7\x45\x9d\x42\xfa\x70\x98\x4a\x8d\xc8\x6e\x38\x8b\x52\x6c\xf7\x75\xc0\x2f\x91\x3c\x52\xe2\x07\x29\x56\x76\xe9\x5f\xb1\xe2\x33\x8f\x35\x79\x3f\x50\x99\x89\x9d\x67\x67\x94\xe4\x9d\xd6\x46\xff\xe9\x61\xb9\x28\xb8\x62\x24\xb9\x38\xd7\xad\x01\xd5\xc4\x7f\x06\x18\x63\x44\x42\xc9\x49\x59\x20\x30\x5b\x8c\x7d\x76\xc3\x45\x33\xa2\x58\x8b\x51\xab\x8a\x97\xbe\xba\x7c\x28\x45\xc9\x2d\x10\x86\x0e\xdd\xd3\x08\x23\x34\xfb\xd8\x48\xf6\x8e\x8f\x35\xf1\xc5\x5c\x8e\xa7\x02\x5d\x88\x7a\xcd\x60\x12\xef\xa0\x1f\x0e\xe2\x44\x63\x37\xfe\x62\x19\x0a\x6b\xbf\x4a\x42\x5d\x89\xf0\x45\x1c\x77\x2e\xc2\xe7\x7e\xc4\x66\x27\x6f\x0d\x78\x1b\x06\x11\xf3\x93\xf6\x45\xe2\xcf\x02\x16\x71\x9d\xc7\x4b\xed\x1c\x27\x8f\x54\x3b\x0f\x41\xf2\x12\x36\x33\x2a\x6d\x4c\x83\x5f\xff\xc8\x26\x6a\x80\xbf\xa3\x69\x32\xa6\x75\x0a\x42\x01\x6e\x48\x95\xd5\xea\x82\xae\x3f\x92\x14\x55\x47\x23\x6b\x2d\xf3\xcf\xf0\x1f\x24\xa7\x2c\xe2\x2c\x51\x04\x0a\x5f\x40\x18\xd0\xdf\xee\x7b\x48\x3d\x26\xc9\x13\x5e\x44\x7a\x19\xaf\x42\xb0\x42\xd1\x4c\x7b\x75\xac\xe9\xcf\x4e\x4f\x6f\x4c\xe7\x19\xd5\xfc\x6f\xbe\xf6\xcb\xcf\x46\x47\xd3\x3e\x82\xbc\x5e\x07\x29\xab\x14\x05\x13\x5b\x2c\x0e\x45\x87\xf3\x67\xc8\xdd\xcc\x3a\xb6\x17\xfe\xb2\x1d\x5f\xb1\x24\x09\x66\x2c\x7d\x12\x87\x85\xbf\x8b\x6c\x25\xf4\x19\x1a\x3e\xd0\x66\x4b\x36\x0d\xe6\x01\x9b\xa1\xd7\x11\x69\xb1\x98\x57\x6b\x6f\x38\xba\x42\x5a\x8a\x1f\x46\x34\x3f\x49\xfc\x5b\x2a\x8d\x21\xf3\xa7\x97\xda\x52\x7e\xd5\x01\x30\x68\x48\x6e\xc0\x41\x41\x4e\xe3\x19\x43\x7b\x0c\xaf\xe4\x56\x93\x02\x7e\xe1\x80\xd5\x2a\xd0\x02\x9e\xb2\x70\xde\xd1\xde\x44\x02\xa2\x5c\x7b\x63\xbd\x09\x9b\xb2\xe0\xaa\xec\x41\x54\xeb\x85\x07\xa9\xbe\x8a\x80\x8d\xc2\xf3\x9d\x98\xc4\xfd\x4e\xb6\xf1\x93\xde\xca\xb6\x46\x36\xa1\x84\x66\x4f\x26\xa1\xa4\x9d\x3d\x59\x84\x92\x4e\xf6\xd4\x25\x54\x83\xd2\xf8\xd8\x77\x1c\x72\x7f\x0f\xea\x11\x4f\xbe\xb4\xe3\xa8\xcd\x6e\x82\x47\xf8\x6c\xe5\x99\xd1\x96\x99\x89\xdc\x17\xe9\x40\xa2\x66\x41\x3b\x83\x98\xb1\x75\xe2\x10\x0c\xf4\x8f\xb0\xa3\x53\x71\xbf\xb9\x06\x55\x0a\x5d\x28\x36\xbf\xb6\xcf\xc3\x20\xfa\xf6\x24\xb9\x29\x08\x7d\x9d\x02\x44\x27\x6a\x44\xfc\xda\xf9\xad\x72\x81\x6a\xb5\xb6\xa7\xb7\xd3\xf0\x69\x0a\x6a\x62\xb1\x2e\xed\x9b\xe6\x59\x26\xb8\x68\x14\x54\x5d\x58\x79\x02\xc6\x2f\x88\xb4\x45\x10\x86\x41\xca\xa6\x71\x34\x4b\xb1\x67\x77\x35\x7e\x1d\x6b\x4c\xdc\x59\xa4\x64\x08\x48\x9d\x07\x49\xca\x41\xb5\xe0\x55\x3d\xe8\xd7\xc6\xd7\x5a\x18\x47\x17\xc5\x96\xc8\xb1\x78\xce\xb4\x38\xa2\x9a\x40\x5c\x82\x0d\x78\x11\x66\x3e\x2f\x36\xf8\xc7\xec\xa0\xaf\xdb\xfd\x3e\xd5\x4c\xf1\xff\x4e\xbf\x6a\x0c\x85\x91\x93\x3a\x51\x5e\xe1\x28\xc9\x15\x95\xc3\xfb\xf6\xd2\x0f\x19\xe7\xec\xf7\x50\x13\xe4\xa3\xc4\x21\x17\x46\x94\x9b\xa6\xbc\x5c\x59\x15\xb2\x1b\x35\xca\xd4\x8f\x80\x1b\x55\xad\x22\x46\x37\x18\xe8\x5c\xc3\x68\x30\x7d\x6b\xd4\x3e\xc0\x59\xd0\x0d\x38\xad\x9c\xa1\x98\xb1\xc7\xaa\x22\x5f\x8b\x56\x0b\x96\x04\x53\x9c\xd0\xdd\x68\x41\x24\xa7\x1a\x82\x77\x45\x82\x3f\x43\x1b\xd7\x90\x1c\x2e\xe2\x94\xe3\xac\x7a\x9a\xa6\xb2\xac\xd8\x25\xab\x69\x42\x75\x46\xd3\x70\x35\x63\xa9\xf6\x4f\x47\x3f\xbd\xa2\xda\x3f\x1d\x1d\xfd\xf4\xd3\xab\x57\x54\x03\x6f\xa6\xd3\xe9\x18\x98\xf2\x65\xd2\xc7\x99\xd1\xad\xc4\x13\xf9\x0b\x9c\xad\xc2\x14\x34\x81\x99\x41\x1a\x6b\x4b\x3f\xe1\xaa\x63\x53\x1e\x4f\xbf\x69\x7f\xb3\x2c\x40\xd1\xe1\x37\x5c\x9b\x07\xa1\x20\xf9\xdf\xe2\x15\xd2\xbb\x4a\x99\x26\x56\x18\x80\x3b\x82\xf4\x5b\x81\xb2\xd8\x3d\x42\x01\xe6\x42\x0a\x83\xf6\x5c\xdc\x81\x7a\xc1\x66\x59\x53\x52\xc0\x37\x5f\x85\x62\xb6\xf2\x2d\x58\x2e\xc1\x83\xf1\xb5\x74\xe1\x87\x21\xf0\xf3\x9c\xa1\xd4\x05\xd1\x2c\x98\xb2\x34\xd7\x32\x99\x82\x6d\xec\x6f\x29\x92\xcb\x5b\xd0\x7d\x29\xae\x9e\x3c\x2c\x89\xf9\x5a\x5a\x41\xf3\xed\xae\x78\xbc\xf0\x79\x30\xf5\xc3\x10\xb8\xb8\xbc\xd5\x16\x31\xf0\x20\x55\xc7\xd5\xd4\x84\x72\xaa\x4e\xbe\x62\xe5\xab\x94\xb5\x25\x2f\xda\x42\x43\xb6\xa1\xf0\x93\xa8\xa8\x6b\x3f\x1e\x23\xff\x8b\x8c\x96\xea\x17\x29\x3b\x67\x97\xfe\x55\x10\xa3\xd3\x81\x2b\xf5\xed\x8c\xca\x36\x6e\x39\x7d\x3a\x0d\x75\x1b\x80\xca\x9f\xf9\x62\x1a\x9c\x73\x41\x6c\x69\x05\xfc\x41\x74\x21\xf8\xcf\x93\xb0\xbd\x0c\x57\x69\x7b\x11\x44\xab\xb4\xfd\x2b\x4b\xe2\xf6\xaf\x71\xbc\x78\x8a\xdb\x63\xd6\xdd\x9e\x3d\xc0\x7b\x18\xae\xd2\xe7\x78\xd8\xed\xf9\xdf\x59\x12\x6b\x53\xb5\x74\x00\x15\x74\x4e\xa3\x37\x73\x6d\xee\x87\xa9\x02\xc7\x00\xcc\x9b\x0b\x49\x48\x7c\x8d\x6e\x50\xaa\xfd\xf2\xb5\x58\x1b\x16\x99\x81\xe3\xc9\x2f\x4b\x6d\x9c\x3e\x92\xad\x4d\xce\x1c\x2e\x87\xed\x01\xdf\x02\x96\xc2\x04\x4b\xb4\x11\xdd\xb0\x5f\xf6\x80\xd9\x97\xb1\x98\x79\x61\x73\x3a\xa7\x78\x10\x78\x1b\xdb\xb3\xbd\xa7\xe8\x2c\x01\x0a\x0c\x39\x46\x51\x30\xa3\xf6\xaa\x8d\x67\x79\x7f\x03\xb9\x9f\x35\xc4\x50\x23\xf7\xf3\x03\xe4\x7e\x56\xe4\x7e\xae\x93\x9b\x63\xcc\xc9\x65\x7e\xca\xdb\x7e\x1a\xf8\x51\xdb\x5f\x9c\x07\x17\xab\x78\x95\xb6\xfd\xb4\xcd\xaf\xe3\xb6\xb8\x59\xf7\xb7\x2f\x89\xed\xfb\x29\xd7\x76\xa1\x0e\x6d\x57\xd5\x91\xbb\x69\xa9\x98\x8d\x82\x31\x17\x15\x6a\x78\x2e\x58\x50\x17\xf9\xe7\x21\x6b\xe3\x22\x53\x3b\xbb\x44\xe9\x47\xe8\x39\x49\x56\x0c\x38\x22\x30\x8a\x65\x2b\x25\x9b\x05\x5a\xa8\x60\x0d\x40\x06\x17\x51\x2c\x96\x86\x16\xa8\x9c\xbf\xb0\x67\x61\xa8\x25\x0c\x94\xa1\xd0\xc3\xc0\xa3\xf3\x5b\xce\xb4\x2b\x96\x88\xb9\xb7\x50\xf1\xe2\xae\x85\x0a\x66\x2d\x61\x17\x7e\x32\x0b\x59\x2a\xc1\xc4\x5a\x03\x57\x52\x2e\x9b\x7a\x1e\x87\x8f\x58\x27\xaa\x19\x74\x9e\x04\x29\xf7\x39\x53\x2d\x0d\xe6\xda\x75\x66\x1a\x40\x9d\x01\x5e\xed\x1a\xcf\x4f\x6b\xf3\x38\xe2\x95\x89\x36\xce\x55\xe2\x70\xf6\xfc\x5c\x2c\xf3\x66\x33\xed\x8e\xa6\x1d\x28\x8e\x28\xb5\x28\xa2\xea\x17\xb1\x75\x34\xed\xc3\x2a\x0c\x71\x71\x24\x5b\x11\xaf\x36\x0b\xc4\x4a\xa0\x7f\x9a\x83\x6a\x96\x3b\xb1\xde\x34\x41\xb2\x74\x61\x74\xa7\x6d\xf5\x35\x50\x96\x9a\x35\x28\xbb\x05\x06\x36\x1a\x2c\x75\xbd\xe1\x0d\x2d\x8e\xd5\x4c\xae\xd4\x90\xa7\x3b\xd8\x9b\xe8\x2f\x8a\x93\xf0\x77\x1b\x39\x2f\x65\x31\x00\x46\x17\x88\xc9\xcc\x21\x2e\xde\x3d\x66\xae\xdb\x68\x75\x8e\xc1\xe7\xf5\x35\x79\x3b\xba\x72\x02\xb3\x15\xbc\xcc\x1f\x40\x6d\x72\x9d\x04\xa0\x44\x1a\x0d\x72\x8d\x2c\x04\xfe\x51\xaf\x20\x0c\xe5\x0a\x35\xd6\xcb\x63\x51\xb5\x26\xae\xfe\x0e\x6f\x15\x09\xe9\x6d\xca\xd9\xa2\x99\x92\x19\x9b\x5a\xf6\x93\xe7\x64\xb9\xd6\x38\x2a\x74\x0f\x50\xf1\x2c\x2d\xae\x03\x0a\x47\xab\x34\x3d\xc2\x2e\x84\x91\xb8\x02\xaf\x0b\xfc\xac\xd7\xfb\x7b\xda\x61\x12\x5c\xc1\x34\xe6\x3d\x4c\x9b\x2d\x1b\x28\x64\xd1\x55\x90\xc4\x11\xcc\x5d\x9e\x48\xde\xf7\x93\xfd\xa3\xf7\x2e\xc1\x15\xf4\xb6\xdd\x1f\x88\x19\xc4\x7d\x79\x0a\xa5\x3c\x97\x42\x35\xda\x95\x9f\x04\xc0\x95\x94\x96\x17\x03\x80\x5f\x30\x88\xdb\x73\x7f\x11\x84\x8f\xb0\xb1\x05\xe1\x7e\x46\x5e\xb3\x7f\xf7\x3f\xaf\xb4\x63\x3f\x4a\xb5\xf7\x71\x14\xc3\x24\x79\x1f\x14\x62\x1c\xa9\xe7\x83\x84\x31\x48\x52\x8d\xbc\x67\x51\x88\x20\x27\x52\xba\x08\xd5\x16\x71\x14\xe3\x1a\xc9\xb3\xc2\x1a\x91\x5c\x85\x92\xba\x0a\x09\xcb\xbe\x0b\x64\x92\x09\xc3\x38\x27\xff\xc9\xeb\x63\x56\x9f\x92\x20\xe2\x15\x96\x61\x8d\x80\x0b\x06\xc2\x32\xb8\x61\x61\x5a\xa8\x63\x11\x0b\xcf\xe4\x69\x93\x3f\x3f\xe2\x81\x1f\x06\x7e\xca\x66\xd5\x85\xb0\x32\xda\x6c\xb2\x23\xab\x54\xd7\xc5\xff\xe8\xca\xab\xdd\x33\xa9\xa6\x7e\xaa\xf3\xcd\x1c\xfd\x0f\x2c\xbe\x5e\xc6\x0b\xd6\xfe\xc6\x6e\xd3\xb6\xd8\xd9\xf2\x1b\xd7\xd9\x00\xdd\x73\x96\x7d\x17\x90\xe6\xb3\xd4\xdb\x59\x34\x11\xf1\x25\x08\xdc\x9d\x4a\x31\x74\x91\xa0\xcc\xe7\x13\xed\x1b\xbb\x9d\xe2\x31\x3e\x9c\x89\x4a\xab\x0e\x9a\x2c\x2b\x22\x1c\xa5\xcf\x27\xb8\x9a\x95\x36\x21\x15\x35\x62\x7b\xbf\xb1\x5b\x75\x9d\xd0\x13\xbf\x44\x67\x6b\x72\xbb\xda\xc2\x5f\x82\xed\xc7\xa5\x40\xf9\xb1\x08\xf4\x48\x7e\x10\x0a\xa8\x7d\x5b\x78\x9b\x4d\x44\x35\x70\xec\x61\x86\xbd\x00\x3b\xa0\xf6\x83\x42\xc9\x54\x9b\xc7\xa0\x29\xd9\x4c\x3b\xbf\xd5\xc4\x47\x46\x68\x90\xc4\x24\xda\x26\x27\xc1\x33\x36\x0d\xc0\x72\xc7\x89\x76\xc9\x6e\x7c\xf5\x28\xa6\x80\x29\xc5\x19\xbc\xf8\x16\x98\x6d\x1e\x93\x68\x24\x79\x0d\xb3\x69\xb5\x22\x0e\x13\x55\x64\x7f\x9c\x69\x4b\x2a\x97\x04\xe4\xc7\xb2\x12\xd2\x03\xac\x6b\x0e\x4e\x03\xbb\x59\x86\x7e\x84\x1f\x1c\xd4\x1c\x79\x0e\x1e\x06\xa7\xf8\xb9\xaf\xb2\x8a\xfe\xee\xcb\x51\x34\x13\x6b\x7b\xc7\xb8\xac\xa7\x15\xbb\xe6\x34\xfa\x7e\x1a\x69\x1a\xfa\xd0\xed\xdd\x90\xb7\xdf\x12\x57\x23\x95\x1d\x55\x84\xe6\x30\x62\xd2\xf2\x0e\xa0\xf0\xea\xf2\xc2\xab\x9f\x21\xf3\xf4\xd9\xcf\xfb\xef\xde\x7d\x3c\x3d\x8d\x4e\x9f\x91\xd3\x08\x57\xfc\x16\xfe\x4d\x5b\xb4\xba\xad\x3a\xea\x61\xe9\xcf\xf6\x80\x58\x2c\x53\x3b\xef\xfd\x1b\x4d\xec\xf5\x86\x86\xfb\xda\xeb\xbd\x63\xaa\x7d\x3c\xde\xa3\xda\xe1\x7b\x64\xde\xee\xe1\x71\x2e\x29\xe7\x0c\x06\x2c\x38\x0f\x17\xc1\x15\xd3\x56\x4b\x14\xd9\xdc\x4d\x15\xdd\x0e\x63\x13\xaf\x69\x11\x83\xd3\x4f\x58\x7b\x0e\xa9\xdf\x38\x3e\xa7\x71\x74\xc5\x12\xae\x21\x6a\x21\x77\xa2\xa7\x83\x44\x3b\x00\x91\x61\xff\xb1\x0a\xae\xfc\x90\x81\x33\x98\x4f\x0c\x43\x56\xfe\x54\x2b\xbe\x30\xab\xaf\xbb\xa9\xa4\x96\xfb\x72\xd5\x5e\x7e\xbc\xfe\xa1\xb9\x6b\xf5\x23\x7c\xf6\xc9\x5d\x8c\x73\x5f\x0b\x99\x3f\xc3\xb3\x3f\x58\x89\x5c\xe5\x14\x14\xc4\xab\x94\xb5\xc5\x9e\x87\x69\x18\x4c\xbf\x3d\x76\xfa\xd6\xe4\xb8\x3c\xc3\x0c\xf0\x40\x85\x5f\x2a\x96\x32\xce\x57\x9c\xc7\x91\x86\xd8\xd3\x7c\x41\x2d\xff\xee\x08\x83\xe4\x4a\xac\x75\xce\xd8\x92\x45\x30\x58\xd4\x70\x90\x04\x22\x51\x6d\x81\x89\x64\x93\x07\xc0\xf5\x21\xe6\xcc\x15\xcb\x3d\xa8\x08\x25\x9b\x71\x77\x47\x4b\xd2\x01\x79\x6c\xa6\x2d\x82\x29\x48\x4a\x22\x9c\x28\xfc\xc0\xd7\x80\xfd\x09\x2d\x2f\x6c\xb7\x31\xa9\x45\x6d\xda\xa5\x3d\xda\xa7\x83\x33\x4a\xde\x63\xd3\x11\xb1\x64\x00\x4a\x75\x54\x9f\x2a\xa8\xa5\xfa\x3c\x8b\x6a\xd7\x38\xe1\x52\x93\x8e\x45\x30\x83\x26\x95\xb8\x29\xbe\xc2\x45\xed\xbf\x59\x56\xe1\x93\xbe\x2e\x74\x26\x74\x75\xb6\x5f\x04\xbf\xcc\x44\xda\xdf\x2c\xab\x8a\xb7\xa1\x93\xf4\x34\x40\xcd\x0c\x53\x1d\x9f\xc3\x58\x93\x0b\x40\x0b\xc1\x07\xe5\xbc\x8b\x86\x5d\x05\xfe\x3a\x02\x0d\x6c\x97\xa9\x79\x9e\xe8\x0a\x7d\x99\x04\x0b\x3f\xb9\x35\xe4\xfb\xce\x69\x64\xc1\x4b\x59\x54\xf7\x57\x37\x41\x18\x94\x01\x6c\x00\x10\x44\xea\x62\x95\xba\xfc\xfe\x49\x82\x74\xba\x4e\xd4\x4f\x7f\x2f\x79\x82\xe1\x74\x1d\x27\xb3\x36\x1e\xdd\x6e\xe3\xe9\x94\x36\x94\x7b\x8a\x48\x91\xc9\x2f\xa7\xa7\xe9\xe9\xe9\xe4\xf4\xf4\x4c\x37\xbe\xdf\xbf\x78\x79\x4a\x9e\x9d\x9e\xfe\xb2\xf5\x2f\xff\xf4\xcf\x7f\x6e\xfd\x85\x8e\xdd\xff\x72\x56\xf0\xa3\x9e\x1d\xb1\x8b\x55\xe8\x27\x60\x49\x12\x96\x7d\xd1\xbe\xf4\x43\x2e\x8e\xc7\x48\xfb\x04\x1c\x10\xfd\x90\x72\x3f\xe1\x86\x50\xba\xd9\xf2\x9a\x6c\x39\xcc\x6d\x61\x76\x21\xd7\x4e\xfd\xc2\x97\xa7\x69\xe8\xa7\xa8\xf7\x12\x86\x0b\xd9\xd2\x0c\x4e\x0b\xd3\xfc\xce\x69\xf4\x85\x69\x3e\xce\x5d\xc8\x3f\x08\xaa\x68\xd2\x21\x85\x0f\x27\xe0\x7c\x2f\x7d\x7e\x99\x6a\x73\xfc\xe6\x1f\xc1\x5c\x06\x09\x52\x33\xd2\x38\x65\x38\x2e\x6b\x7c\x7c\xe4\xe4\xf9\x29\x8c\xfc\x47\xa7\xc4\x4a\xf2\x04\x56\x4a\xa1\x64\xd1\xec\x8f\xe1\x64\xa3\x28\x89\xa1\xf2\x7b\xf0\xe0\xec\x2f\x0f\xb7\x5b\x1c\xae\xf2\xc3\xb0\xfc\x0d\x34\xfb\x50\x22\xa8\xf9\xbd\x04\xe7\x34\xfa\x94\x8a\x0f\x22\xec\x66\xa9\xbe\x72\xe6\xab\xbf\xe9\x2a\x41\x67\x3d\x90\x1f\xb2\x50\x66\x70\xce\x10\x07\x91\x30\x64\x4b\xff\xe2\xf7\x74\xca\x01\x9d\xb6\x5a\x3e\x9f\xc5\xd7\xd1\x13\x1d\xf3\x7a\xd1\x47\x39\xe7\xa5\x62\x6b\x1d\xf4\x32\x54\xee\xa4\x93\xa5\x9f\xa6\x6d\x3f\xe4\x6d\xe1\xd2\x3e\x75\xd3\x68\x71\x19\xad\xe8\x4e\xe4\xeb\x35\x50\x01\xee\x3d\xb4\x3a\x9d\x91\x1a\x08\xd2\xb9\xc9\x95\xb1\xdc\x4a\x77\x2b\x96\x4e\x92\x55\x14\x41\x37\x89\xcd\x44\x41\xa4\xf9\x99\x3b\xc4\xfd\xf3\x7c\xc3\xe2\x6d\xbc\xd2\x66\xb8\x57\x0d\xbf\xfb\x0a\xdb\xf5\x2c\xd5\x4e\x89\x88\xf3\x8b\xd5\xf9\xe7\xa7\x44\x53\xd1\xd3\x34\x7f\x3a\x65\x21\x4b\x7c\x1e\x27\xc0\x4b\xdc\xcf\x14\xc5\x3c\xab\x12\x2b\xe3\xfe\xb9\x16\xf0\x67\xa9\x76\xce\x38\x17\x1f\x17\x54\x5f\xa4\xac\xe8\xca\x89\x85\x16\x24\x07\x66\x0e\xc2\xd5\x5f\xa5\x18\x6d\x44\xbb\x0a\x16\x60\xbb\xd9\xc2\x9f\x0a\x59\xcd\xa4\x24\x63\x07\x76\xf3\x39\x53\xdb\x08\x41\xe7\x15\xd9\xa3\x15\xfc\xc2\x5a\x99\x14\xac\x54\x81\x0c\x01\x8d\xbd\x52\x70\x0a\xf2\x4d\xb6\xd9\xde\x3c\x69\xf6\x51\x3a\xa4\x99\xc6\x53\x86\x99\x38\xe0\x82\xfc\x1f\x2a\x0f\x38\x5b\xf8\x9f\x02\x51\xfe\x78\xf4\x54\x89\xa8\x17\xfa\xe3\x44\x02\x67\x1c\x7f\xa8\x48\xbc\x87\x1a\xfe\xa7\x48\x64\x22\x91\xf3\xe3\x09\x22\x51\x2f\xf4\x07\x8b\xc4\xd5\x6f\x9f\x79\x22\x9e\xcf\xda\x05\xe3\x29\x4a\x82\xb0\xe7\x48\x2b\xd4\x25\xb7\x33\xb5\x99\x3a\x02\xf2\xf8\x75\x03\xb2\xe2\xf3\xb6\x43\xe8\x44\x25\x48\xe2\x5f\x8b\x93\x0b\x62\x8e\xcd\xf2\x8b\xbc\x45\x11\x9c\x1f\xcd\x7c\xee\xe7\xbb\xa8\xb2\x0d\xb0\x48\x91\xdc\x26\x11\xcc\xc4\xa7\xfe\x14\x37\x2c\x3c\x43\xf4\xcf\x90\x55\xcf\x12\xff\x5a\x6c\x51\x13\x56\xb6\x1d\x47\xe8\x5e\xf0\x24\xfe\xf6\x08\x27\x2c\x3f\x7d\xd2\xf4\x8d\x59\xa0\xcc\x06\x08\x6e\x7f\xc4\x0f\x37\xd1\xad\x96\x55\x52\xa9\x3c\x5e\xf1\xe5\xea\x11\x2e\x70\xa1\xe6\x06\xbf\x66\x5d\xcd\x99\x47\x23\xaa\x29\xd4\x7d\xee\x27\x6d\xb9\x23\xe7\x07\x9b\x7d\x72\x89\xdf\x09\x71\x97\x43\xc1\x63\x5a\xa8\x35\x1b\xd9\xc6\xeb\x4b\xc6\xc2\xf6\xc2\xbf\xc5\x15\x91\xb6\x9f\x24\xf1\x75\xfb\x71\xeb\x37\x8d\x6d\xc6\xe1\x2e\xbe\x44\xc8\xcd\xfe\x2c\x91\x93\xda\x74\x9a\x30\x16\x69\xe7\xab\xf9\x9c\x25\x62\x17\xcb\xeb\xfd\xbd\xbd\xb7\xef\x35\x7d\x37\xbf\xbf\x41\x13\x17\x38\x68\x18\xee\x2b\x9b\x5f\x32\x2a\x27\xba\x48\xaf\x62\x28\xee\xd3\x97\x53\x46\xb6\x58\x85\xb8\xb7\x1b\x5a\x20\x16\x7b\x50\x23\x70\xa5\x34\x38\x5b\x2c\xe3\xc4\x4f\x82\xf0\x56\x9b\x89\x73\x2e\xa8\x0d\x2e\xe3\x30\x77\x71\xd1\xdd\xfb\xc6\x6e\x73\xbd\x59\x98\x34\x4d\xe3\x05\x4b\xb5\xd5\x52\xa8\x50\xd1\x48\x70\x0d\x93\x54\xd3\x43\x96\xa6\x06\x28\xa3\x44\xae\xfa\x2c\x7c\xe1\x5d\xa6\x9a\x5a\xe4\x66\xb3\x80\xe3\x17\xc3\xab\xe0\x79\xe4\x47\x31\x82\x0b\x2c\x82\x35\xcf\xf9\x62\x75\xd3\xd0\x39\xf1\x15\x6b\x2f\x56\x21\x0f\x96\x61\xf0\x18\x0b\x92\x77\x8c\x55\xfc\xe0\x90\xa3\xc8\xbe\x6c\xe0\xe7\x06\x6d\xc6\x42\xee\x83\x3e\x15\xcc\x95\x5c\x9d\xfa\xa8\x66\xa5\xbe\x94\x1c\x47\x88\x0e\xb8\x53\xf8\x21\x3d\xbe\xd6\xe6\x7e\x2a\xd4\x01\x3a\xc9\x45\xe7\x18\x05\xea\x0f\x51\x3c\x35\x7d\xa3\xf4\x74\xa6\xf7\xd4\xc8\xfa\xa1\xfa\x83\x34\x6e\xdb\xa6\x6d\x03\x09\x79\x3a\xa3\x06\xff\xb6\xc3\x78\xfa\x8d\xcd\xa0\xae\xe2\xc7\x9c\x6c\x44\x67\x34\xea\xaf\x3f\xee\x1d\x8b\x85\x99\x37\xc7\x1f\x11\x97\xdc\x14\x50\xd8\x93\x80\x2b\xf5\x3c\xf1\xa3\x34\x94\xa7\x09\xf4\x30\xf8\xc6\xb4\x8b\xc4\x5f\x5e\x06\xd3\x14\xde\xa7\x80\xe4\xd3\xc9\x41\xdb\x51\xe2\x9b\x6a\xe9\x6a\xb9\x8c\x13\x75\x82\x25\x4e\xd5\xd6\x39\xa6\x09\xf2\xc4\x37\xb8\x48\x1d\xa1\x2a\x31\x6f\xea\x47\xe5\x0d\x5c\x9a\x8f\x46\x9a\x07\x0b\xb9\xc8\x94\xb5\x45\x2c\x60\xe6\xe7\x4d\xd4\xde\x31\xb5\xbf\x98\x07\xd3\x6f\x62\x31\x41\xd0\xb7\x8a\x70\xdb\x01\x38\x0f\xe2\x43\x31\x18\xc6\x6f\xe0\x76\xb0\x68\xc6\x70\xf9\x1e\xa1\x43\x76\xe1\x4f\x6f\xb5\xc2\xed\x2d\x52\x72\x70\x91\x5c\x04\x4f\x7d\xfa\xce\x96\xe2\x87\x66\x18\xce\xdb\x9a\xb8\x31\xac\x69\x87\x0b\xaf\x6f\x6f\x91\x3b\xbd\x92\xf6\x34\x7d\xda\x56\x47\x52\x3d\x28\x83\x67\x27\x52\x7e\x1b\xb2\xf4\x92\x89\x63\x1e\xea\xf3\x4a\xf5\x9b\x77\x16\xf3\xbe\x58\x7b\x1b\xd4\xc6\x93\x49\xc0\x61\x1e\x06\x11\x6b\xe7\xdf\xfd\x56\x29\x58\x9c\xbd\xe3\x63\xa1\x89\x70\x63\x1e\xbf\x0d\x95\xda\xcb\x82\x62\x93\xb3\xe6\x63\xc9\x59\x30\x15\x4f\x1e\x94\x16\x07\x69\xf4\xa6\x83\xda\x19\x6c\xe3\x39\xef\xce\x34\x8e\x52\x9e\xac\xa6\x3c\x4e\x9a\x0e\x67\x43\x99\xd5\xf9\xf1\xea\xbc\x16\xc6\x30\x3e\x4f\x59\x72\xc5\x92\xf4\xab\xf7\x5d\x04\x34\x41\xb8\x8e\x3f\x9b\xbd\x92\x7b\xe4\x4a\x87\xc8\xc5\xf9\xef\x88\x5d\x6b\x0a\x34\x0f\xb5\x25\x03\x15\x0a\x04\x39\xc1\x6c\x92\x9c\x79\xf5\xfc\x49\x72\x26\xcf\x76\x1b\x85\x7a\x0b\x01\x66\x56\xe7\xe9\x34\x09\xce\xab\xc1\xaf\x65\x37\x97\x68\xbf\xbb\xd3\x2b\x39\x13\x76\xe6\x4d\xce\x64\x7c\x98\x52\x76\x67\xb9\x4a\x2f\xd7\x55\xba\x8a\xd6\x55\x5b\x88\x4f\x53\x42\x27\xee\x49\x11\x61\x64\xc8\x9b\xe8\x0a\x1d\xb1\x74\x85\x1d\x8a\xc1\x7c\xc6\x2a\x80\xab\x0a\x3a\xc3\x45\xdc\xd6\x17\xa6\x2c\xf4\x21\xe6\x5a\x56\xeb\x4c\x94\x49\x3a\x29\x8c\x5e\xa6\x07\x2a\xfe\x4e\x95\xd2\xe5\xea\x3c\x0c\xd2\xcb\x12\x95\x34\x29\x5c\x71\x14\x40\x77\xb1\x17\x71\x21\x1e\x5c\xe1\x4e\x81\x80\x9a\x94\x6d\x5b\x06\x8d\x27\xec\x0c\xb8\x21\xe2\x6c\x37\xb4\x2f\x6e\xb5\xf4\xd8\x9b\x9c\x81\x8c\x4d\x7d\xae\xc7\x86\x41\x13\xc8\xdb\x89\x05\x2b\x13\xc3\x8d\xbd\x49\x72\x66\xd0\xb8\x56\x85\x69\xac\x09\x5b\x70\x3d\x25\x54\xc6\x58\x3e\x8a\xaf\xf7\x50\xb1\x88\xc7\xe3\xe0\x57\x96\x3d\x9c\xb0\x1b\xbe\x9b\x7d\xb2\xc6\x20\x07\xc7\x68\xd5\xeb\x21\x8d\x60\x92\xb0\x9b\x24\xfe\xad\x37\x39\x93\x61\x81\x70\x23\x1a\x06\x3a\xff\xea\xb1\xbb\x3b\x47\x86\x24\xe6\x25\xa4\x52\x98\xcb\x35\xa9\xab\x33\x94\x06\x31\x8a\xf1\xaa\x0f\xe5\xb9\x16\x59\x52\xd0\xaf\x43\x63\x8b\x50\x47\xf1\xf5\x87\x78\xc6\xbe\x62\xdc\xe7\xe2\x8b\xe6\xdc\x8f\xf3\x79\xca\x78\x31\xff\x3a\x4e\x66\xaf\x12\xe6\x7f\x7b\xef\xf3\xe9\xe5\x3b\x36\xe7\x6b\x5f\x1e\xe1\x35\x1b\xeb\xde\xbe\xc7\xf5\xcd\x2c\xfe\xb4\x60\x60\x41\x94\x2e\x18\x06\xec\x6f\x08\x64\x29\x1a\x88\xd1\xfc\x6b\x1c\xa5\x65\xae\x4b\x31\x33\xd6\xd5\x20\x6e\xfd\x58\x17\x2c\xb3\x8a\x66\x1d\x16\xbc\x58\x64\x6d\xc4\xcd\x02\x75\x8d\x08\x52\xc6\xf7\x72\x98\xba\x08\x95\x05\xa6\xa9\xcb\x25\xc8\x4b\x4f\x5d\xfe\x07\x28\x4b\x10\x7a\x53\xa9\x24\xbe\xa6\xac\x6d\x35\x33\x07\xed\xf2\x51\x7c\xbd\xae\x59\xea\x7d\xaa\x5b\x86\x0c\xf4\xb5\x16\x47\xba\x36\xc0\x7c\xce\x61\xa9\x59\x4c\xca\x9a\xe9\x91\xe7\x7d\x4b\x14\xd5\x06\x59\x8e\xe5\x11\x78\x1a\xc2\xd8\xe7\x88\x24\x18\xde\x36\x27\xc3\xcf\x65\x2f\xd7\xa1\x5e\xc6\xcb\x0d\x0c\x13\x6f\x37\xb1\x4b\x42\x3c\x9e\x59\x8d\x42\xda\x66\x6b\xe9\x5b\xa5\x97\x0f\xf0\x0f\x55\xe7\xe6\xe2\x65\xfa\x44\xf6\x93\xd8\x24\x7c\xbd\x32\x21\x59\xd0\xf6\x5a\x1b\x19\x35\x29\x7f\x00\x51\x5a\xbd\x50\x2f\x0b\xb3\x69\x8e\x93\x17\x5c\x45\xce\x4c\xb6\xb7\x8d\x35\x95\x6c\x27\x50\x0d\x98\x8b\xc6\x9a\x12\x06\x13\xb3\x2a\xef\x36\xf6\x0d\xa3\xeb\x3b\x3a\x43\x57\x25\xfc\x01\x8c\x6b\xf9\x80\xf6\xdd\xe7\xac\x3c\xe8\x6b\x6e\x55\x65\xfc\x03\x11\xbf\xa7\x81\x68\x24\x0e\xf7\xc7\xec\x29\xd4\x6b\x48\x52\x95\xca\x3b\xb7\x4e\xde\xbf\xcb\x6e\x2b\xa8\x00\x08\xd6\x65\x26\x11\xcc\x77\x24\xce\x2b\xcd\xc3\xf8\x9a\x18\x4d\xb4\x99\x1b\x74\xe6\x9a\x97\x0a\xa1\x27\xef\x0b\x61\x63\x19\xf7\xb2\x6c\xa5\x3b\x41\x2a\x37\x13\xea\xc6\x0e\x21\x6e\xd0\x99\xa3\x3d\xb8\x0c\x38\xc3\x6d\x87\x75\x03\xa5\x82\x15\x35\x62\x8b\xf0\x7a\x88\xf1\x86\x77\xde\x96\xd5\xe4\x2e\x74\xd2\xdb\x68\xba\x87\xbb\x94\xcb\x91\xff\x2b\x60\xc2\x97\xdf\x8b\x23\xee\x07\x11\x4b\x74\x26\x63\xcd\x56\xb8\xec\x2f\x97\x2c\x9a\xed\x5d\x06\x21\x5e\x1f\x57\x93\x82\xa4\x91\x06\x45\x22\x7f\x90\xc2\x66\x49\x89\x17\x8b\x80\xbf\x0b\x22\xf6\x51\x71\xff\x01\x69\x49\x19\x5f\x2b\x09\xea\xca\x92\x46\x73\xbb\x66\x98\x94\xae\x90\xa9\xf9\x10\xdf\xd9\x4b\xaf\xf1\xcd\x8e\x0e\x13\x9d\x38\x64\x2a\x56\xe3\x51\x7c\xad\xc5\x2b\xdc\x19\x71\x8e\x61\x0c\x44\xfc\x4c\xca\x9a\xcb\xb7\x2d\xc3\x65\x2f\xcc\x56\xeb\xf1\x78\x60\xcc\x4a\x6a\x8a\xc2\x55\xa3\x44\x38\x16\x75\x24\xe0\x3a\xd6\x8b\x03\x21\xbc\x89\x90\x8d\x68\xcc\x46\x37\xb4\x36\x84\x92\x4a\xe3\x27\xec\x8c\xc2\x04\x04\x8f\x54\xa2\xa8\x8d\x83\xbb\x3b\x1d\xb2\xe2\xeb\x88\x25\xea\xe2\x33\x29\xb3\xe0\x09\x43\xaf\xeb\x84\x18\x34\x29\x49\x68\x60\x08\x91\x4f\x3d\x13\xa7\x7d\x89\x0a\xa9\x59\x92\x96\x9d\x8c\x61\x4d\x7a\xa0\x5d\xd7\x1b\xad\x96\x1e\x78\x55\xd1\xa7\xe9\xd3\x90\x18\x6e\x93\x6e\x4d\x1a\x39\x86\xfa\x18\x64\x70\x1c\x8c\xc5\xd4\x2e\xf2\x78\x3b\xa5\xbe\x57\x9d\x08\x74\xa2\x78\xc6\xd0\xeb\xd4\x03\x11\xea\x35\xe8\x44\xec\x86\x1f\x07\xe7\x30\xd1\xbf\xbb\xf3\x5f\x46\xa5\x90\xc9\xc5\xc1\x1b\xd0\xab\x38\x98\xe9\x4d\x4a\xdc\x18\xa7\xdb\x9e\x4f\x03\xaf\x84\x4e\xdc\x22\xa1\x29\x99\xb8\xf6\x93\x48\x27\xbb\xf9\x5e\x75\x3c\xb5\x2d\x56\x72\xd5\xe1\x7a\x2d\x8e\x34\x26\x82\x1a\x88\xf1\x47\xd6\x0c\xc6\xdb\x68\x9a\x5d\x1c\xb7\xe7\x27\xac\xe2\xff\x26\xb7\xdf\x59\x76\x9b\x9c\x5e\xeb\x8c\x06\x7e\xdf\x4f\x31\xbc\x3d\x33\xc4\xc2\x41\xbd\xc6\x65\x18\x70\xc1\x88\xa6\xa9\x34\x18\xac\x38\x62\x28\x69\x5b\x96\x41\x53\x8f\xa1\x22\x93\xf1\xf0\xc6\xa5\xa7\xe6\x7e\x39\x96\xb7\xed\xa1\xe3\x42\x93\x52\x81\xa0\x73\x3d\x55\x91\x60\xd3\xda\xeb\x56\x0b\xa3\x09\xb3\x08\x09\x94\xfe\xcd\x2b\xdc\x9a\xa9\x27\x94\x15\xfb\xc4\xa0\x25\x4a\xee\xee\x4a\x25\x85\x95\x14\xa3\x63\x8d\x17\xb6\xf0\x6f\xcf\xd9\x5e\x18\x2c\xf7\x56\x09\x94\xab\x18\x67\x11\xea\x79\x83\xdc\x35\x88\xb5\x08\x1e\xfe\xa2\xae\x57\x8c\x4d\x73\x96\x1a\xb4\x8a\xaa\xfb\xf8\x49\x4c\x93\x22\x7b\x40\x27\x15\x2f\xa0\xe3\x1b\x86\xf4\xf8\xf7\x20\xe5\xb1\x8c\x14\x5c\x6c\x90\xea\x17\xac\x6d\x29\xb6\x14\x40\x1f\x2d\x8b\xb5\x81\x63\x36\x54\xb2\x6d\x19\xc5\x08\xf5\x0d\x1d\x4c\xeb\xfa\xb0\x28\x93\xa0\xb6\x92\x92\xec\x05\xc6\x43\x45\xf8\x8b\xba\x11\x7b\x2a\xcb\x4b\x3a\xb6\xa9\xaf\x9b\x35\x81\x18\x5e\xd5\xe8\xff\xd9\x6a\x62\x8d\x67\x89\xc7\x4b\xaa\xe0\x47\xdc\x53\x69\xa7\x84\x1a\xe0\xe2\x46\xd2\x8a\x13\x56\x11\xc0\x6d\x4f\x44\xa1\x8e\xbc\x7a\x8f\x6d\xb6\x0c\xdc\x68\x47\x30\x22\xfd\x17\xa6\x68\x53\xe8\xd5\xfd\xd3\xb6\x6f\x64\xb7\x5e\x54\x1c\xb6\x55\x34\x63\x09\xd0\x7f\x77\xd7\xe8\xcf\xf1\x24\xf8\xc6\xf8\x65\x12\xaf\x2e\x2e\x9b\x41\xf2\xd8\x2b\xcd\xef\xaf\xa7\xc0\x35\x75\xc3\x7b\xe5\xa5\x9f\x4e\x83\x40\xbc\x17\x37\xf4\x34\x01\xf1\x20\x64\xaf\x7d\xee\x1b\xc1\x5c\xef\x6e\x79\x1c\x9b\x7f\x72\xbb\x64\x30\x5a\x0a\xf8\x8b\xd8\x38\x96\x52\x69\x5c\xb3\x47\xb4\xaf\xd9\x34\x4e\xf0\xcb\x44\x9e\x9f\xb7\x00\x5d\x57\x19\x34\xfc\xd2\xe3\x9b\x7d\x94\xb0\xd9\xad\x2e\x29\xf4\x4b\xca\xcb\x0a\xbd\x66\xa8\xb9\x77\xd9\x38\xd5\xf2\xda\x3e\x4d\xbc\x50\x58\xe5\x92\x4c\x7a\xc9\xb6\x17\x8a\x2b\x0f\x98\x17\x6e\xb3\xb1\xef\x99\xf7\x6b\xba\x17\xf7\x1f\xb2\x34\x9f\x0b\xf0\xec\xf6\x9d\x32\x4e\xd3\xf3\xfc\x9d\x64\x9b\xb9\xa6\xe7\x45\x3b\x6c\x3b\x71\x37\xaa\x1a\x6a\xd2\xc8\xd8\x66\xdb\x9b\x81\x22\x63\x9d\x17\xb2\xed\xa5\x28\x92\x50\x9b\x60\xf7\xd4\xe3\x9d\x65\xc2\xae\x82\x78\x95\x66\xaa\x66\xae\x4f\xe5\x62\xd7\x43\xed\x9a\x66\xed\x9a\x16\xdb\xb5\x5d\x5e\x4b\x13\x2c\x9f\xae\xf5\x8d\xca\x43\xb6\x84\xc9\x30\xc6\xb3\xc7\xce\xb6\xea\x4e\x59\xb3\x74\xcc\x28\x6f\x90\x88\xd9\x5a\xf2\x52\xbc\x71\x0a\xba\x4a\xf0\x6c\xe5\xf1\xb2\x6a\x9e\xeb\xab\x47\xf2\x6b\x95\xf1\x6b\x55\x92\x03\xb6\x5d\x7a\xae\x53\xb7\x7a\x24\xf3\xd8\x1f\xc3\xb0\xd5\x93\x18\xb6\x41\x71\xce\x0c\xe3\x5e\xd8\xa0\xcc\x57\x44\x89\x45\x3d\xfc\x68\xc2\x1f\xd3\xc5\x0f\x28\x80\x59\xd3\xf0\x4f\x1b\x8d\x19\x98\x18\x3c\xc3\xfa\x80\x3d\x2b\x7a\x26\x1b\xbc\x1e\xbc\x3d\x42\x8a\xc1\x84\x9d\xc9\x09\x5c\xcd\x6c\x3d\x5a\xb5\x54\x7d\x1c\x29\x8a\x6b\x7c\x99\xd2\x5d\x09\x65\xf7\xde\xf3\x58\xc3\xc4\x26\x53\x1d\x49\xad\xbf\x6b\xe6\x34\x91\x5d\x33\x63\x21\xe3\x6c\xef\xd2\x4f\x52\xfd\xbd\xcf\x2f\x3b\x8b\x20\xd2\x13\xca\x0d\xa3\x78\xc3\xa7\xbc\x1b\x6a\x8d\x13\x5d\xc0\xf1\x48\x0f\xa2\x6e\xc3\x83\x4d\xde\x27\xde\x8d\xc2\xbc\x8c\x3e\xd6\xe0\x60\x06\x46\x36\x60\xcd\xcc\x7f\x4b\x69\x44\x7d\x8f\x8d\x61\x4e\x21\xae\x0c\x4a\x37\xfb\x0a\x94\x3f\xde\x9b\xa4\x26\x4d\x8c\x07\x14\x7c\xb2\xcd\x0c\x1a\x3d\x50\x27\x6b\x7b\x69\x3b\xa2\xc9\x8b\xb4\xd5\x8a\x5a\xad\x34\x53\xf9\xe1\xa3\x46\x19\xd1\x88\x31\xe6\x6b\xa7\x4c\x61\x6d\x80\x95\x9a\x48\x08\x8d\x3c\x13\x68\xb0\xee\x95\x55\x2f\xaa\x4c\x30\x40\xad\x16\xdf\xaa\xf5\x63\xab\xc5\xd7\x4d\xb6\x70\x41\xe4\x92\x26\xc2\xec\x76\xeb\x65\x0b\x0e\xca\xd6\xa6\x21\x90\x59\xbe\x0a\x0c\x1a\xbe\xaa\x35\x34\xea\x76\xac\x0a\xd2\xa4\x49\x36\xf4\x4d\xbd\x8a\xec\x3e\xd0\x69\x89\xa7\x0d\x35\x17\x5e\x37\xae\xc6\xe6\x13\xaf\x55\xd3\x24\xe3\xc1\xd5\x9f\x07\x57\x2c\x9b\x0c\xc1\xaa\x91\x94\xfb\xf5\x3e\xbc\x40\x35\xcd\x6e\x0b\xf7\xd7\x7d\xfc\x7b\x17\x44\xec\x98\xfb\xf8\x21\xe2\x6b\x49\x0b\xe0\xa5\xad\xac\xca\x49\x9c\xe4\x97\xb3\x3a\x97\x7e\xba\x61\xce\x60\x30\xaf\x56\xa4\x74\x4b\xe4\x3a\xb2\x80\x6b\x75\x92\x84\x72\x22\x64\x8c\x4e\xf2\x76\x79\x81\x83\xb2\xcd\xc4\x48\x6a\x8a\xe3\x44\xa9\xe3\x75\x94\xfc\xed\x28\xbe\xde\x8d\xa6\x2c\xe5\x71\xd2\xc4\xa0\x56\x8b\xfc\xad\x7d\xf4\xf1\x0b\xd9\xf2\x00\x73\x3c\x63\x1f\xfc\x05\x93\xad\xce\x86\xd9\x83\x0d\x56\xaa\xf3\x4b\xc0\x2f\xd5\x02\xf2\xd7\xda\x46\x84\xa2\x61\x6b\x5b\xe3\xc2\xfd\xf3\x55\x4a\xe5\x8e\x88\xad\x20\x87\xce\x94\xab\x67\x8e\x83\x2d\x4f\x29\xd6\xed\x4d\x23\x89\x19\x74\xeb\x01\x9e\xde\xdd\x6d\x95\xd7\x76\xb2\x0a\x2b\xac\x56\xb2\x98\x6e\x2b\x8a\x8b\x8d\x0e\x22\x90\x40\xd9\xd0\xc7\x70\x49\x14\x68\x62\x51\x51\xbf\x6d\xe5\x16\x57\x5c\x68\x5a\x7c\xb9\xd3\xb6\xdc\x0d\xb4\x14\x41\x11\xf9\x03\x84\x17\xc1\xcd\x7c\x31\x22\xf0\x4c\x0a\x3c\x4f\x5f\xb0\xce\x14\xc6\xe5\x07\x3c\xe0\x23\x3f\xeb\xa5\xdb\xdb\x6a\xb5\xb4\xf8\x7a\x92\xe2\x2e\x98\xa8\x70\x7b\x5c\xb0\x9d\x8c\x83\x8d\xbd\x15\xa9\xf1\xde\xb6\xd6\x71\x10\x90\xef\x46\x33\xa1\x43\xd6\x0b\x5b\x2e\xdd\xfc\xe5\x46\xf1\x18\xab\x8b\xc2\x7e\x50\x46\x78\xfb\x01\xf1\x5b\x23\x44\xaa\x27\x6a\xed\xc9\xbb\x63\xad\x14\xad\x29\xb3\xf1\x33\x6c\x53\xd7\x25\xaa\xeb\x82\x72\xd7\x25\x67\x74\xa3\xbb\x22\x16\xbd\xf9\x0b\x2f\x95\x7c\x20\xc7\x87\xbb\x1f\x88\xe7\x79\x41\xa6\x40\x76\x1e\x6a\x60\x40\xb9\xe1\x4e\x02\xca\xcf\x80\x87\xe9\x7d\x41\xc8\xd7\x7d\x38\x3a\xf2\xa3\x0b\x56\x1d\x31\x34\x10\x6d\x88\xbd\xb5\x35\x66\x22\x22\x97\xf7\xd5\xa5\xc3\xb1\xba\xcc\xfa\x51\x25\x13\x63\x2c\x8a\xa5\xad\x96\x1e\x00\x3d\x68\x77\xf4\x78\x62\x9e\xd1\x78\x62\x9d\x19\x14\x73\xf7\xa3\x99\x9e\x42\x5e\x0a\x79\x46\xf3\xea\x97\x38\x06\x98\xad\xbd\x57\xef\x4b\xcb\x9c\x58\xec\x6f\x6c\xf7\x2e\xd7\x4d\xc1\x77\xf0\x5d\x3a\x3c\x56\xf7\xa6\xaa\x1b\x65\x4f\xd3\xe7\x46\x69\x4b\x5a\xd5\x3a\xea\x6b\x14\x6d\x07\x8f\x1b\x66\x7e\x9d\x81\xb5\x24\x55\xae\x36\x2a\x78\xf0\xd8\x2b\xc5\x55\x86\x60\x22\xe2\x6a\x5b\x0d\xbc\x5e\x8f\x0f\x3c\x89\x02\x36\xa6\x3a\x24\xc3\x95\x66\x9f\x67\x2e\x1b\xb7\x44\x51\xbf\xe9\x0d\xee\x87\xa2\x61\xd3\x2b\xb1\x19\x8a\x5e\x96\xf8\x86\xe6\x5b\x4f\x0c\x3a\x2d\x7e\x37\x00\x96\x5f\x52\x93\xa6\x06\x5d\x15\xaf\x11\x8d\xb6\xc3\x6d\xf2\xcf\xc4\xa0\x33\x6f\xda\x49\x99\x9f\x4c\x2f\xf5\x95\x30\x61\x7a\xdb\xf2\xbc\xd9\xdd\xdd\xec\x65\x2c\x3b\x68\x59\xc7\x18\xd3\xf2\xf4\xee\xd2\x30\xe8\xbc\x74\x4f\xe9\x2f\x64\x3b\xdc\xf6\x0d\x7a\xe1\x2d\x65\x97\xcf\x11\xff\x85\xc0\xb9\xf0\xe2\xed\x32\x8a\x8b\x89\x79\x66\x8c\xa1\xf2\xc5\xdd\xdd\xe2\x45\xaa\x36\x44\x66\x23\x49\x4f\xe8\x8c\x2e\x28\xcc\x04\x3a\xfe\x6c\x86\x99\x3a\x07\x91\x15\xff\xea\xbb\xf4\xc4\x06\x3c\xb1\xef\xb0\xbc\x39\x4f\xee\xc2\x8b\xc3\xf0\x30\x4e\xca\x9f\x91\x9a\xf6\x8f\x8a\xcb\x7b\xb2\xed\x62\x87\x49\x7c\x15\xcc\x58\x92\xef\xb0\x52\xfb\xb5\x71\x13\x5a\x61\xcb\x99\x65\x52\x4b\x7d\xf2\x4c\x56\x21\x14\xc9\x37\x45\x64\x27\x6a\x55\x89\x8c\xa0\x4e\x36\xd4\x8a\x35\x4f\xb3\x8f\x2f\x30\xf2\xf7\xfc\xe9\x65\x69\x8f\x85\x72\xfa\xca\xef\xbf\xdf\x8b\xb7\xa1\x9f\x72\x31\xae\x91\xdd\xc5\x82\xf9\x2b\xb1\xc3\xad\x91\xc6\x7d\xdc\x9a\x3e\xfb\xea\x6d\x99\x79\x29\xdc\x37\x88\x5b\xcd\x64\xa6\xd8\xe6\xff\xe5\x92\xb1\xf0\x7d\x76\xaa\xe0\xab\x67\xe5\x45\x4e\xe2\xd5\xf4\x32\x27\x2b\x48\x45\xab\xd9\x6c\x3f\x9a\x65\xb8\x65\x4b\x55\xa4\x14\x21\x21\x87\x37\x9e\x35\x90\xef\x79\x12\x7e\x16\x37\x13\xa9\x2d\x0e\xb3\xe0\xaa\x48\xb7\xda\xf5\x58\xcc\xe3\x62\x57\x67\x9a\xd7\x5e\xda\x3a\x2c\xb2\x5e\xef\xbf\xfa\xf4\xd3\x57\x6f\x4b\x99\xf4\x5a\x8f\xd4\x77\x44\xa5\x19\x54\x26\x10\xa9\xd4\x62\x85\xda\x59\x34\x2b\x67\x04\xe9\x7b\xb5\x23\xbb\x94\xbb\x27\xbf\x60\xce\x8a\xfb\x64\x6a\x64\x14\xb4\xf3\x3c\x88\x66\x07\xd9\x87\xf1\xb5\x76\x95\x15\xbf\x9e\x27\xc2\x93\x00\xfd\xc4\xb3\x6d\xbd\x49\xb6\x36\x90\xa0\x52\xad\x1b\x61\x65\x80\x91\xd4\x72\xbd\xb8\x1c\x82\xdb\x82\x33\x0f\xea\x3e\xf1\x92\x26\x6f\xe2\x91\xed\x4a\x6f\xa3\x69\xf1\x33\x63\xb6\x2f\x98\xe9\xc6\xf7\x24\xe7\x71\x4c\xe5\x03\x50\xea\x05\x1d\x3f\x9a\x5e\x8a\xa9\x9c\x7a\x21\x34\x72\xf6\x4a\x3c\xd2\x44\xf5\x49\x2a\x92\xb2\xf8\x3c\x9e\xae\x52\x59\x3a\xd3\xe6\x2a\x5f\x3c\xdd\x67\xa4\xf0\x32\x29\x69\x85\x94\x22\xae\x32\x25\x05\x6c\x39\x21\x71\x89\x90\x52\x3b\x8a\x94\x14\x5b\x71\x9f\x9b\x50\xb5\x3a\x54\x90\x47\xb0\x0e\x6a\x76\xac\x1b\xb8\x4d\x36\xd3\x2c\xf9\x8a\xdc\xef\x23\xad\x5b\xc1\xdd\x5d\x50\xcc\xa1\x5b\x55\x98\x5c\x1c\xe3\x52\xfb\xc6\x71\xab\xb5\xa5\x93\x24\xbe\xc6\x3b\x51\x49\x10\x69\xb1\x31\x36\x62\x2f\x2e\x4e\xea\x82\xb9\x1e\xe7\x18\xd2\x22\x7b\xc7\x69\x0d\x41\x6a\x8c\x8d\xd4\x4b\x2b\x08\x52\x14\xfb\xb8\xa3\x20\x5f\xa4\x59\xd2\x60\x7a\xbe\x70\x91\x43\xbc\x2c\x40\xf0\x02\x44\xa1\x76\xaf\xd4\x18\xa3\xdc\x41\x2f\x4a\x7d\xbd\xc3\x74\xc3\x55\x68\x8a\x7e\x41\x65\x30\xc5\x74\x52\x12\x80\x42\x6d\x67\xc2\x4e\x47\xf2\xde\x57\xb0\x1d\xfb\xb5\x8b\xe3\x71\x2f\x8e\x06\x23\x08\x8f\x91\x65\xa3\x8b\x18\xe3\xa8\x4c\xae\xa2\xe8\xbe\xd6\xcd\x39\x0f\xb6\xbc\x9c\x09\xe5\xfd\x1d\xea\x36\xf3\x2c\x38\x04\x92\xa9\x05\xa9\x38\xda\x1b\xc7\x5c\x9c\xc8\xf5\x35\xa4\x35\x9e\xe1\x9d\xcb\x85\xd6\x64\x2e\xb8\xf1\x00\x62\x41\xf1\xc3\x98\xf3\x96\x15\x50\x57\xb4\x4d\x71\x51\x16\xbf\xe3\x35\xdc\x2f\x8c\x06\x45\xaa\xf3\x60\x9e\xf8\x0b\xf6\xd5\x63\x8d\xeb\x4d\xfb\x22\xf4\xbb\x4e\x04\x98\xda\x57\x28\x0b\xc9\x8f\x83\xd3\x34\x05\x17\xcd\x23\xe7\x71\x32\x63\x89\xab\x99\xe3\x4b\xb4\xb6\xae\x66\x99\xe6\x9f\xc7\x6a\x33\x8c\xab\xf9\xe7\x69\x1c\xae\x38\x1b\x63\xf8\x59\xf1\x9a\x50\xb2\x88\x7f\x7d\x13\x45\x2c\x11\x96\xfa\x6f\x20\xe2\x62\x87\xbf\xfa\xd6\x9f\xd5\x97\x4c\x3d\xf2\x4f\x04\xdd\xa4\xc2\x42\x57\x11\xa6\x42\xe1\x54\x2c\xe7\x7c\x11\x07\x06\xfc\xd9\x6c\xff\x8a\x45\xfc\x5d\x90\x72\x86\x2b\xa7\x09\xc3\x90\x86\xd2\x66\x46\x47\xf8\xf8\xb5\x78\xad\x61\x71\x9f\x62\x6e\x7a\x9b\x2a\x51\xbc\x1b\xf3\xce\x79\x3c\xbb\xad\x72\x67\xe1\x27\x17\x41\xe4\x6a\xe6\xf2\x66\xbc\xf4\x67\xb3\x20\xba\x10\x0f\x25\x66\x15\x38\x33\x56\xd3\x5e\x57\xbb\x0c\x66\x33\x16\x8d\xc5\x0a\x9d\xab\x5d\xf9\x89\xde\x6e\xa3\xd3\xd7\x16\xd1\x86\x64\xd0\x7c\xac\xd2\x18\xb7\xaf\xd9\xf9\xb7\x80\xb7\xf1\x54\x95\x18\x21\x2e\x5e\x34\x32\x6e\x2f\xe2\x5f\x1b\xb2\x49\xd1\x43\x50\x5c\xcf\x5a\x5b\x6c\x8e\xa4\xfc\x24\x5e\x7a\x0f\x02\x89\xbb\x3a\x3d\x32\xf5\xc3\xa9\x5e\xa4\x19\x9c\x4a\x60\x74\x5b\x34\xdd\xd0\xfe\xa2\x75\x0d\x92\x6d\xd8\xac\x0a\x1f\x22\x25\xc6\xb8\xbc\x87\x88\xdc\xb4\x61\x78\x7c\xd7\xd4\xc5\x14\xae\x76\x1e\xc6\xd3\x6f\x63\x4d\x53\x1c\xdd\x54\xe7\x58\x5c\x11\xd3\x7e\x14\xec\x3d\xa1\xbc\x73\xc9\xfc\x59\xe3\x96\x50\xe0\xe7\x5e\x9a\xbe\x0b\xa2\x6f\x5f\xeb\xd4\x63\x34\xdb\x06\xc8\xca\xb6\xcd\x84\x85\x18\x2c\x47\x1d\x9d\xab\x14\x11\x6b\x98\xeb\x58\xd3\x44\x5d\xad\xb4\x91\x39\xb2\x8c\x45\x0d\xb8\x6e\xda\xe2\x15\x29\x03\x56\xe8\x94\xc2\xce\x66\x01\x07\xb7\x99\x50\xc2\x93\x15\xdb\x5c\x26\x5d\xb2\x30\x9c\x5e\xb2\xe9\x37\x42\x09\x1e\x39\xdc\x0c\xef\xaf\x78\x3c\x8d\x17\xcb\x90\x61\x10\x88\x78\x3e\x7f\x0c\x3c\xc6\xc7\x7a\x34\xb8\xbf\xe4\x7e\x28\x4e\x33\xe1\x0d\x86\x1b\x4b\x24\xb1\x68\x29\xbb\xe1\xe7\xf1\xcd\x66\x58\xee\x9f\xa3\xd7\x49\x28\x69\x5b\x35\xd0\xb2\x4e\x98\xfa\x09\xe3\x22\xf0\xa8\x2b\x0e\xc3\x0a\x9b\x3e\xae\x88\x74\x21\x76\xac\x9b\x07\x73\x1d\x67\x31\x59\x5d\xcd\xea\x2f\x6f\xc4\xb3\x3c\xff\xda\x0e\x83\x0b\x9f\xaf\x12\x96\xca\x31\x5e\x52\x33\x4a\xb5\xb4\x6f\x5d\x79\x80\x79\xac\x65\x79\x37\x99\xc2\xb9\xbe\x0c\x38\x6b\x63\x65\xae\xb6\x4c\x58\x59\x3d\xad\x38\x8c\x20\x81\x5e\xdb\x0a\x16\xcb\x38\xe1\x7e\xc4\x61\xac\xa0\x32\xa8\x49\xa3\xe4\x42\x85\x27\x75\xad\x2c\x23\x2b\x29\xad\x2c\xcc\x5b\x49\x2b\x3f\x84\x01\x0f\x6d\x57\x10\xe0\xdc\xed\x49\x58\x38\xcc\xe8\xd0\x85\xcc\x50\x89\x49\xde\x93\x91\x2c\xe2\x2b\xf6\x5b\x71\xb0\x68\xf6\x5b\x51\x4c\xfd\x68\x5a\xe0\xcb\xd3\xb1\xe0\x0d\x01\xaa\xf8\x5e\xbc\xbc\x7d\x52\x69\x71\xae\x59\x15\xc7\x59\xee\x93\xca\xcf\x92\x78\x49\x68\xe3\x65\xcd\xcb\x04\xcf\xf0\x67\xc7\x10\xe8\x96\x75\x6f\x64\x82\x58\xc3\xf4\x8d\xdd\xce\xe2\xeb\x28\xa3\xe5\x55\x3c\xbb\x7d\xcb\x6e\x5f\xc7\xd7\x51\x03\x45\x89\x58\x77\x48\x1b\x94\xe6\x2c\xb8\x22\x55\xa8\x4e\x30\xf3\xc4\x92\x8c\x9b\xc4\xd7\x6d\xf0\xd5\x52\x52\x85\xa9\x68\x82\xca\x80\xcf\x7d\xa6\x79\x70\xc3\x66\x75\x57\xa0\xd1\xc4\x83\x7e\x6a\x30\xf1\x98\x4d\x2a\xcc\xad\x8e\xcd\x8c\x32\xd9\x1a\x1e\x2f\x85\x87\xfa\xca\xbf\x68\x36\x16\xf8\xb6\x7d\xee\x5f\x90\xa6\x22\x0f\x34\xb0\xd6\xa0\x47\xd9\xe1\x9a\x3e\x92\xad\x12\xf1\x45\x8a\xf4\xd6\xe9\xc9\x37\x34\xe7\xe4\x1e\xc4\xe1\xac\xb1\x71\xf3\x38\x9c\x91\x0a\x5c\xa1\x5b\x79\xbc\x44\x90\xf6\x3c\x4e\xc0\x0b\xc9\x2f\x28\x21\x95\x32\x9b\xb9\x50\x93\x8a\x5a\xb7\x28\x44\x46\xb1\xa1\x92\xec\x52\x45\xb5\xe6\x15\x40\x0b\x94\x8b\xdc\xcd\xc4\x6f\x20\xa7\x80\xd4\x28\xae\x8b\xed\x26\xcc\xdf\x3c\x3a\x0a\x70\x05\x72\x44\xae\x9f\x30\x9f\xd4\xc1\x2a\xbc\xc3\xe0\x30\x41\x18\xf0\x5b\x25\x34\x0f\xc9\x74\x01\x99\x21\xbf\x71\x92\x4b\xce\x97\xe5\x3b\x2f\x6d\xd3\x34\x9f\xa7\x57\x17\x44\x6e\x72\xbe\x52\xf2\x03\xf3\xa4\x4d\xd3\xa2\x0f\xc7\x7a\x40\x09\x94\x54\x6d\xbc\xba\x28\x36\xee\xd7\x38\x5e\xb4\x45\xbc\xa4\x38\x21\x05\x90\xb2\xc3\x70\xb3\x08\xa3\x94\xd0\xc0\x58\x0b\x21\x2f\xbf\x20\x94\x58\x1d\xab\x54\x59\x85\x45\x0d\x53\x2d\x1e\x2f\x61\x46\x16\xb2\x39\x87\xbf\x6b\x99\x88\xba\xf9\xc4\x4f\x2e\x58\x93\x9f\x09\x2a\x04\x7b\xc9\xa8\x43\x17\x5a\x5c\xbc\x99\xa5\xcd\xf1\x75\x03\xfa\xc7\x38\x4c\x65\xf8\x07\x5b\x99\x39\x37\xcb\x9b\xcc\x47\x59\xde\xa8\x56\x2f\x6f\xc6\x32\x04\x91\x78\x88\x97\xfe\x14\x39\x60\x36\x51\x27\x3d\xdc\x7d\xe9\xe1\x66\x4b\xb7\x6b\xc5\xac\x58\xba\x89\xfc\x06\x63\xcc\x6e\xf8\x9b\x68\xb9\x52\xdc\x11\x91\xba\x0e\xf3\x42\x27\x0a\xa0\xc9\x1a\xe1\x24\x35\x3b\x3d\x56\x9f\xf9\xa7\x8c\x1f\xc4\x11\x3f\x40\x7f\xb1\xe9\x74\x69\xd9\x1b\x9d\xe7\xb0\xac\xc9\x5b\x15\x96\x06\x30\x1e\xab\x18\xfa\x1e\xbf\xbb\x53\x27\x13\xf1\x40\x5b\xf1\x2b\xc1\x06\xca\x2e\x9a\x29\xab\x1c\xa9\x5e\x43\xdd\xa6\xf6\x7e\x12\xf3\x9c\x4f\x49\x58\x3e\x96\xbb\xa3\x3f\x34\xef\xba\x4c\xd8\x9c\x50\xd6\x34\x41\xcb\xd7\xd7\xe4\xbe\xed\x7c\xb2\xbb\x71\xb6\x85\xa5\x0d\xb9\x1d\x7f\x0d\x46\xb9\xf3\xaf\x82\xb1\xb4\x87\xaa\x86\xf1\x11\x0c\xc0\x01\x52\x5b\xf0\x29\xce\x02\xcb\x7b\x59\xd7\xa2\xc4\x55\xac\xda\xc1\x43\xb5\xe2\x81\x6f\xf5\x8a\xbf\x26\x33\x37\x77\xbe\xba\x0e\x01\xf7\x91\x3f\x4e\x02\x70\x7a\xf4\xff\x91\xf7\x6e\xcd\x8d\x2b\xeb\x62\xd8\x53\xca\x6f\x49\xa5\xf2\xe2\xca\x79\xa1\x70\xf6\xd1\x02\x16\x41\x0e\x40\x49\x73\x21\x07\xa3\x4d\x51\x97\xa1\x34\x92\x46\xa4\x44\x8d\xa8\xd1\x9e\x05\x92\x4d\x0a\x43\x10\xa0\x1a\xa0\x44\x69\xa4\x6d\x57\xca\x76\xe5\x24\xb6\xe3\xa4\x5c\xb6\x2b\x39\x89\x9d\xe4\x38\xc7\x4e\xb9\x52\xb6\xeb\x54\x6e\x3e\x4e\xaa\xf6\xca\x7b\xfe\xc3\xfe\x25\xa9\xbe\x01\x0d\xa0\x1b\xe4\xcc\x5a\x7b\xfb\x54\x65\x6a\x69\x91\x04\xba\xbf\xfe\xfa\xeb\xdb\xd7\xdf\x35\x7f\xb2\x4b\xa0\x02\xe1\x7c\xc7\xf0\x72\xba\x3e\x02\xe1\x56\xd2\xde\x7d\x39\x3c\x53\x46\xf2\x79\x18\x4b\xe1\x8b\x31\x4e\x41\xce\xc1\x3d\x01\xbb\x39\xb1\x47\x02\xf1\x9f\x0c\x36\x29\xbe\x24\xec\x64\x4c\x8a\x45\xa0\x71\xe9\x25\x21\x0b\xfc\x51\x17\x40\x8f\x6a\xe4\xb6\xd0\x88\x35\x6b\xd9\xd8\x12\xf1\xbb\xdc\x79\x41\x24\x94\xe9\x78\x1c\xcc\x49\x6c\x04\xc2\x86\xeb\x00\x2f\x8c\x63\x72\xb0\x1b\x2f\x35\xdb\xfa\x42\xcf\x29\x50\x26\x5f\x74\x72\x56\x81\x32\xfe\x8c\x2c\x91\x45\x1a\x42\xb9\xa0\x37\xc2\x2b\x37\xfe\x46\x02\x7b\x55\x23\x2d\x2e\x86\x99\x1f\x19\x24\x0d\x94\xf4\x2a\x0f\x2a\xe3\xa4\x64\x10\xa3\x0d\x71\x31\x6a\x58\x3f\x91\xbf\x32\xa5\x40\x20\x40\x33\xc2\xee\x5f\x03\x91\x73\xf5\xb7\xe8\xa2\xf3\xa6\x5e\x2b\x56\xac\x0b\xa2\x4e\x44\xa8\xa8\x39\x7a\xf8\xa0\x7f\x0d\x06\x33\x17\xb4\xc0\x00\xda\x77\x39\xbb\x6c\x1c\x05\x21\xa1\x60\xa4\xaa\x25\x90\xba\x35\xf0\x06\x8c\x80\x9a\xe9\x72\x3c\x7e\x2d\x36\x7f\x49\x94\xa4\x07\x19\x65\x0f\x53\x7e\x96\x3a\xb0\xc2\xa7\x1c\x5a\x21\x5a\xd6\x92\xe6\x31\xa7\x38\xe4\x07\x56\xc2\xa8\x91\xaf\x1c\xda\x87\x31\x2a\xd1\xab\xc8\x66\x1d\xda\x77\x1d\x12\x2a\xb2\xe5\xdf\x05\x9f\x54\xa8\x3b\x39\xa7\x23\x25\x5d\x53\x48\x19\x6c\x09\x79\xcd\xeb\xd0\x39\x12\xb2\xb5\x8d\x0a\xd4\xa4\xa5\x2c\x2e\xae\x12\x07\x99\x58\xc5\x17\x80\xb0\x8e\xce\x8f\x14\x1a\x4e\x23\x47\x95\x43\x19\xba\x65\xf6\xdc\x21\x2b\x07\x8a\xca\x74\xfe\xed\x2c\x9a\x24\xe6\x10\x4e\x20\xdb\xf4\x42\x35\xa7\x69\x39\xec\x09\xb0\x83\x19\x04\x09\x54\x04\x0b\x02\x5b\x93\x30\x23\x19\x6a\x5b\x92\xe2\x96\x72\xa4\x30\xb8\x3c\x2f\x82\x41\x0f\x4a\x71\xfe\x6f\x4e\xe1\x43\xcb\xfe\x0c\x97\xa8\xe8\x02\x62\xcf\x42\x9f\x93\x85\xb2\xcb\x48\xfa\x31\x8f\x40\x7b\x6a\x7b\x8b\x3a\x18\x4c\x6d\x2f\xd1\x43\x5c\x29\xd3\x4b\x54\xac\x74\xe7\xc3\xb1\x8d\x0f\xc6\x4c\x2b\x5c\x60\x11\x55\xf9\xa0\x94\x21\x98\x02\x3b\x54\x4d\xc3\xd0\x8a\xca\x47\xa8\x68\xfc\x93\x04\x8d\xb2\xf2\xa2\x08\x28\x5f\x70\xcb\x0e\x80\xeb\x78\xe0\x67\xea\x4f\x8f\x82\x53\x44\x4d\xa4\x67\xbc\x62\x44\x13\x3e\x55\x30\xa1\x36\xfa\x20\x68\x37\x86\x74\x4e\xce\x3b\x10\xdf\x6f\x72\xa4\x21\x84\x36\x4c\x45\x28\x64\x00\x78\x32\x41\xde\x7e\x2a\x24\x27\xf0\x33\xd3\x30\xb0\xf6\x06\x35\x8b\x7e\x24\x5d\xbd\x72\xa9\x1f\x75\x50\xd3\x61\x99\x91\xca\x12\x11\xc0\xc7\x1a\xfa\x53\x7f\x9a\x18\xd3\xcc\x6d\x23\x0d\x35\xd5\x7f\x71\x79\x56\x4e\x20\x2d\x91\x68\x01\x6e\x47\x18\xe3\x07\xdf\x9f\xec\xda\x38\x2a\x62\x2c\xd0\x88\xb8\x1f\xdb\x05\xf9\x70\x33\xd8\x50\xb8\xf2\x5d\x34\xbd\x0b\x66\x8f\xfe\xc4\x5b\xfc\x48\xb4\x65\xa9\xcb\x5e\xc4\x49\x01\x19\x87\x91\xb1\x01\xe3\x26\x10\xe7\x13\xcf\x58\xc8\x52\x62\xcb\xed\xc7\xc5\xe2\x3d\x9e\x40\x24\x2c\x5b\x74\x3b\xbb\xf7\xfa\xf4\xfc\x0d\xb6\x9d\x09\xf0\x70\x1a\xd5\x4f\x34\x3c\x0e\x7f\xb4\xd1\xa0\x85\xb1\x52\xfc\x4b\x6c\x6e\x83\xef\xb2\x4f\x3a\xd7\x13\x40\xa5\x6b\x2d\xff\xee\xd4\x27\xe7\xb4\x0a\x12\xac\x0b\xb6\x98\xa5\x66\x74\xaa\xa6\xe9\x20\xcb\xc4\xe4\x1c\xda\x62\xb4\xb3\x6c\xb7\x88\x0f\x25\xfd\xc9\xd8\x05\x52\x36\x5b\x66\x1a\x18\x31\xe5\xf8\xfd\x6d\xc4\x5f\x90\x78\x74\x4e\x79\x58\x0e\x26\x36\x0c\x77\x5d\xdf\x87\xdb\x0e\xea\xa3\x9a\xac\x92\x98\x3e\x65\x26\xb3\xe6\xec\x07\x52\x30\xbf\x97\xd6\xaa\xa5\x8a\x9f\xfa\xd3\x43\x6c\x3e\xc0\xac\x11\xe3\x57\x84\xf4\xf4\x2d\xab\x5f\x0a\x85\x62\x68\x62\x82\x40\xd5\xf2\xb2\x26\x30\xdf\xc0\x05\x40\x30\x58\xac\x97\x08\x58\xda\x07\x27\xa8\x69\xb0\xc8\xcf\x5e\x3a\x03\x03\x4d\xc7\x66\x4a\xa9\xe2\xa9\x5d\x85\x0a\x99\xf0\xdd\x85\x7e\x72\xac\x4b\xba\x1c\xe9\x9f\x15\x16\x61\x4e\x21\x74\x4e\x5b\x89\xe5\x42\x36\xc0\x77\x60\x18\xe6\x54\x0b\x99\x51\x43\xb2\xd6\xa9\x3f\x2d\x91\xd6\x72\x67\x2b\xbf\xf8\x32\x4b\x3e\x69\x52\x9a\xe1\xf2\x93\x4b\x45\x26\x09\x67\x7d\x97\xcd\x9a\xef\xb3\x4d\x15\xa5\xa3\x9c\x33\x8d\x16\xf4\x35\xb1\x88\x17\xb0\xd2\x10\x17\xca\x63\xa3\x49\x89\xe5\x59\x68\x52\x5e\x07\xf4\xcb\xa7\x45\xbc\x33\x2d\x96\x19\x11\x7c\xed\x8a\xd4\x43\x68\x43\x4c\x99\x05\xe3\x41\xe5\x77\x51\xd1\xee\x2a\xbc\x2c\x7e\x79\xaa\x25\xf7\xa6\xe4\xf5\x26\x94\x5d\x6f\x00\x77\xbd\x39\xa5\x8b\x4d\x65\x92\x49\xf4\x70\x2b\xbe\x99\xa9\x21\xf7\x3c\x71\x17\x02\x91\xcb\xbc\x74\xeb\xcf\xbb\xc9\x4a\xbb\x95\xd3\x61\xde\x6a\x92\x37\x7a\x16\xf6\x3f\x3d\xf3\xf0\x44\xa5\xf1\x6f\x12\x73\x57\x6e\xd9\xc6\xd1\x27\xed\xb0\xb1\x92\x1e\x44\x6a\x00\x4a\x25\xb8\xd9\x17\xb1\x35\xa4\x05\xb4\xd4\xb6\x10\x5b\x15\xaf\x24\xb7\x40\x2a\xbd\xe5\x34\xbe\xbc\xc3\x6d\xa2\x68\x7a\xab\x89\x61\x52\x4b\x49\x01\xd2\x9c\xa9\x62\x06\x6f\x62\xbe\x9a\xc5\x5a\xd0\x33\xee\xca\xfe\x53\xf1\xcf\x87\x4e\x4d\x47\x87\xd4\x9d\x20\x8b\xed\xef\x04\x93\x2c\x6c\xad\xb6\x3c\x29\xd2\x70\x6a\xe9\xc1\xcf\xf2\x97\x0b\x68\x80\x1d\xdd\x16\xcd\xa0\x2c\x90\xc5\x0d\x0b\x27\x4f\x8e\xe1\x67\x72\xa7\x58\xb4\x42\x48\xf7\x17\xcd\xb3\xd7\xd9\xd5\x81\x16\x2b\xdf\x35\x4e\x6e\x94\x19\xd5\x5c\x45\xf2\x37\xad\x83\xcc\xfa\x8d\x30\xe4\x15\xdf\x8b\xc7\x7d\x89\x09\xc8\x01\x14\xcf\xc1\xf4\xfc\x5f\x16\x03\xd6\x87\x9f\x86\x03\x83\xf2\x97\x6f\xf6\xa7\x67\xc8\xd7\xb7\x2a\x80\xb5\x60\xe6\xf3\x67\x61\xda\x61\x84\xb9\x36\x40\xde\x33\x75\xc5\x0a\x99\xef\x29\x8d\xf9\xbe\xed\x0c\xb0\x25\x36\xf0\xfa\xe8\x20\xc2\x09\xa2\xe0\x08\x84\xd8\x14\x5b\xc1\xd1\xdd\x2c\xcb\x49\x4c\x61\x52\x71\x87\x55\x00\x03\x96\xf2\x66\xe8\xbb\x03\x96\x56\x38\x01\x85\x7a\xae\xa4\x7d\x9b\x75\x28\x8b\xa9\x00\xb5\xa7\xa7\xd8\x13\x18\x51\x47\xf7\x65\x13\x8a\xb1\xec\x69\x82\xeb\x5e\x66\xa9\x32\x1f\x3d\x91\x48\x58\x77\xe3\x90\x1b\xa2\x53\x3b\x2b\xae\x4e\xdf\xf9\xae\x2d\xa3\x76\xfd\xda\xad\x5d\x33\x0f\xd7\xbe\x05\x8a\xd7\x38\x1c\xd7\x8a\xe5\x69\xe8\x93\x33\xc5\xef\xa3\x07\xfe\xea\x6a\x6c\x9e\x6f\x59\x7d\x0d\xaa\xb6\xee\x6b\x38\xc8\x57\x42\x08\x4d\xbd\x15\x82\xd5\xd5\x20\x53\x3e\x40\xe5\x03\x61\x79\x7b\xc5\xf2\x57\x57\xed\xc8\x7b\x91\x46\x5f\x18\x82\xb0\x7f\xcd\x82\x1f\xa8\x7d\xe2\x89\x30\xd3\xbe\x30\xab\x7d\xd7\x1f\xa9\x4a\xc3\x9f\xb9\x03\xef\xbb\xb0\x80\x4b\x63\xf3\x7c\x6c\xba\x50\x2d\x28\xc5\xbe\x56\xc3\x59\x34\x9f\xec\x15\x6b\xb6\x99\x9e\xbe\x89\x15\x3d\xd3\x6d\x4d\x9f\x65\x23\x44\x88\x17\x82\x8d\xfa\x92\x28\xad\x55\x6d\xcb\x4e\xb8\x1f\x45\x3b\xa8\x2a\xe9\x8e\xf6\x2d\x3d\x59\xd4\x07\xe2\xd7\x90\xc2\xa5\xf6\xef\x08\x17\x44\xf7\xec\x39\x84\x26\x83\x97\x2b\xa1\x49\xdc\x02\x32\xd7\x84\xa4\x0d\x19\xaf\xbf\x57\x05\xef\x53\x71\x55\x72\x21\x64\x37\xbb\x44\x49\x4d\x13\x9b\xb6\x09\x70\xc8\x14\x11\xa1\x91\x03\x27\x8b\x49\xba\xb0\x26\xa7\x60\x1f\x5d\x01\xa2\x88\xae\x59\xcd\xaa\xe0\xbe\x70\x09\xa2\xf5\x7a\x95\x67\x82\xc0\x4f\x9b\x6c\x5c\xa1\x48\x4e\x6a\xc9\x6f\x33\xab\xab\x71\x42\x12\x61\x81\x4d\xf9\xab\x4b\x70\x55\x95\xed\x6f\xd8\xce\x0e\xe4\xdc\x01\x59\x60\x27\x9e\x38\xf8\xca\x96\xa3\xe3\x41\xc4\xae\xbb\x6e\x46\xc4\x85\xa3\xc0\xad\xc8\x77\xe9\xd8\x89\xeb\x4b\x7c\x08\x4b\x85\x35\x0b\x8f\x5c\x59\x4d\x8d\xc5\xfe\x4e\x2e\x67\x23\x6b\xfd\xca\x2f\x4d\x90\x14\x44\x2d\xba\x99\x3e\xd1\xa0\x7d\xd2\xce\x12\x71\x9a\x0e\x17\xc9\x50\x4a\x66\xe4\x03\xc8\x73\x63\xe9\x88\x33\xf1\xd9\x03\x79\xea\x49\x18\xb8\xc5\xc4\x93\x54\xd4\x6a\xa1\x88\x76\x30\x43\xbb\x04\x9f\x4c\xa9\x11\x66\xb6\x35\x69\x37\xf8\x40\x2e\xb1\xee\x25\xed\x1b\x19\x47\x12\x06\xba\xa1\xe9\x4e\x19\xcc\x43\xe0\x0d\xd4\x50\x0f\x05\x7e\xb1\x62\xb1\xc8\x02\xf5\xbc\xef\xba\x87\xf6\xfc\x93\x28\x4f\x40\x56\x4e\x98\x16\x77\x65\x44\x04\x4b\x49\xad\x4a\x72\xc0\x58\x7e\x9e\x23\xd0\x8a\xe4\xd8\xa7\xfe\x54\xa0\x60\x95\xc8\x7e\x92\xb2\x0e\xb0\xb4\x5c\x83\x4a\x84\x81\x5c\xfc\x2b\xed\xbf\x0e\x79\x79\x37\x25\xb2\xaa\xd5\xc2\x37\x10\x1d\x06\x16\x4c\xbb\x9b\xe0\x42\xa7\xfe\x74\xc5\x0a\xa3\x78\xc2\xe9\x77\x2c\x50\x7d\x5a\x3a\xbf\x14\xc5\xa8\x30\xf9\x2f\x33\xd1\xf2\x26\x4d\x4d\x0d\x4b\x5f\x29\x9b\xd7\x70\x64\xf8\x38\xde\xfb\x57\xd2\x3a\x77\xe5\x70\x82\x32\x81\xf2\x1d\xf3\xe2\x58\xb1\x2b\x81\xfe\x4c\x8e\x74\xae\xb5\x5b\x42\x0c\x29\x5a\xb3\xe2\x71\x2a\xa5\x23\x09\x70\x71\x18\x99\xd3\x8e\x2c\x1e\x60\x46\x63\x43\x35\x00\xf1\xd0\xf3\xaa\x9b\xd5\x55\xa6\x22\xcd\x14\xa0\xda\x1b\xc6\x70\x33\xa1\x30\x15\x71\x32\x95\x16\xf3\x28\xca\xa8\xb4\x98\x99\xe6\x42\x5d\x5e\xc2\x8b\x28\xd1\xab\xe5\xaa\x64\xe4\x30\xb8\xd9\x44\x11\x1a\x24\x8b\x26\x56\x7c\x4f\x3c\x5a\xc0\x20\x41\x37\x2e\x0c\xc5\x36\x70\x43\x1b\xd5\x81\x96\x78\x3a\x94\xc2\x1a\xc4\x93\x15\x5a\x86\x96\x8a\xf1\x95\xd8\x3e\xe0\x1b\x07\x97\x72\x34\x1d\xae\x48\x80\xc9\xa7\x34\xd4\xb3\xee\x37\x79\xc6\x2c\xa9\x1e\x08\x38\x3b\x92\x68\x59\xc5\x81\x25\x43\xfb\xd0\x1f\x00\xed\x4b\xdf\x0e\x40\x01\xd7\xc2\xb6\xd4\xe5\xed\xe3\xc3\x4f\xdb\x3b\xef\x4e\xeb\x9f\xde\x37\x3f\xec\xbc\xab\x86\x16\x2d\x7e\xf1\x7d\x9a\x50\x5c\xbc\x0e\x72\x99\xa8\xc9\x81\xbd\x6b\x1e\xed\x64\x60\x09\x55\x74\x8b\x20\xbd\xaf\xef\x2d\x07\xe9\xfb\x04\x5d\xa3\x6c\x5c\x6a\x1c\x83\xeb\x7b\x39\xdb\x48\x9d\xb8\x96\x9d\x90\x34\x46\x89\x78\x2a\xe2\x97\xf9\x93\x50\x87\xba\x23\xd8\x20\xbe\x38\x83\x2a\x28\x3b\x03\xe0\x85\xce\xd0\x01\x50\xbf\xaf\x02\xaa\xa2\xbe\xd0\xe7\xd1\xf7\x0f\x4f\x4f\xf1\xd8\xe2\xf4\x83\x78\x58\x79\x3f\xbb\x2a\x16\xa2\x59\x46\x2d\xc4\x91\xb2\x70\x96\x4e\x8c\x57\x1c\x2d\xab\x58\x0c\x35\x68\x39\x6a\xfa\xfd\x65\xc8\x52\x0a\xc6\xd1\x58\x2e\x61\xd9\x19\x5c\x59\x90\x1b\xad\x84\x27\x5c\x35\x7e\x02\xbc\xc1\xb2\xad\x53\xb5\x54\xba\x2d\x01\x42\x1c\x4d\xae\x32\x38\x60\xa7\xc0\x2a\x89\x19\x41\x42\x96\xfe\x84\x8e\xfb\x45\x4b\xd8\xf7\xf2\x7d\x09\x96\xef\xa5\x74\xf1\xbf\xb7\x68\xfc\xbf\x40\xb6\x8b\xf8\xb5\x00\xef\x22\x01\xdb\x45\x3c\xf1\x2e\x12\xbc\xf1\x70\x29\x4f\xd3\x83\xaf\xdf\x45\x02\xed\x29\xbb\x8d\xc8\x77\x91\xc8\x57\x5f\xcc\x7a\x7c\x9b\xbd\x06\x71\x69\x5c\x76\x2d\x61\xf7\x47\xc9\x52\x42\xef\x24\x2b\x89\x91\xe0\x2b\x15\x90\x02\xa1\xf1\x8a\x44\xdb\xc2\x6e\x03\x25\x99\xe0\x36\x12\x99\x57\x34\x2d\x7d\x2a\x27\x75\x95\x50\xa6\xab\x0c\xb9\x18\x2b\x39\x0d\xd0\x00\xae\x4e\xcd\x11\x0b\x24\xb9\x92\x9b\xf9\x05\xaa\x8b\xef\xbf\x22\x79\x0b\x2f\x0a\x91\x5d\x19\xb1\xdd\xdf\xc2\xbe\x14\xcd\xc8\x45\x6b\x81\xb6\x2a\x6e\x7e\x29\xe5\xd9\xa2\x2b\x71\x96\xce\x69\x1d\x20\x8b\x11\x57\x93\x0a\x84\xb9\xb2\x69\x3a\x0b\x3a\x5a\x5d\xfa\xc2\x59\x34\x25\xd2\xa5\xe5\xe9\xee\x4b\xf4\x7a\x91\x54\x63\x31\xcd\xd3\xad\x4b\xb4\x34\x4f\x79\xdb\x09\xef\x01\x2c\x5c\xd4\xb1\x8f\x00\x5b\x32\x24\xf0\x5f\x79\x08\xfd\x09\xda\x6f\x1a\x58\x28\x54\xbe\xbb\x76\xfa\xd7\x5a\x39\xf4\xdf\xf9\x77\x00\x36\xec\x00\xb1\xb7\x68\xcf\x0e\xa1\x7b\x00\xee\x1f\x1f\x41\x79\x02\x42\xfb\x00\xdc\x6b\xab\xab\xca\xad\x62\xa1\xeb\x02\xe1\x56\x79\xa7\x31\xe6\x4d\x93\x83\x32\x71\xa0\xce\x6e\x80\x22\x38\x9c\x19\x52\x4d\x6c\x6b\x11\xc6\xdc\x32\xf5\xd3\xfe\x82\x06\xb1\x1a\x26\xe1\xdd\xda\xee\x0c\x60\xd7\xea\xec\x63\x2c\x6c\xcc\xfa\x03\x19\xf2\x1d\x37\xc7\xf1\x2d\x95\x5f\x31\x08\xfd\xe9\x7b\xe8\x4f\xed\x91\x4d\x10\xce\xb3\x96\x8e\x4c\xeb\xa8\x36\x68\x91\xd5\x34\xf3\x46\xbe\xb0\xc0\x26\xbb\x2b\x54\x15\xea\x1f\xb9\xb8\x21\xc2\x65\xfa\xb7\x80\x72\x9a\x22\x33\x7f\x49\xfc\x38\x90\x0a\xee\x87\x9d\x93\x02\x9a\x87\x37\x93\x2a\x9a\x3e\x87\x20\xf0\x67\xb0\x0f\xf8\x74\xbd\xc9\xc8\x80\x2c\x35\x78\xf4\xe0\x78\x8a\xb0\x09\xe2\xd0\x81\x02\xd0\x34\x8a\x20\x09\x02\xc2\xfd\xa4\x3d\x5f\x2a\x09\x30\x7b\xdc\x39\xc5\x91\x08\x4f\x69\x9a\x6d\xc1\x24\x85\xfe\xd0\x71\x41\x73\x90\x74\xae\x70\x26\x36\xbc\x6f\xd3\x10\x25\x51\xf0\x40\x00\x3c\x52\xc0\x76\x43\x00\x3d\x3b\x04\xf2\x22\x51\x7c\x93\x2c\x40\xbe\x40\x3a\x9e\x61\x9c\x00\x92\x0f\x7a\x97\x0e\x5f\xc8\x07\x2d\xe4\x83\x91\x45\x29\xa2\x97\x09\x29\x94\x5b\xfd\x2b\x62\x5f\x88\xaa\x2f\x1d\x62\x21\xaa\x4c\x99\x1e\x8e\x71\xe1\x2b\xc4\x36\xb8\xc2\x10\x84\xa9\x4c\xcc\x3c\xf4\x9e\xdd\x1f\x13\x2d\x2c\x4b\xf9\x1c\xda\xbd\x76\xe8\x4f\xb9\x27\x94\x37\x3a\xa5\x2f\x22\x57\xdb\x5b\xba\xb0\x4e\xfd\x29\xdf\x2e\x7b\x4c\x78\x91\x65\x73\x73\xb6\xaf\xed\x29\x20\x61\xde\x69\xce\x77\xee\x79\x79\xeb\xdd\x71\xe3\x80\x2f\x8e\x5d\xec\xb2\x50\xb6\x5c\xc7\x1b\x37\xee\xfb\x2e\xf8\x64\x5d\x9a\x86\xa1\x9b\x86\x41\x7b\x31\xb9\x3f\xf6\x1a\x71\xa1\x4f\x11\x2d\xb9\x67\x19\x92\xa6\x7c\xfa\xf8\x06\x87\x49\x7f\xc6\x44\xd0\x4a\xdc\xff\x63\xef\x78\x16\xe2\x3d\x32\xfb\xe6\x00\xdc\x07\x21\xf4\xc7\x20\xfb\x12\x6f\x3e\x75\x08\xfd\x3b\x54\x28\x31\xa0\x60\x08\xec\xf0\xd0\x9f\x05\xa0\x05\xa6\x3e\x0c\x83\x4f\x51\xf8\xc9\x1e\x70\xdd\xfa\x6c\xe0\xf8\x8b\x6c\xfa\x6d\x54\x88\x19\xd7\xc7\xb5\xf8\xe0\x03\xc0\x75\x4b\xa4\x58\xa6\x54\xd2\x2b\x77\x0a\x81\xeb\xdb\x68\xfb\xb2\x67\x61\x02\xe8\x91\x8f\xae\x53\x7d\x7c\x08\xbc\x73\x82\x90\x9f\x4c\xc1\x38\xf4\xa7\x7c\x81\x2d\xe0\xba\x71\x4f\x02\xfb\x16\x0c\xe8\x46\xc8\x45\xca\x64\x0f\xc8\x5a\xa7\xef\xe9\x8c\xcd\xc4\xd5\xbc\x65\xf9\xf5\x3b\xa7\xfc\x68\x8e\xe9\x7e\x4b\x5f\xb2\xed\x97\x2f\xe2\xf8\x51\x32\x73\x3a\x0d\x9b\xc7\xfc\x7b\x80\xc3\x90\xe2\x31\xd8\x86\xf6\x88\xcc\xf4\x38\x6e\xa8\x3f\xbd\x3f\xf6\x08\x8b\xc3\x0d\x1c\x8e\xfe\x85\x03\xea\x36\x5c\xa7\x3f\x26\x2e\x8c\xa9\xd7\xf8\xe1\xd6\x2c\x0c\x7d\x8f\x7b\x85\x9a\x21\xab\x8f\x04\x47\xc3\x9b\x00\xa3\x14\xce\x56\x1b\xe9\x0c\xea\xc3\x10\x40\xf2\xde\x60\x37\x29\x1c\x3b\x09\x6d\x9c\x9f\xd4\x97\x86\x5e\x59\x8f\xae\x29\xec\xf2\xc6\xd6\x74\x7c\x81\x09\xdf\x93\x2d\x5f\x05\x8f\x8f\x0a\x5d\xf9\x8a\x9e\x56\xb8\xfa\x1e\xa3\x4f\x0b\xd8\x83\x7b\x55\x7b\xe2\xb7\xaf\x27\x5d\xbc\x8c\xad\x2f\x78\x1d\x57\x15\xfc\xa1\xe8\x5b\x3b\xf5\xc3\xaa\x82\xfe\xaf\xe8\x67\x47\xdb\x3b\x2d\x2c\xd7\x51\xa2\xaf\x4a\x02\x50\x42\x42\xc2\xb7\xce\x0b\x61\x25\x35\x42\xbb\x47\xfc\x2e\x5f\x8a\xdf\xc7\xfd\x16\x79\xe2\x73\xa7\x20\x28\x43\x30\x75\xed\x3e\x50\x9f\x7d\x7c\xf6\x6c\xa4\x2b\x0a\x9f\xc1\x96\x9a\xe8\x43\x30\x0c\x98\x72\x91\xfc\x28\x0f\x80\xdd\x0f\x9d\x5b\xec\x46\xa6\x73\x2f\xe8\x6c\xcb\x1c\xf4\x6a\xaa\xe1\x44\xa5\xb2\x3d\x18\x1c\xb3\xd0\xb1\x38\x3a\xb7\xfe\x45\xb1\xdd\xb0\x34\x82\xa5\x89\x3f\x00\x4a\x35\xc1\x95\x59\x24\x14\x3e\xd8\x54\x80\x57\x9a\x05\x8a\x65\x79\xf6\xad\x33\xb2\x43\x1f\x96\x5d\xdb\x1b\xcd\xec\x11\x48\x72\xc2\x9b\x24\xda\x56\x55\x81\xd8\x4e\xdd\x76\x43\xa5\xaa\x90\xe0\xcb\x88\x13\xbe\x9f\x02\x7f\x58\x00\x9b\xa9\x5a\x55\x52\x4b\x7f\xf6\x2b\x15\x7d\x79\xc4\x71\x26\x6c\x37\x7c\x74\xc1\x10\x03\x79\x8c\xc0\x69\xbf\x78\x56\x0e\x41\x10\xaa\x40\x7b\x7c\x54\x81\xc5\xa2\x7b\xc1\x68\x8d\x22\x26\x62\x0f\x1e\xfa\x03\xec\xec\x8b\x7b\x87\x36\x63\x1c\x55\xa6\xe4\x04\x25\xc4\x9d\xc7\x4f\x92\x3d\x4e\x42\xd9\x62\x85\x9a\xc1\x21\x08\xed\xe8\x67\x04\x97\x42\xcb\x83\x41\xaa\x46\x35\x02\xe0\x0d\x82\xd2\xdd\xb5\x1d\x26\x2b\x3d\xfb\x95\x0a\x82\xbe\x3d\x05\x8f\x2f\x4b\x3d\x27\x7c\xec\x41\xff\x2e\x00\xb0\x34\x06\xf7\x99\x1e\x93\x82\x99\x3e\xb7\x11\xe8\xf3\x6b\x3b\x24\x8d\xcd\x06\x88\x33\x2e\xe1\x3d\x39\xc0\xde\x62\xd5\xac\xac\x1e\xb0\xa0\xe6\xbf\x72\x9d\x5e\x89\xf1\x9d\x55\xf5\x63\xbb\xa8\x3d\xd3\x6a\xe1\x26\x94\xef\xe1\x01\xec\x2b\x88\xb9\xa5\x95\xb0\xf7\xaf\x1d\xda\x67\xd0\x55\x43\x1c\x91\xbd\xba\xa8\x32\xd0\x9e\x74\x85\x6e\xeb\x25\x8f\xdb\xd7\x31\xd6\xa9\xb9\xb8\xba\xca\xef\xfc\x9b\x2a\x94\x1f\x08\xca\x08\xda\x5e\x08\x06\x8a\x65\x59\xfc\xdb\xf2\x14\xad\xdf\x00\xdd\xbc\x75\x79\xf5\xc7\xc7\x64\x0a\x58\x29\x82\x05\x27\x28\x84\x70\x06\x0a\xbd\x59\x58\xb8\x03\x85\x81\x8f\xcd\xca\xae\xed\x5b\x50\x88\x5b\x2a\x84\x3e\x8b\x60\x58\xe0\x41\x04\x65\x05\x93\x28\xe7\x58\x7b\xd2\x95\x98\x8d\x20\x61\xe4\xd2\x53\x2d\x1b\x6c\x00\x27\x71\xe2\xeb\x39\x13\x7b\x94\x99\xe6\x09\xf6\x32\x13\x54\x20\x03\x03\xb3\xbc\xcb\x82\xc0\xfc\x76\x1a\x02\xf3\xba\x5c\x1a\x4a\x94\x10\x33\x82\x44\x56\x30\x59\x41\x8b\xd7\x6f\x54\x02\xaf\x8b\xe4\xda\x8d\xbd\x45\x27\xf6\x14\xa7\x9f\x80\xce\x00\x04\x49\x58\x74\xef\x7b\x7c\x04\x05\xc7\x0b\x42\xdb\xeb\xa3\xbd\xeb\xb8\xf7\x19\xf4\x43\x34\xfd\x6e\xc3\x58\xdc\x7f\x68\x4f\xa9\xc4\x4f\x45\xcb\x32\xf3\x2a\x00\xe1\x31\x6b\x45\x05\x9a\x56\x4d\x4e\xb1\x78\x13\x2f\x24\x51\x9b\xf8\x83\x78\xc2\xb0\x08\xb2\xb6\x57\xf0\x31\x16\x24\x4f\x36\xea\x0f\x09\x0f\xda\xc3\xb1\x28\xb3\x33\x84\x63\x54\xd5\x95\x95\x4c\x8d\x52\x1f\xb1\xbd\xa9\xe5\xc6\xf7\x19\x27\xb2\x5e\x5d\x55\xbc\xd9\xa4\x07\x20\xb7\x8f\x5f\x1a\x57\xc2\xc7\xe6\xd5\x26\x14\xf0\xd5\xa0\x2a\x7a\x9a\xad\xbf\x79\x09\x74\x70\x55\x8d\xd8\xf0\x18\x5f\xd9\x1a\x68\xc4\xac\x3d\x99\x2f\xb8\x60\x69\x6a\xbb\x20\x0c\x81\x6c\x84\x69\x82\x0a\xd9\x20\xa7\x1e\x62\x2a\xe0\x4a\x0e\xbd\xc6\x93\x8f\xf7\xa4\x11\x2b\x7a\x1a\x84\x7e\x7f\xdc\xe0\x5e\x95\xfb\xbe\xd7\xb7\xd1\xd4\x00\x5a\x94\x9a\xa8\xe0\x78\x05\xc0\x92\x3f\xc4\x7e\xd7\x24\x10\x79\x70\x64\x1f\xa9\xbe\xf6\xf8\xe8\xbf\x36\x1e\x1f\xfd\x37\x95\x8d\x0d\x2d\x61\x53\x47\x9d\xdd\x0b\x58\x2e\x83\x40\xd1\xae\xe2\x74\xe5\x45\x05\xcf\x8c\xcb\xf0\x2a\x0e\xfa\x0c\x2e\xfd\x2b\x96\x1a\x22\xc2\xd4\xf3\xe1\x04\x73\x7a\x8d\x76\x9b\x94\xa8\x91\xa4\x1b\x82\xfe\x5d\xfa\x57\x56\xa0\x3d\x3d\xc1\xd4\xa5\x3b\x9d\xbd\x8c\xc4\x3b\xe0\x2a\xe2\x15\x91\xbe\xd8\x2f\x51\x4b\x94\x8e\x9b\x5f\x28\xe2\x11\xe6\x16\x89\x8d\x06\xac\xe0\xc3\xcc\x6a\xf1\xa7\xf7\x25\xdf\xa3\x71\xd1\xd2\xb3\x29\xc1\x89\xaf\xac\xa0\xed\x62\x16\x80\x12\x65\x68\x4b\xe4\x46\x5c\xc2\x81\x12\x53\x35\xc5\x2c\x37\x86\x80\x19\xee\x38\x10\x5b\xc9\x46\x2c\xb7\x10\x88\x94\x35\x27\x70\x10\x63\x34\x75\x67\x41\x69\xe2\x78\xb3\xa0\xf4\x00\xa0\x5f\x7a\xf0\xfd\x89\x74\x1b\x44\x35\xde\xbb\xb3\xe0\x10\x95\xef\x02\xe8\x77\x7d\x7f\x62\x45\xb0\xfa\x42\x24\x12\xb5\x1b\xb8\xfd\xa8\x06\x0d\xff\x95\x5b\x85\xc5\x5a\xd1\x33\xfb\x7b\x1c\xa5\x85\xac\x53\x60\x07\x61\xc9\x0e\x1c\xdb\x2b\xd9\x93\x9e\x33\x9a\xf9\xb3\xa0\x64\x07\xa5\xf0\xce\x2f\x91\xf4\x7f\xa9\x25\x5b\xbe\xeb\x97\x21\x18\xd9\x70\xd0\xf8\x3c\xae\xb3\x2a\x18\x3d\x72\xc3\x2a\x61\x06\xaa\xd4\xf7\xbd\x10\xfa\x6e\x1a\xcd\xdb\x90\x5e\xc4\x5e\x6e\x39\x58\x80\x0d\x7d\x97\xd2\x96\x56\xef\xf9\xee\x20\xb3\xc3\xdc\x7b\xfd\x2d\xdf\x1d\xb4\xed\x21\x68\x87\x34\xa2\x03\x5f\x01\xa1\xdc\xc3\x3c\x6a\xba\x6a\xfe\x62\x21\x20\x10\xe8\x7a\xb0\x85\xeb\x23\x64\x96\x58\x2f\xe2\x8a\x1c\x52\xc2\xa3\x00\x75\x03\xbd\xc8\xf4\xa1\xef\x3a\x53\x3c\x7c\x25\x9c\x5d\x53\x4a\xb5\x06\x2b\x77\x8e\x8a\x25\x9b\x1c\x80\xbe\x59\x91\xd6\xdc\x46\x6f\x69\x05\x2e\xdc\xad\x08\xc5\x38\x84\x18\x46\x31\x8a\x82\x2b\xd8\xf7\x59\x28\x0b\x32\x99\x48\x49\x16\xc4\x6c\x29\xd0\x4c\x12\x23\x3d\x59\x52\xc1\xa7\x48\x43\xd7\xfe\x04\x20\xd6\x3c\x28\x31\x61\xb2\x64\x31\xa0\x82\x07\xe0\x9e\x1a\x45\xa1\x59\x8a\x5e\x39\xde\xc0\xf1\x46\x41\xfa\x2c\xe2\x99\x17\x5a\x84\x6c\x07\xf8\xe0\x40\x7b\x78\xf6\x8c\xd2\x42\x78\xff\x45\x54\xd1\x1e\x0c\xb6\xe8\x77\x84\x73\x1f\xb3\xf9\x20\xb6\xcc\xa6\x51\xea\x71\xfc\x7d\x74\x7e\x70\x78\x15\xa6\xd1\x2e\x4b\xf7\x4c\x51\x7c\xfb\x85\x35\x77\x58\x44\x7f\xb2\xfd\x2a\x88\x70\x13\x7b\x5e\x22\xb7\xc1\x52\x00\x6e\x66\xa8\xa0\x60\xc6\x4c\xec\x39\xd1\xbd\xb4\x69\x19\xbc\xbc\x27\x60\xe0\xd8\x84\xea\x36\x04\xa5\x21\xfa\x26\x25\x3c\x2e\x8c\x28\x5f\x87\x60\x17\x7d\x52\x10\xa1\x4d\x19\x48\x7a\x89\x92\xd7\x0f\x6d\xcc\x38\xee\xe0\x72\xa4\x36\x0e\xc5\x4e\x6e\xa2\x7d\xd7\xe9\x8f\xc5\x3b\xa1\x50\x66\x13\xd7\x27\xc1\x13\x7b\x58\x5e\x23\x9a\xa2\x87\x29\x99\x0e\x9e\xa8\x53\x7b\xb4\xdc\x84\x43\x05\x93\x13\x4e\x99\xda\x41\x80\x6e\xce\x25\xca\x67\x89\x98\xdc\xd5\x55\x15\x58\x2b\x54\xda\x1b\xdf\xf1\x67\x01\x80\xf5\x11\xf0\x42\x76\x4d\x3c\xb4\xfb\x85\xe3\x76\xe1\xc3\x33\x6d\x75\x55\x99\xfa\xd3\xd9\x54\x59\xb1\xfc\x32\xa9\x78\x7a\x3f\x05\x1a\x76\x70\x09\x82\xba\x1b\x1e\xe1\xe6\x62\x14\xf0\xe9\xf1\xfb\xc4\x01\x9d\x35\x69\x24\xf0\x0c\x58\x84\xc4\xcf\x88\x03\xba\xfc\x0b\x71\xb8\xcd\x19\x42\x52\xad\x83\x6b\x40\xd0\x07\xce\x2d\x28\x01\xaf\xef\x0f\x32\xbb\xda\xb3\x5f\xa9\xb3\x70\x58\x7a\xf9\x08\xed\xbb\xa4\x9c\x20\xc1\x37\x7d\x97\x64\x17\x87\x3e\x2c\x08\x00\x17\xbe\x2b\xe2\xe8\x4e\x0a\x06\xa9\xa4\x2f\x32\x3b\xb4\x20\x46\x8b\x4c\x43\xc4\x45\x8d\x99\x40\x5a\x7c\xb3\x4b\x48\xac\x93\x35\x7d\x2c\xe4\x96\x55\x63\x22\xf0\xb8\x4e\xcf\x86\x25\x6a\xa2\x28\xd8\xa8\xd3\x3a\x41\xb2\x53\xd3\xd6\x70\xbc\xf0\xd2\xc4\xbe\xc7\xab\xbf\x64\x43\xe8\xdf\x95\x44\x1b\x88\x58\x92\x0e\x32\x90\xfc\x5b\x50\x9a\x44\x7a\x3e\x29\x3a\x59\xcd\x21\x45\x0b\x61\xf1\xb3\x0f\x69\x0a\xaa\x60\x3c\x63\x2e\x4d\x3c\xaa\xd7\xce\x30\x2c\x11\x05\xfc\x02\x36\x0f\x17\x6d\xe2\x92\xf1\x0e\x17\x52\xf9\xa8\xa4\x6b\x78\x3e\xe1\xcc\x7d\xe4\x2d\xa1\x05\x8e\x65\xdd\x0f\x24\x43\x11\x71\x8e\x71\x08\xd0\x64\xb5\x12\xe2\x8c\x96\xab\x8b\xed\x11\x70\xe5\x3b\x1f\x0e\x4a\xd8\x5e\xab\x84\x57\x74\xc9\x05\xc3\x45\xac\x5b\x36\xff\x9d\x25\xe4\xd4\x44\xe5\x44\x4d\x2e\xc3\x2e\x0a\x32\xeb\x2d\xd3\x28\x2d\x28\x6a\x75\x82\x53\xf0\x7d\x55\xb3\x24\x6b\xdf\x32\xed\xb2\x92\x4f\x4f\x49\xa9\x33\x04\xf6\xa0\x1d\xfa\xd0\x1e\x01\x35\xad\x10\xa0\x45\xb0\x68\xec\xbe\xee\xba\xaa\xa6\x87\xab\xab\x61\x9e\x62\x20\x99\xea\x15\xd5\x97\xc5\x09\x24\xc0\x25\x95\x03\x10\x6e\x41\xbb\x3f\x06\x21\x18\x48\x02\x47\x32\xe5\x51\xb9\x97\x2c\x08\xe4\x20\x39\x51\x84\xd0\x5d\x2a\x56\x41\x82\x8c\x6e\x53\x16\x0f\x54\x5a\x10\x67\xe4\xe1\x82\x86\x8a\x49\x24\x44\x29\x49\x28\x1e\x31\x79\xdf\xda\xa9\x9c\x7a\xd9\x0e\x8a\xb5\x5c\x39\xe4\x5a\x18\x2a\x35\xa3\x48\x95\x48\x2f\x34\x91\x89\x41\xfa\xda\x14\xeb\xaf\x02\x55\xa8\x8b\x15\x2b\x6f\x35\xb1\x75\xc2\xcf\x0b\x5d\x2a\x09\x8d\x2f\x1e\xb2\x01\x5e\x32\x9e\x6d\xba\x61\xf9\xa8\x2c\x0c\xb9\x9b\xd1\x61\xff\xff\x64\x54\x44\xd7\x41\xd9\xa8\x2c\x19\x0d\x39\x8d\x8e\x04\x20\x9c\x79\x0d\x7f\x32\xb1\xbd\x41\xc3\xb5\x83\x20\xa5\x6d\xe4\xe2\x6d\xd2\x0d\x75\x04\x42\x55\x01\xde\xad\x03\x7d\x6f\x02\xbc\x50\xd1\x6a\x0a\xbd\x89\x45\x92\x56\xb8\xba\x4a\x52\xed\xc2\xc7\x47\x15\x5a\x5f\x9e\x78\x37\x02\x9a\x80\x9e\xb4\x89\xb5\x8d\x40\xfd\x62\xc3\x11\xb9\x9a\x55\x49\x88\x70\xc7\xaf\x52\xed\x77\x79\x3a\x0b\xae\xd1\x4d\x35\x6e\xb2\x0a\x75\xdf\xdb\x99\x3b\x61\x4a\x84\x83\x0a\xfb\x53\x55\xd3\x9d\xf2\xcc\xc3\x57\x5a\xd7\x8d\x54\xea\xe8\x29\xdf\x85\xbe\xeb\x07\x00\xb1\x8b\x60\xee\x84\x8a\xb6\xba\x4a\xb9\x73\xfc\x5c\xd5\xa2\xa3\x26\x0b\x87\xc7\x1f\x91\x4f\x95\x8d\x95\x13\xbc\xe7\xe7\xe7\x82\xa0\xb3\x96\xc8\xf4\x48\x06\x39\x89\x54\xc6\xfd\x38\x62\xa7\xd2\xd8\x67\xe6\x5e\x32\x1d\x62\xcf\x1f\xdc\xcb\x7a\x93\x21\xe9\xf2\xad\xa2\xc9\x20\x03\x8b\x8e\xb6\x20\xe8\xd8\x30\x95\x17\xda\x52\x58\x3a\x0f\x85\xe5\x9f\x8b\x2c\x48\xd8\x37\x16\x48\x96\x9c\x5a\x44\x65\x3e\x05\x30\xbc\x57\x7f\xf8\xc5\x17\xf8\xf4\x8b\x2f\xe0\xe9\x07\x9a\x87\x5b\xb6\x1f\x09\xc2\xa3\x1a\x16\xbb\xb0\x65\xe6\x7d\x2c\x33\x12\xda\x53\x25\x04\x47\x91\xfd\x02\xe9\x9e\xaa\x44\x69\x49\xb0\xcb\x92\x92\xad\x9f\xf4\xf2\x88\x43\x9a\xe5\x80\x22\xae\x20\x0b\x61\x51\x57\x37\x0c\x2c\x6f\x63\x91\x06\x70\x15\xcd\x9b\xa8\xaf\x0b\x40\x2e\x0c\xdb\x9f\x06\x1a\x4b\xd2\xc4\xe3\x96\x10\xb8\x65\x66\xa1\x60\x44\x28\x40\xf1\x70\x52\x81\x61\x92\xb3\xe4\x46\x3b\x92\xfb\x69\x9c\xc9\x75\x46\x6a\x2b\xc5\x34\x2d\x77\x91\x84\x22\xe4\xdb\x15\x08\x74\xb0\xfa\x86\x69\xb4\x56\x22\x8d\x16\xd3\xb7\xe7\x88\x14\x3e\xaa\x1f\x4c\xb3\xf6\x31\x28\x46\xca\xf7\xd5\x55\xa5\x01\x8f\xdb\x08\xcc\xa5\x79\xb5\x29\xb6\xf8\xa9\x54\xc5\xcf\x4d\xea\x5c\x2c\x7c\x29\xe5\xc7\xd2\x14\x5b\x82\x08\xbc\xd8\x9c\xcb\xf9\x6e\x01\x2d\xc9\x88\x2f\x27\x06\xb7\x80\x7e\xeb\x3b\x74\xff\x5b\x5e\x08\x6e\x81\x44\x20\x46\x7e\x6a\x49\x22\x7c\xc2\x25\x4b\x2a\xa4\x63\xba\x63\x85\x65\x70\x33\xb3\xdd\x40\x85\x5a\xcd\x49\x1b\x09\x20\x24\x62\xdd\x6d\x50\x18\x38\x01\xe6\x90\xab\x05\x04\xa5\xe0\x0f\x0b\x08\x4e\xe1\x0e\xaf\xef\xc2\xc0\x19\x0e\x51\xa9\x21\xf4\x27\x05\xc2\x30\x95\x0b\x05\xb4\x02\x0a\x64\x96\x17\x9c\x00\x6b\xf2\x16\x2c\xbc\xa5\xb8\x2b\x8e\x4a\xce\x72\x1c\x13\x5f\x23\x6f\xa6\x44\xaa\x84\xec\xda\x8e\xb7\x40\xcf\x1f\x80\xd2\x60\x06\xb1\x0e\x5b\xc9\x2e\xde\x84\xc2\x42\xdb\x54\x8c\xf2\x8b\x40\xa9\x2a\x86\x74\x03\x8c\x16\x6b\x1b\x9d\x26\x79\x4d\x67\x73\x67\x2a\xcc\xca\x8f\x4a\x69\xb1\x31\x24\x3d\xd0\x6f\xc3\xf2\xe1\xf1\x59\x7b\xe7\x53\x6b\xe7\xfd\x71\xeb\xf4\xd3\x76\xb3\x5d\xdf\x7a\xb7\xb3\xbd\xa9\x48\xf3\x71\x22\xba\x69\x4a\x55\x5e\x60\xea\x3b\x5e\x08\xa0\x26\xef\x8c\x7d\x0b\xc8\xf5\x6c\x51\x12\x0a\x02\x91\x59\x45\x90\x7c\x50\x79\x3b\x7a\xd2\x70\x7b\x11\xf4\xe4\x0c\x90\x1f\xc4\x32\xa8\x69\xbb\xfb\x24\xbc\xbc\xcb\x69\x37\x0e\x13\xbc\xc4\xc9\x93\x3c\x2e\xe3\x10\xc3\x72\x8c\x89\x2e\xf6\xd4\x09\x53\x6e\x02\x29\xd3\xe6\x72\x88\x4b\xc8\x10\x85\x20\x08\x7d\x98\x19\xaa\x68\x63\x77\xca\xc3\x72\xdf\xb5\x27\x53\x12\x24\x57\x37\xd2\xb6\xe8\x2c\x72\xab\x89\xb6\x1e\xbe\x34\xd1\x72\x0a\x2a\x90\x9c\x11\x26\x0b\xfb\x15\x27\xa3\x6c\x24\x66\x82\x1a\xea\x50\xd3\x23\x40\x6f\xe0\xe3\x23\xfb\x6e\x59\x70\x75\x35\xf6\x7e\xd0\xd2\xde\x79\xa9\x29\xc5\xca\x59\x2b\x86\x6c\x5e\x61\x75\x14\x69\xff\x98\x95\x16\x9c\xeb\xf9\xd0\xcd\x45\xc2\x13\x62\xf2\x29\x11\x9e\x50\x73\x6f\x10\xf9\xfc\xa1\x75\x4d\xea\x7d\xca\x5b\x0f\x42\xd0\x22\x21\x08\x69\x20\x6f\x42\x25\xd2\x70\x50\xdd\xc1\x8a\xc5\x92\x11\xe1\x80\xd6\x7c\xd4\x5b\xec\xd7\xdf\x07\x8e\x9b\xe5\xea\x05\x9c\xe4\xf7\x20\xbb\xed\x4b\x22\x4a\x6b\x7c\xb0\x5b\xde\x64\x17\x48\x66\x9f\x96\x8c\x04\xd1\xbe\xf7\xfa\xc9\xc9\xf4\x49\x65\x0e\xf3\x99\x5e\x28\x38\x9b\xb3\x9c\x2c\xe9\xc8\xb8\x79\x74\xe1\x23\xdd\x2e\x62\x86\xbf\x07\xb2\x5e\x0a\x17\x4c\x94\xea\xe9\x2b\x3b\x49\x51\xca\xed\x25\xdf\x7a\xea\xfe\x0d\x12\x1e\xb1\x31\x3a\x2c\xf4\x1f\xa9\x49\xa2\x1d\xe0\x3b\x47\xb6\x3c\xc1\x20\x59\x81\x46\x3f\x88\xa2\xc1\x3a\x7e\xc2\x84\x39\x60\xa3\x2d\x9b\xf7\x89\x76\xd3\x6e\x6f\xe0\xb5\x65\x64\x53\xb1\xd7\xc3\x10\x4c\xa6\x61\x21\xf4\x0b\xb4\x76\xa1\x67\x0f\x0a\x34\xd1\x81\x52\x8c\x38\x2d\x90\x8c\x58\x3e\xa2\x2b\x83\xcf\xce\x9f\x22\x46\x26\xff\x18\x36\xf9\x99\x4d\x3c\x12\xd4\x07\x91\xe5\x8d\x41\x62\xf0\xa4\x3c\x47\x28\x55\x04\xe6\xe7\xe2\x5d\x33\xe4\x42\x36\x72\xa2\x91\xc8\x43\x85\xba\x5c\x97\xcc\x1a\x7c\x63\x19\x91\xab\x6d\xf4\xfe\x12\x5e\xbd\x06\x5a\x0d\x96\x4a\x5a\xaa\x22\x16\x5c\x64\xb7\x64\xae\x1b\x42\x8c\x16\x0c\x10\x8b\x51\xfe\x53\x46\x88\xa5\xa8\xc8\x1d\x22\x16\x7b\xa0\x26\x9e\x7d\x16\xe0\x33\xb7\xc4\xcc\x09\x1d\xd4\xd7\x06\x89\xa2\x14\x62\xaf\xf2\x90\xa6\x8f\x89\xa3\x4e\xa4\xe3\x33\x39\x25\x6e\x89\x47\x0e\x43\x94\xf8\x96\x05\xd1\x51\xa9\x11\xb7\x79\x36\x67\x08\x14\xac\xa9\x71\x34\xfa\x2e\xd1\x89\x29\x76\x60\x56\x35\x3d\x2c\x95\x9e\x88\xf5\x5c\x72\x34\xae\x9d\x21\xf6\x3e\x55\xc3\xb8\x97\x89\xe6\xa7\xb3\xe0\xba\x6c\x4f\xa7\xec\xa6\x99\x7a\xaf\xfb\x9a\x8e\x31\xa3\xc1\x11\xed\xb9\x8a\x7f\x96\x42\xdd\xa0\xa6\x10\x08\xd9\x37\x06\xf1\x1d\x7d\x6d\xe5\xf4\x91\x59\xdc\xc5\x61\x16\x85\x2e\x54\x51\x2c\x26\x4f\x0c\x2c\x98\xba\x4e\x1f\x08\xb1\x65\x33\x39\xd0\x83\xd4\xb4\x9c\x79\x31\x29\x3c\x44\x2e\x2b\x20\xfd\x2a\x5a\xc1\x13\xdb\x67\x48\x40\x2a\x12\x59\x3a\xd4\x9e\xd8\x2a\xeb\x9c\x92\xb3\xa6\x05\x46\x68\x36\x62\x47\x01\x2c\x1c\x8a\x4f\xdd\x88\x1b\x52\xa1\x94\xb9\x25\x01\x82\xfc\x89\x80\x4b\xe7\x2f\xff\x89\x00\x4d\xaa\x94\xf9\x20\xe5\x76\xbc\xac\x40\x4b\x02\x8d\xa6\x2d\xc8\xce\xce\xfc\x16\xde\xdb\x23\x70\x36\x95\x5c\x7d\x53\xb7\xb1\x84\x3b\x7d\x6d\x51\xd7\x12\xeb\x91\x17\xf8\x98\x8b\x31\xda\xf6\xef\x64\x32\x89\x9f\x86\x53\x51\xca\xa9\xe6\xe2\xf4\xce\xf1\x7e\x67\x54\x5a\xa2\xe9\xdf\x1d\x39\xa4\x8d\xdf\x39\x53\x40\x7d\xde\xb3\xa9\x13\x25\x7b\x9c\x91\x95\xf8\x25\x12\x82\x5d\x0a\x2e\xf0\xe2\x4b\xfa\x55\x79\xe8\xc3\x1d\xbb\x7f\xad\x8a\xdc\x38\x12\x5b\xfb\x1b\x23\x0e\x42\x41\x44\x51\x64\x81\x1b\x51\xe8\x78\xcc\xc7\xa3\x85\xa9\x02\x2d\xa9\x68\x8d\x45\x67\x19\xa6\x29\xdb\x95\x64\x8a\x2b\xd9\xc5\x09\x64\xf3\x25\xe0\xf6\xeb\xae\x2b\xf0\x22\x93\xf8\x97\xc5\x18\x0b\x28\xb6\x94\x1c\x84\x99\xe7\x8b\xc0\xa5\x89\xbd\xa4\x6a\x29\x01\x32\x63\x68\x9f\x11\x75\x24\xcc\xf4\x19\xa9\x6f\xc3\x14\x18\x7f\x18\xb6\xc8\x03\xd9\x22\x60\x25\x32\x64\xcd\xf3\x75\x8c\x54\xd9\x9c\x05\xbe\xb5\x92\x4e\xe8\xc0\xbd\x5c\x9a\xa6\x29\x63\xef\xe5\x29\x27\xaa\xb8\xf8\xf0\x89\xe8\xcc\x0c\x7d\xe4\xd7\xd5\xa1\x0f\xef\x6c\x38\xa0\x73\x29\x27\x61\x9e\x4c\xc8\x42\xee\xe6\x24\x6c\x8f\x90\x83\xac\x85\xc5\xa2\xc6\x78\x97\x98\x7d\x0c\xaf\xde\x44\xf2\xcf\x5b\xdf\x19\x14\x92\x98\x13\x76\x31\x5b\x49\x4b\x70\x5f\xf9\xf7\xe8\x9a\x1c\xa4\x40\x88\xa0\x2f\x75\x35\x97\x89\x51\xd0\xb6\xf6\xf3\x10\x52\xc6\x86\x87\x6f\x10\x8d\x4b\x25\x21\x2d\x5f\x7f\x1b\x2d\x85\xe5\xe4\x47\x0b\x08\x33\xdd\x03\x71\xff\x96\x40\xfd\x8b\x08\xf7\x58\x10\x5e\x5b\xb6\x6b\x71\x1b\x8c\xef\x2b\x9a\xba\xa1\x03\xca\x9e\x65\x5e\x1b\xe4\x65\x8e\xc4\x86\x76\xac\x1e\x66\x45\x8d\xdf\x3e\x76\x38\x86\xf3\xf1\x50\x05\x5a\xad\x64\xae\x44\x51\x4e\xb2\xd8\xeb\x52\x9a\xa7\x8f\x81\x6c\x78\xe6\x14\xb9\xd9\x79\x9a\x09\x2c\x90\x23\x53\x4a\x1d\x28\x92\xd1\x05\x8f\x8f\x86\x1e\x5f\x13\x49\xe6\x2d\xc7\x0a\xad\xb0\x64\x96\x54\xc4\x0d\xfd\x11\x2c\xc2\x9a\xf3\x5a\xb8\xc2\x6a\x4e\xd1\x82\x2c\x51\x07\x6b\x4a\x75\x58\xc2\x97\x4c\x18\x04\xa9\xba\x38\x04\x70\x0a\x81\x20\xc7\xf3\x6d\x18\xbf\x55\x97\x92\x71\x48\xda\x18\x80\xbe\x0f\x6d\x91\xb1\x13\x8e\x02\x01\xb2\xa7\x3c\xab\xc1\x35\x9b\xeb\x3c\x98\x39\xf7\x32\xce\x88\x12\xa5\x6c\xca\x85\x30\x0f\x4e\x9e\x6e\x57\xe0\x43\x98\x07\x2a\xf2\x4c\x94\x80\xe3\x0c\x0f\x33\x60\x22\xdb\xc5\xfc\xba\x71\x00\x2a\x51\x65\x62\xc1\xa8\xf1\x79\xf6\x48\x7a\x6e\xfc\x1b\x7f\xcd\x84\x97\xe0\x55\xd8\x19\xc0\x02\xed\x77\xca\xf7\x21\x02\x92\xb1\x9a\xcd\x00\xcb\xda\xde\x6a\xe9\xea\x02\x2b\x57\x09\x18\x89\xf9\x6c\xd4\xf7\x28\xf0\x88\x88\x91\x8f\xed\x1f\x52\xa5\x49\xc2\x40\xdf\xc3\x99\xfd\xe7\xe1\x04\x78\xb3\xac\x88\x77\xc5\x7c\xe2\x55\x84\xbe\x87\x75\x48\x89\xc0\x1d\x02\x9d\x60\x22\x1b\xb1\xaa\xd5\xa0\x20\xdb\x3f\xd6\xf8\x0c\xfc\x3b\x4f\x41\xfc\xb5\xb4\xc4\x6c\x9a\xff\x1e\x87\x0b\x8c\x93\x3b\x25\x42\xb8\xf0\xb1\x49\x43\x21\x08\x3c\x4d\xa2\xc0\x30\xbb\xe8\x57\x03\x47\x11\xe4\x7a\xa8\xaf\x18\x5a\x0e\x02\xa4\x0b\x1c\xe1\xb8\x40\x52\x8b\xe1\x26\x6f\x11\xa2\x46\x7a\xee\x0c\x2e\xc4\xd0\xd4\x34\x71\x94\xeb\x74\x86\x51\xac\xce\xd3\x6a\x4e\x22\x14\xd9\x77\xf4\xf0\x2a\x79\xfe\x00\x5c\x92\x55\xa4\x0c\x6d\x37\x00\xca\x55\xe1\x4b\xa1\xd0\xf3\xe7\x68\x61\x38\xde\xa8\x5a\x20\xc6\x93\xa5\x9e\x3f\xaf\x15\x0a\x69\x3f\xeb\x6a\x21\x84\xb6\x17\x90\x20\xfa\x7c\x66\xd7\x02\xab\x47\x05\xa2\x95\xe9\x3c\x7e\x86\x91\xaa\x16\x02\xdf\x75\x06\xb5\xa7\xf2\x5d\x1f\xe3\x81\x1a\xa6\x1e\xe0\xd5\x82\xe3\xb9\x8e\x07\x4a\x3d\xd7\xef\x8f\x6b\x85\x02\x42\xbe\x64\xbb\xce\xc8\xab\x16\xfa\x00\x6d\xf0\xb5\x02\x93\xb5\xf6\x6d\xb7\xaf\xf2\xaa\xc5\xa4\x61\x8a\x56\xf8\xbe\x50\xd1\x6a\x85\x02\x06\xc8\xa4\x7f\xc2\xf2\x2c\x57\xe1\x53\x15\xfa\x7e\x88\xf0\x11\x83\xac\x16\xbe\x13\x28\x1f\xc4\xd6\x2e\x35\x01\x90\x58\x04\xb9\x00\x4a\x6c\xe7\xc2\x83\x21\x43\x47\xb2\xf2\xa1\x61\xa8\x16\x0c\xe9\x6b\xe8\xdf\x25\x5f\x13\x57\xe6\x84\xb6\xb9\x5a\x30\xca\x2f\x02\xae\x4c\x46\x79\x5b\xc5\x03\x20\x2b\x41\xb5\xb7\xd5\x02\x3d\xc0\x65\xe5\xe8\xb0\xe7\xab\x89\x6b\x4f\xbf\x1c\x83\xfb\x21\xb4\x27\x20\x28\x60\x64\xd1\x38\x60\x0b\x80\x2f\x05\x7f\x6a\xf7\x71\xba\x61\xb3\x6c\xd4\x0a\x4f\x85\x42\xe8\xf3\x4f\x0d\xfc\xf4\xa9\x1c\xf7\x11\xd5\xb5\x3d\x67\x42\xa2\x11\x78\xf6\x04\x54\x09\xd0\x1a\xff\x3c\x26\x04\x8f\x9b\x80\x52\x5a\xa2\x9a\x13\x02\xf2\xb8\x84\xf3\xdd\xa0\x49\x3b\x74\x3c\x27\x04\x89\x52\xa1\x33\x71\xbc\x51\x89\xed\x17\xd5\x02\xb0\x03\x50\x72\xb0\x5f\x47\x12\x0b\x07\x02\x5a\x24\xba\x16\xd6\x9e\x94\xf4\x26\x7e\x0d\xec\x41\x22\x40\xbe\xa3\x65\x83\x3f\xe5\x6f\x0a\x5c\x9e\x68\xde\x58\x3a\x8e\x50\x14\x39\x28\x90\xd7\x4a\xb6\x6c\xdf\xb5\x83\xe0\xc8\x9e\x00\x4b\xe1\xb6\x12\x41\xc1\xc5\x59\xa5\x49\x3a\xe9\x25\x56\x71\xe2\x6d\x7a\x11\x68\x1a\x49\x4f\x2d\x87\x43\x57\x77\x2e\x20\xe8\xdf\x69\x5a\x2d\xda\x85\xc8\xf6\x43\xd7\x7c\x0e\x72\xb5\xa5\xb6\x95\xd2\x1d\xe8\x8d\x9d\xb0\x84\xb7\x4c\x4a\x05\x3a\x77\xf5\xcc\xce\x5a\x30\x0d\x63\x12\xe0\x4d\xcb\x86\xb5\xd2\xc4\x7f\xf8\x96\x7a\x8a\x9e\xb9\xdd\xf9\x02\xae\x23\x11\x36\x40\xfb\x69\x82\x9a\xb4\xaa\x59\xc8\x84\x64\x12\xa1\x71\x53\x26\x71\xb2\x6f\xa1\x11\x00\x5f\x3b\xab\xb3\x75\xb9\xc9\x4d\xf6\x9c\x01\xb4\x47\xd4\x4b\x90\x9c\x32\x00\x2a\xd2\xca\x4b\xa6\x46\x2f\xbd\x7a\x35\x9d\x4b\x66\x8f\x69\x4c\xe7\xd1\x34\xc1\x3f\x32\x2b\x5b\x92\x27\x3a\x83\xce\x12\xac\xcf\x25\xcf\xaa\xc4\x7c\x15\xcf\x41\x29\xd8\x37\x53\xd1\x95\x41\xcf\x25\x5f\xc5\xa2\x53\x19\x4d\x32\x8c\x4b\x9c\x71\x93\x5f\xff\x39\xc5\xe2\x9e\x0b\x0b\x09\xe4\xad\xb9\x80\x97\xe4\xce\xd2\x17\x05\xa1\x5c\x17\x84\x2d\x70\x0b\x60\x00\x3a\xce\x00\xf8\xea\x8a\x29\xa0\x39\x0d\xec\x29\xb8\xd0\xa4\xf3\x3b\x4b\x8d\x2d\x18\xab\x2e\xb3\xb4\x88\x28\x24\x15\xdc\x21\xce\x2d\x4f\xcd\x13\x45\x1f\x95\xa1\x40\x83\xed\x66\x55\xaa\xa1\x5c\x5c\xaf\x65\xcd\x8e\xa2\x22\x97\xe0\x2a\xa3\x55\x15\x80\xa8\x89\xac\xab\xa0\x7f\x17\xe0\xf0\x21\x97\xe1\x55\x2e\xc6\x64\x1d\x26\x4d\x0b\x62\x1d\xf6\xe5\x95\xee\x58\xa0\xe6\xbc\x0e\x6b\x0e\x4b\xb8\xe6\xf3\xca\x57\x7c\x49\x71\xd0\x2d\x05\x1b\xe3\xfb\x3c\x6f\xac\xe9\xce\xeb\xb0\x64\xae\xae\xae\xe0\x44\x2a\x5c\x2c\x26\xcc\x3f\x32\x19\xa0\xa2\xad\xae\xd2\xea\xca\x47\x4f\x61\x41\xea\x0b\xb0\xfc\xd9\x77\x3c\x55\xc9\xb3\x4b\xa6\x8a\x5b\x51\x86\x89\x34\x92\x40\xe3\x71\xcb\x05\x49\xf2\x73\xe7\xda\x86\xa5\x07\xa1\x28\xa6\x3e\x7d\x2b\x69\x8d\x53\x85\xe6\x49\x00\x65\x50\x93\xb7\xc7\x2c\x46\xba\x63\x19\x35\xe7\x35\xc8\x0c\x9d\x74\xdf\x9f\xa3\x53\x5b\xd1\x6a\x7e\x76\xef\x4c\xd7\x41\x64\xc7\x74\x55\xd0\x71\xc5\xe5\xd7\x83\x45\x27\x29\xfa\x45\x23\xdb\xf2\xef\x54\x5f\x7b\x12\x44\x85\x4f\x77\x4a\xa2\xaf\xac\x39\x43\x35\x78\x63\x90\x6e\x78\x32\xfd\x7b\xa0\xd5\x08\xac\x98\xc6\x8b\x54\xef\x9e\x48\xc9\xc4\xa7\x94\x61\x86\x20\x4c\xf0\x85\xdf\xe0\xa0\xce\xaa\xf6\xc4\x32\xcb\xc8\x7a\x83\xf3\xba\xe4\xf7\xd7\x8c\x37\xca\x3a\x3d\x02\x33\xe6\x76\x52\x75\x03\x3a\x7f\xb2\x89\x29\x75\x98\x30\x93\x88\x9a\x06\xac\x38\x5e\xe6\x49\xdd\x3d\x71\xc1\xc5\x2f\xa1\xee\x90\x1b\xb1\xaf\x07\x35\xf0\x1a\x6e\xaa\xbe\x05\xf4\xc0\x82\xc5\x50\xab\xaa\xbe\x05\xf5\xc0\x02\xc5\x30\x62\x52\x78\x85\x9f\xaf\x0b\x83\xd9\x52\xe2\x35\x97\xd1\xde\x71\xe0\x32\xbd\x8a\xd3\x55\x42\x96\xbf\x95\x6a\x30\xfd\xbc\xb5\x80\x10\xae\x05\xaf\xc3\x5a\x50\x2c\x6a\x0e\xb7\x39\x06\x57\xf1\xc4\xf5\x8b\x32\x2b\xd4\x29\x74\xbc\x50\xb2\x42\x0d\x6c\x5c\x79\xd7\x2f\x07\x21\x31\x92\xc3\x49\xb7\x5f\xc3\x5a\xda\x9f\xf3\x0e\xda\x53\x1b\x73\x97\xd1\x8c\xca\x55\x8d\x64\x4c\x27\xfd\xc9\xc4\x09\xdf\x39\x1e\x60\x76\x90\xec\xc0\xf4\xc0\x1d\x7a\xac\x52\x39\x46\xa0\x7b\x16\x2c\x85\xba\x6d\xad\x98\xb5\xc5\x62\xf6\xa2\xf7\x46\x66\x48\xa6\xda\xd6\x8a\xa1\x7b\xe2\xd7\xa5\xc5\xa0\x35\xdd\x5e\x5d\x5d\x91\x91\x61\x53\x0d\x28\xe5\x66\xbd\x20\xc4\x8c\x8a\xee\x95\x4c\xad\x98\x7c\x08\xd1\x0a\xf1\x2c\xa8\x55\x05\xc5\x49\x96\x58\xd4\x6b\x17\x87\xe3\x4d\xba\xe1\x4d\x5d\x27\x3c\x77\x06\x00\x5d\x1f\x88\x0f\x99\x1a\x44\x19\x44\xd9\xe9\x79\x5d\x2c\x6a\x89\xae\xa4\xf4\x86\x77\x7d\x7c\xa8\xbb\x97\xd7\x57\xf4\xbb\x9e\x57\xdc\x0e\xfa\x8e\x13\xd7\x88\x7e\xa6\x54\xa2\x64\xb9\x1d\xfa\x03\xb0\x29\x58\x86\x14\x59\x0c\x21\x08\x21\xb5\x1d\x64\x65\xd0\x0c\xc1\x41\x73\xd2\xc5\x72\x11\xa3\xfd\x88\x42\xd7\x2e\x42\x7f\xc5\x48\x4e\x9e\x89\x7d\xdf\xc3\xd1\x78\x1a\x51\x76\x42\x34\x01\x8b\x96\xf7\xb4\x58\x33\xc0\x6f\x09\x51\xa0\x85\x78\x1d\xfc\x3c\xa6\x34\x69\x3d\x6e\x8a\xab\x31\xb0\xef\x16\xb3\xbd\x17\x58\x9f\x50\xab\xd1\xaf\x08\x15\xad\x55\x05\x55\x80\xb8\xbc\xd4\x62\x72\x14\xe3\x7d\x9a\xd4\x74\x52\xb6\x83\x18\xb5\x66\x1a\xda\xcc\x3c\xa9\xca\xb4\x3c\x5c\x13\xe9\xf4\x6a\x79\xad\x50\xd4\x37\x45\x0f\xab\x32\x2a\x4a\x50\xa0\x9b\xd4\xd7\x29\x02\xa1\x7f\x67\x2d\x3a\x3e\x6b\x8b\x10\x5f\x08\x3b\x5d\x2b\x39\xa6\x67\x53\x75\x89\x23\x3a\xbf\x21\xdd\xd0\xb4\x2a\x5b\xe9\x3f\x01\x48\xf5\xa7\x41\x28\x9a\x08\x06\xc5\x83\xb7\xc3\x33\x7f\x16\xc8\x92\x91\x47\xcc\xfe\x2e\x00\x83\x6f\xd1\x01\xd7\x92\x07\x5c\x56\x04\x33\x9b\x78\x72\x8f\xe8\xa1\x0f\x27\xe9\x96\x93\xdb\xb0\x3d\x0b\xfd\x86\x0d\xa1\x63\x8f\x40\x0b\xaf\x83\xcd\x64\x8b\x84\x2e\xac\x0b\x39\x5c\x0b\xbe\xe2\xbe\xcb\xef\x6a\x72\xa5\xa3\xee\x2c\x9a\xfd\xb5\xd0\xb2\xe8\x78\x91\x93\x01\xb5\x10\xc8\xc7\x0b\x6d\xca\x39\x76\x74\x00\xda\x01\x38\xf5\x71\x84\x10\xc9\x68\xf0\x06\xb8\x42\x6a\xa7\xb3\x14\xa6\x4f\x23\xa7\x3c\xc4\x96\xd9\xd7\x4e\x08\x70\xfc\xd3\xc8\x51\xa4\x68\x6a\x42\x6b\x4e\xe9\xf8\x51\x74\x5b\x19\x33\xff\x38\xb3\x7f\x3e\x0f\x95\x4e\x74\xf7\xb5\x0c\x8c\x0e\x2d\xb0\x19\x59\xd2\xa2\x53\xa4\x1a\xa6\x6c\xcd\x33\x27\x68\x2c\x45\xb4\x52\x7b\x57\xaa\xe0\xf6\xce\x6e\xfd\xec\xdd\xe9\xa7\xc6\xf1\xbb\xe3\x16\x33\xdb\x95\x5d\xe2\xf3\xa7\xc9\x15\x42\x2a\xc3\xff\x78\xfe\x80\xd8\xe1\xab\x81\xf6\x7a\x89\xc5\x56\x84\x69\x69\x04\x2e\x4b\x72\x93\x35\xae\x6d\x18\xa8\x50\xd3\x63\xab\x11\x81\x6b\x8e\x4a\xee\x78\x9e\x74\x32\x2d\x3d\x69\xa0\x78\xae\x78\xbc\x35\x5d\xa6\xed\xbc\x79\x94\x77\xfa\x48\xf1\xe4\x9a\x69\xc5\x0c\x77\x7a\xfa\xe6\xa1\x94\x83\x51\xbd\xe7\xdf\x2e\x8f\x12\xb7\x76\xd5\x98\xed\x65\xf9\xdd\xf0\x5e\x11\x71\xb2\xb9\x57\x49\x3d\xb7\x87\xb5\x9f\xb3\x87\x5b\x20\xe5\xae\xb5\x4c\x0f\x5b\xd4\xa8\x54\x28\x05\x49\xb0\x1a\x68\x79\x92\xd3\xa7\x06\x5f\x5b\x61\x0d\x2e\x26\x00\xfc\xbd\x11\x60\xe8\xb8\xae\x2c\x57\xa9\x70\x97\x95\x60\x6c\xe8\x46\x4c\x0b\x68\x19\x35\x98\x31\x08\xa2\x22\x12\xd4\xfd\xf8\x82\x6c\xe4\x58\x0e\x2d\x41\x26\x67\xc1\x36\x0f\x84\x84\x92\x32\xb9\x91\xf5\xab\x80\x24\x20\x75\x95\x87\x56\x98\xb0\x2e\x26\xd9\xca\x13\xb7\x7f\xd4\x39\x48\x3a\x22\xf0\x4f\x74\xf0\x20\x0b\x46\x56\x50\x16\x91\x57\xb6\x6f\x60\x00\x4b\x22\x2c\x76\x96\xad\xc5\xd3\x86\x98\xfe\x22\xbc\xb2\x48\x60\x27\x09\x1d\xb2\x6b\xb3\x3c\xb4\x07\xe3\x00\xa4\x13\x4b\xce\x3d\xc2\x0c\x0f\x42\x6f\x58\x9a\xee\x58\xb0\x14\x96\x54\x60\x71\x47\x1d\x2c\x85\x9a\x56\x34\x6b\x0e\xbd\xa5\x45\x92\x26\x35\xd4\x1d\x3d\x2c\x82\x78\x52\xfa\x16\x28\x99\x35\xff\x8d\x65\xd4\x7c\xe6\xbe\x94\xb3\x05\x15\xfd\x85\x6b\x50\x6a\x48\x86\x4e\xa2\x7c\x02\x70\x2b\x0b\x8f\x0b\xea\xba\x23\xef\xba\x6f\x39\x25\x58\x34\xf5\xc0\x72\x52\x04\xf0\x71\xf7\xc1\x8a\xe5\x67\x28\x00\x75\xa0\x07\x71\xff\x3d\xcb\xa8\x79\xaf\x41\xcd\x5b\xbc\xae\x82\xa2\xf7\x4d\x1b\x50\xf8\x0d\x1b\x10\x15\x25\xe0\x10\xf4\xcb\x51\x4b\xc0\xba\x3d\x3e\xa6\xdd\x81\x13\x12\x8a\xb4\xcc\x41\x22\x24\xf8\x79\x3a\xc4\x31\x22\x8b\xe6\x3f\xcf\xb3\x00\xe2\x49\xc6\x24\x51\x12\x6e\xcc\x09\xe2\x54\xc3\x5f\x64\x1e\x69\x42\x86\x58\xc2\x5c\xa6\x28\x93\x20\x5b\x96\xd0\xa1\x98\xdd\x81\xd4\x02\xf7\x6b\xc8\x14\x5f\x5c\x7f\xc2\xf1\x83\x2f\x12\xa2\x3b\x0b\x53\x38\xc6\x4b\x31\x3a\x1d\x97\x3c\x0a\x18\x7e\x49\x7f\x9a\x6f\x3f\x20\xc5\x57\x2b\x23\x0e\xd2\x14\x5d\x9b\xbe\x12\xd1\xcc\x3e\x2d\xca\xb7\x13\x5d\x25\x7d\xe8\x8c\x1c\x8f\x93\xe8\x81\xb0\x05\x5c\x3b\x74\x6e\xd3\x08\x93\x7b\x44\x7e\xa7\x72\x3c\x6c\xa5\x80\xe5\x01\xba\xd2\xd4\xa9\x01\x3e\x20\x40\x11\xea\x50\x97\xed\x90\xe8\x92\x1a\x97\x0d\x73\xa2\x06\x64\x3d\x6d\xbf\xa6\x4b\x62\x3a\xa4\x7d\x9e\x79\xb4\x73\x23\x1e\xfc\x7e\x90\xe6\xf7\x01\x41\x64\x8a\x6f\x96\xf4\xe4\xc5\x78\x13\xb7\xb9\x5c\x04\x0f\x5c\x69\xd9\x31\x68\xf1\xac\xfb\xe2\x3e\x81\x5c\x87\x8f\x7c\xce\x26\xea\x56\x2b\x79\x5d\x58\xa2\x4f\xd0\xbf\x93\x7a\xee\xf1\xb6\x03\x9f\x78\xb8\x91\xfc\x20\x76\x43\x22\x79\xfe\xf9\x1b\x4a\x4d\x58\xc2\x12\xe7\x3a\xa5\x09\xbc\x41\xa6\xbc\x0e\x52\xae\x78\x18\x19\x9a\xc4\x74\x01\xe6\x9c\xae\x71\x01\xf6\x41\x54\x32\xaf\x07\x71\xa9\xe5\x7b\x11\xd7\x49\xf5\x24\x2b\xaa\x07\x19\x39\xbd\x99\xc3\x5b\xe3\x61\x4c\x9d\x51\xd9\xd0\x18\xa8\x61\xb5\x44\xf8\x10\xe9\xdd\x22\x2a\x99\xcc\xf0\x8a\xf8\x74\x33\x61\x81\x2d\xdb\xab\xd3\xfb\x63\x35\x72\xcc\x58\xa6\x0a\xdb\x2a\xa5\x22\x71\xc4\x65\xc6\xbb\xd1\x02\x49\x2a\xd1\x74\xe6\x1c\xcb\x7e\x3e\x1d\x92\xc2\x3d\x2a\x2c\x53\x55\x42\x0d\xed\xb5\xa9\x2d\x73\x61\xa0\xd2\xd7\x28\xfd\x38\xa3\x02\x95\x73\x9e\x47\x4a\xbc\xd8\x05\x69\xb1\x3a\x13\x94\x4a\x39\x4c\x9f\xbe\x02\x34\xe6\xb7\xb4\xd8\x27\x0d\xfa\x77\x35\xd5\xb1\xc2\x12\xd0\x70\x2a\x79\x15\x5a\xb0\x84\xb9\xf7\xa1\xeb\xa3\x1b\xfb\x33\xe1\x8e\xaf\x95\x4c\x52\x1e\x4a\x84\x0a\x45\xf8\x47\xe2\x17\x9a\xee\x88\xc5\x88\x45\x27\x53\x83\x34\x95\x12\x56\x47\x1b\x65\xec\xe3\x8f\x98\x14\x87\x38\xf8\x53\x7d\x7d\xf4\x2e\x2c\x01\x74\xef\x17\x32\x9c\x0e\xcd\x3b\x2d\x9d\x02\x62\x81\xa9\x68\x0e\x2c\x37\x2d\xa9\x78\x50\x74\xe2\xa6\x42\x06\xa5\x59\x63\xf9\x16\x97\x34\x0b\xcb\x89\x83\x0c\xf9\x62\x40\x67\xb1\x5d\x16\x44\x49\xc5\x65\x24\xee\x37\x29\xdb\xcc\xfc\x20\xb8\x19\x40\x99\x0c\x1e\x9a\xc6\xd4\x80\x5f\x8b\x93\x00\xd4\xb7\xe1\x24\xe8\x9c\x54\x53\xe1\x78\xa3\x2d\xc0\x8b\xa6\x12\xb1\x8e\xf2\x82\x42\x67\x50\xcb\x46\x9c\xa5\x69\xc1\xe9\xf1\xe3\x0c\x55\xf1\x39\x03\x96\x09\x41\x9d\x63\x56\xfb\xa4\x57\x0c\x43\xd3\xc9\x29\xd8\x03\xae\xdb\xbe\x99\x01\xb7\x7f\x4d\x9b\xfa\xc4\x6c\x27\xb8\x64\x80\xa3\x4c\x32\x40\x6d\x33\x53\x68\xea\xda\x91\xab\x12\x06\x0b\x92\x70\xf3\x8f\x4d\x19\x36\xbc\x55\xa4\xbe\x61\x18\x9a\x56\x5d\x50\x83\xdd\xb1\xc4\x79\xfa\xd8\x4d\x96\x33\x64\xb7\x83\x5d\x62\x9d\x18\xad\x6c\x9f\xc6\x37\x67\xf7\x27\x61\xa6\x5b\x62\x75\x87\x85\x52\xbe\x87\x2d\x57\xad\xe4\x28\xb9\x3e\x16\xe2\x26\x6a\x06\x88\x7b\xc9\x59\xd7\xc7\xd1\x49\x99\xb3\xaa\xe3\xe3\x34\xf2\xff\x13\x8b\xe6\xa4\xcd\x34\x23\x0b\x8a\x9c\x66\x62\x33\x8b\xbc\x88\xe0\xf5\x8c\x16\x30\x07\x64\x56\x65\x98\x07\x3a\x3e\x29\x73\x40\xc6\x36\x31\x79\xa0\x5a\xe9\xb3\x77\xf1\xa6\x79\xbe\x14\xe0\x3a\x73\x91\xc8\x10\x53\x76\x23\x4f\x9d\xf9\x4c\x45\x99\x76\xc1\xaf\xd2\x8d\x4a\x96\x31\x5d\x64\x2f\x27\x7e\x7d\x69\xc4\x86\x5a\x2b\xb9\xe1\x6f\x52\xf1\x97\x24\xf6\x60\x69\xcb\x38\xd6\x8e\xee\x5b\x46\xcd\x7f\xed\x30\xe3\x20\xbf\x58\xd4\x9c\x4b\xff\x8a\x37\x6f\xf4\x99\x80\x8e\x0f\xb0\x95\xc7\x02\xa4\x23\x6b\x49\xf8\x8b\xec\xce\x7f\xef\xf5\x09\x87\xc9\x44\xe1\xf9\xf1\x30\xf2\xe4\x6c\xa9\x70\x20\x79\xb1\x79\x93\xce\x0a\x39\x93\x8c\x0f\xeb\x00\xf4\x15\xc0\xdc\xb1\x45\xa1\x1d\x56\x57\x55\xe2\x17\xce\xdb\x8f\x0b\x4b\x6a\x3a\xbf\x39\x4a\x8a\x88\x10\xa1\xfe\xa4\x71\xe0\xae\x65\x63\x36\xa4\x8b\xa6\x39\xa7\x9c\xc6\x70\xbf\x13\x5a\xd3\xdf\x47\xef\xe3\x78\xb5\xd9\x63\x94\x7a\xb3\x58\x8a\xa1\x70\xeb\x54\x6e\x93\x95\x03\xc1\x54\xe4\x71\x3c\xb8\xd0\x03\x42\x1c\x29\x23\x4f\xea\x27\xf2\xd6\xb3\x34\x8b\xbf\x2f\x6a\xe5\xc4\x74\x4d\x91\xe4\x1b\x82\xfb\xe8\x82\x90\x82\x23\x10\x92\x1b\x61\x54\x0c\x68\x8b\x4c\xb5\x17\xdc\x74\x9c\xa1\x0a\xdf\x84\x91\x72\x21\x8a\xf5\x4d\x98\xa2\xd8\xe1\x4a\xd1\x95\x92\xa9\x90\x48\x74\xc2\xc5\x1a\xad\x11\x92\xc4\x9a\x1a\x28\x64\xe7\x00\x75\xbc\x61\x7c\x94\xb4\x80\xa5\x88\x42\x90\x67\xd1\xfa\xe1\x17\x5f\x60\x09\x3c\x15\x8a\x85\x1f\x8a\x3f\xfc\x22\xeb\x5b\x41\x1d\xbd\xb1\x34\x61\x7a\x68\xc3\x91\xe3\x3d\x4d\xe7\x3f\x2c\x82\xdd\xf7\x5d\x65\x19\xb1\x93\x60\xaa\x27\xd8\x41\x1c\x89\x55\xd1\x15\x55\xc9\x1d\x0a\x7a\x0f\x52\xf4\x42\x7e\x39\x74\x8d\x57\x34\x45\xe2\x56\x3c\xe2\xb2\x9a\xa0\xb3\x74\x75\xd5\x29\x3b\x41\xc3\x77\x5d\x7b\x1a\x80\xb4\x75\x30\x3e\x04\x58\xf1\x86\x0d\x41\x88\xef\x7f\xf2\x98\xb1\xb1\xc3\x98\x64\x3e\xf3\x31\x47\x6b\xd4\x55\x59\x30\x11\x92\x0c\x33\x71\xf6\xd6\x70\xec\x7b\x71\xc2\xfc\x32\x4e\x94\x9f\x08\x8a\x9d\x99\x36\xb5\xe0\xce\x61\x59\x01\xed\x00\x14\x64\x90\x76\xea\x87\xd5\x30\x0a\x90\x99\xe7\x09\xa8\xe8\x61\xe6\xe6\xa0\x70\x8e\xd4\xf8\x3d\x76\x95\x26\x6b\x92\x44\x70\x26\x56\x9d\xf4\xc5\x3b\x30\x0c\xc9\x63\x05\xbb\x51\x2b\x35\x12\x03\x30\x0f\xc3\x28\xed\x7f\x8c\x66\x66\x4e\x27\xfd\x8f\x7b\x76\x00\x5c\xc7\x63\xa1\x45\xbf\x01\x69\x8a\x9d\x00\x6f\xd4\x1d\x8a\x34\xf5\x1b\xfe\x09\xd4\xe3\x46\x8e\x25\x2b\x59\x9e\x82\xe8\xf1\x42\xa9\x66\xfe\xce\x2b\x92\x6e\x46\x35\x72\xa5\x9b\x51\x29\xc9\x35\x4d\xb8\xe9\xab\xd1\x19\x02\x84\xb0\x72\xe5\xb4\xd7\xfe\x5d\xd7\xf7\x27\xe7\x36\xf4\x1c\x6f\x94\x09\xa6\x49\xfa\xf1\x10\x97\x20\x3e\x87\xf8\x15\x48\x1c\x91\xe9\x32\xcb\xfb\x67\xa6\x6b\x72\xde\x99\xe8\x55\xe9\x8e\xbc\x53\x24\xa5\x53\xee\x98\x34\x12\x41\xcf\xb5\xfb\xe3\x5a\x36\x42\xc1\x1f\x0e\x87\x95\x4a\xa5\x52\x8b\xc2\x7d\x54\x0b\xae\x0d\x47\xa0\x46\xa3\x11\x40\x7b\xe0\xcc\x82\x6a\xe1\xe5\x74\x5e\xe3\x5c\xc9\x5f\x6c\xd4\xa6\xf6\x60\x80\x63\x20\x18\xe5\x0a\x98\x14\x8c\xf2\x06\xfe\x7f\xf4\x9d\x78\x7d\x92\xaf\x90\x7a\x76\xa2\xb7\x35\x81\x83\x68\xe4\xfc\x0b\xe6\x04\x8b\x92\x3d\xf8\x3c\x0b\xc2\x6a\x01\x1d\x6a\xd1\x6b\x1c\xec\x84\x24\x40\x66\x6f\xb0\xeb\xaf\xa4\x16\x7a\x97\xad\x22\xa3\x5b\xd6\x65\x92\xfa\x80\x66\xd8\x65\xb2\xa4\x51\x2d\xea\x80\x13\x3b\x55\x69\x4f\x54\xbd\x9b\x01\xcf\x47\x98\x70\xca\x87\x20\x08\xec\x11\x38\xb4\x3d\x7b\x04\x60\x19\x82\xa9\x6b\xf7\x41\x8b\x25\x3e\x0d\x54\x9f\x87\x40\x4b\xeb\x97\x51\x8a\x6f\xd3\x30\xbe\x5f\xb0\x3d\xc5\x71\xcd\xb5\x2b\xd9\xcc\x22\x73\x65\x18\xe7\xd7\x10\x08\xb4\xf8\xac\x19\xf4\x56\x98\x81\x13\x53\x84\xda\xd1\xe0\x00\x34\x1c\x9d\x32\xce\x67\x99\x25\x54\x5d\x04\x99\x9e\xa2\x39\x25\x32\xa3\x91\x6d\x25\x67\xd9\x1f\xdf\x02\x88\xf8\x9f\xa4\x7e\x32\x5a\xf3\x3e\x79\xcd\xad\xf7\xa8\xa3\x49\xd6\x98\x2b\xb7\xfc\x9a\xe7\x6b\xa5\x57\x70\x6a\x25\x9a\x1b\xd3\x39\xbf\x5c\xe7\xf3\x12\x59\xb1\x5f\xb9\x3c\x73\x96\xa1\x60\x9d\xc9\xbd\xf3\x0b\xe6\x4b\x63\x12\xb0\xc0\x0d\xb2\x55\x27\xf3\xd1\x4f\xd5\x56\x04\xe4\x58\xce\x97\x19\xa0\xd3\x60\x0a\x01\x2a\x19\xd9\x7d\xe8\xa0\x1c\x84\xfe\xf4\x3d\xf4\xa7\xf6\xc8\x26\x87\xc6\x93\x8e\xee\x8d\x52\xaa\xc7\x27\x66\xbe\x38\x56\x3a\x6e\xc2\xd3\x37\x5f\x46\x2c\x85\xb5\xfc\xca\xcc\x42\xe0\x37\x1c\x20\x6d\x21\xbe\x5c\x96\x5f\x6c\x88\xa8\x2f\x5e\xda\x99\xf5\x9c\x58\x1e\x54\xdb\x83\x7d\x84\x1b\xae\x03\xf8\x18\x53\x78\xc1\xe8\x8e\xf8\x65\x12\x8a\x0c\xe7\xd0\x9f\x5a\x2a\x64\xba\x38\x87\x89\x5b\x9e\x55\xb8\x20\xef\x82\x6a\x2e\x18\x86\xa8\x1e\x51\x70\x38\x29\x93\xf1\x85\x71\xf2\x29\xf8\x5a\x6c\xd5\x9d\x40\x30\x16\x54\x67\x6f\xba\xa9\x22\x9a\x4e\xd3\xdb\x84\xec\x36\x96\x2a\x20\xe1\x76\x16\x0c\xa0\xa2\x7f\x23\x20\x7e\x8f\x95\xbe\x4a\x6c\xae\xa9\x91\x12\x34\x8c\xb9\xc9\x25\x66\x1c\x91\xfb\x3f\xe9\xe1\xe3\xa3\x89\x05\xe9\x32\x87\xcd\x64\x6e\xcd\x48\xb1\xec\x93\x37\xbb\xd0\x9f\x44\x79\xe5\x53\xee\xcd\x52\xe5\xaa\x3f\xbd\x27\xd6\x5b\xa7\x7e\x54\x37\x2b\x1c\x13\xe4\x99\x89\x33\xdd\x7b\x7e\xe8\xf4\x01\xba\x45\xa5\x23\x29\x70\x47\x0a\x17\x9a\x8a\xc9\xf0\x1b\xfe\xf4\x9e\x9d\xea\xa8\xdb\x98\x0a\xfc\x45\x4b\x7a\x68\x4c\x21\x50\xb4\x5a\xc8\x31\x85\xa8\x1f\xa5\xd0\xe7\xb0\x0a\xfc\x19\xec\x03\x74\x15\x48\x6d\x02\xe9\xa3\x45\xb8\xe1\xe3\x68\x46\xd9\x6d\x1c\x3f\xce\x0d\xee\xb1\x44\xcc\x8e\x44\x70\x52\xd9\x05\x5a\x77\x2c\x58\xb6\xbd\xfe\x35\xb9\x69\xea\x41\xf4\xf3\x18\x0b\x09\x74\xcf\x82\x24\x76\x03\x7e\x6d\xb3\x5f\xe4\x6d\x0d\x96\x09\xca\x75\xd7\xc5\xad\x42\xe0\xa9\xa1\xa6\xfb\x64\xc0\x59\x33\xdc\x98\xa7\xe7\x8b\x0e\xcb\x60\x1e\x02\x6f\xb0\xba\xaa\x62\x0b\x5e\x7c\x8d\x57\x1d\x3d\x88\x5f\xa9\x9e\x6e\x6b\x9a\x1e\x4a\xd9\x8f\x1c\xc3\x98\x18\x87\x44\xa0\x03\xa9\x88\x2a\x60\xe5\x6b\xce\x50\x25\x57\x1e\x7c\xb4\x71\x22\x06\x8d\x73\xf9\x63\x11\x26\xca\x41\x68\xc3\x90\x92\x0c\xb2\xdf\x08\x53\x9c\x5f\xec\x43\xa9\x75\x7c\xae\xac\x58\x10\x7b\x95\x1c\xd9\x13\x80\x25\xed\xca\x1f\xe2\x48\x82\x16\xf7\x7c\x75\x55\x69\xbf\xaf\x1f\xe1\x67\x5c\x77\xe3\xd7\x2a\x4c\xbc\xc1\xb1\x23\x20\xb8\x75\xfc\x59\xd0\x76\x7a\xae\xe3\x8d\x6a\x1a\x2e\x92\x7c\xa8\x87\xc5\xac\x8b\x6f\xec\xe2\x02\xa9\xf3\x73\x5e\x19\x50\x06\xde\x00\xb7\x59\xc2\x5f\xe9\x14\xe0\xfb\xa7\xa2\xae\xb3\x52\xbf\x93\xbe\x7a\x60\x1e\x26\xfa\xc9\x3d\xd0\x83\x65\xfa\xe8\xf1\x01\x38\x68\x8a\x69\x32\x5c\x2d\xff\x2e\xd2\x54\xe8\xb8\x1f\xfc\x93\xa2\xa9\xb1\x58\x21\x9c\x23\xb5\xe3\x8d\x54\x4f\x0f\xf5\xa4\x13\xbb\xa7\x95\x82\xdc\xad\x50\xb0\x32\xe4\x5e\x6f\x89\x39\xac\x6a\xd4\x65\x93\x31\xe9\xc2\xad\x55\xee\x15\x46\x4f\x89\x74\x3a\xc2\xf4\x3e\x2a\x56\xc9\x14\x95\xb9\x22\x09\x3f\x2f\x6d\xcf\xeb\x9c\x46\x19\xe5\x85\xf9\xa7\x52\x49\xe7\xbf\xd5\xaf\x99\x1a\xac\xfa\xc9\x16\x49\xc9\x28\x81\x26\xce\x73\x4e\x82\xa8\x4b\xd0\x9d\x02\xef\x0c\xba\xa2\xcc\x53\xfd\x6b\xe8\xa3\x59\x99\xf8\x59\xee\x41\xff\x2e\x00\x70\x33\xf9\x13\xc3\x39\xb5\x7b\xea\x97\x19\x74\xab\xe0\x49\xab\xd2\x5a\xe8\xb9\x0a\x74\xe5\x53\xcf\xb5\xbd\xb1\xa2\x2d\x88\x8b\x83\x8a\x93\xe1\x07\x83\x33\xe8\xca\x84\x92\x82\x49\xe2\x0c\x55\x9a\xd9\x0f\x3c\x3e\x26\xed\x53\xc0\x7c\x6a\x7b\x83\xf8\x10\xc8\x3d\x20\x18\x03\xa5\x4a\x9b\xd2\x34\x6d\x75\x75\x45\x05\x54\x1c\xff\xa6\x62\xac\xbf\x7c\x7c\x04\xe5\x00\xd8\xb0\x7f\xad\x3e\xbb\xfc\x18\x7c\xbc\xfc\x78\xa5\x6a\x5f\x9e\x5e\xbf\x51\xbe\xfb\xf8\xf1\x57\x3f\x5c\x3d\xd3\xde\x58\x86\x46\x02\xfc\xb0\x82\xca\xaf\x2e\xed\xd2\x43\xbd\xd4\xbd\xa2\x9f\x46\xe9\x55\xb1\x5c\xba\xfa\xbe\xfa\xec\x99\xa2\xbd\x36\x34\x26\xfe\x24\xa1\x09\x54\xa5\xaa\xe8\xa6\x76\x69\x5c\x11\x71\xa8\x32\xb1\x1d\x37\xf4\x95\x6a\x52\x94\x07\xd0\xd1\x1d\x4e\x11\x8c\x22\xa0\x57\x11\x32\xc6\x68\x8d\x48\x27\x2d\x09\x36\x9a\x11\x49\xa1\x6b\x8f\xdf\x07\x41\x00\x06\x5b\xf7\xac\xe2\x5b\xdb\x1b\xb8\x00\x7e\x62\x1a\x5f\x7a\x5b\x05\x43\x60\x87\x87\x71\xda\xba\x80\x4d\xed\x64\x36\xbb\x95\xfc\x6c\x76\xe4\x1c\xca\x69\xd5\x5a\x31\x74\x50\x66\x81\xf2\x5a\xfe\x9d\x15\x49\x2e\x54\x50\xee\x63\xae\xff\x22\xcb\x7a\x0b\x74\x06\xda\xb3\x05\x62\x0e\xba\xd2\x8b\x26\xd7\x20\x35\xa5\x8d\xda\x64\x4d\x7e\x58\x04\x8c\xe8\x78\x8b\xa6\xbe\xc2\x5f\x32\x2d\x0b\x94\xd1\x10\xac\xae\xa6\x9b\x78\x23\x56\x12\x2f\xd2\x31\xae\xae\xae\x20\xd6\x3f\x41\xa1\x92\x69\x2d\x32\x8f\xcb\xb6\xbf\xa8\x12\x51\x6f\x6c\x2e\xd2\xf8\x60\xcd\x51\xf5\x67\x54\x20\x69\xba\x90\x7c\x2a\x28\xdb\x6e\x78\x00\xee\x1f\x1f\x57\x42\x96\xd1\x2b\x3b\x25\xd1\xec\x61\x5a\xa2\x74\xb6\x78\x75\xc5\x88\x8c\xb3\x84\x55\xcd\x34\x13\x9a\xdc\x3a\x22\x76\xee\xd4\xdf\xf1\x06\x7c\x10\xe3\x4c\x43\x26\xe2\xb1\xd2\x12\x05\xb4\xa7\x6b\xdc\x2c\x4a\x44\x7d\x03\xde\xc8\x1e\x81\xc1\xe3\xa3\x68\xf6\x6c\xca\x22\xd6\xb1\x6a\x71\xb7\x65\x31\xf6\xd0\xc5\x37\x5e\x3e\x1b\xdc\x75\x57\x5a\x05\x5f\x7a\xa3\xf9\x4f\xeb\x68\x55\x2e\xd6\x1d\x37\x3c\x5f\x47\x39\x31\x71\xae\xe3\xb8\xc8\x2a\xa0\x7a\x4b\xc4\x8e\x45\x81\xf4\xe2\xf6\x22\x56\xe1\x98\x9e\x27\xe9\x00\x39\x5f\x79\x28\xc4\xac\xc7\x12\x4c\xbe\xc6\x62\xfc\xc5\xf8\xac\x00\x12\x78\xea\x00\xdc\xe3\xb9\xda\x0f\xa1\x8b\x27\x2b\x28\x4f\x40\x68\x1f\x80\x7b\x66\xce\x5a\xc8\xd3\x66\xd3\xad\x9c\x57\xea\x67\x5e\x5a\x99\xb0\xc8\xa9\x43\x35\x63\x60\x86\x79\x5a\xe1\xa2\xc2\xf5\xc9\xe6\x8d\xb6\xc2\x06\xea\x15\x4e\xd4\xbb\xba\x5a\x41\xc5\x48\x56\x61\xd4\x0b\xf2\x8d\xae\xf0\x74\x42\xdf\x28\xb3\x23\xbe\x50\xab\x5a\x32\x3b\x2d\xe2\x29\x95\x86\x3f\x73\x07\x05\xcf\x0f\x0b\xb8\x4c\x61\x62\x7b\x33\xdb\x75\xef\x0b\x83\x19\x28\x84\x7e\xe1\x0e\xf4\x0a\x10\x20\x0e\x14\x53\x3f\x88\x37\x82\xd9\x94\xc3\xd8\x88\xb1\x12\x4e\x82\xb4\x2d\x5c\x6a\x1e\x66\x35\xab\x4b\x5f\xec\xb8\x69\xbf\x12\xa1\x13\x61\xc8\x1e\xa1\xdd\x69\xe1\x0a\x5f\xb8\x98\xcd\x25\x16\xb3\x42\xee\xcd\x09\x8b\x1e\x1c\xa5\xb2\x0e\xa1\x7f\x87\x18\xc6\x4f\xa9\x69\x99\x64\x1d\xed\xe9\xd4\xa5\x36\x7c\x44\xb7\xc5\x88\x97\xca\x46\xaf\x6a\xab\xab\x0a\x0e\x9b\x1e\x0d\x43\xd2\x25\x2e\xc3\xd8\x62\x2c\xb6\x81\x1b\xda\x2a\xd0\xa8\xb5\x7b\x30\xb1\x61\xb8\xeb\xfa\x3e\xdc\x76\x6e\x9d\x01\x20\x76\xcf\x76\x2f\xe0\x9d\x06\xf3\x8f\x69\x3d\xb0\x94\x3f\x38\x56\x8a\x2a\x7c\x6d\x6c\x2a\x5b\x4a\x55\xa9\x2b\x54\xd0\xe7\xf8\xe5\x00\x78\x03\x16\xd5\xa9\x0c\xc1\x14\xd8\xa1\xea\x6b\xa2\x9d\xe6\xe9\x49\x30\xaf\xbe\x62\xda\xe4\x1d\x20\x72\x53\x48\xba\xaf\x25\x38\x30\x69\x51\x3e\x38\xb9\x2c\x0f\xa9\xc8\x72\x81\x06\x61\x07\xb2\x88\xb1\x2b\x34\x65\x3d\x01\x23\x35\xe7\x94\xa1\x45\xe4\x9a\x9f\x04\x71\x31\xbf\x3e\x0d\x84\xef\xe1\xfd\xe3\x93\xc8\xa1\x1a\x8b\x9e\x98\x62\x4b\x7d\xf6\xd1\x7b\x36\x9a\xe8\xca\x47\x88\x86\xdb\x12\x5e\x80\xc2\xb4\x11\x58\x0f\xda\xfd\x31\x08\xc1\x80\xee\x66\x6a\x68\x29\x7f\x70\x59\x31\x8c\x5f\x2b\xc5\xb0\x88\xbf\x9a\xbf\x56\xe2\x4b\x16\x37\x7d\x72\xae\x7e\x0d\x7f\x7a\x2f\x18\x90\x59\x00\xe8\xec\x22\xc9\x7e\x51\xb1\xc7\x47\x55\xa0\x53\x48\x6f\xdd\xb2\xdd\x87\xdf\xc2\xe5\x82\x4d\xdf\xa3\x29\x38\xb3\xd7\x28\xce\xf9\x21\xb3\xba\xa2\x9c\x02\x34\x5f\xe6\x72\x9c\xed\xe3\xa3\x41\xfd\xe8\x32\x6b\x59\xde\x82\xdc\x54\x51\xb8\xc4\x1f\x1f\x8d\x1a\x76\x4e\x00\xaf\x2d\xe3\xf1\x31\x7c\x8d\x2f\x55\x64\xb3\x91\x65\x38\x7d\x7c\x94\xe6\x32\x4d\x98\x66\x46\x99\x69\x19\x32\x29\x75\xbd\x6a\xae\x2c\xb2\xda\xe0\xd4\xa2\x3a\xa4\xab\x88\x93\x3f\xa8\xb9\x81\x9a\xf3\x17\x89\x7c\xca\x71\xc6\x72\xf2\xc8\x45\x9c\x89\xdb\xe6\x57\x1a\xf1\x3c\x3e\x2a\x86\x9c\x73\xa7\x12\xf7\xcd\x85\x06\x86\xcc\x3c\x50\x68\x76\x97\x61\x59\x26\xf7\xc7\x89\x9e\xf1\x26\x59\xf8\x49\xe3\xbe\xef\x82\x4f\xe8\x32\xcc\x38\xf6\x5c\xe3\xc6\xdf\x45\xdb\xe6\x55\xca\x34\x5f\x08\x5e\x6e\x45\x9a\x4e\x6d\x22\x13\x16\x45\x8e\x1d\x99\x5c\x28\x52\xa1\x57\x4e\xe6\x93\x25\x5b\x11\xa4\x4c\xc9\x49\xe1\x24\x3c\x28\x32\xb3\x51\xec\x54\x20\x0a\x7d\x4d\x61\xaa\xda\x13\xe7\x5e\x91\xad\xca\x72\x2e\x3d\xe9\x4e\x19\x86\x03\x30\x55\x15\xd7\xe9\xd1\x3d\xff\xec\x74\xf7\xa5\xa2\xf1\x18\x37\x8f\xb3\x9d\x67\x77\xde\x28\x10\x1f\x93\x23\x37\x8f\x89\xa2\xe9\x29\x09\x61\x29\xc5\x7e\x12\x72\x42\xcc\x98\xf1\x10\x4e\x80\x24\xfa\x98\x5d\x68\x27\x22\x9f\x20\x90\x4c\x06\x8f\xf3\xe6\xe1\x02\x6a\xb2\x15\x3d\x1f\x32\x4e\x8d\x4f\x5e\xbc\x87\xfe\xd0\x11\x4d\x37\x0e\x63\x10\xd2\x52\xe9\x51\x4f\x00\x9d\xce\x82\xeb\xec\xd1\x42\x70\xe4\x6a\xa4\x30\x8d\xc4\xca\x20\x3a\xa6\x1b\xf6\x34\x9c\x41\x30\xf8\x94\x3c\xbd\xa3\xc7\x3a\x0b\x0a\x46\x62\x2d\xd3\xa3\x31\x7a\xa0\xe3\xb8\x3e\xdc\x3b\xf6\x8b\x72\x77\x6c\x3c\x53\xbd\x74\x7c\x3d\xf3\xc4\x02\x3a\xc8\xe9\x70\x32\xe2\x62\xb6\x76\x7a\x0a\xe5\x0d\x08\x63\x28\x12\x03\xc1\xee\x45\xae\x3f\x52\x95\x33\xef\x1a\x0b\xbd\x06\x85\xb8\x34\xc9\x9f\x2c\x87\x2b\x97\x3f\xa7\x40\xfb\xbd\x00\xc0\x5b\x00\x07\x85\xce\x69\x61\xcc\x6a\x20\xf0\xfb\xed\xe3\xa3\x32\x91\xf5\x3b\xc3\xfb\x8c\xf0\x38\xd5\x5c\x2a\xdb\xb7\x34\x38\x38\x22\x4d\x0d\xd6\x34\x98\x18\x4a\x40\x52\xfe\xd2\xb1\xd3\x79\x4d\x4e\xf3\xf8\x13\xb3\x08\x4f\xb6\xb1\x60\x11\xa5\x8b\xa7\x30\x92\x57\xc4\x01\x8b\xd0\xb6\x21\x34\xe9\xe7\xc7\x99\x70\x02\x24\xf3\x35\x9f\xee\x1a\x87\xfe\x25\x39\x53\x1c\xcf\xee\x87\xce\x2d\x28\x34\x8f\x0b\x7e\xef\x33\xe8\x87\x65\xa5\x96\x06\xc4\x25\x4c\x5b\x80\x96\xeb\xfd\x3b\x42\xac\xa8\x7c\x84\x38\xce\xba\x7c\x51\xe0\x78\xc7\x8b\x88\x6a\x3e\xcf\x6e\x38\x11\xc1\x55\x87\xdb\xb4\xf3\x27\x1c\x6e\xcd\xf5\xf2\xdb\xc3\xd4\x92\xb6\x48\x68\x29\x68\x33\x71\x8a\x60\xfb\x99\x80\x9e\x20\xbc\x8a\x4d\x90\x98\x2e\x4a\x0b\x46\x0f\x91\xd8\x0c\xa7\x8d\xd5\xe5\x64\x5f\x68\xb7\x1a\x9f\x68\x18\x3f\x7a\xaa\xc5\xf9\xe4\xf2\x8a\xc5\xd0\x48\x81\x44\x28\xc0\x34\x24\x69\x11\xaa\x20\x88\x5d\x30\x2d\x05\x8e\x7a\x6a\x65\x63\x43\x2f\xb0\xff\x69\x4a\xa2\x6c\xec\x49\x4a\xca\x1a\x7a\x01\xfd\xc7\x4a\xf5\x7c\x37\x96\x45\x0c\x6d\x34\x0b\xd8\x2f\x27\xb4\x5d\xa7\x1f\xfd\xec\x91\x64\xae\xf4\xd7\xcc\x1b\x00\xe8\x3a\x1e\x17\x5e\x38\x84\xce\x18\xa0\x59\x3b\x1b\x5d\xc7\x40\x3c\xec\x96\xc6\xff\xa6\x9c\x12\x7b\x92\x8a\x52\xcc\x87\x23\x66\x1c\x9f\x0b\xb6\xed\xd0\xe6\x22\xf3\xf6\xb9\xa4\xae\xdc\x63\x41\xc2\xd7\xa7\xcc\xd0\xf3\x11\xeb\xb0\x28\x77\x0b\x93\xc0\x58\xae\x60\x3d\xd8\xc2\xc6\xaa\x0b\x2a\x24\xc6\x8e\xf8\x5c\x13\x33\x0d\x6f\x36\x51\x15\xc1\x84\xe4\xea\x72\x73\xc7\x52\xe8\x28\x2a\x8b\x2a\xb4\xf6\xb6\xf0\xf8\xe6\x16\x0c\x44\x49\x33\x04\x0b\x20\x97\x68\x38\xce\x99\x9c\x63\xe0\x6b\x61\x65\x1e\x17\xd6\xaf\xe0\x10\x97\x29\x0d\x5c\x86\x57\x78\x92\x5f\x86\x57\x31\x27\x91\x18\xd5\xcc\x38\x97\xfb\xbe\xd7\xb7\xb1\xd1\x5e\x2e\x7e\xe2\x64\xd0\x7f\x19\x57\xf3\x5f\xea\xb5\xb7\x98\xc6\xfc\x42\xcb\xfa\x96\xf3\x2f\x1d\xba\x11\x4b\xc6\x93\x74\x01\x5d\x99\x71\xa9\x05\x8b\x36\x0a\xdb\x25\x0b\x1b\x93\x19\xea\xcc\x20\xd2\x6b\x7d\x66\xb0\x05\x05\x57\xa2\x91\x62\xdf\xf1\x40\x45\x72\x54\x3c\x4e\x51\x31\xe2\xcb\xb6\x92\x1c\xa5\x28\x0c\x19\x3f\x48\x11\x00\x32\x46\xdc\xcf\x58\x05\x18\x8f\x10\x45\x38\x1a\x9f\xd5\x55\xb4\xb2\x28\xbe\x6c\x7f\xcc\x5f\xb5\x78\xfb\x69\xf8\x5e\x68\x3b\x5e\xea\x06\xc9\x98\x10\x3e\x20\x9a\x30\x91\x4e\x3a\x11\x08\x58\xce\x24\x2d\x98\xda\x9e\x42\x62\xf3\xe1\x4b\xbd\xee\x58\x97\x57\xb5\xd4\x58\xad\x08\x96\x09\xb3\xaf\x62\x56\xb2\x71\x69\x2d\xbd\xc8\xa4\xd5\x85\xe6\xb6\xf1\x43\x0a\x28\xde\xe0\xd9\xdc\xc0\x5f\x55\x88\x4d\x6c\xcf\xa9\x63\x0d\x7a\xc8\xe4\x89\x74\x1a\xa8\x21\x5b\xb9\x51\xf8\x31\x3a\x25\x68\x5d\xea\xc9\x43\x9e\xb2\xca\x74\xa2\xa8\x0e\x4d\x82\x13\x67\xcb\x43\x25\xc8\x6b\xba\x0e\x69\x5e\x0e\x4b\x51\x12\x59\x7f\xb8\xd9\xa5\xfa\x45\x4b\x29\x44\x0f\x14\x3d\xe4\x77\x88\x28\xf6\x60\x72\xf6\x91\x4a\x38\x2b\x0f\x7d\xa6\x60\xf3\xbf\xc4\x3e\x62\x68\xba\x8f\x3b\x12\x82\x79\xb8\x4d\x32\xf4\x3a\xbe\x67\xf9\x9a\x9e\x98\x9c\x51\x3f\x68\x32\x4a\xdc\x09\xb6\xb7\x18\x7a\xc8\x6f\x2c\x26\x33\xce\x48\xcc\x5d\x0e\x06\x7a\xa4\x68\x3a\xff\xf3\x13\x35\xe0\x61\xa5\x11\x78\xf4\x9d\x91\x48\xc7\xc2\xdf\xa4\x31\x23\x82\x10\x67\x64\xe1\x52\xee\x39\x34\xc9\x50\x01\xc7\xde\xc8\x5d\x34\x13\x3b\xec\x5f\x83\x40\xba\x6a\x14\x72\xc1\x52\x2c\x0b\x15\xf7\x87\x05\xf0\xf8\xb8\x66\x59\xc4\x1c\xec\xf4\x7e\x9a\xf4\x13\xe6\x96\x17\x67\x82\x77\xef\x02\x3a\xb0\x2b\x2a\x47\xd4\xc7\x47\x10\x7d\x4b\xae\x7d\x4a\xb9\xe8\xf7\xe3\xa3\x80\x9e\xa8\x3a\xa3\x10\x05\x90\x58\x6a\x64\x55\xd1\x37\x89\x55\x94\x5e\x30\x4c\x95\x25\x5c\x21\xda\x8a\xb5\xb2\x12\x72\x6b\x84\x41\x44\x13\x78\xc5\x02\xf1\x4c\xa6\x2f\xc8\x32\x88\x6b\xe1\xd5\xf1\xf8\xb8\x92\xda\x32\x51\x01\x10\xff\x8c\x0a\x24\xe6\x27\x29\x94\x78\x94\x7f\x72\xc4\x79\xba\x03\x91\xb0\x27\xcb\x5c\x03\x19\x27\x1d\x7e\xe5\x99\x15\x17\x94\x18\x43\xa5\xcf\x2c\xe6\x65\x9c\x3e\xa2\x98\x57\x71\x92\x9b\xf0\x05\x0f\x23\x4f\xf0\xe8\x84\x61\xd6\x50\x19\x98\xa1\x04\x07\x66\x86\x9b\xee\x3e\x6b\x2f\x43\xb0\xcc\x66\xca\xb8\xe5\xc4\xa6\xca\x66\x70\xe2\x9c\xe5\x1f\xb6\xf6\xb6\x30\xb6\x82\x38\x61\xe0\xf5\xcb\x4d\x50\x7c\x59\x05\x4f\xe8\xb6\xa7\xa7\xcf\x4c\xd4\x45\x29\xda\x9a\x9e\x6d\x24\xcd\xcd\x09\x78\x80\x4d\x58\xcd\x70\x34\x97\xe0\x2a\x79\x0c\xa4\x4e\xef\x44\x6c\x77\x0e\xbc\x60\x9c\x36\xc5\xa4\xac\xa6\xaa\xa6\x8f\xcb\x98\xa7\x9a\x38\x73\x35\xd0\x53\x77\xbb\xf2\xda\xda\xda\x9a\xf6\x14\x8a\x3b\xcc\xf3\xa6\x82\x0e\xfb\x82\x0e\x87\x57\xa2\x19\xde\x67\x3b\x63\x70\x88\xb6\xca\xac\x6f\x54\x76\x87\xd4\x22\xc3\x7c\x19\xac\x66\xb4\x4f\x86\x1a\xb1\x24\x63\xdb\x29\xda\x9e\x52\x5b\xeb\x8a\x89\x8a\x88\x36\xdd\x15\x83\xda\x92\x83\x88\xeb\x08\x13\xfb\x6d\x81\xf1\x16\x8c\x96\xab\xab\x59\x76\xc1\x72\xd2\x8f\x50\x29\x8e\x29\x40\x97\xbb\xe8\x17\x7b\x47\x0e\x7d\xfa\x0a\xff\x40\x6f\x52\xa7\xa8\xe5\xa4\x9e\xe4\x11\xb8\x99\xe5\x7a\xa3\x55\xb1\xf0\x18\x12\x00\x8e\x4c\x8c\x85\xab\x2c\x3e\x5d\x36\x01\x7f\xac\xd2\x13\xb5\x9a\x4a\x7f\x95\x48\x01\x28\x69\xac\x8d\x4d\x8f\x33\xe9\xbd\x16\xb6\x48\x73\x3f\xa1\xc2\xd5\x44\x32\x28\xbe\x14\x86\x95\xdb\x70\x52\x46\xfb\x55\x6d\x63\x7d\x71\xaa\x79\x1c\x0f\x7d\x19\x0c\x04\x19\xa9\x24\x69\xc5\x2e\xaf\x74\x68\x19\xba\x6f\x19\x7a\x40\x92\x70\xe1\x18\xd3\x2c\x2e\x0d\xd9\x52\x6c\x0b\xdd\x9b\x06\xe0\xbd\xef\x78\x61\x3d\x54\x3d\x4d\x77\x2d\xfb\xb5\xf5\x7c\x63\x63\x6d\x63\xd3\xac\x56\x6a\xf6\x6b\xb3\xf2\x72\xd3\x2f\x5a\x2e\xc1\x17\xb5\x4b\x86\xc9\xd6\x5e\x5b\xe6\x26\x62\xfc\x5c\xd4\x82\xa9\x55\x55\x1f\xf3\x46\x98\xd1\xfa\x12\x84\xb0\x0a\x18\x75\xa1\xee\x6b\x7a\x44\x96\x6a\xf0\xa4\x61\xa4\xb0\x43\x43\xb6\xb4\xa7\xbb\x9a\x4e\xb8\x95\xea\x8a\xc1\xd5\x5b\x31\x9f\x10\xdf\xef\x15\x5d\xd4\x2f\x4d\xf7\x8a\x96\xcb\x92\x3d\xfa\xab\xab\xcb\x36\x1d\x8a\xc5\x7a\x3a\xfe\x31\xa4\x9f\x67\xa7\xbb\x2f\xd1\x5a\x1a\x00\xa8\xe8\xc4\xf5\xa5\xdc\x39\x2d\x37\x98\x76\xf7\xd0\x9e\x62\xb9\x4b\xe7\x54\xae\x35\xb1\x80\x1e\x5b\x71\xe0\x37\xb1\x20\x3a\x9b\xca\x1f\x17\xe0\xac\x62\x49\x0d\xa1\x45\x2c\xd5\x4b\xd9\x30\x00\xed\xd0\x0e\xc1\x27\x2a\x2f\xe9\x9c\x96\xdf\x47\x0f\xd5\xb8\xd0\x99\x37\xf6\xfc\x3b\x8f\x65\xab\x75\x81\x3d\x70\xbc\xd1\xa1\x3f\x70\x86\x0e\x80\x9f\x2c\x85\x69\x43\xa1\xed\xb8\xc2\x37\xb6\xeb\xfa\x77\xc4\x0a\x14\x0f\x3f\xb1\x34\xe1\x2c\x20\xfd\xa0\x7f\xea\x4c\xc0\x3b\x67\xe2\x84\x9f\xac\x0a\x58\xa7\xc2\x85\x70\xc8\xc8\x48\x90\x74\x78\xca\xf2\x07\xfc\xcb\x2d\x07\xcf\x7e\xe8\xbb\x11\x50\xf2\x26\x32\x71\x38\x87\x4e\x18\x0b\xf2\xc8\xcb\x6d\xd0\x37\x2b\x51\x85\x48\xf9\xbe\xe3\xf5\x7d\xd4\x47\x4b\x99\x85\xc3\xd2\x4b\xda\x8b\x89\x3d\x27\x8b\x06\xc7\x65\xf3\xfa\xc0\x32\x8d\x0a\xc5\xf4\xce\x86\xde\x99\xe7\x4c\xa6\xe4\x9e\xc9\x19\x48\xf6\xb9\x31\x0f\x62\x4a\xf3\x53\x21\x20\x25\xf7\x0c\x32\x68\x7b\x26\xfd\xac\xd0\xcf\x35\x2b\x0b\xa9\x3c\x02\xe1\xa1\x3d\x55\x95\x2d\x76\x8f\xdb\x7b\x67\x29\x7b\x4c\x33\xbd\xd7\xe2\x7e\x90\xce\xb4\xef\x83\x10\x4c\xce\xc2\xe1\xcb\x98\xee\xfc\x9b\x77\x7e\x7f\x0c\x06\xdc\xbb\xbe\xf9\xde\x0e\x43\x00\x3d\x3e\x0f\xd9\x6c\x3a\xc0\xa2\x43\x5a\x13\xcf\x9f\x48\x6c\x62\xdf\x82\x41\x7a\x4a\x11\xcd\x77\x3c\xa7\xf0\xc6\xd4\x39\xe5\x18\x52\xe1\x24\x45\xbb\x4f\x4e\xb1\xc6\xbb\x66\xe3\xc0\x32\xf3\x41\xb5\xea\x7b\xd6\x9a\x9e\x9a\xd8\x79\xdc\x36\x7d\xc3\x78\xed\xde\x6c\x68\x85\xe4\x4a\x43\xd7\x8c\x1f\x58\x74\x58\x11\x14\x56\xce\x86\xa3\xc0\xba\xbc\x7a\x4a\x37\x25\x17\x04\xb2\xb5\x8e\x1f\xe3\x0a\xbb\x11\x2b\xce\x89\x8f\xb7\x66\x43\x15\x3c\x3e\x46\x51\x6e\xf0\xc3\x3a\x1c\x61\xd1\x06\xe5\xf3\x73\x5b\x4c\x80\xce\xca\x21\x51\x1f\x44\x04\x58\x08\x77\x6b\x36\xcc\x76\x06\x91\x2b\x7b\xfc\x6f\x82\x6a\x8a\x80\x0b\xa1\x47\x3d\xcc\xb6\x81\x48\x1d\xa9\xe9\x49\x32\x20\x63\x05\x9b\x98\xa9\xd1\xfb\x4b\xe3\xca\x02\xb9\xb4\x71\x6c\x38\x92\x87\x2b\xc7\x30\x00\x4e\x6a\x14\x65\x32\x8d\xcc\xf3\xa1\x6e\x1a\x91\xc2\xd9\xb0\x2c\x67\x75\x55\x75\xac\x50\xd3\x1d\x76\x96\x84\x79\x2d\xdb\x83\x5b\xdb\xeb\x0b\x74\xe5\x53\x3f\x28\x12\x61\xb7\xac\xea\x14\x80\x71\x0b\x4c\x6c\xc7\x73\xbc\x51\x62\x00\x92\x22\xc7\xde\x6c\x18\x31\x2a\x14\x72\x2e\x31\x10\x5c\xb4\x1b\x7d\x05\x3c\xdd\xcc\x85\xd8\xf7\xbd\x60\x36\x01\x5f\x09\xb4\x58\x5c\x00\xd6\x09\x1a\x3e\xda\x60\x85\xbe\xb5\x9c\x0c\xb2\x37\x1b\xb2\xab\xff\x6c\x48\x27\x0b\x4d\x40\x35\xf5\x03\xda\x02\xb7\x2d\x65\x07\xe3\x36\xd6\xbc\xa1\x3d\x2d\x5a\x68\x5c\x25\xfe\x42\x6d\xdf\x0a\x64\xce\x24\x14\x0c\x03\x17\x9d\xea\xc9\xa4\x17\xf4\xc0\x4f\x68\x03\xb3\x55\x46\x20\x4c\xe9\x32\x34\x96\xe1\x25\xda\xfa\xa3\x5a\x7b\xef\xa2\x13\x20\x7e\xd6\x4a\x9e\x30\xf8\x19\xdd\xc8\xd8\x69\x83\x9f\xd1\xad\x9f\x9d\x3c\xf8\x59\x45\x4f\x9c\x42\xf8\xd9\x5a\x2e\x41\x68\x0c\xc0\x0c\x4d\x12\x9d\x4a\x05\x0a\x8c\x69\x46\xfb\x94\x24\x5a\x86\x02\x02\xca\x31\x9a\x70\x00\x18\x61\x18\x51\x08\x31\xe8\xb3\x16\xf7\x8c\x1d\xbd\x06\xf7\x8c\x1d\xc3\x26\xf7\x8c\x1d\xc9\x15\xee\xd9\x1a\x3b\xa6\x33\x27\x9b\x58\xfd\xc3\x1a\x5b\x74\x9e\x9b\x79\xc5\x8c\xa8\x58\x65\x39\x68\x3f\x95\x89\x58\xee\x70\xff\x1a\x3e\x34\x43\xae\x34\x7f\x2b\x54\x0c\x64\x3d\xbf\x84\xc0\xa9\x6d\x2f\xba\xc6\xd4\x12\xae\x12\xf0\xd1\x5a\xd7\x74\x35\x72\x93\xa0\x5b\x45\x34\xd5\x62\x7b\x75\x37\x6c\x06\x87\x20\xb4\x57\x57\x99\x2b\x90\x46\xea\xbf\xd4\xf4\xc8\xe1\x82\x3c\x31\x9f\x33\xd1\x38\xe1\x10\xcb\x43\xe8\x4f\xd0\xfe\xd7\xc0\x09\xea\xe3\xac\x11\x29\x9f\xa8\xe2\x5a\x45\x5f\xab\xe8\x95\x8d\x0d\x0d\x5d\x6a\x96\xad\xdc\xf2\xef\xf8\x9a\x51\x5c\x33\x6a\x2c\x8f\xbd\xf9\x88\x05\x7d\xd5\xb3\x5e\x3d\x2f\xaa\x25\xf3\x7b\x9c\xc0\x26\xb4\x2f\xde\x18\x9b\x46\xd5\xd4\x74\xef\xd1\x82\x3a\x36\x52\x3e\x54\x8a\xa2\x86\x3d\xad\xe8\x17\x03\x81\x3d\x3b\x17\xa0\x8c\x73\xf2\xa8\x12\xdf\xe0\x38\x85\x11\xf5\x9a\xd0\x2b\x5a\x71\xad\x52\x5b\xb2\xb9\x0c\xec\xd9\x54\xa9\x92\x6a\x7f\xa8\x08\x0b\x60\x07\x89\x6a\x66\xda\x89\xa6\x46\xab\xbe\x87\xc6\x92\xe0\x15\xac\xae\xaa\x9e\xb5\x56\xd1\xcd\xf8\xd1\xa6\x57\xb4\x8c\xea\x7a\xf2\x81\x59\xad\x24\x1f\x54\xaa\x5e\xd1\x5a\x43\xf7\xc7\xb5\xca\xb2\x64\x4c\x10\x8d\xf8\xf2\x54\xf1\xf7\xc8\xd5\x28\xe5\x76\xc9\x8c\xab\x00\x84\x3e\x54\x15\x7a\x07\x2b\xe0\x2e\x16\xf0\x78\x60\xc3\x2d\x3c\xe2\x3a\xd0\x9e\x98\x58\x33\x9a\xc7\x19\x1b\xf3\xcc\x72\x8b\x8c\x72\x32\x42\x80\xf4\x05\x31\xe6\x46\x29\xb7\xc8\x9c\x80\x6b\x2b\x99\xa2\xf1\x29\xad\x6a\xb5\x44\x0c\x5f\xbe\x14\x6a\x91\x09\x47\xf9\xe7\x88\xb9\x00\xd9\xc7\xbd\xd9\x30\x92\x21\xa7\xc1\x94\xfb\xb6\xeb\x92\x88\x15\xe9\xf7\x5a\xe6\x09\xe1\x79\x2d\x46\xad\x54\xd3\x96\x05\x05\x2f\x10\x5f\x6b\x01\x6a\x03\x85\x39\x13\x58\x18\x38\xc4\xb7\x08\xc7\x1c\x2e\x84\xd7\xa0\x10\xa0\xc2\x2b\x4a\x96\xcc\x84\x5a\x22\x51\x19\xb9\x5c\x5a\x96\xf8\xf2\xb9\xc9\xd1\x9a\x9a\x14\x55\x41\x06\x7a\x6c\x72\x24\x12\x9e\xa5\x4c\x92\x24\xb8\xc9\x6a\x67\xee\xe0\xf1\xc8\x67\x20\x05\x20\x8c\x6e\xcd\x3c\xa8\x38\xe4\x62\x7a\x66\xa3\x2b\xb3\xfa\x1d\xcd\xc9\x5f\xb8\xb5\xdd\x19\x28\x0c\x7d\x58\x50\xd8\x14\x2e\x01\x0a\x50\xa9\x16\xbe\x2b\x02\x8d\x2c\x1e\x27\xf0\x4b\x15\xa3\x52\x51\xaa\xdf\x74\xb7\xe5\xd7\x21\xa6\x7f\x09\x7b\x3b\x0d\xe4\xe0\x8c\x1c\x70\x46\x06\xdc\xb7\xc1\x31\x9f\x72\x2e\xd7\x19\x5a\x8b\x8a\x65\x75\x39\xc7\xc4\x16\x6f\x0c\xee\x03\x95\x1c\xd6\x0d\x53\x2b\x0f\x1d\x34\x63\x55\x60\xbd\x59\x11\x23\xfa\xf8\x08\xf0\x5c\x44\x9b\x57\x3d\x54\xb5\xd7\x66\xe5\xa5\x56\x9e\xd8\x53\x54\x47\xf9\xf8\x71\xae\x14\xd1\x91\xf4\x30\xb5\x07\x6a\xb2\x64\x39\xf4\xe9\x6e\x63\x3e\xd7\xf4\x8a\xa6\x51\xe5\x26\x73\x9a\x4a\x08\x14\xc0\x5d\xa1\x05\x46\x3b\xf3\xa9\xfa\xc3\xe5\x2f\xbe\x80\xa7\xab\x1f\xb2\xfd\x4c\x48\x9f\x92\x9b\x14\xfd\x5e\x08\xd1\xaf\x15\x98\xed\xc6\xea\x2a\xbc\x84\xe5\xbd\x77\x57\xe5\xbd\x77\x58\x17\x13\xff\xc4\xda\x1a\x18\xef\x94\xd8\x02\x10\xcd\xe9\xf8\x0e\xa8\x3b\x56\xf6\xc2\x45\xf2\xf5\x31\x6f\xfb\x74\x97\xf8\x4b\xa1\xcf\xfc\x85\x9d\x60\x6a\xa3\xe9\xaf\x34\x1a\xa6\xa2\x3b\xec\xca\x63\xe8\xa6\xa6\x03\x9a\xcc\x36\xba\x14\xaa\xa6\xa6\x55\x4b\x26\xa9\xae\x3a\xd1\x6b\xbc\xf9\xaa\xd8\x2f\x41\xe5\x40\xf8\x51\x32\x34\x49\x2b\xbe\xb8\x15\xbf\x48\x73\xd9\x64\x69\xdd\x68\x37\xc5\xfe\x51\xec\x8e\x88\xf3\xf4\x01\x7c\x43\xae\x85\x6f\x2c\xe5\x97\xca\xea\x6a\xf8\xda\x52\x7e\xad\x64\x7b\xdc\x6e\x2a\x62\x81\x21\xd5\x9f\xa7\xa5\x85\xc5\x10\x21\x2b\x12\x5c\xa0\xbe\x2b\x35\xb4\x51\x6e\x8a\xab\x6e\x8a\x6b\x55\x55\x48\xaf\x7f\x8f\x8f\x90\xaa\xf0\x15\x34\xf4\xec\xab\x56\x45\x9d\x30\x68\x27\x5e\x29\x5f\x09\x9e\x41\xdf\x44\x73\x8b\x25\x84\xbf\x2a\x5a\x61\x15\x5e\x1a\x57\x56\x88\xa1\x17\x28\xf4\x4d\x65\x75\x55\xa9\x2a\x2b\x56\xb8\x19\xd5\x93\x10\x02\xd5\x14\x12\x8e\xbd\xe0\xa6\x5d\x39\x04\x41\xa8\x86\xda\xa6\x68\x2a\x20\x8a\x56\xc5\xc8\xeb\xfc\xb4\x93\xad\xbc\xd0\x71\x69\x64\x14\xb2\x56\xc2\x44\x58\xdf\xd4\xfc\x48\x2d\x15\x6c\x61\x43\x23\x58\xa8\x1f\xe7\x66\xef\xe3\xc7\xc7\x8f\x73\xe3\x85\xf6\x4c\xc3\xab\x0b\xcf\x21\x67\xa8\x3a\xd1\x10\xa9\x0e\xa2\x9a\xa2\xe8\xce\xa5\x79\x85\x77\x88\x6d\x3b\x04\x9a\x8e\x96\x04\xd4\xbe\xa0\xb7\x45\x2b\x24\x7c\x76\x14\x49\xe6\xd2\xb8\x62\x71\x33\x42\xa1\x90\x76\x75\x55\xf5\x2d\x25\xf4\xfd\x82\xeb\x13\x6b\x77\xae\x0e\x02\xbe\x62\xe1\x07\x8e\x37\x00\xf3\xe3\xa1\xaa\xfc\x01\x8e\x33\xec\x5b\x0a\x98\xf4\xc0\x60\x00\x06\x05\x10\xf4\xed\x29\x88\xaa\xf2\x25\x35\x9d\xe1\x59\x42\x58\x13\x1c\x12\xd2\x6c\xda\x3e\x71\xe5\x29\x80\xf9\xd4\x81\x60\x80\x60\x25\x2a\x6a\xba\xbf\xa9\x26\x0c\xea\x73\x86\xa0\x5a\xb0\x7b\x3e\x0c\xa9\xf1\xbe\xaf\x23\xac\xa2\x95\xa3\x92\x5f\x58\xa5\x12\x8f\x71\x18\x75\x78\xc5\xd0\x9e\xb2\xc4\x2b\x42\x09\xf9\x36\x55\x1e\x6e\x31\xa4\x90\xe9\x60\xc4\xbb\x11\x94\x2d\x5d\x6e\xa2\xc1\x22\xa2\x99\x15\x57\x83\xba\xa9\x6d\x56\xaa\xa6\x46\xd0\xca\x70\x27\x74\x36\x67\x94\x65\x44\x26\x87\x4a\x5f\x82\xab\xcb\xf0\xaa\xe6\x6c\x3a\x2b\xf8\x77\xd9\x19\x79\x3e\x04\x9b\x78\xfe\x13\xd7\xd3\x37\xca\x5f\x53\x98\x52\x3c\xa3\x2c\xd8\x4c\x70\x23\x4a\x13\xd5\x76\xbc\x51\xe1\x65\xa9\xe7\x84\x85\x3e\x29\x54\x40\x4c\x4f\xb5\x60\xcc\x95\x62\xc8\x9f\x78\x46\xf2\xc8\xd3\xaa\x0e\x76\x72\x26\xb1\x7f\xf4\x4b\xa8\x87\x57\x34\x54\x68\x46\x3d\xb0\xba\x2a\x68\x18\x0c\x10\x4b\x5f\x54\x68\x7b\x19\xc7\x89\x50\x5b\x16\x1c\xbb\x2e\x2c\x02\x27\x62\xe3\xea\x47\xed\x66\x2a\x15\x87\x1e\x6a\x5f\xd6\x2d\x96\x67\x83\x97\xca\xc4\x69\x50\xd4\x50\xab\x56\x0c\x61\xa1\x6c\x82\x13\x35\x5c\xbe\x27\xdc\xcb\x02\xc2\xad\x70\x48\xbb\x23\xe6\x42\xb7\x77\x1a\x02\xec\x29\x1b\x1a\x47\x59\xd1\x4d\x43\xa3\x61\xc0\xcd\xaa\x4c\x02\x90\xf6\x58\xb7\x42\x3e\x38\xf7\x1a\xa9\x27\x53\x6e\x31\x91\x34\x4f\x09\xa2\xfc\x0c\x37\xcd\xb5\x4a\xf5\xa5\xa1\x25\xdd\x85\xb8\x44\xcd\xe9\x37\x41\x9c\xee\xad\x05\x46\xa8\x57\x58\xa6\x8e\x4d\x9a\xf9\xab\x65\x61\xa3\x9a\xa9\xc8\x27\xba\x52\xc3\x44\xe9\xe7\xd9\xd2\x71\xfa\x9c\x54\xd9\x17\xd9\xb2\x71\x7e\x97\x54\x59\xb3\x52\xe5\x96\x1b\x56\xb2\xa5\xaf\xa7\xc9\x34\x1f\xa9\xfa\x15\x41\x37\x92\xe9\x34\x92\xe5\xd7\x8c\x6c\xf9\x8c\x73\x63\xb2\xca\x7a\xba\x8a\x54\x47\x99\x18\xf3\x75\x39\x81\xa5\xd4\x78\x9e\x26\x5d\x34\xc1\x7a\x76\x7f\x8c\x13\xf0\xb6\x81\x37\x08\xb6\xd8\xaf\x64\x93\x26\x58\xcb\x8a\x37\x28\x27\x94\xd5\x89\x55\xe5\x22\xb1\xf4\x9c\xba\xf7\xfa\x58\xce\x86\x6d\x42\xd4\xe4\x00\x1a\x46\x65\xb9\x46\xb7\x5b\xf5\xbd\x9f\xab\x4d\x33\x33\x8c\x34\xb8\xd9\xf1\x2c\x9c\xce\xc2\x14\x59\x0c\x33\xbd\x70\x33\xb1\xd0\xd2\x35\xd6\xd2\x13\x3e\x1a\x89\x09\x08\x6d\x3c\x08\x3b\xf8\xac\xcf\x54\x7c\x55\x0d\x37\x25\x55\x99\x7b\x59\xdd\x0d\x31\x84\xf3\x6b\x3b\xfc\xc4\x2c\x15\x97\x2c\x6e\xc9\x65\x90\x51\x21\x7d\x89\x32\x96\x42\x78\x15\x45\x93\x75\x54\xd8\x7c\x66\xab\x12\x03\xff\x1a\x90\x32\x6c\xc5\xdd\x27\xbe\x19\xfc\x3a\x7b\x51\xa5\xa4\x5f\x17\x6c\x3c\x89\x94\x51\xe9\xbd\xc7\x58\x7f\x59\x4d\x4b\xac\xa9\x1a\x27\x2a\x81\x86\x53\x95\x14\xca\x6e\xbd\xe9\xe6\x44\xdb\xb6\x1a\xf9\x8d\x2f\xae\xc9\xb7\x49\xd5\x20\x6a\x72\x1b\xaf\x18\xc6\x7a\xb6\xdb\x5b\x89\x18\x13\x71\xbf\xa3\xac\x0b\xdf\x70\xa2\x6e\xef\x34\x0a\xef\xa1\x73\x6b\x87\x80\x3f\x58\xe9\xc9\x4a\xb8\x29\x5e\xb6\xc0\x14\x3f\x0d\xd3\x62\xdf\x77\xda\x8d\xe8\x7b\xa3\xdd\x8c\xbe\x1f\x73\xcf\x3b\xa7\x1b\x15\x8b\xab\x7c\xa9\x7c\x34\x94\x2b\x9e\x65\xe3\x5e\xfd\x7b\xd2\x37\x7f\x45\xb9\x92\xfa\xcb\x46\xb9\x05\x63\x75\x1d\x6e\xa7\x97\x57\x27\x4e\x5a\x1a\x5f\x83\x48\xb5\x30\xaf\xda\xd0\x87\x77\x36\x1c\x9c\xda\xbd\x76\xe8\x4f\x53\x0d\x7a\x0b\x6a\x4e\x76\x01\x18\xa4\xea\xdc\xb2\x2e\x47\x20\xf8\xb7\xc3\xdc\xb7\x30\xaf\xbd\x74\x4e\x4c\x23\xd1\xee\xbf\x2f\xa8\x8a\x55\x40\xa6\xc2\x17\xfb\x0f\x64\xc5\x8c\x44\xb1\xff\x50\x3a\x6e\xff\x91\xf4\xcd\x5f\xe5\x41\x03\xed\x0b\x6a\xda\x62\x4a\x3b\xb6\x2f\xd1\xb6\xa4\x57\x8c\x64\x97\x89\x3c\x47\xd9\x54\x12\x5d\xfd\x8f\x13\x34\xfc\xab\x09\x12\xfe\x41\x0a\x89\xa4\x78\x89\x59\x6e\x72\x6a\x6d\x55\xab\x29\x7f\xa0\xac\x58\x30\x8a\xce\x13\x5d\xbc\x77\xda\x0d\x45\x87\x44\x94\x11\x09\x9b\x25\x52\x8d\x27\x5a\x24\xe4\x11\xfd\x6b\x52\x5a\xfd\xe6\x6f\xb0\x57\x3b\xed\x46\x79\x5b\x3e\xe8\xae\xe3\x81\xec\x24\xfb\xcd\xdf\xe4\xab\xef\x7c\xcd\x9c\x49\xef\x78\x71\x72\xe4\xe4\xaa\xf9\xcd\x7f\xca\x37\xf1\x36\xb7\x09\xb6\x78\x92\x2f\x52\x29\xc6\x55\x2d\x09\xff\xef\xf0\xf0\x0f\x73\xf6\x02\xc2\x93\xbd\x13\x13\xe2\xef\xf2\x50\x8e\x64\xd4\xfe\x2f\xf8\x52\xc7\xb2\x52\x7f\x8f\x2f\xf5\x3e\x99\x02\x3a\x63\xb0\xc3\xe6\x44\xac\x63\x10\xdf\xf0\x13\xd8\xfe\x03\xbe\x85\x8e\x0c\x8f\x7f\xc8\x97\x3a\x97\x95\xfa\x47\x7c\xa9\x0f\xb2\x52\xff\x35\x5f\xaa\x2b\xa7\x72\x52\xc7\xa4\xfc\xc1\xe5\xa6\x59\xab\xf4\x93\xeb\xee\x37\xff\x0d\x07\xec\x52\xb9\x4c\x2d\x35\x01\x8d\x84\xb2\xaf\x7c\x2b\xc3\x0c\x59\x1b\xed\x66\x92\x88\x7f\x92\xc0\xe2\xe3\x47\xf9\x22\xfb\x6f\x13\x25\xaf\x72\xb7\x86\x84\x4e\x4a\x3c\x94\x2a\xd0\xd0\xfa\x47\xf5\x56\xac\x30\xde\x4d\xa8\xa5\x12\xf1\xeb\x51\x9f\xfd\x4a\xfd\x38\x28\x6a\x35\xb5\xfc\xbd\xf6\x8b\x67\x5a\x0d\x6e\xaa\x51\x11\x0b\x5e\x56\xae\xd2\xa2\xde\x63\xbc\xcd\x5c\x9a\x57\x3a\xd0\xb4\x6a\x4a\x98\x40\x75\x2a\xc7\xed\x86\x28\xfc\x02\x83\xab\x69\x4f\x4f\x39\x53\x34\x41\xbe\xff\x2e\x41\x94\x5f\x2d\x1e\xc4\x6f\x99\xe8\xff\x98\x9f\x76\x9f\x7e\xde\x16\x30\xde\x85\x0c\xde\x18\x84\x48\xa2\x99\xdc\xec\xbf\x85\xb3\x0a\xa8\x04\xad\x5a\xd8\x69\x37\x0a\xc6\xbc\x62\x14\x94\x62\x28\x3b\xc3\x9e\x78\x3c\xff\x70\x31\x9e\xca\x4b\x1c\x4c\x2e\x81\x66\xfa\x8e\x3d\x74\x5c\x57\x55\x76\xa4\xe7\x66\xa2\xcd\x3f\xfa\x56\xda\xb0\x35\x20\x50\x6c\x51\xef\x07\xe5\x99\x42\x4f\xc1\x44\xcd\x84\x7e\x23\x85\x1a\x33\x69\x08\xa9\x35\xc3\x2f\xa9\x5e\x8d\x53\x33\xaa\xb1\x2a\x30\xa1\x5d\xdf\x13\x15\x25\xba\xb9\x44\xb9\x67\x4a\x95\x35\x92\xee\x13\x6d\x74\x8f\xea\xe8\xdf\xd2\xcf\xa6\x14\x32\x53\x22\x7e\x2b\x47\x4e\xa4\x75\x68\x9e\xfc\x51\xe1\x59\xc1\xa6\xb3\x5c\x22\xb3\xfb\xe9\x4d\x2c\x68\x60\x89\xd9\xa2\x26\xf6\x03\x2d\xf1\xeb\xfb\xc4\xaf\x62\xe2\x57\x29\xf1\xab\x9c\xf8\xf5\x2c\x31\x03\xf5\x50\x3a\x07\xb3\xcc\x98\x33\x24\x92\x65\xa8\x45\x7e\x14\x42\x46\x91\xce\x38\x04\x50\x4d\xe4\x47\x14\x9a\x45\x41\xad\x16\x59\x98\x3a\x9b\x8a\x1a\x6b\xa0\xf6\x0c\xcb\xa9\x2a\x1a\x7a\xf0\xf8\xa8\x94\xb8\x17\x26\x7a\xf1\x3d\x7d\x51\xe6\x5e\x54\xd0\x8b\xa2\xb2\x82\x16\x82\xf2\x0c\x7d\x32\x19\xc1\xde\x9a\xe5\x2c\x16\x87\xba\xfe\x28\xd6\x96\x47\xe8\x16\x02\x10\x12\xad\xf9\x77\xc5\xb0\xf8\x1d\xd6\x94\x4b\x45\xf1\xfc\x08\x3e\x17\x9c\x7f\xe8\xf9\x8b\x2c\xa7\x9f\xbd\x22\x73\x70\x5e\xe6\x97\x8f\xae\xb7\x5c\x95\x57\x92\xa6\x15\x2b\xef\x22\x23\x92\xca\x1e\x80\xfb\xa9\x3d\xa0\x01\x02\x18\x94\x37\xdf\x0a\xc5\x8c\xa1\x94\x77\x85\x28\x96\xfb\x19\xc8\x54\x39\xab\xa7\xd9\x4f\xfc\x94\x03\xe8\xc6\x27\xdb\x44\x0c\x3b\x6b\x9f\x8d\xaf\x3d\x15\x85\x83\xe2\x8b\xcb\xac\x29\x3c\x01\x1e\x45\xb7\xb5\x56\xa6\xd8\x93\xac\x58\x25\x51\xec\xd7\xb2\x62\xd1\x15\xf1\xb8\xdd\x40\x5c\x8a\xd4\x91\x85\x08\xbe\xbd\x81\x7f\x77\xea\x84\x2e\xe0\x18\x10\x0e\x40\x85\x4e\x0a\x02\x2c\x7e\xbe\x7e\x25\x71\x51\x8a\x39\x28\x1a\xcd\xbe\x86\xdd\xfa\x23\x09\x3f\xd3\x78\x3d\xab\x68\xcc\x47\x34\xdf\xa0\x96\xf3\x30\xd4\x03\xeb\xf2\x8a\x3a\x3d\xc1\x5a\xb1\xe8\x31\x87\xa7\x18\xfa\x65\xe5\x7b\xef\x4a\xd3\x5d\x0b\x7f\x2b\x9a\x57\x35\xfb\x8d\xe5\xc7\xba\x4c\x65\x53\x59\xb1\xdc\x4d\xd5\x8d\x9d\x23\xe7\xa6\x79\xea\x37\xda\x6d\xd5\xd5\xb0\x86\xf1\xd2\xbe\xb2\x5c\xad\xca\x17\x81\xa3\xde\xa9\xff\xc1\x34\xf1\x4b\x54\x2a\x20\xba\x6a\xbb\xa8\xd4\x94\xa2\xab\x69\x4f\x41\x32\x55\xb9\x94\x15\xbf\x5a\xaf\x29\xc5\x80\x5a\x60\xd4\x14\xad\xa8\xfc\x15\x85\xa7\xf7\xab\x24\x5d\xa3\x7c\xfd\x5f\x7a\xfe\xe0\xbe\x1a\x11\xf7\x89\xaf\x63\xa6\x46\x59\x3e\x10\x98\x29\x60\x9b\x75\x96\x00\x21\x31\xc8\x54\x35\xad\x06\x05\x8a\x81\xd8\xf3\x14\x3b\x39\xe2\x88\xbd\x4c\xc9\x6b\x90\xc8\xec\x94\x33\x0e\xe3\x0e\x72\x68\x9a\x57\x09\x3d\x1c\xc0\x9c\x6e\xe2\xfd\xef\xa5\x1b\x5b\x49\x5f\x4d\x15\x26\xb0\xd8\x58\x40\x4c\x7a\x2f\x68\xc4\x69\x5f\x2d\xb5\xac\x3d\x73\x28\x52\x8c\x75\xb9\x34\x59\xfa\x06\x53\x91\x29\x4d\x70\x6d\x35\x27\xdb\x6d\x82\x2f\xaa\x7c\x1b\x9c\x28\x27\xad\x90\x07\xfa\x5a\xa4\x70\x32\x5f\x92\xa9\x3b\xc9\xc8\xf0\x61\xbd\x61\x00\xd0\x1d\xa7\xb0\x61\x20\x8e\x26\x20\x06\x91\x82\xbd\x65\xa3\xb2\x14\xa9\x7f\x75\xd9\x9f\x06\x86\x59\x59\x5b\xdf\x78\xfe\xe2\xea\x7b\x7c\x17\x7b\x96\x9c\x03\x34\x09\x89\x1d\xfa\x3d\x42\xfa\xec\xc0\x8b\xd3\xc9\x90\xdb\x1b\xb1\x9e\x83\xc9\xe9\xf8\xe2\xc5\x0b\x01\x7a\xb1\x4d\x6f\x66\x5a\x26\x92\x76\x90\x65\x4b\xac\x6f\xa1\xee\xd4\x54\x61\xc7\x7e\x55\xbb\x2a\xd6\x54\xf4\xf1\xbd\xa6\xd6\xd4\xcb\x8f\xc1\xc7\xf6\xd5\xf7\x9a\xb6\xf9\x8b\x67\x78\x2f\x82\x16\xea\x8d\xee\x58\xe1\xe5\xda\x95\xa6\xc7\xbb\x01\x4e\x4d\x5d\x85\x3a\xde\x15\x9c\xa7\xf4\xd8\x8a\x99\xcc\x19\x9c\xdf\x86\x85\x89\x3f\x98\xb9\x20\x35\x28\xb1\x98\xf8\x52\xf9\xa5\x92\x77\x68\x38\x58\xb3\xdc\x9e\xda\x7d\x74\x62\x38\x36\x1c\x61\xb3\x29\x2d\x86\x50\xae\xe7\x54\x27\xb3\xe9\x6c\x2a\xab\xbb\xb5\xb0\x2e\x16\x6f\x49\x6a\x37\x16\xd6\xc6\xe1\xed\x65\xd5\xb7\x17\x56\xc7\x12\x69\x49\xed\x9d\xaf\x47\x3d\xab\xd3\x90\x08\x85\xdb\xcd\xf2\xee\xd7\x52\xf5\x6b\x80\xef\xe5\xb3\x09\x89\x8a\x5c\x1b\x25\x93\x07\xf2\x76\x19\x20\x2c\xd8\x71\x12\x8c\x4e\x7f\x99\x19\xa0\x4d\xe1\x16\x11\x55\xad\x91\x50\xd4\xc4\x12\x3f\xd4\xcd\x74\xa7\xd3\x69\x55\x6a\x71\xa0\x4a\xa3\x06\x5f\x87\x35\x58\x2c\x6a\xcb\x29\x11\xda\xcd\xf2\xbe\x15\x2f\x93\xcd\xfd\xcc\xbd\x28\x25\x43\x42\x9b\x90\xb1\x62\xc1\x4d\xd3\xb2\x60\x4a\x4d\x09\xa0\x1d\x80\x7a\xcf\x47\x6c\x7b\xb5\x92\x7d\x4f\x95\x57\xd5\xb5\xd8\xf6\x39\xf3\x4e\x00\x71\x0b\xb8\xfe\x5d\x02\xe5\x03\x1e\xe5\x83\x9f\x8c\xf2\xa9\x8f\x97\x00\xc1\x39\x8d\x18\x2e\xf1\xce\xf1\x80\x18\xb9\x53\x9f\xac\x3e\x1e\xbd\x77\x0b\xb7\x1a\x04\x2f\x90\xad\xb9\xc3\x9c\xea\x24\x64\x73\x6e\xf5\xf7\x0b\xab\xa3\x8b\xac\xb4\x7a\x3b\xa7\xfa\x2d\xb5\x74\x90\x6f\x75\xa7\x29\xb9\x0e\xe7\x43\xf9\xda\x32\xd3\xb4\x65\xf0\x72\xb6\xbf\x4b\xe5\xcd\xa9\x50\x7e\xda\x6e\x96\x3f\xe4\xa0\x9a\x18\x1c\x09\xb2\xdd\xdf\xfb\x32\xec\xd9\xfd\xb1\x64\x1d\x5e\x2a\x3f\x44\x5a\x23\xb4\x79\xc5\x68\xda\x5f\xb1\x8f\x2d\x50\x70\x14\x25\x94\xe8\x89\x09\xdc\x17\x8c\xe6\xa5\x71\x85\x97\x53\xf4\x2b\xed\xd4\xb4\x48\x50\x8f\xc7\xb4\x9f\x7f\x1e\xa7\x41\xbc\x31\x6a\x95\x8d\xe7\x35\x23\x01\xa6\x2c\x48\x4a\x9a\x50\x88\xd3\x4c\x9c\x84\x04\x2d\xff\x4e\xbe\xcb\x0f\x63\xc2\xbf\x8d\x9f\x8e\x96\xe9\xfe\x26\x8e\x38\x12\xbd\x12\xec\x6a\x75\xd7\xa5\xe3\x1d\x64\xf6\x10\x92\x2f\x87\xbc\xad\xd3\xc1\x52\x57\x12\xb8\x5d\x4b\x2e\xa5\x46\x2d\x7c\x9d\x58\x60\xb5\x90\xcd\x37\xce\xb2\x8e\x31\x75\xe1\x15\x67\xf6\x48\x36\xce\xeb\xb4\xba\x61\x49\xd0\xd4\xea\x4d\x06\xb9\xec\xf0\xbb\xb3\x23\x5b\xbc\xee\xcf\xd6\x2d\x33\xd9\x2d\xf7\xe7\xeb\x56\x62\x1c\x26\x32\xdd\x4c\xc8\x47\x54\xe1\xf6\xbb\xb0\x58\x79\x7c\xdc\x88\xa6\x4a\x58\x34\xaf\x36\xbd\x99\xeb\x56\xe9\x34\x0c\x8b\x15\xdd\xd0\x9e\x22\x48\x30\x07\xd2\xc6\xe3\x63\x45\x00\x09\x47\x3f\x52\x8a\x09\x80\x45\xa5\xa0\x73\x8f\xd6\xb2\x8f\xd6\xf1\x23\x4d\x79\xe2\x84\x92\x79\xf2\x0a\x12\x8c\x88\x43\x28\x26\xaa\x6f\x19\x35\x3f\x45\x54\xbf\x58\x64\x71\xa0\x68\x93\xbe\x6e\x60\x20\xc1\xeb\x35\x43\x33\x2c\x2b\xd8\x74\x98\xd8\xaa\x6a\x92\x9f\x24\x26\xa8\x81\x8e\x60\xf4\x93\xc5\x16\x44\xbc\x02\xfa\xcd\xe2\x82\x1a\xd5\x75\xf2\x80\x8f\xf4\x57\xdd\xa0\x30\x48\xb4\x50\xa3\xfa\x82\x56\x62\x71\x40\x8d\xea\xcb\xe8\x09\x8b\x04\x6a\x54\x5f\x91\x67\xe9\xd8\x7f\xd5\x0a\xc6\x41\x75\xa2\x38\xa5\x11\x3a\xa6\x56\xad\xa4\x10\x32\xab\x95\x2c\x46\x66\xb5\x92\x44\xc9\xac\x56\xd2\x38\x99\xd5\x4a\x16\x29\xb3\x5a\x41\x58\xe1\xa8\x80\xe9\xd8\xa6\x24\x67\x58\x01\x93\x71\xc3\xd0\x08\x39\x5f\x6a\x4e\x36\xee\x67\x50\x5a\x33\xa2\xc2\x6b\xa8\x15\x54\x9a\xa6\x86\xf4\x2c\xa8\xfa\x9a\x26\xaa\xe7\xb0\x78\x59\x3a\xff\xd2\xf2\x74\xbf\x68\x6d\x44\x19\xcb\x88\xf7\xbb\x6a\x5b\x38\x07\x91\x46\x2e\x69\xce\x50\xf5\x8b\x56\x45\xb7\xdf\x30\xd9\x05\x8b\x76\x4a\x67\x4c\xdf\xf7\x42\xc7\x9b\x81\x9a\xa0\x5d\xfb\x29\x42\xf6\x15\x46\x56\x86\x1a\x0d\xd4\xc5\x11\x62\x1d\x11\x20\x13\xcf\x34\x28\xad\xc7\x04\x58\xc7\x04\xf8\x42\x5c\x46\x51\xdf\x6b\x11\x31\x3c\x51\x65\x9e\x0a\x5c\xc0\x30\x9e\x0a\x44\x40\x17\x72\xb0\x2c\xcb\xfe\x06\x4a\x64\xda\xb6\x9f\x28\x29\x64\x68\x25\x28\x10\xbc\xb1\x5e\x19\xab\xab\xc1\x6b\xeb\xd5\x8b\x4d\xe1\x3c\x78\x65\x14\x5f\x56\x83\x37\x96\x69\x90\x72\xa6\xf1\x02\xcf\x2d\x01\xc5\x4c\xc3\x28\xbe\xd4\x9e\x1c\x3e\x5a\x60\x96\x9d\x48\x8b\xcb\xd2\x17\xb2\x51\x56\x14\xa5\x69\xac\x4f\x49\x49\x35\x61\x04\x26\xb2\xf3\xc1\x4b\x7b\x64\x6f\x70\xe7\xac\x96\xcf\x2f\x18\x9e\x12\xaf\x96\xe7\x7c\x3d\xde\x47\x34\xcb\x26\x21\x1e\x41\x2b\x9a\xcc\x59\x34\x87\x8f\x32\x6b\x0b\x38\x16\x9c\x89\xa9\xa6\x14\x61\x51\x69\x29\x49\x59\xc4\x1b\x4f\xd2\xe7\x4b\x65\xd3\x4b\x1d\x5e\x7f\x59\xf0\xc7\xc4\x34\xf9\x21\xd8\x5c\xc8\xf5\x99\x9e\xa2\xe1\x8d\x70\xf9\x3a\x15\x52\xe7\xf9\x57\xb5\x53\xa9\x99\x35\xa3\x86\xc6\xbc\xba\x91\xc7\x8c\x65\xab\x6e\x18\x5e\x8a\x2f\x9d\x4a\x87\x66\x65\x2a\x50\x4e\x88\x35\x32\x81\x3f\x0c\x5b\xe9\xb9\x5e\xfe\xc5\x54\x36\xe8\xbf\x90\xb6\xfa\x9d\x32\xfd\x4e\xb2\x3e\x6e\x24\xd0\x0a\x37\x4a\xae\x04\xb2\x66\x60\x7d\xa1\x69\x59\xcc\x2c\xf5\x9b\xe4\xa5\x32\x41\x0c\x31\xb1\xc7\xc9\x48\x2b\xbf\xdb\x26\x4c\x0d\x4b\x12\xbe\xb1\x89\x58\x84\xbc\x44\x4f\xd6\x7f\xf7\xcd\xa0\xde\x6c\x7c\x3b\xc1\x76\xea\x87\xcb\x74\xe4\xf9\xef\xb4\x05\x33\x63\x1d\xc4\xa4\xb4\x04\x52\x01\x47\xa1\xac\x62\xd3\x94\x27\x7e\x92\xdf\xc8\x26\x39\x94\xce\x64\xb4\xc7\xa1\xdd\x81\xd3\x92\x19\x57\xba\x69\x68\x25\x93\xc4\x80\x72\xb0\x98\x99\x7f\x6f\xf2\xef\x6b\x99\xae\xa4\x9c\x5e\xa0\xee\x48\xfb\x1b\xc9\xfb\x0c\x3d\x75\xa7\x82\xb2\xe3\xec\x17\x50\xfc\x3c\x58\x5e\x05\x4e\x5a\x08\x64\x2d\x84\x92\x86\xc5\xcf\x2f\x95\x37\xa1\x74\xaf\x2b\xc8\x5e\x95\x67\x5f\xa5\x81\x27\xc0\x66\x52\x9a\xdc\x4a\xda\xff\xee\x4e\x56\x65\x2e\xa9\xf1\xfd\x5c\xda\x88\xb8\x4a\xf9\x21\x7d\xce\xae\x24\xef\x38\xaf\x4d\x2d\xbb\x77\x3a\x43\x15\x6d\x9f\x34\x17\x3a\x5f\xba\x42\xad\x41\x6a\x8b\xb5\xbf\x51\x5e\x0f\x0a\xd7\xbc\xa2\xc7\x2b\x36\x5c\xca\xf2\x5c\x72\x00\xd8\x95\x21\xc1\x5b\x7c\xf7\x20\xa5\xc3\x83\x8c\xd8\x5f\xa4\xf3\xe0\xbb\x47\xf9\xab\x27\xf9\xab\x5f\xa7\x5e\x25\x62\x58\x0e\x99\xfa\x94\x8f\x4a\x28\x0e\x94\x17\xf4\xa1\x83\x93\x00\xb2\x00\x59\x7b\xef\xb8\xe8\x80\x23\x77\x62\x4f\xb7\xec\x00\x7c\xe2\xc3\x52\xc7\x31\x0c\x78\xf8\xa9\x90\xd4\xd9\x5c\xf1\x29\x88\xab\xab\x2b\xc9\x18\xe6\xac\x65\x3e\x65\x1e\x2e\xfe\x89\xd8\xf9\x24\x9f\x43\x40\xb3\x3f\x91\x22\x16\xd8\xa4\x01\x12\xec\x20\x70\x46\x9e\xfa\xe5\x29\xdd\x05\x1d\x50\xc9\x50\xfc\x88\xc6\x4a\xe7\x43\x2b\x70\x30\x97\x0a\x93\x90\x76\x1a\xd5\x6a\x31\x82\x7c\x58\x04\x05\xb1\x7b\x51\x04\x85\xa2\x72\xa5\xe8\xca\x88\x0b\xd3\x84\xda\x01\x51\xce\xd2\x18\x86\x0e\xac\x37\x1c\x4e\x44\xfb\x9d\x4b\x7d\x71\x94\x2a\x52\x7d\x85\xda\xe2\xf3\xc3\xf0\x15\xe3\x0a\xc2\xe3\x5b\x00\xa1\x33\x10\x65\x39\x22\x20\xc0\x02\x18\xb9\x29\x5e\x52\xd5\xd4\xf4\x24\x4d\x0f\xa9\x96\xc8\x5b\x20\xef\x62\x12\xf5\xc4\x18\xeb\x40\x80\x6f\xf6\xc4\x98\xd8\xd3\xe0\x93\x95\x2d\x58\xa6\xf7\xb8\x38\xec\x27\x2a\x49\x97\x4c\x54\x51\xd4\x04\x47\x13\x62\x9f\x26\x0d\xd9\x82\x41\x94\xaf\xed\xe0\xf8\xce\x7b\x0f\xfd\x29\x80\xe1\xbd\x0a\x68\x88\x00\xfc\xf2\x12\x5c\x55\x89\x69\xdb\x82\x96\xec\xc1\x40\xb2\x15\x90\x0e\x5a\x56\xb2\x0f\x51\x8a\x6f\xfc\x56\xbc\xc2\xa2\xc2\x4c\x75\xc8\x50\x8a\x6d\x8e\x25\xd8\x88\x67\x2a\xae\xbe\x62\x2d\x20\x76\x12\xb3\xfc\xb2\xa2\x29\x19\x2c\x3d\xaf\x7f\x16\xca\x24\x13\x15\x25\x33\x60\x53\xf3\xc4\x90\x33\x4f\x84\x9b\x1c\xf4\xcb\xf0\xca\x82\xc9\x08\x81\xec\x79\x72\x5e\xe3\x50\xea\x74\x93\x23\x23\xad\x86\xba\x78\x65\x29\xb3\x00\x40\xc4\x25\xea\xa4\xd2\x93\x90\x44\x1c\x0d\x63\x6f\x2f\x59\x89\x4b\xe3\x4a\xb2\x8c\x95\x11\xb4\xa7\xd7\x4e\x5f\xd1\xbf\x28\x3f\x28\x55\xe5\xb7\xff\xf0\x6f\x29\xba\x5d\x55\x7e\xfb\x0f\xfe\x2b\x45\xef\x55\x95\xdf\xfe\xbd\x3f\x56\xf4\x3e\xfa\xfc\xdb\x8a\x3e\x40\x9f\x7f\x47\xd1\x01\xfa\xfc\xcf\x14\x7d\x58\x55\x7e\xf3\x2f\x15\x7d\x54\x55\x7e\xf3\xaf\x14\xfd\x1a\x3d\xfd\x53\x45\x77\xd0\xe7\x7f\xae\xe8\x9f\xab\xca\x6f\xff\xfe\x3f\x52\xf4\x31\xfa\xfc\x7b\x8a\xee\xa2\xcf\xbf\xad\xe8\x13\xf4\xf9\xf7\x15\xdd\x43\x9f\x7f\xa1\xe8\x7e\x55\xf9\xed\xdf\xfd\x3f\x15\x7d\x8a\x3e\xff\x8d\xa2\xdf\xa0\xe7\x7f\x5d\xd1\x21\xfa\xfd\x17\x8a\x1e\xa0\xcf\x7f\xab\xe8\x21\x7a\xfe\x27\x8a\x3e\x43\x9f\x7f\xaa\xe8\xb7\xe8\xf3\xcf\x15\xfd\x0e\x7d\xfe\x0b\x45\x9f\xa3\xcf\xff\x44\xd1\xef\xab\xca\x6f\xff\xf8\x4f\x15\xfd\x01\x7d\xfe\x53\x45\x57\xbe\x28\x55\xe5\xff\xfd\xeb\x8a\xae\x3c\xa2\x0e\xfe\xf1\x3f\x51\x74\xe5\x49\xa9\x2a\xbf\xf9\x1f\x15\x5d\xf9\x35\xfa\xf2\xbf\x29\x4f\x82\x53\x39\x41\xc1\x72\x5d\x46\xc0\x1e\x74\x42\x27\xb8\x46\x04\xfc\x43\x02\x75\x31\xb0\x2d\x19\xb0\x59\xa0\x10\x57\xf3\x45\x03\xba\x2e\x1d\xd0\xc1\x2c\xec\xf3\xd8\xe8\xca\x2f\xd1\x97\xff\x4b\xd1\x95\x4b\xa5\xaa\xfc\x3f\xff\x5a\xd1\x95\x8f\x1f\xd1\xa3\x7f\xab\xe8\xca\x95\x52\x55\x1e\x29\x8d\x7e\xf3\xcf\x28\x8d\x86\x8c\x42\x7f\xc1\x28\xf4\xe7\x4b\x74\xaa\xb1\x60\xa9\x5f\x6e\x48\x71\x1e\x3a\x9e\x47\x69\x88\x70\xfc\xf1\x6f\x30\x1c\x7f\xfc\x07\x14\xc7\x1f\xff\xa6\xa2\x2b\xbf\x42\x5f\xfe\x44\xd1\xf1\x4c\xfd\xf1\x9f\x53\xb4\x7f\xfc\x53\x8a\xf6\x8f\xff\x2b\xc5\xfb\xc7\x7f\x4a\xf1\xfe\xf1\x2f\x96\xc0\xbb\x25\xc5\x0a\x02\x4f\x40\xca\x1f\xff\x09\x25\x25\x9a\xfb\x14\xcd\x3f\xa3\x68\xfe\xe6\xcf\x18\x52\xff\x9c\x21\xf5\x7f\x30\xa4\xfe\x19\x23\xe6\x3f\x5b\x02\xa9\x93\x7c\xa4\x0a\x7d\xdb\xb3\x07\x8e\xed\x21\xec\x12\x48\xfd\xf8\x3f\x64\x90\xfa\xf1\x7f\x66\xb4\xfb\x5f\x18\xed\xfe\x7c\x31\x9a\x3f\xfe\x9b\x25\xd0\x3c\x90\x6e\x2b\x00\x4e\x62\xec\x30\x59\x64\x23\xfb\x27\xf2\x71\x64\xf3\xef\xc7\x7f\xbc\x04\x2e\x17\x32\x5c\xb0\xb2\x82\x20\x93\x5c\x13\x7f\x26\x1f\x48\x4c\x98\x1f\x18\x61\xbe\x30\x0a\x63\xf4\xfe\x75\x86\x54\xff\x62\x09\xf4\x76\x16\x2d\x8f\xe7\xd2\xe5\xe1\xf9\xf0\x0e\x8c\x1c\xdb\x7b\x36\xb0\xd9\x3a\xf9\x25\xa3\x26\x26\xeb\xdf\x8a\x3a\xf0\x8f\xe4\x0b\xe6\x4f\x59\x4f\xfe\x27\xd6\x93\xff\xfd\x9b\x16\x4c\x57\x86\x67\x30\x8d\xd0\x93\x10\xfa\xbf\x8f\xf0\xfc\x2f\xd9\x8a\xf9\xbf\xd9\xee\xf3\x2f\x19\x56\xff\x8a\x61\xf5\x67\x8b\x91\xb9\x7c\x71\xb5\x80\xae\xe5\xb7\x52\x74\xef\xc0\x80\xa7\xe6\x1f\xe7\x4c\xd2\xdf\xd9\xf6\x43\x6c\xf1\xa5\x18\x3a\x41\xc0\xc8\x89\x67\x62\x72\xad\xff\xf3\xfc\xb5\xfe\x89\xce\xd1\xe4\x92\xcf\x59\x66\x78\xc9\x63\x4d\x05\xd6\x8b\x20\x4e\x45\x25\x39\x15\x9e\xd9\xb3\x81\xe3\x3f\xeb\x01\xd7\x55\x74\x85\xfc\xf0\x47\xa3\x5a\xcf\x0e\xc0\xf3\x75\x45\x57\x4e\x2b\x03\xef\xec\xae\xde\xa8\x47\xff\xb6\xaf\x6f\xce\x37\x0e\xf0\xd7\xc3\xdd\xdb\x9d\xcf\x17\x5b\x6f\x47\xbb\x95\xde\xda\xbe\x63\x7f\x38\x24\x45\x2e\x1a\x2f\xa2\xe2\x6f\xfb\x5b\xe4\x4b\x63\xbd\x7e\xf6\xca\xeb\x9a\x87\x75\xfe\xdf\xba\xed\xce\xda\xa3\x1d\xfc\x1d\x04\xcd\xb5\x9d\xc6\xda\xb3\xcc\xbf\x97\xe3\xed\xc1\xe4\xd5\xfd\xc5\xc4\x7d\x78\x7b\x52\xaf\xd7\x77\xaf\xa7\xfd\xbd\xd1\xec\x74\x6d\xdf\x6b\xee\xcd\xa7\x17\x6e\xf7\xb6\x3f\xd9\x9f\xf6\xef\xb7\xf6\x9b\xdb\xcd\xbb\xc3\xed\xf1\xdd\xd1\x43\x7d\x83\xb4\xb0\xb3\xcb\xea\x1e\x9c\xed\x6f\x77\x46\x3b\xa4\x33\xdb\xbb\x87\xcd\xc3\xf3\xba\xb1\xbf\xd5\xa9\xd7\xeb\x27\xf5\xfa\xd6\x68\xbf\x31\x3e\x1e\x57\xba\xfb\x07\xf6\xf9\x99\xdf\xbe\xde\x98\xec\xb7\x9a\xed\xf6\xc4\x75\x0f\xcf\xee\x9c\xae\x73\xe6\xf4\xcf\x2e\x2e\xd6\xef\xe6\xf3\xeb\xeb\xcf\x9f\xb7\xdf\xee\xed\xed\x1d\x1f\x36\xb7\x5b\xe3\x5d\x54\xbb\xde\xa8\x1f\xd4\x27\xc7\x7e\xb1\xbb\x6f\x07\xeb\x1b\xdd\xf9\xc8\xfb\xec\x1d\x8c\x8e\xcf\xdd\xe3\xe3\x83\xfe\x68\x6b\x7d\xda\x5a\xdf\x1e\xef\xdf\xdd\x9e\x4d\x2e\x2a\xcf\x27\xe1\x41\x17\xf6\x82\xf5\xe9\xfe\xc9\xe8\xe8\xfc\xe4\xac\x5e\xaf\x37\xeb\x27\x3b\xa3\xeb\xeb\x56\xab\xdd\x6e\xec\xed\xee\xee\x1d\x34\x9b\x17\x17\x17\x17\xfe\xe8\xfa\x7a\x3e\xbf\xbf\x6f\xec\x79\xde\xdb\xe6\xc1\xc1\x8d\x33\x1a\x8d\xfc\xfb\xfb\x46\x63\xfb\x74\xfb\xdd\x74\xba\x7f\x74\x7c\x3c\x9b\xf8\xfe\xfa\xfa\xf3\xe7\x8e\x63\x18\x3b\xcd\x77\xef\x7a\xa7\xed\xf6\xf8\x6e\x6e\x76\xba\x9f\x21\x34\xf6\x3e\x7c\x98\x3f\x3c\x7c\xf6\x3c\xef\xed\xfb\xe3\x63\x00\xfa\xfd\x97\xeb\xfb\x27\xe3\xa3\xf3\xfa\x49\x7d\x84\x08\x74\x32\xba\xe8\x76\xb7\xb6\x1a\x0d\xd4\xee\xee\x41\xf3\xc0\xb6\x2f\xfa\xa8\x8d\xe6\xf6\xc9\x78\xf7\xac\x8e\x08\x36\xc2\xb4\xdc\x7a\x3b\x6e\xb5\xf6\x83\xd6\xe9\xbb\xa0\xf5\x70\x64\xb4\x5b\xef\x5f\x3a\xf3\xd6\xce\xc3\x87\xd6\xa1\xd1\x39\xed\xec\x98\x1d\xf4\x6f\xd0\x31\x3f\x0c\x26\x1f\x3e\x0c\x3c\xf4\x67\x76\x27\xcd\x4e\x6f\xf6\xd6\xec\xce\x9a\x9d\x5e\xa5\xd9\x19\xbc\x5a\xef\x5c\xef\x35\xbb\xd1\x5f\xf1\xed\xda\xf0\xd5\x1a\xfa\x33\x46\x47\x7b\x27\x9d\x7a\xa3\xbe\x55\x3f\xa8\x7f\x3e\xee\xf6\x3e\x1f\xd8\x4d\x67\xef\xe6\x9d\x73\x6c\x37\xb7\xaf\x9b\x76\x50\x1f\x6d\x8d\x11\xce\xf5\x46\x7d\x7f\xec\x34\xa7\xe3\x9b\xa3\xfd\xe9\xa4\x7b\x03\x27\x93\x5e\x38\x71\x60\x38\x59\x7b\x17\x38\x0f\xef\x82\xd1\xfd\xce\xf5\xcd\x1d\x1a\xea\x2d\x3c\xbc\xe8\xdf\xc1\xd6\x74\x72\xd3\x15\xff\x4d\xba\x5d\x77\xd2\xf9\xaa\xbf\x93\xbd\xcf\xcd\x83\xd1\x56\xbd\x3e\xda\xaa\xcf\xd7\x76\xfa\xf3\xb5\x9d\x71\xab\xd3\x1c\xcf\xd7\x9a\xc1\xd6\x1d\x19\xd7\x7b\x34\xf3\xeb\x5b\xf5\x33\xe7\x61\xb7\xff\xb9\xf5\xb6\xff\x70\xfa\xb6\xff\xf0\xf0\xb6\xff\x30\x7f\x3b\xd8\x39\xdd\x77\x77\x1e\x8e\x5e\xed\xdc\xbd\x6f\xd4\xcd\xee\x16\x42\x73\x54\x6f\x12\x64\xb7\xea\x87\xad\x87\xdd\x7e\xeb\x61\x1f\xd1\xf9\xcc\x59\x3b\xed\x7f\xee\x7c\xe8\x3f\xac\x7d\xe8\x1b\x6b\x1f\x10\x8d\x3b\x5f\xf3\xef\xe2\x2d\x19\x4b\x44\x8b\xc6\xde\xa0\x3b\xed\xde\x8c\xea\xa3\x87\xf1\xde\x0e\xa1\x39\x69\xf5\xc2\x3f\xb9\xde\xde\xae\xb3\x39\x79\x52\xaf\x37\x9d\xeb\x8d\x46\xc3\x36\xf6\xe1\xc3\xc3\xe9\xf8\x78\x32\x3b\x1f\xdd\xb4\xda\x3d\xe3\xe5\xde\x7e\x67\x3f\xf0\x66\xf6\xe4\x62\xb2\x46\xe6\x55\xef\x70\xbd\xbb\xbe\x31\x7f\x78\x70\xbc\x83\x49\xff\x7c\x34\x19\x34\xec\xfe\xcb\x8d\xfd\xed\xfd\x1b\xd7\xdf\xf7\x4e\x26\xde\xfb\x63\xd0\x3a\xe8\x6d\x3d\xaf\x4c\x8d\xe9\xf4\xe1\xe1\xda\xf3\xbc\xfa\x8b\xbd\xbd\xf3\xbd\x7e\xff\xe5\xc6\xd4\x98\xfa\x6f\x6f\x06\x2e\x86\x77\x3e\x68\xd8\x1b\x37\xce\xc6\xee\x7e\xf8\xf0\xe0\x4f\xce\x26\xf7\xc0\x9c\x75\xda\xbd\xfe\xcb\xf5\x8d\x8d\x8d\x78\x3e\xdf\x74\x9e\xf7\x1f\x82\x9d\x8d\xf5\xee\xfc\xe1\xc1\xf7\xec\x49\x65\xb6\xd1\xe8\x54\xfa\xfd\x97\x2f\x36\xba\xfb\x0f\xb3\x87\x13\xef\x9a\x9b\xf7\xa4\xee\xc8\x6d\x9c\x98\x17\x5b\x75\xbc\xed\xb4\xae\x2b\x5b\x9f\xf7\xbc\x8b\xe6\x68\x78\xb1\xbe\x77\x71\x7d\x72\x3d\x75\xf6\x4e\xdf\x7a\xed\xf7\xdb\xd3\xe3\xd1\x61\x7f\x34\x9d\x6e\x3d\x3f\xfa\x3c\xee\x1e\xdc\x5c\x1c\x9d\x9c\x5d\x8f\xbd\xe9\x87\x76\x83\xee\x1b\xa3\x7a\xbd\xb1\xb3\xb3\xbb\xdf\x6c\x5e\x9c\x9d\x9d\x8d\xa3\xf5\xbb\xb7\x87\xd6\xaf\x0d\xfa\xfd\x91\x7f\x73\x73\xd0\x6e\x3b\x0e\x3c\x38\x78\xf7\xfe\xf0\x30\x08\x82\xe0\xe5\xdd\xfd\xfd\xf3\x87\xed\x87\xcf\x10\x06\x87\x87\x27\x27\x77\x77\xf3\xf0\x68\xff\xe0\xdd\xf6\x87\x4e\x67\x72\x7c\x14\x02\x1b\xf4\x9f\xaf\x6f\xb4\xf7\x66\x6e\x38\xe8\xda\x07\xcf\xcf\xcf\xce\xc6\xfe\x74\xda\xae\x1b\xdd\x2d\xba\x57\x34\xb6\xc6\xe3\x9d\x9d\xbd\x3d\xd6\xee\xf4\xfa\xfe\xde\x99\x78\x7e\xb3\x79\x90\x9e\x4b\x2f\x1b\xa7\xef\x77\x5a\x6b\xad\xd4\xdf\xfb\x97\xad\x79\x6b\xc7\xe9\xb4\x76\x9c\x0f\xad\x43\xc7\x3c\x3d\x7c\x30\x3b\x9d\xdd\xce\x87\xc1\xc4\xec\xba\x6b\x1f\x7a\xe1\x7a\x67\x50\x79\xfb\x61\x68\xae\xad\x0d\xcd\x75\x73\xb8\xbb\xde\x75\xcf\xbb\xd9\xbf\x06\xdd\x57\x71\x63\x3b\xcd\x66\xf3\xe2\x84\xe0\xd4\x6d\x39\x9f\xb7\xdf\xbe\xf5\x9a\x47\xc7\x27\xa3\xc9\x56\x44\x33\x3a\xc3\x5b\x6b\x3b\x67\xf3\x8d\x9d\xfe\x7d\x77\x67\xdc\x7e\xd1\x1c\x9f\x0e\x9a\xc1\xc3\xb0\x69\x9c\x3e\x3b\x34\x8c\xd6\xd1\xee\xd9\x69\xeb\xe8\x6c\xde\x19\x18\xad\x8e\x69\xcc\xbb\xee\xd9\x43\x77\x60\x3c\x74\x5c\xc3\xec\xb8\xe6\x87\xae\x5b\xe9\x75\xdd\xf3\x17\x83\x57\xe7\xbd\xee\xab\xb5\x67\x83\xe4\xdf\xab\x81\x49\xf7\xe6\x51\xfd\xa4\x31\x6a\x3e\x4c\xda\x4d\x67\xd2\x6e\x7e\x9e\x1c\xaf\x1b\x4e\x7b\xab\xd9\xde\x83\xf5\x66\xbd\x8b\x57\x5a\x63\x74\xd0\x7c\xe1\x1c\x37\xd7\x3f\xb7\xbb\xcd\xf1\x79\xb7\x39\x01\xdd\xae\xe7\x74\x6f\xa6\x93\xee\x8b\xe9\x8d\xdd\x3c\x20\x7b\x0f\x5e\x12\x3b\xf4\x3c\x1b\xd9\xcd\x1b\x6f\xd2\xbc\xf1\x9c\x26\xf4\x9c\xe6\xba\xef\x74\xbb\x53\xa7\x7b\x73\x33\xb3\xf7\x83\xfb\x9b\x17\x70\xf6\x35\x7f\xe3\x2d\xff\xbe\xe1\xd7\x4f\xf0\x39\x30\xb8\xdf\xc7\x7f\x9d\xf6\xfe\x4e\xe7\x7e\xbf\xde\x6f\x6e\x77\xc6\xbb\xf5\xc3\x11\x26\xdf\xdd\xf6\x4e\xff\xc4\x6c\x8e\xe7\x2f\x9a\xc1\xe9\xf0\x90\xd2\xeb\xf0\x95\x71\x7a\xf8\xaa\xf3\xa1\xb5\xbb\x7b\x17\x9f\x29\xec\xe0\xbe\xdb\xaf\x1f\xb6\x5f\xec\xf4\x1f\x06\x3b\xe3\xb3\x4e\x33\x34\x3b\x4d\xd3\xec\x34\xc3\x4e\xe7\xe4\xd5\xd7\x6c\x23\xe6\x69\xeb\xc8\x78\x68\x6f\x19\xfb\x0d\x34\x96\x88\x7c\x9f\x4f\x4e\x2e\xba\xd7\x5b\x8d\x83\xfe\x74\xab\xd1\xfb\x6c\x5e\x34\xb6\xdf\x4e\xf6\xeb\xe7\xd7\xc7\x27\xf6\xf5\x7c\xcb\xd9\x99\xce\xeb\x0f\xdb\xdb\xe3\xa3\xa6\xd7\x3e\x39\x69\xf7\x5f\xcd\xf6\x9b\x1b\x77\x77\x0f\x0f\xeb\xbb\x4d\x7f\xf7\xac\x75\x38\x5a\x37\xdc\xa3\xf5\xf5\xd1\x76\xff\x60\xf2\x61\xc7\x73\x8f\xeb\xd7\x68\x7d\xee\xd4\x77\x77\x50\x17\xe6\xf7\xdb\x6f\x77\xf6\xde\xbe\x3b\x6e\xf7\x27\xa3\xd6\xe1\xfa\xbc\xd1\xad\x9c\xdd\x6f\x8f\xbd\x69\xf7\x7d\xbb\xdd\x1e\x87\xee\xf5\xe8\xe1\xa0\x7d\x3e\xd9\x99\xbc\xff\xec\x1d\xbc\x6f\xb7\xfb\x93\xb1\xbb\x75\xfd\xce\x99\x56\xc6\x3b\x93\xe3\x7d\x78\x82\x17\xea\x5b\x34\xef\x1a\xcf\xdf\x9e\x8c\xb7\xce\xb6\x4e\xd0\x02\xd9\x6b\x1e\x9e\x8d\xfc\xe9\x75\xb7\xd5\x7e\x70\xbc\xc9\x78\xf7\xdd\xc1\x21\x38\xeb\x9f\x8d\xfd\x8d\xe9\xc6\xfc\xf4\xe1\xf3\xb8\xf9\xf6\xe2\xf4\xe0\xf0\xc4\x1e\x8c\xe6\xf5\xe9\xb4\x35\x3f\x7d\x70\xbc\xb7\x6f\x9b\xa7\x87\x27\xe0\xbc\x3f\x7a\xb5\xb5\x85\x18\xa1\xe6\x21\x9a\x42\xdb\xf5\x13\x67\x64\x74\x77\xce\xea\x3b\x8d\x7e\x7d\xfd\x6d\x7d\xfc\xb0\x71\x68\xb4\xe7\x27\x6e\x7b\x7e\xb4\xfb\x30\x6f\xb9\xe6\xfc\xe8\xc8\xdc\x38\x33\x1e\x4e\x4f\xcc\xb3\x4e\xab\x73\x3f\x3f\xea\x98\x9d\x56\xa7\x32\xef\x1e\x75\x7a\x17\xee\x69\xeb\xe8\xe8\x74\xd8\x3a\xeb\xb4\x8e\x76\x3b\xad\x4e\xc7\xd8\x40\xcf\x3b\xe1\xc3\x43\xcb\xad\x74\x5a\x9d\xb5\x56\xb7\x63\xf6\xba\x6e\x65\xde\x2d\x76\x36\xba\xe6\xda\xc3\xd1\xd1\x39\x7a\x36\xc0\xe5\x4c\x73\xa3\xfb\xea\xc3\xab\x6e\xf8\xa1\x3b\x8a\xda\x38\x6d\xb5\x48\x1b\x0f\xdd\x8e\xf9\xe2\xc2\x3c\xfb\xd0\xea\x9c\x75\x3a\xee\x79\xa7\xd5\x39\xff\xd0\x75\xcf\x87\x83\x4e\xe7\x55\xf7\x55\x7b\x8e\xca\x1d\x1d\x55\x5a\x9d\x4e\xa7\xd7\xed\x54\x86\x9d\xb0\xd3\xed\xbe\x5a\xff\xd0\xea\x7c\xe8\x0c\xdc\xca\x70\xd0\x39\x6f\x75\x8b\xe7\xaf\xc0\xee\xfa\xb0\xfb\x6a\xbd\x75\x8d\xdb\x35\x5f\x75\x4c\x54\xee\x62\xd0\x75\x2f\x7a\x03\x73\xed\xfe\x7a\x3a\x99\xb8\x37\xfe\x8d\x73\x33\x71\x9c\x9b\x9b\x9b\xc9\x4d\x38\xa9\xdc\xc0\x1b\xb3\xe7\xcf\x9c\x1b\xff\x06\x1e\x04\x13\x70\x03\x6f\x1e\x0e\x82\x9b\x22\x84\x93\x07\x88\xca\xc1\x1b\xe7\x26\x70\xee\x6f\x6e\x9c\x7b\x18\xdc\x3c\xbc\xb8\x71\x1e\x60\x78\xe3\xdc\xcc\x6e\xd6\x0e\x02\xd8\xe8\xc1\x9b\x5b\x18\xce\x5e\xbe\xbb\xbb\x7f\x80\x33\xaf\x71\x03\x6f\x9e\xc3\x60\x46\xca\xcd\x6e\xd6\xe0\xdc\x7b\x0b\x67\x9f\xb7\x5e\x4e\x1d\xef\xdd\xf4\xe6\xf6\x66\x76\x33\x79\x3e\x9b\xbc\x80\x33\xef\xed\x61\x38\x31\xfa\xfe\x73\x78\x73\xeb\xc0\x77\x77\x70\xfb\x20\x98\x3d\x83\x33\xa7\x68\x0c\xda\xbb\xad\xce\x87\x0f\x03\x77\x77\xed\x73\xa7\xd2\xe9\xbe\xaa\x98\xc3\xc1\xc6\x46\xef\xd5\xfa\xf9\x7d\xef\x74\xf6\x0c\x0e\x6f\x0f\xfa\x60\xf6\xdc\xb8\x1d\x6d\x3c\x54\x5e\xf6\x67\xbd\x6e\xf8\xf6\xdd\xd1\x6c\xef\x45\x31\x2c\xbe\xec\x3d\x1c\x3c\xbc\xba\x3e\x6e\x3e\x77\xbb\x1b\x37\x95\x9e\x7d\x73\x03\xbb\xb3\x9b\x9b\xe2\xec\xbe\xe7\xdc\x6e\xc3\xe3\xb0\x71\xd6\xe9\xbc\xfa\xd0\xed\xb8\x6b\x0f\x83\xc1\x79\x6b\x30\x5b\x7b\x00\xc7\xe7\xaf\xc0\x91\x7f\x03\x6f\x66\x0e\x7c\x77\x8b\x70\xf9\xfc\xb6\x3f\x9f\xbc\xec\xcf\x1e\xea\xfd\x0f\x83\xa0\xf2\xd9\xbd\xfd\xe0\xf5\x0e\xc2\xc6\x9a\xf9\xf9\xfe\x7d\x7f\xff\xa1\x72\xdb\x9b\x7b\x6f\x5f\x1c\xcf\xde\x57\x06\xf6\xf1\xed\x76\xdd\x7b\xfb\xf9\x0e\xcd\xe7\x1d\x3c\x9f\x77\x5e\x4e\xeb\x7e\x7b\x07\xd6\xfd\xfa\x7a\xfd\xa4\xbe\xd7\x04\xfd\xb3\xb3\x79\xfd\x66\xde\xde\x32\x76\x76\xdf\xdd\x34\x0f\x5a\x67\x87\x27\x17\xd7\x7d\x63\xe3\x60\xde\xba\x3f\x3b\xdb\x99\xde\x34\xbb\xa7\x67\x07\xc1\xc5\xa8\xd3\xdc\xd8\xbf\xdf\xbf\x3f\xdd\x19\x4f\xfd\x83\xee\x69\xfb\x6c\x04\xae\xa7\x9d\xad\x03\xfb\xf9\xde\x99\xe9\xee\xc3\xc0\xee\x9d\x5d\xcc\x8c\xd1\x74\xab\x7b\x60\xb7\x2b\x67\x86\x3b\xbd\xb9\xe9\xf7\xce\xce\xfd\xbb\xd6\xc5\xbc\x7e\xbf\xf1\xbc\x35\x7e\x18\x8f\xf7\xa7\xbd\x93\xf3\xf6\x64\x1c\xa2\x36\x36\x9e\x37\xc6\xdb\xe3\xfd\x83\xa9\x7d\x72\xd6\x36\xfc\xb0\x13\xcc\xf7\xef\xed\xc6\x67\x63\xbc\xdb\xbc\xb1\x4f\xda\x67\xc6\x64\x1a\xe2\x36\xce\xc7\xbb\xe3\xf0\xe0\xb0\x77\x71\x76\x5e\x59\x9f\x9b\xd7\x73\xd4\xc6\x78\xc7\x0d\xf7\x0f\xfa\x17\x67\x67\x15\x23\x9c\x4f\xfd\xcf\x73\x67\x6b\xfc\x30\xf6\xf6\xbd\xfd\xc3\x36\x6a\xc3\x3d\xda\xb7\x37\xba\xce\x19\x6a\x63\x72\x71\xdc\x6e\x8f\x6f\x42\xb7\xbb\xdf\x7e\xd8\xbf\x3f\xc5\x6d\x5c\x1c\x1f\xb7\xc7\xe3\x69\x38\xdd\x3f\x38\x3d\xd8\x3b\x33\xc7\xd3\x83\xe0\xa2\xd3\x3e\x9f\xdc\xcd\xcd\xe9\xbc\xdd\xdb\x3e\x47\xfd\xd8\x3f\xe8\xdb\xed\xf6\xe4\x2e\x9c\xbb\xd3\xde\xe9\xbb\x8e\xb9\xb3\xeb\xbf\x23\xfd\x98\x84\x61\xa7\x0b\xed\x9b\xb5\xbd\xb3\x9d\x29\xdc\xb7\xcf\x2e\xda\xc6\xcd\x3c\x6c\x75\x61\xef\xf3\xdb\xc9\xde\x78\x3a\x85\xf6\x49\xfb\xdc\x98\x4c\xe7\xad\x6e\xef\xb3\xb3\xb6\x37\x71\x8f\xe0\x91\xdd\x3b\xb7\x27\xeb\xf3\x8d\xeb\x69\xaf\x77\xba\x76\x3e\xf1\x8e\x0e\xe0\xa0\x77\x76\xe6\xa3\x7e\x4c\x3f\xf7\x7a\x6b\x9d\x89\x77\x7b\xdb\x3c\x20\xb4\x72\x8f\xf6\x1d\xdb\x59\xdb\x33\x27\x07\xa1\xdf\x3d\x3d\x6f\x3b\x37\x73\xb7\xbb\x6f\xf7\xb6\xdf\x4e\x2a\xee\xcd\xe1\x71\xf7\xb4\x7d\x31\x9e\x4c\xe7\xdd\xfd\xf6\xe7\x06\x6a\x23\x0c\x66\xb6\x7d\x6e\x4f\xee\xe6\x1b\xd3\x69\xdb\x79\xf1\x61\x52\xf1\x8e\x82\xa3\x61\xef\xec\xfc\xe6\x0e\xb5\x71\xda\x7e\xf1\xe1\xfc\xdc\x3b\x7e\x3f\x1b\x76\xce\xeb\xf5\xed\xfa\xa8\x7e\x58\x3f\x69\xd6\xf7\xbb\xf6\xf6\xc9\x78\xff\xac\x8e\xf7\xbc\x9d\xbd\xe6\x59\xb0\xb1\x6f\xb7\xb6\xee\x1f\xb6\xc7\x37\x8d\xb3\x77\x87\xc7\x6d\x30\xed\x8f\xe7\x8d\x83\xb6\xdb\x79\xd8\xd9\x69\xee\xf7\x3e\x20\x22\x4e\xe7\x83\x8b\x8d\x46\xe3\xdc\xdd\x1d\x07\x37\xef\xfa\x9d\x73\xfb\x7e\x3c\x45\x74\x78\x77\x52\xaf\xfb\x74\xcf\xdb\x1a\x57\xf6\xe7\x27\x3b\x07\xdb\x9d\xf1\x7e\x7d\xe7\x04\x3d\xdb\x6b\xa2\x09\x57\xbf\xe8\x4e\x5b\xce\xb6\xb1\xe5\x8c\x77\xf7\x0e\x4f\x9a\x37\x67\x17\x68\x7e\x4c\x5b\xad\xcf\x68\x3c\xf7\xde\x1e\x1e\x9f\x38\x7e\xf7\xe2\xe5\xc6\xd6\x41\x63\xb2\x73\xb6\xe3\xdf\x1c\x5c\x9c\x9d\xb4\xc7\x63\x77\x7a\x82\x18\x04\xbf\x8f\x0e\xd9\xde\x51\xe3\xec\xff\x63\xef\x4f\x9b\x1c\x45\x92\x45\x61\xf8\xfb\xfd\x15\xd9\xba\x66\x6d\x99\x87\xec\x04\x01\xda\xaa\x4e\x9e\x79\x83\x4d\x2c\x42\x88\x55\x82\x3e\x6d\x63\x08\x10\x20\x56\xb1\x08\x44\x4f\xbd\xbf\xfd\x31\x24\xe5\x9e\xd5\x5d\x3d\x77\xe6\xd8\x7d\xcc\x9e\x0f\x55\x82\x08\x0f\x77\x0f\x0f\x0f\x0f\xf7\x08\x32\x7c\x4d\x9c\x7c\x84\x07\x06\xd0\x81\xde\xc7\x69\x3d\x05\xd1\x34\x7d\x97\x91\x4f\x42\x30\xa7\x35\x3a\x4b\x0f\x26\x2d\xaf\xfd\xba\x72\x5d\x4b\xb5\xc7\x1b\xa6\x63\xf2\x43\xb1\xd5\x4c\x19\x84\x55\xe0\x9a\x27\xf5\xb4\x99\x0f\x99\x3c\x29\x1c\xd5\x5c\x87\x25\x00\x52\x07\x80\x4c\x95\x0d\xcd\x65\xcb\xb9\x1c\x03\x1e\xb0\x80\x06\x66\xd6\x2a\xfb\x6e\x1f\xa7\xf4\x7c\x21\x4a\x9e\xef\x2c\x81\xdf\x8e\x82\x13\x4d\x85\xc5\x3c\xe5\x44\x49\xf6\x7d\xa3\xe7\x99\x24\xe7\x74\x47\x45\xbd\xaf\x23\xcb\xb5\xe9\x04\x7d\xfc\x24\xcc\x29\x9a\xe6\xb8\xdc\xd2\x54\x59\xf6\x83\x80\xe1\x85\xb1\x4a\xd2\x34\xcd\xe5\xf9\x46\x96\x65\x3f\x0c\x62\x86\xeb\x97\x8c\xc3\xb9\x73\x0b\x42\xb1\x58\x89\x8c\x6c\xa2\x5f\xef\x48\xc0\x46\xe7\xf5\x4e\xdd\x47\x6c\x66\x29\x73\xc1\x31\xfd\x98\xe7\xd5\x9e\x27\x9a\xce\xf9\xc3\x86\x13\xe5\x30\xca\x5b\xc3\x1c\x11\xe3\xb9\x1e\x33\x45\xc9\xf1\x5a\xaf\xdb\x43\x37\x20\x04\x5b\xc5\xe6\xeb\x68\x29\x14\x8e\x61\xda\x63\x3c\xc8\x5d\x2b\x2c\xa8\xcd\x66\xc8\x1c\xc4\xca\xb3\x6d\x1b\xc9\x7a\x7d\x2f\xba\x6d\x04\xc0\xb2\x61\x88\x86\x6c\x40\x5b\x31\xcb\xd0\x31\x49\x35\x43\x2c\x52\x07\x11\x70\x80\x4f\x92\x11\x33\x97\x7a\x19\xeb\x66\x96\xb5\xa3\x51\x4b\x91\x64\xca\x24\xec\x4a\x12\x6c\xd3\xbc\xf8\xd1\xbd\x6f\xd7\xfb\xe0\x92\x28\x5e\x7d\xeb\x36\x0f\xce\x7e\x39\xfb\xe4\x6f\xe3\x6f\x7d\xf5\xb7\x3e\x78\x04\x00\x99\x37\xfd\xf2\x59\x32\x4c\xe4\xe0\x82\x92\xd1\xbd\x1f\xc9\x81\x43\xef\xbb\x12\xcc\xda\xcc\xfa\x58\xdb\xdf\x92\xd7\x58\x5b\xd4\x4d\xf5\x52\x16\xec\xb7\x4f\x65\x8e\x6d\x3e\x95\xed\x9f\xcb\xcc\x0f\x71\xfa\x0f\x95\x31\x55\x51\x6c\x37\xeb\x75\x52\x57\xbd\xdf\x6d\x8f\xd1\xe1\x30\xce\x8b\x42\x26\xc0\xb1\xc9\x58\xb0\x9a\xb2\xf3\xe1\x65\xc4\xc8\x53\x73\x96\x17\x0d\x70\x00\x88\x3d\x95\xb0\x92\x24\xc9\xa6\x1b\x70\x66\x3e\x16\x54\xba\x57\x8d\x4c\x5f\x0a\x92\xea\xc7\x01\x43\x08\x82\x1a\x77\x5a\x94\x0b\xb9\xad\xea\xeb\xe8\x60\x39\x43\x5e\x15\xc2\x75\x1c\xc7\xbd\x8d\xd6\xf4\x75\x94\x9d\x69\x12\xa7\x75\x3c\x8c\xf9\x43\xcf\x87\xe4\x87\x71\xb5\x54\xce\x7c\xa0\x34\xc3\x09\xf6\x66\xbd\xce\xca\xaa\x8d\x09\x41\x3d\xa0\x43\x74\x2e\x88\x4b\xd3\x52\xf5\xe4\x50\xb5\x6e\x10\x16\xd4\x3c\x42\x62\xbe\x5c\xf4\xfd\x1a\x9f\x82\x78\x69\xd9\x76\xd7\xf7\xb5\xac\x84\xed\x66\x6d\x66\xa7\x61\x3f\xfe\xaa\x9d\x0c\x87\x89\xb0\x58\xba\x96\x4d\x36\x94\xbf\x4d\x01\xf0\xe9\xb0\x71\x4c\xdb\xc8\x17\x2b\x12\xf1\xae\xfa\x48\xd2\x04\x00\x0a\x79\x19\x67\x51\x96\x7d\x3f\xd0\x7b\x7d\x18\x93\x67\x3d\xe7\x74\x45\x10\x3d\xd3\x71\x2f\x7b\x07\xf4\x9e\x62\xd3\x8c\xbb\xc0\x05\x3c\x68\x47\x41\x8b\xd0\x97\x78\x40\x96\x6a\xe7\x69\x8e\xd0\x7a\x54\xa4\x2c\x2b\x9f\xe1\x62\x86\x20\xaf\x73\x84\xcb\x4c\x45\x55\xc3\xc8\xed\xe1\x84\x33\x5c\x96\xf3\xfd\xfc\xf2\x93\x38\x66\x78\x41\xb0\xd7\x57\x38\x59\x55\xc3\x24\x8e\xcf\xf8\xae\xb1\x91\x25\xab\x17\x7c\x67\x38\x5d\xef\xe5\x6f\x29\xf2\x19\x8e\xe1\x85\x9e\xbf\x0b\x9c\xa2\xaa\x7e\x14\x9c\xc7\xc4\xbe\xb4\xe5\x9e\xf0\x9d\xdb\xea\xfd\x1c\xa4\x88\x86\x04\x80\x5c\x65\xbc\xb0\x12\xb8\xa4\x41\x70\x87\xa3\xf4\xf9\x9e\x53\x7d\x12\x50\x00\x00\xc7\x0d\x0e\xe3\x53\xba\x3e\x91\x14\x93\x72\xea\x5a\xc5\x55\xd9\x09\x88\x70\x11\x30\x6a\xb8\x8f\xd9\x72\x6d\x70\x73\x47\x37\x87\x96\xdc\xe6\x8a\xa2\xe9\xc9\x31\x4b\xe7\x82\xa8\xeb\x90\x6b\x22\x59\xdb\x8c\x4f\xba\x11\x65\x59\x64\x2e\x54\xe7\x70\x1a\xba\x65\x43\xf4\xce\x3d\x09\x40\x43\x93\x74\xe7\xeb\x80\x60\x88\x3d\xd7\xf3\x12\x00\x39\x07\x02\xd9\x34\x4b\xd0\x6e\x80\x4c\x8f\x08\xee\x44\xfa\x8d\xd0\xe2\x4a\x87\x24\x11\x05\x08\x92\x3e\x81\x93\x12\x32\xbe\x48\x07\xd2\xc1\xb7\xf9\x50\xf2\x09\x73\x33\xa7\x38\x02\x07\xe2\xde\x44\x91\xb0\x39\x66\x62\x09\x98\x8d\xdb\x0e\x39\x4e\xf6\x09\x72\xce\xb5\x32\xad\x47\x1c\x49\xd1\xe8\x08\xc7\xfd\xe1\xaa\x16\x69\x5e\x8a\xd6\x31\xe5\x5f\x02\x34\x1c\x00\xc0\xfa\x00\x44\x3e\xe2\x73\xa1\x60\x4b\x26\x2e\xed\x1b\x48\xa6\x79\x5a\x89\x02\x41\xa3\x47\xd7\x7d\x95\x05\x20\x7c\x30\x05\x3e\x29\x33\x21\x17\x72\x56\x36\xde\x37\x90\x48\x3d\x83\x01\x39\x7e\xbd\xe7\x47\x82\x2b\x01\x70\x89\xa5\x48\x10\xac\x2c\xd4\xd5\x00\x90\x4d\xa9\xb9\xd6\x48\xf3\x7c\x1b\x65\xe7\xf0\x25\x71\x26\x38\xa5\xf8\xa7\xe5\x5e\x1c\xcf\x34\xd0\x49\x5a\x34\xc1\xdd\x74\x51\x6f\xbd\xa6\xdc\xda\x7e\x62\x85\xcb\x1c\x77\x11\x61\x5b\xd2\xad\x6a\xc2\x1c\xb6\xd1\xb5\x86\xf7\x23\xcf\x72\xd3\x21\x6b\xe2\x5d\xb6\xc7\x30\xf8\x30\xa3\x98\xea\x88\xe9\xe1\x10\xde\x27\xed\x24\x26\xf5\x6a\x55\x0d\xa7\x70\x69\xee\x66\x62\xe4\x83\x12\xcc\x15\xc2\xc5\x7c\x71\xbe\xc2\x4b\x1d\x3a\x90\x2b\x93\x38\xcd\x8c\x02\x60\xe6\x81\xcf\xca\x35\xb6\x46\x61\x6f\x37\x0c\x25\xb8\xc6\x1c\x7f\x6a\xcd\xe1\xd1\x64\xaf\x43\xf9\x2a\xd9\xce\x69\x5e\xf7\xa3\x5d\x6a\x73\xd8\x8c\xda\xae\x0e\xad\xeb\x5a\x79\xb0\x15\x95\x84\x74\x46\x85\x10\x47\xba\x18\x9d\xda\x69\xc8\x65\xb5\x3f\x72\xf9\xe3\x50\x32\xd9\x99\x3d\x9a\x39\x10\x36\xf7\x8e\x07\x67\x62\xa1\x1b\xc6\xa5\xf6\x0b\xf8\xc0\x76\x95\xb2\xdb\xaf\xe9\x75\xcb\xc3\x76\x38\xf7\xba\x7d\x16\xd4\x33\xb6\x24\x2d\x57\x26\x84\x6d\xc8\x22\x46\xa5\xc3\x58\x32\x1d\xc5\xd4\x1c\xd5\x60\xa8\x8d\x2c\xc7\x4c\x37\x10\x0d\xd9\x87\xee\x08\xb7\x9a\x2f\x65\x1a\x33\x87\xda\x89\xba\x3c\xc8\xf8\x12\xca\x00\x20\xd4\xb6\x36\x36\xcd\x64\xc2\xbb\xa3\x6d\x92\x68\x49\xcd\xdb\xd1\x66\x32\x42\x66\x2c\x8b\x44\x73\x53\x38\x02\x65\x95\x37\x3b\x49\x05\xab\x93\xba\x02\x0e\x4a\x47\xa9\x47\x35\x04\xca\x36\x00\xf0\xb1\x4c\x99\xc2\x68\x34\x1d\x2f\x27\xb3\x39\x4f\xee\x5b\x1c\xca\xc7\x36\xa5\xbb\xe8\x64\xa3\x1e\x95\xd3\x66\xc1\x47\x1c\x39\x32\xad\xe1\x7e\x71\x1c\xc5\xb9\x14\x58\x5a\x87\x94\x10\x95\xa4\xcc\xd0\x0d\xf3\xaa\x48\xc5\xb1\x4e\xf9\xdc\x7a\x38\xdc\x04\x53\x87\xd5\x5c\x04\x56\x93\xad\x2f\x01\xb7\x75\x4e\xeb\x46\xec\x63\xb1\xc2\xc2\x76\x4b\x75\x67\x6d\x3b\x21\x34\x0b\x01\x87\xaa\xd5\xa1\x4a\x45\x63\x21\x79\x6b\x69\x8e\x46\xc6\x51\x37\xa1\x1c\x5d\xf1\x70\x10\x91\xf1\xc8\x66\x14\x09\xd7\x16\x73\x73\x65\x39\x9c\x8e\x1d\x4d\x71\x18\x64\x81\x8a\xef\x59\x26\x4e\x4f\x6b\x18\xd5\x46\xfc\x24\x9a\x97\x6a\xb0\x59\x6b\xd3\x25\x32\x32\x20\x8c\x84\xe7\xab\x03\x3f\x94\xdd\x75\x58\xce\x57\x2d\xdd\xb1\x87\x0d\xa7\x12\x2b\x2e\x4c\xd7\x94\x5e\x4d\x38\x8f\x3f\xc2\xbb\x91\x54\x75\x44\x9b\x6b\x9d\x65\xc9\x10\x69\xd2\x01\xbb\xd9\x1d\xe6\xb8\x0d\x08\x39\x0e\x27\xe8\x9c\x0f\x96\x78\xc6\x1f\xa1\x60\xe3\x80\x1c\xf0\xbd\xf7\xbd\x9e\xce\xd1\xc2\x06\x1b\x7c\xa9\x3b\x80\x48\x8d\x6a\x32\x21\x3b\x0b\x10\xd0\xa2\x64\x1d\xc3\x83\x64\x3c\x80\x64\x62\xd8\x04\xb0\x55\xf0\xda\xaa\x55\x09\x97\x9b\x26\xbe\xe6\x01\x57\x2b\x65\x29\x63\x74\x3a\xf5\x67\x04\xeb\x18\xab\xa0\x55\x15\xc5\x8c\x84\xb5\xc5\x6f\x24\xc6\x5c\x8d\x0d\x1c\xd0\x45\x98\xf3\x19\xbd\xdf\xf8\x00\x6d\x78\xc5\x62\x55\xba\x4d\x78\x2a\x99\x32\x08\x18\xfb\xf4\xa6\xf4\x47\x36\x6e\x95\x60\xc1\x55\x85\x48\x4c\xa0\x5d\x30\xd1\x85\xc5\xd1\x5c\xab\x6e\x55\x52\x0d\xb3\x1b\x26\x9d\xd9\xa9\x43\x66\x8a\x2e\x87\x01\x2a\x9d\x2a\xd4\x9b\x8c\x89\xa1\xec\xaa\x88\x0a\x4a\x39\xf4\x17\x2b\x51\xf2\x79\x75\xc6\x2b\xe4\x24\x60\x36\x60\x1c\xe9\xe5\x82\x59\x0a\xd4\xc8\x01\x23\x47\x53\x8e\xbe\x7a\x58\x39\x18\x13\xcf\x66\xed\x1a\x93\xb5\x10\x16\x59\x65\x4a\xd1\xc9\x78\x9d\x1e\x6d\x43\x06\x5a\xa3\x1c\x14\x61\x7f\x6a\xe4\x19\x51\x14\x41\xed\x2b\x28\x10\xb4\x72\x25\x7b\xb2\x13\x15\x40\xf2\x29\x29\xd8\x6a\xb4\x7a\x2a\x36\xf2\x08\x21\xa3\x65\xbe\x71\xab\xf5\x7e\x3d\x59\xa3\x30\xa6\xef\xbd\x0d\xa6\xcf\x46\x3e\xe7\xda\xf1\x4e\x01\x19\x48\x0e\x3a\x1d\x36\xf9\x08\x0b\x48\xd7\x21\x9b\xd8\xc7\x27\x3b\x67\xbb\xeb\xe2\x44\x16\x81\x6f\x13\x51\x30\x71\xa0\x9d\x43\xf9\x0c\x14\xee\x1a\x6a\xb3\xeb\x3c\x7f\xb1\x72\x16\x26\x5f\x02\xc0\xcb\xa0\xd0\x36\xfb\x34\x80\xeb\xcd\xfc\x84\x1d\x87\x6c\x84\xe5\xc6\x18\xc6\xaa\x51\x51\xaf\xa7\xc3\xdd\x38\x2f\x76\x5b\x11\x95\xb1\xf5\xd2\x38\xcd\xa6\x44\xa3\x57\x5b\xb2\x09\x98\x00\xac\xeb\x95\x77\x1c\x4b\x1e\x8c\x5b\x36\x23\xeb\x8e\x2f\x14\x46\x89\xbb\xde\xae\x0b\x86\x1a\xa0\xc0\x90\xa2\x83\xd1\x16\x33\x62\xca\xa6\xc9\x66\xb4\x85\xb6\xab\x5d\x24\x64\x25\x56\x71\xa0\xf6\xb0\x23\x6f\x49\x61\x80\xf9\x36\x16\x8f\x25\x6c\xa5\xee\xb8\xa8\x58\x1c\x91\x15\x50\xa7\xe3\xd5\xca\x5d\x4c\xfc\x69\xe6\xa0\x42\xe5\x2d\x19\x41\xe8\x04\xc5\x0b\xa4\x23\xea\xf3\x19\xb3\x20\x56\x9b\xc4\xde\x1c\x57\x84\xcc\x2d\x7c\x3e\x4b\x91\xed\x76\x4d\x94\x5d\x61\x5a\xa6\xd9\xd0\x93\x7d\x8c\xee\xa1\xa3\xe6\xea\x13\x23\x8f\xd0\xe1\x22\xd4\x11\xd9\xde\xaf\xa2\x53\x03\x00\x7b\xd8\xea\x24\x02\x9b\xa5\x29\xb9\x5b\xdc\x1b\x13\x52\x3e\xa1\x11\x87\x0c\x11\x1c\x64\xb0\xe6\x53\x53\xcb\x00\x62\xe8\x8e\x03\x18\x4c\x39\x8f\x58\x46\xf9\x18\x6e\x4b\x00\x48\x8b\x5e\xd0\x26\x17\x41\xa7\x23\x37\x96\xbb\xe1\x72\x39\x8e\xb9\x5d\x45\xc0\x63\x4e\x5c\xef\xd7\xfc\x52\x3a\xac\x34\xd1\x73\x41\x72\xb2\xf7\x63\xba\x44\x64\x22\x8a\xf9\x3c\x54\xd7\x6b\x36\x95\x51\x32\x33\xb7\xf3\x35\x48\x2a\x08\xf1\x17\x32\xc1\x08\x24\x91\xe6\xa8\xac\xeb\xb2\x05\x0f\xab\xa0\xb2\x28\x82\xd7\x73\x66\x6d\x4e\xd1\x0e\xc3\x33\x27\x2b\x88\x31\x9a\x6d\x26\x07\x62\x74\x42\xb2\x15\x38\xc2\xbb\xac\x65\xd1\x51\x63\x24\x3e\xc7\xee\xd0\x96\x91\x8a\x69\xec\x59\x0e\x71\x18\x0a\x2d\x66\x1d\xc9\xc3\x8c\xf0\xed\x31\x36\x03\x6d\xcd\xd6\xab\xe5\x02\x9e\x0c\x4d\x92\xc1\xe9\x53\xc3\xe7\x07\x96\x01\x9b\xf1\x86\x41\xca\xbd\xb1\xad\xc1\x32\x3d\x1e\xdd\x85\x53\xd4\x3b\xb3\x91\x44\x38\xa4\xec\x71\x08\xf0\xf1\x14\x98\x00\x10\xe3\x64\x49\x88\x1b\xc7\xd7\xa8\x29\xab\x2a\x07\x1e\x3f\x36\x53\x72\x0f\x62\x92\x5e\x01\x12\xa8\xf1\x06\x06\xab\x66\x25\xf1\x42\x3c\x6b\xfb\x35\x6d\x95\xa4\xde\x11\xf5\xd6\x39\x86\x6d\xfc\x53\x83\x51\xc7\x5d\x37\x4e\x4e\xf3\x08\xcb\x4e\xab\xa9\xa9\x09\x25\x29\x1d\x3b\xe0\x83\x85\x1c\x22\xd9\xd0\x19\x2f\xbb\x12\x95\xd0\x95\x8f\x06\x38\x20\x39\x1e\xf8\x60\xbe\x42\xec\x65\x3a\x6a\x11\x82\xf2\x8d\x1d\x3b\xa9\x51\xad\x3a\xed\x28\x47\xe1\x6a\x13\x9c\xe4\x80\x60\xe0\xf8\xa8\x2a\xa0\xaa\x7c\x30\xd6\x56\xdb\xb5\x05\x66\xbe\xad\x17\xd6\x1a\xe8\x34\x00\x10\xd5\xe2\x13\x19\x83\x8b\xe9\x84\x6d\x75\xfd\x60\x25\x04\x42\x24\x7a\x2d\xc6\xd9\x9e\xd9\xb3\xd5\xd0\xa7\xea\x34\x3d\xd6\x9b\xa9\xc8\x25\xe5\x5e\x3d\x8c\xd6\x51\xa7\x76\x73\x75\x8c\x4a\x34\x17\x4b\xf5\x6e\xbd\xf6\xba\x76\x9d\x1f\xc7\x0c\xe1\x53\x3e\x6f\xc4\xd5\x6e\xc3\x98\xd5\x12\x80\xf4\xa0\x23\xad\x9c\x51\x88\xb9\x08\x37\xd9\xc8\x61\x46\xb2\x81\x93\xa9\x39\xac\x88\x05\x88\x2c\x52\x02\x04\x08\xb6\x11\x0c\x44\x08\x06\x8d\x4a\x92\x6e\xbc\x06\x00\x88\x0e\xb3\x57\x27\x59\xb3\x9d\xce\x0d\xaa\x3b\x7a\x54\x68\x1d\xbb\x74\x5b\xa1\x15\x83\x6f\x17\xa3\xcc\x5d\x0e\x4d\x21\x9e\x4e\x35\x40\x03\x82\xb4\x8e\xf5\xee\x30\x33\x49\x8d\xa8\xc4\xc6\x00\xb2\x4e\x83\x66\x5e\x2d\xe3\xaa\x53\x6d\xf6\x08\x28\x93\xc4\xb4\x76\x61\xec\x0f\xa1\x02\x20\xc9\x02\x62\xd0\x39\x07\xda\x57\x1c\x20\x35\x19\xe9\x1f\x5d\xad\x2d\x35\x76\x21\xd3\xcc\x18\xca\xa4\x2d\x0a\xad\x00\x37\x75\xc2\x95\xec\x6c\xfc\x49\x2e\x99\xd0\x62\xdf\xca\xea\x11\xdd\xed\x13\xa6\xde\x63\xb8\x3f\x6f\x3a\x6c\x88\xc0\xdb\xb9\x30\xee\xb0\xd6\xd7\xa6\xd3\x89\x97\x25\x6b\x7d\x41\xdb\x94\x8b\xe0\x0d\xeb\x55\x66\xeb\xee\x1d\xdf\x40\xd5\xf6\xa8\x36\x29\x62\x64\xd6\x86\x57\x0e\x91\x42\x8e\x80\x2a\xc3\x49\x6d\x64\x40\x2f\x37\x13\xe0\x03\x59\x24\x96\xb6\xd1\x00\x10\x03\x42\x69\x35\x78\xb8\x4a\x76\x87\xc5\x41\x55\x96\xd4\x36\xd8\x6c\x91\xc9\xd6\x2b\x72\x02\xdb\xce\xf0\x7d\x5e\xaf\x69\x6b\x4f\x90\x14\x2a\x39\xee\x86\xc9\x49\x81\xf6\x49\x6a\xe7\x30\x2b\xb1\x99\x02\x00\x28\xbd\xd1\xf0\x38\xd5\x93\x11\x12\x27\x4d\x91\x8b\x62\xb0\x92\x39\x61\x3f\xae\x11\x7a\xba\x2b\xd0\xe3\x9c\x48\x7d\x71\xe9\x72\x71\x61\x95\xa1\xbf\xb7\x83\x78\x5f\xbb\x63\xc0\x18\x3e\x54\x75\x9b\x46\x4f\x37\x0b\x4c\xe3\x17\xb9\xbd\xb7\xd7\x02\xc0\x8d\xf3\xc9\x6b\xc8\xec\x0e\xbc\x2f\x00\x0b\x99\x6e\x8a\x4a\xc5\xdc\xb6\x92\x97\xa6\x93\xaf\x8e\x26\x3d\x9f\x92\xf1\xb1\x90\x15\xde\x27\xbc\x3c\x68\xd2\xe5\x9a\xdf\x57\xf3\x43\x92\x8f\x0d\x7a\xa5\x1e\x09\x6f\x42\x13\xa1\x8e\x1d\x7c\x7e\x2b\x83\x86\xc2\x17\xde\x74\x01\x44\x4a\x0c\xd8\xed\x12\x00\x10\xfb\x02\x54\x31\xe5\x48\x82\xcc\x13\xef\xcc\x4e\x64\xca\xdb\x58\xd1\x2e\x56\x75\x3c\x4f\xdb\xa6\xdc\x18\x33\xa6\x8c\xd0\x08\x5f\x85\x25\x09\x58\x72\xca\x44\xcd\x76\x4e\xcf\x7c\xfe\xbc\x2f\x90\x9e\xa2\x72\x8f\x90\x2e\x23\x5a\x8b\x85\x9f\x75\x53\x11\x62\xda\x2e\x6c\x4c\xc2\xe7\x5a\xa8\x63\x43\x92\x00\x02\x88\x09\x61\x99\x33\xc3\x52\x9a\xf1\xb9\xe1\x9c\xe8\x70\x66\x17\xc3\x91\x19\xb3\x7e\x51\x57\xa3\xdd\x8a\x4f\x23\x97\x1f\x1f\xe9\xc6\x5a\x9d\x00\x2b\x13\x1c\x4d\xe9\x45\x2c\x3a\x04\x00\x2e\x2a\x00\x15\x91\x0f\x10\xdf\x28\x25\x8d\x03\xde\xaa\xc4\x14\x50\xe3\x79\x2a\x99\x8d\x19\x4b\x9c\x75\xac\x3a\x7d\xe9\xee\x0b\x8f\x98\xec\x42\x31\x5a\x73\x08\x99\x10\xc4\x18\x70\x40\x70\xb0\x29\x98\x65\x25\xcd\xc4\x9a\x3a\xa7\x49\x02\x72\xb6\x9e\x42\x91\x88\xad\xe4\x0b\xf6\xb0\x5c\xe5\xb1\x23\xc0\x93\xf1\xa2\x4d\xd1\x22\x4f\x0e\xa7\x4d\x69\xf2\x6b\x25\x84\x19\xf9\x7c\x7e\x28\x47\x33\x91\x04\x52\xb8\x2d\x64\x42\x06\x14\x49\x95\x87\x3c\xcb\x56\x75\xe5\x42\xc8\x88\xf4\x66\xfe\x38\xa4\xdd\xd0\xdc\xf8\x46\x22\x03\x0e\x87\xf0\xa6\x8c\x68\x82\x0e\x89\x38\x5b\xca\x63\x21\x44\x60\x41\x93\x11\x79\xbf\xde\xed\xdb\x2e\x84\x80\x57\x6f\x84\x4c\xdc\xd3\xc6\x4e\x96\xac\xae\x40\x4e\x33\x7c\x78\x58\xf8\x22\x0a\xe8\xf6\xb8\xb5\xa4\x83\xd3\x5a\x63\x7e\x1c\x15\x71\xb1\xc7\x4f\xe8\x7e\x06\x5c\x5f\xa0\xda\xf1\x3c\xe5\x4b\x63\x11\x6c\x1d\x1c\xad\x0f\xa3\x29\x0e\x65\xb5\xea\x2e\x89\x3c\x23\x43\xd2\x60\x8b\x0e\x5a\x77\x3a\x80\x29\xaa\xa2\xa6\x40\xf3\x01\x16\x20\xb1\x48\x02\xd0\x39\xcc\x11\x52\xa1\x9d\xaa\x2e\x23\xcf\x5c\xc7\x5a\xbe\xc5\xf0\x64\x87\x2a\xbb\xe4\x70\xe0\x3d\xd1\x8b\xe2\x80\x05\xbb\x7a\x62\x64\x80\x06\xa4\x0f\x40\x2e\x28\x51\xb5\x80\x84\x48\xa6\xd6\x62\x63\x92\xfa\xf9\x4c\x9f\x14\xca\x7c\x8a\xb4\x41\x3e\x1b\xea\xfb\x83\x4c\x34\x58\x8b\x8f\x1c\xaf\x3a\x44\x7b\x99\x3e\xd5\xd8\x7c\x46\x8c\x97\x90\x32\x1e\x21\xfa\x61\x2a\x19\xa1\x3f\x69\xa4\x64\xbc\xae\x53\xc4\xb3\xf1\x58\xa0\x56\x99\xbd\xe5\xcb\xb1\xbd\x38\xf8\xdb\x60\xd5\xe5\x47\x5c\x50\xf0\x50\xa2\xc2\xb8\x99\x4e\xad\xdc\x9c\x1c\x86\x9c\x24\x3a\x5b\xa0\x02\x09\x18\x55\xe2\x90\x69\xb6\x75\x8a\x68\x8e\x0b\x73\x75\x02\x5b\x69\x19\x19\x6b\x65\xc9\xcc\x78\x44\xd1\x59\x41\x4a\x89\xd3\x69\xb6\x06\x53\xea\x38\x5e\xf4\x51\x8b\x22\x92\xb2\x0e\xf0\x79\x11\x56\x3b\x43\x44\x63\xc7\xda\xb1\x98\x8c\x69\xf0\xd1\xc2\x27\x3c\x6a\xb2\x81\x93\x10\x76\xb7\xdf\xb9\xa7\xda\x40\x47\xfe\x02\x74\x85\x83\x38\xcd\xf5\xeb\x85\x60\xbc\x72\xfb\xe7\xf9\x69\xbd\x67\xd6\xf8\x49\x75\xf6\xf6\xda\x46\x93\xb9\x93\xed\xd8\x76\xdd\x7a\x8d\x00\x16\x7e\xbc\x26\xf2\x85\x7e\x6c\x9a\x08\xd2\xa5\x60\xe4\x2d\xe7\x27\x5d\x2a\x87\x30\xcd\x40\xb9\x55\x40\xb5\x3b\x92\xba\x6c\xde\x98\x2e\x00\x84\x8f\xe6\x23\x74\x11\xaa\x3e\x30\x61\xcb\x88\xa5\x24\x8c\x69\x9f\x4d\xc7\x73\x4c\x72\x1a\x73\xdf\x71\x93\xa3\xb4\x1f\x56\xe3\xb6\x6c\x71\x15\x8b\x09\x73\x36\xa6\x75\x99\x60\xc6\x80\x23\x40\xb2\x32\x59\x7c\x95\xcd\x4d\x32\xe3\x01\xa0\xd6\x1e\x24\x59\xbc\x15\x4e\xe0\x76\x32\x86\x4f\xec\x64\xd1\xed\x66\xe2\x68\xd3\x29\x42\xca\xac\x92\xa3\x27\x96\x61\x2c\xb3\x8d\x71\x3d\xf3\xc6\x16\x32\x35\x5d\x91\x7d\xc8\x45\xf9\x36\x22\xd7\x7b\x62\x71\x6a\x3a\x8f\xc7\xed\xb1\x05\xd3\x8a\x41\x00\x3d\x06\x34\x75\x38\x66\xe2\x84\x90\x09\x50\x03\xbf\xee\x98\x03\xb7\xa8\x92\x3d\x8b\x09\x2e\xde\xec\x84\x6c\x9b\x4a\x01\xc0\xba\xe9\xe8\xb0\xce\x94\x55\x32\x0b\x9a\x4c\x62\x33\x0a\x80\x98\xdc\x36\x14\x00\xa3\x31\xc3\x82\x7a\xb3\x8b\xd9\x0c\xdb\x79\x68\x55\xcd\x67\x1b\x9d\xf2\xc0\xcc\x4c\x4c\x92\x90\x91\x6c\x55\xc0\x43\x99\x9c\x72\xc7\x9a\xec\x65\x9b\x6f\x75\x20\x93\x02\x8a\x8a\x09\x8d\x49\x93\xa9\x01\xb6\xac\xac\xcd\x56\xdc\x6a\x99\x69\xb3\x6e\xe9\x60\x31\x2a\x79\x13\x0d\x18\x0b\xb0\x24\xea\x9d\x36\x15\xcf\xc7\xf8\xf3\x4e\xc3\x57\xea\xb4\x7f\xce\xe8\xc5\x9c\xdd\xa2\xb5\x4d\x36\x0d\x7d\x1c\xd2\xeb\x80\x29\x42\x3d\xda\x02\x1b\x58\xe8\x04\xde\x19\x56\xaa\x59\x9b\xed\xba\xc3\x88\x66\x9d\xef\x75\x5b\xb4\x04\x65\x3f\x71\x2d\x84\x87\x61\x5f\xf7\x34\x37\x37\xe8\x06\x00\x4b\x62\xca\x65\x2b\x80\xbd\xac\xfa\x00\x02\xc4\x2a\x33\xa7\xfc\x7e\x74\x42\x9b\xbd\x37\x1d\xee\xcb\x8d\x03\x0f\x35\x49\x5e\x6b\x94\x69\x11\x09\x88\x96\x54\x78\x30\x9a\x1a\xa0\x4b\x7e\xd6\xf3\x41\x13\x02\xa8\x66\x46\x51\xee\x4a\x18\x5d\x0e\x67\xa2\x34\x1b\xaa\xb3\xc2\x9d\xd2\xac\x66\xb1\x69\x47\x8e\x44\x33\xd9\xc9\x34\x20\x4f\x30\x43\x38\xfd\x38\x80\x91\x83\xfb\x21\xde\x4d\x15\xb0\x2c\xe1\x64\xcc\x2c\x37\x46\x36\xa3\x0c\x7c\xcc\xcf\x87\x04\x41\xd5\xd1\x21\x6e\x60\xc3\x1e\xcd\x27\xf2\xb6\x9e\x1b\x2a\x07\xa1\xb6\x65\x67\x8b\x0d\x5f\xb8\xc6\x1e\xed\x62\x72\x66\x8d\x64\x1a\xd0\x4c\x07\x8f\xe4\xce\x37\xac\x8b\xf2\xc2\xd9\xc6\x69\x4f\xe4\x78\xbd\xd3\x6a\x08\x99\x19\x1e\xec\x4c\xc6\x63\x1e\x37\x34\x30\xd7\x99\x04\x8c\x86\x90\x01\x96\x42\x08\xcb\xab\x6c\xd5\x98\xbe\x09\x22\x30\x19\x8e\x24\x16\x57\x91\x72\x24\x50\xec\x71\x3f\x9b\x89\xe2\x61\xaa\xad\x18\x07\x2b\x32\xc1\x4a\xe7\x52\xa6\x0d\xb7\x09\x17\x18\xbe\x33\xd9\x00\xf1\xf2\x3d\x8f\x08\xd6\x43\x63\x2b\x37\x98\x6f\xe7\x9d\x94\xf3\x2e\x24\xb8\xe8\xce\xc1\x43\x55\x1a\xa3\x3b\xfe\x38\x83\x92\xec\x58\x87\xc3\x46\x5f\xae\xc0\x1e\x19\xcd\x96\x98\x64\xb4\x5d\x84\xfb\xc6\x04\x5b\x25\xf4\x94\xe1\x00\xca\x8c\x12\xe5\x80\x4d\xe8\xa3\x33\x19\x1f\x17\x9b\x1d\x83\x17\xd4\x48\xe7\x79\xd0\xe0\xe3\x60\x3d\x5e\x58\xe4\x76\x54\x2e\x17\x6e\x0b\x45\x5d\x6f\xbf\x08\x28\xd8\x9d\x66\x23\x68\x36\x1e\x59\xe4\x62\x35\x21\x30\xd8\x88\x35\x96\x3c\x52\xb4\x50\xc9\x81\x96\xe0\x42\x48\xfa\x80\x06\xdb\x62\xb7\x5d\x6b\xab\xb2\xec\x59\xdd\xe4\x9e\x37\xac\x8c\x22\xeb\x4c\x33\xc5\x87\x0d\x35\xb4\x3d\xb3\x8a\x84\x5d\xd9\x2c\x47\xb0\xba\x59\x49\x08\x4f\xa5\x81\x04\xe3\xb1\xad\x67\x45\x75\x84\x4b\x7c\x88\xee\x4e\x5b\x0f\x4e\xa5\xa5\x9b\x3a\x19\xc9\xa6\x84\x11\x87\x35\x42\xca\x73\x62\x1d\xaf\x4c\x78\x24\x34\x59\x82\x2e\xe0\xa8\xa8\x57\xe2\x58\x9e\x64\x1d\x5e\x1d\x29\xf9\x04\x6d\x2d\x8c\xed\xa4\x10\xf2\x97\x2c\xc0\x29\x8b\xf6\xc1\xe3\xe0\x7b\x1f\x5f\x85\x89\xed\x7b\x25\x1c\x3a\x59\xfa\xcb\x6c\x3c\xb8\x1f\x9c\x0b\xe0\x3c\x7d\xf5\x01\x56\x68\x10\x92\xd2\x20\xc2\xdc\xcf\xfa\xbe\x2c\x55\x3d\xa0\x75\xbf\x9f\x08\xe7\x8f\x44\x7c\xb2\x77\x70\x01\x15\x26\xac\x83\x9f\x4b\xe6\x2e\xa1\xf5\x1e\xe4\x62\xbe\x22\xe1\x36\x38\x7f\x08\x00\x98\x4e\x8f\x5c\x12\x08\x13\x89\x95\xa2\xbe\xc0\x37\x91\x40\xd5\x64\x00\xbc\xd0\x04\x80\x23\x69\x00\xa8\xf1\xb9\x42\xf2\x01\x60\xf5\x06\x00\xea\xd0\x63\x96\x72\x1f\x00\xc2\x6d\xd2\x45\xae\xac\xce\x23\x6f\x85\x2a\xe2\xd2\x60\x35\x05\x70\x43\xc1\xd9\x02\x4d\xa3\xb3\xee\xc5\x8d\xca\xc4\x1d\x00\xa0\xe6\x1a\x00\x16\xa1\x48\x78\x82\x0e\xbb\x3e\x00\x8c\x10\xf0\x0a\xcd\xe8\xde\xb2\xa8\x36\x9b\xb8\xdc\x88\xee\x08\xc6\x90\x6e\x3a\xc6\x67\x35\xd5\xd1\x49\xab\x30\xe1\x96\x2b\xa5\x8d\x35\x35\xb8\x54\xe3\x19\x53\x5d\x63\xb6\x53\xd1\x43\xa7\x5a\x47\x4e\x45\x33\x63\x0e\x31\x14\x86\x5e\x83\x2c\x0c\xe4\x0c\xec\x65\x26\x09\x89\xcc\x5f\xdb\x1c\x0d\x28\x86\x4c\xe4\x4d\x14\x57\x19\x82\x6b\x12\x92\xba\x6b\x0e\xdf\xb6\x96\x1d\xaf\x59\x3e\x4c\x35\xb3\x8a\x14\x9e\x89\x9c\xaa\x8b\x67\x9d\x3b\x9b\x4c\xa0\xa9\x83\xcf\x20\x7d\x5f\x87\xf9\x96\xa4\x86\x27\x68\x06\xd9\xde\x64\x74\x3c\x26\x7c\x7c\xc4\x7c\x09\x35\x95\xfa\xe5\x9f\x5e\x83\xaa\xc8\x88\x25\x96\xee\x3c\xa1\xb4\xd5\xcd\xba\x2e\xec\xe2\xa8\x1c\xf5\x42\x4b\x63\xc7\x31\xe0\x91\x8d\xc5\x94\xe2\x29\x02\xe3\x3a\xb8\x65\x8f\xd3\xee\xb8\x46\xb7\x13\x89\xcb\x1b\x2b\x98\x2c\xb1\x49\xc8\x9a\xe1\xaa\xab\x4e\xc7\x13\x1e\x1e\x00\x82\x68\xa9\x0f\xaf\x37\xec\x70\x87\xcd\xe5\x92\x89\x42\x44\xde\x76\x90\x03\x8c\x21\xba\xf7\x94\x48\x6b\x1a\xdd\x45\x4f\xbb\xd2\xe0\xa6\x33\x69\xbf\x5d\x14\x4d\x9a\xf1\xdc\xa2\x99\xd2\x19\x90\x38\xc0\xf8\x8b\x86\xd2\xc8\xd6\x01\x3c\x41\xf3\x5c\xc8\x01\x3f\x0b\x39\x12\x70\x3e\xe7\x73\x04\x3f\xcf\xdd\x95\x42\x2a\x07\xac\x5c\x91\x04\xe0\x41\x18\x4e\x65\x1f\x44\xf0\x8a\x63\x22\x95\x20\xe4\x63\x80\xc9\x4a\x24\x6f\x2a\x9a\x24\x84\xbc\x65\x67\xdb\x62\x14\x88\x61\x14\x38\x3e\x2e\x1b\xb8\x6b\x46\x3e\x50\x18\x42\x8d\x92\x58\x4f\xd2\x7c\xb2\x48\x16\x9b\x69\x11\x4f\x0f\xb3\x91\xb4\x12\x78\x84\x92\xc9\x68\xe5\x69\xb4\x23\x17\x80\x1a\x4e\x66\xd0\x04\x9a\x2c\xca\x15\x76\xac\xf8\x66\x06\x86\xd6\x71\xdb\x30\x3b\x59\x84\x8b\x21\x0c\x4e\xd4\x18\x17\x16\xc4\x71\xc4\xb3\x9c\xcd\x35\x5c\xce\x8d\xe6\xdc\xd6\x3b\xba\x53\xb4\x40\x38\x4c\x12\xf7\x47\x7e\x27\x65\xa3\xdd\x8e\x3c\x34\x43\x3a\xe0\x94\x58\x96\x43\xcc\xc6\x26\x39\x62\x57\x3b\xcd\x20\x50\x74\x15\x70\x35\x5b\xcd\x46\x55\x9a\x12\xc5\x64\xd4\xb1\x4b\x18\xcc\x81\x9a\x99\xfb\x53\x6b\x18\x1a\x29\x91\xab\x9d\xb4\x5e\xce\xca\xf9\xae\xf6\x20\x77\x07\x2f\xf0\x02\xeb\xa6\xa2\x3a\xd7\xa5\x23\x66\xaf\x4d\x8a\x3b\xe0\x18\x41\x6f\x36\xb4\xac\xac\x48\x59\x18\x1d\x98\xd8\x63\x44\xd7\xad\xa5\x46\x34\xb0\xb5\xa0\x13\x1b\xc6\x38\x19\x9b\xa0\x4a\xb0\x7d\xb1\xaf\x8e\xcd\x10\x3b\xd6\x8b\x61\xbd\xda\xcc\x01\xd0\xfd\x20\x9a\xc7\x8b\xd5\x86\x9f\x59\x47\xab\x5b\x4c\xb0\x69\xd6\x4d\xd9\x52\x0a\x18\x06\xad\x31\x9b\x45\xe8\x29\x4f\x1f\xc1\x3a\xf0\xa0\x14\x5d\xb1\xd4\x04\xb1\x26\x70\x9b\x38\xce\x6e\x41\xa8\xc2\x4c\x1c\xa6\x1b\x04\x1c\x52\x93\x51\x85\x90\x98\xec\xb8\x50\xea\x7c\x2c\x42\x87\x84\x67\xb2\xeb\xa1\x2f\x46\xc5\x10\xa6\x08\x02\x1a\xb3\xd1\x7c\xa1\xb5\x89\xb2\xdb\xb6\xbb\x19\x74\x70\xe0\xe9\xba\xec\xc4\x59\xdc\x31\xb3\x19\x3e\x9e\x56\x4d\x6b\x91\xe0\x30\x6a\xb6\x72\x28\x92\x0a\xbd\x5e\x11\x11\xb5\x71\x3d\xcc\xe3\xf0\xe9\x0c\x0a\x3c\x18\x1a\xd6\xb0\x57\xc1\x0e\x06\x04\x08\xae\xd5\xee\xb4\xd0\x8e\xbe\x30\x29\x12\xa8\x22\x68\x9c\xb4\xc0\x90\x55\x6c\x46\x9b\x64\x87\xa5\x2c\x90\xa4\x5b\x1e\x88\x7c\x3c\x9c\x53\x33\x8f\x25\xa8\xc9\x64\x53\xa7\xfc\x70\x9c\xc1\xd0\xf8\x00\xc1\xce\x82\x37\x17\x2b\x74\x17\x74\xbb\xf9\x3c\x52\xcc\xb0\x21\x14\x01\xdd\xa5\x0b\x18\x0b\x95\x6e\x02\xd7\x1a\x3c\x4d\x77\x75\xdd\xa1\x5a\x1b\xdb\x53\x28\xd8\x28\x5b\x7e\x2c\xeb\x02\x61\x2f\x6a\x3e\xf1\x8d\x05\xaf\x08\xb5\x1a\xc4\x1c\x91\xdb\x55\x48\x33\x20\x07\x24\xc7\xb0\x2c\x1c\x03\x18\x5e\xb2\x7b\x0c\x3b\x78\x88\xb7\x3a\xca\xfc\x86\xb6\x61\x3e\x65\x69\x2e\x03\x84\xe9\xce\xd0\x11\xdc\x49\xab\x1d\xc4\xef\x89\x56\xe4\x49\x18\x3e\xb5\x1b\x68\x6e\xda\x96\x3f\x07\x56\xe9\x21\x48\xed\x0d\x6b\xe2\x74\x5a\x8b\x72\x31\xa7\x63\xd7\x30\x04\x72\xbd\x95\x7d\x00\xc6\x52\xea\xf9\xf2\x6a\x32\x9b\x4d\xba\xa3\xbd\x62\x51\x7f\x5e\x72\xb9\x1c\xba\xeb\x3a\x53\x1a\x00\x67\x28\xbc\xa5\xba\x09\x92\xed\x76\x50\xca\x70\x36\xbc\x73\xba\x0e\x5d\x1d\xd0\xa0\x53\xb7\x4a\x54\x2e\xc8\xb6\x5c\x6a\x38\x46\x70\x93\xbd\x49\xae\xe1\x30\x70\x61\x87\x10\xd6\x96\x66\x05\xb2\xc3\x18\xb3\x83\xb8\x97\x11\x3f\xa1\x9b\x04\x0f\xa2\x43\x29\x19\xf4\x9e\xca\xfc\x03\x36\xd9\x4a\xfb\xa3\x4d\xc7\x84\xb0\x08\xbb\xc4\x34\x7c\x61\x6d\xad\x91\x21\xbb\xf7\xa4\xc5\xdc\x06\x5b\x3d\xcc\x33\x5e\x5b\xb3\x40\x68\x6c\x5c\x30\xf3\x84\x25\x79\x9d\x40\x62\x99\xcc\x74\xa4\x74\x04\xc4\x27\x45\x5e\x51\x0f\x07\x69\xcf\x7a\x31\x42\x1f\xac\x9c\xcb\x19\x6e\x4b\xe9\xde\xb2\x69\x24\x11\x3d\x4d\x7c\x09\x77\xd3\x75\x50\xa8\x9d\xc1\x10\x14\xdd\x89\x79\xa4\x2f\x96\x22\x82\x13\x9c\xcf\x94\xea\xd0\xf7\xdb\xa5\xde\x09\x86\x1a\x92\x4a\x49\x13\xb4\x4e\x67\x4c\xa8\x1c\xd0\xe3\x88\x5d\x6e\xf6\xa2\x3b\x9c\xe6\x2a\x6b\x78\x56\x5a\xd7\x69\x68\xd9\x59\xce\x71\x32\x01\xb8\x20\xd5\x0f\xfe\x71\x3b\xac\x74\x4c\x22\x04\x26\x5c\x93\xae\x78\x72\x01\xb1\x26\x58\x68\xcb\x65\xe4\x11\x60\xca\x52\x9f\x09\x27\x4a\x0a\xed\x60\x8e\x6e\x00\x00\x5d\xd9\x49\xf8\x92\x8d\x2c\x6e\xe9\x08\x60\x51\xbb\xae\xc2\x86\x98\xb1\x66\x14\x6f\xe1\xac\x4f\x53\x37\x68\xa5\x91\xcd\xe4\xc7\x28\xb0\x13\x6a\xc4\x32\x8d\x2c\xd7\x6a\xe5\x37\x8b\x55\x5e\x4a\x9d\x8d\x8f\xe6\x14\x7c\xa2\x70\x91\x6a\xd0\xbd\x41\x16\xa4\xc8\xaa\x91\xde\x24\x4d\x89\x45\xa4\x08\x28\x0a\x99\x93\x56\x1e\xda\xb1\x38\xc7\xb6\xa1\x8d\x57\x85\x51\xf2\x50\x1b\xf1\x40\x50\x75\xb5\x12\x91\x6c\x5d\xaa\x72\xe1\x6b\x73\xb7\x46\xc5\x4d\x1c\xd3\x89\xd7\x31\x30\xab\x04\x1d\x44\xe2\xdb\x71\x70\xa2\xfd\x22\x3d\xed\x8d\xc5\xa2\x0b\x9c\x20\x1b\x86\x4c\x49\x85\xf3\x2c\x91\xba\x0a\xa2\x4a\x78\xda\x4d\x56\x5c\x97\xec\x14\x6c\xe6\xad\x86\xae\x61\xa8\x12\x1d\xee\x15\x24\x55\x4a\xa6\xf0\x87\x9c\x9a\x27\x51\x26\xcf\x1c\xad\xde\xb5\x42\x41\x6c\xd9\x24\xd3\x33\xde\x5a\x27\xf1\x8a\xda\x28\x96\xef\x8a\xd4\xb2\x6c\xa7\x6c\xbd\xd9\x56\x2d\xd6\x1d\x8f\x81\x22\x0b\x9a\xcb\x24\x0b\x19\x90\x99\x86\xba\x8d\x39\xf3\x76\xca\x3a\x3e\x82\x61\x32\x6c\xf9\x13\xca\xd1\xbe\x1f\xad\x8a\x54\x3f\x6e\x88\x99\x88\xc4\xf3\xc8\x0e\x8d\x16\x6a\x15\x18\x50\x72\xbd\x52\x64\x90\xe7\xb6\x89\xf0\xbb\x4e\x22\x08\x64\x9f\x31\xa0\xc4\xa5\xd3\x76\x34\xa3\x11\x73\x92\x33\x38\x45\x51\x6e\xd2\xe0\x93\x85\x7f\xf2\x65\x76\xbb\x2d\x27\xdc\x1e\xe7\xf3\xb9\xc8\x35\xfb\xb9\xc2\x38\x0c\xd2\x32\xbc\x43\xb9\x34\x92\xeb\x5b\xcc\x94\x87\x81\xb9\x2e\x29\x46\x6d\x77\xbb\xc9\xd1\x67\xc5\x93\x84\x45\x91\x38\x0f\x6d\xb0\xea\x54\x07\x34\x1d\x81\x98\x46\x9c\x80\x9a\xcd\xb0\x4e\x66\x23\xc1\xd6\xf3\x5c\x63\x81\x2e\x13\x0b\x39\x05\x66\x82\xf3\xf8\x70\xe7\x91\xb1\x0b\xe6\x1e\xeb\xa1\x8c\x4d\x1e\x66\x3b\x77\x23\x8b\xab\xe9\xa1\x1a\x95\xc4\x58\x8a\xe7\xdb\x15\x9e\x47\x44\xd3\x11\xfe\x9c\xcd\x04\xd1\x75\xb8\xf9\x14\xa5\x1b\x44\x11\xc6\xfa\x41\x6b\x59\xc0\xd3\xac\x4a\x90\x8b\xc4\x60\x49\xfb\xb8\x69\x74\xa7\x99\xe7\x1b\x91\xe7\x54\xd4\x4c\x8d\xa0\x38\x20\x43\x07\x48\x72\x1b\x91\x13\x53\x9c\x8f\xc2\xf1\xb1\x09\xc7\xa3\x85\x81\x57\x05\x27\x0c\x91\x39\x7f\x62\x17\xc7\x5c\xd3\x14\x84\xb2\xac\x98\xaf\x68\x5a\x6c\x15\x88\x33\x78\x5e\x53\x63\x06\x30\xae\xb5\xc0\x27\xfb\x8c\xf1\xcb\xa6\xa0\x2d\x6c\x83\x8c\xa9\x23\xe6\x01\x76\x32\x9d\x18\xc9\x14\xae\x90\x72\x9a\x8a\xb1\x3b\x5b\xed\x89\x80\x25\x97\xc3\xf9\xc4\x8d\x13\x7c\x86\xf8\x58\xc1\x75\x64\x05\x8f\x4e\x2c\xb7\x0e\xc1\xc8\x6d\xe7\xf2\x88\x95\x9c\xde\x4e\xd5\xe6\xdc\x3a\xd4\x8d\xa6\x2e\xb5\x8d\x08\x32\xdf\xc8\xd4\x3a\xaa\xc1\xa6\x89\x3b\x46\xcf\x55\x85\x3c\xc5\x43\xa7\x85\x8c\x4c\x22\x3a\xd8\x0a\x67\xd8\xf1\xe4\x51\xf4\x70\xbc\x6d\x87\x61\xbd\x28\xb9\x52\x52\x17\xea\x9a\xac\x9b\x86\x0e\x10\x7b\x16\xc0\x75\x4b\x95\x10\xea\xaf\xd3\x96\xda\x43\x93\x99\x2b\x0b\xfb\x20\xf6\xf1\xad\x15\xc3\xc7\x28\xb4\xa9\xa4\x8a\x8e\x9b\x25\x13\x26\x89\xae\x88\x3c\x6e\x98\x52\x44\xe4\x6a\xec\xaa\xb5\x3f\x1b\x6a\x94\x19\x72\x94\xbb\x69\x2a\xfa\xa8\x79\xd4\x32\x6e\xad\x06\x3b\xc1\x18\xbe\xa2\x52\xb7\x5e\x90\x21\x2c\xe2\x90\x27\x23\x56\x35\x72\x48\x97\x1b\xce\x61\x46\x60\x5a\x7f\x94\x88\xf4\x4c\x99\x14\x8a\xb8\xd6\x42\x18\x54\x9d\xb4\x4a\xe9\xe5\x42\xd8\x18\x68\x75\x2a\x00\x14\x33\x87\x2e\x12\x22\x8c\x58\x72\x48\x84\x11\x6b\x7a\x54\x36\xd4\x06\x4c\x9a\x38\x41\xb6\x0c\x1d\xd1\x12\xb5\xdd\x77\xeb\x55\x97\x50\x07\xad\xc1\x59\x2a\xdd\xee\xbb\xd1\xa4\x6c\x5c\xd6\x11\xf2\xd1\x18\xda\x57\x1e\x1c\x21\x46\x5d\x54\x8a\xce\xa5\xea\x8a\xdf\x50\x98\x39\x43\xcc\xdd\xc6\xd9\x5a\xd5\x84\xc3\x67\x15\x2c\xe2\xa3\x05\x3f\xb2\x7c\x66\x12\x8b\x60\x5b\x2e\x67\xc4\x2e\xdc\xd0\xa3\xba\x0a\x36\x74\xc7\x10\x02\xa4\xe5\x20\x28\x8c\x3a\x05\x80\xf6\xe8\x1c\xa7\x64\x3c\x3b\x9d\x64\x0e\xda\x45\xea\x3e\x85\xab\x79\x69\xed\xd6\x0e\x98\xed\xb1\xcd\xfe\x18\xc1\x88\x59\x79\x13\xf4\x48\x4d\x99\x93\xd5\xc0\x26\x6a\xd8\xb5\x52\x02\x80\x4f\x31\x2e\xa1\x52\x28\x63\xd0\x29\xb5\x80\xbb\x03\x93\x62\x4d\x1a\xc2\xad\x43\xab\x6a\xa6\x1d\x23\xba\x6d\x5d\x82\x58\x86\x31\x93\x92\x20\x5e\x10\xa2\x08\xb1\x81\x1b\x61\x6c\xa5\x05\x19\x47\x0f\xb5\x3a\xd6\x6a\x2a\x2e\x1d\xe0\x83\x7a\xd9\x92\x60\xbc\x59\x8e\xd8\x15\xb4\xb2\xa7\x81\xb7\x2e\x59\xe0\xab\xf2\x09\x20\x56\xc7\x14\x53\x6e\xce\x06\x2c\x59\x47\x1e\xeb\xb9\xbb\x44\x94\xf2\xed\xb4\xf1\xe3\x13\x82\x0e\xf7\x9b\x48\x2b\xf7\x66\x32\x23\x11\x73\xbf\xe4\x55\x9f\x39\xb2\x35\x58\x4d\x0e\x5b\x11\x60\x5a\xee\x34\x20\x1b\x66\x19\x25\x35\xcd\x5e\xd0\x58\x54\xa6\x8e\x35\x1c\xfb\x58\x4c\xa6\x8d\x3f\x9e\x39\xad\xa3\xe6\xbc\x33\x75\x2d\x7e\xe5\x03\xd2\xf3\x6a\x60\x06\xfe\x0e\x59\xb9\x63\x7e\x7f\x12\x41\xb1\x19\xc1\xf3\xd8\x9a\x96\x3e\x8a\xe9\x23\x8d\xdc\x41\xb4\x5a\x21\x32\x43\x92\x4c\xb8\x36\x1d\x66\x88\x0d\x23\x0d\x8f\x03\x22\xa7\xd4\x0d\x10\x4f\x10\x7d\x18\xae\xc0\xc6\x04\x9c\xc9\x12\xf5\x4c\x3a\xeb\xbc\x77\x74\x62\x71\x37\x39\x81\x68\x32\x1d\x75\x6a\xbd\x99\x86\x13\x73\x3c\xb5\xa4\x8c\x04\xe3\xd6\x5d\x4f\x97\x28\x5c\xe3\x9a\xe2\xa2\x6e\x33\x19\x31\xf5\x6a\x75\x48\x6b\x8c\x4a\xea\xc9\x12\x9f\x29\x65\xb7\x5e\x84\xa7\xf9\xd1\x9f\x2b\x3b\x11\x9f\xb0\xfb\xa5\xdb\x25\xfe\x58\x1f\x47\xca\x02\x94\x08\xda\xcc\xc1\xa6\x09\x3d\xa2\xf1\x7d\x3f\xb3\x45\x9d\x9a\x64\xdc\x78\xb2\x4b\x68\x76\xbb\x3f\xea\xfe\x2e\x29\x08\xad\xc3\x66\xa3\x5d\x33\x8a\xca\x85\x20\xa0\xe3\x3c\xf1\x3b\x09\x69\xc8\x92\x71\xac\xd1\x64\xbc\x69\x3d\x2d\xb7\xdc\xae\xb5\xc9\x5d\x0d\xb1\x60\xa3\xf8\x63\x14\xf7\x54\x0d\xe9\x02\xd8\x25\xc6\xcc\x86\xda\x0b\x98\xa6\xfb\x46\x23\x2b\xb4\x9e\x55\x08\x60\x48\x9a\x6e\x31\x7d\x6a\x65\x84\x4f\x03\xa3\x71\x33\x3d\x0d\x3c\x26\x5d\xcf\x17\x5d\x05\x86\x27\x5c\xdb\xc3\x5d\x4b\x72\x27\xbd\xe1\x20\x2f\x29\xed\x55\x3a\x4a\x99\xe9\xe1\x74\x64\x98\x12\xa1\x60\x72\x8a\x8c\xac\x34\xc4\xf6\xf9\x61\x28\x9a\x30\x44\x93\x93\x7d\xaa\xfa\xf0\x0e\x1a\xf9\xc4\x78\x76\xda\x34\x30\xe1\xa4\x26\xb1\xa3\x38\x4f\x2c\x4c\x7b\xb1\x1e\x03\x12\x98\x4c\x92\xec\xf3\x70\x62\x1e\xf2\x84\x54\xd6\xe2\x01\x4d\xec\x85\xcf\x49\x07\xc6\xd1\xe5\x89\x48\x17\xf9\xc8\x6a\x0f\x49\x6a\x21\x7c\x8b\x40\x1c\xbf\x5e\x12\x5c\x31\x3a\xe4\x65\x17\x4f\x47\x28\xbc\x6b\xf2\x09\x66\x2d\x49\x6c\xd5\x24\x81\x40\xca\x40\x5f\x93\x73\x50\x8f\xc4\x7a\x19\x17\x21\x2d\xd3\xa7\x71\x67\x33\x76\xbd\x08\x58\x7f\x2c\x93\xf1\xd2\xdb\x57\xde\xcc\x94\x39\xd2\x59\x0c\x43\x2c\x9a\xc2\xb8\xce\xbb\xf0\xd6\xb2\x58\x5a\x9b\x37\x73\xd2\x14\xa6\xa7\x6e\xdf\x60\x01\x7e\x64\x99\x04\x6c\x4e\xc9\x70\xe6\xb6\xbb\x25\x8d\xd0\x95\x73\x88\x5a\xcd\x58\x69\xae\x8b\x1c\x18\x90\x2b\xab\xa5\x4d\x57\x4e\x2b\x83\x10\x20\x9a\x17\x93\x9e\x70\x54\x28\x4d\xcd\x36\x6b\xcd\xe4\xb7\xa3\x20\x9b\x8c\x94\x03\x12\x81\x7c\xdb\x50\x45\x1e\x14\x92\x42\xbb\x08\x97\x8f\x80\x44\xd4\xa7\x20\x9c\xb3\x65\x55\xe5\x04\x4e\x64\x41\xa8\x27\x07\x2b\xf7\xbd\x18\x17\xdb\xe1\x21\xab\x8b\xd4\x24\xb7\x8e\xee\xe3\x4d\xbe\x70\x1c\xdd\x2e\x0d\xcb\x20\x17\x80\xd7\xad\x40\xb0\x75\x2d\x1f\x05\x47\x6d\x4d\xe6\x9b\x14\x38\x34\x27\x95\x73\x04\xd9\xb5\xb5\x61\x2a\x87\xb1\x08\x30\x77\x33\xe2\x6b\x72\x5e\x8d\xda\x80\x06\x87\x75\x74\xc0\x39\x12\x17\xa1\xb9\xb9\x35\x10\x78\xbb\xe0\xc7\xc1\x0c\x75\x93\xd8\xe6\xb9\xf9\x4c\x0b\xa2\x53\xb7\xa5\x67\xbe\x8c\x14\x26\x31\x8e\x73\xd5\xd7\x1d\x84\xd4\xa6\x24\x92\xca\xdd\x4a\x3f\x92\x54\x84\x66\x93\xf0\x54\xea\x3a\xe2\x27\x25\xe3\xa8\x24\x99\xf2\x56\x99\x7b\x87\x31\x51\xad\xf4\x08\x63\xd5\xb6\x98\x93\x81\x60\xe5\x49\x0d\xeb\xa8\xdf\x08\xa5\xb8\xca\x50\x0b\xa6\x21\x6c\x36\x01\xf4\x82\x59\xe0\x53\x5a\x64\x99\xc3\xdc\x85\xe1\x16\x89\xf0\x99\x6f\x36\x0a\x64\xac\xf5\xf9\x31\x01\x72\x4b\x0d\xd1\xb9\x65\xf9\x59\x3b\xac\xf2\xb0\x56\xed\x31\x2b\x91\x3c\xc7\x4f\xeb\xa4\xcd\x46\x01\xbd\x90\xda\xa3\xca\xac\xe8\xb0\xe6\x5a\x47\x19\x85\xee\x66\xd9\x19\x87\x43\x93\xca\x1b\xc2\xf2\x83\x62\x5a\x8c\x12\x58\xd8\xb2\x7e\xdb\x95\x50\xb6\xa4\x87\x1a\x5c\x12\xc7\xc0\xf7\x43\xe0\x9c\xa4\x02\x22\x60\x18\x62\x4e\x7a\x57\xee\x28\x84\x56\xc4\x89\xc2\x70\xd1\x5e\xf3\xf7\x28\xb1\xd4\x12\x3f\x0d\x74\x7d\xe3\xb8\xe8\x12\x57\x73\x42\xcf\x71\x72\x4c\x19\x2c\x20\x12\x9b\x2e\x46\xd0\x74\x01\x15\x55\x38\x8f\x35\x40\xe9\x02\xce\x4d\x23\x7e\xba\xf1\x28\xca\x2b\x61\x01\x34\xd8\xa4\x5b\xe9\x6a\x61\xea\xe9\xa8\xca\x79\x89\x3f\xd0\xb8\x16\x48\x2a\x20\x53\x48\xe9\x40\xef\x5b\xc1\xf9\x04\x24\x3e\x87\xe6\xc1\x3a\x3a\x79\x04\x6e\x1d\xe4\x10\x94\x8c\x55\x45\x8c\x64\x71\x10\xc8\x26\xaa\x7f\xaa\x0c\xdf\xe3\x33\xd9\x20\xa2\x1d\xc4\x2a\xf3\xa2\x35\x02\x83\x60\xe6\x07\x76\x8f\xe2\x61\xa2\xae\xb0\xbc\x64\x74\x70\x8a\x4d\x52\xa5\xcb\xb5\x4a\xb9\x35\x7a\x9a\x8e\xd7\x4b\xb9\x8e\xea\x53\x95\x70\x6e\x63\x1c\xb0\x4a\xe5\xb3\x51\x57\x54\x1c\xc2\xeb\xe2\x3e\x04\x7c\xb7\x2d\x08\x18\x80\xa9\xa9\xa4\xe4\x7a\x99\x2e\xa4\x25\xc6\xd7\xcc\x89\x0e\xb9\xfd\x14\x58\x5e\x3a\x33\x1c\xa4\x59\x20\x7c\xa4\x54\xa2\x3f\x8f\x77\x7b\x8a\x25\x1a\x4a\x5d\x08\x5d\x93\x4f\x5c\xc5\x5a\x40\xb6\x19\x1e\xad\x06\x80\xdc\x8a\xd7\x29\x58\x55\x88\xd6\xd6\xaa\x49\x08\x99\x43\x82\x21\x21\xe8\x2d\xe7\x8b\xc4\x09\xa9\x6c\x1d\x48\x64\x68\x84\x51\x18\xeb\x51\x98\x22\x30\xb3\x65\x52\xba\xc3\xda\x56\x5e\xcc\x45\x7f\x5c\xe4\x5e\xb2\x99\xe5\xb6\x9c\x60\x93\x16\xa5\xe2\xc5\x42\xd4\xc7\x9c\xc5\x71\x5a\x23\xe9\x64\x61\xd3\xc0\xa0\x95\xac\x52\x70\xc7\xc9\x28\x99\x07\xdc\x84\x9a\x13\x45\xd9\x4e\xc5\x15\x96\x41\xe9\x11\x36\x66\x2e\xbb\xc3\x08\xe0\x0c\xb9\xbd\x5f\x4b\x08\xe2\x42\x52\xce\xee\x76\x66\xd1\x8c\xc2\x02\x99\xad\xc5\x70\xd4\xb8\xf8\x8a\x9c\xca\x0b\x8a\xdd\xb0\xf3\x84\x63\x8b\xe1\x7c\xea\xfa\xa5\x24\xf9\xd9\x49\xe2\x89\xd9\x04\x5b\xec\x15\x58\x50\x17\x26\x63\x56\xf5\x29\x69\x4d\xd2\x92\x74\xbd\x12\xa7\x1d\x1a\xc2\x0d\x3e\x75\x56\xbe\xa6\x89\x2b\x8a\xc2\xc7\x9e\xbc\x19\x26\xf3\xc9\x78\xaa\x26\x87\x03\x74\x00\x0c\xad\x48\x0d\x27\xab\x40\xb5\x0c\x97\x00\xa1\xcc\xc9\xbe\xcf\x4d\x0f\x13\xc8\x81\xc1\x5e\x25\x69\xdf\x22\xfc\x04\xd6\x7c\x0b\x2b\xab\xec\x28\x9c\x70\xa5\x3c\x74\x0b\x42\xdc\x4b\x8d\xa7\xa8\xe1\x26\x58\x4a\x4c\xa3\x84\x08\x99\xf0\xdb\x80\x46\x09\x2d\x81\x85\x32\x5f\xca\x48\xee\x14\xa2\x61\xeb\x11\xb5\x87\x91\x5d\xda\xf9\xc8\x0a\xc9\xe2\xe8\x10\x94\x10\x6e\x4f\x86\x6d\xe6\x01\x64\x21\x90\x75\xc1\x15\x41\xb2\x43\x0b\xbe\x73\xec\x99\x13\x23\x7a\x82\xe9\xc8\xc1\xca\xc0\x61\xd9\x18\xe8\x08\xa8\xb3\x9c\x76\x53\x80\x72\x7e\x2d\xe2\x11\xb3\x20\x67\xa3\xad\xb9\x58\x85\x21\x6f\x72\xfb\x8a\xe6\xa6\x18\xe1\xfb\x6b\xc1\xce\x7b\x0d\x6a\x31\x1a\xad\xda\x30\x8d\x57\xbc\xd4\xce\xba\x69\x34\x01\x5b\x42\xd7\x08\x55\x89\x8a\x78\x5a\x1d\xa1\xb9\xee\x52\x1c\x19\x47\x65\x1e\x30\xe5\x71\x01\x59\xb6\x23\x2c\xd2\xa1\xbf\xc0\x0c\x84\xe2\xc8\x42\xaa\xe5\xcd\x51\xcd\x02\x7d\x49\xa3\x45\xda\xe1\x43\xf9\xe0\xb8\xab\x65\x65\x94\xca\x9c\x26\xb6\x92\x9f\x6e\xdd\x68\xaf\x19\x82\x6e\xad\xfd\xf5\x41\x49\xf1\x1d\x0b\x08\x29\x33\x08\x67\x49\xa3\x5d\xc5\xae\xd2\x6c\x31\x59\x82\x1d\x0b\x96\xac\x3a\x75\x57\x1d\x8d\x94\xad\xe8\x96\xdc\xe2\x70\x2c\xe7\xc5\x26\x73\xe8\xb9\x62\x6e\x98\x76\x3c\xd9\xe9\xdd\xe8\x34\x41\x67\xde\xc4\x6c\x70\x40\xed\xeb\x64\x8b\x02\x3e\x5b\x1f\xd0\x96\xac\x8a\xc6\x0d\x10\x4d\x56\xba\x09\x6e\x26\x8b\xdc\xe2\x66\x6c\x58\xb1\x7b\x8d\x24\x6d\x44\xb0\xc0\x52\x98\x67\x9b\xe9\x34\xd6\x33\x28\x27\x93\x38\x20\x80\x6a\x8a\x09\xd8\xd3\x93\x31\x6d\xe3\x64\xb6\x3c\x79\x05\x65\xd6\xba\xc5\x2a\x9b\x26\x3c\xa0\x2b\x3b\x9d\x16\xf0\x69\x19\x39\x22\x08\x0f\xc7\x23\x94\x37\x0c\xb3\x4e\x72\xf9\xb0\x8d\xc7\x61\x69\x1f\x32\xc3\xa8\xec\x7d\xc9\xef\x08\x24\x0f\x37\x0d\x49\x87\x6e\x70\x62\xf3\x31\xbc\x62\xf3\xda\x4d\x77\xe5\xd4\xa7\x12\x7c\x8b\x4c\xda\x0d\xd4\x6e\x88\x94\x5e\xe3\xd8\xfe\x88\x4a\xfb\x6c\x82\xc1\x28\xd2\x42\x5e\xe7\xe0\x13\xe6\x34\x16\x97\x30\x27\x6d\x2c\xc8\x6a\x89\x23\x47\x8f\x3d\x8f\xcc\x8e\xdb\x14\x61\x36\xdd\x7e\x73\xa8\xf0\xba\xa0\x4b\x23\x9e\x97\x2b\x79\xba\x64\xd8\x15\xa2\xac\x60\xd7\xeb\xf0\xf2\x08\xcf\xe6\x53\xab\x16\xa6\xcd\x01\xad\x85\xb6\x8a\x94\x12\xc2\x71\x67\x59\x4e\x3c\xac\x1a\x0f\x97\xf4\x66\xd3\x18\x9c\xa1\x9f\xbc\x61\x06\xed\xa0\x34\xdd\x94\xda\xd0\x8a\x8b\x26\x64\x67\xae\xb0\x5f\xe4\x90\x66\x19\x41\xa6\x2c\x4f\x30\xbf\x1d\xad\x8a\xd5\x3e\x3e\xed\x40\x47\x85\xcd\x0e\x9d\x1e\x7d\x0a\x07\x06\x04\x6a\x75\xe4\x1e\x46\x76\x8d\x31\xb5\x0a\x73\x08\x47\x8c\x09\x6c\x2b\x4e\x16\x93\xa6\x5c\x63\x1c\xaf\x12\xfb\xe3\x16\x8d\x4b\xc4\xdf\x62\xa6\xcf\x85\xa7\x04\x09\x42\x78\xc9\x25\x04\x9c\x8f\xc4\x3c\x44\x66\x52\x01\x35\x1e\x71\xa8\x21\x32\x0e\x59\xb3\x6a\xe1\xa2\x26\xf3\xf9\xda\xaa\x31\x47\xa2\x60\xd5\xf1\x6a\x64\x1a\x66\x7a\xc8\x04\xce\x66\x88\x16\xac\x76\x42\x64\x7a\xa3\xb9\x8d\x60\x2c\x8c\x09\x01\x63\xe8\xb8\xaa\xb0\x1d\x9b\x1e\x13\x46\x91\xc5\x7a\x7a\x44\x30\x1b\xd0\x0a\xb7\xd7\x4e\xe4\x88\x03\x15\x3f\x77\x7d\xb8\x9c\x48\xfb\x45\xb2\x65\x4d\x62\x63\xa0\x33\xcd\xa8\xc6\x35\x63\x10\x43\xcc\x10\x37\x56\xc5\x34\x05\xd7\x88\x4b\x80\xb9\xc7\xad\x33\x6f\x6d\xc0\x98\xf2\x76\xb6\xa0\x47\x32\x60\xb8\xc9\x32\x9a\x39\xbe\x0b\x4e\x92\xb7\x40\x49\x26\x56\xa7\x9b\x55\xb1\xa5\xf4\xcc\xd2\x48\x3c\xe6\xbc\xd6\xe0\xf8\x06\x59\xcd\xb8\x86\x52\x1d\xc2\x68\x3b\x43\xd2\x66\xb2\xef\x1f\xb7\x61\x7d\x5c\x4b\x7b\x73\x96\x96\x2b\xa2\x4d\x16\x24\x52\x6d\x1d\x68\x3e\x6c\x40\xce\xaf\x4f\xac\xa8\x49\xdb\xd6\xd9\x37\x26\x01\x81\x85\x4f\x68\xe4\x72\x0a\xad\x35\x33\xb7\x11\x19\xc8\xba\x46\xd5\x88\xc7\x42\x27\x27\xc9\x47\x84\x54\x9d\xe6\x86\x9a\x20\x05\x4e\x84\xfe\xb8\x31\x13\xfe\x60\x36\xcb\xa5\xb6\xe3\xec\x4d\x59\xa2\xd8\x84\xa2\x39\xc5\x10\x4d\x46\x97\x39\x3a\x4d\xa9\x46\x9a\x13\x4d\x36\x9f\xed\x76\xc3\xd9\x0a\xaa\x36\xda\x08\x25\xac\xd0\xa8\x48\x65\xa1\x8e\xa9\x69\x23\x22\x9d\xd2\x8e\x77\xbc\x01\x4b\xdd\x6c\x36\xdc\xbb\x52\x97\x63\x9b\x1c\xb5\x67\xa1\x21\xc4\x5a\x6c\x9f\x64\x46\x99\xce\x56\xe6\x4a\xcb\xa7\xcd\x82\x17\x4f\x25\x5e\x71\xd5\xb2\x36\xd9\x11\xb4\x3b\x1c\xdb\xd9\xc4\x64\x39\x59\x46\x36\xce\x4e\xaf\x94\x24\xd2\xfd\xf4\x30\x81\xa6\x6e\xad\x65\xc3\xc2\x9e\x4b\xfb\x21\x88\x09\x44\x4b\x81\x94\xcc\xcc\xb1\x84\x8d\x36\xfc\x48\x04\x65\x14\x4d\xe3\x6a\xba\x15\xa5\x44\xec\xa4\x86\xa5\xcd\xb3\xdc\x4e\xae\x94\xee\x4d\x65\x9c\x91\x63\x02\x50\xc2\xa8\xa1\x66\xde\xd4\x45\x29\x63\x3c\x92\x7c\xcc\x15\x85\xb9\x5e\xd7\xba\xee\x90\x47\x26\x72\x56\x00\x5e\x35\xa4\x92\x9a\x12\x05\xf8\x0c\x60\xc0\x5d\x2a\xa7\xa1\x9d\xce\x01\x41\x82\x89\x34\x3b\xb2\x7d\x9d\x5b\xb4\x53\xbc\x74\x7d\xa2\xde\x26\xa3\xc2\x1c\x71\xa4\x8d\x27\xf0\x54\x8d\x86\x5e\x2a\x6a\x32\x82\x00\xd4\x9f\x4f\x89\xad\x20\x39\x24\x91\xe4\x9d\x0f\x54\x7f\x8f\xe3\xe2\x04\x82\x33\x9b\xdf\x6d\xf2\x64\xa7\x60\xd5\xa8\x3d\x21\x13\xb0\x2e\x75\x26\xd0\x39\x25\x3e\x79\x89\x23\x39\xae\x37\x93\x72\x83\xe5\x7d\x7b\x9d\x8e\x18\xbb\x09\xfc\xc3\x62\x17\x44\x89\xb4\xf7\xd0\x71\x6a\x25\xca\xa9\xdd\xc8\x95\xb7\x4a\x76\x3a\xd6\x1a\x19\x93\x27\x5b\x1f\x5d\x99\x95\xb8\x1e\x16\xc5\x18\xc2\x3c\x6f\x33\xca\x25\xfb\x40\xfb\xa7\x35\xaf\x06\x6c\xc4\xcf\xf2\x16\x9d\x4d\x94\x8d\xeb\xa6\x65\x18\xae\xb7\x64\x53\x2f\x8e\x23\x3d\xe4\x67\xf6\x06\xde\x9a\x2a\x11\xd3\x93\xd4\x18\x49\xa6\x87\xba\xe0\x40\x81\x09\x3a\xe9\xe2\x19\x5e\x8e\x38\x60\xa9\x5c\x26\x1c\x67\x0c\x97\xb0\x15\x5a\x2c\x27\x39\x55\x4e\x96\x38\x1c\x8f\xd6\x06\x27\x79\xa5\xd2\xb0\x53\x6d\x5b\xa2\x07\xbf\x39\x6e\xc2\x71\x2d\x14\xb3\x15\x01\xd5\xd3\x7a\x9f\x25\xaa\x27\xc4\x59\x6a\xcd\x11\x25\x51\xe2\x31\x70\x56\xac\xa3\x01\x99\x9c\xce\x09\xb8\x9e\xd3\xdb\x91\xb2\xd2\xb2\x00\x1f\xef\xb1\x6d\x40\xb6\x0e\x16\xf8\xd8\x8c\xf0\xd3\x59\xba\x2d\x9b\x55\x6e\x10\xc2\x08\xa3\x0b\x4b\x41\xab\x83\x64\x60\xa3\xa9\x67\xb4\xf8\x06\x6d\x3a\x45\x69\x51\x61\x88\x60\x87\x21\x7a\xa2\x37\xd9\x88\x38\x3a\xc5\x69\x36\xe3\x70\xaf\xa9\xb9\x51\x64\xba\xe5\x7e\xac\x72\x52\x6b\x8c\xb2\x64\x23\x35\x79\xa0\x8e\xeb\x7d\xe6\x07\x22\xd5\x20\x34\x38\x6e\xe8\x63\xa6\xfa\xda\x0e\x08\xc5\xce\xd6\x45\x30\x63\x90\xbd\x3c\x71\x31\x17\x73\x82\x08\x49\xf7\x99\x0c\xcd\xb6\x53\x6c\x19\x0a\x88\xa1\xa5\xac\x97\xba\xd2\xc1\x4d\x17\x2e\xc7\x99\x13\x01\x33\x79\x64\x39\xcd\x73\x2f\x6c\xb7\x9e\x23\x9a\x61\xcb\xe4\xac\xbd\xa4\x38\x28\xd1\x91\x14\xcb\xdd\x78\x6a\xcf\x52\x68\xd9\xf2\xd3\x49\xbd\x3f\x4e\x10\x0c\x71\xa5\xa9\x79\x64\x17\xc3\xa4\x98\x76\xeb\xd2\x24\x62\xab\xb0\x4e\x89\xa6\x0a\xb6\x1e\xcb\xcb\x05\x30\x32\xf8\x98\xb4\x25\xd7\x92\x06\x52\x2d\x3c\xbe\x2b\x27\xe8\x36\x9b\x82\x6d\xa6\xb2\x93\xe1\xa1\xc8\xd4\x6a\xa1\x4e\xeb\xd1\x78\xb2\xea\x4e\xc2\x74\x3c\x9f\x65\x2d\x86\x9e\xf6\xeb\x61\xac\x8f\xe1\x52\x2b\x4c\x26\x48\xe4\xc3\xda\x52\xe7\xae\x9a\x58\x87\xdc\xb0\xe2\x83\x81\x71\x9d\xd3\x46\xd6\xd8\x3b\x6a\x6b\x26\xf7\xb6\xeb\x44\x43\xa1\x6a\x3f\x16\x99\xc9\x58\xaa\xdc\xad\xba\x18\x0f\xfd\x53\x47\x6d\xb4\xd8\x42\x02\x81\x9e\xc9\xb3\x82\x9e\x17\x85\x30\xad\xe9\x85\xe7\x0c\x0d\x07\xda\x3a\x3c\x77\xdc\x29\xcd\x49\x1c\x36\x79\x58\x9c\xd0\x52\x1f\x65\xf9\x51\x39\x98\x15\xe9\xd4\xba\x40\xa8\x02\x6f\xca\x3b\x58\xee\x1c\x66\x83\x90\xca\x12\x51\x9c\xa9\xbb\x4a\xa9\xd1\x81\xb7\x26\x59\x64\x08\x24\x6b\xba\x53\x03\x9d\xc0\x8a\xe2\x88\x33\x1f\x00\xaf\x71\x60\x74\x5b\x2e\x58\x68\x9e\x92\x3b\x68\x93\xc3\xab\x84\x29\x99\x8a\x26\xea\x64\x71\x28\xcb\x69\xa6\x71\x9b\x59\xdc\xe9\x0c\x29\xf3\xb3\x02\x84\x7b\xc5\x98\xa1\x46\xb5\xd7\x5a\xf6\x74\xa8\x0f\xb9\xd0\x2d\xf6\x29\xc4\xd4\x50\x5b\x0a\x27\x7d\xd1\x2d\xba\x53\x1b\xd4\x9b\x34\x52\x97\x8b\xf1\x78\x9d\x9a\x0a\x01\x09\x29\x49\x2d\x4f\x2e\xbb\x82\x5d\xab\xcb\x49\x7d\xb2\x5e\xeb\x35\x98\x77\x6d\xb3\x3f\xc6\xa6\x35\x73\x16\xeb\x04\x77\xb6\xad\xa8\xe7\x14\x7a\x8c\x0e\x72\xd7\x45\x46\x43\xeb\x1c\x39\x99\x6f\xe1\x70\x23\x1f\xbd\x0e\xdb\xa9\x66\xbc\x56\x10\xd3\x5a\xd4\xba\x7e\x8c\x4c\xb6\xc1\x47\x18\xc4\xcf\x85\x19\x2d\xb8\x5a\xe1\x6a\x08\xb5\x45\xb5\xf5\x8c\x94\xc6\x94\x37\x57\x4f\x01\xeb\x55\xeb\x8d\x71\x90\x76\xc7\x0d\x38\x4c\x12\xe4\x68\xce\xda\x23\xb1\x86\xd0\xa9\x72\xe4\xb1\x93\xbf\xc2\x1d\x1b\x13\x9c\x9c\xd7\xf5\x49\x43\x2b\xb0\x01\x64\xe2\x20\xa0\x2c\x4c\x29\x16\x14\x94\x39\xe5\x4d\x87\xb4\x29\x94\x72\x69\x19\x43\xc3\x9f\x64\xc2\x52\xd8\x9f\xe6\x9e\x5f\x6e\x96\x35\x23\xd1\x18\x82\x9a\x4d\x01\xcf\xa7\x8c\x87\xe6\x07\x7c\x77\xe0\x76\x56\x22\x1f\xf7\x5b\x76\x6b\x8d\xc1\xbc\xa3\x96\xc9\xe5\x1f\xda\x6a\x10\x0b\x8d\x74\x6d\xa2\x9d\x5a\x07\x65\x01\x00\x80\xdf\x28\xcc\x9a\x55\x22\x73\xa3\xc4\x52\xb2\x3c\x59\x6b\x06\xb1\x64\x70\x12\x29\x1a\x5d\x68\x00\x5d\x68\x62\x63\x50\x74\x2b\xed\xf5\x46\xda\x83\xd3\x42\x03\x88\xb4\x07\x8d\x64\xab\x11\xe9\x03\x00\x48\x03\x51\x8c\x00\xb1\xe6\x0c\x62\x69\x79\xb5\x45\x95\xdc\x4a\x23\x20\xee\x41\x2b\x9e\x90\x56\x54\x91\x46\x34\xe4\x56\xa4\xb2\x4e\xa2\xb2\xd3\x92\x44\x9a\x25\x95\x35\xe2\x72\x6b\x4f\x89\xf3\xf9\x2c\x50\x75\x43\x52\x84\x11\x69\x72\xdc\xf7\x0f\x4b\x9d\x2c\x75\xec\x0a\x76\xed\xca\x1b\xdc\x0f\x2a\xaf\xad\xe0\x3c\xb6\xc3\x74\x70\x3f\xd0\x6a\xef\xfe\x06\x45\x6f\x40\xed\xdf\xa0\xc8\x70\x72\x83\x8c\xbf\xe0\xe8\x17\x6c\x78\x03\x21\x08\x82\x7c\x1f\x65\x60\xa7\xbe\x17\x67\x3e\x7c\xf4\x8a\x32\xcc\xd2\xf7\x88\x87\x0f\x93\x1f\x69\xfd\x19\x4f\x3d\x1f\xbf\x20\xd3\x5f\x86\xe3\xef\x22\xf0\xc3\x0a\x66\x69\x40\xbd\x6f\xea\x87\xd5\x4d\xe1\x1d\x7f\xb9\xe4\x67\x3b\x43\xdc\xdd\x7b\x0f\x5e\x9b\x67\x45\x55\x3e\xfe\x7e\x6e\xfd\x25\xbb\x8f\xc3\xed\x97\xf0\xdb\xb7\xfb\xd7\x77\xcb\xdd\x17\x77\xbf\x0f\xea\xd2\xbb\x29\xab\x22\x74\xaa\xc1\xd7\xeb\x3d\x69\xae\xb7\x0b\x53\xef\xf9\x2e\xbb\xea\x7e\xf0\xf7\xbf\x7b\xa5\x78\xce\x30\x36\xb8\xff\xfd\x68\xc7\xb5\xf7\xe5\x27\xe4\xdb\xdd\x7d\xf5\x40\xb2\x40\x51\x69\x4d\x7d\xfc\xfd\xdb\x7d\xf5\x70\xbd\x9c\xfd\xef\xd7\xd2\xc7\x97\xfa\x07\xe2\x15\xf0\xaf\xc8\x6f\x8f\x9f\xdf\x35\xf6\xdf\xd5\xf9\xaa\xb1\xff\xde\x9d\x6f\x1a\xfb\xef\xe2\x7c\xd1\xd8\x7f\xa7\x7f\x70\xcf\xd8\x7f\x1f\xff\x5f\x76\xcd\xd8\x2b\x39\x3c\x80\xc7\x97\x1b\xc3\x5e\x97\x13\xd7\x5b\x3e\x5f\x24\x86\xff\xf6\xf8\xbd\xeb\xbc\xc2\xfd\x3f\x79\x9d\xd7\x6b\x8a\xe4\xab\xb1\xfa\x75\xd4\x13\xfb\x97\x5f\x83\xf3\x9a\x9c\xf2\xbe\x37\xff\x8a\x1b\xb5\x5e\x13\x90\x1f\xff\x9d\x97\x62\xbd\xa6\x24\x3c\xfe\xeb\x2e\xb8\x7a\x8d\xd7\xfc\x30\xe0\xff\xca\xbb\xaa\x5e\x53\xa2\x5f\x8f\xfd\xf8\xb7\xc7\x7f\xe7\xcd\x52\xaf\xe9\x5a\xdf\xef\xe1\x5f\xbe\x24\xea\x35\x5e\xf6\x75\x7f\x26\xcf\xfd\xf9\xb7\xdc\xed\xf4\x7a\x8e\x9e\xaf\x71\xfa\x9f\xbc\xa8\xe9\xa3\x39\x87\xff\xe3\x3f\xfe\xd7\xcd\x7f\xdc\x70\x4f\x39\xad\xcb\x9b\x2a\xf0\x6e\xec\xaa\xb2\x9d\xe0\x26\xf1\xaa\x20\x73\xef\x6f\xaa\xc0\xae\xae\x65\xde\x05\xe0\xe9\xb2\xe5\x9b\x2a\xbb\xb1\x6f\xd6\xde\x56\xcd\x9c\xc8\xab\xfa\x85\xc1\xb3\x93\x87\x1e\xe5\xff\xef\x92\x61\xf2\xa6\xbd\x5c\x05\xe5\xba\x59\x5a\xc2\x17\x24\xd7\x9f\x33\x54\x1c\x3a\x5e\x5a\x7a\x37\x22\xa7\xfd\xaf\x9b\xff\x80\xff\xd7\x4f\xcf\x1c\x9e\x33\x8c\x3f\xad\x4b\xd5\x6d\x71\x8b\xdc\xdd\x7d\xbb\x7d\x93\x65\xff\xf5\x5a\x74\xb9\xfb\xf7\xf7\x6f\xcf\x77\xc8\x3e\x5c\xa8\x3c\xbe\xed\xf2\x7d\x78\xf7\x7b\xf1\x78\xb9\x99\xf3\xf1\xf1\xb1\xf8\xc7\x3f\x8a\x7b\xef\xa1\x3c\xb3\xff\x58\xdd\x7b\x0f\x7f\xdf\xc5\x75\x19\x10\xf5\x6e\xe7\x15\xaf\x2f\x33\xf5\x1e\x9a\x22\xac\xbc\x5b\xef\xe1\xef\x17\xc4\x97\x2e\x5f\x00\xfb\x25\xf4\x93\xe2\x8b\x55\xbe\x64\xac\x0a\x13\x2f\xab\xab\xcf\x9b\xf7\x95\xdf\xc3\x71\xae\x3b\x23\xfa\xd6\x03\xe4\x75\x19\x68\xd9\x7b\xf6\xce\xb2\xfa\xa4\xf1\xdf\x3e\x2d\x85\x1e\xab\x2f\x9f\x33\xf2\x58\xdd\x97\x5e\xf5\x8a\xd7\x57\xc2\xb8\x1f\xf6\x03\xd0\xf3\xe0\x7b\x95\xe8\x95\xa5\xed\x7b\x6f\x38\x08\xff\xf6\x8e\xbf\xdb\xea\xc1\xb5\x2b\xfb\xee\xcb\x93\xec\xae\xef\x67\x24\xa5\x97\xba\xe7\x2b\xb9\xdf\xdc\xd0\x7a\xce\x37\x71\xbe\x75\xb8\xea\xbd\x19\xfa\xe8\xa5\xd5\x22\x2c\x2b\x2f\xf5\x8a\xdb\x41\x72\xa1\x3a\x78\xcb\xc4\xdd\x7d\xf1\xf3\xcf\xde\x43\x96\xde\x0e\x7a\xf4\x83\xd7\xd8\xef\x3e\xc5\xe3\xc4\x59\x79\xc6\xe2\x7a\xbd\x04\x1e\xb6\x61\x4f\xf4\xbe\xba\xfb\x1c\xdc\x2b\x8a\xac\xf8\x14\xbc\x67\xf3\x52\xf8\x21\x37\x7e\xb6\xdb\x7d\xca\xcf\x6d\xf5\xa2\x7d\xd5\xdf\x9e\x54\xef\x4b\x75\xf7\xf3\xcf\xd5\x43\xe1\x25\xd9\xd1\xfb\xc1\x5e\x5f\x6f\xd0\x7e\x42\xd1\x4b\xf5\xd5\xd5\xc0\x1f\x94\xff\xa2\xfa\x6f\x27\xc7\x25\x07\xf3\xa5\xee\x6d\xfb\x0f\xbd\x7a\xd5\xf6\x52\x77\x6d\xdb\xcb\xe0\xdb\xdd\x77\x2d\x0b\x13\x56\x2f\xd6\xc2\x39\x27\x53\x29\x6f\xec\xd4\xbd\x29\xb2\xa6\xec\xcd\x47\x6f\x4e\xdc\x30\xf1\xd2\xde\x47\x2e\x6f\xb2\xdd\x4d\x58\x95\x37\x94\x24\xde\x78\x17\x93\xd4\x5b\x93\x1e\xd3\xff\xfe\xdf\x37\x20\xcf\x8b\xec\x6a\x39\x7e\xb9\x51\xb2\xa6\xfc\x72\xa3\x15\x75\xef\xbb\x7b\x57\x44\xc7\xb0\xc7\xd3\xa3\x79\x63\xa7\x72\xbb\xf0\xd2\xea\x09\xe5\x4d\xe0\x85\x7e\x50\xdd\x6c\x4f\x6f\xa1\x8a\xac\xb9\x56\x3d\x11\xfd\xe5\xe6\x92\x00\xe6\x9f\x25\x74\xce\x73\xf8\x81\x8e\xf3\x74\x63\x5f\x4f\xe2\x02\x72\x7b\xce\x89\x7d\xe3\x86\x65\x1e\xdb\xa7\x2f\x37\x61\x1a\x87\x69\x6f\x89\x3f\x72\xd8\x4b\xaf\x7a\x62\xa6\x17\xd6\x05\x43\x13\x56\xc1\x19\xd8\xa9\x8b\x9e\x87\x1e\x77\x5a\x27\x5b\xaf\xe8\x99\xbc\x8a\xfe\xee\xfb\xb6\x79\x17\x56\xfd\xbf\xff\x63\xab\xfc\xd1\x10\xe7\x45\x96\x67\xa5\x37\xf7\xb2\xc4\xab\x8a\xd3\x87\xab\xe4\xbd\x87\xa7\xa1\xbe\x48\x8f\xbe\xbc\x3d\x5d\x27\x7f\x4e\x3e\x71\xc6\xda\xeb\xe9\x7d\x76\x5f\x3e\x65\x7a\xf6\xbd\x8a\xcc\x92\xbc\xae\x3c\x57\xad\x4e\xe7\xe4\xf5\x9f\x63\xba\x4f\x5f\x92\xc3\x9f\x6f\x68\x7e\x0a\x56\x8c\x3e\x36\xb9\x1d\x5c\x06\x7d\x70\x77\x77\x6f\x3f\x8a\x76\x15\x3c\x24\x76\x7b\x8b\xdc\xff\x61\x9b\xb3\xd4\x07\x77\x77\xbf\x0c\x27\x77\xf7\xf1\x9f\xb3\x74\x77\x1f\x3c\xa6\xbf\xdc\x3e\xe3\x8c\x3f\xc1\x99\xdb\xae\x1b\xa6\xfe\x2f\x55\x96\x0f\xee\xee\xa0\x1f\x82\xdd\x66\x55\x95\x25\x83\xbb\xbb\xbb\x7b\xe7\xd1\xfe\x41\x02\xc5\xb5\xbf\x3f\x46\x22\xf6\x76\xd5\x99\x40\xfd\x78\xeb\x3d\x14\x59\x43\x66\x69\x65\x87\xa9\xd7\xaf\x9d\xaf\x5f\x1f\x76\x61\x51\x3e\x49\x9d\x0c\xc2\xd8\xbd\xbb\x77\x1f\xeb\x87\x30\x4d\xbd\x82\xd5\xc4\xc5\x93\x52\xd4\x0f\xe7\xcc\x26\x0f\x57\x7d\x7f\x1c\x5c\xf4\x7d\x70\xff\x0a\xf6\x71\xb0\x1e\xdc\x87\x8f\xf5\x39\x45\x56\x56\xa7\x3d\x2b\x64\x1c\x7a\x69\xa5\x78\x4e\x75\x7b\x77\x49\x22\x7a\xff\x01\xd5\xe0\xbe\xfa\x83\x46\x97\xa1\x7e\x43\xc7\xbd\x2f\x5e\xd4\x23\x80\xab\xbb\xfb\xec\xe5\xdd\x81\xc3\xbb\xfb\xdf\x9d\x2c\x2e\xbf\x64\xf7\xbd\xd1\xfa\x52\x7c\xeb\xcd\xfe\x2e\xac\x3e\xa4\x5a\x29\x1e\x3f\x28\xfb\xad\x77\xce\x42\x7e\xbe\x1d\x3d\xec\xbc\xdb\xe2\xa1\x47\x75\x5f\xf4\x62\x2b\xdf\xd9\xdc\xef\xce\x93\x57\xb6\xf7\x3d\xfa\xde\x08\xbf\x43\xf3\x86\xb3\x57\x4d\x77\x61\xf5\x04\xfe\x87\x16\xbb\x8e\xe3\x4b\xa6\xd6\x9b\xb3\x65\xb8\xd9\x65\xc5\xc5\x52\x3c\xec\xcb\xef\x5b\x8f\xe7\x56\xaf\x1e\xff\x0d\xb6\xa4\xca\x7c\x3f\xf6\x7a\x1e\xd5\x33\x89\xcf\x12\x19\x7f\x2d\xde\x2e\xb1\x4f\x36\xc1\x89\xed\xb2\xec\xd7\xd5\x07\xe7\xa2\xb0\xe5\xed\xe0\x85\xd9\xc1\xdd\xdf\x06\x97\xf5\x77\xf0\x65\x60\xbb\xee\xe0\x4b\xf5\xb7\xcb\xef\x53\xf1\xfd\x27\xa8\x7e\x2d\x7e\x7b\x8b\xe4\xed\x58\xbc\xb0\x5b\xbe\x67\xb7\xf7\x76\xde\xf7\xe6\xc7\xd6\x54\x2d\x08\xcb\x6b\x02\xf7\x9b\xbc\xc8\x8e\xa1\xeb\x95\x57\x67\xbd\x3c\x8f\xd6\x65\x71\x0f\x53\xff\xc6\x7e\xe7\xaa\x5f\xdf\xdc\xec\x53\xa7\xfd\xbb\xa3\xfb\xdc\xec\xe5\xe9\xdf\xed\xbd\x3f\x13\x02\xff\x9f\x1b\xff\x3f\xea\xc6\x5f\x0c\x19\xaf\x4a\xcb\x87\xb3\x11\x7c\xf2\xda\xbf\x0e\xca\xca\xcd\xea\x6a\xf0\xf8\x58\x9c\x73\xc5\xdd\x7e\x74\xf8\x8b\x5f\x87\xbf\xbd\xb8\xfb\xe7\xb7\x3f\xf7\xf6\xcf\xa4\xca\x73\xce\x95\x70\x77\xba\xfd\xb5\xa7\x13\xa6\x83\x7b\xef\xa5\x71\xa5\x86\x9d\xf7\x63\x6d\xbd\xea\xef\xbd\xa1\x1d\x5c\x56\xa6\xf2\xde\x3b\x1b\xdc\xdf\xee\xfe\x85\x21\xc5\xa5\xe2\x62\xd0\x07\xaf\x18\xfc\x93\x60\xe3\x59\xa3\xa9\xbf\x16\x75\x7c\xbf\x5d\xdf\xa5\x77\xb5\xff\xb7\xc5\x21\x7f\x30\x8d\xdf\x06\x24\xef\x00\xbf\x1f\x99\x7c\xbf\xc3\x9f\x61\xa3\x7e\x24\x56\xf9\x3f\xda\xd4\xfe\x7a\xc9\x09\x5c\xdc\xa2\x93\xde\x71\x18\xd4\xe9\xa5\xa9\x3b\x78\x7c\xec\x19\xce\x76\x37\xa9\x7d\x0c\x7d\xbb\xca\x8a\xfb\xf2\x31\xfb\xdb\x20\xcd\x5c\x6f\xf0\xe5\xb9\xf0\xa1\x2e\xbd\x02\xf8\x5e\x5a\xdd\xa7\x9f\x55\xe7\xb1\x5d\xed\xb2\x22\xf9\x5a\x3d\x84\x25\x13\x16\xde\x2e\x6b\x1f\x7f\xfa\xe9\xff\x5f\x3e\x84\xa9\xeb\xb5\xd2\xee\x76\x70\x2d\x1d\xf4\x9a\x14\x96\xa2\xca\xd1\xef\x00\xfa\xa2\xc1\xdd\x3f\xfe\xf1\xb6\x54\x2b\x42\xd7\x4b\xab\xa7\x66\xb6\x73\x4e\xc0\x7a\x5d\x1a\x7f\x1d\x88\xb6\x13\xa6\x55\x56\x06\x83\xfb\xfe\x99\x4b\x2b\x2f\xbe\x3c\xae\x56\xe4\xe5\x61\x3c\x15\x06\xbf\xdd\xa7\x17\x04\x5c\x6e\xbb\x8f\x83\x70\x65\xf7\x5d\x7f\x4c\xaf\x65\x41\x96\x7a\x7d\x69\xff\xfb\x52\x2e\xaa\xeb\xb3\xc3\x5c\xbe\x25\x79\x2d\x1c\xdc\xf7\x4f\xc3\xf1\xe5\x17\x43\x2f\xbf\x24\xfd\x42\x6b\x11\xa6\x75\xfb\x98\xbe\xf4\xe5\x5c\x30\xb8\xfb\xaf\x47\xe4\x4f\xc6\xf7\x39\x7b\x74\x78\x99\x22\xcf\xf9\x68\xbd\x87\xdc\xf6\xbd\xcd\x9b\xb0\xe3\x25\x41\xfd\xb5\xf6\x3e\xbc\x3e\x99\x5f\xab\x9f\x7f\xae\x7e\x7a\x7c\x2c\xbd\x78\xf7\xe0\x66\x4e\x7d\x76\x0c\x9e\x1e\xae\x3e\xf0\xd7\xbb\xe2\x97\xc7\xaa\x9f\x84\xa5\x57\x2d\xbc\x5d\x75\x1f\xbe\xbc\x6b\x59\x7e\x5f\x3d\x0e\x2e\x2f\xab\x73\xc0\x32\x08\xd3\x9b\xea\x6f\x4f\x00\x97\xb2\x2f\xef\xa2\x99\xeb\x1a\xf9\x6b\x71\x1f\xfe\xf6\x92\x0b\x3b\xbb\x2e\x8c\xd9\x7d\x79\x9f\xde\x5d\x13\xee\x5e\xba\xf8\xb4\xa8\xda\xbf\x22\xbf\x5d\xc2\x1b\xc7\x0b\xe3\xdb\xdb\xfe\x1d\xba\x4d\xff\x56\x5c\x3c\x69\x18\xfd\x82\xdc\xdd\xc1\xd7\xb7\xbb\x7b\xfb\xd7\xe1\x6b\xf0\xfe\x15\x2e\xae\xfe\x73\x5f\xfb\x84\x2c\x09\xd3\xdb\xe7\xa0\xc9\x3e\x27\x15\xbc\xbb\xcf\xa0\xe1\x6b\x0c\xef\x60\x86\x67\x98\xf2\x0c\xf3\xed\x9f\x38\x45\x3a\x47\x59\x59\xe1\x96\x8a\x17\xdb\x55\x78\xf4\xb4\xec\x2a\x9c\xc7\xf0\x75\xf5\x63\x76\x79\x53\xec\x86\x38\x55\xde\xb5\xf0\xbd\x2b\x71\xff\x9c\xec\x38\x7b\x55\x74\x6f\x3f\xa6\x7d\x67\xe2\xc7\xf4\xd7\xe1\x6f\xcf\x32\x84\x1e\x31\xf4\x3e\x3e\xff\xff\x7b\xfb\xc5\xbe\x3f\x7d\x89\xbf\xfd\xab\xcf\xc9\x9e\x4d\x0a\xd6\x5b\x94\x57\xde\xcb\xf3\x68\x7b\xcf\xf9\x8c\x7a\x8f\xf4\xd1\xbb\x0f\x1f\xce\x27\x77\x3d\x0d\xbb\x8e\x2b\xb5\xca\x8a\x7e\x61\x4f\xbd\xe6\x26\x7c\x88\xc3\xed\xc3\xb5\xe4\x41\xf4\x92\xac\x38\xbd\xe4\x69\xbc\x82\x5c\x5a\x3f\x25\xb2\x7c\xa9\xbe\x44\x85\xde\xae\xbc\xbd\x7b\x28\xbd\xea\x76\xd0\xaf\x20\xbf\x78\xa9\x93\xf5\x91\xd5\xe0\x7e\x50\xd8\xcd\xe0\x55\xda\xc7\x07\xd7\x73\xb2\xc2\xae\xae\x49\xcf\x7a\xee\xae\xb5\x61\xf6\x92\x63\xf7\x21\xcc\x1e\x7a\xc7\xe1\x75\x22\xd8\x87\x30\x2d\x2b\x3b\x8e\x05\xef\xb4\xcd\xec\xc2\xbd\xbd\xfb\xf6\x9c\xda\xfd\xc5\xfa\x87\xe9\x2e\xfb\x18\xdd\xfc\x7e\xdd\xde\xb8\x24\x4b\xba\xbe\x5c\xa2\xb5\x4b\xd6\xd9\xac\x29\xbf\xbd\x5d\x46\xb2\xba\xca\xeb\xb7\x21\xdc\x25\xc5\xf5\x6b\x26\x5f\x25\xc4\xed\x59\x3e\xbb\x35\xba\xc6\x4c\xcf\x3b\x94\xaf\xb1\x95\x41\xd6\x7c\x70\xa6\x5e\xa5\xe3\xba\x56\x79\xf7\xd5\x7f\x21\x7f\x7b\x83\xb3\x6f\x29\x1d\xbd\x22\xb6\x4f\xe7\x06\x5f\xfe\xa0\xf6\x92\xbd\xf0\x0d\xe1\xcb\x4a\xfd\x81\xf4\x95\xee\x67\x68\x5e\x33\x74\x4e\xc6\xe9\xbd\xcd\x9d\x75\x31\xc1\x5a\x58\xc5\xde\xc7\xec\x59\x67\x84\x6f\x81\x3e\xca\xe2\xa2\x31\x5e\xe1\xa5\xce\xbb\x0c\x5c\x2f\xb9\x98\xbf\xbe\xce\xd2\xe7\xdd\x3d\xec\xb2\x82\xee\x17\xea\x67\xe8\xe2\x1c\x1f\x7d\xa2\x81\xc5\xbd\xf7\x6b\xf1\xdb\xdd\xb7\x77\x54\xb3\x94\x4b\xdf\x0f\xe8\x55\xef\x1e\xb2\xd4\xd0\x04\xef\x54\x56\x45\x16\xbd\x75\x76\xbd\xdb\xea\xee\xdb\x93\x7e\xbe\x4a\x76\xfc\x11\xe8\x3d\x35\xe5\xec\xfe\x7d\xaf\x77\x2f\x94\x9f\xa6\xd4\x7b\xf8\xb3\xf7\x53\x3d\xe9\xea\x63\x71\x5f\x9d\xb5\xf4\x31\xbc\xf7\xce\x75\xdf\xde\xef\xc7\xda\x4e\x15\x1e\xed\xea\xe3\x20\x7f\xe8\xe0\x4b\xc6\xc7\xb7\x7d\x7a\x53\xfe\x81\xb3\x97\xda\xb3\xd4\xeb\xf4\xe3\x7c\x7c\xa7\x79\x9f\xa5\x7b\x7b\xa3\x8f\x7f\x32\xbd\xdf\xa0\x3b\xbb\xc9\x9f\x2b\xf0\xe7\xac\x7c\xbb\xbd\xfb\x5a\x3d\xb0\x67\x1b\x96\xfd\x7b\x0c\xf0\x77\x2c\xef\xf3\xb4\xae\x8b\xf8\x29\xd1\xe6\xb9\x23\x7d\xa4\xf1\x58\x7d\x66\xb6\x9c\xc2\x7b\x37\x74\x4f\x5e\x86\xd7\xdc\x64\xb7\x4f\xd8\xde\xe1\x7a\xe9\x26\x99\xa5\xa9\x77\x6e\xca\xd8\x4e\x95\x15\xa7\xc7\xf0\xcc\xe3\x77\x57\x87\x67\x1e\xb7\x76\x71\x59\x06\x9e\x03\xfe\x73\xe5\x67\x4c\x66\xf9\xeb\x0d\x8a\xbb\xdf\x7f\x64\x80\x7a\xf4\x97\xaa\xf7\x03\xda\x2b\xde\xc7\xd9\x78\x86\x7f\x3e\xe4\x79\x63\xd9\x4b\xe9\x1d\xfd\xd7\x59\x13\xcf\xed\x0a\xcf\x76\x4f\xe7\xcc\xb9\x8f\x8f\xcf\xdd\x79\x20\xa5\xe5\x92\x26\x35\x6e\x39\xff\xc7\x3f\xfe\x0c\x56\x5a\xd1\xcb\xf7\x33\xf9\x2d\xd9\x37\x8c\x66\xe9\x5b\x99\x9c\x8d\xc1\x67\xb6\xc0\xf1\xc2\xe3\x27\xe6\xf2\x8a\x24\xf9\x24\xcc\x7e\x39\x0d\x7b\x8f\x8d\x7c\x2b\xe8\x77\xb8\xde\x0d\xc3\x0b\x47\xef\x15\xe5\x5f\x3e\x29\xee\xab\x57\x5a\xfe\xeb\xa0\xf1\xb6\x55\x75\x1a\xfc\x76\x5f\x3d\x24\xa5\x7f\x36\xbe\xd7\xe4\xd5\x8f\x03\x64\xf0\xaa\xf4\x71\x30\xbc\xbe\xae\x7a\x2b\x34\x40\xaf\x6f\x17\xbb\xf3\x64\x85\x1e\x07\xd8\xb5\xfc\x8a\x45\xba\x2c\xd0\xcf\xb8\x9e\xde\x9f\x91\x65\xaf\x91\xa9\x6f\x17\xae\x67\x64\xea\xdb\xc5\x68\x80\xbf\x94\x2b\x9e\x73\x11\xd6\xe3\x60\x34\xf8\xb3\x19\x7f\x89\x56\x5f\xbc\xa6\xeb\xb4\x77\x3e\xcc\xcb\x6b\x66\x5d\xbb\xf0\xcf\x46\xfd\xfc\x5c\x57\x81\x96\x45\x5e\xda\x3b\xa7\x17\x23\xf9\x44\xf9\x97\xe1\x8f\x4c\xc4\x73\x52\xd5\x9e\x83\xf3\xe2\x72\x7f\x75\xa4\x3e\xd0\xbe\x5a\x99\xdb\xbb\xfb\x37\x19\x4f\xb3\xab\x8e\xdf\xbe\xc3\x58\x3c\x86\x4f\x96\x79\x97\xdd\xde\x7d\xcd\x3e\xdd\x52\xf9\x1d\x14\xfe\x39\xa2\x29\xbf\x84\x97\x3c\xe2\xe0\xa9\x3b\x7d\xc1\xd3\xf3\xb7\xbb\x8b\xd1\x7c\xe3\x5d\x17\x3d\xf1\x33\xd2\x4f\x06\x1c\x7a\x4f\xe8\xc9\x87\xf3\x9e\xb6\xd9\xef\xee\xbe\x7d\xbd\xb2\xf8\xb4\xde\xde\x96\x77\xf7\xe5\x65\x13\xfd\xe2\xe2\x5d\xf6\xd1\xef\x9f\xc1\xce\x1a\xf7\x66\x9f\xf1\x35\x07\xe7\x5a\xc8\xbb\xfb\x76\x77\xef\x3d\x96\x5e\xd5\x87\xb4\xc5\xd1\x8e\x6f\xdf\x88\xeb\x05\xbe\x57\xd8\xbb\x6f\xf7\x98\x87\xdf\x9d\xb3\x72\x3d\x4f\xf5\x0f\xbb\xd4\x7d\x80\x58\xc6\xa1\xe3\xdd\x0e\xef\xbe\x96\x4d\x58\x39\xc1\xad\xf7\x2b\xf2\xdb\xdd\xef\x8e\x5d\x7a\x37\xaf\x34\xf8\xcb\x13\xaf\xe7\xb7\x5b\xbb\xca\xb6\xb7\xc5\xdd\xdd\xd7\x6d\xe1\xd9\xd1\xd7\x17\xe8\x5e\xbf\xbf\xbc\x2f\x7c\xab\xe6\x4f\xa8\xde\x39\x64\xc5\x47\x64\x6f\xa7\xc1\x97\xcb\xd2\xf1\x6a\x8f\xaf\xb8\xfb\xfa\x82\xeb\x15\xe4\x6d\xf6\x29\xae\xe7\xa9\xf3\xe5\x32\xe6\x6f\x31\x3d\x65\xb4\x8f\x33\xff\x76\x40\xa7\xf6\x36\x0e\x53\xff\xe6\x59\xe9\xbf\xdc\x0c\xa0\x12\x1a\xdc\x94\x7d\x81\x5b\x5e\x3f\x61\x7c\x9a\x11\xe5\xb7\xab\xa4\xcf\x66\xf0\xf5\xc0\x9c\x37\x60\x9f\x47\xcc\x7b\x1e\xf4\x17\xd7\xe8\xf6\xb9\xec\x95\x3f\x7e\x3b\x78\xb1\x89\x37\x67\xa4\xee\xe0\x1e\x79\x43\xf4\xbf\x90\x9f\x7f\xbe\x2d\x1e\x5f\xed\x99\xbe\xd6\x87\xcb\x0e\xc5\xf7\xa6\xda\x95\xe0\xd9\x1b\xea\x67\x5e\xbf\x0c\x0e\x3d\xec\x3f\x5e\xa1\xbf\xbb\x2a\x4f\x3f\x07\xef\x9e\xb7\xb8\xcb\xdb\xbb\xfb\xf7\xbd\x7b\x22\x5f\xf4\xf0\x4f\xab\xea\xb3\x6d\x5f\x7b\x5b\x4d\x33\x1f\xc3\x7f\x57\xb4\x89\xf4\xd1\x66\x1f\x74\x7e\x0d\x1f\xe2\xcc\x76\x81\xeb\x66\xe9\xed\x60\x17\x56\x83\x0f\x93\xfb\x7d\x2c\xfa\xde\xf7\xbd\x86\xa5\xef\xc2\xcc\xfb\xb7\xd1\xd0\x43\xd6\xa4\x5e\x41\x3d\xed\x9d\x5c\x64\x7a\x0d\xe4\x6f\x07\x6e\x78\x7c\x8a\x2c\xaf\x2d\x2e\xc7\x2e\x4b\x3b\xf1\x1e\x07\xe7\xf3\x89\x5f\xb2\x4b\x50\x33\x78\x03\x76\x95\xe2\x23\xea\x61\x4f\xf6\xb6\xb7\x1d\x4f\x3b\x99\x6f\x7c\x98\xcb\xe8\xed\xc2\x7e\xec\xae\x2f\xa5\x53\x64\x71\xac\x65\xc4\xf9\x60\xf5\x5c\xfe\x5a\x9d\xae\xd9\xc1\xaf\xc0\x67\x37\x0d\x1a\xb4\x03\xe8\x6d\xf9\xc5\x2c\x55\xef\x58\x7a\x8a\x35\xae\xc6\xea\x76\xd0\xeb\xc4\xe0\xfe\x0d\x43\x6f\x99\xbd\xbd\xbb\xbf\x9e\x2c\x7f\xdc\x21\x7e\xda\x81\xfe\xc3\xe6\xdf\x7a\xe5\x7b\x45\xb4\x57\x42\xef\xfe\x27\xe4\x5a\xd8\x87\xeb\xae\x57\x5c\xb3\x09\xc6\xe1\xf6\xa1\x8f\x6f\xa9\x4b\xe9\x3f\x1b\x80\x3f\x4b\xe6\x55\x08\xfe\x2c\x95\x3f\x8f\xc3\x5f\xe0\xaf\x9f\x0d\xbd\x62\xf4\xfa\x7b\xeb\xdd\xfd\x70\x04\xfe\x92\x9b\xf9\xeb\x1b\x65\xaa\xbc\xb6\x22\xb3\xb4\xf2\xd2\xea\x49\x53\x7b\xad\x7d\xb0\xf3\xdc\x4b\xdd\xf3\xe9\xf5\x9b\x60\xf9\xee\x83\x92\x15\x3f\xff\xfc\x66\xda\x7e\xa8\xbf\xbb\xbf\xd8\x96\x0f\x15\xdf\xb1\x35\xc5\x85\x83\x4b\x10\x75\xe1\xa0\x78\x26\xff\xed\xb2\xe5\xff\xe3\xd1\xff\x53\x47\x2f\xbb\x87\xcb\xcc\xf5\xae\x69\xaf\x7b\x22\xd7\xad\x8d\x0f\xf4\xde\xf4\xf8\x87\x37\x07\x9e\xf7\x3f\xab\x73\x95\xf7\xc3\x3b\x02\x3f\x18\xc4\x3f\x4f\x98\xcb\x49\xc6\x87\xe8\xfc\xc3\x66\xc0\x27\xe1\xf9\x5b\x44\x1f\x26\xcf\xd5\x27\x3f\xab\x6d\x75\x3d\x9e\xff\xf0\x51\xd4\x77\x83\xf0\x0b\xde\xe7\xb3\x96\x37\x53\xae\x2f\xbd\x92\x7b\x5d\xbe\x8d\xeb\xe2\xff\x34\xa8\x3e\xab\xdf\x9f\x86\xd2\x57\x0b\xf2\xe9\xa9\xce\x93\x1c\x3e\x31\x94\x6f\xb7\xf5\xca\xaa\xc8\x4e\xaf\x22\xef\xcd\xd9\xac\x97\xff\xc3\x91\x77\x4f\xe0\xca\x55\x5b\xd9\x85\x67\xbf\x78\xe2\x49\x9e\x95\x61\x0f\x69\x84\x5e\xf3\xe4\x87\x3f\x1d\x7f\x3f\xf9\xe2\x61\x49\x5e\x00\x53\xff\xf1\xa7\xe1\x53\x99\xea\x5d\x3e\x14\x79\xc1\xf1\x5c\xf9\x0a\xef\xea\xa9\xee\xf7\xb2\xb2\x8b\xea\xcb\x79\xc7\xc4\x4b\xdd\xf3\xc3\xb7\x4f\xc3\xfe\x97\xc6\xe7\x26\x1f\xf7\x6e\x5e\xb3\x83\x7c\x97\xe2\xc3\xa5\xf5\x9b\x8e\x3f\x9c\x85\xf6\x10\x7b\xa9\x5f\x05\x9f\xca\xe0\x8d\x85\x1b\x0c\x3e\x87\x79\xf9\x28\xe2\xfc\xd7\x23\x67\x05\xf7\xde\x7f\xc6\xf0\xaa\x51\x9d\xbb\x6f\xf4\xff\x93\xb5\xff\x8f\xd8\xf0\xce\x41\xef\x85\x95\x0b\xaa\x57\x42\xbf\x2e\xfd\xbd\x67\xf4\xb9\x7d\xac\x3e\x15\x8e\x97\xba\x8f\xd5\xe7\x72\xf9\xf6\x61\x87\xf3\x15\x82\x37\x1b\x14\xd7\x01\xd9\xf5\xca\x12\x76\xaf\xb9\xba\xfd\xe9\x3d\x8e\xc8\x3b\xb9\x7d\x9c\xfb\xee\x43\xb6\xf7\x23\x7a\xdd\x8e\xf8\x4c\xbd\xce\xf0\x28\x3a\x7b\x7c\x7c\x3c\xa3\x23\x33\xd7\xbb\x1e\x3c\xfd\x34\xfc\x1a\xee\x6e\x87\xe3\xd7\x55\xff\xf8\xc7\x70\xf2\xee\x7d\xfa\x79\xd3\xef\x77\x62\xf8\xbc\xe7\x83\xa2\xb3\x9f\xde\x20\xbb\x70\x1e\xd8\xa9\x1b\x7b\x20\x3d\x69\x57\x49\x92\xe7\x3f\x42\xea\x47\xa3\x6f\xfc\xee\x1b\xa3\x0f\x14\xbe\xa7\x12\x4f\x82\xf9\xbe\xe2\x5d\xec\xd2\x8b\xee\x7d\x7f\xa6\x5e\x56\xdb\x2b\x7b\x4f\xe3\x7f\x7b\x77\xff\x1c\x84\x5d\x67\xe6\x1f\xcf\xa3\xf3\x9c\xfd\x2e\x88\x97\xba\xdf\xbe\xfe\x81\x5d\x40\xbe\xa3\x9b\x7d\x3f\xbf\x33\xd6\x9f\x97\x3f\xfe\x34\x3c\x5b\x3b\xef\x7a\x10\xff\xd5\x7b\xac\x5e\xf7\xfa\x6f\x1f\x74\xba\xac\xb7\x97\x78\xf9\xb6\xb8\xf6\xa4\xe8\xd9\xbd\xfb\xf2\xe7\x90\x77\x2f\x9f\x0a\xc4\xd7\x91\x2e\x6e\xbd\x3e\xb8\x40\xee\xbe\x79\x71\xe9\xfd\xfe\x47\xa6\xf0\x6a\x95\x3f\xb3\x3f\x2f\x94\xfe\x44\xe8\x7f\x24\xf0\xbb\xaf\x6f\x8c\xf5\x33\x83\x1f\xb6\xc1\xbf\xa7\xa3\x1f\x76\x4b\x2e\x3b\x25\x9f\x9a\xcc\xaf\xdf\x1d\xbf\x9f\xbc\xd7\xf2\x7f\x09\xec\xdf\x75\xb9\xf0\xf2\xd8\x76\xbc\x7e\x15\x1b\xdc\x7d\x2d\xae\xa6\xa6\x77\xf4\xbc\x8f\x5d\x28\xae\x32\x7e\xd3\x8d\xef\x5a\xbe\x3f\x9b\x44\x9f\xb0\xf7\x56\x72\x4f\x1f\xa8\x1d\x6a\xaf\x38\xa9\x5e\xec\xf5\xe1\xea\xed\xe0\x19\xe0\x17\xa7\x2e\xca\xac\x18\xdc\xf5\x28\x8b\x0b\x8e\xf0\x07\x71\x5c\x42\xae\xde\x33\x1a\xdc\xbd\x1c\x61\x43\xc5\xcb\xf3\xe7\xf6\xff\xf2\x7d\x66\xec\xed\xaa\xc7\xe2\xd5\x51\x38\x34\xc8\xdb\xef\x2c\x4a\x97\x16\x55\x96\x3f\x86\x7f\x0a\x75\x39\x90\x7e\xc6\xcc\x9e\x5f\xff\xb4\x55\x1c\xa6\x1e\xfb\xdd\x96\xd7\xbd\xf5\x4f\xdb\x7f\xe7\xc3\xd2\xaf\x6f\x35\xed\xcf\xfb\xfc\x0e\xf4\x7d\x67\xdf\x55\x9f\xcf\xe4\x1f\xb3\xcb\xef\xf7\xc1\xae\xc2\xc8\xae\x0f\xdf\x07\x7c\xd5\xff\x37\xc0\xdf\xbc\x7f\xfc\xe3\x3b\xb1\xc9\xd3\xb7\x35\xdf\x5f\xb6\xcf\x0b\x25\xf2\x7e\xce\x7e\x6a\xb4\x3f\x71\xa0\x3f\x4a\x6e\xf0\x7d\x51\x0d\x06\xaf\xb6\xbc\x9f\x39\x61\xbd\x38\xf7\x8a\x7f\xdf\x0e\x09\x7a\xd9\x21\xc1\xdf\xed\xb0\x7e\x72\x2c\xff\xf7\x67\xc7\xd3\xfb\xcc\x31\xb4\x5d\x97\x0c\xec\xe2\x5d\xa4\x1a\xee\x6e\xbd\xff\x7a\x1c\xdc\x0c\x9e\xe6\x76\x1f\x95\x7c\x7d\x8b\xef\xc1\x09\xec\xa2\xf4\xaa\x6b\xfc\xf6\xa1\xfc\x57\xef\xb7\x9f\x7f\xbe\xbd\xd8\xbf\x4f\x6b\xef\x5e\x1b\xf3\x17\x80\x13\xf4\xbe\x60\x6b\x97\x5e\x6f\x25\x7e\x2a\x3e\xd0\x6a\x9f\x3e\x92\xe9\x57\xae\xdb\x77\x95\xbd\x6a\x9d\x3f\x98\xbf\x0d\xef\x7e\x7d\xdf\xf0\x97\xe1\x6f\x4f\xf1\xf0\x8f\xb7\xf8\x15\xfd\xed\x6f\x7f\xb5\xc9\xf0\x37\xe8\xd1\xfb\xf2\x97\x5a\xa1\x7f\x99\x35\xf4\x4a\xe7\xea\xb2\xbc\x54\x5d\xe6\x88\xd2\xaf\x4d\xef\x31\x9e\xee\xee\xee\x9e\xed\xf9\x2b\x64\x50\xf1\xcb\xf0\xbf\x3e\x0c\x5b\x16\x97\x77\x1f\x81\x9b\xc2\xce\xed\xa2\xb7\x42\x62\xef\xfd\xbd\x47\xf5\x88\xdc\x43\x1f\x86\xf3\xbf\xde\x15\x5c\xb6\xb9\x2e\x9b\x5c\x7f\xfb\xc0\xe4\x2f\xbf\xbc\xef\xd2\x05\xbe\x9f\xe3\x77\xdf\x17\xeb\x87\xbe\x3e\x84\xe5\xba\xb0\xf3\xdc\x73\x1f\x7f\x42\xbe\xf6\x8e\xc6\x4d\xef\xf9\x3e\x3e\x3e\x16\x57\x1d\xea\x65\xf1\x83\xda\xf8\x9e\xa5\x30\x2d\xbd\xa2\x3a\x8b\xe0\xe9\x43\xad\xec\x11\xf9\x9a\xfd\x67\xf1\x15\x82\xb2\xbb\xf3\xa7\x8d\x3f\xca\xe9\xa7\x04\xef\x1e\xf2\x2c\xbf\xbd\xfb\xb5\xd7\x8c\xbf\xa0\x18\xfd\xa8\x9d\xb5\x09\xfd\x23\x0e\xbe\xdb\xee\xd7\xbf\xaa\x88\xd7\x76\x8f\x1f\xca\xeb\x02\x54\x55\x71\x3f\xb8\x19\xdc\x0f\x7f\xfb\xa0\xa4\xaf\x51\x3e\x94\xf9\xf9\xf4\xe2\xbd\x2a\xdd\x23\xf7\x7f\x82\xf5\xbd\x7d\xfa\xc3\x19\xf3\x7d\x1e\xbd\xfb\xe2\xb7\xf7\x0c\xb6\x10\xf4\x97\x26\xd6\xfd\x59\xaf\xfe\xe2\x24\xfe\x03\xb1\x0d\xee\x91\xcf\x78\x7a\xbf\xc0\x6d\xbd\x38\xfe\xdc\x01\x7d\x2f\x9b\x63\x58\xd6\x76\x4c\x78\x71\xfc\x91\xc9\x27\xaf\xeb\xb2\xc6\x6d\xb3\xc2\xf5\x0a\x32\x8b\xb3\xe2\x71\xd0\x04\x61\xe5\x0d\xbe\x13\x77\x3c\xaf\x2e\x3f\x84\x6a\xf0\xed\x7e\x88\x7c\xd0\x84\x3c\xcb\xa5\xf4\xc2\xd6\xbb\x9a\x5d\xe6\xd4\xe5\xed\xfb\x7d\xc7\x5e\xa0\x8c\xe7\x7d\x0c\x9f\x5f\xeb\x64\x7a\xf4\x8a\x8a\xce\x3e\xe9\x6a\xfb\x88\xdc\xfd\x45\x0b\xf5\x11\xc9\xf7\x4d\xd4\xdd\x87\xfe\xb5\x9f\x1a\xd6\x8f\xcb\xda\x2f\xbf\xbc\x73\x5d\xec\xa2\x08\x6d\xdf\x53\xce\x32\xfe\x83\xde\xb6\x8f\xc8\x3b\x9d\xb0\x9d\xa8\xcc\x6d\xe7\xe3\x4e\xe1\x6b\xae\x90\x3f\x67\xa1\xb2\xb7\x7f\x48\xf7\x5d\x41\xea\xb5\x95\x5a\xf5\x46\xeb\xfd\xf6\x78\xb8\xab\xa4\xfa\xe3\x0e\xd4\x2b\xe9\x79\x95\xbf\xf0\x8e\x5e\x7c\xfb\x3e\xda\x3f\x37\xe6\xfe\xa8\xff\x2f\x6d\xdf\x87\x3a\x17\x1b\xdd\x3b\x3b\x9f\x04\x37\x97\x3f\xe8\x3b\x7f\x65\x7b\x5b\x3d\x9e\xcf\x4b\xff\x73\xd8\x0f\xf5\xe3\xf0\xee\xbe\xf8\xc1\x45\xe1\xc3\xe2\xd1\xde\x67\x1f\xe6\xb4\x57\xd8\xa5\xd7\xcf\xea\xdb\xbb\xab\xe1\xfa\x5a\xfd\xf2\xcb\xcf\x3f\x87\xff\xf9\x89\x62\x7c\x7d\xbf\xa2\xbe\x18\x90\xe2\xd9\x52\x86\x10\x74\x8f\xdc\x67\x7f\x60\x55\x8b\xeb\xf2\xf1\x4e\xa7\xce\x01\x98\x9e\x7f\x12\xea\xf5\x02\xf8\x5a\xbd\x48\xe0\x83\xc6\x3f\xed\x6a\xbe\x2a\xfb\x4f\xe4\x93\xa9\xf1\xf8\x61\xd7\xeb\x4c\x94\x7a\xbf\x69\xf5\x63\x64\xa1\x4f\xc8\x7e\x98\x50\x7d\x58\xf8\x19\x27\x9f\x80\xfd\xf2\x91\xc6\x3f\x3d\x41\xcf\xfd\x62\xb2\xa2\xb1\x0b\xf7\xaf\x77\xad\xfd\xa4\x6b\xdf\x63\xe5\xa3\x11\xfb\x6c\x15\x7e\x3f\x75\x2e\x0c\x12\xb6\x13\xfd\x93\x1c\xfe\xb0\x60\x3e\xb4\xfc\x44\x5b\xda\xcf\xb4\xa5\xfd\x8e\xb6\x2c\xbd\xb6\x5a\x84\xe9\x67\x7b\xbd\xff\x37\x68\xcc\x7b\x8b\x7b\x61\x7a\x55\x78\x8e\xd7\xc7\xe6\xff\x24\xe7\x7f\x65\x8a\xfd\x20\x4b\xbd\xed\x03\xdb\x32\x8b\xeb\x4f\xf7\xcd\xff\x4c\x01\x1e\xab\xff\x87\xbd\x6f\xd1\x6e\x1b\x47\x12\xfd\x15\x99\xdb\xad\x90\x21\x24\xf3\x21\x51\x2f\xc3\xde\xc4\x71\x4f\x67\x27\x8f\xbe\x71\xba\x7b\xfa\xca\x1a\x0f\x2d\xc1\x12\x27\x32\xa9\x26\xa1\x38\x9e\x48\xf3\xed\xf7\xa0\x00\x52\x24\x01\x52\x72\xd2\xd9\x99\xbd\x67\x73\x4e\x64\x10\xac\x2a\xe2\x51\x00\x0a\x85\x42\x55\xcb\x56\xd6\xb4\x52\xef\x8a\xe2\x11\x27\xdb\xb2\x51\x8c\x53\x55\xf8\x29\x76\xce\xc8\xd8\x9e\xb4\xec\xa1\x85\xe8\x89\x75\x46\xb1\x35\xa4\x95\xbd\x52\xd5\x0d\xf1\x89\x75\x16\x63\x6b\x18\x57\x0d\x13\x69\xda\x16\xe3\x42\xae\x58\x2c\xb5\x34\xa6\x35\xc3\xfb\x7d\x7e\x25\x24\xc6\xe7\x54\xe4\xe7\x75\xdd\x6c\x6c\x36\xa3\x4b\x53\xf7\xc1\x2b\x24\xac\x10\x2f\xc3\x17\xe2\x1a\xb1\xd4\xaa\x0a\xab\x1e\x6b\xc8\xca\xa0\x5a\x69\xde\x05\xf3\x85\xb4\xc7\xf8\x24\xd5\xd7\x40\x52\x3b\x3f\x98\xf6\x88\x96\x17\x25\xd6\xf8\x23\x6a\x9a\xe5\xca\xc1\xb7\x18\xa7\xeb\xb4\x60\xa7\x63\x57\x16\xec\x15\xb9\xfd\xc2\x72\x29\x5b\xb7\xaa\x00\x0e\x2f\x80\x8a\x89\x1e\x45\xc7\x1d\xe6\x94\x9c\xe5\x35\x96\xf3\x75\x4b\xf5\x8d\xf8\x54\x31\x66\x39\x16\x8d\x83\xbb\x4b\xea\xc7\x60\x65\xa3\x12\x28\x76\x1e\x00\x54\x6f\x5b\x31\x92\x47\xfe\xc3\x2c\x48\x56\xd5\x78\xec\x2d\xe0\x95\x77\x0e\x82\xe7\xa4\xb9\x4a\xc5\x6a\x5f\xc3\x66\x45\xde\xf8\x0a\xbe\x28\xf6\x71\x75\x27\x96\xf1\xb6\x2a\xa1\x90\x81\x56\x08\x85\x7f\xb4\x48\xc8\x67\xaf\x32\xab\xe4\x37\x18\x55\x38\xca\x0f\xb4\x02\x53\x3d\xdb\xe4\x19\xb3\x6a\xef\x7f\xe7\x7f\x7a\x05\x00\xfb\x39\x54\xb1\x40\xc1\xe7\xa5\xc5\x9e\xb3\x58\x0b\xc5\xad\x16\x0a\x5a\xad\x0a\xa1\x54\x48\xae\x31\xb2\xca\xef\x6f\x96\x7e\xf8\x01\xba\xee\xc8\x92\xb7\x4f\x05\xec\x00\xd9\xd2\x9e\xbf\x7e\x57\x7e\x38\x70\xbe\x43\x24\xdb\x8b\x25\xa1\xe4\x7f\x32\xcb\xfc\x2b\x19\x06\xdb\x6a\x8e\x51\x08\x1c\xc5\xce\x36\xed\xaf\x62\x96\xf8\x5f\xc9\x2c\x35\x9b\xce\xaf\x66\x96\xc3\xf6\x97\x07\x6d\x24\xa5\x59\xb7\xaa\x4f\xd2\x3d\xe5\x3a\x59\xe8\xe5\x5b\xd1\xbc\x31\x4a\xbb\xca\xc3\x24\xa4\x42\x87\xa9\xaa\x5b\x6e\x83\xd4\x40\x72\x55\x59\xd2\x47\x13\x13\x03\xaa\x86\xd5\x8c\xc7\xf0\x51\x56\xc2\x3f\x88\x9f\xf8\x2b\x69\xfb\xfc\x4d\xdb\x57\x34\xc9\x1f\xd6\xc4\xac\xbf\xfe\x5d\xdb\x17\x46\xcf\xff\x47\x3a\xa2\x71\x60\x9a\x13\x1c\xd5\xa9\x02\xfe\xa0\xdd\xcc\x2a\x26\x1f\x55\xbb\x99\xe9\xc2\x67\x3b\xc4\xaf\xdc\x77\x7e\x5b\xdd\xc8\x8f\xe9\x16\x36\xbd\xc5\xfd\xef\xa8\xc0\x89\xc9\x8a\xf8\x34\x53\x2b\x9c\xa7\xae\xdb\xea\x3b\x4f\x66\xcc\xea\x93\x27\xd5\x90\x7d\x30\x50\x80\x63\xd5\xc1\xe6\x66\x53\xce\x9d\x91\xdb\xdc\x79\x0c\x67\x1b\x19\x95\x31\x64\x20\xdf\xd0\x7b\x41\x3e\x06\x53\x60\xfa\xe0\x66\x4d\x4b\xb2\x15\xab\xcc\xa9\x95\xda\x87\x15\x98\xee\x36\xf8\x74\xa6\x9d\x6a\xb2\xc8\xc2\xdf\xc9\xad\x1d\x24\x3a\xb7\xd9\xd7\x8c\xf2\x59\x2e\xdc\xb7\x09\xda\xe7\x56\xfb\xe2\xf2\xdc\xd4\xc6\xa7\xd6\xc8\xe9\x79\x23\x6b\xaa\x49\x27\x8d\x8c\x4a\xfc\xe9\x23\x6d\xad\xc3\x60\x1a\xcd\xc8\x01\xc4\xfa\xdd\xd1\xa0\x5b\x49\x6c\xc9\xdd\x46\x28\xa9\xb0\xea\x9b\x5a\x05\x62\xea\xef\x49\x52\xc5\xc9\x05\x70\x47\x1d\xcb\xb2\x5c\x28\x83\x92\x96\x68\x17\x61\x2f\x58\x57\x5b\x25\x48\xe6\xbf\x6a\x4f\x49\xce\xec\x91\x53\xdf\x0c\x7b\x2b\x73\xe6\xb1\x3a\xc8\x87\x41\x5f\x35\xd5\x3c\xa8\xa6\x9a\xaf\xd5\x17\x16\xcb\xf8\xcb\xd7\x4f\x35\xff\xce\x6a\xf0\x1f\x7f\x51\x6a\x03\x59\x8d\xa0\x3e\x2c\xc1\xaa\x44\xc6\x76\x9a\x61\x4f\x94\x3d\x21\xd4\x86\xdf\xba\x9e\x98\x6b\x22\xbf\xed\xd4\x4d\xfd\x9b\xf3\x25\xf1\xe3\xea\xbe\xc6\xd6\x99\xf0\x5e\x54\xa2\x47\xfd\x9b\x44\x3e\x29\x1e\xba\x6c\xbe\x93\x8b\xc3\xa0\xf1\xe7\xf2\x6d\x81\x84\x80\x69\x42\xd9\x4a\x38\xd3\xc7\xda\xc6\x6e\xd9\xb0\x46\xf4\x24\x7d\xb1\x53\xf4\x09\x0a\xfa\x98\x8c\xe9\x64\x62\x64\xe6\x13\xca\x29\x17\x88\x6b\x67\x95\x53\xb2\x21\x2b\x95\x24\x55\x90\xbf\x62\x52\xa5\xcf\x4a\x7b\x0e\xd2\x0a\x3e\xb2\x6a\x55\x3e\x09\xa1\xb0\x24\x26\x84\xea\x16\x8a\xca\x0e\xfd\xa5\x8e\xcf\xc3\xdb\x8f\x84\x77\x1e\x09\xef\x2a\xe0\x8b\xba\xc5\x32\xb2\xff\x91\xcc\xce\xe1\x0e\xbf\xcc\x5d\xe5\x2f\x09\x7f\x8e\xb6\xeb\x48\x6f\xa2\xfb\xa4\xf0\x21\xaf\xfc\xa1\x28\x0e\xe6\x41\x08\xcc\x51\x6c\xdf\x5e\x19\xb2\x68\xe8\x53\x82\xb6\x9d\xfc\xfd\x50\x4f\xfa\x0c\xdc\xbf\xbc\x24\x71\xe0\x2f\x1b\xab\x28\xa6\x8d\x98\xfc\xbe\x26\x09\x25\xb3\x46\xae\xa3\x1b\x1f\xc8\xc3\xca\x9f\xb5\x35\xa9\x31\x73\x40\x7f\x06\x98\xec\x8a\xc2\x0e\xe6\x63\x40\xee\x19\xed\x76\xf2\x10\x4e\x2f\x41\xc2\x7f\x16\x13\x5f\x2f\x34\xc0\x60\xc8\xcb\x4b\x5c\x91\xb0\x2c\x27\x4b\x49\xdd\xf0\xc9\xb6\x5e\x47\xeb\x84\x60\xb0\x8e\x1f\xcb\x26\x18\x1f\xa9\x63\x09\x10\x9b\xb8\x15\x40\x61\x14\xdf\xf9\x4b\x0e\x05\x72\x8c\x9d\xde\x06\xdc\xc1\xdc\xb1\xb7\x70\x1f\x26\x51\x54\x4d\x76\x1b\x09\x37\x24\x48\xe8\xdf\x2c\x49\x0b\x70\x5b\x04\x90\xe5\xa6\x4b\xc0\x6a\x36\x88\xc2\xd7\x7e\xe8\xcf\x49\xdc\x9e\x05\x09\x43\xd3\xe5\xdd\x1c\xeb\xa4\xe7\x01\xd8\x93\x36\x68\xd4\x00\xba\x0d\x4e\xb7\xad\x15\x35\xb7\x96\xd5\x91\x07\x60\x38\xfb\x21\x9a\xae\x93\x32\x6f\x58\x56\xb7\x0c\xbb\xa6\xb7\xbc\x3d\x24\x50\x89\x75\x92\x79\xac\x06\xb5\x65\xaa\x4c\x42\x51\x01\x3b\x12\x28\xdf\x01\xfd\x18\xcc\x66\x04\xac\xca\x0b\x94\x3b\x82\x4b\x3a\xbd\x94\x35\x3a\xbd\x61\x70\xab\x1f\x29\x3b\x36\x33\xf8\x07\xb9\x5a\x69\x90\x86\x40\xb2\x2e\xbf\xe2\xfb\x41\xd0\x7e\x49\xaf\x58\x26\xfa\x24\xf1\x23\x7a\x90\x20\x51\xb6\x03\x96\x5a\x2e\xdb\x6c\xe7\xf7\xbb\x6a\x28\xb1\xc5\x67\xcb\x47\x19\x80\xe5\x6d\xcb\x3b\xf2\xf4\x92\xf1\xa1\x63\x50\x3d\x26\xe4\x73\xb7\x64\x11\xdd\xf3\xf9\x5e\x37\xb6\x5b\xb8\x0e\xd0\x90\x57\x0b\x89\xf7\x76\xe6\x77\xf8\xc8\xda\x2a\x2e\xb2\x7d\xe5\xf2\x97\xd1\xf8\x97\x2e\x80\x76\x71\xcd\xb0\x5d\x85\x51\x9f\x52\x4a\xcb\x96\x13\xe9\x8d\x58\x3b\xaa\xe0\x95\x0b\x0a\x52\x0b\x2a\x19\xd2\xc1\x0b\x8e\xfd\xa8\x05\xc7\x7e\xfc\x82\x03\xad\xcc\x66\xb3\x1b\x7f\xfa\x81\x4d\x69\x9c\xed\x1e\xb5\xce\x48\x92\xe1\xb7\x5c\x67\x14\x5f\xdb\xad\x30\xf2\xcb\xfc\xca\x22\xbf\x2d\xac\x29\xd2\x5b\x79\x4d\x49\x2f\x3f\x7d\xd9\xb2\xc2\xb1\xf4\xc7\x2c\x13\xf6\xe1\xcb\x44\x19\xb4\x66\x99\xb0\x1f\xb3\x4c\xd8\x8f\x59\x26\xac\x03\x96\x09\x65\x0f\x55\x9c\x96\x48\xf6\x00\x00\x2c\x96\x0c\xd5\x62\x51\x81\xa0\xb4\x48\xe6\x07\xc1\x15\x08\xb0\xbc\xec\xdb\xc9\x08\x60\xf9\xec\xb5\x8a\xaa\xda\x08\xf2\x7d\x54\x55\x8c\xdd\x02\x55\xb3\x26\xd5\xe2\xa6\xcb\x96\x62\x13\xa4\x46\x63\xaf\x2a\xd6\xa2\x9d\xd7\xb1\x1a\x2e\x4f\x52\xc7\xc6\xca\x0e\x95\x46\x49\x4c\x6e\x63\x92\x2c\x74\x49\xa2\xab\xd8\x8d\x1e\xbc\x7e\xe6\xd7\x49\xe3\xcb\xd6\x49\xbb\x7c\x39\x66\xe1\xc7\x15\xda\xb7\xe0\x56\xb7\xe1\x9e\x26\x5f\x17\x37\x1b\xeb\x88\x8b\xba\x39\x7d\x63\xce\xbe\x07\x05\xd8\x4a\x5d\x03\x15\xc6\x12\x23\x7f\x7a\x6a\xf7\x91\xbc\xaf\x49\x5f\x0e\x9a\x5d\xdb\x46\x21\xee\xda\xb6\x74\xad\x84\xc3\x8c\x82\x93\x78\x14\x98\xa6\x01\x3a\xf8\x60\x62\x9c\x62\xd7\x6a\x36\xe9\x09\x76\x7b\x67\x09\xa6\x2d\x17\x8c\x89\x3a\x3c\xaf\xd3\x3b\x0b\x31\x6d\x75\x20\x6f\xc0\xf3\x06\x0c\x4e\xa7\x26\xee\x1b\xad\x01\xbc\xb0\x2d\xfe\xc6\xb6\x18\xb8\x78\x65\x5b\xd6\x90\xfb\x24\xd6\xa5\xca\x08\x4d\xa7\xba\x32\xd9\xcb\x9a\xca\x08\x18\x63\x68\xc3\x17\xa2\x0d\xb6\x87\x9d\x34\xe9\x0c\xbb\x69\xb2\x33\xec\xa5\xc9\xfe\xb0\x9f\xc1\x7a\x43\xc7\xe1\x0f\x4d\xdc\x72\x86\x4e\x27\x7b\x70\x87\x4e\x37\x7b\xe8\x0e\x9d\x5e\xf6\x30\x18\x3a\xfd\xec\xc1\xee\x0d\xdd\x01\x3c\xed\x29\xfe\xb0\xc3\xc1\xea\x6a\x31\x74\x39\x61\x07\x76\x40\x81\x69\x4f\xce\xf4\xc0\xc4\x0e\x6a\xb1\xda\xe9\xd2\x17\xee\x7c\x3a\x5d\x80\x19\xb8\xee\x74\xbb\x4d\xd6\x8b\x48\x24\x4c\x7b\x97\x74\x26\x86\xd1\x6c\xea\x09\xfb\xb2\x81\x18\x41\x03\x1a\x86\x83\xc1\x1b\x8a\x53\x60\xec\x4c\x8c\x61\xa7\xb6\x1c\xe1\xd7\x95\x23\xac\x2c\x47\x58\x2e\x87\x6d\x09\xc6\xf9\x3a\xde\x28\x2f\xd9\x71\x1c\xc5\xba\x26\xbc\x92\x35\x2e\xff\xf4\xae\xe1\xa7\x03\x76\xd8\xf8\x7e\xd6\xd6\x90\xe2\x92\x16\x1f\x35\x38\x3a\x39\xb1\xfb\x9b\xe4\xe4\x64\xb0\x09\xf9\x7c\x51\x01\xa8\x2e\x4c\xf9\x54\xfb\x63\x30\x25\x97\xd4\xa7\x6b\x69\xa6\xf8\xa3\x24\x62\x79\x89\x2f\x6b\x80\x35\x53\xbe\x3b\x63\x1b\xa6\x36\x92\x5f\x7c\x82\x17\xef\xb4\xea\xb9\x52\x5a\xfb\xcb\x9f\xb3\x42\xad\x5e\x97\x52\x46\xf8\xb2\xe2\x15\x15\x77\xd1\x2d\x7d\x57\x74\xc4\x21\x5d\xeb\x2b\xef\x65\xab\xaf\x26\x29\x5e\x16\xc4\xf1\xf2\x4b\x49\xe5\xf3\x87\x8a\xcb\x35\xc4\xb2\x0d\x4f\xb5\x44\x21\x95\xa5\x4e\x66\xe0\xab\x6d\x19\xa3\x9e\xe1\xf7\x8a\x47\x0f\x72\x19\xc4\xd5\x46\xa5\x28\x31\x5f\x92\x8f\x64\x59\x89\x93\xe0\x31\xc3\x9a\x48\x8a\x5b\xde\x16\x10\xc1\xa7\x42\x7b\x7c\x62\x9f\xd9\x43\x50\x23\x0b\xae\xa6\xd9\x9e\xb2\x52\x55\xfa\x76\x05\x74\xb4\xe9\x8e\xba\x86\xb4\x9b\x65\x34\xfd\xa0\x95\x54\x93\x6a\x49\xa2\x92\xc6\x3a\x9c\x91\x18\x22\xe8\x14\xe8\x74\x87\x55\x83\xa6\xaa\x2c\x7e\xac\x19\x5b\x61\x73\xf9\xbd\x83\xb1\x5d\x9e\xd9\x24\xd4\xe7\xcb\x20\xfc\xa0\xa1\x58\xd6\x7e\x73\xbe\x7b\x47\xe6\xe5\x73\x09\xe5\x64\x24\x1f\x33\xee\xf8\x4e\x17\xc7\xaa\x86\xcc\x4f\x05\x0e\x84\x73\x8d\x66\x13\x8e\x39\x54\xec\x08\x06\xd0\xe5\xc6\x80\xed\xb5\xe2\x2c\x42\xe6\x1a\xf9\x5e\x05\xdb\x7e\x8b\x71\x53\x53\x41\xd8\xa4\xff\x45\x36\x41\x50\x81\xfd\x26\x71\xbc\xa4\x58\xa1\x51\x7c\xc0\x47\xa5\xa1\xc3\x4b\xb1\xd9\x28\xaa\xa5\x2c\xc8\x66\x63\x65\x77\xac\xc1\x2d\xd3\x8f\xdc\xa5\x01\x4e\x46\xdc\x5b\x7a\xe1\x04\x3c\xbd\x02\x4d\x73\x86\x1b\x20\x90\x06\xa9\x9d\x2e\xf8\x35\x21\x27\xc1\xd8\x9a\x40\x6f\x92\xd3\x60\x1c\x4d\xc6\xf6\x64\xe7\xbd\x84\xc9\xb5\xa3\xe8\x14\xc7\x23\xb8\xf4\xca\x2d\x6a\x6f\x97\x51\x14\xeb\x7a\x6c\x46\xc6\xb1\x63\x20\x86\x46\x39\x1a\xa6\xa6\x0d\x3a\x21\x70\xde\x00\xb4\x29\xa3\x6d\xa4\x14\xad\x51\x04\xe6\xf3\xe9\x07\x76\xee\xf2\xe3\x5c\xb8\x08\x72\x8a\x3b\x6e\xd7\x69\x36\x75\x72\x82\x3b\x9d\x4e\x6f\xb3\x19\x58\x16\x13\x5e\x08\xa4\x1c\x9e\x22\xa7\xd8\xb6\x07\x56\xa7\xd9\x64\x60\x8e\x3d\xb0\x9b\x4d\xdb\x71\xbb\x20\xa4\xc3\xeb\x4e\xc7\x72\x1d\x78\xdd\xed\x3a\x96\x0b\x79\x9e\xdb\xeb\x70\x14\xaf\xe3\x74\xbb\x3c\xaf\x6b\x31\x41\x99\xe5\x75\xad\xce\x20\xcd\xeb\x39\x22\xcf\x76\x53\x38\xa7\x9f\xc2\xb9\x3d\x4f\xe4\x75\x45\x11\xbc\x6e\xd7\xb6\x78\xb1\x5c\x3b\x45\xb6\x07\x9e\x67\x71\x6c\x48\xf6\x21\xd7\xf1\x1c\xbb\x63\xf3\x81\x1d\xe0\xf1\xb8\xe7\xf5\x51\xbf\x37\x98\xa0\xb1\x6d\x77\xbb\xc8\xb6\xbb\x7d\x48\x7b\x16\xb2\x6d\xcf\x66\xe9\x8e\xd3\x45\x76\xc7\x03\x98\x4e\xcf\x46\xec\x87\xa7\x5d\x96\xee\xf0\xb4\xc7\xd2\x3d\x9e\x1e\xb0\x34\xc0\x77\x5d\x0f\xd9\x5d\x97\xa7\xbb\x0e\xb2\xbb\x5d\x80\xf1\x6c\x1b\xd9\x9e\x6b\x41\xba\xd3\x47\xec\x87\xa5\x7b\x5d\x0b\xd9\x3d\x0f\x68\xf6\xbc\x1e\x4b\xf3\xfc\x1e\xcb\xef\xb9\x2c\xdd\xb7\x7a\x88\xfd\xf0\xf4\x80\xa5\x81\x7e\xbf\x63\x21\xbb\xef\x79\x2c\x3d\xe8\xf6\x91\x3d\x00\x5c\xc7\x72\x7a\xc8\xb1\xdc\x2e\x4b\xbb\x56\x17\x39\xae\xe5\x41\xda\xeb\x20\xf6\xc3\xd3\x03\xe4\xb8\x3d\x9e\xdf\xb7\x11\xfb\xe1\x69\x06\xdf\x07\x3a\x1d\xcb\x41\x4e\xc7\x72\x21\xed\xba\x88\xfd\x40\x7a\xc0\xf2\x07\x0e\x4f\xf7\x90\xd3\xb5\x58\xbd\x9c\xae\x35\x60\xe9\x01\xa4\x5d\x0b\x39\x5d\x17\x68\x76\x3d\x1b\x39\x5d\x0f\xe0\x3d\xc7\x42\xec\x87\xa7\xbb\x2c\x0d\x65\xf0\x5c\x1b\x39\x9e\xcb\x61\x5c\x96\xef\xf6\x20\xdd\x73\x90\xe3\x41\x3b\x38\x5e\x7f\x80\x1c\x6f\x00\xb8\xbd\x4e\x1f\xb1\x1f\x48\x77\x5d\xe4\xf4\xa0\x9d\x9d\x5e\x77\x80\x9c\x9e\xc7\x61\xbc\x2e\x4b\x43\x3b\xf4\xfa\x1e\x72\x7a\x7d\x80\xe9\xdb\x3d\xc4\x7e\x20\xdd\xf3\x10\xfb\xe1\xe9\x01\x4b\x43\xf9\xfb\xac\x4d\xfa\x7d\xf8\x6e\x7f\xe0\x22\xf6\xc3\xd2\x03\xd6\x26\x03\x0b\xca\x39\xe8\x78\x88\xfd\x4c\xd0\xd8\xb5\xac\x3e\x62\x3f\x90\x76\x6c\xc4\x7e\x58\xda\x76\x3b\xc8\xb5\x5d\x80\xb1\x3b\x0e\x72\xed\x4e\x87\xa7\x3d\x96\x1e\x40\xba\xdb\x43\x2e\xe7\x43\xd7\xf1\x2c\xc4\x7e\x78\xda\x65\x69\x17\xd2\x3d\x96\xdf\xe3\xf9\x3d\x8f\xa5\x7b\x90\x1e\xf4\x91\xeb\x0c\x80\x8e\x3b\x70\x91\xeb\x0e\x58\x7d\xdd\x8e\xd5\x45\xec\x87\xa5\x59\x5f\xb0\x1f\x9e\xee\x23\xb7\xdb\xe1\x69\x56\x9e\x6e\x87\xd5\xc5\xf5\x5c\x17\xb1\x1f\x9e\xf6\x90\xeb\x89\xfc\x6e\x17\xb9\x1e\xf4\x9d\xdb\xf3\x6c\xc4\x7e\x78\xba\xc3\xd2\xf0\xdd\x5e\x8f\xe5\xf7\x38\x4c\x9f\xe5\xf7\x21\xbf\xcf\x60\xfa\xd0\xfe\x2e\x6b\x43\x97\xb7\xa1\xdb\x1f\x74\x59\x5a\xe4\xf7\x58\x1a\xea\x32\xe8\xba\xc8\x1d\x00\x3f\xbb\x03\xaf\x8f\xdc\x01\xa7\x39\xe8\x75\x58\x1a\xe0\x07\x8c\xfe\x60\x00\x65\x18\x0c\x5c\xd4\xb1\x1c\xd6\x6e\x1d\xcb\xed\x23\xf6\xc3\xd2\x76\xc7\x46\x1d\xde\xce\x1d\xd6\xce\xec\x07\xd2\x5d\x0b\x75\xec\xae\xcd\xd3\x2e\x4b\xbb\x90\xee\x77\x50\xc7\xee\x33\xfa\x9d\x4e\xa7\x8f\x3a\x1e\x8c\xb5\xce\xa0\x3b\x40\xec\x67\x82\xc6\xdd\x81\xe5\xa1\xee\x00\xfa\xb7\x3b\x70\xfb\xa8\x3b\x80\x36\xec\x0e\x7a\x16\xea\x0e\x60\x7e\xf0\x2c\xcb\x41\x9e\x05\xe3\xc5\xb3\xbc\x3e\xf2\x2c\x68\x1f\xcf\xea\xd9\xc8\xb3\xa0\xbf\x3c\xab\xef\x21\xf6\xc3\xd3\x03\xe4\x59\xd0\x77\x9e\x6d\x0d\x10\xfb\x81\x74\xb7\x8b\x3c\x1b\xf8\xd9\x73\x6d\x17\xb1\x1f\x96\xee\xb8\x0e\xf2\x3a\x6e\x87\xa7\x07\xc8\xeb\x40\x19\xbc\x4e\xd7\x42\xec\x87\xa7\x7b\x2c\x0d\x74\xbc\xde\x00\x79\x5e\x1f\xf2\x07\xb6\x83\xbc\x81\xdd\x85\xb4\xd7\x41\xec\x87\xa7\x3d\xe4\x0d\x7a\x1c\xa6\xc7\x60\xa0\xcd\xbd\x41\xaf\xcf\xd2\xac\xbe\x3d\xcb\x1e\xa0\x9e\xe5\xb0\xf2\xf4\x3c\xdb\x43\x3d\x3e\x66\x7b\x5e\xaf\x8f\x7a\x1e\x8c\x97\xbe\x63\xb9\xa8\xef\x40\xbb\xf5\x1d\xb7\x83\xfa\x0e\xf4\x45\xdf\xe9\xf7\x51\xdf\x81\xfe\xea\x33\x5e\xed\xbb\xd0\x3e\xfd\x8e\x65\xa1\x7e\x07\xe6\x07\xdb\x71\x5d\x0b\xb1\xdf\x2e\x3c\x75\x3a\x36\x62\xbf\xac\x1c\x1d\xd7\xb2\x3b\x08\x7e\xc5\xd3\x00\x9e\x06\xfc\xa9\xd3\x65\x4f\xd0\xbb\x5e\xc7\x61\x4d\xcb\x7e\xd9\x53\xd7\x72\x3a\xc8\xeb\x5a\x30\x13\x7b\x5d\xab\xeb\xb1\x27\xde\x2e\x5d\x87\x35\x0c\xfb\x85\xa7\xae\xc3\x9e\xf8\x5c\xe5\xf5\xad\x41\x0f\xb1\x5f\x78\xd7\xb7\x2d\x1b\xb1\x5f\x47\x3c\xf5\xd9\x93\xcd\x21\xed\xae\xc3\x9e\xba\x1d\xf1\x34\x80\x27\xbe\xb2\x0c\xec\x8e\x8b\xe0\x4f\x57\x3c\xc3\x5a\x33\xb0\xa1\xa5\x21\xc1\xdf\x8b\x95\x68\xe0\xd8\x6c\xfd\x19\x38\xd0\xd3\xb6\x3d\x70\x3d\x07\xc1\x1f\x46\x7d\xc0\x96\x89\x2e\xe2\x7f\xc4\xb3\xeb\xb1\x67\x0f\x4a\x3d\xb0\x7b\x3d\xcf\x62\xcf\x83\xc1\x60\x92\x05\x6c\xc9\x84\x94\x5d\xb0\x29\x0b\x63\x1c\x9c\x91\x76\xb8\x5e\x0e\x83\x13\xd7\xd9\x6c\x82\x53\x6c\x3b\xbd\x66\x33\x38\xb1\x3d\xeb\x8c\x40\x44\xa2\x38\x5a\x0e\xa9\x1e\x18\x67\xd6\x30\x66\x7f\x9c\xa1\xbd\xdd\xea\x9f\x19\x92\x85\x52\x00\xeb\x5b\x85\x93\x0a\xc9\x7d\xe3\x1d\x99\x5f\x7c\x5a\xe9\x9a\x7e\x36\xfc\xeb\x66\xfc\xd7\xab\xab\x99\xdf\xfa\xc7\xd5\x55\xbb\x35\x31\x0d\x5d\x5f\x50\xba\x4a\xce\x86\x57\x57\xc7\x57\x57\xc7\x86\xae\xeb\xe3\x02\xc0\xd5\x55\x5b\x1f\xf3\xc7\xc9\x67\x07\x79\x5b\xc3\xd8\xe8\xfa\xd5\xd5\xec\xb3\x8d\xdc\xed\xd5\x55\xdb\xf8\xcc\xfe\xf0\x47\x63\xa3\x2f\xa3\xa9\xbf\x5c\x44\x09\x35\x0c\x7d\xc8\xf3\xbb\x5b\xe3\x4c\xbf\xba\x3a\x1e\xc3\x37\xee\xaf\xae\xda\x57\x57\xad\xef\xff\x39\x79\x6a\x3c\xd5\xaf\xae\xce\xc6\x56\x6b\x00\xd9\xe3\xab\xab\xc9\xd5\x95\x7e\x75\x65\x00\xe0\xd9\xd5\xd5\xd1\x7f\xfc\xe7\x77\xdf\x37\x9f\x3c\x35\xd1\x70\xf4\xcf\xab\x2b\xcc\x51\x27\x4f\x8d\x33\xfd\x3f\xbe\x08\xcd\xd0\xbf\x83\x16\xc8\x95\x63\x62\x1a\x9a\x81\x22\x6c\x55\xfa\xe2\x49\x45\xe2\x90\x5f\x64\xfd\xf0\xda\xa7\xd3\x05\x89\x5f\xce\x70\x24\x44\xe0\x38\xba\x17\x1e\x15\x5e\xce\x12\x3c\x4e\x8d\x08\x96\x3b\xe0\x5d\x6e\x4c\xe6\x41\x42\x49\x9c\xa3\xa4\x07\x10\x92\x05\x7d\x06\x95\xd6\xcb\x70\x46\x3e\x0d\xed\xad\x32\xb6\x02\x0f\xd2\xf7\x3e\x7a\x11\xdd\xa9\x02\xc4\x5c\xa7\x0e\x54\x53\x77\x96\xd7\x10\x0c\x84\x4a\x96\x76\x1f\x82\xdb\x87\x77\xd1\x7d\x31\xf0\x76\xaa\xfe\x49\x89\x14\x5c\x83\x15\x2b\x39\xa6\x93\x51\xd9\x6d\x6d\x76\x0f\xae\x0c\x99\xf7\x52\xbb\x6b\x19\x5e\x02\x1e\x86\x8e\x82\x97\x35\x03\x91\xf6\xfb\x97\xaf\x2f\xae\x9f\x5f\xfc\xf0\xf6\xdd\xc5\xf5\xab\x97\x6f\xfe\xfc\xf2\x87\xdf\x24\xbd\x0a\xa1\x3f\x3e\x30\xfe\x17\xfd\x91\xee\x27\xe4\x4d\x4c\xbe\x03\xc6\xd1\x24\x75\xa6\xa6\xf0\x2b\x9b\x11\xfc\xc5\x5f\x06\x33\xae\xc7\xf0\x97\xcb\x1b\x7f\xfa\xe1\x00\xba\x1f\x65\x24\x52\xde\x6e\x49\xbd\x8e\xcb\xe3\x3d\xb8\xd5\x77\x91\x28\xe1\x06\xec\xe7\xd4\xe7\xb2\xcc\x7b\x47\x18\x47\xcd\xe6\x11\x35\xe8\x22\x8e\xee\x21\xfe\xc7\x05\xd7\x30\x8a\x4a\x36\xee\xd6\x09\x6d\xdc\x90\x46\x1a\x46\x2e\x9d\x12\x3e\x07\xc2\x6b\xa1\x4c\xd4\x34\x51\x4c\xe6\xe4\xd3\x90\x20\x41\x65\x48\x51\x8e\x29\xe3\xf6\xee\x01\xc9\x95\x1e\xc6\x8a\x96\x40\xab\x38\x88\xe2\x80\x3e\x0c\xe3\x76\x9a\x64\x5b\xc2\x51\x3e\x2c\xc7\xb5\x3f\x9b\xe5\x4a\xf2\x3e\x7a\x15\x24\x6c\xd2\x44\x41\x3b\x98\x15\x5b\x52\x09\x5a\x56\x63\x5a\x47\xa9\xaa\x32\xdf\x55\x62\x07\x99\xb7\xb3\xae\x04\x6a\xd9\x23\x7a\x8a\xad\x11\x6d\xb5\x0c\x30\x37\x48\xcb\x7e\xa2\xc0\x19\xd3\x49\xf6\x3e\xef\xd2\xaa\xa1\x20\x9f\x5e\xb8\x80\x1b\x51\x24\xd5\xf8\xaa\x40\x2c\x00\xc8\xab\x7b\x0b\x50\x70\x7f\xa7\xec\x5b\x79\x46\xea\x39\x2d\x5f\xf7\xdd\x05\x61\x45\xfd\xc1\x7c\x22\x9b\x11\xca\x95\x0d\x66\x6c\x2f\x6b\x14\xba\x50\x59\x4b\x64\x1b\xe8\xc8\x1a\x65\x1b\xe7\x62\x57\xaa\x26\xa2\x82\xc3\x42\x3e\x7f\x8d\xc9\x04\x3c\x5d\x71\x3f\xeb\x99\x13\xd8\x5c\x54\x3d\x6b\x14\xd7\x54\x25\x36\xcd\x82\x87\xc2\x62\x75\xe2\x49\x76\xdc\x35\x8b\x5e\x65\x25\xd2\x29\x0a\xc0\xc1\x56\x94\x39\x66\x04\xd6\x0a\x14\x3c\x9e\x99\xa0\xa8\x1c\x2f\x46\x50\x7c\x05\x96\x5e\xa8\x0d\xa2\xa8\x60\x73\xbb\xd9\x48\x26\x63\xdc\x71\x62\x10\x02\xa9\x16\xe8\xcb\xc0\xb7\x74\x88\xad\x51\x78\x92\x96\x73\x14\x9a\xa6\x91\xe8\x61\x1a\xaf\x6f\xbb\x2d\xcd\x9f\x85\x6a\x2a\x9d\x9c\x8f\x27\x28\xc0\x94\xf7\x72\x84\x12\x4c\xda\xd3\x45\xb0\x9c\xbd\x89\x66\x24\x41\x21\x2e\xf8\x3c\xe7\x53\x82\x4e\xdb\x30\x73\x40\x8b\x1d\x85\x9b\x0d\x9b\xc4\xc2\x74\xc0\x09\x3e\x89\xb3\x1e\xf3\x71\x38\xd6\x78\x54\x79\xed\x28\x0d\x6f\x49\x73\xb3\xcb\x99\x35\xcc\x3f\x42\xf8\x3c\x1e\xa4\xd1\xf4\xd3\x83\xca\x05\xb6\x46\x8b\x93\xac\x97\x17\x69\x2f\x4f\x71\x32\x5e\x4c\xd0\x1a\x4f\x0b\xe5\x4c\x43\x3c\xfa\x50\xc6\xf5\x29\xb6\x38\xf8\x4c\x74\x3e\x0f\x1b\xf0\x2c\x9c\x2e\xa2\x38\x0d\x1e\xe0\x23\x9a\x2e\x1a\x82\x1b\x8a\x34\xb3\x0b\x97\x69\xa1\xd8\x90\x71\x31\xc6\xd3\x76\x18\xcd\xc8\xfb\x87\x55\xea\x55\x4d\x38\xfb\x64\x4d\xa8\x4f\xd1\x8c\xdb\x20\xc1\xf7\x57\x78\xca\x08\x6b\xcf\x34\x8c\xf1\x0a\xf0\xde\xf8\x77\x64\xd7\x68\xab\x7c\x2c\x73\x0d\xad\x0a\x9e\xe5\x67\x62\x82\x80\xa2\xed\x7a\x49\xb6\x8e\xba\xc5\xd6\xe8\xf6\x44\x01\x33\xba\x4d\x1b\x6e\x8e\xf3\xaf\xc7\xb7\x13\x74\x87\xe7\x35\x6d\xd8\xb2\x8f\x30\xbe\x4b\x17\xc5\x5c\x0d\x2f\x53\x67\xae\xbf\x06\x74\x01\x55\x9e\xa3\x19\xf2\xd1\x9d\xd0\x2a\x8b\x73\x9c\x85\x89\x0f\x40\x9d\x02\xea\x9a\x7b\x1a\xe5\xb3\xde\xcc\x40\x47\x7a\x99\x0f\x77\x1e\x64\x97\x46\x89\x29\x8d\x2a\x7e\xfc\x02\x3e\x34\x25\x46\xcc\x5c\x76\x97\xce\xd9\x54\x1c\x25\x2d\xfa\xf9\x69\x69\x56\x11\xc1\xc2\xd7\xb2\xd8\x9b\x41\x29\xdc\x40\xd0\x9e\xc5\xfe\x7c\xee\xdf\x2c\xe1\x0c\x28\x3e\xd3\x83\xf6\x22\x26\xb7\xf0\x8a\xfa\xf1\x9c\x50\xac\x5d\xc3\xf5\x3c\x0d\x05\xca\xb0\xc2\xc1\xf4\x43\xce\x7d\x3d\x97\x43\x68\x36\xb5\xeb\x31\x5b\x83\x0c\x63\x78\x38\xf2\x51\xa0\x0c\x91\xae\x9a\xbd\xca\x9f\x41\xa5\xab\x45\x79\xce\xa8\x58\xc5\xc6\x13\x14\x63\x7b\x14\x9f\xf8\x69\x80\xa1\xfc\xb4\x4f\xc7\x71\xcb\x9e\xe0\xec\xdd\x38\x9e\x64\x93\x10\x0f\xc1\x9a\xc6\x34\x40\xdc\xe5\x5f\x3a\xa6\x47\x11\x5b\xff\xc4\xf9\xdb\x73\x72\x1b\xc5\x44\xa7\xe3\x68\xc2\x96\xec\xa0\x10\xe9\xa0\xbc\x04\xd7\x72\xb3\x22\xfe\x78\x70\xab\x83\x8e\x58\x1e\x99\xe0\x80\x33\x9f\x3f\xb6\x26\x06\x72\xc1\x98\x23\x37\xbd\x94\xe4\x3f\xde\xeb\x0c\x3e\x13\x01\xfd\x06\xe3\x9a\x06\xc3\x69\x44\x71\x23\x0a\x97\x0f\x0d\xd1\x31\x0d\xbf\x91\x04\xe1\x7c\x49\x76\x20\x42\x52\x8c\x8a\xe3\x8b\x0d\x3f\xd8\xf1\x72\x9e\x4d\x70\x54\xf0\x0e\x2d\x46\x16\x0a\xd5\xbc\xfc\x9e\x7c\x82\x22\xe9\x89\x51\x14\xfc\xf2\xf3\x22\x6b\x92\xd0\x40\xd6\x16\x5c\x39\xe2\xd2\xf8\x16\x72\x59\xf6\x29\x11\x9b\x36\x5f\x0c\x0b\x05\x06\x5a\xee\x29\x81\x5f\x5b\x82\x25\xdb\x86\x58\xa0\xe1\x5e\xc8\xb4\xa7\x7b\x68\x2f\x0c\xb4\x2e\x60\x05\xe6\xae\x69\x66\x7b\x90\xd7\xb5\x05\x9b\x22\x8a\x66\x06\xb2\xc5\x59\x4a\xa2\xda\x29\x61\xc7\xb2\x10\x6d\xf3\xd5\x3d\x20\xf1\xb7\x0a\xab\x50\xf4\x60\xfb\x79\x3b\x4a\xc6\x70\x74\xfe\xfc\xe2\xd5\xa4\x24\x50\x64\xee\x7e\x6f\xc8\x72\xa9\x1b\x5b\x24\x40\x5f\xfd\x50\x09\x99\x7a\x05\xcc\x41\xff\xf2\x7e\x82\x77\x88\x69\xee\x0f\x3f\xa8\x72\xcf\xdf\x55\x52\x2e\xfa\xe1\xcb\xd1\x7f\x7e\x59\x5d\xee\xd4\x03\x5f\x0e\xfc\xc7\xf7\x95\xe0\xd4\xbf\xc9\x01\x5e\xbe\xad\x04\x4c\x3d\xe9\xe5\xa1\x5f\xd6\x43\xbf\xcc\x17\xf9\xe2\xf2\xbc\x02\x9a\x1f\x9a\x52\x9f\x12\x7d\xc1\xc0\x9e\xfd\x74\xf1\xc2\xd8\x8a\xc3\xb6\xcf\xdb\x51\x38\xd6\xc6\x5a\x19\x17\x82\x43\xfb\x77\x5c\x4f\xd1\x9e\xae\x63\x36\x2f\xfe\xc4\xb2\xb0\x85\x0a\x14\xcf\x2f\x5f\x5e\xff\xf4\xec\xdd\xb3\xd7\x4c\xf2\x1c\x6b\x93\xaf\x20\xf5\xf6\xf2\x9c\x11\x69\xff\xf4\xc5\x14\x5e\x9c\x5f\x02\x85\xeb\x12\x85\x02\xd0\xcb\x3f\xbd\x79\xfb\xee\x82\x17\xf7\xaf\x52\x71\x2b\x40\xdb\x53\xa9\x50\xc2\x6e\x9e\xbd\xbc\x90\x5e\xc2\x39\x2f\x97\x0c\x74\xa3\x58\xc8\x37\x6f\xdf\xbd\x7e\xf6\x0a\xf0\x5e\x48\x78\xfb\x30\x5e\x2b\x8a\xf1\x91\xc4\x09\x79\x59\x8f\x38\xd6\xbe\x57\xf4\x4c\xde\xc1\x22\xa2\xfb\xef\x5d\xa9\x88\xb3\xcc\x0f\xc1\xea\x0d\x9b\x9b\x17\x3c\x6c\x4c\x28\x86\xde\xb3\x37\x93\xc2\x32\xad\xe2\xc8\xb4\x88\x23\x3e\x7f\x7f\xde\x8e\xfc\xb1\x76\xa6\x55\x23\xfe\x04\xe7\xfa\xba\x76\xa6\x19\x5b\xe4\x8f\xb5\xd3\x03\x60\x4f\x05\xec\xd1\x01\xb0\x47\x1c\xd6\xaa\x81\x64\xac\xa7\xdb\xd6\x53\x02\x51\x84\xe1\xc9\x00\x24\xfb\x91\x48\xa6\x0d\x68\xce\x63\xd1\x1c\x40\x73\x1f\x8b\xe6\x02\x5a\xe7\xb1\x68\x1d\x40\xeb\x3e\x16\xad\x0b\x68\xde\x63\xd1\x3c\x40\xeb\x3d\x16\xad\x07\x68\xfd\xc7\xa2\xf5\x01\x6d\xf0\x58\xb4\x01\x43\x6b\x7f\x57\x8d\x15\x25\x14\xb8\xe9\x3b\xce\x4d\x4f\xb4\x27\x35\x9f\x10\xc0\x4f\xb4\x27\x9c\x4d\x1b\x75\x6c\x9a\x52\x6e\x08\x9e\x7e\x72\x08\xf0\x13\x01\x3c\xaa\x02\x4e\x43\xaf\x88\x0a\x32\xe0\x2f\x1c\xc3\x4b\x36\x86\x97\x63\xed\x3f\x4b\xf3\x0d\x93\x36\x32\xe4\x9c\xff\x56\x88\x95\xbd\x6c\x3f\xab\x06\x4e\x7d\x9b\x0a\xc8\xe7\xfb\x20\x5f\x44\xf7\xa1\x80\x3d\xdf\x07\x2b\xbc\x00\x0a\xf0\x17\xfb\xc0\x53\x3f\x1b\x02\xfe\x62\x1f\x7c\xea\xed\x52\xc0\xff\xb0\x0f\xbe\xe0\x68\x52\x20\xfd\x69\x1f\x52\xde\x15\xa4\xc0\xf9\x71\xef\x87\xd2\x30\x37\x1c\xfe\xe5\x81\xed\xf4\xde\xbf\x11\x18\xff\x55\x8d\x51\xf4\x79\x28\xe0\xff\xbc\x17\x3e\x57\xe5\x57\xfb\x38\x07\x3c\x76\x09\xe0\xd7\xd5\xc0\x39\xf7\x5e\x02\xf8\xa7\x7d\xc0\x79\x9e\xbc\xac\x06\x4e\x3d\x23\x09\xc8\xf7\x12\x64\xba\x43\x39\x71\x9a\xcd\xa3\xb8\xd9\xcc\xbb\xfb\x11\x48\x7f\xd9\xd3\x24\xf9\xa2\xfc\xdf\x43\x39\x33\xeb\xa1\xb1\xf6\xb7\xba\x11\x58\x72\xe5\x22\x3e\xe3\x57\x23\x48\x7e\x55\x04\xca\x4d\x35\x4a\x95\x97\x13\x81\x39\xad\x69\x5e\x85\x13\x11\x81\x35\xab\xc6\x2a\xf9\x8c\x10\x08\xe5\x5d\x76\x0e\x41\x72\xe0\x20\x50\x6e\x6b\x9a\xe1\x97\xd2\xd0\x99\x57\xc3\xa6\xae\x02\x04\xe4\xa2\xae\xbe\xfc\x4a\x22\x07\x5c\xd6\x35\x69\x11\xf4\xae\xbe\x87\xa5\xd6\x0b\xeb\xf8\x7f\x67\x08\x2e\xa0\x57\x12\xb4\x30\x4b\x8d\xb9\x59\xaa\x76\xa4\x0d\x73\x96\xcd\x0c\x8b\xa1\xfd\xae\xd0\x6b\x68\x0d\x0d\x63\x1c\xc0\x40\x28\x58\xc2\x8a\x4f\x95\xa3\x96\x14\xd6\x99\x9c\xc9\xa7\x00\x4f\x2a\xc1\x33\xdb\x49\x01\xb9\xae\x82\x2c\xd8\x3c\x8a\x31\xa3\x5a\xf3\x90\x70\x16\x95\xa1\x46\x95\x6b\xdf\x62\x74\x54\xf4\x94\x41\xc4\x7b\x6c\x4d\xb0\xc6\x93\x1a\x62\xd9\x62\x23\x86\xed\x09\xd6\x44\x9a\xbf\xc8\xf6\x53\xd8\x99\x60\x2d\x7b\xca\x5e\x62\x97\x67\xf3\x8c\xb7\x97\xe7\xb8\x33\xc1\xda\xdb\xcb\x73\x01\xc1\x45\x75\xdc\x65\x50\x3c\xcd\x5f\xbc\x38\xbf\xc4\xde\x04\x6b\x2f\xce\x2f\x79\x06\xdf\xdb\xe0\xde\x04\x6b\x3c\xa9\x6d\xf5\xc5\x66\xa3\x2f\xf0\xe7\x34\xec\xf6\xb4\xe2\x08\x3c\x77\xc2\x1c\xe4\x4d\x38\xcb\x17\xd7\x32\xd7\x26\x09\x44\xcc\x4f\x1b\x4b\x75\x92\x0d\x61\x9e\x95\x6e\xba\xa6\x68\x8d\x66\xd9\x7d\xa4\xd1\xce\x05\x6d\x16\x49\x4c\xb6\x1f\x5f\xc7\x71\x34\xf7\x29\xb9\x5e\x04\xf3\x85\x2a\x70\x4d\x11\xc2\x94\x6e\xdc\x15\xdf\x63\x4d\x4b\x4f\xe6\xd2\x8f\x9e\xcc\x4a\x19\xa6\x09\xba\xbb\x18\x93\x71\xf1\xc5\x04\x75\xbb\xce\xc0\x3b\xc1\xfa\x14\xf3\x41\x79\x1e\xcd\xc8\x33\x5a\xaa\x85\x61\x34\x9b\xd3\x13\xdc\xf5\x5c\x7b\x00\x94\xd6\x75\xd0\xa6\x6d\xa0\x20\x79\xe3\xbf\xd1\xd7\x86\x6c\x18\x5c\x2c\x7c\x3c\x9a\x46\x21\x0d\xc2\x35\xd9\x4e\xb1\x6d\x39\x9d\xa7\xfa\xb4\x05\x65\x32\x4c\x7d\xdd\xea\x7a\xae\x63\x19\xa6\xd7\xed\xba\x1e\x8a\x4d\x9c\x4e\x1c\xf2\x17\xb7\x60\x0f\x0b\xf0\x27\x78\xca\x8b\xdb\x73\x3b\xae\x91\xde\xf8\xc8\x75\xb6\x30\x5b\x4f\xbb\x7c\x18\x37\x82\xb0\x91\x9c\x25\xe3\x78\x22\x8e\xf7\x25\xf6\x49\xef\xc8\xe4\xf3\xd2\x90\x46\x7a\x8c\xa6\x05\x1b\xf4\x4c\x95\x31\x64\x8d\xce\x88\x87\xc6\xe7\xb0\x44\x3d\x6d\x91\xf4\x9c\xa1\x34\x79\xe9\x1a\x18\xb2\x6b\x86\xf8\xfb\x54\xfc\x35\xc5\xdf\x96\xf8\xdb\xd6\x86\x32\x66\xf9\x4a\x40\x7a\x5f\x20\x7f\xb1\x94\x51\xae\x82\xcb\xdf\x56\x65\x5f\xae\x82\x73\xf2\x70\x66\x35\x9c\x9b\x87\x6b\x1d\xf8\xdd\x76\xcd\x77\xb7\xc5\xa1\x2b\x26\x93\x3c\xf6\x71\x4d\x69\x90\x12\x1b\x15\x79\xaa\xd5\xca\x93\x7b\x23\x9a\xfb\xad\x96\xbb\x0f\xae\x85\xd2\x47\x76\x4a\x0b\x27\xcf\x12\x5a\x24\xf0\x37\x35\x18\x6e\x01\x63\x7b\x30\xed\x7f\xd6\x40\xda\x05\xc8\x9e\xa6\x62\xe3\xdc\xaa\x64\x28\xe7\xc4\x3c\x89\xbe\x92\x44\x71\xb9\xda\x4f\xe5\x3f\x52\x2a\x45\x10\x54\x9e\xb6\xf2\x38\x3f\x4a\xd5\xa4\xfe\xcd\x65\xce\x3b\x44\xf5\xe7\xb0\x84\xfa\x2f\x75\x14\xb3\xb7\xbc\xa7\x15\xe5\xfd\xef\xf5\x33\x50\x57\xcc\x19\xb9\xf5\xd7\x4b\x5a\xd7\x8b\x55\xd7\x09\x2f\x2e\xcf\x1b\xa9\x31\x61\xe3\xfb\xa4\x0d\x17\x69\x0a\xb3\xa7\x18\x90\x7c\x5e\x8e\xd2\xc7\xcb\x33\x9d\xe2\xdd\xd3\x38\x9e\x20\xed\x58\xe3\x06\x48\xf0\xc5\xa2\xa6\xcf\x18\x32\xe8\x92\x96\xb0\xce\x79\x52\xc5\x74\x81\xa8\xd4\xaa\x73\xc5\xfd\xab\xca\xce\x6c\x80\xee\x18\x56\x02\x26\x63\x0a\x7d\xf8\x66\x93\x3d\x3d\xbf\x78\xb5\x13\x5d\x73\x20\xa9\x0f\x8d\xdd\x68\x28\x97\x83\x6b\x9e\xf9\x39\xb3\x7c\xe7\x2c\x53\x44\xcb\xb1\x8f\x00\x2f\xef\x69\xbd\xf6\x1a\x97\x00\x57\x85\xb1\xe3\xb1\xcf\xab\xe0\xcb\xdf\xe5\xe6\x09\x10\x4a\x5d\x49\xc8\x30\xb6\x4a\x52\x3b\x33\x45\x65\xfd\x32\x19\xab\x24\xc9\xa9\x2e\x9f\x8a\x26\xe3\xf2\x5a\xd9\x7b\x60\x9e\xa8\x89\xe3\x61\x7c\x8a\x35\x4b\x6b\x36\xe3\x13\xac\x0d\xb4\x3a\x68\x6c\x5b\x4f\xeb\x88\xc5\x79\x69\xc9\x32\x5a\x9d\xfe\x50\x1b\x69\xea\xd0\x5d\x5f\xda\xab\x85\xf2\x68\x5a\x49\x22\xc9\x84\xf5\x4c\x26\xf1\x8d\xcf\x7e\x2a\x93\xa4\x42\x08\x90\x2c\xa9\xdb\xca\xab\xe5\xe5\xcb\x1c\x4d\x3e\x46\x97\x67\xcb\x94\x52\x71\x61\x50\x73\x9e\x94\x0b\xda\x6d\x29\x97\xeb\x07\x21\x7b\xdf\x15\xe5\xf3\xcb\x97\x8d\x69\x34\x23\xd9\x84\xa2\xe4\x08\xf5\x77\xb3\x98\x9b\xd2\xa7\xb1\xa6\x15\x1b\xf1\xc5\xf9\xe5\xbe\x81\x5c\x3f\x82\x47\xdc\x8a\x86\xdb\x4e\xa2\xdb\x34\x0c\x72\x41\x44\x95\x6e\x34\xc3\x92\x50\x90\x3b\xbe\xfb\x3d\x93\xfa\x24\x9f\x17\x79\x36\x40\xb7\x6c\xbe\x5f\x71\x12\x4f\xb4\xdf\x9f\x0c\x57\xf8\x89\xa5\xfd\xfe\x24\x57\xad\x27\xda\x0a\xb2\x3d\x5b\x5b\xe5\xf3\xb5\x58\x1b\x4a\xc4\xb3\xfb\x89\xa6\xad\xbc\x5f\x9c\xbf\x9a\x08\x57\x8d\xe3\x7c\x0b\x6a\x77\x8c\xa4\x66\xdd\x69\xca\x55\xa4\xaa\x73\x5f\x9c\x5f\x36\x7e\xa2\xa2\x6b\x57\x06\x82\x50\xa8\xd2\x44\x5e\xb8\x13\xfd\x93\x66\x36\xcc\x5b\x53\xfb\x2e\xd6\xcc\x95\xb9\xcb\xbf\xba\x2a\x8c\x0b\xcd\x5c\x15\xda\xd5\xfc\x5d\x51\x67\xb9\x41\x0f\xfb\xb6\x59\xfd\xed\xc3\xeb\xcd\x79\x40\xd4\x5d\xcd\x1f\xe5\xa6\x50\x4e\x8d\x95\x3c\x7f\xc0\x9c\x99\x27\xb8\x6f\xca\x54\x7e\x6d\xb3\xd1\xbe\x83\xc9\x6e\xb3\xd1\x4c\x48\x9c\x29\x3c\x4a\x71\xd8\x03\xa6\xe6\xaa\xcf\x28\xbe\x5f\x44\x2b\x0e\x66\xae\x58\x18\xc6\x47\xf9\x01\x9b\x3d\x3d\xbf\x78\xb5\xd9\x1c\xb6\x1e\x17\x9b\xd0\xc8\x6c\xac\x72\x6f\xe5\x8b\xc2\x80\x23\x9b\x6b\x73\x5a\x32\x3c\x3f\x00\xdc\x7f\xa5\x58\x85\x2a\x26\xb3\x3a\x5c\x01\xa2\x40\x86\x96\xab\x77\x0a\xb0\x6b\xe1\x12\xfe\x5c\xc2\xdf\x99\x09\x54\x53\x51\x87\xdd\x97\x08\x7d\x8b\x55\xb3\x14\xcc\x2a\x2f\x50\xca\x9f\xde\xf1\x41\x76\x67\xf8\x27\x26\x16\xc6\x78\xba\xc7\x94\x25\xd3\x56\x05\xb9\x0b\xf6\xed\xe8\x3e\x24\xf1\x8b\x0a\xbb\xba\x64\xe5\x87\x1a\xfb\x44\xce\xbe\x72\x41\x96\xcb\xa8\x71\x1f\xc5\xcb\x99\x86\x48\xc1\xd4\x92\x72\x1d\x59\x8c\xa9\x88\xc4\xfd\x6b\x30\x03\x7f\x39\xb4\x10\xf9\x7b\x94\x06\xcc\xbc\x8d\x42\xfa\x2b\x8f\x8d\xad\xdd\x44\xcb\x59\x16\x0e\xbc\x80\x9e\x94\xd1\x73\xea\xca\x9d\x91\x19\x35\x10\x1b\x45\xd1\x66\x13\x1c\x61\x9c\x6c\xbf\xc8\x70\x27\x42\x09\x8e\x75\xc7\x33\x64\xa5\xe5\xf3\xb7\xaf\xb8\x6a\x92\x25\xb8\xba\xf0\xe7\x37\x2f\x2e\xde\xbd\x7a\xf9\xe6\x02\xf4\x92\xd9\x13\x7f\xf9\xfc\xd5\xcb\x37\x7f\x06\x45\x24\xa4\x84\x82\xf1\xcd\x2f\x17\xef\x2e\x2f\x70\x7f\x82\x35\x91\xce\x5e\xbc\xbc\x7c\xf9\xfc\xd5\x05\xb6\x3d\xfe\x8e\x3f\x6a\x5b\x3d\xda\x6c\xf4\x68\xa7\x80\x0c\xb9\xf8\xef\x57\xe9\x21\xe5\xb0\xd8\xe9\x9d\x13\xee\xac\xe9\x5d\x74\x9f\xfc\x9f\x35\x59\x93\x9d\x78\x2b\xde\xfc\x10\xfb\x77\x24\xb9\xfc\x10\x40\x10\x61\xab\xf8\xf2\x59\x18\xdc\xc1\x86\x0e\xa0\x0a\x5b\x90\x95\x9f\x06\x26\xe7\x6d\xfe\x53\x14\x2d\xe1\x5a\x55\xd2\x7e\x11\xdd\x49\xaf\x52\xae\x82\x1b\x3d\x18\xe3\x10\x3c\xcc\x04\x15\x51\x5a\xb3\xb0\x27\x5f\xfa\x19\x95\x66\xf5\x77\x56\xff\x77\xbc\x62\xca\x4b\x42\xe5\xb6\xe2\x03\xfc\x73\x42\xfd\x98\x0e\x09\x22\xe1\x6c\x48\xb3\x9b\x27\xca\x16\xca\x9c\x2c\xa8\xdb\xef\x3e\x08\x67\xd1\x7d\x5b\x6c\xff\x8b\x2f\x8b\x88\xaf\xa2\x68\xb5\xbb\x02\x64\x94\x7d\x82\xe7\xc1\xf2\x2c\xa1\x0a\x65\x1d\x50\xc2\xbd\x7b\x65\xf6\xfa\xe9\xe2\xa2\xe2\x00\xd3\x3c\xc1\x5d\xe3\xdb\x54\x82\xdb\x76\xd7\x71\x1f\xf0\x3a\x41\x74\x17\xc0\x5b\xea\x13\x51\x89\x8e\x41\x18\xb3\xaa\x9d\xa2\xf0\x0f\x11\xac\x26\x31\xb6\x26\x6d\xe8\xd3\x0c\x5d\x05\x41\xc2\x59\xee\x22\x85\x9d\x5d\xa4\xa8\x28\x10\xb7\xaa\x55\x53\x8b\xc5\xf7\x4e\x48\x4e\x03\x5f\x09\x65\x54\x8c\x5c\x06\x40\xc2\xd9\x29\xcd\x85\x0f\xac\x80\x49\xc5\xb4\xbd\x83\xbf\x7a\x7c\xa7\x4e\xde\xd8\xf0\x28\xdf\x93\x88\x95\x63\x08\x1a\x6a\x44\x5b\x44\xe9\xcc\xfc\xd8\x51\xc5\x2e\x4c\xfd\x35\xee\xcc\x8d\x65\x1f\xf9\x29\x4c\x61\xda\x97\x3e\x70\xce\xcd\x76\x49\x5c\x11\x7f\x1f\x7c\x4c\x27\x98\xf0\x63\x93\x03\xfd\xad\x83\x22\xec\x6f\x24\x9c\xfd\xad\x11\x24\x0d\x1a\x45\x8d\xa5\x1f\xcf\x49\xbb\xf1\x3a\x4a\x68\x63\x19\x7c\x20\xcb\x87\x86\xdf\xb8\xf1\x67\x8d\xf3\xcb\x77\xa0\x12\xab\xf0\xd0\x3e\x4a\x4e\x30\x1d\x25\xe9\x8d\x02\x1f\x27\x52\x48\x0a\x70\x5f\xb8\xac\x8e\x6b\xe1\x1b\x68\x91\xee\xe1\x16\xb2\xdf\x1e\x8c\x93\x96\x3a\xa2\x9e\xea\x43\x72\x33\xa7\x8e\x6a\x7c\x4a\x9a\xcd\xb2\x53\xe0\xbc\x37\xa6\xb2\xb4\xfc\x69\xd8\xb2\xb3\x91\x32\xad\x72\x3c\xb4\xc6\x25\xf3\xde\x54\xf8\xf8\x21\xf6\xe7\x20\x76\x18\x68\x06\xd7\x38\xd2\x3a\x96\x8b\xc0\x3a\x3e\x26\xe1\x38\x99\x64\xe9\x74\xec\xf1\x46\xbd\x95\xfa\x5c\x81\x02\x8e\xe9\xab\xc1\xf2\x4c\x76\x5b\xbb\x08\xb5\x63\xb2\x24\x7e\x42\xf4\x5b\x63\x9b\xd6\x7e\x8e\xad\xd1\xfc\x24\x18\xcd\xd3\x7e\xbe\xc3\xcb\xf1\x7c\x32\xb6\x26\xe8\x81\xa7\xec\x09\xba\xe1\x29\x07\xee\x6e\xdd\xc0\x9c\x3d\xc7\x18\x2f\x9a\x4d\xfd\x0e\xb7\x6c\x03\xdd\x1d\x61\x3c\x6d\x36\xf5\xe9\x91\xb4\x6d\x11\xad\xd9\x6c\xea\xb3\x66\x53\xcf\x5f\x80\x99\x41\xeb\x19\x68\x5d\x10\xcd\x60\x03\xcb\x46\x35\xa7\xaa\xa6\x66\x18\xc1\x2d\xa3\x77\xb4\x62\x34\x71\x5d\x9d\xfd\xe9\xef\xeb\x20\x26\xba\x61\xa0\xd5\x23\x0a\xc1\x4a\x71\x10\x59\xee\xd3\xee\xce\x58\x95\xaf\x78\x09\xdb\xce\xd6\xc7\x60\x46\x22\xcd\x40\x12\x40\x5a\xa9\x16\x67\x55\x2d\x77\x91\xe8\x1a\xdc\xd1\xdd\xa1\x73\x7c\x97\x7a\xa8\xbb\x67\x49\xbb\xcf\x7a\xe0\xbe\x19\x81\x94\xc7\xe4\x91\xcd\x46\xa2\xcb\x6f\x67\x80\x98\x6a\xa0\xf3\x93\x7e\xb3\xa9\x9f\x9b\xb8\x6f\x18\x88\x21\x66\xd2\x5f\xb3\x59\x81\x99\xf3\x1c\x05\x18\x20\x16\x56\x42\xdf\xf0\xeb\x1f\x00\x29\x24\x45\xce\x48\x97\xf8\x7a\x74\x8d\xcf\xd1\x39\xbe\x44\x76\xf3\xbe\xd9\xcc\x15\x65\x2b\xa0\xb9\xec\x58\x49\x7b\x01\xa3\xb7\x48\xbc\xd9\xd4\x9d\x6e\x0f\x63\x7c\xdd\x6c\xea\xd7\xd8\xee\x1a\xc8\xe9\x7a\x18\xe3\x73\x46\x1c\x5b\x86\x81\xae\x4f\x9c\xae\x57\x5d\xe0\x79\x6b\x1a\x2d\xa3\xb8\xa5\x99\xd7\xac\x7d\xea\x60\x53\xc0\x73\x38\x3f\x65\x9b\xf2\x1b\x63\x66\xe2\x27\x27\x8c\x29\x1a\x80\x82\x05\xe8\x7d\x30\x23\xad\xe9\xc2\x8f\xb5\xd3\x27\xe6\x83\xa9\x9d\x1c\x33\x98\x53\x2d\xf3\x50\xfd\x50\xd4\x71\x9e\x3a\xdd\x6e\x15\x2d\x7e\x6c\x51\x4d\x4d\xe8\xb6\x1e\x84\xee\xab\xa9\x0d\x67\x26\xd6\x9a\xfe\xdd\x6a\x54\xd0\x27\x9d\x88\x17\x4b\x5a\xcc\x3f\x15\xf9\xf3\x5d\x7e\xaa\x72\x99\x99\xf8\xe1\x04\x6b\x0d\xed\x4c\x6b\x86\x37\xc9\x6a\xa4\x0d\x1f\xb6\x53\x7c\xb7\xdd\x7e\xd3\xe1\x96\x8d\xf9\x9a\x89\x2e\x8f\xb1\x36\xb6\x71\xe5\xb2\x5b\xd8\xe9\xd5\x2c\xbb\xd2\x41\xcc\x5d\x40\xd9\xb8\x05\x51\x41\x43\x9f\x05\x3d\x49\x0d\xc5\xb3\x51\x49\xc8\x2e\xdf\x12\x07\x2a\x97\xa9\xe3\xda\x92\xe4\x01\x6e\xad\x24\x3d\x99\x80\xcd\x4a\x28\xaf\x1a\xfb\x51\x6a\x64\x8e\x9a\x0f\x8c\xad\x09\xdc\xca\x23\xcd\x66\x76\x75\x14\x02\xb2\x28\x97\xfc\x00\xd3\xca\x77\xd1\x2e\xe8\x2d\xc4\xc5\x4d\xc4\x73\x10\xea\x41\x85\xf7\x5d\xb8\x68\xaa\x47\x4a\x09\x67\xb3\x49\x4e\x2c\x83\x17\x29\x3c\x60\x41\xf6\x71\x8c\x31\x8e\xce\x98\x40\x3c\xb4\xd0\x12\x47\x4c\xcc\x38\xa3\xec\x51\x21\x5f\x8d\x42\x05\xb7\x70\xe2\x59\xd7\xa5\x4a\x86\x08\xf9\x68\x29\x36\xb7\x0b\x9c\xb4\x22\xee\xbf\xec\x31\x14\x54\xb1\x33\x41\xcc\x5b\x18\x06\x8a\x8e\x30\x4e\xd2\x7b\xaf\xc1\x1f\x56\xec\x04\x59\x68\x2a\x1f\x1d\x29\x98\x21\x4f\x32\x34\xa4\xbb\xc6\x6a\xfa\x0a\x73\xb1\xcc\xf5\x41\xd0\x6c\xea\x01\xb6\xd3\x4b\x68\x55\x97\x22\x67\xc1\xc7\xdd\xb5\xc8\x48\xa8\x5c\x16\x5c\xdd\x12\x48\xe7\x46\x0b\x3f\x7e\x4d\xfc\x64\x1d\xa7\x30\xa6\xb6\xfa\xa4\xa1\x14\x8f\x46\x2b\x4c\x1e\x8b\xb4\x24\xb7\x14\xd3\x3a\xac\xfb\x60\x46\x17\x45\x24\xc8\x92\x05\xb8\x12\xce\x53\x3d\x6e\x51\x43\x60\x66\x9a\xb0\x77\x84\x2d\xb2\x24\xc6\xfe\x1e\x5d\xd8\x6e\x67\x90\x4e\x77\xd7\xe4\x13\x25\xe1\x2c\xd9\x6c\x72\xbb\x68\xd8\x84\x62\xa1\x4a\x02\x7d\xa8\xe8\xb6\xb7\xb7\x9b\xcd\xe7\xeb\x6b\xe8\xc6\xeb\xeb\xe1\x78\xb2\x0d\xc2\x84\xfa\xe1\x94\x44\xb7\x8d\x67\x71\xec\x3f\x34\x9b\xe5\x4b\x34\x19\x38\xa6\xdb\xdc\x57\xb2\x89\x0b\xa6\x87\x46\x10\x36\xa8\x41\xdb\x0b\x3f\x79\x7b\x1f\x66\x7a\xab\xd8\x80\x58\x52\xf1\x04\xd3\x71\x3c\x31\xb6\x92\xd3\x1d\xa8\x62\x4e\xc3\x27\x34\x19\xd3\x28\x4c\x68\xbc\x9e\xd2\x28\xc6\x74\x4b\x00\x0c\xd1\x1d\xfb\x61\xa1\x84\x89\xcf\x44\x25\x39\x0f\xe9\xb1\x31\xd4\x83\x1c\x58\xbc\x4b\xa3\x90\xdc\x37\x02\x63\xcb\x5a\xfc\x2b\x94\x6c\xb6\x65\xa0\x10\xc7\xfa\x00\x26\x17\xdd\x36\xd0\x12\xc7\xba\x63\xb3\xbd\xcd\x25\x5c\x0d\x6c\xdf\xc6\xd1\xdd\xb9\x58\xdc\x75\xdb\xb3\x0c\x34\xcd\xbb\xeb\x59\x20\x6d\xae\x29\x34\x75\x15\xe6\x85\xbf\xbe\x7d\xc7\x15\x78\x2c\xc1\xb3\x32\xdd\x1d\xa8\xed\x24\x55\xdb\xba\xca\xf1\x22\xb7\x7e\x4c\xd2\xe9\x93\xb4\xa7\xfe\x72\xc9\x55\x1b\x3c\x6e\x5c\xda\x3d\x61\xc1\xf0\x2f\x6c\x5f\xdf\x80\xfe\x05\xc7\x2c\x9d\x5f\x34\x71\xc0\x72\x72\x5c\x8e\x13\x96\x11\x84\x41\x76\x99\x38\xd1\x0d\x14\x66\x71\x08\xd8\xdb\xbb\x68\x46\xb8\x0a\x6c\xd9\xce\xe6\x8f\xd7\x2c\x53\xa7\x00\xb0\xf4\x13\x1e\x09\xe0\x45\x74\x1f\xbe\x0f\xee\x08\xb6\x58\xb6\x3f\xa5\xc1\x47\x52\xc0\xc0\x51\x7a\x58\x19\xa6\x0a\xb3\x40\xa7\x88\x14\x98\xa5\x54\x1e\x2c\x0d\x14\xa8\x3a\x1f\x4e\xbc\xa2\xef\xe3\xe0\x2e\x85\x2f\x78\xd2\xc9\x94\x72\xd7\x51\xc8\x80\xc0\xd6\x94\x63\x42\x60\x86\xd7\xd1\x47\xb2\x17\xf1\x75\x0a\x59\xc6\x66\xd5\x3d\x0c\x3b\x33\x3d\xcf\x61\xff\xbc\x3a\x0c\x97\x5b\xba\x6f\x0b\x2d\x24\xa2\x0f\x49\x6a\x7b\x70\x03\x94\xb5\x78\x76\xba\xcd\x5b\xa9\x1d\xdd\xde\xea\x1a\x8d\x83\x3b\x0d\x55\xb5\x5e\xce\x73\x50\x59\x28\x29\x5d\x39\x87\x3a\xcc\xa2\xfb\x50\xab\x6a\x12\xa3\x58\x66\xce\x52\xf2\x49\x43\x5a\xb8\xf0\x8b\xca\x26\xdf\x85\x7f\x74\xc1\xb2\x68\x04\x8a\x93\x20\x31\x90\x84\x72\xbb\xdc\xbc\x5b\x54\x31\x33\xe5\xa6\x31\x6d\xe1\x27\x19\x8a\x86\x3e\xcf\x09\x1d\x2a\x39\x5a\x0c\x34\x7e\x26\x94\x61\x5c\x16\xf4\x86\x2a\x88\x8b\x70\x96\xba\x75\xd1\x8f\xc8\x66\x73\x44\x0d\x11\x21\x90\x6d\xc0\xb9\x67\xd6\xb1\xcd\x1f\xec\x09\x13\x74\xc3\xf5\x1d\x89\x59\x67\x0c\x8f\xc0\xf3\xd9\x6d\x30\x5f\xa7\xcf\x5b\xe3\x90\x3a\x65\xe2\xc7\x7b\xf2\x89\x7e\xab\x4a\x31\xb9\x92\xd7\x87\x57\x4f\xd3\x46\x3b\xd1\x16\xf3\xea\x70\x19\x0b\xd4\x88\x01\x1e\x4f\x46\x41\xe1\x8c\x2c\xf6\xc3\x64\xe9\xa7\xea\xe8\x57\x41\x48\xde\x47\x7c\xd2\xd7\x0b\xbc\x37\x27\x14\x3c\x0d\x1b\xe8\xc8\x42\x10\x7c\x2c\x36\x8c\x4c\xc5\x14\xc1\x07\x4d\x7b\x14\x9d\x70\xc9\xd9\x06\x9f\x04\xe2\xf6\xbd\x44\x28\x62\x2b\xcd\xfe\x02\x24\xe8\xc8\x32\x46\x49\x3b\x48\x7e\x8d\x99\xe8\x36\x3b\x0b\xc6\x3b\xd7\xba\x13\x13\xfb\x43\x51\x19\x1f\xb6\xaf\xf9\x3e\xac\xfa\x34\xbc\x3c\xf8\xeb\x4c\x98\x85\x9d\xc3\x81\x85\xc8\x3c\x5f\xdc\xf9\x2b\x5d\x79\x31\x4d\x5c\x94\xd7\xa7\x08\xee\xc8\x19\xed\xbf\x47\x41\xa8\x87\xed\x20\x79\x7d\xf9\x2b\x68\xf1\x93\x33\xed\x2a\xbe\x0a\xb5\xa1\x76\x15\x6a\x07\xf0\x62\x7e\x9c\x16\x47\x9f\x3c\x91\x70\x3e\xaa\x98\x02\xf9\x1c\xf6\xba\x3c\x15\x24\x29\x40\xaa\x7e\x2e\xcd\x0d\x75\x8d\x58\x27\x3b\x73\xb7\x61\x96\x81\x4a\xd2\x34\x6c\x93\x73\x9c\xa5\x69\x4c\x4a\x41\x21\x0e\x90\x8f\xad\x91\xbf\x8b\x9a\xe5\xa7\x2c\xb6\xc4\x64\xec\x4f\x46\x91\x89\x97\x63\x7b\x82\x18\xad\xe5\xd8\x99\xb0\x0f\x9c\x62\xbf\xd9\x4c\x5a\x2d\x14\x40\x2a\x6c\xb5\x0c\xe1\x30\x21\xdc\x6c\x32\x4a\xdc\x63\x13\xdf\x98\x44\xed\x84\xf8\xf1\x74\xa1\x1f\x5f\x25\xe6\x77\xc7\x3b\xef\x31\xd3\x66\x53\x5f\xec\x36\x7b\x0b\xb6\xe9\x40\x8b\x13\x9c\x64\x83\x6f\xbb\x13\xf1\x33\xaf\x0a\x6c\xeb\x53\x6c\x30\x59\x55\x9f\x77\x23\x35\xfa\x46\x47\x59\x8a\x23\xf8\xdd\x89\x82\xb1\x35\x98\x98\x12\x24\xaf\x82\x70\xfd\xa9\xd9\x24\xa9\x45\x65\x7e\x12\xcb\x3c\x7d\xc0\x2b\xae\x4b\x08\xc9\x7d\xb2\x9b\xb9\x65\x9c\x32\xaf\x48\x75\x2f\x9d\xf3\x55\x1e\x7e\x94\x55\x17\x5c\x37\xb1\x6f\xfe\x04\xcd\x45\xdd\x0c\xba\x95\x16\x3a\xf6\xee\xd9\x72\x59\x35\x76\x02\xb1\x52\x3d\x5b\x2e\x9f\x81\xf0\x96\xd9\xfd\x56\x0d\x0f\x2e\x56\x29\x16\x4e\x4e\x50\x48\x5d\xd9\x21\x4b\x15\x99\x39\xe1\x02\x24\x1f\x64\xe7\x51\x14\xcf\x54\x1e\xbc\xe0\x5c\x82\xbf\xd5\x89\x42\x1a\x10\x59\x39\xf9\x56\xb9\x5d\x57\x28\x2a\x60\x32\x4e\x59\x67\x6c\x4d\x5a\x2d\x04\x53\x3d\xff\x63\x4a\xa7\x1f\x3c\xf4\x53\x45\x2d\x40\x20\x11\xb6\xc6\x77\xd1\x3a\xa4\xf5\x55\x49\x6f\xc0\xbd\x8f\xd2\x3d\xb5\xaa\x6e\x06\x1b\xfc\xd2\x79\x16\x2b\xfb\x53\xa9\xd6\x62\x97\x9c\x55\xe8\x14\xf3\xc0\x3c\xf1\x99\x35\xd4\xe9\x29\x98\x65\xb6\x30\x13\xa8\x76\x23\x3e\xd3\xfb\x50\xd4\xea\x5a\x06\x62\xff\x75\x7a\x8c\xbb\x96\x71\x0c\xef\xfc\x9b\x44\xa7\x86\x09\x69\x08\x67\xa1\xdb\x9d\xa7\xd4\x90\x39\x22\x9b\x64\x0b\xd5\xb6\xc0\x8f\xcc\xcd\x9a\xd2\x28\x64\xf2\x09\x44\xba\x27\x21\x7d\xc1\x55\x97\xd9\x44\x3d\x8b\xfd\x79\xa1\xed\x32\xfb\x57\xd1\xba\xe7\xcb\x60\xfa\xe1\x9c\xbd\xd2\x09\xb8\x40\x58\x04\xb7\xf4\xcf\xe4\x41\x1c\x13\x45\xe1\x25\xcb\x00\x28\x9d\x88\xc8\x40\xbc\x81\x32\xc4\x1d\x28\x78\xdc\xc9\x60\x9d\x3a\xd8\x17\xd1\xfa\x26\x07\xeb\x2a\x60\xd3\x4d\x3e\xb0\xfd\x6a\x07\x2c\x6a\xe0\xcf\x66\xfb\x17\xa0\x23\x4b\x6a\x52\x25\x5e\xed\xb6\xa8\x20\x22\x17\x4d\x6f\x2a\x04\x66\xb6\x3a\x6a\x55\x5b\x23\xa5\xe4\x7d\x10\xd9\xf5\x4a\x53\xef\x79\xe4\xee\x7e\x19\x52\x12\x7f\xf4\x97\x6c\x03\x19\xe3\x84\xd0\x34\x43\x31\xbb\x93\x3c\x22\x9b\x4d\xba\x96\x3c\x19\xab\x17\x7c\xc5\xec\x5c\x5d\xab\xea\x9d\xcf\xd7\xb6\x57\x35\xe5\x9a\x26\x03\xd9\x26\x6b\x96\xda\x06\xdc\xd7\xbe\x6c\xf1\x91\x46\xee\x6e\xe4\x54\xce\xe8\x49\x61\x0d\xca\x4e\xb0\x4b\x2f\x2f\xc2\xd4\xc7\x92\x6a\x66\xd7\x89\x62\xd6\xc8\x0d\xc5\x03\x3f\xfe\x8a\xfb\xfc\xb3\xd0\x9e\x25\x2c\x35\x69\xad\xd5\x47\x54\x7f\xa6\xbe\x22\x35\x88\x75\x8d\x03\x6b\xbf\x95\x4d\x21\x79\x19\xbe\x92\x1e\x13\xee\xc7\x35\xaf\xad\xc9\x04\xe4\xc2\x5a\x10\xd3\x94\x9b\x3e\x37\xb3\x55\xba\xff\xac\xa8\xfe\x68\x57\x4b\x75\xf3\xfe\xfa\xf6\xdd\x8b\x6c\x02\x67\xaf\x7e\x8d\xe2\xd9\x33\xaa\xab\x16\x8e\xdc\xa4\xf9\x87\x97\xe3\xd5\xcb\x37\x17\x85\x72\x30\x49\xfe\x99\xd8\x32\x95\x8b\x22\x2f\x35\x8a\xf2\xe8\x21\xb9\x6f\xbc\xf0\x29\x31\x58\xbf\xb1\x51\xa5\x1b\x23\x9d\x8a\x73\x15\x49\x27\x76\xda\xb1\x2c\xae\xb5\x6b\x5f\xcf\x02\xae\xc4\xfd\x21\x8e\xee\x5e\xa5\x80\xd9\xe5\x76\x62\x9c\xda\x96\x91\xd5\x67\xb7\xbc\xb0\xfd\x44\x05\xf5\xec\xbe\xef\xb2\x4c\x0e\x8f\x49\x7b\xe5\xcf\xc9\x5f\x10\xff\xfb\x5b\x6a\x91\xb3\xa3\x6b\x9a\xa5\xfa\xd7\x96\x4f\xe5\x93\x24\x13\x1e\x76\x92\x82\xba\x34\x4c\xb4\x12\xe5\x31\xd0\x5e\x60\x3b\x05\xfe\xad\x4a\xcc\x60\xb3\x6e\x25\xaf\xc8\xe3\xee\x4c\x3d\x7e\x2e\xc2\xd9\x2e\xe2\xb8\xe2\x9d\x3d\xe1\x3a\x86\x9d\x95\xd8\x63\xe7\xbb\x9a\x29\x08\x0b\xee\x3c\xab\xf9\xfc\x49\xed\xac\x50\x8d\x69\x4d\xb0\x35\xac\x7b\xab\x10\x8f\x87\xf5\x45\x65\x03\x3a\x9d\x63\x38\xb5\xf7\x51\x3a\xa6\x2b\x3e\x54\x29\xda\x15\x9b\x4c\x12\x9b\x77\xed\x56\xc6\x3c\xb5\x6a\xeb\xac\xa8\x55\x2b\x0d\x0d\x5d\x26\x75\x62\xd5\xcc\xd3\xd0\x80\x15\x73\x7c\xa1\x67\x6e\xf2\x06\x8f\x45\x77\xed\xfb\xe6\x76\x4e\xa7\x62\x66\xe7\x65\x00\x17\xef\xa0\x56\xa8\x9e\xe0\x39\xa4\x69\x6e\x99\x14\xca\xca\x8d\x2b\x47\xc1\xd8\x62\x44\x84\x12\xad\xba\x48\x62\xb6\xca\x09\xa6\xe5\x69\x22\x6b\x4a\x59\xa8\x2a\x37\xb3\x6c\xeb\x26\x9c\xb2\x04\xc9\x4a\x92\x64\x38\x0a\x3a\xb2\xbf\xa0\xff\xf1\x58\xd9\xfb\x52\x8c\x2c\xb6\x83\x2b\x9b\xc4\xb1\xdd\xd4\xa4\x72\xbc\xe0\xb1\x1c\x69\x8b\x51\x99\x94\xb6\xc8\x15\x53\xd5\xcf\x2b\x85\x5c\x53\xad\x96\x2a\x11\x99\x46\xe1\x47\x12\xd3\x5f\xc4\x75\xd6\xf3\x68\xf9\x3e\xca\xbc\xba\x80\x07\x3a\x85\x8d\x82\x60\x43\x36\xb7\x05\xd8\x1a\xb1\xc4\x29\x0e\x20\xec\xab\xc5\x23\x6f\x72\x89\x21\x6e\xb5\x46\x3b\xd7\xb9\xe5\x3d\x2d\x1f\xdd\x95\xb3\xac\xa4\x43\x8d\x0f\xd0\x3f\xf2\xce\x4d\x8d\x26\xf7\x57\x8e\x1f\x12\x45\x38\x40\x09\x44\xeb\x6b\x45\x28\xc4\x16\xe8\xcc\x82\x5b\x9d\x7b\x38\x89\x53\xf7\x09\x91\x21\x4c\x34\xa2\x53\xab\xd9\x2c\xbf\x6c\xd9\xc6\xc8\x88\x5a\x2d\x1e\x9c\x2c\x38\x89\x33\xd5\x4f\x09\x32\x30\x19\x64\x60\x9a\xdb\xcc\xb2\x6b\x09\x1f\x47\x0b\xf8\x03\x04\x40\x86\x1b\x2f\x79\x3b\xea\xa1\x69\xa2\x65\xab\x65\x20\xd8\x49\x8e\x17\x22\xdb\x37\x4d\xb4\x30\x4d\x83\x17\x48\xd8\x3a\x06\x09\xab\x22\x6b\xdc\x4b\xb2\xf2\x63\x9f\x46\xb1\x5e\x28\xa5\x31\x32\x04\xf5\x96\x5d\xa6\x1f\xb5\x5a\x2c\x21\xea\x60\xda\xb9\x5a\x1c\x42\x9e\x55\xcd\x18\x19\xa2\x94\xa6\x5d\x2a\x27\x0a\x78\x42\xa8\xfc\x84\x3e\x2a\x32\x93\x56\x88\xf8\x67\x86\x3b\xb3\x90\x56\x64\x86\xa6\x6f\xca\x81\x21\xa3\x65\x52\x3e\xb7\x2a\xc8\x80\x75\x32\x9e\x58\x51\x32\xb7\xfc\x4a\xc1\x7c\x4c\x85\x59\x35\xe3\xbb\x8a\xe5\x3b\xbf\x53\x48\x95\x7c\xca\x32\xa5\xab\xd8\x57\x94\x2a\x37\xfb\xf0\x37\x7e\xbc\x5b\x40\x7f\xf1\x97\x6b\x92\xbc\xe3\x66\x85\x33\xdd\x38\x13\x85\x1f\x8a\xbf\x66\x5a\x3a\x5e\x9b\x52\x19\x15\xbd\xa9\x90\xc3\xb4\x86\x6e\x8c\x27\x9f\xb7\x4f\xae\x34\x2d\x73\x11\x4e\x8c\x53\x6c\x29\xab\xcc\x45\xe0\x03\x77\x5b\x6c\xf6\x23\x87\x34\xb2\xcc\x05\x5b\x44\xb7\xba\xdf\x86\xf5\xfd\xe2\x2e\xa0\x94\xc4\xc6\x88\xe6\xce\x92\x79\x58\x70\xbc\xfe\x36\x4e\x72\x1f\x79\x83\x45\x3a\xe4\x53\xdc\xec\xd8\x73\x14\x51\x6a\xb9\x9d\xa2\x57\xde\x03\x42\x76\xf5\xa6\x55\xbd\xe3\xad\x3a\x77\x24\xf9\x33\x3a\x85\xca\x58\x3e\xa9\xcb\x5f\x58\x93\x4a\x71\x36\xb6\x50\x6a\xc1\x94\x2f\x79\x59\x7f\x2e\x76\xbb\x90\x59\xcf\xf2\x65\x4a\x43\x05\xa1\x2f\x3d\xa0\xac\xa9\xfc\x45\x38\x7b\x74\xd5\x0f\x50\x1c\x83\xb5\xbb\x4a\x86\x68\xd9\xe5\x56\x83\x9a\x9d\x1d\x49\x0d\x20\x64\xac\xda\x56\x1b\x2b\x48\x31\x51\xaf\x92\x41\x54\xac\x03\x7b\x98\x4a\x8c\x72\x8f\x72\x01\x30\x15\x0f\xe5\x0d\xc7\x78\xa7\x2d\xfe\xba\xb2\x71\x69\xd4\x50\xe4\xca\xe5\x65\xfc\xc2\xd5\x56\xfb\x18\xa4\x10\xa8\xa9\xb2\x69\xd5\x1a\xd4\x52\xa9\xd3\x53\xea\x44\x3e\x6e\x6f\xb0\x89\xfa\x94\x82\xa4\x9c\x3b\x92\x6e\x36\x99\x70\x70\xca\x9a\xa1\x68\x82\xa7\x38\x2b\xc9\xf3\xa0\x5a\x79\x24\xb5\x7d\x0b\x13\x45\x73\x49\xe0\xbc\x09\xab\x80\x55\xb0\x27\xd6\x99\xae\x9c\x00\xd1\x91\x65\x0c\x55\xa5\x51\xce\x03\x40\xa9\xb2\xf4\x6c\x37\x75\x64\x1b\x99\x25\x5d\xd1\x9e\x08\x07\xff\xad\x2b\x40\x76\x6a\xcb\x6f\x83\x66\xea\xf3\xf2\x8a\x90\xfa\x90\x49\x6d\x26\x85\xae\x25\xc9\xbc\xc9\x60\x71\xf2\x94\x37\xac\x12\xe6\xb2\xe2\x06\xee\xbb\xe8\x9e\xdf\x2a\x4d\xd5\x95\x4b\x3f\xa1\xef\xc8\x34\x8a\x67\x64\x26\xe4\xe3\x82\x3a\x33\xff\x3e\x95\x8b\x8b\x14\xb2\x19\x27\x0a\x75\x8d\x97\x25\x3d\xa4\x2c\xb8\xba\xc9\x5f\x88\x53\x60\xc6\x24\x09\xfe\x41\x0e\xc4\x2c\xb5\x84\x42\xeb\x5f\x28\x48\x14\x72\x62\x05\x42\xb9\x18\x64\xf2\x6c\x1c\x49\x7e\x7a\xb6\xc8\x52\x2e\xc1\x8a\xc3\xd6\x54\x3b\x23\x9f\x84\x9d\x5a\x85\x21\x2e\x03\xa4\x77\x55\xca\xdd\x35\x22\x29\x2b\x4b\x1d\x59\x41\x49\xdd\x50\xc2\x50\x35\x08\x49\x3d\x36\xb7\x34\x2d\xf6\x52\xe1\x14\xe1\x51\x84\x38\xff\x0b\x98\x6a\x8e\x4a\x2b\x5f\x58\xc3\x46\x3a\xd9\x6c\x68\xa6\x86\xac\xe1\x47\x19\xb7\xae\x0d\x16\xb5\xc5\x7e\x2a\x13\x53\x35\x89\xc2\xfc\x59\xa6\x5e\xf7\x7d\xa3\x3c\x84\x1f\x51\xba\xaa\xa1\x0b\x05\x2d\x87\xc8\x2b\x70\xb3\x24\x28\x56\x91\x92\x7a\x84\xdf\xca\x13\xde\x23\xe4\x1e\x29\xcc\x20\xd5\x98\x65\x45\xc5\xf0\x4b\x18\xe3\xac\x48\x64\xf8\xc8\x11\x55\xb6\x04\x18\xe5\xc6\x65\x51\xaf\xf2\x54\x3d\x22\xd5\x7d\x9b\xba\x6e\x39\xc2\x38\x1b\xb2\x95\x40\xb8\x1c\x2a\x26\x9d\xa8\x14\x9b\xbf\xdc\x79\x77\x3d\xd1\x63\x65\x71\x8d\x96\xa2\x66\xa3\x12\x37\xe7\x34\x61\xe8\xa8\x1c\x92\x3e\x0a\x7f\x5d\x10\x52\x2c\x9a\x88\xac\x07\x9e\x93\xa9\xff\x5b\x5a\x56\x7b\x24\x72\x84\xb6\x16\x10\x61\x82\x6e\xbf\x78\xfb\xfa\xfa\xc5\xc5\xab\xf7\xcf\xae\xb9\xae\x59\xdd\x39\xc3\x03\xf0\x7f\x7a\xf6\xa7\x8b\xdd\x8d\xe0\x32\x05\xc5\x00\xae\x58\x3b\x76\xde\x76\xb2\x7a\x3c\xa5\x48\xb6\x0b\xd8\x4a\x52\x54\xb4\x9e\x2e\xf8\xce\x4a\xda\xba\x32\x5e\x86\xf7\xbf\x61\xd2\xa6\x2c\x01\xc1\x7a\xf8\x21\x82\x92\x50\xdd\x09\xc2\x8e\x5a\x4b\xa6\x36\xda\xff\x41\x04\xe1\x0f\xf7\xb2\xa3\x89\x55\xf5\xde\x09\x49\xe9\xa0\xdc\x2b\x1e\xe5\x5d\x6f\xe4\xa3\x96\x9c\xed\x4c\xf3\x8e\xaf\xe2\xb3\xab\xf0\x78\x8e\xb4\xab\x58\x33\x86\x64\x17\x41\x3f\xca\x42\x53\xc0\x4c\x98\xf9\x78\xd5\x6e\x83\x4f\x64\xa6\x21\x5a\xb8\x38\xa1\x39\x16\x4c\xcb\xc5\x79\xb3\x94\x0b\x17\x33\xd8\x6e\x39\x20\x21\xfd\x4b\xcb\xb6\xc4\x5c\x9e\xbf\xec\x21\xde\xfe\x26\xbd\xfd\x07\xd7\x6a\x6a\xb6\x65\x59\x2c\xf7\x36\x9a\xae\x13\xbd\x4a\x7e\x90\x8a\xcd\x77\xd7\x85\x32\x17\xb2\x44\x89\x0b\x79\x50\xde\x42\x0e\x2b\x62\x21\x43\x94\x8a\xef\x43\x3a\xc6\xa3\xfd\x7f\x80\x1e\x86\xac\xfc\x18\xc2\x0d\xfd\x10\xc5\xef\x53\x61\x33\x40\xb4\x3d\x8d\x56\x0f\x72\x14\xd5\xd4\xad\xf9\x0d\x1b\x4d\x24\x06\x73\xca\x97\x17\x67\xc2\x22\x6e\xba\x0c\x56\x37\x91\x1f\xcf\x5e\xf8\xd4\x6f\x27\x84\xb2\xbf\xba\xc6\x2d\x73\xe3\x92\xc5\xda\x90\x54\xc1\x53\xf2\x89\x1e\xaf\x96\x7e\x10\xca\x58\xaa\x51\xc9\x2a\xe2\x27\x94\xa8\x8a\x0b\xb1\x5c\x68\xb4\x62\xed\xe1\xcf\x7d\xde\x45\xc2\x78\x37\x83\xdb\x39\xc0\x8e\x71\xa0\xc7\xa8\x58\x3f\x61\x2e\x6a\xec\xe2\xfe\x41\x58\x5b\x08\x44\xe5\xb3\xf5\x1a\x9a\x14\x3c\x3d\x09\xf3\x39\x28\x0d\xf7\x8e\xd6\x9e\xfa\xe1\x94\x2c\x75\x62\x6c\x47\x07\x35\x5b\xb3\x19\xeb\xca\xe6\x9c\x17\x9a\xd3\x90\xda\x8f\x21\x96\x9b\x74\xae\x68\x52\x7e\x28\x70\x17\x7d\x84\x6e\x67\xb2\xc0\xcf\xe1\x8c\xc4\xfc\x94\x19\x2e\x10\xe3\x08\xd1\x76\xcc\x78\x12\x4e\x9d\xab\xb8\x80\x8f\x52\x44\x45\xfd\x4b\x3d\x05\x91\x64\xd8\x33\x4c\x9b\xff\x7b\x35\xe9\xdf\xf5\x6a\x52\xcd\x8d\x9f\x34\x12\x61\xf5\x6d\x9f\x20\x17\x5d\x9a\xa2\xa0\x7d\xcd\x9d\x59\xa4\xbb\xd3\x18\x05\xa5\xbb\x35\x07\x18\xf4\xc3\x04\x59\xaf\x23\xbb\x06\x98\x3f\xe4\xfa\x00\x9f\x7b\xf7\x7c\x8e\x03\x3d\xce\x44\xfc\x4e\x6c\xbe\xeb\x6c\xe3\x04\x8c\x68\x2e\x71\x8e\x38\x8b\x84\xf4\xaa\xa7\xaa\x8e\x12\xdc\x9e\xc8\x90\xc2\xd7\x90\x0a\x53\x5a\x4f\x7d\x11\x24\x41\xab\x03\x67\x0b\x8f\x66\xd5\x82\xc0\x6a\xa5\xb5\x06\x83\xc1\x80\xdc\x55\x40\xe6\x83\x54\x6a\xbf\x56\x91\x23\x34\x8b\x56\xa0\x6b\x7e\x1c\xf8\xe9\xdd\x7d\xa4\xd1\x78\x4d\xb2\x8a\x15\x18\x4d\x71\x87\xb5\x48\x77\xcf\x56\x9f\x14\x5a\x9d\x6d\xf3\xa5\xf3\xe5\xf4\x75\x85\xa6\xae\x5c\x8f\x39\xa1\xcf\x99\xa0\x1e\x84\xf3\x73\x10\x2a\xde\xc1\x4c\x38\xe2\xa2\x32\xb0\x6f\xb3\xc9\x1f\x16\x62\x2f\xa2\xe7\x58\x1b\xe7\xa0\xf2\x2c\x88\x77\x08\x99\x8d\x3a\x47\x10\xe0\xa8\x00\x5d\x54\x04\xf0\xb5\x09\x5c\xea\x06\xff\x20\xd3\x85\x1f\xce\xc9\x4c\x03\xff\x4a\x74\xab\xc7\xba\x6d\x48\xe7\x22\xe7\x39\x2d\x52\xf4\xbf\xb3\xf8\xff\xc0\x59\x3c\xbb\x83\x5f\x39\x87\xc7\xed\x6b\x9f\xb5\x2e\x5c\xab\x84\x76\x06\xcf\x72\xe0\x22\x31\xa6\x5c\xc6\xb4\xd8\xf3\x32\xd5\x0a\xc6\x8f\x9f\xd4\xef\xfc\x4f\x5c\x25\xb0\x67\xa6\x85\x92\x64\x67\xa3\x49\x1e\xb2\x10\xe1\x75\x57\x56\x62\x20\x1e\xeb\x3b\x3b\x06\x16\xaa\x52\x61\x00\x93\x86\x7c\x4d\x4d\x71\xe0\x0b\xe2\x48\x65\x4e\xe8\xf9\xc3\x74\x19\x4c\xf9\xc1\x7e\x6c\xa4\xfe\x71\x78\x83\xe4\x02\x57\x64\x0d\xf1\x87\x2c\x3a\xcb\x43\x9a\xa2\xaa\x11\x82\x5b\x9d\x9c\xe6\x41\x0c\x29\x74\xbd\x88\xd6\x7e\x42\x20\x62\x7b\xa1\xde\x93\xa2\x8b\x21\xd1\xa7\xe4\x0f\xa9\xd6\x6d\x14\x5f\xf8\x53\x45\xbd\x72\x0b\x9f\x34\xc8\xf2\xe6\x21\xe9\x3d\x21\x30\x11\x09\x4e\x62\x30\x0f\xa1\x3a\x38\xb8\x84\xc8\xff\xb0\x03\x7f\xc4\x22\x3c\x27\xb4\xf2\x90\xa3\x8e\x13\x88\x31\x91\x2e\x66\x2a\xdd\xe6\xd5\xd3\xc0\xa5\x6b\x19\xab\x75\xe9\x3a\xd2\x5e\x22\x85\x7e\x9e\x64\x9e\x0d\xb3\x18\xe3\xf0\x98\x0d\xae\x33\xdd\x34\x25\x96\x2d\x03\x65\x2b\x4d\x9e\xad\x8d\xfc\x12\xc1\xef\xbe\xda\xa9\x52\x4e\x7c\xad\x6c\x9a\xb9\x2a\xba\xdf\x3b\xb4\x69\xf3\x24\x5b\xad\x96\x2d\xb5\xf4\x6a\x19\x4c\x49\xa5\x05\x11\x84\xa1\x77\x46\x81\x1c\xda\x99\xf1\x4a\x3c\x0e\x5a\x4e\x3e\xb4\x73\x30\x11\x77\xce\x18\x85\x08\x93\x51\x74\x52\x28\x00\x85\xfb\x93\x7b\x0b\x1d\x19\x07\x4c\x1f\x91\x49\xb3\x09\x44\x90\xc7\x74\x1b\xdc\xea\x71\xb3\xb9\xb3\xc7\xe3\x05\x29\x40\xd9\xa3\xe8\x94\x15\xad\xd5\x3a\xa0\x24\xbb\xe0\xc1\x87\x14\xc9\x98\xe4\x6e\xf8\x59\xa3\x28\x33\xce\x39\xac\xde\xc4\x64\x35\x8f\xc7\xd1\x64\x67\x6f\x2a\xb8\x21\x73\xa9\x58\xe4\xae\xe2\x85\xd0\x12\x6c\xab\x08\x3b\x2a\xf3\xa1\x89\x93\x22\x83\x17\xe1\x65\x1e\x4d\x8c\xbc\x23\x65\xf1\x35\x1c\x67\x41\xd8\x0b\x9c\xc5\x50\x64\x5d\x5d\x71\x2e\xcd\x39\x29\x4c\x43\x34\xcb\x85\x2c\x8e\xc2\x56\xfa\x9c\x2f\x18\x29\xdf\x77\x5b\x04\xb7\xa9\xb4\x9a\x48\x3b\x69\x70\x5b\x43\x4f\xb0\x65\xf0\xe9\xfd\xc4\xda\x6c\x32\x57\x82\xa2\x1c\x52\x4c\x6f\x28\x51\x23\x65\xf5\x46\xb4\xa6\x8d\xe8\xb6\x11\x33\xa9\x4e\xe3\x2e\x78\xcc\xf8\xc4\x92\xf1\xce\xfd\x30\x8c\x68\x03\x4a\xd4\x10\x2e\x88\x12\x70\x2e\x1f\x40\x64\xf0\x87\x28\x9c\x35\xc0\x62\xa7\x61\x71\x42\xf1\xa9\x95\xf1\x2d\x67\x56\x6b\xc7\xac\x09\xa1\x8c\x4d\x4c\x71\xee\x38\xe7\x8f\x46\x7a\xde\x49\x4c\x6a\xc6\xad\xc2\xba\x14\xdc\xea\xc1\xa9\x65\xec\x62\x38\xa5\xfd\x16\x14\x06\x4f\x89\xb1\x52\x97\x45\xe9\xcc\x21\xf7\x8b\xa9\x9a\xc3\x38\x7f\x14\xc7\x40\x6e\xd0\x57\x95\xbe\x6c\x2c\x56\x1c\x17\x8a\x35\x45\x9a\x53\x4d\x62\x7c\x5f\xac\x41\x8d\x98\x1d\xc4\xd3\xf5\xd2\x8f\x5f\x05\x09\xdd\x2b\x67\x7f\x13\xd3\x23\x90\x48\xb3\x2b\x8a\xf9\x87\x55\x14\x2d\x77\xbe\x33\x83\xf0\xe7\x84\xe0\xcf\x5b\xd5\x31\xa8\xf0\xd8\x55\xde\x21\xed\xee\xfe\xe1\xdd\x2d\x13\x46\xb5\xe8\x81\x9c\x4b\xc9\x6f\xc8\x7d\x7a\x8e\xc3\x61\x56\xd1\x2a\xbb\x8f\x07\x1f\x1f\xc3\xe6\x6a\xb7\x49\x24\xed\xb7\xcf\xff\xeb\xe2\xfc\xfd\xf5\xcb\x17\xd7\xcf\xde\xbf\x7f\xf7\xf2\xf9\xcf\xef\x2f\xd8\xdc\x88\x68\xd9\x91\x16\xf8\x2c\x2c\x78\xb8\x60\x03\xef\xf1\xb4\x15\x63\x2a\x5a\x2f\x67\x0d\x36\xac\xc4\x57\x1a\x7e\x98\x8e\x2d\xc8\x7e\x20\xb4\x21\xda\x67\xa6\x19\x23\x1e\x65\xb2\xf1\xf8\x4f\x67\x17\x26\x48\xe6\x33\x4d\xcf\xbc\xa6\xf2\x06\x03\xa7\x03\x65\x9f\xb9\x59\xeb\x4a\xbd\x53\xe5\x4c\x69\xc7\x0a\x4c\xc0\x26\xed\xeb\x08\xf8\x4e\xdc\xd2\x18\xed\xa2\x90\xef\x2d\x35\x8a\xdb\x34\x35\xb6\xb5\x2d\xc3\x28\x77\x4c\xa1\x36\xc5\xb9\x99\x3b\xd3\x7b\xe3\xdf\x81\x7a\x95\xe4\x9d\x72\x6b\xe2\x4c\x22\x50\x7d\x12\x6b\x33\x9f\xfa\xad\xe8\xe6\xef\xad\x60\xa6\xa1\xa0\x50\x7a\x08\xca\xad\x72\xa0\xfc\x87\xdb\x7c\x80\x1a\x1d\x4e\x85\x2b\x23\x15\xa6\xa6\x91\x14\x4c\x23\xbf\x55\x68\x7e\xdb\xe6\xb1\xf9\x6d\x08\xce\x1f\xeb\xb6\xcb\x5d\x11\xd9\x8e\x81\xfc\x1d\x07\xcc\x49\xba\x46\x3d\x7f\x78\x99\x73\x2c\xc9\x97\x01\xb6\xaf\x3d\xc2\xd8\x17\xbe\x00\x46\x4b\xac\x2d\x18\x84\x86\xf1\x3c\xa2\xf4\x01\x0c\xcf\xce\x60\x2b\xdb\xfe\x91\xa5\x75\xdf\x18\xb2\xc7\xa8\xfd\x17\xf1\x28\x5c\x9e\xe9\xda\x82\xd2\x55\x32\xd4\x70\x7a\x97\x7e\x19\xf1\xe0\x49\x9c\x2d\xa6\xd1\xf2\x4c\xbb\x4f\x92\xe1\xf1\xb1\x36\xd4\xee\xe1\xaf\x61\x96\x41\x17\x51\x42\xa5\xcc\x95\x4f\x17\xa1\x7f\x47\x4c\xed\x3e\xd1\xd0\x54\xa2\xcf\x7d\x0e\xa0\x35\xec\x20\xc3\xf6\x79\x14\x86\x5c\x67\xfd\x83\xcf\x76\xf4\x0f\xfa\x02\x25\x59\x21\x12\x03\xcd\x84\xc3\xed\x5f\xc9\xcd\xfb\xf7\xbf\xe9\x4b\xb4\x46\x53\xc4\xab\xeb\xaf\xe9\xe2\x9a\x46\x1f\x48\x68\xb4\xa3\x15\x09\x75\x63\x24\xbe\x26\xdb\xa2\xac\xc3\x65\xe4\xcf\x34\x94\x1b\x7d\x33\xdd\x40\xcb\xf6\x74\x19\x25\x44\x37\xb6\x2a\x25\x79\xfe\x0c\x6d\x77\x42\xa1\x47\x70\x69\x31\x7f\x58\x96\xdd\xe4\x1e\x93\x09\xf7\x81\x47\x4d\xdb\xa8\x5c\xfa\x6f\x83\x70\xd6\xb8\x03\x76\x69\x3c\xd1\x4c\x62\x6a\x4f\xda\x3b\xbf\x69\x74\xcb\x25\xb8\xcf\x5a\xfb\xd8\xa7\xd4\x9f\x2e\xc4\x1f\x6d\xd8\x45\xe5\xbc\xf6\xdf\x93\x62\xf6\xca\x9f\x7e\xf0\xe7\xa4\xfd\xf7\x24\x0a\xb5\xa1\x6b\xb1\x57\xb7\x01\x65\xff\xb5\xa1\x97\x7b\x02\xcc\x2c\xa3\x84\x66\x43\xfe\x7a\xb9\x4c\xa6\x31\x21\x61\x2e\xa9\x0d\x7b\x95\xef\xda\xd3\x24\xd1\x86\xae\x53\x0d\xc0\xbe\x59\xc6\x2f\x7d\xda\x65\xaf\x05\xe3\xcf\xa2\xf2\xdb\x4e\xf1\x6d\x96\xd2\x86\xfd\x8a\x37\xf0\xcd\xfe\x76\x14\xb4\x3f\x90\x87\x44\xb1\x63\x12\x83\x9a\xbd\xd5\x13\x63\x8b\x82\x76\x4c\x92\x68\xf9\x91\xe0\x08\x91\x36\xf9\xb4\x8a\x62\x9a\xe0\x00\x05\xed\x60\x86\x9d\x41\x91\x4d\xd8\x1c\x99\x82\x7c\x66\x7c\x3f\xe4\x9e\x3f\xdb\xa2\xcb\xd0\x9d\x1f\x84\x43\x6d\xd7\x59\x68\x15\x07\x1f\x7d\x0a\xf3\xc3\x81\xa4\x58\xd7\x09\x3a\xa2\xdf\xea\x88\x48\x4c\xc7\xe7\xa5\x06\xc4\xf6\x6c\xdc\xfa\xc1\x92\xcc\x86\x8d\xe3\x45\x74\x47\x8e\x1f\xd6\x33\x3f\x38\x66\x03\x32\xf8\x48\x8e\x57\x71\x34\x5b\x4f\x69\x72\xec\x58\x76\xf7\x18\xc6\xd8\x71\x12\x4f\x8f\xe7\x01\x5d\xac\x6f\xda\xd3\xe8\x4e\x20\xf0\x57\x7f\x4f\x8e\xc3\x68\x46\xae\x39\x23\x27\xc7\x50\xd8\xe3\x65\x70\x73\xec\xcf\x66\x51\x98\x54\xf3\x48\xe3\xe7\x90\x7c\x5a\x91\x29\x25\xb3\x06\x8c\xdf\x86\x6e\x0f\x2d\xe3\x2a\xfc\x2d\x5a\x37\xee\xfc\x87\x46\x48\xc8\x8c\xad\xe0\xfe\x6a\x15\x47\xab\x38\xf0\x29\x69\xb0\xf1\x4b\xe2\x06\x8d\x1a\xfc\x10\x10\x16\xef\xc6\x6d\xc0\x52\x6c\x15\xbb\x0a\x37\x8d\xb6\x68\xb0\xec\x6b\x8d\xcf\x2c\x9b\xfd\x4b\x75\xee\xc3\x06\x9c\x61\x8f\xd2\x7c\x1a\xad\x86\x0d\x6b\xa4\x19\x87\x76\xc6\x6e\x24\xa4\x7d\x52\x60\xef\x2f\xe8\xdf\x1d\x13\x0b\x8a\x05\xde\x2d\x10\x9c\x18\xa3\xff\x17\x00\x00\xff\xff\xbd\x12\xdf\xe7\x5e\x12\x05\x00") - -func staticJsGottyBundleJsBytes() ([]byte, error) { - return bindataRead( - _staticJsGottyBundleJs, - "static/js/gotty-bundle.js", - ) -} - -func staticJsGottyBundleJs() (*asset, error) { - bytes, err := staticJsGottyBundleJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "static/js/gotty-bundle.js", size: 332382, mode: os.FileMode(436), modTime: time.Unix(1503734056, 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){ - "static/css/index.css": staticCssIndexCss, - "static/css/xterm.css": staticCssXtermCss, - "static/css/xterm_customize.css": staticCssXterm_customizeCss, - "static/favicon.png": staticFaviconPng, - "static/index.html": staticIndexHtml, - "static/js/bundle.js": staticJsBundleJs, - "static/js/gotty-bundle.js": staticJsGottyBundleJs, -} - -// 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{ - "static": &bintree{nil, map[string]*bintree{ - "css": &bintree{nil, map[string]*bintree{ - "index.css": &bintree{staticCssIndexCss, map[string]*bintree{}}, - "xterm.css": &bintree{staticCssXtermCss, map[string]*bintree{}}, - "xterm_customize.css": &bintree{staticCssXterm_customizeCss, map[string]*bintree{}}, - }}, - "favicon.png": &bintree{staticFaviconPng, map[string]*bintree{}}, - "index.html": &bintree{staticIndexHtml, map[string]*bintree{}}, - "js": &bintree{nil, map[string]*bintree{ - "bundle.js": &bintree{staticJsBundleJs, map[string]*bintree{}}, - "gotty-bundle.js": &bintree{staticJsGottyBundleJs, 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/alphadose/gotty/server/handler_atomic.go b/vendor/github.com/alphadose/gotty/server/handler_atomic.go deleted file mode 100644 index 326d1bd0..00000000 --- a/vendor/github.com/alphadose/gotty/server/handler_atomic.go +++ /dev/null @@ -1,70 +0,0 @@ -package server - -import ( - "sync" - "time" -) - -type counter struct { - duration time.Duration - zeroTimer *time.Timer - wg sync.WaitGroup - connections int - mutex sync.Mutex -} - -func newCounter(duration time.Duration) *counter { - zeroTimer := time.NewTimer(duration) - - // when duration is 0, drain the expire event here - // so that user will never get the event. - if duration == 0 { - <-zeroTimer.C - } - - return &counter{ - duration: duration, - zeroTimer: zeroTimer, - } -} - -func (counter *counter) add(n int) int { - counter.mutex.Lock() - defer counter.mutex.Unlock() - - if counter.duration > 0 { - counter.zeroTimer.Stop() - } - counter.wg.Add(n) - counter.connections += n - - return counter.connections -} - -func (counter *counter) done() int { - counter.mutex.Lock() - defer counter.mutex.Unlock() - - counter.connections-- - counter.wg.Done() - if counter.connections == 0 && counter.duration > 0 { - counter.zeroTimer.Reset(counter.duration) - } - - return counter.connections -} - -func (counter *counter) count() int { - counter.mutex.Lock() - defer counter.mutex.Unlock() - - return counter.connections -} - -func (counter *counter) wait() { - counter.wg.Wait() -} - -func (counter *counter) timer() *time.Timer { - return counter.zeroTimer -} diff --git a/vendor/github.com/alphadose/gotty/server/handlers.go b/vendor/github.com/alphadose/gotty/server/handlers.go deleted file mode 100644 index b6776a74..00000000 --- a/vendor/github.com/alphadose/gotty/server/handlers.go +++ /dev/null @@ -1,235 +0,0 @@ -package server - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "log" - "net/http" - "net/url" - "sync/atomic" - - "github.com/gorilla/websocket" - "github.com/pkg/errors" - - "github.com/alphadose/gotty/webtty" -) - -func (server *Server) generateHandleWS(ctx context.Context, cancel context.CancelFunc, counter *counter) http.HandlerFunc { - once := new(int64) - - go func() { - select { - case <-counter.timer().C: - cancel() - case <-ctx.Done(): - } - }() - - return func(w http.ResponseWriter, r *http.Request) { - if server.options.Once { - success := atomic.CompareAndSwapInt64(once, 0, 1) - if !success { - http.Error(w, "Server is shutting down", http.StatusServiceUnavailable) - return - } - } - - num := counter.add(1) - closeReason := "unknown reason" - - defer func() { - num := counter.done() - log.Printf( - "Connection closed by %s: %s, connections: %d/%d", - closeReason, r.RemoteAddr, num, server.options.MaxConnection, - ) - - if server.options.Once { - cancel() - } - }() - - if int64(server.options.MaxConnection) != 0 { - if num > server.options.MaxConnection { - closeReason = "exceeding max number of connections" - return - } - } - - log.Printf("New client connected: %s, connections: %d/%d", r.RemoteAddr, num, server.options.MaxConnection) - - if r.Method != "GET" { - http.Error(w, "Method not allowed", 405) - return - } - - conn, err := server.upgrader.Upgrade(w, r, nil) - if err != nil { - closeReason = err.Error() - return - } - defer conn.Close() - - err = server.processWSConn(ctx, conn) - - switch err { - case ctx.Err(): - closeReason = "cancelation" - case webtty.ErrSlaveClosed: - closeReason = server.factory.Name() - case webtty.ErrMasterClosed: - closeReason = "client" - default: - closeReason = fmt.Sprintf("an error: %s", err) - } - } -} - -func (server *Server) processWSConn(ctx context.Context, conn *websocket.Conn) error { - typ, initLine, err := conn.ReadMessage() - if err != nil { - return errors.Wrapf(err, "failed to authenticate websocket connection") - } - if typ != websocket.TextMessage { - return errors.New("failed to authenticate websocket connection: invalid message type") - } - - var init InitMessage - err = json.Unmarshal(initLine, &init) - if err != nil { - return errors.Wrapf(err, "failed to authenticate websocket connection") - } - if init.AuthToken != server.options.Credential { - return errors.New("failed to authenticate websocket connection") - } - - queryPath := "?" - if server.options.PermitArguments && init.Arguments != "" { - queryPath = init.Arguments - } - - query, err := url.Parse(queryPath) - if err != nil { - return errors.Wrapf(err, "failed to parse arguments") - } - params := query.Query() - var slave Slave - slave, err = server.factory.New(params) - if err != nil { - return errors.Wrapf(err, "failed to create backend") - } - defer slave.Close() - - titleVars := server.titleVariables( - []string{"server", "master", "slave"}, - map[string]map[string]interface{}{ - "server": server.options.TitleVariables, - "master": map[string]interface{}{ - "remote_addr": conn.RemoteAddr(), - }, - "slave": slave.WindowTitleVariables(), - }, - ) - - titleBuf := new(bytes.Buffer) - err = server.titleTemplate.Execute(titleBuf, titleVars) - if err != nil { - return errors.Wrapf(err, "failed to fill window title template") - } - - opts := []webtty.Option{ - webtty.WithWindowTitle(titleBuf.Bytes()), - } - if server.options.PermitWrite { - opts = append(opts, webtty.WithPermitWrite()) - } - if server.options.EnableReconnect { - opts = append(opts, webtty.WithReconnect(server.options.ReconnectTime)) - } - if server.options.Width > 0 { - opts = append(opts, webtty.WithFixedColumns(server.options.Width)) - } - if server.options.Height > 0 { - opts = append(opts, webtty.WithFixedRows(server.options.Height)) - } - if server.options.Preferences != nil { - opts = append(opts, webtty.WithMasterPreferences(server.options.Preferences)) - } - - tty, err := webtty.New(&wsWrapper{conn}, slave, opts...) - if err != nil { - return errors.Wrapf(err, "failed to create webtty") - } - - err = tty.Run(ctx) - - return err -} - -func (server *Server) handleIndex(w http.ResponseWriter, r *http.Request) { - titleVars := server.titleVariables( - []string{"server", "master"}, - map[string]map[string]interface{}{ - "server": server.options.TitleVariables, - "master": map[string]interface{}{ - "remote_addr": r.RemoteAddr, - }, - }, - ) - - titleBuf := new(bytes.Buffer) - err := server.titleTemplate.Execute(titleBuf, titleVars) - if err != nil { - http.Error(w, "Internal Server Error", 500) - return - } - - indexVars := map[string]interface{}{ - "title": titleBuf.String(), - } - - indexBuf := new(bytes.Buffer) - err = server.indexTemplate.Execute(indexBuf, indexVars) - if err != nil { - http.Error(w, "Internal Server Error", 500) - return - } - - w.Write(indexBuf.Bytes()) -} - -func (server *Server) handleAuthToken(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/javascript") - // @TODO hashing? - w.Write([]byte("var gotty_auth_token = '" + server.options.Credential + "';")) -} - -func (server *Server) handleConfig(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/javascript") - w.Write([]byte("var gotty_term = '" + server.options.Term + "';")) -} - -// titleVariables merges maps in a specified order. -// varUnits are name-keyed maps, whose names will be iterated using order. -func (server *Server) titleVariables(order []string, varUnits map[string]map[string]interface{}) map[string]interface{} { - titleVars := map[string]interface{}{} - - for _, name := range order { - vars, ok := varUnits[name] - if !ok { - panic("title variable name error") - } - for key, val := range vars { - titleVars[key] = val - } - } - - // safe net for conflicted keys - for _, name := range order { - titleVars[name] = varUnits[name] - } - - return titleVars -} diff --git a/vendor/github.com/alphadose/gotty/server/init_message.go b/vendor/github.com/alphadose/gotty/server/init_message.go deleted file mode 100644 index 60801bfb..00000000 --- a/vendor/github.com/alphadose/gotty/server/init_message.go +++ /dev/null @@ -1,6 +0,0 @@ -package server - -type InitMessage struct { - Arguments string `json:"Arguments,omitempty"` - AuthToken string `json:"AuthToken,omitempty"` -} diff --git a/vendor/github.com/alphadose/gotty/server/list_address.go b/vendor/github.com/alphadose/gotty/server/list_address.go deleted file mode 100644 index de2e8b26..00000000 --- a/vendor/github.com/alphadose/gotty/server/list_address.go +++ /dev/null @@ -1,28 +0,0 @@ -package server - -import ( - "net" -) - -func listAddresses() (addresses []string) { - ifaces, err := net.Interfaces() - if err != nil { - return []string{} - } - - addresses = make([]string, 0, len(ifaces)) - - for _, iface := range ifaces { - ifAddrs, _ := iface.Addrs() - for _, ifAddr := range ifAddrs { - switch v := ifAddr.(type) { - case *net.IPNet: - addresses = append(addresses, v.IP.String()) - case *net.IPAddr: - addresses = append(addresses, v.IP.String()) - } - } - } - - return addresses -} diff --git a/vendor/github.com/alphadose/gotty/server/log_response_writer.go b/vendor/github.com/alphadose/gotty/server/log_response_writer.go deleted file mode 100644 index 1b75fd8f..00000000 --- a/vendor/github.com/alphadose/gotty/server/log_response_writer.go +++ /dev/null @@ -1,23 +0,0 @@ -package server - -import ( - "bufio" - "net" - "net/http" -) - -type logResponseWriter struct { - http.ResponseWriter - status int -} - -func (w *logResponseWriter) WriteHeader(status int) { - w.status = status - w.ResponseWriter.WriteHeader(status) -} - -func (w *logResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - hj, _ := w.ResponseWriter.(http.Hijacker) - w.status = http.StatusSwitchingProtocols - return hj.Hijack() -} diff --git a/vendor/github.com/alphadose/gotty/server/middleware.go b/vendor/github.com/alphadose/gotty/server/middleware.go deleted file mode 100644 index ee891768..00000000 --- a/vendor/github.com/alphadose/gotty/server/middleware.go +++ /dev/null @@ -1,51 +0,0 @@ -package server - -import ( - "encoding/base64" - "log" - "net/http" - "strings" -) - -func (server *Server) wrapLogger(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - rw := &logResponseWriter{w, 200} - handler.ServeHTTP(rw, r) - log.Printf("%s %d %s %s", r.RemoteAddr, rw.status, r.Method, r.URL.Path) - }) -} - -func (server *Server) wrapHeaders(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // todo add version - w.Header().Set("Server", "GoTTY") - handler.ServeHTTP(w, r) - }) -} - -func (server *Server) wrapBasicAuth(handler http.Handler, credential string) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - token := strings.SplitN(r.Header.Get("Authorization"), " ", 2) - - if len(token) != 2 || strings.ToLower(token[0]) != "basic" { - w.Header().Set("WWW-Authenticate", `Basic realm="GoTTY"`) - http.Error(w, "Bad Request", http.StatusUnauthorized) - return - } - - payload, err := base64.StdEncoding.DecodeString(token[1]) - if err != nil { - http.Error(w, "Internal Server Error", http.StatusInternalServerError) - return - } - - if credential != string(payload) { - w.Header().Set("WWW-Authenticate", `Basic realm="GoTTY"`) - http.Error(w, "authorization failed", http.StatusUnauthorized) - return - } - - log.Printf("Basic Authentication Succeeded: %s", r.RemoteAddr) - handler.ServeHTTP(w, r) - }) -} diff --git a/vendor/github.com/alphadose/gotty/server/options.go b/vendor/github.com/alphadose/gotty/server/options.go deleted file mode 100644 index 3d7f69ca..00000000 --- a/vendor/github.com/alphadose/gotty/server/options.go +++ /dev/null @@ -1,99 +0,0 @@ -package server - -import ( - "github.com/pkg/errors" -) - -type Options struct { - Address string `hcl:"address" flagName:"address" flagSName:"a" flagDescribe:"IP address to listen" default:"0.0.0.0"` - Port string `hcl:"port" flagName:"port" flagSName:"p" flagDescribe:"Port number to liten" default:"8080"` - PermitWrite bool `hcl:"permit_write" flagName:"permit-write" flagSName:"w" flagDescribe:"Permit clients to write to the TTY (BE CAREFUL)" default:"false"` - EnableBasicAuth bool `hcl:"enable_basic_auth" default:"false"` - Credential string `hcl:"credential" flagName:"credential" flagSName:"c" flagDescribe:"Credential for Basic Authentication (ex: user:pass, default disabled)" default:""` - EnableRandomUrl bool `hcl:"enable_random_url" flagName:"random-url" flagSName:"r" flagDescribe:"Add a random string to the URL" default:"false"` - RandomUrlLength int `hcl:"random_url_length" flagName:"random-url-length" flagDescribe:"Random URL length" default:"8"` - EnableTLS bool `hcl:"enable_tls" flagName:"tls" flagSName:"t" flagDescribe:"Enable TLS/SSL" default:"false"` - TLSCrtFile string `hcl:"tls_crt_file" flagName:"tls-crt" flagDescribe:"TLS/SSL certificate file path" default:"~/.gotty.crt"` - TLSKeyFile string `hcl:"tls_key_file" flagName:"tls-key" flagDescribe:"TLS/SSL key file path" default:"~/.gotty.key"` - EnableTLSClientAuth bool `hcl:"enable_tls_client_auth" default:"false"` - TLSCACrtFile string `hcl:"tls_ca_crt_file" flagName:"tls-ca-crt" flagDescribe:"TLS/SSL CA certificate file for client certifications" default:"~/.gotty.ca.crt"` - IndexFile string `hcl:"index_file" flagName:"index" flagDescribe:"Custom index.html file" default:""` - TitleFormat string `hcl:"title_format" flagName:"title-format" flagSName:"" flagDescribe:"Title format of browser window" default:"{{ .command }}@{{ .hostname }}"` - EnableReconnect bool `hcl:"enable_reconnect" flagName:"reconnect" flagDescribe:"Enable reconnection" default:"false"` - ReconnectTime int `hcl:"reconnect_time" flagName:"reconnect-time" flagDescribe:"Time to reconnect" default:"10"` - MaxConnection int `hcl:"max_connection" flagName:"max-connection" flagDescribe:"Maximum connection to gotty" default:"0"` - Once bool `hcl:"once" flagName:"once" flagDescribe:"Accept only one client and exit on disconnection" default:"false"` - Timeout int `hcl:"timeout" flagName:"timeout" flagDescribe:"Timeout seconds for waiting a client(0 to disable)" default:"0"` - PermitArguments bool `hcl:"permit_arguments" flagName:"permit-arguments" flagDescribe:"Permit clients to send command line arguments in URL (e.g. http://example.com:8080/?arg=AAA&arg=BBB)" default:"true"` - Preferences *HtermPrefernces `hcl:"preferences"` - Width int `hcl:"width" flagName:"width" flagDescribe:"Static width of the screen, 0(default) means dynamically resize" default:"0"` - Height int `hcl:"height" flagName:"height" flagDescribe:"Static height of the screen, 0(default) means dynamically resize" default:"0"` - WSOrigin string `hcl:"ws_origin" flagName:"ws-origin" flagDescribe:"A regular expression that matches origin URLs to be accepted by WebSocket. No cross origin requests are acceptable by default" default:""` - Term string `hcl:"term" flagName:"term" flagDescribe:"Terminal name to use on the browser, one of xterm or hterm." default:"xterm"` - - TitleVariables map[string]interface{} -} - -func (options *Options) Validate() error { - if options.EnableTLSClientAuth && !options.EnableTLS { - return errors.New("TLS client authentication is enabled, but TLS is not enabled") - } - return nil -} - -type HtermPrefernces struct { - AltGrMode *string `hcl:"alt_gr_mode" json:"alt-gr-mode,omitempty"` - AltBackspaceIsMetaBackspace bool `hcl:"alt_backspace_is_meta_backspace" json:"alt-backspace-is-meta-backspace,omitempty"` - AltIsMeta bool `hcl:"alt_is_meta" json:"alt-is-meta,omitempty"` - AltSendsWhat string `hcl:"alt_sends_what" json:"alt-sends-what,omitempty"` - AudibleBellSound string `hcl:"audible_bell_sound" json:"audible-bell-sound,omitempty"` - DesktopNotificationBell bool `hcl:"desktop_notification_bell" json:"desktop-notification-bell,omitempty"` - BackgroundColor string `hcl:"background_color" json:"background-color,omitempty"` - BackgroundImage string `hcl:"background_image" json:"background-image,omitempty"` - BackgroundSize string `hcl:"background_size" json:"background-size,omitempty"` - BackgroundPosition string `hcl:"background_position" json:"background-position,omitempty"` - BackspaceSendsBackspace bool `hcl:"backspace_sends_backspace" json:"backspace-sends-backspace,omitempty"` - CharacterMapOverrides map[string]map[string]string `hcl:"character_map_overrides" json:"character-map-overrides,omitempty"` - CloseOnExit bool `hcl:"close_on_exit" json:"close-on-exit,omitempty"` - CursorBlink bool `hcl:"cursor_blink" json:"cursor-blink,omitempty"` - CursorBlinkCycle [2]int `hcl:"cursor_blink_cycle" json:"cursor-blink-cycle,omitempty"` - CursorColor string `hcl:"cursor_color" json:"cursor-color,omitempty"` - ColorPaletteOverrides []*string `hcl:"color_palette_overrides" json:"color-palette-overrides,omitempty"` - CopyOnSelect bool `hcl:"copy_on_select" json:"copy-on-select,omitempty"` - UseDefaultWindowCopy bool `hcl:"use_default_window_copy" json:"use-default-window-copy,omitempty"` - ClearSelectionAfterCopy bool `hcl:"clear_selection_after_copy" json:"clear-selection-after-copy,omitempty"` - CtrlPlusMinusZeroZoom bool `hcl:"ctrl_plus_minus_zero_zoom" json:"ctrl-plus-minus-zero-zoom,omitempty"` - CtrlCCopy bool `hcl:"ctrl_c_copy" json:"ctrl-c-copy,omitempty"` - CtrlVPaste bool `hcl:"ctrl_v_paste" json:"ctrl-v-paste,omitempty"` - EastAsianAmbiguousAsTwoColumn bool `hcl:"east_asian_ambiguous_as_two_column" json:"east-asian-ambiguous-as-two-column,omitempty"` - Enable8BitControl *bool `hcl:"enable_8_bit_control" json:"enable-8-bit-control,omitempty"` - EnableBold *bool `hcl:"enable_bold" json:"enable-bold,omitempty"` - EnableBoldAsBright bool `hcl:"enable_bold_as_bright" json:"enable-bold-as-bright,omitempty"` - EnableClipboardNotice bool `hcl:"enable_clipboard_notice" json:"enable-clipboard-notice,omitempty"` - EnableClipboardWrite bool `hcl:"enable_clipboard_write" json:"enable-clipboard-write,omitempty"` - EnableDec12 bool `hcl:"enable_dec12" json:"enable-dec12,omitempty"` - Environment map[string]string `hcl:"environment" json:"environment,omitempty"` - FontFamily string `hcl:"font_family" json:"font-family,omitempty"` - FontSize int `hcl:"font_size" json:"font-size,omitempty"` - FontSmoothing string `hcl:"font_smoothing" json:"font-smoothing,omitempty"` - ForegroundColor string `hcl:"foreground_color" json:"foreground-color,omitempty"` - HomeKeysScroll bool `hcl:"home_keys_scroll" json:"home-keys-scroll,omitempty"` - Keybindings map[string]string `hcl:"keybindings" json:"keybindings,omitempty"` - MaxStringSequence int `hcl:"max_string_sequence" json:"max-string-sequence,omitempty"` - MediaKeysAreFkeys bool `hcl:"media_keys_are_fkeys" json:"media-keys-are-fkeys,omitempty"` - MetaSendsEscape bool `hcl:"meta_sends_escape" json:"meta-sends-escape,omitempty"` - MousePasteButton *int `hcl:"mouse_paste_button" json:"mouse-paste-button,omitempty"` - PageKeysScroll bool `hcl:"page_keys_scroll" json:"page-keys-scroll,omitempty"` - PassAltNumber *bool `hcl:"pass_alt_number" json:"pass-alt-number,omitempty"` - PassCtrlNumber *bool `hcl:"pass_ctrl_number" json:"pass-ctrl-number,omitempty"` - PassMetaNumber *bool `hcl:"pass_meta_number" json:"pass-meta-number,omitempty"` - PassMetaV bool `hcl:"pass_meta_v" json:"pass-meta-v,omitempty"` - ReceiveEncoding string `hcl:"receive_encoding" json:"receive-encoding,omitempty"` - ScrollOnKeystroke bool `hcl:"scroll_on_keystroke" json:"scroll-on-keystroke,omitempty"` - ScrollOnOutput bool `hcl:"scroll_on_output" json:"scroll-on-output,omitempty"` - ScrollbarVisible bool `hcl:"scrollbar_visible" json:"scrollbar-visible,omitempty"` - ScrollWheelMoveMultiplier int `hcl:"scroll_wheel_move_multiplier" json:"scroll-wheel-move-multiplier,omitempty"` - SendEncoding string `hcl:"send_encoding" json:"send-encoding,omitempty"` - ShiftInsertPaste bool `hcl:"shift_insert_paste" json:"shift-insert-paste,omitempty"` - UserCss string `hcl:"user_css" json:"user-css,omitempty"` -} diff --git a/vendor/github.com/alphadose/gotty/server/run_option.go b/vendor/github.com/alphadose/gotty/server/run_option.go deleted file mode 100644 index 2939d636..00000000 --- a/vendor/github.com/alphadose/gotty/server/run_option.go +++ /dev/null @@ -1,21 +0,0 @@ -package server - -import ( - "context" -) - -// RunOptions holds a set of configurations for Server.Run(). -type RunOptions struct { - gracefullCtx context.Context -} - -// RunOption is an option of Server.Run(). -type RunOption func(*RunOptions) - -// WithGracefullContext accepts a context to shutdown a Server -// with care for existing client connections. -func WithGracefullContext(ctx context.Context) RunOption { - return func(options *RunOptions) { - options.gracefullCtx = ctx - } -} diff --git a/vendor/github.com/alphadose/gotty/server/server.go b/vendor/github.com/alphadose/gotty/server/server.go deleted file mode 100644 index 449b97f0..00000000 --- a/vendor/github.com/alphadose/gotty/server/server.go +++ /dev/null @@ -1,246 +0,0 @@ -package server - -import ( - "context" - "crypto/tls" - "crypto/x509" - "html/template" - "io/ioutil" - "log" - "net" - "net/http" - "regexp" - noesctmpl "text/template" - "time" - - "github.com/NYTimes/gziphandler" - "github.com/elazarl/go-bindata-assetfs" - "github.com/gorilla/websocket" - "github.com/pkg/errors" - - "github.com/alphadose/gotty/pkg/homedir" - "github.com/alphadose/gotty/pkg/randomstring" - "github.com/alphadose/gotty/webtty" -) - -// Server provides a webtty HTTP endpoint. -type Server struct { - factory Factory - options *Options - - upgrader *websocket.Upgrader - indexTemplate *template.Template - titleTemplate *noesctmpl.Template -} - -// New creates a new instance of Server. -// Server will use the New() of the factory provided to handle each request. -func New(factory Factory, options *Options) (*Server, error) { - indexData, err := Asset("static/index.html") - if err != nil { - panic("index not found") // must be in bindata - } - if options.IndexFile != "" { - path := homedir.Expand(options.IndexFile) - indexData, err = ioutil.ReadFile(path) - if err != nil { - return nil, errors.Wrapf(err, "failed to read custom index file at `%s`", path) - } - } - indexTemplate, err := template.New("index").Parse(string(indexData)) - if err != nil { - panic("index template parse failed") // must be valid - } - - titleTemplate, err := noesctmpl.New("title").Parse(options.TitleFormat) - if err != nil { - return nil, errors.Wrapf(err, "failed to parse window title format `%s`", options.TitleFormat) - } - - var originChekcer func(r *http.Request) bool - if options.WSOrigin != "" { - matcher, err := regexp.Compile(options.WSOrigin) - if err != nil { - return nil, errors.Wrapf(err, "failed to compile regular expression of Websocket Origin: %s", options.WSOrigin) - } - originChekcer = func(r *http.Request) bool { - return matcher.MatchString(r.Header.Get("Origin")) - } - } - - return &Server{ - factory: factory, - options: options, - - upgrader: &websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - Subprotocols: webtty.Protocols, - CheckOrigin: originChekcer, - }, - indexTemplate: indexTemplate, - titleTemplate: titleTemplate, - }, nil -} - -// Run starts the main process of the Server. -// The cancelation of ctx will shutdown the server immediately with aborting -// existing connections. Use WithGracefullContext() to support gracefull shutdown. -func (server *Server) Run(ctx context.Context, options ...RunOption) error { - cctx, cancel := context.WithCancel(ctx) - opts := &RunOptions{gracefullCtx: context.Background()} - for _, opt := range options { - opt(opts) - } - - counter := newCounter(time.Duration(server.options.Timeout) * time.Second) - - path := "/" - if server.options.EnableRandomUrl { - path = "/" + randomstring.Generate(server.options.RandomUrlLength) + "/" - } - - handlers := server.setupHandlers(cctx, cancel, path, counter) - srv, err := server.setupHTTPServer(handlers) - if err != nil { - return errors.Wrapf(err, "failed to setup an HTTP server") - } - - if server.options.PermitWrite { - log.Printf("Permitting clients to write input to the PTY.") - } - if server.options.Once { - log.Printf("Once option is provided, accepting only one client") - } - - if server.options.Port == "0" { - log.Printf("Port number configured to `0`, choosing a random port") - } - hostPort := net.JoinHostPort(server.options.Address, server.options.Port) - listener, err := net.Listen("tcp", hostPort) - if err != nil { - return errors.Wrapf(err, "failed to listen at `%s`", hostPort) - } - - scheme := "http" - if server.options.EnableTLS { - scheme = "https" - } - host, port, _ := net.SplitHostPort(listener.Addr().String()) - log.Printf("HTTP server is listening at: %s", scheme+"://"+host+":"+port+path) - if server.options.Address == "0.0.0.0" { - for _, address := range listAddresses() { - log.Printf("Alternative URL: %s", scheme+"://"+address+":"+port+path) - } - } - - srvErr := make(chan error, 1) - go func() { - if server.options.EnableTLS { - crtFile := homedir.Expand(server.options.TLSCrtFile) - keyFile := homedir.Expand(server.options.TLSKeyFile) - log.Printf("TLS crt file: " + crtFile) - log.Printf("TLS key file: " + keyFile) - - err = srv.ServeTLS(listener, crtFile, keyFile) - } else { - err = srv.Serve(listener) - } - if err != nil { - srvErr <- err - } - }() - - go func() { - select { - case <-opts.gracefullCtx.Done(): - srv.Shutdown(context.Background()) - case <-cctx.Done(): - } - }() - - select { - case err = <-srvErr: - if err == http.ErrServerClosed { // by gracefull ctx - err = nil - } else { - cancel() - } - case <-cctx.Done(): - srv.Close() - err = cctx.Err() - } - - conn := counter.count() - if conn > 0 { - log.Printf("Waiting for %d connections to be closed", conn) - } - counter.wait() - - return err -} - -func (server *Server) setupHandlers(ctx context.Context, cancel context.CancelFunc, pathPrefix string, counter *counter) http.Handler { - staticFileHandler := http.FileServer( - &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "static"}, - ) - - var siteMux = http.NewServeMux() - siteMux.HandleFunc(pathPrefix, server.handleIndex) - siteMux.Handle(pathPrefix+"js/", http.StripPrefix(pathPrefix, staticFileHandler)) - siteMux.Handle(pathPrefix+"favicon.png", http.StripPrefix(pathPrefix, staticFileHandler)) - siteMux.Handle(pathPrefix+"css/", http.StripPrefix(pathPrefix, staticFileHandler)) - - siteMux.HandleFunc(pathPrefix+"auth_token.js", server.handleAuthToken) - siteMux.HandleFunc(pathPrefix+"config.js", server.handleConfig) - - siteHandler := http.Handler(siteMux) - - if server.options.EnableBasicAuth { - log.Printf("Using Basic Authentication") - siteHandler = server.wrapBasicAuth(siteHandler, server.options.Credential) - } - - withGz := gziphandler.GzipHandler(server.wrapHeaders(siteHandler)) - siteHandler = server.wrapLogger(withGz) - - wsMux := http.NewServeMux() - wsMux.Handle("/", siteHandler) - wsMux.HandleFunc(pathPrefix+"ws", server.generateHandleWS(ctx, cancel, counter)) - siteHandler = http.Handler(wsMux) - - return siteHandler -} - -func (server *Server) setupHTTPServer(handler http.Handler) (*http.Server, error) { - srv := &http.Server{ - Handler: handler, - } - - if server.options.EnableTLSClientAuth { - tlsConfig, err := server.tlsConfig() - if err != nil { - return nil, errors.Wrapf(err, "failed to setup TLS configuration") - } - srv.TLSConfig = tlsConfig - } - - return srv, nil -} - -func (server *Server) tlsConfig() (*tls.Config, error) { - caFile := homedir.Expand(server.options.TLSCACrtFile) - caCert, err := ioutil.ReadFile(caFile) - if err != nil { - return nil, errors.New("could not open CA crt file " + caFile) - } - caCertPool := x509.NewCertPool() - if !caCertPool.AppendCertsFromPEM(caCert) { - return nil, errors.New("could not parse CA crt file data in " + caFile) - } - tlsConfig := &tls.Config{ - ClientCAs: caCertPool, - ClientAuth: tls.RequireAndVerifyClientCert, - } - return tlsConfig, nil -} diff --git a/vendor/github.com/alphadose/gotty/server/slave.go b/vendor/github.com/alphadose/gotty/server/slave.go deleted file mode 100644 index cc0cdb17..00000000 --- a/vendor/github.com/alphadose/gotty/server/slave.go +++ /dev/null @@ -1,17 +0,0 @@ -package server - -import ( - "github.com/alphadose/gotty/webtty" -) - -// Slave is webtty.Slave with some additional methods. -type Slave interface { - webtty.Slave - - Close() error -} - -type Factory interface { - Name() string - New(params map[string][]string) (Slave, error) -} diff --git a/vendor/github.com/alphadose/gotty/server/ws_wrapper.go b/vendor/github.com/alphadose/gotty/server/ws_wrapper.go deleted file mode 100644 index 819c3938..00000000 --- a/vendor/github.com/alphadose/gotty/server/ws_wrapper.go +++ /dev/null @@ -1,33 +0,0 @@ -package server - -import ( - "github.com/gorilla/websocket" -) - -type wsWrapper struct { - *websocket.Conn -} - -func (wsw *wsWrapper) Write(p []byte) (n int, err error) { - writer, err := wsw.Conn.NextWriter(websocket.TextMessage) - if err != nil { - return 0, err - } - defer writer.Close() - return writer.Write(p) -} - -func (wsw *wsWrapper) Read(p []byte) (n int, err error) { - for { - msgType, reader, err := wsw.Conn.NextReader() - if err != nil { - return 0, err - } - - if msgType != websocket.TextMessage { - continue - } - - return reader.Read(p) - } -} diff --git a/vendor/github.com/alphadose/gotty/utils/default.go b/vendor/github.com/alphadose/gotty/utils/default.go deleted file mode 100644 index e813b3bb..00000000 --- a/vendor/github.com/alphadose/gotty/utils/default.go +++ /dev/null @@ -1,41 +0,0 @@ -package utils - -import ( - "fmt" - "github.com/fatih/structs" - "reflect" - "strconv" -) - -func ApplyDefaultValues(struct_ interface{}) (err error) { - o := structs.New(struct_) - - for _, field := range o.Fields() { - defaultValue := field.Tag("default") - if defaultValue == "" { - continue - } - var val interface{} - switch field.Kind() { - case reflect.String: - val = defaultValue - case reflect.Bool: - if defaultValue == "true" { - val = true - } else if defaultValue == "false" { - val = false - } else { - return fmt.Errorf("invalid bool expression: %v, use true/false", defaultValue) - } - case reflect.Int: - val, err = strconv.Atoi(defaultValue) - if err != nil { - return err - } - default: - val = field.Value() - } - field.Set(val) - } - return nil -} diff --git a/vendor/github.com/alphadose/gotty/utils/flags.go b/vendor/github.com/alphadose/gotty/utils/flags.go deleted file mode 100644 index 25ca572c..00000000 --- a/vendor/github.com/alphadose/gotty/utils/flags.go +++ /dev/null @@ -1,124 +0,0 @@ -package utils - -import ( - "io/ioutil" - "log" - "os" - "reflect" - "strings" - - "github.com/urfave/cli" - "github.com/fatih/structs" - "github.com/yudai/hcl" - - "github.com/alphadose/gotty/pkg/homedir" -) - -func GenerateFlags(options ...interface{}) (flags []cli.Flag, mappings map[string]string, err error) { - mappings = make(map[string]string) - - for _, struct_ := range options { - o := structs.New(struct_) - for _, field := range o.Fields() { - flagName := field.Tag("flagName") - if flagName == "" { - continue - } - envName := "GOTTY_" + strings.ToUpper(strings.Join(strings.Split(flagName, "-"), "_")) - mappings[flagName] = field.Name() - - flagShortName := field.Tag("flagSName") - if flagShortName != "" { - flagName += ", " + flagShortName - } - - flagDescription := field.Tag("flagDescribe") - - switch field.Kind() { - case reflect.String: - flags = append(flags, cli.StringFlag{ - Name: flagName, - Value: field.Value().(string), - Usage: flagDescription, - EnvVar: envName, - }) - case reflect.Bool: - flags = append(flags, cli.BoolFlag{ - Name: flagName, - Usage: flagDescription, - EnvVar: envName, - }) - case reflect.Int: - flags = append(flags, cli.IntFlag{ - Name: flagName, - Value: field.Value().(int), - Usage: flagDescription, - EnvVar: envName, - }) - } - } - } - - return -} - -func ApplyFlags( - flags []cli.Flag, - mappingHint map[string]string, - c *cli.Context, - options ...interface{}, -) { - objects := make([]*structs.Struct, len(options)) - for i, struct_ := range options { - objects[i] = structs.New(struct_) - } - - for flagName, fieldName := range mappingHint { - if !c.IsSet(flagName) { - continue - } - var field *structs.Field - var ok bool - for _, o := range objects { - field, ok = o.FieldOk(fieldName) - if ok { - break - } - } - if field == nil { - continue - } - var val interface{} - switch field.Kind() { - case reflect.String: - val = c.String(flagName) - case reflect.Bool: - val = c.Bool(flagName) - case reflect.Int: - val = c.Int(flagName) - } - field.Set(val) - } -} - -func ApplyConfigFile(filePath string, options ...interface{}) error { - filePath = homedir.Expand(filePath) - if _, err := os.Stat(filePath); os.IsNotExist(err) { - return err - } - - fileString := []byte{} - log.Printf("Loading config file at: %s", filePath) - fileString, err := ioutil.ReadFile(filePath) - if err != nil { - return err - } - - for _, object := range options { - if err := hcl.Decode(object, string(fileString)); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/alphadose/gotty/webtty/doc.go b/vendor/github.com/alphadose/gotty/webtty/doc.go deleted file mode 100644 index b7d76b9e..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package webtty provides a protocl and an implementation to -// controll terminals thorough networks. -package webtty diff --git a/vendor/github.com/alphadose/gotty/webtty/errors.go b/vendor/github.com/alphadose/gotty/webtty/errors.go deleted file mode 100644 index 0ea64730..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/errors.go +++ /dev/null @@ -1,13 +0,0 @@ -package webtty - -import ( - "errors" -) - -var ( - // ErrSlaveClosed indicates the function has exited by the slave - ErrSlaveClosed = errors.New("slave closed") - - // ErrSlaveClosed is returned when the slave connection is closed. - ErrMasterClosed = errors.New("master closed") -) diff --git a/vendor/github.com/alphadose/gotty/webtty/master.go b/vendor/github.com/alphadose/gotty/webtty/master.go deleted file mode 100644 index 7f30f47e..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/master.go +++ /dev/null @@ -1,8 +0,0 @@ -package webtty - -import ( - "io" -) - -// Master represents a PTY master, usually it's a websocket connection. -type Master io.ReadWriter diff --git a/vendor/github.com/alphadose/gotty/webtty/message_types.go b/vendor/github.com/alphadose/gotty/webtty/message_types.go deleted file mode 100644 index c437a427..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/message_types.go +++ /dev/null @@ -1,31 +0,0 @@ -package webtty - -// Protocols defines the name of this protocol, -// which is supposed to be used to the subprotocol of Websockt streams. -var Protocols = []string{"webtty"} - -const ( - // Unknown message type, maybe sent by a bug - UnknownInput = '0' - // User input typically from a keyboard - Input = '1' - // Ping to the server - Ping = '2' - // Notify that the browser size has been changed - ResizeTerminal = '3' -) - -const ( - // Unknown message type, maybe set by a bug - UnknownOutput = '0' - // Normal output to the terminal - Output = '1' - // Pong to the browser - Pong = '2' - // Set window title of the terminal - SetWindowTitle = '3' - // Set terminal preference - SetPreferences = '4' - // Make terminal to reconnect - SetReconnect = '5' -) diff --git a/vendor/github.com/alphadose/gotty/webtty/option.go b/vendor/github.com/alphadose/gotty/webtty/option.go deleted file mode 100644 index 1618e893..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/option.go +++ /dev/null @@ -1,62 +0,0 @@ -package webtty - -import ( - "encoding/json" - - "github.com/pkg/errors" -) - -// Option is an option for WebTTY. -type Option func(*WebTTY) error - -// WithPermitWrite sets a WebTTY to accept input from slaves. -func WithPermitWrite() Option { - return func(wt *WebTTY) error { - wt.permitWrite = true - return nil - } -} - -// WithFixedColumns sets a fixed width to TTY master. -func WithFixedColumns(columns int) Option { - return func(wt *WebTTY) error { - wt.columns = columns - return nil - } -} - -// WithFixedRows sets a fixed height to TTY master. -func WithFixedRows(rows int) Option { - return func(wt *WebTTY) error { - wt.rows = rows - return nil - } -} - -// WithWindowTitle sets the default window title of the session -func WithWindowTitle(windowTitle []byte) Option { - return func(wt *WebTTY) error { - wt.windowTitle = windowTitle - return nil - } -} - -// WithReconnect enables reconnection on the master side. -func WithReconnect(timeInSeconds int) Option { - return func(wt *WebTTY) error { - wt.reconnect = timeInSeconds - return nil - } -} - -// WithMasterPreferences sets an optional configuration of master. -func WithMasterPreferences(preferences interface{}) Option { - return func(wt *WebTTY) error { - prefs, err := json.Marshal(preferences) - if err != nil { - return errors.Wrapf(err, "failed to marshal preferences as JSON") - } - wt.masterPrefs = prefs - return nil - } -} diff --git a/vendor/github.com/alphadose/gotty/webtty/slave.go b/vendor/github.com/alphadose/gotty/webtty/slave.go deleted file mode 100644 index b9893ba3..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/slave.go +++ /dev/null @@ -1,17 +0,0 @@ -package webtty - -import ( - "io" -) - -// Slave represents a PTY slave, typically it's a local command. -type Slave interface { - io.ReadWriter - - // WindowTitleVariables returns any values that can be used to fill out - // the title of a terminal. - WindowTitleVariables() map[string]interface{} - - // ResizeTerminal sets a new size of the terminal. - ResizeTerminal(columns int, rows int) error -} diff --git a/vendor/github.com/alphadose/gotty/webtty/webtty.go b/vendor/github.com/alphadose/gotty/webtty/webtty.go deleted file mode 100644 index ed4f8b95..00000000 --- a/vendor/github.com/alphadose/gotty/webtty/webtty.go +++ /dev/null @@ -1,219 +0,0 @@ -package webtty - -import ( - "context" - "encoding/base64" - "encoding/json" - "sync" - - "github.com/pkg/errors" -) - -// WebTTY bridges a PTY slave and its PTY master. -// To support text-based streams and side channel commands such as -// terminal resizing, WebTTY uses an original protocol. -type WebTTY struct { - // PTY Master, which probably a connection to browser - masterConn Master - // PTY Slave - slave Slave - - windowTitle []byte - permitWrite bool - columns int - rows int - reconnect int // in seconds - masterPrefs []byte - - bufferSize int - writeMutex sync.Mutex -} - -// New creates a new instance of WebTTY. -// masterConn is a connection to the PTY master, -// typically it's a websocket connection to a client. -// slave is a PTY slave such as a local command with a PTY. -func New(masterConn Master, slave Slave, options ...Option) (*WebTTY, error) { - wt := &WebTTY{ - masterConn: masterConn, - slave: slave, - - permitWrite: false, - columns: 0, - rows: 0, - - bufferSize: 1024, - } - - for _, option := range options { - option(wt) - } - - return wt, nil -} - -// Run starts the main process of the WebTTY. -// This method blocks until the context is canceled. -// Note that the master and slave are left intact even -// after the context is canceled. Closing them is caller's -// responsibility. -// If the connection to one end gets closed, returns ErrSlaveClosed or ErrMasterClosed. -func (wt *WebTTY) Run(ctx context.Context) error { - err := wt.sendInitializeMessage() - if err != nil { - return errors.Wrapf(err, "failed to send initializing message") - } - - errs := make(chan error, 2) - - go func() { - errs <- func() error { - buffer := make([]byte, wt.bufferSize) - for { - n, err := wt.slave.Read(buffer) - if err != nil { - return ErrSlaveClosed - } - - err = wt.handleSlaveReadEvent(buffer[:n]) - if err != nil { - return err - } - } - }() - }() - - go func() { - errs <- func() error { - buffer := make([]byte, wt.bufferSize) - for { - n, err := wt.masterConn.Read(buffer) - if err != nil { - return ErrMasterClosed - } - - err = wt.handleMasterReadEvent(buffer[:n]) - if err != nil { - return err - } - } - }() - }() - - select { - case <-ctx.Done(): - err = ctx.Err() - case err = <-errs: - } - - return err -} - -func (wt *WebTTY) sendInitializeMessage() error { - err := wt.masterWrite(append([]byte{SetWindowTitle}, wt.windowTitle...)) - if err != nil { - return errors.Wrapf(err, "failed to send window title") - } - - if wt.reconnect > 0 { - reconnect, _ := json.Marshal(wt.reconnect) - err := wt.masterWrite(append([]byte{SetReconnect}, reconnect...)) - if err != nil { - return errors.Wrapf(err, "failed to set reconnect") - } - } - - if wt.masterPrefs != nil { - err := wt.masterWrite(append([]byte{SetPreferences}, wt.masterPrefs...)) - if err != nil { - return errors.Wrapf(err, "failed to set preferences") - } - } - - return nil -} - -func (wt *WebTTY) handleSlaveReadEvent(data []byte) error { - safeMessage := base64.StdEncoding.EncodeToString(data) - err := wt.masterWrite(append([]byte{Output}, []byte(safeMessage)...)) - if err != nil { - return errors.Wrapf(err, "failed to send message to master") - } - - return nil -} - -func (wt *WebTTY) masterWrite(data []byte) error { - wt.writeMutex.Lock() - defer wt.writeMutex.Unlock() - - _, err := wt.masterConn.Write(data) - if err != nil { - return errors.Wrapf(err, "failed to write to master") - } - - return nil -} - -func (wt *WebTTY) handleMasterReadEvent(data []byte) error { - if len(data) == 0 { - return errors.New("unexpected zero length read from master") - } - - switch data[0] { - case Input: - if !wt.permitWrite { - return nil - } - - if len(data) <= 1 { - return nil - } - - _, err := wt.slave.Write(data[1:]) - if err != nil { - return errors.Wrapf(err, "failed to write received data to slave") - } - - case Ping: - err := wt.masterWrite([]byte{Pong}) - if err != nil { - return errors.Wrapf(err, "failed to return Pong message to master") - } - - case ResizeTerminal: - if wt.columns != 0 && wt.rows != 0 { - break - } - - if len(data) <= 1 { - return errors.New("received malformed remote command for terminal resize: empty payload") - } - - var args argResizeTerminal - err := json.Unmarshal(data[1:], &args) - if err != nil { - return errors.Wrapf(err, "received malformed data for terminal resize") - } - rows := wt.rows - if rows == 0 { - rows = int(args.Rows) - } - - columns := wt.columns - if columns == 0 { - columns = int(args.Columns) - } - - wt.slave.ResizeTerminal(columns, rows) - default: - return errors.Errorf("unknown message type `%c`", data[0]) - } - - return nil -} - -type argResizeTerminal struct { - Columns float64 - Rows float64 -} diff --git a/vendor/github.com/anmitsu/go-shlex/.gitignore b/vendor/github.com/anmitsu/go-shlex/.gitignore deleted file mode 100644 index 0b46bb5d..00000000 --- a/vendor/github.com/anmitsu/go-shlex/.gitignore +++ /dev/null @@ -1 +0,0 @@ -shlex.test diff --git a/vendor/github.com/anmitsu/go-shlex/LICENSE b/vendor/github.com/anmitsu/go-shlex/LICENSE deleted file mode 100644 index 4a17268a..00000000 --- a/vendor/github.com/anmitsu/go-shlex/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) anmitsu - -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/anmitsu/go-shlex/README.md b/vendor/github.com/anmitsu/go-shlex/README.md deleted file mode 100644 index e02a6d89..00000000 --- a/vendor/github.com/anmitsu/go-shlex/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# go-shlex - -go-shlex is a library to make a lexical analyzer like Unix shell for -Go. - -## Install - - go get -u "github.com/anmitsu/go-shlex" - -## Usage - -```go -package main - -import ( - "fmt" - "log" - - "github.com/anmitsu/go-shlex" -) - -func main() { - cmd := `cp -Rdp "file name" 'file name2' dir\ name` - words, err := shlex.Split(cmd, true) - if err != nil { - log.Fatal(err) - } - - for _, w := range words { - fmt.Println(w) - } -} -``` -output - - cp - -Rdp - file name - file name2 - dir name - -## Documentation - -http://godoc.org/github.com/anmitsu/go-shlex - diff --git a/vendor/github.com/anmitsu/go-shlex/go.mod b/vendor/github.com/anmitsu/go-shlex/go.mod deleted file mode 100644 index c6957a95..00000000 --- a/vendor/github.com/anmitsu/go-shlex/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/anmitsu/go-shlex - -go 1.13 - -require github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 diff --git a/vendor/github.com/anmitsu/go-shlex/go.sum b/vendor/github.com/anmitsu/go-shlex/go.sum deleted file mode 100644 index 087c1757..00000000 --- a/vendor/github.com/anmitsu/go-shlex/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= diff --git a/vendor/github.com/anmitsu/go-shlex/shlex.go b/vendor/github.com/anmitsu/go-shlex/shlex.go deleted file mode 100644 index e742c38a..00000000 --- a/vendor/github.com/anmitsu/go-shlex/shlex.go +++ /dev/null @@ -1,193 +0,0 @@ -// Package shlex provides a simple lexical analysis like Unix shell. -package shlex - -import ( - "bufio" - "errors" - "io" - "strings" - "unicode" -) - -var ( - ErrNoClosing = errors.New("No closing quotation") - ErrNoEscaped = errors.New("No escaped character") -) - -// Tokenizer is the interface that classifies a token according to -// words, whitespaces, quotations, escapes and escaped quotations. -type Tokenizer interface { - IsWord(rune) bool - IsWhitespace(rune) bool - IsQuote(rune) bool - IsEscape(rune) bool - IsEscapedQuote(rune) bool -} - -// DefaultTokenizer implements a simple tokenizer like Unix shell. -type DefaultTokenizer struct{} - -func (t *DefaultTokenizer) IsWord(r rune) bool { - return r == '_' || unicode.IsLetter(r) || unicode.IsNumber(r) -} -func (t *DefaultTokenizer) IsQuote(r rune) bool { - switch r { - case '\'', '"': - return true - default: - return false - } -} -func (t *DefaultTokenizer) IsWhitespace(r rune) bool { - return unicode.IsSpace(r) -} -func (t *DefaultTokenizer) IsEscape(r rune) bool { - return r == '\\' -} -func (t *DefaultTokenizer) IsEscapedQuote(r rune) bool { - return r == '"' -} - -// Lexer represents a lexical analyzer. -type Lexer struct { - reader *bufio.Reader - tokenizer Tokenizer - posix bool - whitespacesplit bool -} - -// NewLexer creates a new Lexer reading from io.Reader. This Lexer -// has a DefaultTokenizer according to posix and whitespacesplit -// rules. -func NewLexer(r io.Reader, posix, whitespacesplit bool) *Lexer { - return &Lexer{ - reader: bufio.NewReader(r), - tokenizer: &DefaultTokenizer{}, - posix: posix, - whitespacesplit: whitespacesplit, - } -} - -// NewLexerString creates a new Lexer reading from a string. This -// Lexer has a DefaultTokenizer according to posix and whitespacesplit -// rules. -func NewLexerString(s string, posix, whitespacesplit bool) *Lexer { - return NewLexer(strings.NewReader(s), posix, whitespacesplit) -} - -// Split splits a string according to posix or non-posix rules. -func Split(s string, posix bool) ([]string, error) { - return NewLexerString(s, posix, true).Split() -} - -// SetTokenizer sets a Tokenizer. -func (l *Lexer) SetTokenizer(t Tokenizer) { - l.tokenizer = t -} - -func (l *Lexer) Split() ([]string, error) { - result := make([]string, 0) - for { - token, err := l.readToken() - if token != "" { - result = append(result, token) - } - - if err == io.EOF { - break - } else if err != nil { - return result, err - } - } - return result, nil -} - -func (l *Lexer) readToken() (string, error) { - t := l.tokenizer - token := "" - quoted := false - state := ' ' - escapedstate := ' ' -scanning: - for { - next, _, err := l.reader.ReadRune() - if err != nil { - if t.IsQuote(state) { - return token, ErrNoClosing - } else if t.IsEscape(state) { - return token, ErrNoEscaped - } - return token, err - } - - switch { - case t.IsWhitespace(state): - switch { - case t.IsWhitespace(next): - break scanning - case l.posix && t.IsEscape(next): - escapedstate = 'a' - state = next - case t.IsWord(next): - token += string(next) - state = 'a' - case t.IsQuote(next): - if !l.posix { - token += string(next) - } - state = next - default: - token = string(next) - if l.whitespacesplit { - state = 'a' - } else if token != "" || (l.posix && quoted) { - break scanning - } - } - case t.IsQuote(state): - quoted = true - switch { - case next == state: - if !l.posix { - token += string(next) - break scanning - } else { - state = 'a' - } - case l.posix && t.IsEscape(next) && t.IsEscapedQuote(state): - escapedstate = state - state = next - default: - token += string(next) - } - case t.IsEscape(state): - if t.IsQuote(escapedstate) && next != state && next != escapedstate { - token += string(state) - } - token += string(next) - state = escapedstate - case t.IsWord(state): - switch { - case t.IsWhitespace(next): - if token != "" || (l.posix && quoted) { - break scanning - } - case l.posix && t.IsQuote(next): - state = next - case l.posix && t.IsEscape(next): - escapedstate = 'a' - state = next - case t.IsWord(next) || t.IsQuote(next): - token += string(next) - default: - if l.whitespacesplit { - token += string(next) - } else if token != "" { - l.reader.UnreadRune() - break scanning - } - } - } - } - return token, nil -} diff --git a/vendor/github.com/appleboy/gin-jwt/v2/.drone.yml b/vendor/github.com/appleboy/gin-jwt/v2/.drone.yml deleted file mode 100644 index db461965..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/.drone.yml +++ /dev/null @@ -1,69 +0,0 @@ -kind: pipeline -name: lint - -clone: - depth: 50 - -steps: -- name: testing - image: golang:1.13 - pull: true - commands: - - make vet - - make lint - - make embedmd-check - - make misspell-check - -trigger: - event: - - push - - pull_request - ---- -kind: pipeline -name: testing - -clone: - depth: 50 - -steps: -- name: testing - image: golang:1.13 - pull: true - commands: - - make test - -- name: codecov - image: robertstettner/drone-codecov - settings: - token: - from_secret: codecov_token - -trigger: - event: - - push - ---- -kind: pipeline -name: notification - -clone: - disable: true - -steps: -- name: discord - pull: always - image: appleboy/drone-discord - environment: - DISCORD_WEBHOOK_ID: - from_secret: discord_webhook_id - DISCORD_WEBHOOK_TOKEN: - from_secret: discord_webhook_token - when: - status: - - success - - failure - -depends_on: -- testing -- lint diff --git a/vendor/github.com/appleboy/gin-jwt/v2/.editorconfig b/vendor/github.com/appleboy/gin-jwt/v2/.editorconfig deleted file mode 100644 index e4f9beca..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/.editorconfig +++ /dev/null @@ -1,42 +0,0 @@ -# unifying the coding style for different editors and IDEs => editorconfig.org - -; indicate this is the root of the project -root = true - -########################################################### -; common -########################################################### - -[*] -charset = utf-8 - -end_of_line = LF -insert_final_newline = true -trim_trailing_whitespace = true - -indent_style = space -indent_size = 2 - -########################################################### -; make -########################################################### - -[Makefile] -indent_style = tab - -[makefile] -indent_style = tab - -########################################################### -; markdown -########################################################### - -[*.md] -trim_trailing_whitespace = false - -########################################################### -; golang -########################################################### - -[*.go] -indent_style = tab \ No newline at end of file diff --git a/vendor/github.com/appleboy/gin-jwt/v2/.gitignore b/vendor/github.com/appleboy/gin-jwt/v2/.gitignore deleted file mode 100644 index 9a31cd71..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -.DS_Store -gin-bin -.cover -.vscode -coverage.txt -vendor/* -!vendor/vendor.json diff --git a/vendor/github.com/appleboy/gin-jwt/v2/.revive.toml b/vendor/github.com/appleboy/gin-jwt/v2/.revive.toml deleted file mode 100644 index 74743d5e..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/.revive.toml +++ /dev/null @@ -1,25 +0,0 @@ -ignoreGeneratedHeader = false -severity = "warning" -confidence = 0.8 -errorCode = 1 -warningCode = 1 - -[rule.blank-imports] -[rule.context-as-argument] -[rule.context-keys-type] -[rule.dot-imports] -[rule.error-return] -[rule.error-strings] -[rule.error-naming] -[rule.exported] -[rule.if-return] -[rule.increment-decrement] -[rule.var-naming] -[rule.var-declaration] -[rule.package-comments] -[rule.range] -[rule.receiver-naming] -[rule.time-naming] -[rule.unexported-return] -[rule.indent-error-flow] -[rule.errorf] diff --git a/vendor/github.com/appleboy/gin-jwt/v2/LICENSE b/vendor/github.com/appleboy/gin-jwt/v2/LICENSE deleted file mode 100644 index 446bb8b4..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Bo-Yi Wu - -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/appleboy/gin-jwt/v2/Makefile b/vendor/github.com/appleboy/gin-jwt/v2/Makefile deleted file mode 100644 index f157d55c..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -.PHONY: test - -GO ?= go -GOFMT ?= gofmt "-s" -GOFILES := $(shell find . -name "*.go" -type f) - -install-embedmd: - @hash embedmd > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/campoy/embedmd; \ - fi - -embedmd-check: install-embedmd - embedmd -d *.md - -embedmd: install-embedmd - embedmd -w *.md - -.PHONY: fmt -fmt: - $(GOFMT) -w $(GOFILES) - -.PHONY: fmt-check -fmt-check: - @diff=$$($(GOFMT) -d $(GOFILES)); \ - if [ -n "$$diff" ]; then \ - echo "Please run 'make fmt' and commit the result:"; \ - echo "$${diff}"; \ - exit 1; \ - fi; - -test: fmt-check - @$(GO) test -v -cover -coverprofile coverage.txt ./... && echo "\n==>\033[32m Ok\033[m\n" || exit 1 - -vet: - $(GO) vet ./... - -lint: - @hash revive > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/mgechev/revive; \ - fi - revive -config .revive.toml ./... || exit 1 - -.PHONY: misspell-check -misspell-check: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -error ./... - -.PHONY: misspell -misspell: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -w ./... - -clean: - $(GO) clean -modcache -cache -i - find . -name "coverage.txt" -delete diff --git a/vendor/github.com/appleboy/gin-jwt/v2/README.md b/vendor/github.com/appleboy/gin-jwt/v2/README.md deleted file mode 100644 index d4f8465a..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/README.md +++ /dev/null @@ -1,291 +0,0 @@ -# JWT Middleware for Gin Framework - -[![GitHub tag](https://img.shields.io/github/tag/appleboy/gin-jwt.svg)](https://github.com/appleboy/gin-jwt/releases) -[![GoDoc](https://godoc.org/github.com/appleboy/gin-jwt?status.svg)](https://godoc.org/github.com/appleboy/gin-jwt) -[![Build Status](https://cloud.drone.io/api/badges/appleboy/gin-jwt/status.svg)](https://cloud.drone.io/appleboy/gin-jwt) -[![Go Report Card](https://goreportcard.com/badge/github.com/appleboy/gin-jwt)](https://goreportcard.com/report/github.com/appleboy/gin-jwt) -[![codecov](https://codecov.io/gh/appleboy/gin-jwt/branch/master/graph/badge.svg)](https://codecov.io/gh/appleboy/gin-jwt) -[![codebeat badge](https://codebeat.co/badges/c4015f07-df23-4c7c-95ba-9193a12e14b1)](https://codebeat.co/projects/github-com-appleboy-gin-jwt) -[![Sourcegraph](https://sourcegraph.com/github.com/appleboy/gin-jwt/-/badge.svg)](https://sourcegraph.com/github.com/appleboy/gin-jwt?badge) - -This is a middleware for [Gin](https://github.com/gin-gonic/gin) framework. - -It uses [jwt-go](https://github.com/dgrijalva/jwt-go) to provide a jwt authentication middleware. It provides additional handler functions to provide the `login` api that will generate the token and an additional `refresh` handler that can be used to refresh tokens. - -## Usage - -Download and install using [go module](https://blog.golang.org/using-go-modules): - -```sh -export GO111MODULE=on -go get github.com/appleboy/gin-jwt/v2 -``` - -Import it in your code: - -```go -import "github.com/appleboy/gin-jwt/v2" -``` - -Download and install without using [go module](https://blog.golang.org/using-go-modules): - -```sh -go get github.com/appleboy/gin-jwt -``` - -Import it in your code: - -```go -import "github.com/appleboy/gin-jwt" -``` - -## Example - -Please see [the example file](_example/basic/server.go) and you can use `ExtractClaims` to fetch user data. - -[embedmd]:# (_example/basic/server.go go) -```go -package main - -import ( - "log" - "net/http" - "os" - "time" - - "github.com/appleboy/gin-jwt/v2" - "github.com/gin-gonic/gin" -) - -type login struct { - Username string `form:"username" json:"username" binding:"required"` - Password string `form:"password" json:"password" binding:"required"` -} - -var identityKey = "id" - -func helloHandler(c *gin.Context) { - claims := jwt.ExtractClaims(c) - user, _ := c.Get(identityKey) - c.JSON(200, gin.H{ - "userID": claims[identityKey], - "userName": user.(*User).UserName, - "text": "Hello World.", - }) -} - -// User demo -type User struct { - UserName string - FirstName string - LastName string -} - -func main() { - port := os.Getenv("PORT") - r := gin.New() - r.Use(gin.Logger()) - r.Use(gin.Recovery()) - - if port == "" { - port = "8000" - } - - // the jwt middleware - authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{ - Realm: "test zone", - Key: []byte("secret key"), - Timeout: time.Hour, - MaxRefresh: time.Hour, - IdentityKey: identityKey, - PayloadFunc: func(data interface{}) jwt.MapClaims { - if v, ok := data.(*User); ok { - return jwt.MapClaims{ - identityKey: v.UserName, - } - } - return jwt.MapClaims{} - }, - IdentityHandler: func(c *gin.Context) interface{} { - claims := jwt.ExtractClaims(c) - return &User{ - UserName: claims[identityKey].(string), - } - }, - Authenticator: func(c *gin.Context) (interface{}, error) { - var loginVals login - if err := c.ShouldBind(&loginVals); err != nil { - return "", jwt.ErrMissingLoginValues - } - userID := loginVals.Username - password := loginVals.Password - - if (userID == "admin" && password == "admin") || (userID == "test" && password == "test") { - return &User{ - UserName: userID, - LastName: "Bo-Yi", - FirstName: "Wu", - }, nil - } - - return nil, jwt.ErrFailedAuthentication - }, - Authorizator: func(data interface{}, c *gin.Context) bool { - if v, ok := data.(*User); ok && v.UserName == "admin" { - return true - } - - return false - }, - Unauthorized: func(c *gin.Context, code int, message string) { - c.JSON(code, gin.H{ - "code": code, - "message": message, - }) - }, - // TokenLookup is a string in the form of ":" that is used - // to extract token from the request. - // Optional. Default value "header:Authorization". - // Possible values: - // - "header:" - // - "query:" - // - "cookie:" - // - "param:" - TokenLookup: "header: Authorization, query: token, cookie: jwt", - // TokenLookup: "query:token", - // TokenLookup: "cookie:token", - - // TokenHeadName is a string in the header. Default value is "Bearer" - TokenHeadName: "Bearer", - - // TimeFunc provides the current time. You can override it to use another time value. This is useful for testing or if your server uses a different time zone than your tokens. - TimeFunc: time.Now, - }) - - if err != nil { - log.Fatal("JWT Error:" + err.Error()) - } - - r.POST("/login", authMiddleware.LoginHandler) - - r.NoRoute(authMiddleware.MiddlewareFunc(), func(c *gin.Context) { - claims := jwt.ExtractClaims(c) - log.Printf("NoRoute claims: %#v\n", claims) - c.JSON(404, gin.H{"code": "PAGE_NOT_FOUND", "message": "Page not found"}) - }) - - auth := r.Group("/auth") - // Refresh time can be longer than token timeout - auth.GET("/refresh_token", authMiddleware.RefreshHandler) - auth.Use(authMiddleware.MiddlewareFunc()) - { - auth.GET("/hello", helloHandler) - } - - if err := http.ListenAndServe(":"+port, r); err != nil { - log.Fatal(err) - } -} -``` - -## Demo - -Please run _example/server.go file and listen `8000` port. - -```sh -go run _example/server.go -``` - -Download and install [httpie](https://github.com/jkbrzt/httpie) CLI HTTP client. - -### Login API - -```sh -http -v --json POST localhost:8000/login username=admin password=admin -``` - -Output screenshot - -![api screenshot](screenshot/login.png) - -### Refresh token API - -```bash -http -v -f GET localhost:8000/auth/refresh_token "Authorization:Bearer xxxxxxxxx" "Content-Type: application/json" -``` - -Output screenshot - -![api screenshot](screenshot/refresh_token.png) - -### Hello world - -Please login as `admin` and password as `admin` - -```bash -http -f GET localhost:8000/auth/hello "Authorization:Bearer xxxxxxxxx" "Content-Type: application/json" -``` - -Response message `200 OK`: - -```sh -HTTP/1.1 200 OK -Content-Length: 24 -Content-Type: application/json; charset=utf-8 -Date: Sat, 19 Mar 2016 03:02:57 GMT - -{ - "text": "Hello World.", - "userID": "admin" -} -``` - -### Authorization - -Please login as `test` and password as `test` - -```bash -http -f GET localhost:8000/auth/hello "Authorization:Bearer xxxxxxxxx" "Content-Type: application/json" -``` - -Response message `403 Forbidden`: - -```sh -HTTP/1.1 403 Forbidden -Content-Length: 62 -Content-Type: application/json; charset=utf-8 -Date: Sat, 19 Mar 2016 03:05:40 GMT -Www-Authenticate: JWT realm=test zone - -{ - "code": 403, - "message": "You don't have permission to access." -} -``` - -### Cookie Token - -Use these options for setting the JWT in a cookie. See the Mozilla [documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Secure_and_HttpOnly_cookies) for more information on these options. - -```go - SendCookie: true, - SecureCookie: false, //non HTTPS dev environments - CookieHTTPOnly: true, // JS can't modify - CookieDomain: "localhost:8080", - CookieName: "token", // default jwt - TokenLookup: "cookie:token", -``` - -Adding a route to the `LogoutHandler` route will the deletion of the auth cookie, effectively logging the user out. The `LoginResponse` object can optionally be set to customize the response of this endpoint. - -### Login Flow - -1. Authenticator: handles the login logic. On success LoginResponse is called, on failure Unauthorized is called. -2. LoginResponse: optional, allows setting a custom response such as a redirect. - -### JWT Flow - -1. PayloadFunc: maps the claims in the JWT. -2. IdentityHandler: extracts identity from claims. -3. Authorizator: receives identity and handles authorization logic. -4. Unauthorized: handles unauthorized logic. diff --git a/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go b/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go deleted file mode 100644 index efb1d241..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go +++ /dev/null @@ -1,747 +0,0 @@ -package jwt - -import ( - "crypto/rsa" - "errors" - "io/ioutil" - "net/http" - "strings" - "time" - - "github.com/dgrijalva/jwt-go" - "github.com/gin-gonic/gin" -) - -// MapClaims type that uses the map[string]interface{} for JSON decoding -// This is the default claims type if you don't supply one -type MapClaims map[string]interface{} - -// GinJWTMiddleware provides a Json-Web-Token authentication implementation. On failure, a 401 HTTP response -// is returned. On success, the wrapped middleware is called, and the userID is made available as -// c.Get("userID").(string). -// Users can get a token by posting a json request to LoginHandler. The token then needs to be passed in -// the Authentication header. Example: Authorization:Bearer XXX_TOKEN_XXX -type GinJWTMiddleware struct { - // Realm name to display to the user. Required. - Realm string - - // signing algorithm - possible values are HS256, HS384, HS512 - // Optional, default is HS256. - SigningAlgorithm string - - // Secret key used for signing. Required. - Key []byte - - // Duration that a jwt token is valid. Optional, defaults to one hour. - Timeout time.Duration - - // This field allows clients to refresh their token until MaxRefresh has passed. - // Note that clients can refresh their token in the last moment of MaxRefresh. - // This means that the maximum validity timespan for a token is TokenTime + MaxRefresh. - // Optional, defaults to 0 meaning not refreshable. - MaxRefresh time.Duration - - // Callback function that should perform the authentication of the user based on login info. - // Must return user data as user identifier, it will be stored in Claim Array. Required. - // Check error (e) to determine the appropriate error message. - Authenticator func(c *gin.Context) (interface{}, error) - - // Callback function that should perform the authorization of the authenticated user. Called - // only after an authentication success. Must return true on success, false on failure. - // Optional, default to success. - Authorizator func(data interface{}, c *gin.Context) bool - - // Callback function that will be called during login. - // Using this function it is possible to add additional payload data to the webtoken. - // The data is then made available during requests via c.Get("JWT_PAYLOAD"). - // Note that the payload is not encrypted. - // The attributes mentioned on jwt.io can't be used as keys for the map. - // Optional, by default no additional data will be set. - PayloadFunc func(data interface{}) MapClaims - - // User can define own Unauthorized func. - Unauthorized func(*gin.Context, int, string) - - // User can define own LoginResponse func. - LoginResponse func(*gin.Context, int, string, time.Time) - - // User can define own LogoutResponse func. - LogoutResponse func(*gin.Context, int) - - // User can define own RefreshResponse func. - RefreshResponse func(*gin.Context, int, string, time.Time) - - // Set the identity handler function - IdentityHandler func(*gin.Context) interface{} - - // Set the identity key - IdentityKey string - - // TokenLookup is a string in the form of ":" that is used - // to extract token from the request. - // Optional. Default value "header:Authorization". - // Possible values: - // - "header:" - // - "query:" - // - "cookie:" - TokenLookup string - - // TokenHeadName is a string in the header. Default value is "Bearer" - TokenHeadName string - - // TimeFunc provides the current time. You can override it to use another time value. This is useful for testing or if your server uses a different time zone than your tokens. - TimeFunc func() time.Time - - // HTTP Status messages for when something in the JWT middleware fails. - // Check error (e) to determine the appropriate error message. - HTTPStatusMessageFunc func(e error, c *gin.Context) string - - // Private key file for asymmetric algorithms - PrivKeyFile string - - // Public key file for asymmetric algorithms - PubKeyFile string - - // Private key - privKey *rsa.PrivateKey - - // Public key - pubKey *rsa.PublicKey - - // Optionally return the token as a cookie - SendCookie bool - - // Allow insecure cookies for development over http - SecureCookie bool - - // Allow cookies to be accessed client side for development - CookieHTTPOnly bool - - // Allow cookie domain change for development - CookieDomain string - - // SendAuthorization allow return authorization header for every request - SendAuthorization bool - - // Disable abort() of context. - DisabledAbort bool - - // CookieName allow cookie name change for development - CookieName string -} - -var ( - // ErrMissingSecretKey indicates Secret key is required - ErrMissingSecretKey = errors.New("secret key is required") - - // ErrForbidden when HTTP status 403 is given - ErrForbidden = errors.New("you don't have permission to access this resource") - - // ErrMissingAuthenticatorFunc indicates Authenticator is required - ErrMissingAuthenticatorFunc = errors.New("ginJWTMiddleware.Authenticator func is undefined") - - // ErrMissingLoginValues indicates a user tried to authenticate without username or password - ErrMissingLoginValues = errors.New("missing Username or Password") - - // ErrFailedAuthentication indicates authentication failed, could be faulty username or password - ErrFailedAuthentication = errors.New("incorrect Username or Password") - - // ErrFailedTokenCreation indicates JWT Token failed to create, reason unknown - ErrFailedTokenCreation = errors.New("failed to create JWT Token") - - // ErrExpiredToken indicates JWT token has expired. Can't refresh. - ErrExpiredToken = errors.New("token is expired") - - // ErrEmptyAuthHeader can be thrown if authing with a HTTP header, the Auth header needs to be set - ErrEmptyAuthHeader = errors.New("auth header is empty") - - // ErrMissingExpField missing exp field in token - ErrMissingExpField = errors.New("missing exp field") - - // ErrWrongFormatOfExp field must be float64 format - ErrWrongFormatOfExp = errors.New("exp must be float64 format") - - // ErrInvalidAuthHeader indicates auth header is invalid, could for example have the wrong Realm name - ErrInvalidAuthHeader = errors.New("auth header is invalid") - - // ErrEmptyQueryToken can be thrown if authing with URL Query, the query token variable is empty - ErrEmptyQueryToken = errors.New("query token is empty") - - // ErrEmptyCookieToken can be thrown if authing with a cookie, the token cokie is empty - ErrEmptyCookieToken = errors.New("cookie token is empty") - - // ErrEmptyParamToken can be thrown if authing with parameter in path, the parameter in path is empty - ErrEmptyParamToken = errors.New("parameter token is empty") - - // ErrInvalidSigningAlgorithm indicates signing algorithm is invalid, needs to be HS256, HS384, HS512, RS256, RS384 or RS512 - ErrInvalidSigningAlgorithm = errors.New("invalid signing algorithm") - - // ErrNoPrivKeyFile indicates that the given private key is unreadable - ErrNoPrivKeyFile = errors.New("private key file unreadable") - - // ErrNoPubKeyFile indicates that the given public key is unreadable - ErrNoPubKeyFile = errors.New("public key file unreadable") - - // ErrInvalidPrivKey indicates that the given private key is invalid - ErrInvalidPrivKey = errors.New("private key invalid") - - // ErrInvalidPubKey indicates the the given public key is invalid - ErrInvalidPubKey = errors.New("public key invalid") - - // IdentityKey default identity key - IdentityKey = "identity" -) - -// New for check error with GinJWTMiddleware -func New(m *GinJWTMiddleware) (*GinJWTMiddleware, error) { - if err := m.MiddlewareInit(); err != nil { - return nil, err - } - - return m, nil -} - -func (mw *GinJWTMiddleware) readKeys() error { - err := mw.privateKey() - if err != nil { - return err - } - err = mw.publicKey() - if err != nil { - return err - } - return nil -} - -func (mw *GinJWTMiddleware) privateKey() error { - keyData, err := ioutil.ReadFile(mw.PrivKeyFile) - if err != nil { - return ErrNoPrivKeyFile - } - key, err := jwt.ParseRSAPrivateKeyFromPEM(keyData) - if err != nil { - return ErrInvalidPrivKey - } - mw.privKey = key - return nil -} - -func (mw *GinJWTMiddleware) publicKey() error { - keyData, err := ioutil.ReadFile(mw.PubKeyFile) - if err != nil { - return ErrNoPubKeyFile - } - key, err := jwt.ParseRSAPublicKeyFromPEM(keyData) - if err != nil { - return ErrInvalidPubKey - } - mw.pubKey = key - return nil -} - -func (mw *GinJWTMiddleware) usingPublicKeyAlgo() bool { - switch mw.SigningAlgorithm { - case "RS256", "RS512", "RS384": - return true - } - return false -} - -// MiddlewareInit initialize jwt configs. -func (mw *GinJWTMiddleware) MiddlewareInit() error { - - if mw.TokenLookup == "" { - mw.TokenLookup = "header:Authorization" - } - - if mw.SigningAlgorithm == "" { - mw.SigningAlgorithm = "HS256" - } - - if mw.Timeout == 0 { - mw.Timeout = time.Hour - } - - if mw.TimeFunc == nil { - mw.TimeFunc = time.Now - } - - mw.TokenHeadName = strings.TrimSpace(mw.TokenHeadName) - if len(mw.TokenHeadName) == 0 { - mw.TokenHeadName = "Bearer" - } - - if mw.Authorizator == nil { - mw.Authorizator = func(data interface{}, c *gin.Context) bool { - return true - } - } - - if mw.Unauthorized == nil { - mw.Unauthorized = func(c *gin.Context, code int, message string) { - c.JSON(code, gin.H{ - "code": code, - "message": message, - }) - } - } - - if mw.LoginResponse == nil { - mw.LoginResponse = func(c *gin.Context, code int, token string, expire time.Time) { - c.JSON(http.StatusOK, gin.H{ - "code": http.StatusOK, - "token": token, - "expire": expire.Format(time.RFC3339), - }) - } - } - - if mw.LogoutResponse == nil { - mw.LogoutResponse = func(c *gin.Context, code int) { - c.JSON(http.StatusOK, gin.H{ - "code": http.StatusOK, - }) - } - } - - if mw.RefreshResponse == nil { - mw.RefreshResponse = func(c *gin.Context, code int, token string, expire time.Time) { - c.JSON(http.StatusOK, gin.H{ - "code": http.StatusOK, - "token": token, - "expire": expire.Format(time.RFC3339), - }) - } - } - - if mw.IdentityKey == "" { - mw.IdentityKey = IdentityKey - } - - if mw.IdentityHandler == nil { - mw.IdentityHandler = func(c *gin.Context) interface{} { - claims := ExtractClaims(c) - return claims[mw.IdentityKey] - } - } - - if mw.HTTPStatusMessageFunc == nil { - mw.HTTPStatusMessageFunc = func(e error, c *gin.Context) string { - return e.Error() - } - } - - if mw.Realm == "" { - mw.Realm = "gin jwt" - } - - if mw.CookieName == "" { - mw.CookieName = "jwt" - } - - if mw.usingPublicKeyAlgo() { - return mw.readKeys() - } - - if mw.Key == nil { - return ErrMissingSecretKey - } - return nil -} - -// MiddlewareFunc makes GinJWTMiddleware implement the Middleware interface. -func (mw *GinJWTMiddleware) MiddlewareFunc() gin.HandlerFunc { - return func(c *gin.Context) { - mw.middlewareImpl(c) - } -} - -func (mw *GinJWTMiddleware) middlewareImpl(c *gin.Context) { - claims, err := mw.GetClaimsFromJWT(c) - if err != nil { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c)) - return - } - - if claims["exp"] == nil { - mw.unauthorized(c, http.StatusBadRequest, mw.HTTPStatusMessageFunc(ErrMissingExpField, c)) - return - } - - if _, ok := claims["exp"].(float64); !ok { - mw.unauthorized(c, http.StatusBadRequest, mw.HTTPStatusMessageFunc(ErrWrongFormatOfExp, c)) - return - } - - if int64(claims["exp"].(float64)) < mw.TimeFunc().Unix() { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrExpiredToken, c)) - return - } - - c.Set("JWT_PAYLOAD", claims) - identity := mw.IdentityHandler(c) - - if identity != nil { - c.Set(mw.IdentityKey, identity) - } - - if !mw.Authorizator(identity, c) { - mw.unauthorized(c, http.StatusForbidden, mw.HTTPStatusMessageFunc(ErrForbidden, c)) - return - } - - c.Next() -} - -// GetClaimsFromJWT get claims from JWT token -func (mw *GinJWTMiddleware) GetClaimsFromJWT(c *gin.Context) (MapClaims, error) { - token, err := mw.ParseToken(c) - - if err != nil { - return nil, err - } - - if mw.SendAuthorization { - if v, ok := c.Get("JWT_TOKEN"); ok { - c.Header("Authorization", mw.TokenHeadName+" "+v.(string)) - } - } - - claims := MapClaims{} - for key, value := range token.Claims.(jwt.MapClaims) { - claims[key] = value - } - - return claims, nil -} - -// LoginHandler can be used by clients to get a jwt token. -// Payload needs to be json in the form of {"username": "USERNAME", "password": "PASSWORD"}. -// Reply will be of the form {"token": "TOKEN"}. -func (mw *GinJWTMiddleware) LoginHandler(c *gin.Context) { - if mw.Authenticator == nil { - mw.unauthorized(c, http.StatusInternalServerError, mw.HTTPStatusMessageFunc(ErrMissingAuthenticatorFunc, c)) - return - } - - data, err := mw.Authenticator(c) - - if err != nil { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c)) - return - } - - // Create the token - token := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) - claims := token.Claims.(jwt.MapClaims) - - if mw.PayloadFunc != nil { - for key, value := range mw.PayloadFunc(data) { - claims[key] = value - } - } - - expire := mw.TimeFunc().Add(mw.Timeout) - claims["exp"] = expire.Unix() - claims["orig_iat"] = mw.TimeFunc().Unix() - tokenString, err := mw.signedString(token) - - if err != nil { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrFailedTokenCreation, c)) - return - } - - // set cookie - if mw.SendCookie { - maxage := int(expire.Unix() - time.Now().Unix()) - c.SetCookie( - mw.CookieName, - tokenString, - maxage, - "/", - mw.CookieDomain, - mw.SecureCookie, - mw.CookieHTTPOnly, - ) - } - - mw.LoginResponse(c, http.StatusOK, tokenString, expire) -} - -// LogoutHandler can be used by clients to remove the jwt cookie (if set) -func (mw *GinJWTMiddleware) LogoutHandler(c *gin.Context) { - // delete auth cookie - if mw.SendCookie { - c.SetCookie( - mw.CookieName, - "", - -1, - "/", - mw.CookieDomain, - mw.SecureCookie, - mw.CookieHTTPOnly, - ) - } - - mw.LogoutResponse(c, http.StatusOK) -} - -func (mw *GinJWTMiddleware) signedString(token *jwt.Token) (string, error) { - var tokenString string - var err error - if mw.usingPublicKeyAlgo() { - tokenString, err = token.SignedString(mw.privKey) - } else { - tokenString, err = token.SignedString(mw.Key) - } - return tokenString, err -} - -// RefreshHandler can be used to refresh a token. The token still needs to be valid on refresh. -// Shall be put under an endpoint that is using the GinJWTMiddleware. -// Reply will be of the form {"token": "TOKEN"}. -func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context) { - tokenString, expire, err := mw.RefreshToken(c) - if err != nil { - mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c)) - return - } - - mw.RefreshResponse(c, http.StatusOK, tokenString, expire) -} - -// RefreshToken refresh token and check if token is expired -func (mw *GinJWTMiddleware) RefreshToken(c *gin.Context) (string, time.Time, error) { - claims, err := mw.CheckIfTokenExpire(c) - if err != nil { - return "", time.Now(), err - } - - // Create the token - newToken := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) - newClaims := newToken.Claims.(jwt.MapClaims) - - for key := range claims { - newClaims[key] = claims[key] - } - - expire := mw.TimeFunc().Add(mw.Timeout) - newClaims["exp"] = expire.Unix() - newClaims["orig_iat"] = mw.TimeFunc().Unix() - tokenString, err := mw.signedString(newToken) - - if err != nil { - return "", time.Now(), err - } - - // set cookie - if mw.SendCookie { - maxage := int(expire.Unix() - time.Now().Unix()) - c.SetCookie( - mw.CookieName, - tokenString, - maxage, - "/", - mw.CookieDomain, - mw.SecureCookie, - mw.CookieHTTPOnly, - ) - } - - return tokenString, expire, nil -} - -// CheckIfTokenExpire check if token expire -func (mw *GinJWTMiddleware) CheckIfTokenExpire(c *gin.Context) (jwt.MapClaims, error) { - token, err := mw.ParseToken(c) - - if err != nil { - // If we receive an error, and the error is anything other than a single - // ValidationErrorExpired, we want to return the error. - // If the error is just ValidationErrorExpired, we want to continue, as we can still - // refresh the token if it's within the MaxRefresh time. - // (see https://github.com/appleboy/gin-jwt/issues/176) - validationErr, ok := err.(*jwt.ValidationError) - if !ok || validationErr.Errors != jwt.ValidationErrorExpired { - return nil, err - } - } - - claims := token.Claims.(jwt.MapClaims) - - origIat := int64(claims["orig_iat"].(float64)) - - if origIat < mw.TimeFunc().Add(-mw.MaxRefresh).Unix() { - return nil, ErrExpiredToken - } - - return claims, nil -} - -// TokenGenerator method that clients can use to get a jwt token. -func (mw *GinJWTMiddleware) TokenGenerator(data interface{}) (string, time.Time, error) { - token := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) - claims := token.Claims.(jwt.MapClaims) - - if mw.PayloadFunc != nil { - for key, value := range mw.PayloadFunc(data) { - claims[key] = value - } - } - - expire := mw.TimeFunc().UTC().Add(mw.Timeout) - claims["exp"] = expire.Unix() - claims["orig_iat"] = mw.TimeFunc().Unix() - tokenString, err := mw.signedString(token) - if err != nil { - return "", time.Time{}, err - } - - return tokenString, expire, nil -} - -func (mw *GinJWTMiddleware) jwtFromHeader(c *gin.Context, key string) (string, error) { - authHeader := c.Request.Header.Get(key) - - if authHeader == "" { - return "", ErrEmptyAuthHeader - } - - parts := strings.SplitN(authHeader, " ", 2) - if !(len(parts) == 2 && parts[0] == mw.TokenHeadName) { - return "", ErrInvalidAuthHeader - } - - return parts[1], nil -} - -func (mw *GinJWTMiddleware) jwtFromQuery(c *gin.Context, key string) (string, error) { - token := c.Query(key) - - if token == "" { - return "", ErrEmptyQueryToken - } - - return token, nil -} - -func (mw *GinJWTMiddleware) jwtFromCookie(c *gin.Context, key string) (string, error) { - cookie, _ := c.Cookie(key) - - if cookie == "" { - return "", ErrEmptyCookieToken - } - - return cookie, nil -} - -func (mw *GinJWTMiddleware) jwtFromParam(c *gin.Context, key string) (string, error) { - token := c.Param(key) - - if token == "" { - return "", ErrEmptyParamToken - } - - return token, nil -} - -// ParseToken parse jwt token from gin context -func (mw *GinJWTMiddleware) ParseToken(c *gin.Context) (*jwt.Token, error) { - var token string - var err error - - methods := strings.Split(mw.TokenLookup, ",") - for _, method := range methods { - if len(token) > 0 { - break - } - parts := strings.Split(strings.TrimSpace(method), ":") - k := strings.TrimSpace(parts[0]) - v := strings.TrimSpace(parts[1]) - switch k { - case "header": - token, err = mw.jwtFromHeader(c, v) - case "query": - token, err = mw.jwtFromQuery(c, v) - case "cookie": - token, err = mw.jwtFromCookie(c, v) - case "param": - token, err = mw.jwtFromParam(c, v) - } - } - - if err != nil { - return nil, err - } - - return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { - if jwt.GetSigningMethod(mw.SigningAlgorithm) != t.Method { - return nil, ErrInvalidSigningAlgorithm - } - if mw.usingPublicKeyAlgo() { - return mw.pubKey, nil - } - - // save token string if vaild - c.Set("JWT_TOKEN", token) - - return mw.Key, nil - }) -} - -// ParseTokenString parse jwt token string -func (mw *GinJWTMiddleware) ParseTokenString(token string) (*jwt.Token, error) { - return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { - if jwt.GetSigningMethod(mw.SigningAlgorithm) != t.Method { - return nil, ErrInvalidSigningAlgorithm - } - if mw.usingPublicKeyAlgo() { - return mw.pubKey, nil - } - - return mw.Key, nil - }) -} - -func (mw *GinJWTMiddleware) unauthorized(c *gin.Context, code int, message string) { - c.Header("WWW-Authenticate", "JWT realm="+mw.Realm) - if !mw.DisabledAbort { - c.Abort() - } - - mw.Unauthorized(c, code, message) -} - -// ExtractClaims help to extract the JWT claims -func ExtractClaims(c *gin.Context) MapClaims { - claims, exists := c.Get("JWT_PAYLOAD") - if !exists { - return make(MapClaims) - } - - return claims.(MapClaims) -} - -// ExtractClaimsFromToken help to extract the JWT claims from token -func ExtractClaimsFromToken(token *jwt.Token) MapClaims { - if token == nil { - return make(MapClaims) - } - - claims := MapClaims{} - for key, value := range token.Claims.(jwt.MapClaims) { - claims[key] = value - } - - return claims -} - -// GetToken help to get the JWT token string -func GetToken(c *gin.Context) string { - token, exists := c.Get("JWT_TOKEN") - if !exists { - return "" - } - - return token.(string) -} diff --git a/vendor/github.com/appleboy/gin-jwt/v2/go.mod b/vendor/github.com/appleboy/gin-jwt/v2/go.mod deleted file mode 100644 index 081dea6a..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/appleboy/gin-jwt/v2 - -go 1.13 - -require ( - github.com/appleboy/gofight/v2 v2.1.2 - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dgrijalva/jwt-go v3.2.0+incompatible - github.com/gin-gonic/gin v1.4.0 - github.com/stretchr/testify v1.4.0 - github.com/tidwall/gjson v1.3.5 - gopkg.in/yaml.v2 v2.2.7 // indirect -) diff --git a/vendor/github.com/appleboy/gin-jwt/v2/go.sum b/vendor/github.com/appleboy/gin-jwt/v2/go.sum deleted file mode 100644 index ad4a8819..00000000 --- a/vendor/github.com/appleboy/gin-jwt/v2/go.sum +++ /dev/null @@ -1,56 +0,0 @@ -github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= -github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -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 h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -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 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/tidwall/gjson v1.3.5 h1:2oW9FBNu8qt9jy5URgrzsVx/T/KSn3qn/smJQ0crlDQ= -github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/asaskevich/govalidator/.gitignore b/vendor/github.com/asaskevich/govalidator/.gitignore deleted file mode 100644 index 8d69a941..00000000 --- a/vendor/github.com/asaskevich/govalidator/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -bin/ -.idea/ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - diff --git a/vendor/github.com/asaskevich/govalidator/.travis.yml b/vendor/github.com/asaskevich/govalidator/.travis.yml deleted file mode 100644 index 17c4d0a7..00000000 --- a/vendor/github.com/asaskevich/govalidator/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -dist: bionic -language: go -env: GO111MODULE=on GOFLAGS='-mod vendor' -install: true -email: false - -go: - - 1.10 - - 1.11 - - 1.12 - - 1.13 - - tip - -before_script: - - go install github.com/golangci/golangci-lint/cmd/golangci-lint -script: - - golangci-lint run # run a bunch of code checkers/linters in parallel - - go test -v -race ./... # Run all the tests with the race detector enabled diff --git a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md deleted file mode 100644 index 7ed268a1..00000000 --- a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md +++ /dev/null @@ -1,63 +0,0 @@ -#### Support -If you do have a contribution to the package, feel free to create a Pull Request or an Issue. - -#### What to contribute -If you don't know what to do, there are some features and functions that need to be done - -- [ ] Refactor code -- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check -- [ ] Create actual list of contributors and projects that currently using this package -- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues) -- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) -- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new -- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) -- [ ] Implement fuzzing testing -- [ ] Implement some struct/map/array utilities -- [ ] Implement map/array validation -- [ ] Implement benchmarking -- [ ] Implement batch of examples -- [ ] Look at forks for new features and fixes - -#### Advice -Feel free to create what you want, but keep in mind when you implement new features: -- Code must be clear and readable, names of variables/constants clearly describes what they are doing -- Public functions must be documented and described in source file and added to README.md to the list of available functions -- There are must be unit-tests for any new functions and improvements - -## Financial contributions - -We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/govalidator). -Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed. - - -## Credits - - -### Contributors - -Thank you to all the people who have already contributed to govalidator! - - - -### Backers - -Thank you to all our backers! [[Become a backer](https://opencollective.com/govalidator#backer)] - - - - -### Sponsors - -Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/govalidator#sponsor)) - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/github.com/asaskevich/govalidator/LICENSE b/vendor/github.com/asaskevich/govalidator/LICENSE deleted file mode 100644 index 2f9a31fa..00000000 --- a/vendor/github.com/asaskevich/govalidator/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Alex Saskevich - -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. \ No newline at end of file diff --git a/vendor/github.com/asaskevich/govalidator/README.md b/vendor/github.com/asaskevich/govalidator/README.md deleted file mode 100644 index 78f999e8..00000000 --- a/vendor/github.com/asaskevich/govalidator/README.md +++ /dev/null @@ -1,616 +0,0 @@ -govalidator -=========== -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![GoDoc](https://godoc.org/github.com/asaskevich/govalidator?status.png)](https://godoc.org/github.com/asaskevich/govalidator) [![Coverage Status](https://img.shields.io/coveralls/asaskevich/govalidator.svg)](https://coveralls.io/r/asaskevich/govalidator?branch=master) [![wercker status](https://app.wercker.com/status/1ec990b09ea86c910d5f08b0e02c6043/s "wercker status")](https://app.wercker.com/project/bykey/1ec990b09ea86c910d5f08b0e02c6043) -[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [![Backers on Open Collective](https://opencollective.com/govalidator/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/govalidator/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield) - -A package of validators and sanitizers for strings, structs and collections. Based on [validator.js](https://github.com/chriso/validator.js). - -#### Installation -Make sure that Go is installed on your computer. -Type the following command in your terminal: - - go get github.com/asaskevich/govalidator - -or you can get specified release of the package with `gopkg.in`: - - go get gopkg.in/asaskevich/govalidator.v10 - -After it the package is ready to use. - - -#### Import package in your project -Add following line in your `*.go` file: -```go -import "github.com/asaskevich/govalidator" -``` -If you are unhappy to use long `govalidator`, you can do something like this: -```go -import ( - valid "github.com/asaskevich/govalidator" -) -``` - -#### Activate behavior to require all fields have a validation tag by default -`SetFieldsRequiredByDefault` causes validation to fail when struct fields do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). A good place to activate this is a package init function or the main() function. - -`SetNilPtrAllowedByRequired` causes validation to pass when struct fields marked by `required` are set to nil. This is disabled by default for consistency, but some packages that need to be able to determine between `nil` and `zero value` state can use this. If disabled, both `nil` and `zero` values cause validation errors. - -```go -import "github.com/asaskevich/govalidator" - -func init() { - govalidator.SetFieldsRequiredByDefault(true) -} -``` - -Here's some code to explain it: -```go -// this struct definition will fail govalidator.ValidateStruct() (and the field values do not matter): -type exampleStruct struct { - Name string `` - Email string `valid:"email"` -} - -// this, however, will only fail when Email is empty or an invalid email address: -type exampleStruct2 struct { - Name string `valid:"-"` - Email string `valid:"email"` -} - -// lastly, this will only fail when Email is an invalid email address but not when it's empty: -type exampleStruct2 struct { - Name string `valid:"-"` - Email string `valid:"email,optional"` -} -``` - -#### Recent breaking changes (see [#123](https://github.com/asaskevich/govalidator/pull/123)) -##### Custom validator function signature -A context was added as the second parameter, for structs this is the object being validated – this makes dependent validation possible. -```go -import "github.com/asaskevich/govalidator" - -// old signature -func(i interface{}) bool - -// new signature -func(i interface{}, o interface{}) bool -``` - -##### Adding a custom validator -This was changed to prevent data races when accessing custom validators. -```go -import "github.com/asaskevich/govalidator" - -// before -govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool { - // ... -} - -// after -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool { - // ... -}) -``` - -#### List of functions: -```go -func Abs(value float64) float64 -func BlackList(str, chars string) string -func ByteLength(str string, params ...string) bool -func CamelCaseToUnderscore(str string) string -func Contains(str, substring string) bool -func Count(array []interface{}, iterator ConditionIterator) int -func Each(array []interface{}, iterator Iterator) -func ErrorByField(e error, field string) string -func ErrorsByField(e error) map[string]string -func Filter(array []interface{}, iterator ConditionIterator) []interface{} -func Find(array []interface{}, iterator ConditionIterator) interface{} -func GetLine(s string, index int) (string, error) -func GetLines(s string) []string -func HasLowerCase(str string) bool -func HasUpperCase(str string) bool -func HasWhitespace(str string) bool -func HasWhitespaceOnly(str string) bool -func InRange(value interface{}, left interface{}, right interface{}) bool -func InRangeFloat32(value, left, right float32) bool -func InRangeFloat64(value, left, right float64) bool -func InRangeInt(value, left, right interface{}) bool -func IsASCII(str string) bool -func IsAlpha(str string) bool -func IsAlphanumeric(str string) bool -func IsBase64(str string) bool -func IsByteLength(str string, min, max int) bool -func IsCIDR(str string) bool -func IsCRC32(str string) bool -func IsCRC32b(str string) bool -func IsCreditCard(str string) bool -func IsDNSName(str string) bool -func IsDataURI(str string) bool -func IsDialString(str string) bool -func IsDivisibleBy(str, num string) bool -func IsEmail(str string) bool -func IsExistingEmail(email string) bool -func IsFilePath(str string) (bool, int) -func IsFloat(str string) bool -func IsFullWidth(str string) bool -func IsHalfWidth(str string) bool -func IsHash(str string, algorithm string) bool -func IsHexadecimal(str string) bool -func IsHexcolor(str string) bool -func IsHost(str string) bool -func IsIP(str string) bool -func IsIPv4(str string) bool -func IsIPv6(str string) bool -func IsISBN(str string, version int) bool -func IsISBN10(str string) bool -func IsISBN13(str string) bool -func IsISO3166Alpha2(str string) bool -func IsISO3166Alpha3(str string) bool -func IsISO4217(str string) bool -func IsISO693Alpha2(str string) bool -func IsISO693Alpha3b(str string) bool -func IsIn(str string, params ...string) bool -func IsInRaw(str string, params ...string) bool -func IsInt(str string) bool -func IsJSON(str string) bool -func IsLatitude(str string) bool -func IsLongitude(str string) bool -func IsLowerCase(str string) bool -func IsMAC(str string) bool -func IsMD4(str string) bool -func IsMD5(str string) bool -func IsMagnetURI(str string) bool -func IsMongoID(str string) bool -func IsMultibyte(str string) bool -func IsNatural(value float64) bool -func IsNegative(value float64) bool -func IsNonNegative(value float64) bool -func IsNonPositive(value float64) bool -func IsNotNull(str string) bool -func IsNull(str string) bool -func IsNumeric(str string) bool -func IsPort(str string) bool -func IsPositive(value float64) bool -func IsPrintableASCII(str string) bool -func IsRFC3339(str string) bool -func IsRFC3339WithoutZone(str string) bool -func IsRGBcolor(str string) bool -func IsRequestURI(rawurl string) bool -func IsRequestURL(rawurl string) bool -func IsRipeMD128(str string) bool -func IsRipeMD160(str string) bool -func IsRsaPub(str string, params ...string) bool -func IsRsaPublicKey(str string, keylen int) bool -func IsSHA1(str string) bool -func IsSHA256(str string) bool -func IsSHA384(str string) bool -func IsSHA512(str string) bool -func IsSSN(str string) bool -func IsSemver(str string) bool -func IsTiger128(str string) bool -func IsTiger160(str string) bool -func IsTiger192(str string) bool -func IsTime(str string, format string) bool -func IsType(v interface{}, params ...string) bool -func IsURL(str string) bool -func IsUTFDigit(str string) bool -func IsUTFLetter(str string) bool -func IsUTFLetterNumeric(str string) bool -func IsUTFNumeric(str string) bool -func IsUUID(str string) bool -func IsUUIDv3(str string) bool -func IsUUIDv4(str string) bool -func IsUUIDv5(str string) bool -func IsUnixTime(str string) bool -func IsUpperCase(str string) bool -func IsVariableWidth(str string) bool -func IsWhole(value float64) bool -func LeftTrim(str, chars string) string -func Map(array []interface{}, iterator ResultIterator) []interface{} -func Matches(str, pattern string) bool -func MaxStringLength(str string, params ...string) bool -func MinStringLength(str string, params ...string) bool -func NormalizeEmail(str string) (string, error) -func PadBoth(str string, padStr string, padLen int) string -func PadLeft(str string, padStr string, padLen int) string -func PadRight(str string, padStr string, padLen int) string -func PrependPathToErrors(err error, path string) error -func Range(str string, params ...string) bool -func RemoveTags(s string) string -func ReplacePattern(str, pattern, replace string) string -func Reverse(s string) string -func RightTrim(str, chars string) string -func RuneLength(str string, params ...string) bool -func SafeFileName(str string) string -func SetFieldsRequiredByDefault(value bool) -func SetNilPtrAllowedByRequired(value bool) -func Sign(value float64) float64 -func StringLength(str string, params ...string) bool -func StringMatches(s string, params ...string) bool -func StripLow(str string, keepNewLines bool) string -func ToBoolean(str string) (bool, error) -func ToFloat(str string) (float64, error) -func ToInt(value interface{}) (res int64, err error) -func ToJSON(obj interface{}) (string, error) -func ToString(obj interface{}) string -func Trim(str, chars string) string -func Truncate(str string, length int, ending string) string -func TruncatingErrorf(str string, args ...interface{}) error -func UnderscoreToCamelCase(s string) string -func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error) -func ValidateStruct(s interface{}) (bool, error) -func WhiteList(str, chars string) string -type ConditionIterator -type CustomTypeValidator -type Error -func (e Error) Error() string -type Errors -func (es Errors) Error() string -func (es Errors) Errors() []error -type ISO3166Entry -type ISO693Entry -type InterfaceParamValidator -type Iterator -type ParamValidator -type ResultIterator -type UnsupportedTypeError -func (e *UnsupportedTypeError) Error() string -type Validator -``` - -#### Examples -###### IsURL -```go -println(govalidator.IsURL(`http://user@pass:domain.com/path/page`)) -``` -###### IsType -```go -println(govalidator.IsType("Bob", "string")) -println(govalidator.IsType(1, "int")) -i := 1 -println(govalidator.IsType(&i, "*int")) -``` - -IsType can be used through the tag `type` which is essential for map validation: -```go -type User struct { - Name string `valid:"type(string)"` - Age int `valid:"type(int)"` - Meta interface{} `valid:"type(string)"` -} -result, err := govalidator.ValidateStruct(user{"Bob", 20, "meta"}) -if err != nil { - println("error: " + err.Error()) -} -println(result) -``` -###### ToString -```go -type User struct { - FirstName string - LastName string -} - -str := govalidator.ToString(&User{"John", "Juan"}) -println(str) -``` -###### Each, Map, Filter, Count for slices -Each iterates over the slice/array and calls Iterator for every item -```go -data := []interface{}{1, 2, 3, 4, 5} -var fn govalidator.Iterator = func(value interface{}, index int) { - println(value.(int)) -} -govalidator.Each(data, fn) -``` -```go -data := []interface{}{1, 2, 3, 4, 5} -var fn govalidator.ResultIterator = func(value interface{}, index int) interface{} { - return value.(int) * 3 -} -_ = govalidator.Map(data, fn) // result = []interface{}{1, 6, 9, 12, 15} -``` -```go -data := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} -var fn govalidator.ConditionIterator = func(value interface{}, index int) bool { - return value.(int)%2 == 0 -} -_ = govalidator.Filter(data, fn) // result = []interface{}{2, 4, 6, 8, 10} -_ = govalidator.Count(data, fn) // result = 5 -``` -###### ValidateStruct [#2](https://github.com/asaskevich/govalidator/pull/2) -If you want to validate structs, you can use tag `valid` for any field in your structure. All validators used with this field in one tag are separated by comma. If you want to skip validation, place `-` in your tag. If you need a validator that is not on the list below, you can add it like this: -```go -govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool { - return str == "duck" -}) -``` -For completely custom validators (interface-based), see below. - -Here is a list of available validators for struct fields (validator - used function): -```go -"email": IsEmail, -"url": IsURL, -"dialstring": IsDialString, -"requrl": IsRequestURL, -"requri": IsRequestURI, -"alpha": IsAlpha, -"utfletter": IsUTFLetter, -"alphanum": IsAlphanumeric, -"utfletternum": IsUTFLetterNumeric, -"numeric": IsNumeric, -"utfnumeric": IsUTFNumeric, -"utfdigit": IsUTFDigit, -"hexadecimal": IsHexadecimal, -"hexcolor": IsHexcolor, -"rgbcolor": IsRGBcolor, -"lowercase": IsLowerCase, -"uppercase": IsUpperCase, -"int": IsInt, -"float": IsFloat, -"null": IsNull, -"uuid": IsUUID, -"uuidv3": IsUUIDv3, -"uuidv4": IsUUIDv4, -"uuidv5": IsUUIDv5, -"creditcard": IsCreditCard, -"isbn10": IsISBN10, -"isbn13": IsISBN13, -"json": IsJSON, -"multibyte": IsMultibyte, -"ascii": IsASCII, -"printableascii": IsPrintableASCII, -"fullwidth": IsFullWidth, -"halfwidth": IsHalfWidth, -"variablewidth": IsVariableWidth, -"base64": IsBase64, -"datauri": IsDataURI, -"ip": IsIP, -"port": IsPort, -"ipv4": IsIPv4, -"ipv6": IsIPv6, -"dns": IsDNSName, -"host": IsHost, -"mac": IsMAC, -"latitude": IsLatitude, -"longitude": IsLongitude, -"ssn": IsSSN, -"semver": IsSemver, -"rfc3339": IsRFC3339, -"rfc3339WithoutZone": IsRFC3339WithoutZone, -"ISO3166Alpha2": IsISO3166Alpha2, -"ISO3166Alpha3": IsISO3166Alpha3, -``` -Validators with parameters - -```go -"range(min|max)": Range, -"length(min|max)": ByteLength, -"runelength(min|max)": RuneLength, -"stringlength(min|max)": StringLength, -"matches(pattern)": StringMatches, -"in(string1|string2|...|stringN)": IsIn, -"rsapub(keylength)" : IsRsaPub, -``` -Validators with parameters for any type - -```go -"type(type)": IsType, -``` - -And here is small example of usage: -```go -type Post struct { - Title string `valid:"alphanum,required"` - Message string `valid:"duck,ascii"` - Message2 string `valid:"animal(dog)"` - AuthorIP string `valid:"ipv4"` - Date string `valid:"-"` -} -post := &Post{ - Title: "My Example Post", - Message: "duck", - Message2: "dog", - AuthorIP: "123.234.54.3", -} - -// Add your own struct validation tags -govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool { - return str == "duck" -}) - -// Add your own struct validation tags with parameter -govalidator.ParamTagMap["animal"] = govalidator.ParamValidator(func(str string, params ...string) bool { - species := params[0] - return str == species -}) -govalidator.ParamTagRegexMap["animal"] = regexp.MustCompile("^animal\\((\\w+)\\)$") - -result, err := govalidator.ValidateStruct(post) -if err != nil { - println("error: " + err.Error()) -} -println(result) -``` -###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338) -If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}` - -So here is small example of usage: -```go -var mapTemplate = map[string]interface{}{ - "name":"required,alpha", - "family":"required,alpha", - "email":"required,email", - "cell-phone":"numeric", - "address":map[string]interface{}{ - "line1":"required,alphanum", - "line2":"alphanum", - "postal-code":"numeric", - }, -} - -var inputMap = map[string]interface{}{ - "name":"Bob", - "family":"Smith", - "email":"foo@bar.baz", - "address":map[string]interface{}{ - "line1":"", - "line2":"", - "postal-code":"", - }, -} - -result, err := govalidator.ValidateMap(inputMap, mapTemplate) -if err != nil { - println("error: " + err.Error()) -} -println(result) -``` - -###### WhiteList -```go -// Remove all characters from string ignoring characters between "a" and "z" -println(govalidator.WhiteList("a3a43a5a4a3a2a23a4a5a4a3a4", "a-z") == "aaaaaaaaaaaa") -``` - -###### Custom validation functions -Custom validation using your own domain specific validators is also available - here's an example of how to use it: -```go -import "github.com/asaskevich/govalidator" - -type CustomByteArray [6]byte // custom types are supported and can be validated - -type StructWithCustomByteArray struct { - ID CustomByteArray `valid:"customByteArrayValidator,customMinLengthValidator"` // multiple custom validators are possible as well and will be evaluated in sequence - Email string `valid:"email"` - CustomMinLength int `valid:"-"` -} - -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool { - switch v := context.(type) { // you can type switch on the context interface being validated - case StructWithCustomByteArray: - // you can check and validate against some other field in the context, - // return early or not validate against the context at all – your choice - case SomeOtherType: - // ... - default: - // expecting some other type? Throw/panic here or continue - } - - switch v := i.(type) { // type switch on the struct field being validated - case CustomByteArray: - for _, e := range v { // this validator checks that the byte array is not empty, i.e. not all zeroes - if e != 0 { - return true - } - } - } - return false -}) -govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool { - switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation - case StructWithCustomByteArray: - return len(v.ID) >= v.CustomMinLength - } - return false -}) -``` - -###### Loop over Error() -By default .Error() returns all errors in a single String. To access each error you can do this: -```go - if err != nil { - errs := err.(govalidator.Errors).Errors() - for _, e := range errs { - fmt.Println(e.Error()) - } - } -``` - -###### Custom error messages -Custom error messages are supported via annotations by adding the `~` separator - here's an example of how to use it: -```go -type Ticket struct { - Id int64 `json:"id"` - FirstName string `json:"firstname" valid:"required~First name is blank"` -} -``` - -#### Notes -Documentation is available here: [godoc.org](https://godoc.org/github.com/asaskevich/govalidator). -Full information about code coverage is also available here: [govalidator on gocover.io](http://gocover.io/github.com/asaskevich/govalidator). - -#### Support -If you do have a contribution to the package, feel free to create a Pull Request or an Issue. - -#### What to contribute -If you don't know what to do, there are some features and functions that need to be done - -- [ ] Refactor code -- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check -- [ ] Create actual list of contributors and projects that currently using this package -- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues) -- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) -- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new -- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) -- [ ] Implement fuzzing testing -- [ ] Implement some struct/map/array utilities -- [ ] Implement map/array validation -- [ ] Implement benchmarking -- [ ] Implement batch of examples -- [ ] Look at forks for new features and fixes - -#### Advice -Feel free to create what you want, but keep in mind when you implement new features: -- Code must be clear and readable, names of variables/constants clearly describes what they are doing -- Public functions must be documented and described in source file and added to README.md to the list of available functions -- There are must be unit-tests for any new functions and improvements - -## Credits -### Contributors - -This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. - -#### Special thanks to [contributors](https://github.com/asaskevich/govalidator/graphs/contributors) -* [Daniel Lohse](https://github.com/annismckenzie) -* [Attila Oláh](https://github.com/attilaolah) -* [Daniel Korner](https://github.com/Dadie) -* [Steven Wilkin](https://github.com/stevenwilkin) -* [Deiwin Sarjas](https://github.com/deiwin) -* [Noah Shibley](https://github.com/slugmobile) -* [Nathan Davies](https://github.com/nathj07) -* [Matt Sanford](https://github.com/mzsanford) -* [Simon ccl1115](https://github.com/ccl1115) - - - - -### Backers - -Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/govalidator#backer)] - - - - -### Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/govalidator#sponsor)] - - - - - - - - - - - - - - - -## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) diff --git a/vendor/github.com/asaskevich/govalidator/arrays.go b/vendor/github.com/asaskevich/govalidator/arrays.go deleted file mode 100644 index 5bace265..00000000 --- a/vendor/github.com/asaskevich/govalidator/arrays.go +++ /dev/null @@ -1,58 +0,0 @@ -package govalidator - -// Iterator is the function that accepts element of slice/array and its index -type Iterator func(interface{}, int) - -// ResultIterator is the function that accepts element of slice/array and its index and returns any result -type ResultIterator func(interface{}, int) interface{} - -// ConditionIterator is the function that accepts element of slice/array and its index and returns boolean -type ConditionIterator func(interface{}, int) bool - -// Each iterates over the slice and apply Iterator to every item -func Each(array []interface{}, iterator Iterator) { - for index, data := range array { - iterator(data, index) - } -} - -// Map iterates over the slice and apply ResultIterator to every item. Returns new slice as a result. -func Map(array []interface{}, iterator ResultIterator) []interface{} { - var result = make([]interface{}, len(array)) - for index, data := range array { - result[index] = iterator(data, index) - } - return result -} - -// Find iterates over the slice and apply ConditionIterator to every item. Returns first item that meet ConditionIterator or nil otherwise. -func Find(array []interface{}, iterator ConditionIterator) interface{} { - for index, data := range array { - if iterator(data, index) { - return data - } - } - return nil -} - -// Filter iterates over the slice and apply ConditionIterator to every item. Returns new slice. -func Filter(array []interface{}, iterator ConditionIterator) []interface{} { - var result = make([]interface{}, 0) - for index, data := range array { - if iterator(data, index) { - result = append(result, data) - } - } - return result -} - -// Count iterates over the slice and apply ConditionIterator to every item. Returns count of items that meets ConditionIterator. -func Count(array []interface{}, iterator ConditionIterator) int { - count := 0 - for index, data := range array { - if iterator(data, index) { - count = count + 1 - } - } - return count -} diff --git a/vendor/github.com/asaskevich/govalidator/converter.go b/vendor/github.com/asaskevich/govalidator/converter.go deleted file mode 100644 index cf1e5d56..00000000 --- a/vendor/github.com/asaskevich/govalidator/converter.go +++ /dev/null @@ -1,64 +0,0 @@ -package govalidator - -import ( - "encoding/json" - "fmt" - "reflect" - "strconv" -) - -// ToString convert the input to a string. -func ToString(obj interface{}) string { - res := fmt.Sprintf("%v", obj) - return string(res) -} - -// ToJSON convert the input to a valid JSON string -func ToJSON(obj interface{}) (string, error) { - res, err := json.Marshal(obj) - if err != nil { - res = []byte("") - } - return string(res), err -} - -// ToFloat convert the input string to a float, or 0.0 if the input is not a float. -func ToFloat(str string) (float64, error) { - res, err := strconv.ParseFloat(str, 64) - if err != nil { - res = 0.0 - } - return res, err -} - -// ToInt convert the input string or any int type to an integer type 64, or 0 if the input is not an integer. -func ToInt(value interface{}) (res int64, err error) { - val := reflect.ValueOf(value) - - switch value.(type) { - case int, int8, int16, int32, int64: - res = val.Int() - case uint, uint8, uint16, uint32, uint64: - res = int64(val.Uint()) - case string: - if IsInt(val.String()) { - res, err = strconv.ParseInt(val.String(), 0, 64) - if err != nil { - res = 0 - } - } else { - err = fmt.Errorf("math: square root of negative number %g", value) - res = 0 - } - default: - err = fmt.Errorf("math: square root of negative number %g", value) - res = 0 - } - - return -} - -// ToBoolean convert the input string to a boolean. -func ToBoolean(str string) (bool, error) { - return strconv.ParseBool(str) -} diff --git a/vendor/github.com/asaskevich/govalidator/doc.go b/vendor/github.com/asaskevich/govalidator/doc.go deleted file mode 100644 index 55dce62d..00000000 --- a/vendor/github.com/asaskevich/govalidator/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -package govalidator - -// A package of validators and sanitizers for strings, structures and collections. diff --git a/vendor/github.com/asaskevich/govalidator/error.go b/vendor/github.com/asaskevich/govalidator/error.go deleted file mode 100644 index 1da2336f..00000000 --- a/vendor/github.com/asaskevich/govalidator/error.go +++ /dev/null @@ -1,47 +0,0 @@ -package govalidator - -import ( - "sort" - "strings" -) - -// Errors is an array of multiple errors and conforms to the error interface. -type Errors []error - -// Errors returns itself. -func (es Errors) Errors() []error { - return es -} - -func (es Errors) Error() string { - var errs []string - for _, e := range es { - errs = append(errs, e.Error()) - } - sort.Strings(errs) - return strings.Join(errs, ";") -} - -// Error encapsulates a name, an error and whether there's a custom error message or not. -type Error struct { - Name string - Err error - CustomErrorMessageExists bool - - // Validator indicates the name of the validator that failed - Validator string - Path []string -} - -func (e Error) Error() string { - if e.CustomErrorMessageExists { - return e.Err.Error() - } - - errName := e.Name - if len(e.Path) > 0 { - errName = strings.Join(append(e.Path, e.Name), ".") - } - - return errName + ": " + e.Err.Error() -} diff --git a/vendor/github.com/asaskevich/govalidator/go.mod b/vendor/github.com/asaskevich/govalidator/go.mod deleted file mode 100644 index c1ce891d..00000000 --- a/vendor/github.com/asaskevich/govalidator/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/asaskevich/govalidator - -go 1.12 diff --git a/vendor/github.com/asaskevich/govalidator/numerics.go b/vendor/github.com/asaskevich/govalidator/numerics.go deleted file mode 100644 index 7e6c652e..00000000 --- a/vendor/github.com/asaskevich/govalidator/numerics.go +++ /dev/null @@ -1,97 +0,0 @@ -package govalidator - -import ( - "math" - "reflect" -) - -// Abs returns absolute value of number -func Abs(value float64) float64 { - return math.Abs(value) -} - -// Sign returns signum of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise -func Sign(value float64) float64 { - if value > 0 { - return 1 - } else if value < 0 { - return -1 - } else { - return 0 - } -} - -// IsNegative returns true if value < 0 -func IsNegative(value float64) bool { - return value < 0 -} - -// IsPositive returns true if value > 0 -func IsPositive(value float64) bool { - return value > 0 -} - -// IsNonNegative returns true if value >= 0 -func IsNonNegative(value float64) bool { - return value >= 0 -} - -// IsNonPositive returns true if value <= 0 -func IsNonPositive(value float64) bool { - return value <= 0 -} - -// InRange returns true if value lies between left and right border -func InRangeInt(value, left, right interface{}) bool { - value64, _ := ToInt(value) - left64, _ := ToInt(left) - right64, _ := ToInt(right) - if left64 > right64 { - left64, right64 = right64, left64 - } - return value64 >= left64 && value64 <= right64 -} - -// InRange returns true if value lies between left and right border -func InRangeFloat32(value, left, right float32) bool { - if left > right { - left, right = right, left - } - return value >= left && value <= right -} - -// InRange returns true if value lies between left and right border -func InRangeFloat64(value, left, right float64) bool { - if left > right { - left, right = right, left - } - return value >= left && value <= right -} - -// InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type -func InRange(value interface{}, left interface{}, right interface{}) bool { - - reflectValue := reflect.TypeOf(value).Kind() - reflectLeft := reflect.TypeOf(left).Kind() - reflectRight := reflect.TypeOf(right).Kind() - - if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int { - return InRangeInt(value.(int), left.(int), right.(int)) - } else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 { - return InRangeFloat32(value.(float32), left.(float32), right.(float32)) - } else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 { - return InRangeFloat64(value.(float64), left.(float64), right.(float64)) - } else { - return false - } -} - -// IsWhole returns true if value is whole number -func IsWhole(value float64) bool { - return math.Remainder(value, 1) == 0 -} - -// IsNatural returns true if value is natural number (positive and whole) -func IsNatural(value float64) bool { - return IsWhole(value) && IsPositive(value) -} diff --git a/vendor/github.com/asaskevich/govalidator/patterns.go b/vendor/github.com/asaskevich/govalidator/patterns.go deleted file mode 100644 index e55451cf..00000000 --- a/vendor/github.com/asaskevich/govalidator/patterns.go +++ /dev/null @@ -1,105 +0,0 @@ -package govalidator - -import "regexp" - -// Basic regular expressions for validating strings -const ( - Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" - CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$" - ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" - ISBN13 string = "^(?:[0-9]{13})$" - UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" - UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" - Alpha string = "^[a-zA-Z]+$" - Alphanumeric string = "^[a-zA-Z0-9]+$" - Numeric string = "^[0-9]+$" - Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" - Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" - Hexadecimal string = "^[0-9a-fA-F]+$" - Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" - RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" - ASCII string = "^[\x00-\x7F]+$" - Multibyte string = "[^\x00-\x7F]" - FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" - PrintableASCII string = "^[\x20-\x7E]+$" - DataURI string = "^data:.+\\/(.+);base64$" - MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$" - Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" - Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" - DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` - IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` - URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` - URLUsername string = `(\S+(:\S*)?@)` - URLPath string = `((\/|\?|#)[^\s]*)` - URLPort string = `(:(\d{1,5}))` - URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))` - URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` - URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` - SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` - WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` - UnixPath string = `^(/[^/\x00]*)+/?$` - Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" - tagName string = "valid" - hasLowerCase string = ".*[[:lower:]]" - hasUpperCase string = ".*[[:upper:]]" - hasWhitespace string = ".*[[:space:]]" - hasWhitespaceOnly string = "^[[:space:]]+$" - IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" -) - -// Used by IsFilePath func -const ( - // Unknown is unresolved OS type - Unknown = iota - // Win is Windows type - Win - // Unix is *nix OS types - Unix -) - -var ( - userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") - hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") - userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") - rxEmail = regexp.MustCompile(Email) - rxCreditCard = regexp.MustCompile(CreditCard) - rxISBN10 = regexp.MustCompile(ISBN10) - rxISBN13 = regexp.MustCompile(ISBN13) - rxUUID3 = regexp.MustCompile(UUID3) - rxUUID4 = regexp.MustCompile(UUID4) - rxUUID5 = regexp.MustCompile(UUID5) - rxUUID = regexp.MustCompile(UUID) - rxAlpha = regexp.MustCompile(Alpha) - rxAlphanumeric = regexp.MustCompile(Alphanumeric) - rxNumeric = regexp.MustCompile(Numeric) - rxInt = regexp.MustCompile(Int) - rxFloat = regexp.MustCompile(Float) - rxHexadecimal = regexp.MustCompile(Hexadecimal) - rxHexcolor = regexp.MustCompile(Hexcolor) - rxRGBcolor = regexp.MustCompile(RGBcolor) - rxASCII = regexp.MustCompile(ASCII) - rxPrintableASCII = regexp.MustCompile(PrintableASCII) - rxMultibyte = regexp.MustCompile(Multibyte) - rxFullWidth = regexp.MustCompile(FullWidth) - rxHalfWidth = regexp.MustCompile(HalfWidth) - rxBase64 = regexp.MustCompile(Base64) - rxDataURI = regexp.MustCompile(DataURI) - rxMagnetURI = regexp.MustCompile(MagnetURI) - rxLatitude = regexp.MustCompile(Latitude) - rxLongitude = regexp.MustCompile(Longitude) - rxDNSName = regexp.MustCompile(DNSName) - rxURL = regexp.MustCompile(URL) - rxSSN = regexp.MustCompile(SSN) - rxWinPath = regexp.MustCompile(WinPath) - rxUnixPath = regexp.MustCompile(UnixPath) - rxSemver = regexp.MustCompile(Semver) - rxHasLowerCase = regexp.MustCompile(hasLowerCase) - rxHasUpperCase = regexp.MustCompile(hasUpperCase) - rxHasWhitespace = regexp.MustCompile(hasWhitespace) - rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) - rxIMEI = regexp.MustCompile(IMEI) -) diff --git a/vendor/github.com/asaskevich/govalidator/types.go b/vendor/github.com/asaskevich/govalidator/types.go deleted file mode 100644 index b57b666f..00000000 --- a/vendor/github.com/asaskevich/govalidator/types.go +++ /dev/null @@ -1,653 +0,0 @@ -package govalidator - -import ( - "reflect" - "regexp" - "sort" - "sync" -) - -// Validator is a wrapper for a validator function that returns bool and accepts string. -type Validator func(str string) bool - -// CustomTypeValidator is a wrapper for validator functions that returns bool and accepts any type. -// The second parameter should be the context (in the case of validating a struct: the whole object being validated). -type CustomTypeValidator func(i interface{}, o interface{}) bool - -// ParamValidator is a wrapper for validator functions that accepts additional parameters. -type ParamValidator func(str string, params ...string) bool -type InterfaceParamValidator func(in interface{}, params ...string) bool -type tagOptionsMap map[string]tagOption - -func (t tagOptionsMap) orderedKeys() []string { - var keys []string - for k := range t { - keys = append(keys, k) - } - - sort.Slice(keys, func(a, b int) bool { - return t[keys[a]].order < t[keys[b]].order - }) - - return keys -} - -type tagOption struct { - name string - customErrorMessage string - order int -} - -// UnsupportedTypeError is a wrapper for reflect.Type -type UnsupportedTypeError struct { - Type reflect.Type -} - -// stringValues is a slice of reflect.Value holding *reflect.StringValue. -// It implements the methods to sort by string. -type stringValues []reflect.Value - -// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value -var InterfaceParamTagMap = map[string]InterfaceParamValidator{ - "type": IsType, -} - -// InterfaceParamTagRegexMap maps interface param tags to their respective regexes. -var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{ - "type": regexp.MustCompile(`^type\((.*)\)$`), -} - -// ParamTagMap is a map of functions accept variants parameters -var ParamTagMap = map[string]ParamValidator{ - "length": ByteLength, - "range": Range, - "runelength": RuneLength, - "stringlength": StringLength, - "matches": StringMatches, - "in": IsInRaw, - "rsapub": IsRsaPub, - "minstringlength": MinStringLength, - "maxstringlength": MaxStringLength, -} - -// ParamTagRegexMap maps param tags to their respective regexes. -var ParamTagRegexMap = map[string]*regexp.Regexp{ - "range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), - "length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), - "runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), - "stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), - "in": regexp.MustCompile(`^in\((.*)\)`), - "matches": regexp.MustCompile(`^matches\((.+)\)$`), - "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), - "minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), - "maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), -} - -type customTypeTagMap struct { - validators map[string]CustomTypeValidator - - sync.RWMutex -} - -func (tm *customTypeTagMap) Get(name string) (CustomTypeValidator, bool) { - tm.RLock() - defer tm.RUnlock() - v, ok := tm.validators[name] - return v, ok -} - -func (tm *customTypeTagMap) Set(name string, ctv CustomTypeValidator) { - tm.Lock() - defer tm.Unlock() - tm.validators[name] = ctv -} - -// CustomTypeTagMap is a map of functions that can be used as tags for ValidateStruct function. -// Use this to validate compound or custom types that need to be handled as a whole, e.g. -// `type UUID [16]byte` (this would be handled as an array of bytes). -var CustomTypeTagMap = &customTypeTagMap{validators: make(map[string]CustomTypeValidator)} - -// TagMap is a map of functions, that can be used as tags for ValidateStruct function. -var TagMap = map[string]Validator{ - "email": IsEmail, - "url": IsURL, - "dialstring": IsDialString, - "requrl": IsRequestURL, - "requri": IsRequestURI, - "alpha": IsAlpha, - "utfletter": IsUTFLetter, - "alphanum": IsAlphanumeric, - "utfletternum": IsUTFLetterNumeric, - "numeric": IsNumeric, - "utfnumeric": IsUTFNumeric, - "utfdigit": IsUTFDigit, - "hexadecimal": IsHexadecimal, - "hexcolor": IsHexcolor, - "rgbcolor": IsRGBcolor, - "lowercase": IsLowerCase, - "uppercase": IsUpperCase, - "int": IsInt, - "float": IsFloat, - "null": IsNull, - "notnull": IsNotNull, - "uuid": IsUUID, - "uuidv3": IsUUIDv3, - "uuidv4": IsUUIDv4, - "uuidv5": IsUUIDv5, - "creditcard": IsCreditCard, - "isbn10": IsISBN10, - "isbn13": IsISBN13, - "json": IsJSON, - "multibyte": IsMultibyte, - "ascii": IsASCII, - "printableascii": IsPrintableASCII, - "fullwidth": IsFullWidth, - "halfwidth": IsHalfWidth, - "variablewidth": IsVariableWidth, - "base64": IsBase64, - "datauri": IsDataURI, - "ip": IsIP, - "port": IsPort, - "ipv4": IsIPv4, - "ipv6": IsIPv6, - "dns": IsDNSName, - "host": IsHost, - "mac": IsMAC, - "latitude": IsLatitude, - "longitude": IsLongitude, - "ssn": IsSSN, - "semver": IsSemver, - "rfc3339": IsRFC3339, - "rfc3339WithoutZone": IsRFC3339WithoutZone, - "ISO3166Alpha2": IsISO3166Alpha2, - "ISO3166Alpha3": IsISO3166Alpha3, - "ISO4217": IsISO4217, - "IMEI": IsIMEI, -} - -// ISO3166Entry stores country codes -type ISO3166Entry struct { - EnglishShortName string - FrenchShortName string - Alpha2Code string - Alpha3Code string - Numeric string -} - -//ISO3166List based on https://www.iso.org/obp/ui/#search/code/ Code Type "Officially Assigned Codes" -var ISO3166List = []ISO3166Entry{ - {"Afghanistan", "Afghanistan (l')", "AF", "AFG", "004"}, - {"Albania", "Albanie (l')", "AL", "ALB", "008"}, - {"Antarctica", "Antarctique (l')", "AQ", "ATA", "010"}, - {"Algeria", "Algérie (l')", "DZ", "DZA", "012"}, - {"American Samoa", "Samoa américaines (les)", "AS", "ASM", "016"}, - {"Andorra", "Andorre (l')", "AD", "AND", "020"}, - {"Angola", "Angola (l')", "AO", "AGO", "024"}, - {"Antigua and Barbuda", "Antigua-et-Barbuda", "AG", "ATG", "028"}, - {"Azerbaijan", "Azerbaïdjan (l')", "AZ", "AZE", "031"}, - {"Argentina", "Argentine (l')", "AR", "ARG", "032"}, - {"Australia", "Australie (l')", "AU", "AUS", "036"}, - {"Austria", "Autriche (l')", "AT", "AUT", "040"}, - {"Bahamas (the)", "Bahamas (les)", "BS", "BHS", "044"}, - {"Bahrain", "Bahreïn", "BH", "BHR", "048"}, - {"Bangladesh", "Bangladesh (le)", "BD", "BGD", "050"}, - {"Armenia", "Arménie (l')", "AM", "ARM", "051"}, - {"Barbados", "Barbade (la)", "BB", "BRB", "052"}, - {"Belgium", "Belgique (la)", "BE", "BEL", "056"}, - {"Bermuda", "Bermudes (les)", "BM", "BMU", "060"}, - {"Bhutan", "Bhoutan (le)", "BT", "BTN", "064"}, - {"Bolivia (Plurinational State of)", "Bolivie (État plurinational de)", "BO", "BOL", "068"}, - {"Bosnia and Herzegovina", "Bosnie-Herzégovine (la)", "BA", "BIH", "070"}, - {"Botswana", "Botswana (le)", "BW", "BWA", "072"}, - {"Bouvet Island", "Bouvet (l'Île)", "BV", "BVT", "074"}, - {"Brazil", "Brésil (le)", "BR", "BRA", "076"}, - {"Belize", "Belize (le)", "BZ", "BLZ", "084"}, - {"British Indian Ocean Territory (the)", "Indien (le Territoire britannique de l'océan)", "IO", "IOT", "086"}, - {"Solomon Islands", "Salomon (Îles)", "SB", "SLB", "090"}, - {"Virgin Islands (British)", "Vierges britanniques (les Îles)", "VG", "VGB", "092"}, - {"Brunei Darussalam", "Brunéi Darussalam (le)", "BN", "BRN", "096"}, - {"Bulgaria", "Bulgarie (la)", "BG", "BGR", "100"}, - {"Myanmar", "Myanmar (le)", "MM", "MMR", "104"}, - {"Burundi", "Burundi (le)", "BI", "BDI", "108"}, - {"Belarus", "Bélarus (le)", "BY", "BLR", "112"}, - {"Cambodia", "Cambodge (le)", "KH", "KHM", "116"}, - {"Cameroon", "Cameroun (le)", "CM", "CMR", "120"}, - {"Canada", "Canada (le)", "CA", "CAN", "124"}, - {"Cabo Verde", "Cabo Verde", "CV", "CPV", "132"}, - {"Cayman Islands (the)", "Caïmans (les Îles)", "KY", "CYM", "136"}, - {"Central African Republic (the)", "République centrafricaine (la)", "CF", "CAF", "140"}, - {"Sri Lanka", "Sri Lanka", "LK", "LKA", "144"}, - {"Chad", "Tchad (le)", "TD", "TCD", "148"}, - {"Chile", "Chili (le)", "CL", "CHL", "152"}, - {"China", "Chine (la)", "CN", "CHN", "156"}, - {"Taiwan (Province of China)", "Taïwan (Province de Chine)", "TW", "TWN", "158"}, - {"Christmas Island", "Christmas (l'Île)", "CX", "CXR", "162"}, - {"Cocos (Keeling) Islands (the)", "Cocos (les Îles)/ Keeling (les Îles)", "CC", "CCK", "166"}, - {"Colombia", "Colombie (la)", "CO", "COL", "170"}, - {"Comoros (the)", "Comores (les)", "KM", "COM", "174"}, - {"Mayotte", "Mayotte", "YT", "MYT", "175"}, - {"Congo (the)", "Congo (le)", "CG", "COG", "178"}, - {"Congo (the Democratic Republic of the)", "Congo (la République démocratique du)", "CD", "COD", "180"}, - {"Cook Islands (the)", "Cook (les Îles)", "CK", "COK", "184"}, - {"Costa Rica", "Costa Rica (le)", "CR", "CRI", "188"}, - {"Croatia", "Croatie (la)", "HR", "HRV", "191"}, - {"Cuba", "Cuba", "CU", "CUB", "192"}, - {"Cyprus", "Chypre", "CY", "CYP", "196"}, - {"Czech Republic (the)", "tchèque (la République)", "CZ", "CZE", "203"}, - {"Benin", "Bénin (le)", "BJ", "BEN", "204"}, - {"Denmark", "Danemark (le)", "DK", "DNK", "208"}, - {"Dominica", "Dominique (la)", "DM", "DMA", "212"}, - {"Dominican Republic (the)", "dominicaine (la République)", "DO", "DOM", "214"}, - {"Ecuador", "Équateur (l')", "EC", "ECU", "218"}, - {"El Salvador", "El Salvador", "SV", "SLV", "222"}, - {"Equatorial Guinea", "Guinée équatoriale (la)", "GQ", "GNQ", "226"}, - {"Ethiopia", "Éthiopie (l')", "ET", "ETH", "231"}, - {"Eritrea", "Érythrée (l')", "ER", "ERI", "232"}, - {"Estonia", "Estonie (l')", "EE", "EST", "233"}, - {"Faroe Islands (the)", "Féroé (les Îles)", "FO", "FRO", "234"}, - {"Falkland Islands (the) [Malvinas]", "Falkland (les Îles)/Malouines (les Îles)", "FK", "FLK", "238"}, - {"South Georgia and the South Sandwich Islands", "Géorgie du Sud-et-les Îles Sandwich du Sud (la)", "GS", "SGS", "239"}, - {"Fiji", "Fidji (les)", "FJ", "FJI", "242"}, - {"Finland", "Finlande (la)", "FI", "FIN", "246"}, - {"Åland Islands", "Åland(les Îles)", "AX", "ALA", "248"}, - {"France", "France (la)", "FR", "FRA", "250"}, - {"French Guiana", "Guyane française (la )", "GF", "GUF", "254"}, - {"French Polynesia", "Polynésie française (la)", "PF", "PYF", "258"}, - {"French Southern Territories (the)", "Terres australes françaises (les)", "TF", "ATF", "260"}, - {"Djibouti", "Djibouti", "DJ", "DJI", "262"}, - {"Gabon", "Gabon (le)", "GA", "GAB", "266"}, - {"Georgia", "Géorgie (la)", "GE", "GEO", "268"}, - {"Gambia (the)", "Gambie (la)", "GM", "GMB", "270"}, - {"Palestine, State of", "Palestine, État de", "PS", "PSE", "275"}, - {"Germany", "Allemagne (l')", "DE", "DEU", "276"}, - {"Ghana", "Ghana (le)", "GH", "GHA", "288"}, - {"Gibraltar", "Gibraltar", "GI", "GIB", "292"}, - {"Kiribati", "Kiribati", "KI", "KIR", "296"}, - {"Greece", "Grèce (la)", "GR", "GRC", "300"}, - {"Greenland", "Groenland (le)", "GL", "GRL", "304"}, - {"Grenada", "Grenade (la)", "GD", "GRD", "308"}, - {"Guadeloupe", "Guadeloupe (la)", "GP", "GLP", "312"}, - {"Guam", "Guam", "GU", "GUM", "316"}, - {"Guatemala", "Guatemala (le)", "GT", "GTM", "320"}, - {"Guinea", "Guinée (la)", "GN", "GIN", "324"}, - {"Guyana", "Guyana (le)", "GY", "GUY", "328"}, - {"Haiti", "Haïti", "HT", "HTI", "332"}, - {"Heard Island and McDonald Islands", "Heard-et-Îles MacDonald (l'Île)", "HM", "HMD", "334"}, - {"Holy See (the)", "Saint-Siège (le)", "VA", "VAT", "336"}, - {"Honduras", "Honduras (le)", "HN", "HND", "340"}, - {"Hong Kong", "Hong Kong", "HK", "HKG", "344"}, - {"Hungary", "Hongrie (la)", "HU", "HUN", "348"}, - {"Iceland", "Islande (l')", "IS", "ISL", "352"}, - {"India", "Inde (l')", "IN", "IND", "356"}, - {"Indonesia", "Indonésie (l')", "ID", "IDN", "360"}, - {"Iran (Islamic Republic of)", "Iran (République Islamique d')", "IR", "IRN", "364"}, - {"Iraq", "Iraq (l')", "IQ", "IRQ", "368"}, - {"Ireland", "Irlande (l')", "IE", "IRL", "372"}, - {"Israel", "Israël", "IL", "ISR", "376"}, - {"Italy", "Italie (l')", "IT", "ITA", "380"}, - {"Côte d'Ivoire", "Côte d'Ivoire (la)", "CI", "CIV", "384"}, - {"Jamaica", "Jamaïque (la)", "JM", "JAM", "388"}, - {"Japan", "Japon (le)", "JP", "JPN", "392"}, - {"Kazakhstan", "Kazakhstan (le)", "KZ", "KAZ", "398"}, - {"Jordan", "Jordanie (la)", "JO", "JOR", "400"}, - {"Kenya", "Kenya (le)", "KE", "KEN", "404"}, - {"Korea (the Democratic People's Republic of)", "Corée (la République populaire démocratique de)", "KP", "PRK", "408"}, - {"Korea (the Republic of)", "Corée (la République de)", "KR", "KOR", "410"}, - {"Kuwait", "Koweït (le)", "KW", "KWT", "414"}, - {"Kyrgyzstan", "Kirghizistan (le)", "KG", "KGZ", "417"}, - {"Lao People's Democratic Republic (the)", "Lao, République démocratique populaire", "LA", "LAO", "418"}, - {"Lebanon", "Liban (le)", "LB", "LBN", "422"}, - {"Lesotho", "Lesotho (le)", "LS", "LSO", "426"}, - {"Latvia", "Lettonie (la)", "LV", "LVA", "428"}, - {"Liberia", "Libéria (le)", "LR", "LBR", "430"}, - {"Libya", "Libye (la)", "LY", "LBY", "434"}, - {"Liechtenstein", "Liechtenstein (le)", "LI", "LIE", "438"}, - {"Lithuania", "Lituanie (la)", "LT", "LTU", "440"}, - {"Luxembourg", "Luxembourg (le)", "LU", "LUX", "442"}, - {"Macao", "Macao", "MO", "MAC", "446"}, - {"Madagascar", "Madagascar", "MG", "MDG", "450"}, - {"Malawi", "Malawi (le)", "MW", "MWI", "454"}, - {"Malaysia", "Malaisie (la)", "MY", "MYS", "458"}, - {"Maldives", "Maldives (les)", "MV", "MDV", "462"}, - {"Mali", "Mali (le)", "ML", "MLI", "466"}, - {"Malta", "Malte", "MT", "MLT", "470"}, - {"Martinique", "Martinique (la)", "MQ", "MTQ", "474"}, - {"Mauritania", "Mauritanie (la)", "MR", "MRT", "478"}, - {"Mauritius", "Maurice", "MU", "MUS", "480"}, - {"Mexico", "Mexique (le)", "MX", "MEX", "484"}, - {"Monaco", "Monaco", "MC", "MCO", "492"}, - {"Mongolia", "Mongolie (la)", "MN", "MNG", "496"}, - {"Moldova (the Republic of)", "Moldova , République de", "MD", "MDA", "498"}, - {"Montenegro", "Monténégro (le)", "ME", "MNE", "499"}, - {"Montserrat", "Montserrat", "MS", "MSR", "500"}, - {"Morocco", "Maroc (le)", "MA", "MAR", "504"}, - {"Mozambique", "Mozambique (le)", "MZ", "MOZ", "508"}, - {"Oman", "Oman", "OM", "OMN", "512"}, - {"Namibia", "Namibie (la)", "NA", "NAM", "516"}, - {"Nauru", "Nauru", "NR", "NRU", "520"}, - {"Nepal", "Népal (le)", "NP", "NPL", "524"}, - {"Netherlands (the)", "Pays-Bas (les)", "NL", "NLD", "528"}, - {"Curaçao", "Curaçao", "CW", "CUW", "531"}, - {"Aruba", "Aruba", "AW", "ABW", "533"}, - {"Sint Maarten (Dutch part)", "Saint-Martin (partie néerlandaise)", "SX", "SXM", "534"}, - {"Bonaire, Sint Eustatius and Saba", "Bonaire, Saint-Eustache et Saba", "BQ", "BES", "535"}, - {"New Caledonia", "Nouvelle-Calédonie (la)", "NC", "NCL", "540"}, - {"Vanuatu", "Vanuatu (le)", "VU", "VUT", "548"}, - {"New Zealand", "Nouvelle-Zélande (la)", "NZ", "NZL", "554"}, - {"Nicaragua", "Nicaragua (le)", "NI", "NIC", "558"}, - {"Niger (the)", "Niger (le)", "NE", "NER", "562"}, - {"Nigeria", "Nigéria (le)", "NG", "NGA", "566"}, - {"Niue", "Niue", "NU", "NIU", "570"}, - {"Norfolk Island", "Norfolk (l'Île)", "NF", "NFK", "574"}, - {"Norway", "Norvège (la)", "NO", "NOR", "578"}, - {"Northern Mariana Islands (the)", "Mariannes du Nord (les Îles)", "MP", "MNP", "580"}, - {"United States Minor Outlying Islands (the)", "Îles mineures éloignées des États-Unis (les)", "UM", "UMI", "581"}, - {"Micronesia (Federated States of)", "Micronésie (États fédérés de)", "FM", "FSM", "583"}, - {"Marshall Islands (the)", "Marshall (Îles)", "MH", "MHL", "584"}, - {"Palau", "Palaos (les)", "PW", "PLW", "585"}, - {"Pakistan", "Pakistan (le)", "PK", "PAK", "586"}, - {"Panama", "Panama (le)", "PA", "PAN", "591"}, - {"Papua New Guinea", "Papouasie-Nouvelle-Guinée (la)", "PG", "PNG", "598"}, - {"Paraguay", "Paraguay (le)", "PY", "PRY", "600"}, - {"Peru", "Pérou (le)", "PE", "PER", "604"}, - {"Philippines (the)", "Philippines (les)", "PH", "PHL", "608"}, - {"Pitcairn", "Pitcairn", "PN", "PCN", "612"}, - {"Poland", "Pologne (la)", "PL", "POL", "616"}, - {"Portugal", "Portugal (le)", "PT", "PRT", "620"}, - {"Guinea-Bissau", "Guinée-Bissau (la)", "GW", "GNB", "624"}, - {"Timor-Leste", "Timor-Leste (le)", "TL", "TLS", "626"}, - {"Puerto Rico", "Porto Rico", "PR", "PRI", "630"}, - {"Qatar", "Qatar (le)", "QA", "QAT", "634"}, - {"Réunion", "Réunion (La)", "RE", "REU", "638"}, - {"Romania", "Roumanie (la)", "RO", "ROU", "642"}, - {"Russian Federation (the)", "Russie (la Fédération de)", "RU", "RUS", "643"}, - {"Rwanda", "Rwanda (le)", "RW", "RWA", "646"}, - {"Saint Barthélemy", "Saint-Barthélemy", "BL", "BLM", "652"}, - {"Saint Helena, Ascension and Tristan da Cunha", "Sainte-Hélène, Ascension et Tristan da Cunha", "SH", "SHN", "654"}, - {"Saint Kitts and Nevis", "Saint-Kitts-et-Nevis", "KN", "KNA", "659"}, - {"Anguilla", "Anguilla", "AI", "AIA", "660"}, - {"Saint Lucia", "Sainte-Lucie", "LC", "LCA", "662"}, - {"Saint Martin (French part)", "Saint-Martin (partie française)", "MF", "MAF", "663"}, - {"Saint Pierre and Miquelon", "Saint-Pierre-et-Miquelon", "PM", "SPM", "666"}, - {"Saint Vincent and the Grenadines", "Saint-Vincent-et-les Grenadines", "VC", "VCT", "670"}, - {"San Marino", "Saint-Marin", "SM", "SMR", "674"}, - {"Sao Tome and Principe", "Sao Tomé-et-Principe", "ST", "STP", "678"}, - {"Saudi Arabia", "Arabie saoudite (l')", "SA", "SAU", "682"}, - {"Senegal", "Sénégal (le)", "SN", "SEN", "686"}, - {"Serbia", "Serbie (la)", "RS", "SRB", "688"}, - {"Seychelles", "Seychelles (les)", "SC", "SYC", "690"}, - {"Sierra Leone", "Sierra Leone (la)", "SL", "SLE", "694"}, - {"Singapore", "Singapour", "SG", "SGP", "702"}, - {"Slovakia", "Slovaquie (la)", "SK", "SVK", "703"}, - {"Viet Nam", "Viet Nam (le)", "VN", "VNM", "704"}, - {"Slovenia", "Slovénie (la)", "SI", "SVN", "705"}, - {"Somalia", "Somalie (la)", "SO", "SOM", "706"}, - {"South Africa", "Afrique du Sud (l')", "ZA", "ZAF", "710"}, - {"Zimbabwe", "Zimbabwe (le)", "ZW", "ZWE", "716"}, - {"Spain", "Espagne (l')", "ES", "ESP", "724"}, - {"South Sudan", "Soudan du Sud (le)", "SS", "SSD", "728"}, - {"Sudan (the)", "Soudan (le)", "SD", "SDN", "729"}, - {"Western Sahara*", "Sahara occidental (le)*", "EH", "ESH", "732"}, - {"Suriname", "Suriname (le)", "SR", "SUR", "740"}, - {"Svalbard and Jan Mayen", "Svalbard et l'Île Jan Mayen (le)", "SJ", "SJM", "744"}, - {"Swaziland", "Swaziland (le)", "SZ", "SWZ", "748"}, - {"Sweden", "Suède (la)", "SE", "SWE", "752"}, - {"Switzerland", "Suisse (la)", "CH", "CHE", "756"}, - {"Syrian Arab Republic", "République arabe syrienne (la)", "SY", "SYR", "760"}, - {"Tajikistan", "Tadjikistan (le)", "TJ", "TJK", "762"}, - {"Thailand", "Thaïlande (la)", "TH", "THA", "764"}, - {"Togo", "Togo (le)", "TG", "TGO", "768"}, - {"Tokelau", "Tokelau (les)", "TK", "TKL", "772"}, - {"Tonga", "Tonga (les)", "TO", "TON", "776"}, - {"Trinidad and Tobago", "Trinité-et-Tobago (la)", "TT", "TTO", "780"}, - {"United Arab Emirates (the)", "Émirats arabes unis (les)", "AE", "ARE", "784"}, - {"Tunisia", "Tunisie (la)", "TN", "TUN", "788"}, - {"Turkey", "Turquie (la)", "TR", "TUR", "792"}, - {"Turkmenistan", "Turkménistan (le)", "TM", "TKM", "795"}, - {"Turks and Caicos Islands (the)", "Turks-et-Caïcos (les Îles)", "TC", "TCA", "796"}, - {"Tuvalu", "Tuvalu (les)", "TV", "TUV", "798"}, - {"Uganda", "Ouganda (l')", "UG", "UGA", "800"}, - {"Ukraine", "Ukraine (l')", "UA", "UKR", "804"}, - {"Macedonia (the former Yugoslav Republic of)", "Macédoine (l'ex‑République yougoslave de)", "MK", "MKD", "807"}, - {"Egypt", "Égypte (l')", "EG", "EGY", "818"}, - {"United Kingdom of Great Britain and Northern Ireland (the)", "Royaume-Uni de Grande-Bretagne et d'Irlande du Nord (le)", "GB", "GBR", "826"}, - {"Guernsey", "Guernesey", "GG", "GGY", "831"}, - {"Jersey", "Jersey", "JE", "JEY", "832"}, - {"Isle of Man", "Île de Man", "IM", "IMN", "833"}, - {"Tanzania, United Republic of", "Tanzanie, République-Unie de", "TZ", "TZA", "834"}, - {"United States of America (the)", "États-Unis d'Amérique (les)", "US", "USA", "840"}, - {"Virgin Islands (U.S.)", "Vierges des États-Unis (les Îles)", "VI", "VIR", "850"}, - {"Burkina Faso", "Burkina Faso (le)", "BF", "BFA", "854"}, - {"Uruguay", "Uruguay (l')", "UY", "URY", "858"}, - {"Uzbekistan", "Ouzbékistan (l')", "UZ", "UZB", "860"}, - {"Venezuela (Bolivarian Republic of)", "Venezuela (République bolivarienne du)", "VE", "VEN", "862"}, - {"Wallis and Futuna", "Wallis-et-Futuna", "WF", "WLF", "876"}, - {"Samoa", "Samoa (le)", "WS", "WSM", "882"}, - {"Yemen", "Yémen (le)", "YE", "YEM", "887"}, - {"Zambia", "Zambie (la)", "ZM", "ZMB", "894"}, -} - -// ISO4217List is the list of ISO currency codes -var ISO4217List = []string{ - "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", - "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", - "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU", "CRC", "CUC", "CUP", "CVE", "CZK", - "DJF", "DKK", "DOP", "DZD", - "EGP", "ERN", "ETB", "EUR", - "FJD", "FKP", - "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", - "HKD", "HNL", "HRK", "HTG", "HUF", - "IDR", "ILS", "INR", "IQD", "IRR", "ISK", - "JMD", "JOD", "JPY", - "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", - "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", - "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN", - "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", - "OMR", - "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", - "QAR", - "RON", "RSD", "RUB", "RWF", - "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL", - "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", - "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS", - "VEF", "VND", "VUV", - "WST", - "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", - "YER", - "ZAR", "ZMW", "ZWL", -} - -// ISO693Entry stores ISO language codes -type ISO693Entry struct { - Alpha3bCode string - Alpha2Code string - English string -} - -//ISO693List based on http://data.okfn.org/data/core/language-codes/r/language-codes-3b2.json -var ISO693List = []ISO693Entry{ - {Alpha3bCode: "aar", Alpha2Code: "aa", English: "Afar"}, - {Alpha3bCode: "abk", Alpha2Code: "ab", English: "Abkhazian"}, - {Alpha3bCode: "afr", Alpha2Code: "af", English: "Afrikaans"}, - {Alpha3bCode: "aka", Alpha2Code: "ak", English: "Akan"}, - {Alpha3bCode: "alb", Alpha2Code: "sq", English: "Albanian"}, - {Alpha3bCode: "amh", Alpha2Code: "am", English: "Amharic"}, - {Alpha3bCode: "ara", Alpha2Code: "ar", English: "Arabic"}, - {Alpha3bCode: "arg", Alpha2Code: "an", English: "Aragonese"}, - {Alpha3bCode: "arm", Alpha2Code: "hy", English: "Armenian"}, - {Alpha3bCode: "asm", Alpha2Code: "as", English: "Assamese"}, - {Alpha3bCode: "ava", Alpha2Code: "av", English: "Avaric"}, - {Alpha3bCode: "ave", Alpha2Code: "ae", English: "Avestan"}, - {Alpha3bCode: "aym", Alpha2Code: "ay", English: "Aymara"}, - {Alpha3bCode: "aze", Alpha2Code: "az", English: "Azerbaijani"}, - {Alpha3bCode: "bak", Alpha2Code: "ba", English: "Bashkir"}, - {Alpha3bCode: "bam", Alpha2Code: "bm", English: "Bambara"}, - {Alpha3bCode: "baq", Alpha2Code: "eu", English: "Basque"}, - {Alpha3bCode: "bel", Alpha2Code: "be", English: "Belarusian"}, - {Alpha3bCode: "ben", Alpha2Code: "bn", English: "Bengali"}, - {Alpha3bCode: "bih", Alpha2Code: "bh", English: "Bihari languages"}, - {Alpha3bCode: "bis", Alpha2Code: "bi", English: "Bislama"}, - {Alpha3bCode: "bos", Alpha2Code: "bs", English: "Bosnian"}, - {Alpha3bCode: "bre", Alpha2Code: "br", English: "Breton"}, - {Alpha3bCode: "bul", Alpha2Code: "bg", English: "Bulgarian"}, - {Alpha3bCode: "bur", Alpha2Code: "my", English: "Burmese"}, - {Alpha3bCode: "cat", Alpha2Code: "ca", English: "Catalan; Valencian"}, - {Alpha3bCode: "cha", Alpha2Code: "ch", English: "Chamorro"}, - {Alpha3bCode: "che", Alpha2Code: "ce", English: "Chechen"}, - {Alpha3bCode: "chi", Alpha2Code: "zh", English: "Chinese"}, - {Alpha3bCode: "chu", Alpha2Code: "cu", English: "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic"}, - {Alpha3bCode: "chv", Alpha2Code: "cv", English: "Chuvash"}, - {Alpha3bCode: "cor", Alpha2Code: "kw", English: "Cornish"}, - {Alpha3bCode: "cos", Alpha2Code: "co", English: "Corsican"}, - {Alpha3bCode: "cre", Alpha2Code: "cr", English: "Cree"}, - {Alpha3bCode: "cze", Alpha2Code: "cs", English: "Czech"}, - {Alpha3bCode: "dan", Alpha2Code: "da", English: "Danish"}, - {Alpha3bCode: "div", Alpha2Code: "dv", English: "Divehi; Dhivehi; Maldivian"}, - {Alpha3bCode: "dut", Alpha2Code: "nl", English: "Dutch; Flemish"}, - {Alpha3bCode: "dzo", Alpha2Code: "dz", English: "Dzongkha"}, - {Alpha3bCode: "eng", Alpha2Code: "en", English: "English"}, - {Alpha3bCode: "epo", Alpha2Code: "eo", English: "Esperanto"}, - {Alpha3bCode: "est", Alpha2Code: "et", English: "Estonian"}, - {Alpha3bCode: "ewe", Alpha2Code: "ee", English: "Ewe"}, - {Alpha3bCode: "fao", Alpha2Code: "fo", English: "Faroese"}, - {Alpha3bCode: "fij", Alpha2Code: "fj", English: "Fijian"}, - {Alpha3bCode: "fin", Alpha2Code: "fi", English: "Finnish"}, - {Alpha3bCode: "fre", Alpha2Code: "fr", English: "French"}, - {Alpha3bCode: "fry", Alpha2Code: "fy", English: "Western Frisian"}, - {Alpha3bCode: "ful", Alpha2Code: "ff", English: "Fulah"}, - {Alpha3bCode: "geo", Alpha2Code: "ka", English: "Georgian"}, - {Alpha3bCode: "ger", Alpha2Code: "de", English: "German"}, - {Alpha3bCode: "gla", Alpha2Code: "gd", English: "Gaelic; Scottish Gaelic"}, - {Alpha3bCode: "gle", Alpha2Code: "ga", English: "Irish"}, - {Alpha3bCode: "glg", Alpha2Code: "gl", English: "Galician"}, - {Alpha3bCode: "glv", Alpha2Code: "gv", English: "Manx"}, - {Alpha3bCode: "gre", Alpha2Code: "el", English: "Greek, Modern (1453-)"}, - {Alpha3bCode: "grn", Alpha2Code: "gn", English: "Guarani"}, - {Alpha3bCode: "guj", Alpha2Code: "gu", English: "Gujarati"}, - {Alpha3bCode: "hat", Alpha2Code: "ht", English: "Haitian; Haitian Creole"}, - {Alpha3bCode: "hau", Alpha2Code: "ha", English: "Hausa"}, - {Alpha3bCode: "heb", Alpha2Code: "he", English: "Hebrew"}, - {Alpha3bCode: "her", Alpha2Code: "hz", English: "Herero"}, - {Alpha3bCode: "hin", Alpha2Code: "hi", English: "Hindi"}, - {Alpha3bCode: "hmo", Alpha2Code: "ho", English: "Hiri Motu"}, - {Alpha3bCode: "hrv", Alpha2Code: "hr", English: "Croatian"}, - {Alpha3bCode: "hun", Alpha2Code: "hu", English: "Hungarian"}, - {Alpha3bCode: "ibo", Alpha2Code: "ig", English: "Igbo"}, - {Alpha3bCode: "ice", Alpha2Code: "is", English: "Icelandic"}, - {Alpha3bCode: "ido", Alpha2Code: "io", English: "Ido"}, - {Alpha3bCode: "iii", Alpha2Code: "ii", English: "Sichuan Yi; Nuosu"}, - {Alpha3bCode: "iku", Alpha2Code: "iu", English: "Inuktitut"}, - {Alpha3bCode: "ile", Alpha2Code: "ie", English: "Interlingue; Occidental"}, - {Alpha3bCode: "ina", Alpha2Code: "ia", English: "Interlingua (International Auxiliary Language Association)"}, - {Alpha3bCode: "ind", Alpha2Code: "id", English: "Indonesian"}, - {Alpha3bCode: "ipk", Alpha2Code: "ik", English: "Inupiaq"}, - {Alpha3bCode: "ita", Alpha2Code: "it", English: "Italian"}, - {Alpha3bCode: "jav", Alpha2Code: "jv", English: "Javanese"}, - {Alpha3bCode: "jpn", Alpha2Code: "ja", English: "Japanese"}, - {Alpha3bCode: "kal", Alpha2Code: "kl", English: "Kalaallisut; Greenlandic"}, - {Alpha3bCode: "kan", Alpha2Code: "kn", English: "Kannada"}, - {Alpha3bCode: "kas", Alpha2Code: "ks", English: "Kashmiri"}, - {Alpha3bCode: "kau", Alpha2Code: "kr", English: "Kanuri"}, - {Alpha3bCode: "kaz", Alpha2Code: "kk", English: "Kazakh"}, - {Alpha3bCode: "khm", Alpha2Code: "km", English: "Central Khmer"}, - {Alpha3bCode: "kik", Alpha2Code: "ki", English: "Kikuyu; Gikuyu"}, - {Alpha3bCode: "kin", Alpha2Code: "rw", English: "Kinyarwanda"}, - {Alpha3bCode: "kir", Alpha2Code: "ky", English: "Kirghiz; Kyrgyz"}, - {Alpha3bCode: "kom", Alpha2Code: "kv", English: "Komi"}, - {Alpha3bCode: "kon", Alpha2Code: "kg", English: "Kongo"}, - {Alpha3bCode: "kor", Alpha2Code: "ko", English: "Korean"}, - {Alpha3bCode: "kua", Alpha2Code: "kj", English: "Kuanyama; Kwanyama"}, - {Alpha3bCode: "kur", Alpha2Code: "ku", English: "Kurdish"}, - {Alpha3bCode: "lao", Alpha2Code: "lo", English: "Lao"}, - {Alpha3bCode: "lat", Alpha2Code: "la", English: "Latin"}, - {Alpha3bCode: "lav", Alpha2Code: "lv", English: "Latvian"}, - {Alpha3bCode: "lim", Alpha2Code: "li", English: "Limburgan; Limburger; Limburgish"}, - {Alpha3bCode: "lin", Alpha2Code: "ln", English: "Lingala"}, - {Alpha3bCode: "lit", Alpha2Code: "lt", English: "Lithuanian"}, - {Alpha3bCode: "ltz", Alpha2Code: "lb", English: "Luxembourgish; Letzeburgesch"}, - {Alpha3bCode: "lub", Alpha2Code: "lu", English: "Luba-Katanga"}, - {Alpha3bCode: "lug", Alpha2Code: "lg", English: "Ganda"}, - {Alpha3bCode: "mac", Alpha2Code: "mk", English: "Macedonian"}, - {Alpha3bCode: "mah", Alpha2Code: "mh", English: "Marshallese"}, - {Alpha3bCode: "mal", Alpha2Code: "ml", English: "Malayalam"}, - {Alpha3bCode: "mao", Alpha2Code: "mi", English: "Maori"}, - {Alpha3bCode: "mar", Alpha2Code: "mr", English: "Marathi"}, - {Alpha3bCode: "may", Alpha2Code: "ms", English: "Malay"}, - {Alpha3bCode: "mlg", Alpha2Code: "mg", English: "Malagasy"}, - {Alpha3bCode: "mlt", Alpha2Code: "mt", English: "Maltese"}, - {Alpha3bCode: "mon", Alpha2Code: "mn", English: "Mongolian"}, - {Alpha3bCode: "nau", Alpha2Code: "na", English: "Nauru"}, - {Alpha3bCode: "nav", Alpha2Code: "nv", English: "Navajo; Navaho"}, - {Alpha3bCode: "nbl", Alpha2Code: "nr", English: "Ndebele, South; South Ndebele"}, - {Alpha3bCode: "nde", Alpha2Code: "nd", English: "Ndebele, North; North Ndebele"}, - {Alpha3bCode: "ndo", Alpha2Code: "ng", English: "Ndonga"}, - {Alpha3bCode: "nep", Alpha2Code: "ne", English: "Nepali"}, - {Alpha3bCode: "nno", Alpha2Code: "nn", English: "Norwegian Nynorsk; Nynorsk, Norwegian"}, - {Alpha3bCode: "nob", Alpha2Code: "nb", English: "Bokmål, Norwegian; Norwegian Bokmål"}, - {Alpha3bCode: "nor", Alpha2Code: "no", English: "Norwegian"}, - {Alpha3bCode: "nya", Alpha2Code: "ny", English: "Chichewa; Chewa; Nyanja"}, - {Alpha3bCode: "oci", Alpha2Code: "oc", English: "Occitan (post 1500); Provençal"}, - {Alpha3bCode: "oji", Alpha2Code: "oj", English: "Ojibwa"}, - {Alpha3bCode: "ori", Alpha2Code: "or", English: "Oriya"}, - {Alpha3bCode: "orm", Alpha2Code: "om", English: "Oromo"}, - {Alpha3bCode: "oss", Alpha2Code: "os", English: "Ossetian; Ossetic"}, - {Alpha3bCode: "pan", Alpha2Code: "pa", English: "Panjabi; Punjabi"}, - {Alpha3bCode: "per", Alpha2Code: "fa", English: "Persian"}, - {Alpha3bCode: "pli", Alpha2Code: "pi", English: "Pali"}, - {Alpha3bCode: "pol", Alpha2Code: "pl", English: "Polish"}, - {Alpha3bCode: "por", Alpha2Code: "pt", English: "Portuguese"}, - {Alpha3bCode: "pus", Alpha2Code: "ps", English: "Pushto; Pashto"}, - {Alpha3bCode: "que", Alpha2Code: "qu", English: "Quechua"}, - {Alpha3bCode: "roh", Alpha2Code: "rm", English: "Romansh"}, - {Alpha3bCode: "rum", Alpha2Code: "ro", English: "Romanian; Moldavian; Moldovan"}, - {Alpha3bCode: "run", Alpha2Code: "rn", English: "Rundi"}, - {Alpha3bCode: "rus", Alpha2Code: "ru", English: "Russian"}, - {Alpha3bCode: "sag", Alpha2Code: "sg", English: "Sango"}, - {Alpha3bCode: "san", Alpha2Code: "sa", English: "Sanskrit"}, - {Alpha3bCode: "sin", Alpha2Code: "si", English: "Sinhala; Sinhalese"}, - {Alpha3bCode: "slo", Alpha2Code: "sk", English: "Slovak"}, - {Alpha3bCode: "slv", Alpha2Code: "sl", English: "Slovenian"}, - {Alpha3bCode: "sme", Alpha2Code: "se", English: "Northern Sami"}, - {Alpha3bCode: "smo", Alpha2Code: "sm", English: "Samoan"}, - {Alpha3bCode: "sna", Alpha2Code: "sn", English: "Shona"}, - {Alpha3bCode: "snd", Alpha2Code: "sd", English: "Sindhi"}, - {Alpha3bCode: "som", Alpha2Code: "so", English: "Somali"}, - {Alpha3bCode: "sot", Alpha2Code: "st", English: "Sotho, Southern"}, - {Alpha3bCode: "spa", Alpha2Code: "es", English: "Spanish; Castilian"}, - {Alpha3bCode: "srd", Alpha2Code: "sc", English: "Sardinian"}, - {Alpha3bCode: "srp", Alpha2Code: "sr", English: "Serbian"}, - {Alpha3bCode: "ssw", Alpha2Code: "ss", English: "Swati"}, - {Alpha3bCode: "sun", Alpha2Code: "su", English: "Sundanese"}, - {Alpha3bCode: "swa", Alpha2Code: "sw", English: "Swahili"}, - {Alpha3bCode: "swe", Alpha2Code: "sv", English: "Swedish"}, - {Alpha3bCode: "tah", Alpha2Code: "ty", English: "Tahitian"}, - {Alpha3bCode: "tam", Alpha2Code: "ta", English: "Tamil"}, - {Alpha3bCode: "tat", Alpha2Code: "tt", English: "Tatar"}, - {Alpha3bCode: "tel", Alpha2Code: "te", English: "Telugu"}, - {Alpha3bCode: "tgk", Alpha2Code: "tg", English: "Tajik"}, - {Alpha3bCode: "tgl", Alpha2Code: "tl", English: "Tagalog"}, - {Alpha3bCode: "tha", Alpha2Code: "th", English: "Thai"}, - {Alpha3bCode: "tib", Alpha2Code: "bo", English: "Tibetan"}, - {Alpha3bCode: "tir", Alpha2Code: "ti", English: "Tigrinya"}, - {Alpha3bCode: "ton", Alpha2Code: "to", English: "Tonga (Tonga Islands)"}, - {Alpha3bCode: "tsn", Alpha2Code: "tn", English: "Tswana"}, - {Alpha3bCode: "tso", Alpha2Code: "ts", English: "Tsonga"}, - {Alpha3bCode: "tuk", Alpha2Code: "tk", English: "Turkmen"}, - {Alpha3bCode: "tur", Alpha2Code: "tr", English: "Turkish"}, - {Alpha3bCode: "twi", Alpha2Code: "tw", English: "Twi"}, - {Alpha3bCode: "uig", Alpha2Code: "ug", English: "Uighur; Uyghur"}, - {Alpha3bCode: "ukr", Alpha2Code: "uk", English: "Ukrainian"}, - {Alpha3bCode: "urd", Alpha2Code: "ur", English: "Urdu"}, - {Alpha3bCode: "uzb", Alpha2Code: "uz", English: "Uzbek"}, - {Alpha3bCode: "ven", Alpha2Code: "ve", English: "Venda"}, - {Alpha3bCode: "vie", Alpha2Code: "vi", English: "Vietnamese"}, - {Alpha3bCode: "vol", Alpha2Code: "vo", English: "Volapük"}, - {Alpha3bCode: "wel", Alpha2Code: "cy", English: "Welsh"}, - {Alpha3bCode: "wln", Alpha2Code: "wa", English: "Walloon"}, - {Alpha3bCode: "wol", Alpha2Code: "wo", English: "Wolof"}, - {Alpha3bCode: "xho", Alpha2Code: "xh", English: "Xhosa"}, - {Alpha3bCode: "yid", Alpha2Code: "yi", English: "Yiddish"}, - {Alpha3bCode: "yor", Alpha2Code: "yo", English: "Yoruba"}, - {Alpha3bCode: "zha", Alpha2Code: "za", English: "Zhuang; Chuang"}, - {Alpha3bCode: "zul", Alpha2Code: "zu", English: "Zulu"}, -} diff --git a/vendor/github.com/asaskevich/govalidator/utils.go b/vendor/github.com/asaskevich/govalidator/utils.go deleted file mode 100644 index f4c30f82..00000000 --- a/vendor/github.com/asaskevich/govalidator/utils.go +++ /dev/null @@ -1,270 +0,0 @@ -package govalidator - -import ( - "errors" - "fmt" - "html" - "math" - "path" - "regexp" - "strings" - "unicode" - "unicode/utf8" -) - -// Contains checks if the string contains the substring. -func Contains(str, substring string) bool { - return strings.Contains(str, substring) -} - -// Matches checks if string matches the pattern (pattern is regular expression) -// In case of error return false -func Matches(str, pattern string) bool { - match, _ := regexp.MatchString(pattern, str) - return match -} - -// LeftTrim trims characters from the left side of the input. -// If second argument is empty, it will remove leading spaces. -func LeftTrim(str, chars string) string { - if chars == "" { - return strings.TrimLeftFunc(str, unicode.IsSpace) - } - r, _ := regexp.Compile("^[" + chars + "]+") - return r.ReplaceAllString(str, "") -} - -// RightTrim trims characters from the right side of the input. -// If second argument is empty, it will remove trailing spaces. -func RightTrim(str, chars string) string { - if chars == "" { - return strings.TrimRightFunc(str, unicode.IsSpace) - } - r, _ := regexp.Compile("[" + chars + "]+$") - return r.ReplaceAllString(str, "") -} - -// Trim trims characters from both sides of the input. -// If second argument is empty, it will remove spaces. -func Trim(str, chars string) string { - return LeftTrim(RightTrim(str, chars), chars) -} - -// WhiteList removes characters that do not appear in the whitelist. -func WhiteList(str, chars string) string { - pattern := "[^" + chars + "]+" - r, _ := regexp.Compile(pattern) - return r.ReplaceAllString(str, "") -} - -// BlackList removes characters that appear in the blacklist. -func BlackList(str, chars string) string { - pattern := "[" + chars + "]+" - r, _ := regexp.Compile(pattern) - return r.ReplaceAllString(str, "") -} - -// StripLow removes characters with a numerical value < 32 and 127, mostly control characters. -// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD). -func StripLow(str string, keepNewLines bool) string { - chars := "" - if keepNewLines { - chars = "\x00-\x09\x0B\x0C\x0E-\x1F\x7F" - } else { - chars = "\x00-\x1F\x7F" - } - return BlackList(str, chars) -} - -// ReplacePattern replaces regular expression pattern in string -func ReplacePattern(str, pattern, replace string) string { - r, _ := regexp.Compile(pattern) - return r.ReplaceAllString(str, replace) -} - -// Escape replaces <, >, & and " with HTML entities. -var Escape = html.EscapeString - -func addSegment(inrune, segment []rune) []rune { - if len(segment) == 0 { - return inrune - } - if len(inrune) != 0 { - inrune = append(inrune, '_') - } - inrune = append(inrune, segment...) - return inrune -} - -// UnderscoreToCamelCase converts from underscore separated form to camel case form. -// Ex.: my_func => MyFunc -func UnderscoreToCamelCase(s string) string { - return strings.Replace(strings.Title(strings.Replace(strings.ToLower(s), "_", " ", -1)), " ", "", -1) -} - -// CamelCaseToUnderscore converts from camel case form to underscore separated form. -// Ex.: MyFunc => my_func -func CamelCaseToUnderscore(str string) string { - var output []rune - var segment []rune - for _, r := range str { - - // not treat number as separate segment - if !unicode.IsLower(r) && string(r) != "_" && !unicode.IsNumber(r) { - output = addSegment(output, segment) - segment = nil - } - segment = append(segment, unicode.ToLower(r)) - } - output = addSegment(output, segment) - return string(output) -} - -// Reverse returns reversed string -func Reverse(s string) string { - r := []rune(s) - for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { - r[i], r[j] = r[j], r[i] - } - return string(r) -} - -// GetLines splits string by "\n" and return array of lines -func GetLines(s string) []string { - return strings.Split(s, "\n") -} - -// GetLine returns specified line of multiline string -func GetLine(s string, index int) (string, error) { - lines := GetLines(s) - if index < 0 || index >= len(lines) { - return "", errors.New("line index out of bounds") - } - return lines[index], nil -} - -// RemoveTags removes all tags from HTML string -func RemoveTags(s string) string { - return ReplacePattern(s, "<[^>]*>", "") -} - -// SafeFileName returns safe string that can be used in file names -func SafeFileName(str string) string { - name := strings.ToLower(str) - name = path.Clean(path.Base(name)) - name = strings.Trim(name, " ") - separators, err := regexp.Compile(`[ &_=+:]`) - if err == nil { - name = separators.ReplaceAllString(name, "-") - } - legal, err := regexp.Compile(`[^[:alnum:]-.]`) - if err == nil { - name = legal.ReplaceAllString(name, "") - } - for strings.Contains(name, "--") { - name = strings.Replace(name, "--", "-", -1) - } - return name -} - -// NormalizeEmail canonicalize an email address. -// The local part of the email address is lowercased for all domains; the hostname is always lowercased and -// the local part of the email address is always lowercased for hosts that are known to be case-insensitive (currently only GMail). -// Normalization follows special rules for known providers: currently, GMail addresses have dots removed in the local part and -// are stripped of tags (e.g. some.one+tag@gmail.com becomes someone@gmail.com) and all @googlemail.com addresses are -// normalized to @gmail.com. -func NormalizeEmail(str string) (string, error) { - if !IsEmail(str) { - return "", fmt.Errorf("%s is not an email", str) - } - parts := strings.Split(str, "@") - parts[0] = strings.ToLower(parts[0]) - parts[1] = strings.ToLower(parts[1]) - if parts[1] == "gmail.com" || parts[1] == "googlemail.com" { - parts[1] = "gmail.com" - parts[0] = strings.Split(ReplacePattern(parts[0], `\.`, ""), "+")[0] - } - return strings.Join(parts, "@"), nil -} - -// Truncate a string to the closest length without breaking words. -func Truncate(str string, length int, ending string) string { - var aftstr, befstr string - if len(str) > length { - words := strings.Fields(str) - before, present := 0, 0 - for i := range words { - befstr = aftstr - before = present - aftstr = aftstr + words[i] + " " - present = len(aftstr) - if present > length && i != 0 { - if (length - before) < (present - length) { - return Trim(befstr, " /\\.,\"'#!?&@+-") + ending - } - return Trim(aftstr, " /\\.,\"'#!?&@+-") + ending - } - } - } - - return str -} - -// PadLeft pads left side of a string if size of string is less then indicated pad length -func PadLeft(str string, padStr string, padLen int) string { - return buildPadStr(str, padStr, padLen, true, false) -} - -// PadRight pads right side of a string if size of string is less then indicated pad length -func PadRight(str string, padStr string, padLen int) string { - return buildPadStr(str, padStr, padLen, false, true) -} - -// PadBoth pads both sides of a string if size of string is less then indicated pad length -func PadBoth(str string, padStr string, padLen int) string { - return buildPadStr(str, padStr, padLen, true, true) -} - -// PadString either left, right or both sides. -// Note that padding string can be unicode and more then one character -func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string { - - // When padded length is less then the current string size - if padLen < utf8.RuneCountInString(str) { - return str - } - - padLen -= utf8.RuneCountInString(str) - - targetLen := padLen - - targetLenLeft := targetLen - targetLenRight := targetLen - if padLeft && padRight { - targetLenLeft = padLen / 2 - targetLenRight = padLen - targetLenLeft - } - - strToRepeatLen := utf8.RuneCountInString(padStr) - - repeatTimes := int(math.Ceil(float64(targetLen) / float64(strToRepeatLen))) - repeatedString := strings.Repeat(padStr, repeatTimes) - - leftSide := "" - if padLeft { - leftSide = repeatedString[0:targetLenLeft] - } - - rightSide := "" - if padRight { - rightSide = repeatedString[0:targetLenRight] - } - - return leftSide + str + rightSide -} - -// TruncatingErrorf removes extra args from fmt.Errorf if not formatted in the str object -func TruncatingErrorf(str string, args ...interface{}) error { - n := strings.Count(str, "%s") - return fmt.Errorf(str, args[:n]...) -} diff --git a/vendor/github.com/asaskevich/govalidator/validator.go b/vendor/github.com/asaskevich/govalidator/validator.go deleted file mode 100644 index 298f9920..00000000 --- a/vendor/github.com/asaskevich/govalidator/validator.go +++ /dev/null @@ -1,1530 +0,0 @@ -// Package govalidator is package of validators and sanitizers for strings, structs and collections. -package govalidator - -import ( - "bytes" - "crypto/rsa" - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "fmt" - "io/ioutil" - "net" - "net/url" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -var ( - fieldsRequiredByDefault bool - nilPtrAllowedByRequired = false - notNumberRegexp = regexp.MustCompile("[^0-9]+") - whiteSpacesAndMinus = regexp.MustCompile(`[\s-]+`) - paramsRegexp = regexp.MustCompile(`\(.*\)$`) -) - -const maxURLRuneCount = 2083 -const minURLRuneCount = 3 -const RF3339WithoutZone = "2006-01-02T15:04:05" - -// SetFieldsRequiredByDefault causes validation to fail when struct fields -// do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). -// This struct definition will fail govalidator.ValidateStruct() (and the field values do not matter): -// type exampleStruct struct { -// Name string `` -// Email string `valid:"email"` -// This, however, will only fail when Email is empty or an invalid email address: -// type exampleStruct2 struct { -// Name string `valid:"-"` -// Email string `valid:"email"` -// Lastly, this will only fail when Email is an invalid email address but not when it's empty: -// type exampleStruct2 struct { -// Name string `valid:"-"` -// Email string `valid:"email,optional"` -func SetFieldsRequiredByDefault(value bool) { - fieldsRequiredByDefault = value -} - -// SetNilPtrAllowedByRequired causes validation to pass for nil ptrs when a field is set to required. -// The validation will still reject ptr fields in their zero value state. Example with this enabled: -// type exampleStruct struct { -// Name *string `valid:"required"` -// With `Name` set to "", this will be considered invalid input and will cause a validation error. -// With `Name` set to nil, this will be considered valid by validation. -// By default this is disabled. -func SetNilPtrAllowedByRequired(value bool) { - nilPtrAllowedByRequired = value -} - -// IsEmail check if the string is an email. -func IsEmail(str string) bool { - // TODO uppercase letters are not supported - return rxEmail.MatchString(str) -} - -// IsExistingEmail check if the string is an email of existing domain -func IsExistingEmail(email string) bool { - - if len(email) < 6 || len(email) > 254 { - return false - } - at := strings.LastIndex(email, "@") - if at <= 0 || at > len(email)-3 { - return false - } - user := email[:at] - host := email[at+1:] - if len(user) > 64 { - return false - } - if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) { - return false - } - switch host { - case "localhost", "example.com": - return true - } - if _, err := net.LookupMX(host); err != nil { - if _, err := net.LookupIP(host); err != nil { - return false - } - } - - return true -} - -// IsURL check if the string is an URL. -func IsURL(str string) bool { - if str == "" || utf8.RuneCountInString(str) >= maxURLRuneCount || len(str) <= minURLRuneCount || strings.HasPrefix(str, ".") { - return false - } - strTemp := str - if strings.Contains(str, ":") && !strings.Contains(str, "://") { - // support no indicated urlscheme but with colon for port number - // http:// is appended so url.Parse will succeed, strTemp used so it does not impact rxURL.MatchString - strTemp = "http://" + str - } - u, err := url.Parse(strTemp) - if err != nil { - return false - } - if strings.HasPrefix(u.Host, ".") { - return false - } - if u.Host == "" && (u.Path != "" && !strings.Contains(u.Path, ".")) { - return false - } - return rxURL.MatchString(str) -} - -// IsRequestURL check if the string rawurl, assuming -// it was received in an HTTP request, is a valid -// URL confirm to RFC 3986 -func IsRequestURL(rawurl string) bool { - url, err := url.ParseRequestURI(rawurl) - if err != nil { - return false //Couldn't even parse the rawurl - } - if len(url.Scheme) == 0 { - return false //No Scheme found - } - return true -} - -// IsRequestURI check if the string rawurl, assuming -// it was received in an HTTP request, is an -// absolute URI or an absolute path. -func IsRequestURI(rawurl string) bool { - _, err := url.ParseRequestURI(rawurl) - return err == nil -} - -// IsAlpha check if the string contains only letters (a-zA-Z). Empty string is valid. -func IsAlpha(str string) bool { - if IsNull(str) { - return true - } - return rxAlpha.MatchString(str) -} - -//IsUTFLetter check if the string contains only unicode letter characters. -//Similar to IsAlpha but for all languages. Empty string is valid. -func IsUTFLetter(str string) bool { - if IsNull(str) { - return true - } - - for _, c := range str { - if !unicode.IsLetter(c) { - return false - } - } - return true - -} - -// IsAlphanumeric check if the string contains only letters and numbers. Empty string is valid. -func IsAlphanumeric(str string) bool { - if IsNull(str) { - return true - } - return rxAlphanumeric.MatchString(str) -} - -// IsUTFLetterNumeric check if the string contains only unicode letters and numbers. Empty string is valid. -func IsUTFLetterNumeric(str string) bool { - if IsNull(str) { - return true - } - for _, c := range str { - if !unicode.IsLetter(c) && !unicode.IsNumber(c) { //letters && numbers are ok - return false - } - } - return true - -} - -// IsNumeric check if the string contains only numbers. Empty string is valid. -func IsNumeric(str string) bool { - if IsNull(str) { - return true - } - return rxNumeric.MatchString(str) -} - -// IsUTFNumeric check if the string contains only unicode numbers of any kind. -// Numbers can be 0-9 but also Fractions ¾,Roman Ⅸ and Hangzhou 〩. Empty string is valid. -func IsUTFNumeric(str string) bool { - if IsNull(str) { - return true - } - if strings.IndexAny(str, "+-") > 0 { - return false - } - if len(str) > 1 { - str = strings.TrimPrefix(str, "-") - str = strings.TrimPrefix(str, "+") - } - for _, c := range str { - if !unicode.IsNumber(c) { //numbers && minus sign are ok - return false - } - } - return true - -} - -// IsUTFDigit check if the string contains only unicode radix-10 decimal digits. Empty string is valid. -func IsUTFDigit(str string) bool { - if IsNull(str) { - return true - } - if strings.IndexAny(str, "+-") > 0 { - return false - } - if len(str) > 1 { - str = strings.TrimPrefix(str, "-") - str = strings.TrimPrefix(str, "+") - } - for _, c := range str { - if !unicode.IsDigit(c) { //digits && minus sign are ok - return false - } - } - return true - -} - -// IsHexadecimal check if the string is a hexadecimal number. -func IsHexadecimal(str string) bool { - return rxHexadecimal.MatchString(str) -} - -// IsHexcolor check if the string is a hexadecimal color. -func IsHexcolor(str string) bool { - return rxHexcolor.MatchString(str) -} - -// IsRGBcolor check if the string is a valid RGB color in form rgb(RRR, GGG, BBB). -func IsRGBcolor(str string) bool { - return rxRGBcolor.MatchString(str) -} - -// IsLowerCase check if the string is lowercase. Empty string is valid. -func IsLowerCase(str string) bool { - if IsNull(str) { - return true - } - return str == strings.ToLower(str) -} - -// IsUpperCase check if the string is uppercase. Empty string is valid. -func IsUpperCase(str string) bool { - if IsNull(str) { - return true - } - return str == strings.ToUpper(str) -} - -// HasLowerCase check if the string contains at least 1 lowercase. Empty string is valid. -func HasLowerCase(str string) bool { - if IsNull(str) { - return true - } - return rxHasLowerCase.MatchString(str) -} - -// HasUpperCase check if the string contains as least 1 uppercase. Empty string is valid. -func HasUpperCase(str string) bool { - if IsNull(str) { - return true - } - return rxHasUpperCase.MatchString(str) -} - -// IsInt check if the string is an integer. Empty string is valid. -func IsInt(str string) bool { - if IsNull(str) { - return true - } - return rxInt.MatchString(str) -} - -// IsFloat check if the string is a float. -func IsFloat(str string) bool { - return str != "" && rxFloat.MatchString(str) -} - -// IsDivisibleBy check if the string is a number that's divisible by another. -// If second argument is not valid integer or zero, it's return false. -// Otherwise, if first argument is not valid integer or zero, it's return true (Invalid string converts to zero). -func IsDivisibleBy(str, num string) bool { - f, _ := ToFloat(str) - p := int64(f) - q, _ := ToInt(num) - if q == 0 { - return false - } - return (p == 0) || (p%q == 0) -} - -// IsNull check if the string is null. -func IsNull(str string) bool { - return len(str) == 0 -} - -// IsNotNull check if the string is not null. -func IsNotNull(str string) bool { - return !IsNull(str) -} - -// HasWhitespaceOnly checks the string only contains whitespace -func HasWhitespaceOnly(str string) bool { - return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) -} - -// HasWhitespace checks if the string contains any whitespace -func HasWhitespace(str string) bool { - return len(str) > 0 && rxHasWhitespace.MatchString(str) -} - -// IsByteLength check if the string's length (in bytes) falls in a range. -func IsByteLength(str string, min, max int) bool { - return len(str) >= min && len(str) <= max -} - -// IsUUIDv3 check if the string is a UUID version 3. -func IsUUIDv3(str string) bool { - return rxUUID3.MatchString(str) -} - -// IsUUIDv4 check if the string is a UUID version 4. -func IsUUIDv4(str string) bool { - return rxUUID4.MatchString(str) -} - -// IsUUIDv5 check if the string is a UUID version 5. -func IsUUIDv5(str string) bool { - return rxUUID5.MatchString(str) -} - -// IsUUID check if the string is a UUID (version 3, 4 or 5). -func IsUUID(str string) bool { - return rxUUID.MatchString(str) -} - -// IsCreditCard check if the string is a credit card. -func IsCreditCard(str string) bool { - sanitized := notNumberRegexp.ReplaceAllString(str, "") - if !rxCreditCard.MatchString(sanitized) { - return false - } - var sum int64 - var digit string - var tmpNum int64 - var shouldDouble bool - for i := len(sanitized) - 1; i >= 0; i-- { - digit = sanitized[i:(i + 1)] - tmpNum, _ = ToInt(digit) - if shouldDouble { - tmpNum *= 2 - if tmpNum >= 10 { - sum += ((tmpNum % 10) + 1) - } else { - sum += tmpNum - } - } else { - sum += tmpNum - } - shouldDouble = !shouldDouble - } - - return sum%10 == 0 -} - -// IsISBN10 check if the string is an ISBN version 10. -func IsISBN10(str string) bool { - return IsISBN(str, 10) -} - -// IsISBN13 check if the string is an ISBN version 13. -func IsISBN13(str string) bool { - return IsISBN(str, 13) -} - -// IsISBN check if the string is an ISBN (version 10 or 13). -// If version value is not equal to 10 or 13, it will be check both variants. -func IsISBN(str string, version int) bool { - sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") - var checksum int32 - var i int32 - if version == 10 { - if !rxISBN10.MatchString(sanitized) { - return false - } - for i = 0; i < 9; i++ { - checksum += (i + 1) * int32(sanitized[i]-'0') - } - if sanitized[9] == 'X' { - checksum += 10 * 10 - } else { - checksum += 10 * int32(sanitized[9]-'0') - } - if checksum%11 == 0 { - return true - } - return false - } else if version == 13 { - if !rxISBN13.MatchString(sanitized) { - return false - } - factor := []int32{1, 3} - for i = 0; i < 12; i++ { - checksum += factor[i%2] * int32(sanitized[i]-'0') - } - return (int32(sanitized[12]-'0'))-((10-(checksum%10))%10) == 0 - } - return IsISBN(str, 10) || IsISBN(str, 13) -} - -// IsJSON check if the string is valid JSON (note: uses json.Unmarshal). -func IsJSON(str string) bool { - var js json.RawMessage - return json.Unmarshal([]byte(str), &js) == nil -} - -// IsMultibyte check if the string contains one or more multibyte chars. Empty string is valid. -func IsMultibyte(str string) bool { - if IsNull(str) { - return true - } - return rxMultibyte.MatchString(str) -} - -// IsASCII check if the string contains ASCII chars only. Empty string is valid. -func IsASCII(str string) bool { - if IsNull(str) { - return true - } - return rxASCII.MatchString(str) -} - -// IsPrintableASCII check if the string contains printable ASCII chars only. Empty string is valid. -func IsPrintableASCII(str string) bool { - if IsNull(str) { - return true - } - return rxPrintableASCII.MatchString(str) -} - -// IsFullWidth check if the string contains any full-width chars. Empty string is valid. -func IsFullWidth(str string) bool { - if IsNull(str) { - return true - } - return rxFullWidth.MatchString(str) -} - -// IsHalfWidth check if the string contains any half-width chars. Empty string is valid. -func IsHalfWidth(str string) bool { - if IsNull(str) { - return true - } - return rxHalfWidth.MatchString(str) -} - -// IsVariableWidth check if the string contains a mixture of full and half-width chars. Empty string is valid. -func IsVariableWidth(str string) bool { - if IsNull(str) { - return true - } - return rxHalfWidth.MatchString(str) && rxFullWidth.MatchString(str) -} - -// IsBase64 check if a string is base64 encoded. -func IsBase64(str string) bool { - return rxBase64.MatchString(str) -} - -// IsFilePath check is a string is Win or Unix file path and returns it's type. -func IsFilePath(str string) (bool, int) { - if rxWinPath.MatchString(str) { - //check windows path limit see: - // http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath - if len(str[3:]) > 32767 { - return false, Win - } - return true, Win - } else if rxUnixPath.MatchString(str) { - return true, Unix - } - return false, Unknown -} - -// IsDataURI checks if a string is base64 encoded data URI such as an image -func IsDataURI(str string) bool { - dataURI := strings.Split(str, ",") - if !rxDataURI.MatchString(dataURI[0]) { - return false - } - return IsBase64(dataURI[1]) -} - -// IsMagnetURI checks if a string is valid magnet URI -func IsMagnetURI(str string) bool { - return rxMagnetURI.MatchString(str) -} - -// IsISO3166Alpha2 checks if a string is valid two-letter country code -func IsISO3166Alpha2(str string) bool { - for _, entry := range ISO3166List { - if str == entry.Alpha2Code { - return true - } - } - return false -} - -// IsISO3166Alpha3 checks if a string is valid three-letter country code -func IsISO3166Alpha3(str string) bool { - for _, entry := range ISO3166List { - if str == entry.Alpha3Code { - return true - } - } - return false -} - -// IsISO693Alpha2 checks if a string is valid two-letter language code -func IsISO693Alpha2(str string) bool { - for _, entry := range ISO693List { - if str == entry.Alpha2Code { - return true - } - } - return false -} - -// IsISO693Alpha3b checks if a string is valid three-letter language code -func IsISO693Alpha3b(str string) bool { - for _, entry := range ISO693List { - if str == entry.Alpha3bCode { - return true - } - } - return false -} - -// IsDNSName will validate the given string as a DNS name -func IsDNSName(str string) bool { - if str == "" || len(strings.Replace(str, ".", "", -1)) > 255 { - // constraints already violated - return false - } - return !IsIP(str) && rxDNSName.MatchString(str) -} - -// IsHash checks if a string is a hash of type algorithm. -// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b'] -func IsHash(str string, algorithm string) bool { - var len string - algo := strings.ToLower(algorithm) - - if algo == "crc32" || algo == "crc32b" { - len = "8" - } else if algo == "md5" || algo == "md4" || algo == "ripemd128" || algo == "tiger128" { - len = "32" - } else if algo == "sha1" || algo == "ripemd160" || algo == "tiger160" { - len = "40" - } else if algo == "tiger192" { - len = "48" - } else if algo == "sha256" { - len = "64" - } else if algo == "sha384" { - len = "96" - } else if algo == "sha512" { - len = "128" - } else { - return false - } - - return Matches(str, "^[a-f0-9]{"+len+"}$") -} - -// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")` -func IsSHA512(str string) bool { - return IsHash(str, "sha512") -} - -// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")` -func IsSHA384(str string) bool { - return IsHash(str, "sha384") -} - -// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")` -func IsSHA256(str string) bool { - return IsHash(str, "sha256") -} - -// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")` -func IsTiger192(str string) bool { - return IsHash(str, "tiger192") -} - -// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")` -func IsTiger160(str string) bool { - return IsHash(str, "tiger160") -} - -// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")` -func IsRipeMD160(str string) bool { - return IsHash(str, "ripemd160") -} - -// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")` -func IsSHA1(str string) bool { - return IsHash(str, "sha1") -} - -// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")` -func IsTiger128(str string) bool { - return IsHash(str, "tiger128") -} - -// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")` -func IsRipeMD128(str string) bool { - return IsHash(str, "ripemd128") -} - -// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")` -func IsCRC32(str string) bool { - return IsHash(str, "crc32") -} - -// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")` -func IsCRC32b(str string) bool { - return IsHash(str, "crc32b") -} - -// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")` -func IsMD5(str string) bool { - return IsHash(str, "md5") -} - -// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")` -func IsMD4(str string) bool { - return IsHash(str, "md4") -} - -// IsDialString validates the given string for usage with the various Dial() functions -func IsDialString(str string) bool { - if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) { - return true - } - - return false -} - -// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP` -func IsIP(str string) bool { - return net.ParseIP(str) != nil -} - -// IsPort checks if a string represents a valid port -func IsPort(str string) bool { - if i, err := strconv.Atoi(str); err == nil && i > 0 && i < 65536 { - return true - } - return false -} - -// IsIPv4 check if the string is an IP version 4. -func IsIPv4(str string) bool { - ip := net.ParseIP(str) - return ip != nil && strings.Contains(str, ".") -} - -// IsIPv6 check if the string is an IP version 6. -func IsIPv6(str string) bool { - ip := net.ParseIP(str) - return ip != nil && strings.Contains(str, ":") -} - -// IsCIDR check if the string is an valid CIDR notiation (IPV4 & IPV6) -func IsCIDR(str string) bool { - _, _, err := net.ParseCIDR(str) - return err == nil -} - -// IsMAC check if a string is valid MAC address. -// Possible MAC formats: -// 01:23:45:67:89:ab -// 01:23:45:67:89:ab:cd:ef -// 01-23-45-67-89-ab -// 01-23-45-67-89-ab-cd-ef -// 0123.4567.89ab -// 0123.4567.89ab.cdef -func IsMAC(str string) bool { - _, err := net.ParseMAC(str) - return err == nil -} - -// IsHost checks if the string is a valid IP (both v4 and v6) or a valid DNS name -func IsHost(str string) bool { - return IsIP(str) || IsDNSName(str) -} - -// IsMongoID check if the string is a valid hex-encoded representation of a MongoDB ObjectId. -func IsMongoID(str string) bool { - return rxHexadecimal.MatchString(str) && (len(str) == 24) -} - -// IsLatitude check if a string is valid latitude. -func IsLatitude(str string) bool { - return rxLatitude.MatchString(str) -} - -// IsLongitude check if a string is valid longitude. -func IsLongitude(str string) bool { - return rxLongitude.MatchString(str) -} - -// IsIMEI check if a string is valid IMEI -func IsIMEI(str string) bool { - return rxIMEI.MatchString(str) -} - -// IsRsaPublicKey check if a string is valid public key with provided length -func IsRsaPublicKey(str string, keylen int) bool { - bb := bytes.NewBufferString(str) - pemBytes, err := ioutil.ReadAll(bb) - if err != nil { - return false - } - block, _ := pem.Decode(pemBytes) - if block != nil && block.Type != "PUBLIC KEY" { - return false - } - var der []byte - - if block != nil { - der = block.Bytes - } else { - der, err = base64.StdEncoding.DecodeString(str) - if err != nil { - return false - } - } - - key, err := x509.ParsePKIXPublicKey(der) - if err != nil { - return false - } - pubkey, ok := key.(*rsa.PublicKey) - if !ok { - return false - } - bitlen := len(pubkey.N.Bytes()) * 8 - return bitlen == int(keylen) -} - -func toJSONName(tag string) string { - if tag == "" { - return "" - } - - // JSON name always comes first. If there's no options then split[0] is - // JSON name, if JSON name is not set, then split[0] is an empty string. - split := strings.SplitN(tag, ",", 2) - - name := split[0] - - // However it is possible that the field is skipped when - // (de-)serializing from/to JSON, in which case assume that there is no - // tag name to use - if name == "-" { - return "" - } - return name -} - -func PrependPathToErrors(err error, path string) error { - switch err2 := err.(type) { - case Error: - err2.Path = append([]string{path}, err2.Path...) - return err2 - case Errors: - errors := err2.Errors() - for i, err3 := range errors { - errors[i] = PrependPathToErrors(err3, path) - } - return err2 - } - return err -} - -// ValidateMap use validation map for fields. -// result will be equal to `false` if there are any errors. -// s is the map containing the data to be validated. -// m is the validation map in the form: -// map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}} -func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) { - if s == nil { - return true, nil - } - result := true - var err error - var errs Errors - var index int - val := reflect.ValueOf(s) - for key, value := range s { - presentResult := true - validator, ok := m[key] - if !ok { - presentResult = false - var err error - err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key) - err = PrependPathToErrors(err, key) - errs = append(errs, err) - } - valueField := reflect.ValueOf(value) - mapResult := true - typeResult := true - structResult := true - resultField := true - switch subValidator := validator.(type) { - case map[string]interface{}: - var err error - if v, ok := value.(map[string]interface{}); !ok { - mapResult = false - err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String()) - err = PrependPathToErrors(err, key) - errs = append(errs, err) - } else { - mapResult, err = ValidateMap(v, subValidator) - if err != nil { - mapResult = false - err = PrependPathToErrors(err, key) - errs = append(errs, err) - } - } - case string: - if (valueField.Kind() == reflect.Struct || - (valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && - subValidator != "-" { - var err error - structResult, err = ValidateStruct(valueField.Interface()) - if err != nil { - err = PrependPathToErrors(err, key) - errs = append(errs, err) - } - } - resultField, err = typeCheck(valueField, reflect.StructField{ - Name: key, - PkgPath: "", - Type: val.Type(), - Tag: reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)), - Offset: 0, - Index: []int{index}, - Anonymous: false, - }, val, nil) - if err != nil { - errs = append(errs, err) - } - case nil: - // already handlerd when checked before - default: - typeResult = false - err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String()) - err = PrependPathToErrors(err, key) - errs = append(errs, err) - } - result = result && presentResult && typeResult && resultField && structResult && mapResult - index++ - } - // check required keys - requiredResult := true - for key, value := range m { - if schema, ok := value.(string); ok { - tags := parseTagIntoMap(schema) - if required, ok := tags["required"]; ok { - if _, ok := s[key]; !ok { - requiredResult = false - if required.customErrorMessage != "" { - err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}} - } else { - err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}} - } - errs = append(errs, err) - } - } - } - } - - if len(errs) > 0 { - err = errs - } - return result && requiredResult, err -} - -// ValidateStruct use tags for fields. -// result will be equal to `false` if there are any errors. -// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail) -func ValidateStruct(s interface{}) (bool, error) { - if s == nil { - return true, nil - } - result := true - var err error - val := reflect.ValueOf(s) - if val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { - val = val.Elem() - } - // we only accept structs - if val.Kind() != reflect.Struct { - return false, fmt.Errorf("function only accepts structs; got %s", val.Kind()) - } - var errs Errors - for i := 0; i < val.NumField(); i++ { - valueField := val.Field(i) - typeField := val.Type().Field(i) - if typeField.PkgPath != "" { - continue // Private field - } - structResult := true - if valueField.Kind() == reflect.Interface { - valueField = valueField.Elem() - } - if (valueField.Kind() == reflect.Struct || - (valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && - typeField.Tag.Get(tagName) != "-" { - var err error - structResult, err = ValidateStruct(valueField.Interface()) - if err != nil { - err = PrependPathToErrors(err, typeField.Name) - errs = append(errs, err) - } - } - resultField, err2 := typeCheck(valueField, typeField, val, nil) - if err2 != nil { - - // Replace structure name with JSON name if there is a tag on the variable - jsonTag := toJSONName(typeField.Tag.Get("json")) - if jsonTag != "" { - switch jsonError := err2.(type) { - case Error: - jsonError.Name = jsonTag - err2 = jsonError - case Errors: - for i2, err3 := range jsonError { - switch customErr := err3.(type) { - case Error: - customErr.Name = jsonTag - jsonError[i2] = customErr - } - } - - err2 = jsonError - } - } - - errs = append(errs, err2) - } - result = result && resultField && structResult - } - if len(errs) > 0 { - err = errs - } - return result, err -} - -// parseTagIntoMap parses a struct tag `valid:required~Some error message,length(2|3)` into map[string]string{"required": "Some error message", "length(2|3)": ""} -func parseTagIntoMap(tag string) tagOptionsMap { - optionsMap := make(tagOptionsMap) - options := strings.Split(tag, ",") - - for i, option := range options { - option = strings.TrimSpace(option) - - validationOptions := strings.Split(option, "~") - if !isValidTag(validationOptions[0]) { - continue - } - if len(validationOptions) == 2 { - optionsMap[validationOptions[0]] = tagOption{validationOptions[0], validationOptions[1], i} - } else { - optionsMap[validationOptions[0]] = tagOption{validationOptions[0], "", i} - } - } - return optionsMap -} - -func isValidTag(s string) bool { - if s == "" { - return false - } - for _, c := range s { - switch { - case strings.ContainsRune("\\'\"!#$%&()*+-./:<=>?@[]^_{|}~ ", c): - // Backslash and quote chars are reserved, but - // otherwise any punctuation chars are allowed - // in a tag name. - default: - if !unicode.IsLetter(c) && !unicode.IsDigit(c) { - return false - } - } - } - return true -} - -// IsSSN will validate the given string as a U.S. Social Security Number -func IsSSN(str string) bool { - if str == "" || len(str) != 11 { - return false - } - return rxSSN.MatchString(str) -} - -// IsSemver check if string is valid semantic version -func IsSemver(str string) bool { - return rxSemver.MatchString(str) -} - -// IsType check if interface is of some type -func IsType(v interface{}, params ...string) bool { - if len(params) == 1 { - typ := params[0] - return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1) - } - return false -} - -// IsTime check if string is valid according to given format -func IsTime(str string, format string) bool { - _, err := time.Parse(format, str) - return err == nil -} - -// IsUnixTime check if string is valid unix timestamp value -func IsUnixTime(str string) bool { - if _, err := strconv.Atoi(str); err == nil { - return true - } - return false -} - -// IsRFC3339 check if string is valid timestamp value according to RFC3339 -func IsRFC3339(str string) bool { - return IsTime(str, time.RFC3339) -} - -// IsRFC3339WithoutZone check if string is valid timestamp value according to RFC3339 which excludes the timezone. -func IsRFC3339WithoutZone(str string) bool { - return IsTime(str, RF3339WithoutZone) -} - -// IsISO4217 check if string is valid ISO currency code -func IsISO4217(str string) bool { - for _, currency := range ISO4217List { - if str == currency { - return true - } - } - - return false -} - -// ByteLength check string's length -func ByteLength(str string, params ...string) bool { - if len(params) == 2 { - min, _ := ToInt(params[0]) - max, _ := ToInt(params[1]) - return len(str) >= int(min) && len(str) <= int(max) - } - - return false -} - -// RuneLength check string's length -// Alias for StringLength -func RuneLength(str string, params ...string) bool { - return StringLength(str, params...) -} - -// IsRsaPub check whether string is valid RSA key -// Alias for IsRsaPublicKey -func IsRsaPub(str string, params ...string) bool { - if len(params) == 1 { - len, _ := ToInt(params[0]) - return IsRsaPublicKey(str, int(len)) - } - - return false -} - -// StringMatches checks if a string matches a given pattern. -func StringMatches(s string, params ...string) bool { - if len(params) == 1 { - pattern := params[0] - return Matches(s, pattern) - } - return false -} - -// StringLength check string's length (including multi byte strings) -func StringLength(str string, params ...string) bool { - - if len(params) == 2 { - strLength := utf8.RuneCountInString(str) - min, _ := ToInt(params[0]) - max, _ := ToInt(params[1]) - return strLength >= int(min) && strLength <= int(max) - } - - return false -} - -// MinStringLength check string's minimum length (including multi byte strings) -func MinStringLength(str string, params ...string) bool { - - if len(params) == 1 { - strLength := utf8.RuneCountInString(str) - min, _ := ToInt(params[0]) - return strLength >= int(min) - } - - return false -} - -// MaxStringLength check string's maximum length (including multi byte strings) -func MaxStringLength(str string, params ...string) bool { - - if len(params) == 1 { - strLength := utf8.RuneCountInString(str) - max, _ := ToInt(params[0]) - return strLength <= int(max) - } - - return false -} - -// Range check string's length -func Range(str string, params ...string) bool { - if len(params) == 2 { - value, _ := ToFloat(str) - min, _ := ToFloat(params[0]) - max, _ := ToFloat(params[1]) - return InRange(value, min, max) - } - - return false -} - -func IsInRaw(str string, params ...string) bool { - if len(params) == 1 { - rawParams := params[0] - - parsedParams := strings.Split(rawParams, "|") - - return IsIn(str, parsedParams...) - } - - return false -} - -// IsIn check if string str is a member of the set of strings params -func IsIn(str string, params ...string) bool { - for _, param := range params { - if str == param { - return true - } - } - - return false -} - -func checkRequired(v reflect.Value, t reflect.StructField, options tagOptionsMap) (bool, error) { - if nilPtrAllowedByRequired { - k := v.Kind() - if (k == reflect.Ptr || k == reflect.Interface) && v.IsNil() { - return true, nil - } - } - - if requiredOption, isRequired := options["required"]; isRequired { - if len(requiredOption.customErrorMessage) > 0 { - return false, Error{t.Name, fmt.Errorf(requiredOption.customErrorMessage), true, "required", []string{}} - } - return false, Error{t.Name, fmt.Errorf("non zero value required"), false, "required", []string{}} - } else if _, isOptional := options["optional"]; fieldsRequiredByDefault && !isOptional { - return false, Error{t.Name, fmt.Errorf("Missing required field"), false, "required", []string{}} - } - // not required and empty is valid - return true, nil -} - -func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options tagOptionsMap) (isValid bool, resultErr error) { - if !v.IsValid() { - return false, nil - } - - tag := t.Tag.Get(tagName) - - // Check if the field should be ignored - switch tag { - case "": - if v.Kind() != reflect.Slice && v.Kind() != reflect.Map { - if !fieldsRequiredByDefault { - return true, nil - } - return false, Error{t.Name, fmt.Errorf("All fields are required to at least have one validation defined"), false, "required", []string{}} - } - case "-": - return true, nil - } - - isRootType := false - if options == nil { - isRootType = true - options = parseTagIntoMap(tag) - } - - if !isFieldSet(v) { - // an empty value is not validated, check only required - isValid, resultErr = checkRequired(v, t, options) - for key := range options { - delete(options, key) - } - return isValid, resultErr - } - - var customTypeErrors Errors - optionsOrder := options.orderedKeys() - for _, validatorName := range optionsOrder { - validatorStruct := options[validatorName] - if validatefunc, ok := CustomTypeTagMap.Get(validatorName); ok { - delete(options, validatorName) - - if result := validatefunc(v.Interface(), o.Interface()); !result { - if len(validatorStruct.customErrorMessage) > 0 { - customTypeErrors = append(customTypeErrors, Error{Name: t.Name, Err: TruncatingErrorf(validatorStruct.customErrorMessage, fmt.Sprint(v), validatorName), CustomErrorMessageExists: true, Validator: stripParams(validatorName)}) - continue - } - customTypeErrors = append(customTypeErrors, Error{Name: t.Name, Err: fmt.Errorf("%s does not validate as %s", fmt.Sprint(v), validatorName), CustomErrorMessageExists: false, Validator: stripParams(validatorName)}) - } - } - } - - if len(customTypeErrors.Errors()) > 0 { - return false, customTypeErrors - } - - if isRootType { - // Ensure that we've checked the value by all specified validators before report that the value is valid - defer func() { - delete(options, "optional") - delete(options, "required") - - if isValid && resultErr == nil && len(options) != 0 { - optionsOrder := options.orderedKeys() - for _, validator := range optionsOrder { - isValid = false - resultErr = Error{t.Name, fmt.Errorf( - "The following validator is invalid or can't be applied to the field: %q", validator), false, stripParams(validator), []string{}} - return - } - } - }() - } - - for _, validatorSpec := range optionsOrder { - validatorStruct := options[validatorSpec] - var negate bool - validator := validatorSpec - customMsgExists := len(validatorStruct.customErrorMessage) > 0 - - // Check whether the tag looks like '!something' or 'something' - if validator[0] == '!' { - validator = validator[1:] - negate = true - } - - // Check for interface param validators - for key, value := range InterfaceParamTagRegexMap { - ps := value.FindStringSubmatch(validator) - if len(ps) == 0 { - continue - } - - validatefunc, ok := InterfaceParamTagMap[key] - if !ok { - continue - } - - delete(options, validatorSpec) - - field := fmt.Sprint(v) - if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) { - if customMsgExists { - return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - if negate { - return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - } - } - - switch v.Kind() { - case reflect.Bool, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, - reflect.Float32, reflect.Float64, - reflect.String: - // for each tag option check the map of validator functions - for _, validatorSpec := range optionsOrder { - validatorStruct := options[validatorSpec] - var negate bool - validator := validatorSpec - customMsgExists := len(validatorStruct.customErrorMessage) > 0 - - // Check whether the tag looks like '!something' or 'something' - if validator[0] == '!' { - validator = validator[1:] - negate = true - } - - // Check for param validators - for key, value := range ParamTagRegexMap { - ps := value.FindStringSubmatch(validator) - if len(ps) == 0 { - continue - } - - validatefunc, ok := ParamTagMap[key] - if !ok { - continue - } - - delete(options, validatorSpec) - - switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - - field := fmt.Sprint(v) // make value into string, then validate with regex - if result := validatefunc(field, ps[1:]...); (!result && !negate) || (result && negate) { - if customMsgExists { - return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - if negate { - return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - default: - // type not yet supported, fail - return false, Error{t.Name, fmt.Errorf("Validator %s doesn't support kind %s", validator, v.Kind()), false, stripParams(validatorSpec), []string{}} - } - } - - if validatefunc, ok := TagMap[validator]; ok { - delete(options, validatorSpec) - - switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - field := fmt.Sprint(v) // make value into string, then validate with regex - if result := validatefunc(field); !result && !negate || result && negate { - if customMsgExists { - return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - if negate { - return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - default: - //Not Yet Supported Types (Fail here!) - err := fmt.Errorf("Validator %s doesn't support kind %s for value %v", validator, v.Kind(), v) - return false, Error{t.Name, err, false, stripParams(validatorSpec), []string{}} - } - } - } - return true, nil - case reflect.Map: - if v.Type().Key().Kind() != reflect.String { - return false, &UnsupportedTypeError{v.Type()} - } - var sv stringValues - sv = v.MapKeys() - sort.Sort(sv) - result := true - for i, k := range sv { - var resultItem bool - var err error - if v.MapIndex(k).Kind() != reflect.Struct { - resultItem, err = typeCheck(v.MapIndex(k), t, o, options) - if err != nil { - return false, err - } - } else { - resultItem, err = ValidateStruct(v.MapIndex(k).Interface()) - if err != nil { - err = PrependPathToErrors(err, t.Name+"."+sv[i].Interface().(string)) - return false, err - } - } - result = result && resultItem - } - return result, nil - case reflect.Slice, reflect.Array: - result := true - for i := 0; i < v.Len(); i++ { - var resultItem bool - var err error - if v.Index(i).Kind() != reflect.Struct { - resultItem, err = typeCheck(v.Index(i), t, o, options) - if err != nil { - return false, err - } - } else { - resultItem, err = ValidateStruct(v.Index(i).Interface()) - if err != nil { - err = PrependPathToErrors(err, t.Name+"."+strconv.Itoa(i)) - return false, err - } - } - result = result && resultItem - } - return result, nil - case reflect.Interface: - // If the value is an interface then encode its element - if v.IsNil() { - return true, nil - } - return ValidateStruct(v.Interface()) - case reflect.Ptr: - // If the value is a pointer then check its element - if v.IsNil() { - return true, nil - } - return typeCheck(v.Elem(), t, o, options) - case reflect.Struct: - return true, nil - default: - return false, &UnsupportedTypeError{v.Type()} - } -} - -func stripParams(validatorString string) string { - return paramsRegexp.ReplaceAllString(validatorString, "") -} - -// isFieldSet returns false for nil pointers, interfaces, maps, and slices. For all other values, it returns true. -func isFieldSet(v reflect.Value) bool { - switch v.Kind() { - case reflect.Map, reflect.Slice, reflect.Interface, reflect.Ptr: - return !v.IsNil() - } - - return true -} - -// ErrorByField returns error for specified field of the struct -// validated by ValidateStruct or empty string if there are no errors -// or this field doesn't exists or doesn't have any errors. -func ErrorByField(e error, field string) string { - if e == nil { - return "" - } - return ErrorsByField(e)[field] -} - -// ErrorsByField returns map of errors of the struct validated -// by ValidateStruct or empty map if there are no errors. -func ErrorsByField(e error) map[string]string { - m := make(map[string]string) - if e == nil { - return m - } - // prototype for ValidateStruct - - switch e := e.(type) { - case Error: - m[e.Name] = e.Err.Error() - case Errors: - for _, item := range e.Errors() { - n := ErrorsByField(item) - for k, v := range n { - m[k] = v - } - } - } - - return m -} - -// Error returns string equivalent for reflect.Type -func (e *UnsupportedTypeError) Error() string { - return "validator: unsupported type: " + e.Type.String() -} - -func (sv stringValues) Len() int { return len(sv) } -func (sv stringValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv stringValues) Less(i, j int) bool { return sv.get(i) < sv.get(j) } -func (sv stringValues) get(i int) string { return sv[i].String() } diff --git a/vendor/github.com/asaskevich/govalidator/wercker.yml b/vendor/github.com/asaskevich/govalidator/wercker.yml deleted file mode 100644 index bc5f7b08..00000000 --- a/vendor/github.com/asaskevich/govalidator/wercker.yml +++ /dev/null @@ -1,15 +0,0 @@ -box: golang -build: - steps: - - setup-go-workspace - - - script: - name: go get - code: | - go version - go get -t ./... - - - script: - name: go test - code: | - go test -race -v ./... diff --git a/vendor/github.com/cpuguy83/go-md2man/v2/LICENSE.md b/vendor/github.com/cpuguy83/go-md2man/v2/LICENSE.md deleted file mode 100644 index 1cade6ce..00000000 --- a/vendor/github.com/cpuguy83/go-md2man/v2/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Brian Goff - -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/cpuguy83/go-md2man/v2/md2man/md2man.go b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go deleted file mode 100644 index b4800567..00000000 --- a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go +++ /dev/null @@ -1,14 +0,0 @@ -package md2man - -import ( - "github.com/russross/blackfriday/v2" -) - -// Render converts a markdown document into a roff formatted document. -func Render(doc []byte) []byte { - renderer := NewRoffRenderer() - - return blackfriday.Run(doc, - []blackfriday.Option{blackfriday.WithRenderer(renderer), - blackfriday.WithExtensions(renderer.GetExtensions())}...) -} diff --git a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go deleted file mode 100644 index 0668a66c..00000000 --- a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go +++ /dev/null @@ -1,345 +0,0 @@ -package md2man - -import ( - "fmt" - "io" - "os" - "strings" - - "github.com/russross/blackfriday/v2" -) - -// roffRenderer implements the blackfriday.Renderer interface for creating -// roff format (manpages) from markdown text -type roffRenderer struct { - extensions blackfriday.Extensions - listCounters []int - firstHeader bool - defineTerm bool - listDepth int -} - -const ( - titleHeader = ".TH " - topLevelHeader = "\n\n.SH " - secondLevelHdr = "\n.SH " - otherHeader = "\n.SS " - crTag = "\n" - emphTag = "\\fI" - emphCloseTag = "\\fP" - strongTag = "\\fB" - strongCloseTag = "\\fP" - breakTag = "\n.br\n" - paraTag = "\n.PP\n" - hruleTag = "\n.ti 0\n\\l'\\n(.lu'\n" - linkTag = "\n\\[la]" - linkCloseTag = "\\[ra]" - codespanTag = "\\fB\\fC" - codespanCloseTag = "\\fR" - codeTag = "\n.PP\n.RS\n\n.nf\n" - codeCloseTag = "\n.fi\n.RE\n" - quoteTag = "\n.PP\n.RS\n" - quoteCloseTag = "\n.RE\n" - listTag = "\n.RS\n" - listCloseTag = "\n.RE\n" - arglistTag = "\n.TP\n" - tableStart = "\n.TS\nallbox;\n" - tableEnd = ".TE\n" - tableCellStart = "T{\n" - tableCellEnd = "\nT}\n" -) - -// NewRoffRenderer creates a new blackfriday Renderer for generating roff documents -// from markdown -func NewRoffRenderer() *roffRenderer { // nolint: golint - var extensions blackfriday.Extensions - - extensions |= blackfriday.NoIntraEmphasis - extensions |= blackfriday.Tables - extensions |= blackfriday.FencedCode - extensions |= blackfriday.SpaceHeadings - extensions |= blackfriday.Footnotes - extensions |= blackfriday.Titleblock - extensions |= blackfriday.DefinitionLists - return &roffRenderer{ - extensions: extensions, - } -} - -// GetExtensions returns the list of extensions used by this renderer implementation -func (r *roffRenderer) GetExtensions() blackfriday.Extensions { - return r.extensions -} - -// RenderHeader handles outputting the header at document start -func (r *roffRenderer) RenderHeader(w io.Writer, ast *blackfriday.Node) { - // disable hyphenation - out(w, ".nh\n") -} - -// RenderFooter handles outputting the footer at the document end; the roff -// renderer has no footer information -func (r *roffRenderer) RenderFooter(w io.Writer, ast *blackfriday.Node) { -} - -// RenderNode is called for each node in a markdown document; based on the node -// type the equivalent roff output is sent to the writer -func (r *roffRenderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus { - - var walkAction = blackfriday.GoToNext - - switch node.Type { - case blackfriday.Text: - r.handleText(w, node, entering) - case blackfriday.Softbreak: - out(w, crTag) - case blackfriday.Hardbreak: - out(w, breakTag) - case blackfriday.Emph: - if entering { - out(w, emphTag) - } else { - out(w, emphCloseTag) - } - case blackfriday.Strong: - if entering { - out(w, strongTag) - } else { - out(w, strongCloseTag) - } - case blackfriday.Link: - if !entering { - out(w, linkTag+string(node.LinkData.Destination)+linkCloseTag) - } - case blackfriday.Image: - // ignore images - walkAction = blackfriday.SkipChildren - case blackfriday.Code: - out(w, codespanTag) - escapeSpecialChars(w, node.Literal) - out(w, codespanCloseTag) - case blackfriday.Document: - break - case blackfriday.Paragraph: - // roff .PP markers break lists - if r.listDepth > 0 { - return blackfriday.GoToNext - } - if entering { - out(w, paraTag) - } else { - out(w, crTag) - } - case blackfriday.BlockQuote: - if entering { - out(w, quoteTag) - } else { - out(w, quoteCloseTag) - } - case blackfriday.Heading: - r.handleHeading(w, node, entering) - case blackfriday.HorizontalRule: - out(w, hruleTag) - case blackfriday.List: - r.handleList(w, node, entering) - case blackfriday.Item: - r.handleItem(w, node, entering) - case blackfriday.CodeBlock: - out(w, codeTag) - escapeSpecialChars(w, node.Literal) - out(w, codeCloseTag) - case blackfriday.Table: - r.handleTable(w, node, entering) - case blackfriday.TableCell: - r.handleTableCell(w, node, entering) - case blackfriday.TableHead: - case blackfriday.TableBody: - case blackfriday.TableRow: - // no action as cell entries do all the nroff formatting - return blackfriday.GoToNext - default: - fmt.Fprintln(os.Stderr, "WARNING: go-md2man does not handle node type "+node.Type.String()) - } - return walkAction -} - -func (r *roffRenderer) handleText(w io.Writer, node *blackfriday.Node, entering bool) { - var ( - start, end string - ) - // handle special roff table cell text encapsulation - if node.Parent.Type == blackfriday.TableCell { - if len(node.Literal) > 30 { - start = tableCellStart - end = tableCellEnd - } else { - // end rows that aren't terminated by "tableCellEnd" with a cr if end of row - if node.Parent.Next == nil && !node.Parent.IsHeader { - end = crTag - } - } - } - out(w, start) - escapeSpecialChars(w, node.Literal) - out(w, end) -} - -func (r *roffRenderer) handleHeading(w io.Writer, node *blackfriday.Node, entering bool) { - if entering { - switch node.Level { - case 1: - if !r.firstHeader { - out(w, titleHeader) - r.firstHeader = true - break - } - out(w, topLevelHeader) - case 2: - out(w, secondLevelHdr) - default: - out(w, otherHeader) - } - } -} - -func (r *roffRenderer) handleList(w io.Writer, node *blackfriday.Node, entering bool) { - openTag := listTag - closeTag := listCloseTag - if node.ListFlags&blackfriday.ListTypeDefinition != 0 { - // tags for definition lists handled within Item node - openTag = "" - closeTag = "" - } - if entering { - r.listDepth++ - if node.ListFlags&blackfriday.ListTypeOrdered != 0 { - r.listCounters = append(r.listCounters, 1) - } - out(w, openTag) - } else { - if node.ListFlags&blackfriday.ListTypeOrdered != 0 { - r.listCounters = r.listCounters[:len(r.listCounters)-1] - } - out(w, closeTag) - r.listDepth-- - } -} - -func (r *roffRenderer) handleItem(w io.Writer, node *blackfriday.Node, entering bool) { - if entering { - if node.ListFlags&blackfriday.ListTypeOrdered != 0 { - out(w, fmt.Sprintf(".IP \"%3d.\" 5\n", r.listCounters[len(r.listCounters)-1])) - r.listCounters[len(r.listCounters)-1]++ - } else if node.ListFlags&blackfriday.ListTypeDefinition != 0 { - // state machine for handling terms and following definitions - // since blackfriday does not distinguish them properly, nor - // does it seperate them into separate lists as it should - if !r.defineTerm { - out(w, arglistTag) - r.defineTerm = true - } else { - r.defineTerm = false - } - } else { - out(w, ".IP \\(bu 2\n") - } - } else { - out(w, "\n") - } -} - -func (r *roffRenderer) handleTable(w io.Writer, node *blackfriday.Node, entering bool) { - if entering { - out(w, tableStart) - //call walker to count cells (and rows?) so format section can be produced - columns := countColumns(node) - out(w, strings.Repeat("l ", columns)+"\n") - out(w, strings.Repeat("l ", columns)+".\n") - } else { - out(w, tableEnd) - } -} - -func (r *roffRenderer) handleTableCell(w io.Writer, node *blackfriday.Node, entering bool) { - var ( - start, end string - ) - if node.IsHeader { - start = codespanTag - end = codespanCloseTag - } - if entering { - if node.Prev != nil && node.Prev.Type == blackfriday.TableCell { - out(w, "\t"+start) - } else { - out(w, start) - } - } else { - // need to carriage return if we are at the end of the header row - if node.IsHeader && node.Next == nil { - end = end + crTag - } - out(w, end) - } -} - -// because roff format requires knowing the column count before outputting any table -// data we need to walk a table tree and count the columns -func countColumns(node *blackfriday.Node) int { - var columns int - - node.Walk(func(node *blackfriday.Node, entering bool) blackfriday.WalkStatus { - switch node.Type { - case blackfriday.TableRow: - if !entering { - return blackfriday.Terminate - } - case blackfriday.TableCell: - if entering { - columns++ - } - default: - } - return blackfriday.GoToNext - }) - return columns -} - -func out(w io.Writer, output string) { - io.WriteString(w, output) // nolint: errcheck -} - -func needsBackslash(c byte) bool { - for _, r := range []byte("-_&\\~") { - if c == r { - return true - } - } - return false -} - -func escapeSpecialChars(w io.Writer, text []byte) { - for i := 0; i < len(text); i++ { - // escape initial apostrophe or period - if len(text) >= 1 && (text[0] == '\'' || text[0] == '.') { - out(w, "\\&") - } - - // directly copy normal characters - org := i - - for i < len(text) && !needsBackslash(text[i]) { - i++ - } - if i > org { - w.Write(text[org:i]) // nolint: errcheck - } - - // escape a character - if i >= len(text) { - break - } - - w.Write([]byte{'\\', text[i]}) // nolint: errcheck - } -} diff --git a/vendor/github.com/creack/pty/.gitignore b/vendor/github.com/creack/pty/.gitignore deleted file mode 100644 index 1f0a99f2..00000000 --- a/vendor/github.com/creack/pty/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -[568].out -_go* -_test* -_obj diff --git a/vendor/github.com/creack/pty/Dockerfile.riscv b/vendor/github.com/creack/pty/Dockerfile.riscv deleted file mode 100644 index adfdf82c..00000000 --- a/vendor/github.com/creack/pty/Dockerfile.riscv +++ /dev/null @@ -1,14 +0,0 @@ -FROM golang:1.13 - -# Clone and complie a riscv compatible version of the go compiler. -RUN git clone https://review.gerrithub.io/riscv/riscv-go /riscv-go -# riscvdev branch HEAD as of 2019-06-29. -RUN cd /riscv-go && git checkout 04885fddd096d09d4450726064d06dd107e374bf -ENV PATH=/riscv-go/misc/riscv:/riscv-go/bin:$PATH -RUN cd /riscv-go/src && GOROOT_BOOTSTRAP=$(go env GOROOT) ./make.bash -ENV GOROOT=/riscv-go - -# Make sure we compile. -WORKDIR pty -ADD . . -RUN GOOS=linux GOARCH=riscv go build diff --git a/vendor/github.com/creack/pty/LICENSE b/vendor/github.com/creack/pty/LICENSE deleted file mode 100644 index 6b7558b6..00000000 --- a/vendor/github.com/creack/pty/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2011 Keith Rarick - -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/creack/pty/README.md b/vendor/github.com/creack/pty/README.md deleted file mode 100644 index 5275014a..00000000 --- a/vendor/github.com/creack/pty/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# pty - -Pty is a Go package for using unix pseudo-terminals. - -## Install - - go get github.com/creack/pty - -## Example - -### Command - -```go -package main - -import ( - "github.com/creack/pty" - "io" - "os" - "os/exec" -) - -func main() { - c := exec.Command("grep", "--color=auto", "bar") - f, err := pty.Start(c) - if err != nil { - panic(err) - } - - go func() { - f.Write([]byte("foo\n")) - f.Write([]byte("bar\n")) - f.Write([]byte("baz\n")) - f.Write([]byte{4}) // EOT - }() - io.Copy(os.Stdout, f) -} -``` - -### Shell - -```go -package main - -import ( - "io" - "log" - "os" - "os/exec" - "os/signal" - "syscall" - - "github.com/creack/pty" - "golang.org/x/crypto/ssh/terminal" -) - -func test() error { - // Create arbitrary command. - c := exec.Command("bash") - - // Start the command with a pty. - ptmx, err := pty.Start(c) - if err != nil { - return err - } - // Make sure to close the pty at the end. - defer func() { _ = ptmx.Close() }() // Best effort. - - // Handle pty size. - ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGWINCH) - go func() { - for range ch { - if err := pty.InheritSize(os.Stdin, ptmx); err != nil { - log.Printf("error resizing pty: %s", err) - } - } - }() - ch <- syscall.SIGWINCH // Initial resize. - - // Set stdin in raw mode. - oldState, err := terminal.MakeRaw(int(os.Stdin.Fd())) - if err != nil { - panic(err) - } - defer func() { _ = terminal.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort. - - // Copy stdin to the pty and the pty to stdout. - go func() { _, _ = io.Copy(ptmx, os.Stdin) }() - _, _ = io.Copy(os.Stdout, ptmx) - - return nil -} - -func main() { - if err := test(); err != nil { - log.Fatal(err) - } -} -``` diff --git a/vendor/github.com/creack/pty/doc.go b/vendor/github.com/creack/pty/doc.go deleted file mode 100644 index 190cfbea..00000000 --- a/vendor/github.com/creack/pty/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package pty provides functions for working with Unix terminals. -package pty - -import ( - "errors" - "os" -) - -// ErrUnsupported is returned if a function is not -// available on the current platform. -var ErrUnsupported = errors.New("unsupported") - -// Opens a pty and its corresponding tty. -func Open() (pty, tty *os.File, err error) { - return open() -} diff --git a/vendor/github.com/creack/pty/go.mod b/vendor/github.com/creack/pty/go.mod deleted file mode 100644 index e48decaf..00000000 --- a/vendor/github.com/creack/pty/go.mod +++ /dev/null @@ -1,4 +0,0 @@ -module github.com/creack/pty - -go 1.13 - diff --git a/vendor/github.com/creack/pty/ioctl.go b/vendor/github.com/creack/pty/ioctl.go deleted file mode 100644 index c85cdcd1..00000000 --- a/vendor/github.com/creack/pty/ioctl.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !windows,!solaris - -package pty - -import "syscall" - -func ioctl(fd, cmd, ptr uintptr) error { - _, _, e := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr) - if e != 0 { - return e - } - return nil -} diff --git a/vendor/github.com/creack/pty/ioctl_bsd.go b/vendor/github.com/creack/pty/ioctl_bsd.go deleted file mode 100644 index 73b12c53..00000000 --- a/vendor/github.com/creack/pty/ioctl_bsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build darwin dragonfly freebsd netbsd openbsd - -package pty - -// from -const ( - _IOC_VOID uintptr = 0x20000000 - _IOC_OUT uintptr = 0x40000000 - _IOC_IN uintptr = 0x80000000 - _IOC_IN_OUT uintptr = _IOC_OUT | _IOC_IN - _IOC_DIRMASK = _IOC_VOID | _IOC_OUT | _IOC_IN - - _IOC_PARAM_SHIFT = 13 - _IOC_PARAM_MASK = (1 << _IOC_PARAM_SHIFT) - 1 -) - -func _IOC_PARM_LEN(ioctl uintptr) uintptr { - return (ioctl >> 16) & _IOC_PARAM_MASK -} - -func _IOC(inout uintptr, group byte, ioctl_num uintptr, param_len uintptr) uintptr { - return inout | (param_len&_IOC_PARAM_MASK)<<16 | uintptr(group)<<8 | ioctl_num -} - -func _IO(group byte, ioctl_num uintptr) uintptr { - return _IOC(_IOC_VOID, group, ioctl_num, 0) -} - -func _IOR(group byte, ioctl_num uintptr, param_len uintptr) uintptr { - return _IOC(_IOC_OUT, group, ioctl_num, param_len) -} - -func _IOW(group byte, ioctl_num uintptr, param_len uintptr) uintptr { - return _IOC(_IOC_IN, group, ioctl_num, param_len) -} - -func _IOWR(group byte, ioctl_num uintptr, param_len uintptr) uintptr { - return _IOC(_IOC_IN_OUT, group, ioctl_num, param_len) -} diff --git a/vendor/github.com/creack/pty/ioctl_solaris.go b/vendor/github.com/creack/pty/ioctl_solaris.go deleted file mode 100644 index f63985f3..00000000 --- a/vendor/github.com/creack/pty/ioctl_solaris.go +++ /dev/null @@ -1,30 +0,0 @@ -package pty - -import ( - "golang.org/x/sys/unix" - "unsafe" -) - -const ( - // see /usr/include/sys/stropts.h - I_PUSH = uintptr((int32('S')<<8 | 002)) - I_STR = uintptr((int32('S')<<8 | 010)) - I_FIND = uintptr((int32('S')<<8 | 013)) - // see /usr/include/sys/ptms.h - ISPTM = (int32('P') << 8) | 1 - UNLKPT = (int32('P') << 8) | 2 - PTSSTTY = (int32('P') << 8) | 3 - ZONEPT = (int32('P') << 8) | 4 - OWNERPT = (int32('P') << 8) | 5 -) - -type strioctl struct { - ic_cmd int32 - ic_timout int32 - ic_len int32 - ic_dp unsafe.Pointer -} - -func ioctl(fd, cmd, ptr uintptr) error { - return unix.IoctlSetInt(int(fd), uint(cmd), int(ptr)) -} diff --git a/vendor/github.com/creack/pty/mktypes.bash b/vendor/github.com/creack/pty/mktypes.bash deleted file mode 100644 index 82ee1672..00000000 --- a/vendor/github.com/creack/pty/mktypes.bash +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -GOOSARCH="${GOOS}_${GOARCH}" -case "$GOOSARCH" in -_* | *_ | _) - echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 - exit 1 - ;; -esac - -GODEFS="go tool cgo -godefs" - -$GODEFS types.go |gofmt > ztypes_$GOARCH.go - -case $GOOS in -freebsd|dragonfly|openbsd) - $GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go - ;; -esac diff --git a/vendor/github.com/creack/pty/pty_darwin.go b/vendor/github.com/creack/pty/pty_darwin.go deleted file mode 100644 index 6344b6b0..00000000 --- a/vendor/github.com/creack/pty/pty_darwin.go +++ /dev/null @@ -1,65 +0,0 @@ -package pty - -import ( - "errors" - "os" - "syscall" - "unsafe" -) - -func open() (pty, tty *os.File, err error) { - pFD, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|syscall.O_CLOEXEC, 0) - if err != nil { - return nil, nil, err - } - p := os.NewFile(uintptr(pFD), "/dev/ptmx") - // In case of error after this point, make sure we close the ptmx fd. - defer func() { - if err != nil { - _ = p.Close() // Best effort. - } - }() - - sname, err := ptsname(p) - if err != nil { - return nil, nil, err - } - - if err := grantpt(p); err != nil { - return nil, nil, err - } - - if err := unlockpt(p); err != nil { - return nil, nil, err - } - - t, err := os.OpenFile(sname, os.O_RDWR, 0) - if err != nil { - return nil, nil, err - } - return p, t, nil -} - -func ptsname(f *os.File) (string, error) { - n := make([]byte, _IOC_PARM_LEN(syscall.TIOCPTYGNAME)) - - err := ioctl(f.Fd(), syscall.TIOCPTYGNAME, uintptr(unsafe.Pointer(&n[0]))) - if err != nil { - return "", err - } - - for i, c := range n { - if c == 0 { - return string(n[:i]), nil - } - } - return "", errors.New("TIOCPTYGNAME string not NUL-terminated") -} - -func grantpt(f *os.File) error { - return ioctl(f.Fd(), syscall.TIOCPTYGRANT, 0) -} - -func unlockpt(f *os.File) error { - return ioctl(f.Fd(), syscall.TIOCPTYUNLK, 0) -} diff --git a/vendor/github.com/creack/pty/pty_dragonfly.go b/vendor/github.com/creack/pty/pty_dragonfly.go deleted file mode 100644 index b7d1f20f..00000000 --- a/vendor/github.com/creack/pty/pty_dragonfly.go +++ /dev/null @@ -1,80 +0,0 @@ -package pty - -import ( - "errors" - "os" - "strings" - "syscall" - "unsafe" -) - -// same code as pty_darwin.go -func open() (pty, tty *os.File, err error) { - p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) - if err != nil { - return nil, nil, err - } - // In case of error after this point, make sure we close the ptmx fd. - defer func() { - if err != nil { - _ = p.Close() // Best effort. - } - }() - - sname, err := ptsname(p) - if err != nil { - return nil, nil, err - } - - if err := grantpt(p); err != nil { - return nil, nil, err - } - - if err := unlockpt(p); err != nil { - return nil, nil, err - } - - t, err := os.OpenFile(sname, os.O_RDWR, 0) - if err != nil { - return nil, nil, err - } - return p, t, nil -} - -func grantpt(f *os.File) error { - _, err := isptmaster(f.Fd()) - return err -} - -func unlockpt(f *os.File) error { - _, err := isptmaster(f.Fd()) - return err -} - -func isptmaster(fd uintptr) (bool, error) { - err := ioctl(fd, syscall.TIOCISPTMASTER, 0) - return err == nil, err -} - -var ( - emptyFiodgnameArg fiodgnameArg - ioctl_FIODNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg)) -) - -func ptsname(f *os.File) (string, error) { - name := make([]byte, _C_SPECNAMELEN) - fa := fiodgnameArg{Name: (*byte)(unsafe.Pointer(&name[0])), Len: _C_SPECNAMELEN, Pad_cgo_0: [4]byte{0, 0, 0, 0}} - - err := ioctl(f.Fd(), ioctl_FIODNAME, uintptr(unsafe.Pointer(&fa))) - if err != nil { - return "", err - } - - for i, c := range name { - if c == 0 { - s := "/dev/" + string(name[:i]) - return strings.Replace(s, "ptm", "pts", -1), nil - } - } - return "", errors.New("TIOCPTYGNAME string not NUL-terminated") -} diff --git a/vendor/github.com/creack/pty/pty_freebsd.go b/vendor/github.com/creack/pty/pty_freebsd.go deleted file mode 100644 index 63b6d913..00000000 --- a/vendor/github.com/creack/pty/pty_freebsd.go +++ /dev/null @@ -1,78 +0,0 @@ -package pty - -import ( - "errors" - "os" - "syscall" - "unsafe" -) - -func posixOpenpt(oflag int) (fd int, err error) { - r0, _, e1 := syscall.Syscall(syscall.SYS_POSIX_OPENPT, uintptr(oflag), 0, 0) - fd = int(r0) - if e1 != 0 { - err = e1 - } - return fd, err -} - -func open() (pty, tty *os.File, err error) { - fd, err := posixOpenpt(syscall.O_RDWR | syscall.O_CLOEXEC) - if err != nil { - return nil, nil, err - } - p := os.NewFile(uintptr(fd), "/dev/pts") - // In case of error after this point, make sure we close the pts fd. - defer func() { - if err != nil { - _ = p.Close() // Best effort. - } - }() - - sname, err := ptsname(p) - if err != nil { - return nil, nil, err - } - - t, err := os.OpenFile("/dev/"+sname, os.O_RDWR, 0) - if err != nil { - return nil, nil, err - } - return p, t, nil -} - -func isptmaster(fd uintptr) (bool, error) { - err := ioctl(fd, syscall.TIOCPTMASTER, 0) - return err == nil, err -} - -var ( - emptyFiodgnameArg fiodgnameArg - ioctlFIODGNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg)) -) - -func ptsname(f *os.File) (string, error) { - master, err := isptmaster(f.Fd()) - if err != nil { - return "", err - } - if !master { - return "", syscall.EINVAL - } - - const n = _C_SPECNAMELEN + 1 - var ( - buf = make([]byte, n) - arg = fiodgnameArg{Len: n, Buf: (*byte)(unsafe.Pointer(&buf[0]))} - ) - if err := ioctl(f.Fd(), ioctlFIODGNAME, uintptr(unsafe.Pointer(&arg))); err != nil { - return "", err - } - - for i, c := range buf { - if c == 0 { - return string(buf[:i]), nil - } - } - return "", errors.New("FIODGNAME string not NUL-terminated") -} diff --git a/vendor/github.com/creack/pty/pty_linux.go b/vendor/github.com/creack/pty/pty_linux.go deleted file mode 100644 index 4a833de1..00000000 --- a/vendor/github.com/creack/pty/pty_linux.go +++ /dev/null @@ -1,51 +0,0 @@ -package pty - -import ( - "os" - "strconv" - "syscall" - "unsafe" -) - -func open() (pty, tty *os.File, err error) { - p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) - if err != nil { - return nil, nil, err - } - // In case of error after this point, make sure we close the ptmx fd. - defer func() { - if err != nil { - _ = p.Close() // Best effort. - } - }() - - sname, err := ptsname(p) - if err != nil { - return nil, nil, err - } - - if err := unlockpt(p); err != nil { - return nil, nil, err - } - - t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0) - if err != nil { - return nil, nil, err - } - return p, t, nil -} - -func ptsname(f *os.File) (string, error) { - var n _C_uint - err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))) - if err != nil { - return "", err - } - return "/dev/pts/" + strconv.Itoa(int(n)), nil -} - -func unlockpt(f *os.File) error { - var u _C_int - // use TIOCSPTLCK with a pointer to zero to clear the lock - return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) -} diff --git a/vendor/github.com/creack/pty/pty_openbsd.go b/vendor/github.com/creack/pty/pty_openbsd.go deleted file mode 100644 index a6a35d1e..00000000 --- a/vendor/github.com/creack/pty/pty_openbsd.go +++ /dev/null @@ -1,33 +0,0 @@ -package pty - -import ( - "os" - "syscall" - "unsafe" -) - -func open() (pty, tty *os.File, err error) { - /* - * from ptm(4): - * The PTMGET command allocates a free pseudo terminal, changes its - * ownership to the caller, revokes the access privileges for all previous - * users, opens the file descriptors for the pty and tty devices and - * returns them to the caller in struct ptmget. - */ - - p, err := os.OpenFile("/dev/ptm", os.O_RDWR|syscall.O_CLOEXEC, 0) - if err != nil { - return nil, nil, err - } - defer p.Close() - - var ptm ptmget - if err := ioctl(p.Fd(), uintptr(ioctl_PTMGET), uintptr(unsafe.Pointer(&ptm))); err != nil { - return nil, nil, err - } - - pty = os.NewFile(uintptr(ptm.Cfd), "/dev/ptm") - tty = os.NewFile(uintptr(ptm.Sfd), "/dev/ptm") - - return pty, tty, nil -} diff --git a/vendor/github.com/creack/pty/pty_solaris.go b/vendor/github.com/creack/pty/pty_solaris.go deleted file mode 100644 index 09ec1b79..00000000 --- a/vendor/github.com/creack/pty/pty_solaris.go +++ /dev/null @@ -1,139 +0,0 @@ -package pty - -/* based on: -http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libc/port/gen/pt.c -*/ - -import ( - "errors" - "golang.org/x/sys/unix" - "os" - "strconv" - "syscall" - "unsafe" -) - -const NODEV = ^uint64(0) - -func open() (pty, tty *os.File, err error) { - masterfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|unix.O_NOCTTY, 0) - //masterfd, err := syscall.Open("/dev/ptmx", syscall.O_RDWR|syscall.O_CLOEXEC|unix.O_NOCTTY, 0) - if err != nil { - return nil, nil, err - } - p := os.NewFile(uintptr(masterfd), "/dev/ptmx") - - sname, err := ptsname(p) - if err != nil { - return nil, nil, err - } - - err = grantpt(p) - if err != nil { - return nil, nil, err - } - - err = unlockpt(p) - if err != nil { - return nil, nil, err - } - - slavefd, err := syscall.Open(sname, os.O_RDWR|unix.O_NOCTTY, 0) - if err != nil { - return nil, nil, err - } - t := os.NewFile(uintptr(slavefd), sname) - - // pushing terminal driver STREAMS modules as per pts(7) - for _, mod := range([]string{"ptem", "ldterm", "ttcompat"}) { - err = streams_push(t, mod) - if err != nil { - return nil, nil, err - } - } - - return p, t, nil -} - -func minor(x uint64) uint64 { - return x & 0377 -} - -func ptsdev(fd uintptr) uint64 { - istr := strioctl{ISPTM, 0, 0, nil} - err := ioctl(fd, I_STR, uintptr(unsafe.Pointer(&istr))) - if err != nil { - return NODEV - } - var status unix.Stat_t - err = unix.Fstat(int(fd), &status) - if err != nil { - return NODEV - } - return uint64(minor(status.Rdev)) -} - -func ptsname(f *os.File) (string, error) { - dev := ptsdev(f.Fd()) - if dev == NODEV { - return "", errors.New("not a master pty") - } - fn := "/dev/pts/" + strconv.FormatInt(int64(dev), 10) - // access(2) creates the slave device (if the pty exists) - // F_OK == 0 (unistd.h) - err := unix.Access(fn, 0) - if err != nil { - return "", err - } - return fn, nil -} - -type pt_own struct { - pto_ruid int32 - pto_rgid int32 -} - -func grantpt(f *os.File) error { - if ptsdev(f.Fd()) == NODEV { - return errors.New("not a master pty") - } - var pto pt_own - pto.pto_ruid = int32(os.Getuid()) - // XXX should first attempt to get gid of DEFAULT_TTY_GROUP="tty" - pto.pto_rgid = int32(os.Getgid()) - var istr strioctl - istr.ic_cmd = OWNERPT - istr.ic_timout = 0 - istr.ic_len = int32(unsafe.Sizeof(istr)) - istr.ic_dp = unsafe.Pointer(&pto) - err := ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr))) - if err != nil { - return errors.New("access denied") - } - return nil -} - -func unlockpt(f *os.File) error { - istr := strioctl{UNLKPT, 0, 0, nil} - return ioctl(f.Fd(), I_STR, uintptr(unsafe.Pointer(&istr))) -} - -// push STREAMS modules if not already done so -func streams_push(f *os.File, mod string) error { - var err error - buf := []byte(mod) - // XXX I_FIND is not returning an error when the module - // is already pushed even though truss reports a return - // value of 1. A bug in the Go Solaris syscall interface? - // XXX without this we are at risk of the issue - // https://www.illumos.org/issues/9042 - // but since we are not using libc or XPG4.2, we should not be - // double-pushing modules - - err = ioctl(f.Fd(), I_FIND, uintptr(unsafe.Pointer(&buf[0]))) - if err != nil { - return nil - } - err = ioctl(f.Fd(), I_PUSH, uintptr(unsafe.Pointer(&buf[0]))) - return err -} diff --git a/vendor/github.com/creack/pty/pty_unsupported.go b/vendor/github.com/creack/pty/pty_unsupported.go deleted file mode 100644 index ceb425b1..00000000 --- a/vendor/github.com/creack/pty/pty_unsupported.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !linux,!darwin,!freebsd,!dragonfly,!openbsd,!solaris - -package pty - -import ( - "os" -) - -func open() (pty, tty *os.File, err error) { - return nil, nil, ErrUnsupported -} diff --git a/vendor/github.com/creack/pty/run.go b/vendor/github.com/creack/pty/run.go deleted file mode 100644 index b0794251..00000000 --- a/vendor/github.com/creack/pty/run.go +++ /dev/null @@ -1,74 +0,0 @@ -// +build !windows - -package pty - -import ( - "os" - "os/exec" - "syscall" -) - -// Start assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, -// and c.Stderr, calls c.Start, and returns the File of the tty's -// corresponding pty. -// -// Starts the process in a new session and sets the controlling terminal. -func Start(c *exec.Cmd) (pty *os.File, err error) { - return StartWithSize(c, nil) -} - -// StartWithSize assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, -// and c.Stderr, calls c.Start, and returns the File of the tty's -// corresponding pty. -// -// This will resize the pty to the specified size before starting the command. -// Starts the process in a new session and sets the controlling terminal. -func StartWithSize(c *exec.Cmd, sz *Winsize) (pty *os.File, err error) { - if c.SysProcAttr == nil { - c.SysProcAttr = &syscall.SysProcAttr{} - } - c.SysProcAttr.Setsid = true - c.SysProcAttr.Setctty = true - return StartWithAttrs(c, sz, c.SysProcAttr) -} - -// StartWithAttrs assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, -// and c.Stderr, calls c.Start, and returns the File of the tty's -// corresponding pty. -// -// This will resize the pty to the specified size before starting the command if a size is provided. -// The `attrs` parameter overrides the one set in c.SysProcAttr. -// -// This should generally not be needed. Used in some edge cases where it is needed to create a pty -// without a controlling terminal. -func StartWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (pty *os.File, err error) { - pty, tty, err := Open() - if err != nil { - return nil, err - } - defer tty.Close() - - if sz != nil { - if err := Setsize(pty, sz); err != nil { - pty.Close() - return nil, err - } - } - if c.Stdout == nil { - c.Stdout = tty - } - if c.Stderr == nil { - c.Stderr = tty - } - if c.Stdin == nil { - c.Stdin = tty - } - - c.SysProcAttr = attrs - - if err := c.Start(); err != nil { - _ = pty.Close() - return nil, err - } - return pty, err -} diff --git a/vendor/github.com/creack/pty/test_crosscompile.sh b/vendor/github.com/creack/pty/test_crosscompile.sh deleted file mode 100644 index f0b1dcac..00000000 --- a/vendor/github.com/creack/pty/test_crosscompile.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env sh - -# Test script checking that all expected os/arch compile properly. -# Does not actually test the logic, just the compilation so we make sure we don't break code depending on the lib. - -echo2() { - echo $@ >&2 -} - -trap end 0 -end() { - [ "$?" = 0 ] && echo2 "Pass." || (echo2 "Fail."; exit 1) -} - -cross() { - os=$1 - shift - echo2 "Build for $os." - for arch in $@; do - echo2 " - $os/$arch" - GOOS=$os GOARCH=$arch go build - done - echo2 -} - -set -e - -cross linux amd64 386 arm arm64 ppc64 ppc64le s390x mips mipsle mips64 mips64le -cross darwin amd64 386 arm arm64 -cross freebsd amd64 386 arm -cross netbsd amd64 386 arm -cross openbsd amd64 386 -cross dragonfly amd64 -cross solaris amd64 - -# Not expected to work but should still compile. -cross windows amd64 386 arm - -# TODO: Fix compilation error on openbsd/arm. -# TODO: Merge the solaris PR. - -# Some os/arch require a different compiler. Run in docker. -if ! hash docker; then - # If docker is not present, stop here. - return -fi - -echo2 "Build for linux." -echo2 " - linux/riscv" -docker build -t test -f Dockerfile.riscv . diff --git a/vendor/github.com/creack/pty/util.go b/vendor/github.com/creack/pty/util.go deleted file mode 100644 index 8fdde0ba..00000000 --- a/vendor/github.com/creack/pty/util.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build !windows,!solaris - -package pty - -import ( - "os" - "syscall" - "unsafe" -) - -// InheritSize applies the terminal size of pty to tty. This should be run -// in a signal handler for syscall.SIGWINCH to automatically resize the tty when -// the pty receives a window size change notification. -func InheritSize(pty, tty *os.File) error { - size, err := GetsizeFull(pty) - if err != nil { - return err - } - err = Setsize(tty, size) - if err != nil { - return err - } - return nil -} - -// Setsize resizes t to s. -func Setsize(t *os.File, ws *Winsize) error { - return windowRectCall(ws, t.Fd(), syscall.TIOCSWINSZ) -} - -// GetsizeFull returns the full terminal size description. -func GetsizeFull(t *os.File) (size *Winsize, err error) { - var ws Winsize - err = windowRectCall(&ws, t.Fd(), syscall.TIOCGWINSZ) - return &ws, err -} - -// Getsize returns the number of rows (lines) and cols (positions -// in each line) in terminal t. -func Getsize(t *os.File) (rows, cols int, err error) { - ws, err := GetsizeFull(t) - return int(ws.Rows), int(ws.Cols), err -} - -// Winsize describes the terminal size. -type Winsize struct { - Rows uint16 // ws_row: Number of rows (in cells) - Cols uint16 // ws_col: Number of columns (in cells) - X uint16 // ws_xpixel: Width in pixels - Y uint16 // ws_ypixel: Height in pixels -} - -func windowRectCall(ws *Winsize, fd, a2 uintptr) error { - _, _, errno := syscall.Syscall( - syscall.SYS_IOCTL, - fd, - a2, - uintptr(unsafe.Pointer(ws)), - ) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} diff --git a/vendor/github.com/creack/pty/util_solaris.go b/vendor/github.com/creack/pty/util_solaris.go deleted file mode 100644 index e8896924..00000000 --- a/vendor/github.com/creack/pty/util_solaris.go +++ /dev/null @@ -1,51 +0,0 @@ -// - -package pty - -import ( - "os" - "golang.org/x/sys/unix" -) - -const ( - TIOCGWINSZ = 21608 // 'T' << 8 | 104 - TIOCSWINSZ = 21607 // 'T' << 8 | 103 -) - -// Winsize describes the terminal size. -type Winsize struct { - Rows uint16 // ws_row: Number of rows (in cells) - Cols uint16 // ws_col: Number of columns (in cells) - X uint16 // ws_xpixel: Width in pixels - Y uint16 // ws_ypixel: Height in pixels -} - -// GetsizeFull returns the full terminal size description. -func GetsizeFull(t *os.File) (size *Winsize, err error) { - var wsz *unix.Winsize - wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ) - - if err != nil { - return nil, err - } else { - return &Winsize{wsz.Row, wsz.Col, wsz.Xpixel, wsz.Ypixel}, nil - } -} - -// Get Windows Size -func Getsize(t *os.File) (rows, cols int, err error) { - var wsz *unix.Winsize - wsz, err = unix.IoctlGetWinsize(int(t.Fd()), TIOCGWINSZ) - - if err != nil { - return 80, 25, err - } else { - return int(wsz.Row), int(wsz.Col), nil - } -} - -// Setsize resizes t to s. -func Setsize(t *os.File, ws *Winsize) error { - wsz := unix.Winsize{ws.Rows, ws.Cols, ws.X, ws.Y} - return unix.IoctlSetWinsize(int(t.Fd()), TIOCSWINSZ, &wsz) -} diff --git a/vendor/github.com/creack/pty/ztypes_386.go b/vendor/github.com/creack/pty/ztypes_386.go deleted file mode 100644 index ff0b8fd8..00000000 --- a/vendor/github.com/creack/pty/ztypes_386.go +++ /dev/null @@ -1,9 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_amd64.go b/vendor/github.com/creack/pty/ztypes_amd64.go deleted file mode 100644 index ff0b8fd8..00000000 --- a/vendor/github.com/creack/pty/ztypes_amd64.go +++ /dev/null @@ -1,9 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_arm.go b/vendor/github.com/creack/pty/ztypes_arm.go deleted file mode 100644 index ff0b8fd8..00000000 --- a/vendor/github.com/creack/pty/ztypes_arm.go +++ /dev/null @@ -1,9 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_arm64.go b/vendor/github.com/creack/pty/ztypes_arm64.go deleted file mode 100644 index 6c29a4b9..00000000 --- a/vendor/github.com/creack/pty/ztypes_arm64.go +++ /dev/null @@ -1,11 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -// +build arm64 - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go b/vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go deleted file mode 100644 index 6b0ba037..00000000 --- a/vendor/github.com/creack/pty/ztypes_dragonfly_amd64.go +++ /dev/null @@ -1,14 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_dragonfly.go - -package pty - -const ( - _C_SPECNAMELEN = 0x3f -) - -type fiodgnameArg struct { - Name *byte - Len uint32 - Pad_cgo_0 [4]byte -} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_386.go b/vendor/github.com/creack/pty/ztypes_freebsd_386.go deleted file mode 100644 index d9975374..00000000 --- a/vendor/github.com/creack/pty/ztypes_freebsd_386.go +++ /dev/null @@ -1,13 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_freebsd.go - -package pty - -const ( - _C_SPECNAMELEN = 0x3f -) - -type fiodgnameArg struct { - Len int32 - Buf *byte -} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_amd64.go b/vendor/github.com/creack/pty/ztypes_freebsd_amd64.go deleted file mode 100644 index 5fa102fc..00000000 --- a/vendor/github.com/creack/pty/ztypes_freebsd_amd64.go +++ /dev/null @@ -1,14 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_freebsd.go - -package pty - -const ( - _C_SPECNAMELEN = 0x3f -) - -type fiodgnameArg struct { - Len int32 - Pad_cgo_0 [4]byte - Buf *byte -} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_arm.go b/vendor/github.com/creack/pty/ztypes_freebsd_arm.go deleted file mode 100644 index d9975374..00000000 --- a/vendor/github.com/creack/pty/ztypes_freebsd_arm.go +++ /dev/null @@ -1,13 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_freebsd.go - -package pty - -const ( - _C_SPECNAMELEN = 0x3f -) - -type fiodgnameArg struct { - Len int32 - Buf *byte -} diff --git a/vendor/github.com/creack/pty/ztypes_freebsd_arm64.go b/vendor/github.com/creack/pty/ztypes_freebsd_arm64.go deleted file mode 100644 index 4418139b..00000000 --- a/vendor/github.com/creack/pty/ztypes_freebsd_arm64.go +++ /dev/null @@ -1,13 +0,0 @@ -// Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs types_freebsd.go - -package pty - -const ( - _C_SPECNAMELEN = 0xff -) - -type fiodgnameArg struct { - Len int32 - Buf *byte -} diff --git a/vendor/github.com/creack/pty/ztypes_mipsx.go b/vendor/github.com/creack/pty/ztypes_mipsx.go deleted file mode 100644 index f0ce7408..00000000 --- a/vendor/github.com/creack/pty/ztypes_mipsx.go +++ /dev/null @@ -1,12 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -// +build linux -// +build mips mipsle mips64 mips64le - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_openbsd_386.go b/vendor/github.com/creack/pty/ztypes_openbsd_386.go deleted file mode 100644 index ccb3aab9..00000000 --- a/vendor/github.com/creack/pty/ztypes_openbsd_386.go +++ /dev/null @@ -1,13 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_openbsd.go - -package pty - -type ptmget struct { - Cfd int32 - Sfd int32 - Cn [16]int8 - Sn [16]int8 -} - -var ioctl_PTMGET = 0x40287401 diff --git a/vendor/github.com/creack/pty/ztypes_openbsd_amd64.go b/vendor/github.com/creack/pty/ztypes_openbsd_amd64.go deleted file mode 100644 index e6705168..00000000 --- a/vendor/github.com/creack/pty/ztypes_openbsd_amd64.go +++ /dev/null @@ -1,13 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types_openbsd.go - -package pty - -type ptmget struct { - Cfd int32 - Sfd int32 - Cn [16]int8 - Sn [16]int8 -} - -var ioctl_PTMGET = 0x40287401 diff --git a/vendor/github.com/creack/pty/ztypes_ppc64.go b/vendor/github.com/creack/pty/ztypes_ppc64.go deleted file mode 100644 index 4e1af843..00000000 --- a/vendor/github.com/creack/pty/ztypes_ppc64.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build ppc64 - -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_ppc64le.go b/vendor/github.com/creack/pty/ztypes_ppc64le.go deleted file mode 100644 index e6780f4e..00000000 --- a/vendor/github.com/creack/pty/ztypes_ppc64le.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build ppc64le - -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_riscvx.go b/vendor/github.com/creack/pty/ztypes_riscvx.go deleted file mode 100644 index 99eec8ec..00000000 --- a/vendor/github.com/creack/pty/ztypes_riscvx.go +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs types.go - -// +build riscv riscv64 - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/creack/pty/ztypes_s390x.go b/vendor/github.com/creack/pty/ztypes_s390x.go deleted file mode 100644 index a7452b61..00000000 --- a/vendor/github.com/creack/pty/ztypes_s390x.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build s390x - -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs types.go - -package pty - -type ( - _C_int int32 - _C_uint uint32 -) diff --git a/vendor/github.com/dgrijalva/jwt-go/.gitignore b/vendor/github.com/dgrijalva/jwt-go/.gitignore deleted file mode 100644 index 80bed650..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -bin - - diff --git a/vendor/github.com/dgrijalva/jwt-go/.travis.yml b/vendor/github.com/dgrijalva/jwt-go/.travis.yml deleted file mode 100644 index 1027f56c..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -script: - - go vet ./... - - go test -v ./... - -go: - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - tip diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/dgrijalva/jwt-go/LICENSE deleted file mode 100644 index df83a9c2..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2012 Dave Grijalva - -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/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md deleted file mode 100644 index 7fc1f793..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md +++ /dev/null @@ -1,97 +0,0 @@ -## Migration Guide from v2 -> v3 - -Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code. - -### `Token.Claims` is now an interface type - -The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`. - -`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property. - -The old example for parsing a token looked like this.. - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is now directly mapped to... - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type. - -```go - type MyCustomClaims struct { - User string - *StandardClaims - } - - if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil { - claims := token.Claims.(*MyCustomClaims) - fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt) - } -``` - -### `ParseFromRequest` has been moved - -To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`. - -`Extractors` do the work of picking the token string out of a request. The interface is simple and composable. - -This simple parsing example: - -```go - if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is directly mapped to: - -```go - if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -There are several concrete `Extractor` types provided for your convenience: - -* `HeaderExtractor` will search a list of headers until one contains content. -* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content. -* `MultiExtractor` will try a list of `Extractors` in order until one returns content. -* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token. -* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument -* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header - - -### RSA signing methods no longer accept `[]byte` keys - -Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse. - -To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types. - -```go - func keyLookupFunc(*Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - } - - // Look up key - key, err := lookupPublicKey(token.Header["kid"]) - if err != nil { - return nil, err - } - - // Unpack key from PEM encoded PKCS8 - return jwt.ParseRSAPublicKeyFromPEM(key) - } -``` diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md deleted file mode 100644 index d358d881..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# jwt-go - -[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go) -[![GoDoc](https://godoc.org/github.com/dgrijalva/jwt-go?status.svg)](https://godoc.org/github.com/dgrijalva/jwt-go) - -A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) - -**NEW VERSION COMING:** There have been a lot of improvements suggested since the version 3.0.0 released in 2016. I'm working now on cutting two different releases: 3.2.0 will contain any non-breaking changes or enhancements. 4.0.0 will follow shortly which will include breaking changes. See the 4.0.0 milestone to get an idea of what's coming. If you have other ideas, or would like to participate in 4.0.0, now's the time. If you depend on this library and don't want to be interrupted, I recommend you use your dependency mangement tool to pin to version 3. - -**SECURITY NOTICE:** Some older versions of Go have a security issue in the cryotp/elliptic. Recommendation is to upgrade to at least 1.8.3. See issue #216 for more detail. - -**SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. - -## What the heck is a JWT? - -JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens. - -In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way. - -The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. - -The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. - -## What's in the box? - -This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. - -## Examples - -See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage: - -* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac) -* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac) -* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples) - -## Extensions - -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. - -Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go - -## Compliance - -This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: - -* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. - -## Project Status & Versioning - -This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason). - -This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases). - -While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v3`. It will do the right thing WRT semantic versioning. - -**BREAKING CHANGES:*** -* Version 3.0.0 includes _a lot_ of changes from the 2.x line, including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. - -## Usage Tips - -### Signing vs Encryption - -A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data: - -* The author of the token was in the possession of the signing secret -* The data has not been modified since it was signed - -It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library. - -### Choosing a Signing Method - -There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric. - -Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation. - -Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification. - -### Signing Methods and Key Types - -Each signing method expects a different object type for its signing keys. See the package documentation for details. Here are the most common ones: - -* The [HMAC signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation -* The [RSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation -* The [ECDSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation - -### JWT and OAuth - -It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication. - -Without going too far down the rabbit hole, here's a description of the interaction of these technologies: - -* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. -* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. -* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. - -## More - -Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). - -The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md deleted file mode 100644 index 63702983..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md +++ /dev/null @@ -1,118 +0,0 @@ -## `jwt-go` Version History - -#### 3.2.0 - -* Added method `ParseUnverified` to allow users to split up the tasks of parsing and validation -* HMAC signing method returns `ErrInvalidKeyType` instead of `ErrInvalidKey` where appropriate -* Added options to `request.ParseFromRequest`, which allows for an arbitrary list of modifiers to parsing behavior. Initial set include `WithClaims` and `WithParser`. Existing usage of this function will continue to work as before. -* Deprecated `ParseFromRequestWithClaims` to simplify API in the future. - -#### 3.1.0 - -* Improvements to `jwt` command line tool -* Added `SkipClaimsValidation` option to `Parser` -* Documentation updates - -#### 3.0.0 - -* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code - * Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods. - * `ParseFromRequest` has been moved to `request` subpackage and usage has changed - * The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims. -* Other Additions and Changes - * Added `Claims` interface type to allow users to decode the claims into a custom type - * Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into. - * Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage - * Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims` - * Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`. - * Added several new, more specific, validation errors to error type bitmask - * Moved examples from README to executable example files - * Signing method registry is now thread safe - * Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser) - -#### 2.7.0 - -This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes. - -* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying -* Error text for expired tokens includes how long it's been expired -* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM` -* Documentation updates - -#### 2.6.0 - -* Exposed inner error within ValidationError -* Fixed validation errors when using UseJSONNumber flag -* Added several unit tests - -#### 2.5.0 - -* Added support for signing method none. You shouldn't use this. The API tries to make this clear. -* Updated/fixed some documentation -* Added more helpful error message when trying to parse tokens that begin with `BEARER ` - -#### 2.4.0 - -* Added new type, Parser, to allow for configuration of various parsing parameters - * You can now specify a list of valid signing methods. Anything outside this set will be rejected. - * You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON -* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go) -* Fixed some bugs with ECDSA parsing - -#### 2.3.0 - -* Added support for ECDSA signing methods -* Added support for RSA PSS signing methods (requires go v1.4) - -#### 2.2.0 - -* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic. - -#### 2.1.0 - -Backwards compatible API change that was missed in 2.0.0. - -* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte` - -#### 2.0.0 - -There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change. - -The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`. - -It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`. - -* **Compatibility Breaking Changes** - * `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct` - * `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct` - * `KeyFunc` now returns `interface{}` instead of `[]byte` - * `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key - * `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key -* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodHS256` - * Added public package global `SigningMethodHS384` - * Added public package global `SigningMethodHS512` -* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodRS256` - * Added public package global `SigningMethodRS384` - * Added public package global `SigningMethodRS512` -* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged. -* Refactored the RSA implementation to be easier to read -* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM` - -#### 1.0.2 - -* Fixed bug in parsing public keys from certificates -* Added more tests around the parsing of keys for RS256 -* Code refactoring in RS256 implementation. No functional changes - -#### 1.0.1 - -* Fixed panic if RS256 signing method was passed an invalid key - -#### 1.0.0 - -* First versioned release -* API stabilized -* Supports creating, signing, parsing, and validating JWT tokens -* Supports RS256 and HS256 signing methods \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/dgrijalva/jwt-go/claims.go deleted file mode 100644 index f0228f02..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/claims.go +++ /dev/null @@ -1,134 +0,0 @@ -package jwt - -import ( - "crypto/subtle" - "fmt" - "time" -) - -// For a type to be a Claims object, it must just have a Valid method that determines -// if the token is invalid for any supported reason -type Claims interface { - Valid() error -} - -// Structured version of Claims Section, as referenced at -// https://tools.ietf.org/html/rfc7519#section-4.1 -// See examples for how to use this with your own claim types -type StandardClaims struct { - Audience string `json:"aud,omitempty"` - ExpiresAt int64 `json:"exp,omitempty"` - Id string `json:"jti,omitempty"` - IssuedAt int64 `json:"iat,omitempty"` - Issuer string `json:"iss,omitempty"` - NotBefore int64 `json:"nbf,omitempty"` - Subject string `json:"sub,omitempty"` -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (c StandardClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - // The claims below are optional, by default, so if they are set to the - // default value in Go, let's not fail the verification for them. - if c.VerifyExpiresAt(now, false) == false { - delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) - vErr.Errors |= ValidationErrorExpired - } - - if c.VerifyIssuedAt(now, false) == false { - vErr.Inner = fmt.Errorf("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if c.VerifyNotBefore(now, false) == false { - vErr.Inner = fmt.Errorf("token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { - return verifyAud(c.Audience, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { - return verifyExp(c.ExpiresAt, cmp, req) -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { - return verifyIat(c.IssuedAt, cmp, req) -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { - return verifyIss(c.Issuer, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { - return verifyNbf(c.NotBefore, cmp, req) -} - -// ----- helpers - -func verifyAud(aud string, cmp string, required bool) bool { - if aud == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyExp(exp int64, now int64, required bool) bool { - if exp == 0 { - return !required - } - return now <= exp -} - -func verifyIat(iat int64, now int64, required bool) bool { - if iat == 0 { - return !required - } - return now >= iat -} - -func verifyIss(iss string, cmp string, required bool) bool { - if iss == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyNbf(nbf int64, now int64, required bool) bool { - if nbf == 0 { - return !required - } - return now >= nbf -} diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/dgrijalva/jwt-go/doc.go deleted file mode 100644 index a86dc1a3..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html -// -// See README.md for more info. -package jwt diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go deleted file mode 100644 index f9773812..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go +++ /dev/null @@ -1,148 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rand" - "errors" - "math/big" -) - -var ( - // Sadly this is missing from crypto/ecdsa compared to crypto/rsa - ErrECDSAVerification = errors.New("crypto/ecdsa: verification error") -) - -// Implements the ECDSA family of signing methods signing methods -// Expects *ecdsa.PrivateKey for signing and *ecdsa.PublicKey for verification -type SigningMethodECDSA struct { - Name string - Hash crypto.Hash - KeySize int - CurveBits int -} - -// Specific instances for EC256 and company -var ( - SigningMethodES256 *SigningMethodECDSA - SigningMethodES384 *SigningMethodECDSA - SigningMethodES512 *SigningMethodECDSA -) - -func init() { - // ES256 - SigningMethodES256 = &SigningMethodECDSA{"ES256", crypto.SHA256, 32, 256} - RegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod { - return SigningMethodES256 - }) - - // ES384 - SigningMethodES384 = &SigningMethodECDSA{"ES384", crypto.SHA384, 48, 384} - RegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod { - return SigningMethodES384 - }) - - // ES512 - SigningMethodES512 = &SigningMethodECDSA{"ES512", crypto.SHA512, 66, 521} - RegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod { - return SigningMethodES512 - }) -} - -func (m *SigningMethodECDSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an ecdsa.PublicKey struct -func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - // Get the key - var ecdsaKey *ecdsa.PublicKey - switch k := key.(type) { - case *ecdsa.PublicKey: - ecdsaKey = k - default: - return ErrInvalidKeyType - } - - if len(sig) != 2*m.KeySize { - return ErrECDSAVerification - } - - r := big.NewInt(0).SetBytes(sig[:m.KeySize]) - s := big.NewInt(0).SetBytes(sig[m.KeySize:]) - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - if verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true { - return nil - } else { - return ErrECDSAVerification - } -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an ecdsa.PrivateKey struct -func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) { - // Get the key - var ecdsaKey *ecdsa.PrivateKey - switch k := key.(type) { - case *ecdsa.PrivateKey: - ecdsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return r, s - if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil { - curveBits := ecdsaKey.Curve.Params().BitSize - - if m.CurveBits != curveBits { - return "", ErrInvalidKey - } - - keyBytes := curveBits / 8 - if curveBits%8 > 0 { - keyBytes += 1 - } - - // We serialize the outpus (r and s) into big-endian byte arrays and pad - // them with zeros on the left to make sure the sizes work out. Both arrays - // must be keyBytes long, and the output must be 2*keyBytes long. - rBytes := r.Bytes() - rBytesPadded := make([]byte, keyBytes) - copy(rBytesPadded[keyBytes-len(rBytes):], rBytes) - - sBytes := s.Bytes() - sBytesPadded := make([]byte, keyBytes) - copy(sBytesPadded[keyBytes-len(sBytes):], sBytes) - - out := append(rBytesPadded, sBytesPadded...) - - return EncodeSegment(out), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go deleted file mode 100644 index d19624b7..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go +++ /dev/null @@ -1,67 +0,0 @@ -package jwt - -import ( - "crypto/ecdsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") - ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") -) - -// Parse PEM encoded Elliptic Curve Private Key Structure -func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { - return nil, err - } - - var pkey *ecdsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { - return nil, ErrNotECPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *ecdsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok { - return nil, ErrNotECPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/dgrijalva/jwt-go/errors.go deleted file mode 100644 index 1c93024a..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/errors.go +++ /dev/null @@ -1,59 +0,0 @@ -package jwt - -import ( - "errors" -) - -// Error constants -var ( - ErrInvalidKey = errors.New("key is invalid") - ErrInvalidKeyType = errors.New("key is of invalid type") - ErrHashUnavailable = errors.New("the requested hash function is unavailable") -) - -// The errors that might occur when parsing and validating a token -const ( - ValidationErrorMalformed uint32 = 1 << iota // Token is malformed - ValidationErrorUnverifiable // Token could not be verified because of signing problems - ValidationErrorSignatureInvalid // Signature validation failed - - // Standard Claim validation errors - ValidationErrorAudience // AUD validation failed - ValidationErrorExpired // EXP validation failed - ValidationErrorIssuedAt // IAT validation failed - ValidationErrorIssuer // ISS validation failed - ValidationErrorNotValidYet // NBF validation failed - ValidationErrorId // JTI validation failed - ValidationErrorClaimsInvalid // Generic claims validation error -) - -// Helper for constructing a ValidationError with a string error message -func NewValidationError(errorText string, errorFlags uint32) *ValidationError { - return &ValidationError{ - text: errorText, - Errors: errorFlags, - } -} - -// The error from Parse if token is not valid -type ValidationError struct { - Inner error // stores the error returned by external dependencies, i.e.: KeyFunc - Errors uint32 // bitfield. see ValidationError... constants - text string // errors that do not have a valid error just have text -} - -// Validation error is an error type -func (e ValidationError) Error() string { - if e.Inner != nil { - return e.Inner.Error() - } else if e.text != "" { - return e.text - } else { - return "token is invalid" - } -} - -// No errors -func (e *ValidationError) valid() bool { - return e.Errors == 0 -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/dgrijalva/jwt-go/hmac.go deleted file mode 100644 index addbe5d4..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac.go +++ /dev/null @@ -1,95 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/hmac" - "errors" -) - -// Implements the HMAC-SHA family of signing methods signing methods -// Expects key type of []byte for both signing and validation -type SigningMethodHMAC struct { - Name string - Hash crypto.Hash -} - -// Specific instances for HS256 and company -var ( - SigningMethodHS256 *SigningMethodHMAC - SigningMethodHS384 *SigningMethodHMAC - SigningMethodHS512 *SigningMethodHMAC - ErrSignatureInvalid = errors.New("signature is invalid") -) - -func init() { - // HS256 - SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { - return SigningMethodHS256 - }) - - // HS384 - SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { - return SigningMethodHS384 - }) - - // HS512 - SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { - return SigningMethodHS512 - }) -} - -func (m *SigningMethodHMAC) Alg() string { - return m.Name -} - -// Verify the signature of HSXXX tokens. Returns nil if the signature is valid. -func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { - // Verify the key is the right type - keyBytes, ok := key.([]byte) - if !ok { - return ErrInvalidKeyType - } - - // Decode signature, for comparison - sig, err := DecodeSegment(signature) - if err != nil { - return err - } - - // Can we use the specified hashing method? - if !m.Hash.Available() { - return ErrHashUnavailable - } - - // This signing method is symmetric, so we validate the signature - // by reproducing the signature from the signing string and key, then - // comparing that against the provided signature. - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - if !hmac.Equal(sig, hasher.Sum(nil)) { - return ErrSignatureInvalid - } - - // No validation errors. Signature is good. - return nil -} - -// Implements the Sign method from SigningMethod for this signing method. -// Key must be []byte -func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { - if keyBytes, ok := key.([]byte); ok { - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - - return EncodeSegment(hasher.Sum(nil)), nil - } - - return "", ErrInvalidKeyType -} diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/dgrijalva/jwt-go/map_claims.go deleted file mode 100644 index 291213c4..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/map_claims.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "encoding/json" - "errors" - // "fmt" -) - -// Claims type that uses the map[string]interface{} for JSON decoding -// This is the default claims type if you don't supply one -type MapClaims map[string]interface{} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyAudience(cmp string, req bool) bool { - aud, _ := m["aud"].(string) - return verifyAud(aud, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { - switch exp := m["exp"].(type) { - case float64: - return verifyExp(int64(exp), cmp, req) - case json.Number: - v, _ := exp.Int64() - return verifyExp(v, cmp, req) - } - return req == false -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { - switch iat := m["iat"].(type) { - case float64: - return verifyIat(int64(iat), cmp, req) - case json.Number: - v, _ := iat.Int64() - return verifyIat(v, cmp, req) - } - return req == false -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { - iss, _ := m["iss"].(string) - return verifyIss(iss, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { - switch nbf := m["nbf"].(type) { - case float64: - return verifyNbf(int64(nbf), cmp, req) - case json.Number: - v, _ := nbf.Int64() - return verifyNbf(v, cmp, req) - } - return req == false -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (m MapClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - if m.VerifyExpiresAt(now, false) == false { - vErr.Inner = errors.New("Token is expired") - vErr.Errors |= ValidationErrorExpired - } - - if m.VerifyIssuedAt(now, false) == false { - vErr.Inner = errors.New("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if m.VerifyNotBefore(now, false) == false { - vErr.Inner = errors.New("Token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/dgrijalva/jwt-go/none.go deleted file mode 100644 index f04d189d..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/none.go +++ /dev/null @@ -1,52 +0,0 @@ -package jwt - -// Implements the none signing method. This is required by the spec -// but you probably should never use it. -var SigningMethodNone *signingMethodNone - -const UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing method allowed" - -var NoneSignatureTypeDisallowedError error - -type signingMethodNone struct{} -type unsafeNoneMagicConstant string - -func init() { - SigningMethodNone = &signingMethodNone{} - NoneSignatureTypeDisallowedError = NewValidationError("'none' signature type is not allowed", ValidationErrorSignatureInvalid) - - RegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod { - return SigningMethodNone - }) -} - -func (m *signingMethodNone) Alg() string { - return "none" -} - -// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) { - // Key must be UnsafeAllowNoneSignatureType to prevent accidentally - // accepting 'none' signing method - if _, ok := key.(unsafeNoneMagicConstant); !ok { - return NoneSignatureTypeDisallowedError - } - // If signing method is none, signature must be an empty string - if signature != "" { - return NewValidationError( - "'none' signing method with non-empty signature", - ValidationErrorSignatureInvalid, - ) - } - - // Accept 'none' signing method. - return nil -} - -// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) { - if _, ok := key.(unsafeNoneMagicConstant); ok { - return "", nil - } - return "", NoneSignatureTypeDisallowedError -} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/dgrijalva/jwt-go/parser.go deleted file mode 100644 index d6901d9a..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/parser.go +++ /dev/null @@ -1,148 +0,0 @@ -package jwt - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -type Parser struct { - ValidMethods []string // If populated, only these methods will be considered valid - UseJSONNumber bool // Use JSON Number format in JSON decoder - SkipClaimsValidation bool // Skip claims validation during token parsing -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) -} - -func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { - return token, err - } - - // Verify signing method is in the required set - if p.ValidMethods != nil { - var signingMethodValid = false - var alg = token.Method.Alg() - for _, m := range p.ValidMethods { - if m == alg { - signingMethodValid = true - break - } - } - if !signingMethodValid { - // signing method is not in the listed set - return token, NewValidationError(fmt.Sprintf("signing method %v is invalid", alg), ValidationErrorSignatureInvalid) - } - } - - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, NewValidationError("no Keyfunc was provided.", ValidationErrorUnverifiable) - } - if key, err = keyFunc(token); err != nil { - // keyFunc returned an error - if ve, ok := err.(*ValidationError); ok { - return token, ve - } - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { - - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { - vErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid} - } else { - vErr = e - } - } - } - - // Perform validation - token.Signature = parts[2] - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { - vErr.Inner = err - vErr.Errors |= ValidationErrorSignatureInvalid - } - - if vErr.valid() { - token.Valid = true - return token, nil - } - - return token, vErr -} - -// WARNING: Don't use this method unless you know what you're doing -// -// This method parses the token but doesn't validate the signature. It's only -// ever useful in cases where you know the signature is valid (because it has -// been checked previously in the stack) and you want to extract values from -// it. -func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { - parts = strings.Split(tokenString, ".") - if len(parts) != 3 { - return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} - - // parse Header - var headerBytes []byte - if headerBytes, err = DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, parts, NewValidationError("tokenstring should not contain 'bearer '", ValidationErrorMalformed) - } - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - if err = json.Unmarshal(headerBytes, &token.Header); err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // parse Claims - var claimBytes []byte - token.Claims = claims - - if claimBytes, err = DecodeSegment(parts[1]); err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.UseJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) - } else { - err = dec.Decode(&claims) - } - // Handle decode error - if err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // Lookup signature method - if method, ok := token.Header["alg"].(string); ok { - if token.Method = GetSigningMethod(method); token.Method == nil { - return token, parts, NewValidationError("signing method (alg) is unavailable.", ValidationErrorUnverifiable) - } - } else { - return token, parts, NewValidationError("signing method (alg) is unspecified.", ValidationErrorUnverifiable) - } - - return token, parts, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/dgrijalva/jwt-go/rsa.go deleted file mode 100644 index e4caf1ca..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa.go +++ /dev/null @@ -1,101 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSA family of signing methods signing methods -// Expects *rsa.PrivateKey for signing and *rsa.PublicKey for validation -type SigningMethodRSA struct { - Name string - Hash crypto.Hash -} - -// Specific instances for RS256 and company -var ( - SigningMethodRS256 *SigningMethodRSA - SigningMethodRS384 *SigningMethodRSA - SigningMethodRS512 *SigningMethodRSA -) - -func init() { - // RS256 - SigningMethodRS256 = &SigningMethodRSA{"RS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod { - return SigningMethodRS256 - }) - - // RS384 - SigningMethodRS384 = &SigningMethodRSA{"RS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod { - return SigningMethodRS384 - }) - - // RS512 - SigningMethodRS512 = &SigningMethodRSA{"RS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod { - return SigningMethodRS512 - }) -} - -func (m *SigningMethodRSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this signing method, must be an *rsa.PublicKey structure. -func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - var ok bool - - if rsaKey, ok = key.(*rsa.PublicKey); !ok { - return ErrInvalidKeyType - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig) -} - -// Implements the Sign method from SigningMethod -// For this signing method, must be an *rsa.PrivateKey structure. -func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - var ok bool - - // Validate type of key - if rsaKey, ok = key.(*rsa.PrivateKey); !ok { - return "", ErrInvalidKey - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go deleted file mode 100644 index 10ee9db8..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build go1.4 - -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSAPSS family of signing methods signing methods -type SigningMethodRSAPSS struct { - *SigningMethodRSA - Options *rsa.PSSOptions -} - -// Specific instances for RS/PS and company -var ( - SigningMethodPS256 *SigningMethodRSAPSS - SigningMethodPS384 *SigningMethodRSAPSS - SigningMethodPS512 *SigningMethodRSAPSS -) - -func init() { - // PS256 - SigningMethodPS256 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS256", - Hash: crypto.SHA256, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA256, - }, - } - RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { - return SigningMethodPS256 - }) - - // PS384 - SigningMethodPS384 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS384", - Hash: crypto.SHA384, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA384, - }, - } - RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { - return SigningMethodPS384 - }) - - // PS512 - SigningMethodPS512 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS512", - Hash: crypto.SHA512, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA512, - }, - } - RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { - return SigningMethodPS512 - }) -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an rsa.PublicKey struct -func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - switch k := key.(type) { - case *rsa.PublicKey: - rsaKey = k - default: - return ErrInvalidKey - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an rsa.PrivateKey struct -func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - - switch k := key.(type) { - case *rsa.PrivateKey: - rsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go deleted file mode 100644 index a5ababf9..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go +++ /dev/null @@ -1,101 +0,0 @@ -package jwt - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") - ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") - ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") -) - -// Parse PEM encoded PKCS1 or PKCS8 private key -func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 private key protected with password -func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - - var blockDecrypted []byte - if blockDecrypted, err = x509.DecryptPEMBlock(block, []byte(password)); err != nil { - return nil, err - } - - if parsedKey, err = x509.ParsePKCS1PrivateKey(blockDecrypted); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(blockDecrypted); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *rsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { - return nil, ErrNotRSAPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/dgrijalva/jwt-go/signing_method.go deleted file mode 100644 index ed1f212b..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/signing_method.go +++ /dev/null @@ -1,35 +0,0 @@ -package jwt - -import ( - "sync" -) - -var signingMethods = map[string]func() SigningMethod{} -var signingMethodLock = new(sync.RWMutex) - -// Implement SigningMethod to add new methods for signing or verifying tokens. -type SigningMethod interface { - Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid - Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error - Alg() string // returns the alg identifier for this method (example: 'HS256') -} - -// Register the "alg" name and a factory function for signing method. -// This is typically done during init() in the method's implementation -func RegisterSigningMethod(alg string, f func() SigningMethod) { - signingMethodLock.Lock() - defer signingMethodLock.Unlock() - - signingMethods[alg] = f -} - -// Get a signing method from an "alg" string -func GetSigningMethod(alg string) (method SigningMethod) { - signingMethodLock.RLock() - defer signingMethodLock.RUnlock() - - if methodF, ok := signingMethods[alg]; ok { - method = methodF() - } - return -} diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/dgrijalva/jwt-go/token.go deleted file mode 100644 index d637e086..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/token.go +++ /dev/null @@ -1,108 +0,0 @@ -package jwt - -import ( - "encoding/base64" - "encoding/json" - "strings" - "time" -) - -// TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). -// You can override it to use another time value. This is useful for testing or if your -// server uses a different time zone than your tokens. -var TimeFunc = time.Now - -// Parse methods use this callback function to supply -// the key for verification. The function receives the parsed, -// but unverified Token. This allows you to use properties in the -// Header of the token (such as `kid`) to identify which key to use. -type Keyfunc func(*Token) (interface{}, error) - -// A JWT Token. Different fields will be used depending on whether you're -// creating or parsing/verifying a token. -type Token struct { - Raw string // The raw token. Populated when you Parse a token - Method SigningMethod // The signing method used or to be used - Header map[string]interface{} // The first segment of the token - Claims Claims // The second segment of the token - Signature string // The third segment of the token. Populated when you Parse a token - Valid bool // Is the token valid? Populated when you Parse/Verify a token -} - -// Create a new Token. Takes a signing method -func New(method SigningMethod) *Token { - return NewWithClaims(method, MapClaims{}) -} - -func NewWithClaims(method SigningMethod, claims Claims) *Token { - return &Token{ - Header: map[string]interface{}{ - "typ": "JWT", - "alg": method.Alg(), - }, - Claims: claims, - Method: method, - } -} - -// Get the complete, signed token -func (t *Token) SignedString(key interface{}) (string, error) { - var sig, sstr string - var err error - if sstr, err = t.SigningString(); err != nil { - return "", err - } - if sig, err = t.Method.Sign(sstr, key); err != nil { - return "", err - } - return strings.Join([]string{sstr, sig}, "."), nil -} - -// Generate the signing string. This is the -// most expensive part of the whole deal. Unless you -// need this for something special, just go straight for -// the SignedString. -func (t *Token) SigningString() (string, error) { - var err error - parts := make([]string, 2) - for i, _ := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } - - parts[i] = EncodeSegment(jsonValue) - } - return strings.Join(parts, "."), nil -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return new(Parser).Parse(tokenString, keyFunc) -} - -func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) -} - -// Encode JWT specific base64url encoding with padding stripped -func EncodeSegment(seg []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=") -} - -// Decode JWT specific base64url encoding with padding stripped -func DecodeSegment(seg string) ([]byte, error) { - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } - - return base64.URLEncoding.DecodeString(seg) -} diff --git a/vendor/github.com/docker/distribution/LICENSE b/vendor/github.com/docker/distribution/LICENSE deleted file mode 100644 index e06d2081..00000000 --- a/vendor/github.com/docker/distribution/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/vendor/github.com/docker/distribution/digestset/set.go b/vendor/github.com/docker/distribution/digestset/set.go deleted file mode 100644 index 71327dca..00000000 --- a/vendor/github.com/docker/distribution/digestset/set.go +++ /dev/null @@ -1,247 +0,0 @@ -package digestset - -import ( - "errors" - "sort" - "strings" - "sync" - - digest "github.com/opencontainers/go-digest" -) - -var ( - // ErrDigestNotFound is used when a matching digest - // could not be found in a set. - ErrDigestNotFound = errors.New("digest not found") - - // ErrDigestAmbiguous is used when multiple digests - // are found in a set. None of the matching digests - // should be considered valid matches. - ErrDigestAmbiguous = errors.New("ambiguous digest string") -) - -// Set is used to hold a unique set of digests which -// may be easily referenced by easily referenced by a string -// representation of the digest as well as short representation. -// The uniqueness of the short representation is based on other -// digests in the set. If digests are omitted from this set, -// collisions in a larger set may not be detected, therefore it -// is important to always do short representation lookups on -// the complete set of digests. To mitigate collisions, an -// appropriately long short code should be used. -type Set struct { - mutex sync.RWMutex - entries digestEntries -} - -// NewSet creates an empty set of digests -// which may have digests added. -func NewSet() *Set { - return &Set{ - entries: digestEntries{}, - } -} - -// checkShortMatch checks whether two digests match as either whole -// values or short values. This function does not test equality, -// rather whether the second value could match against the first -// value. -func checkShortMatch(alg digest.Algorithm, hex, shortAlg, shortHex string) bool { - if len(hex) == len(shortHex) { - if hex != shortHex { - return false - } - if len(shortAlg) > 0 && string(alg) != shortAlg { - return false - } - } else if !strings.HasPrefix(hex, shortHex) { - return false - } else if len(shortAlg) > 0 && string(alg) != shortAlg { - return false - } - return true -} - -// Lookup looks for a digest matching the given string representation. -// If no digests could be found ErrDigestNotFound will be returned -// with an empty digest value. If multiple matches are found -// ErrDigestAmbiguous will be returned with an empty digest value. -func (dst *Set) Lookup(d string) (digest.Digest, error) { - dst.mutex.RLock() - defer dst.mutex.RUnlock() - if len(dst.entries) == 0 { - return "", ErrDigestNotFound - } - var ( - searchFunc func(int) bool - alg digest.Algorithm - hex string - ) - dgst, err := digest.Parse(d) - if err == digest.ErrDigestInvalidFormat { - hex = d - searchFunc = func(i int) bool { - return dst.entries[i].val >= d - } - } else { - hex = dgst.Hex() - alg = dgst.Algorithm() - searchFunc = func(i int) bool { - if dst.entries[i].val == hex { - return dst.entries[i].alg >= alg - } - return dst.entries[i].val >= hex - } - } - idx := sort.Search(len(dst.entries), searchFunc) - if idx == len(dst.entries) || !checkShortMatch(dst.entries[idx].alg, dst.entries[idx].val, string(alg), hex) { - return "", ErrDigestNotFound - } - if dst.entries[idx].alg == alg && dst.entries[idx].val == hex { - return dst.entries[idx].digest, nil - } - if idx+1 < len(dst.entries) && checkShortMatch(dst.entries[idx+1].alg, dst.entries[idx+1].val, string(alg), hex) { - return "", ErrDigestAmbiguous - } - - return dst.entries[idx].digest, nil -} - -// Add adds the given digest to the set. An error will be returned -// if the given digest is invalid. If the digest already exists in the -// set, this operation will be a no-op. -func (dst *Set) Add(d digest.Digest) error { - if err := d.Validate(); err != nil { - return err - } - dst.mutex.Lock() - defer dst.mutex.Unlock() - entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} - searchFunc := func(i int) bool { - if dst.entries[i].val == entry.val { - return dst.entries[i].alg >= entry.alg - } - return dst.entries[i].val >= entry.val - } - idx := sort.Search(len(dst.entries), searchFunc) - if idx == len(dst.entries) { - dst.entries = append(dst.entries, entry) - return nil - } else if dst.entries[idx].digest == d { - return nil - } - - entries := append(dst.entries, nil) - copy(entries[idx+1:], entries[idx:len(entries)-1]) - entries[idx] = entry - dst.entries = entries - return nil -} - -// Remove removes the given digest from the set. An err will be -// returned if the given digest is invalid. If the digest does -// not exist in the set, this operation will be a no-op. -func (dst *Set) Remove(d digest.Digest) error { - if err := d.Validate(); err != nil { - return err - } - dst.mutex.Lock() - defer dst.mutex.Unlock() - entry := &digestEntry{alg: d.Algorithm(), val: d.Hex(), digest: d} - searchFunc := func(i int) bool { - if dst.entries[i].val == entry.val { - return dst.entries[i].alg >= entry.alg - } - return dst.entries[i].val >= entry.val - } - idx := sort.Search(len(dst.entries), searchFunc) - // Not found if idx is after or value at idx is not digest - if idx == len(dst.entries) || dst.entries[idx].digest != d { - return nil - } - - entries := dst.entries - copy(entries[idx:], entries[idx+1:]) - entries = entries[:len(entries)-1] - dst.entries = entries - - return nil -} - -// All returns all the digests in the set -func (dst *Set) All() []digest.Digest { - dst.mutex.RLock() - defer dst.mutex.RUnlock() - retValues := make([]digest.Digest, len(dst.entries)) - for i := range dst.entries { - retValues[i] = dst.entries[i].digest - } - - return retValues -} - -// ShortCodeTable returns a map of Digest to unique short codes. The -// length represents the minimum value, the maximum length may be the -// entire value of digest if uniqueness cannot be achieved without the -// full value. This function will attempt to make short codes as short -// as possible to be unique. -func ShortCodeTable(dst *Set, length int) map[digest.Digest]string { - dst.mutex.RLock() - defer dst.mutex.RUnlock() - m := make(map[digest.Digest]string, len(dst.entries)) - l := length - resetIdx := 0 - for i := 0; i < len(dst.entries); i++ { - var short string - extended := true - for extended { - extended = false - if len(dst.entries[i].val) <= l { - short = dst.entries[i].digest.String() - } else { - short = dst.entries[i].val[:l] - for j := i + 1; j < len(dst.entries); j++ { - if checkShortMatch(dst.entries[j].alg, dst.entries[j].val, "", short) { - if j > resetIdx { - resetIdx = j - } - extended = true - } else { - break - } - } - if extended { - l++ - } - } - } - m[dst.entries[i].digest] = short - if i >= resetIdx { - l = length - } - } - return m -} - -type digestEntry struct { - alg digest.Algorithm - val string - digest digest.Digest -} - -type digestEntries []*digestEntry - -func (d digestEntries) Len() int { - return len(d) -} - -func (d digestEntries) Less(i, j int) bool { - if d[i].val != d[j].val { - return d[i].val < d[j].val - } - return d[i].alg < d[j].alg -} - -func (d digestEntries) Swap(i, j int) { - d[i], d[j] = d[j], d[i] -} diff --git a/vendor/github.com/docker/distribution/reference/helpers.go b/vendor/github.com/docker/distribution/reference/helpers.go deleted file mode 100644 index 978df7ea..00000000 --- a/vendor/github.com/docker/distribution/reference/helpers.go +++ /dev/null @@ -1,42 +0,0 @@ -package reference - -import "path" - -// IsNameOnly returns true if reference only contains a repo name. -func IsNameOnly(ref Named) bool { - if _, ok := ref.(NamedTagged); ok { - return false - } - if _, ok := ref.(Canonical); ok { - return false - } - return true -} - -// FamiliarName returns the familiar name string -// for the given named, familiarizing if needed. -func FamiliarName(ref Named) string { - if nn, ok := ref.(normalizedNamed); ok { - return nn.Familiar().Name() - } - return ref.Name() -} - -// FamiliarString returns the familiar string representation -// for the given reference, familiarizing if needed. -func FamiliarString(ref Reference) string { - if nn, ok := ref.(normalizedNamed); ok { - return nn.Familiar().String() - } - return ref.String() -} - -// FamiliarMatch reports whether ref matches the specified pattern. -// See https://godoc.org/path#Match for supported patterns. -func FamiliarMatch(pattern string, ref Reference) (bool, error) { - matched, err := path.Match(pattern, FamiliarString(ref)) - if namedRef, isNamed := ref.(Named); isNamed && !matched { - matched, _ = path.Match(pattern, FamiliarName(namedRef)) - } - return matched, err -} diff --git a/vendor/github.com/docker/distribution/reference/normalize.go b/vendor/github.com/docker/distribution/reference/normalize.go deleted file mode 100644 index 2d71fc5e..00000000 --- a/vendor/github.com/docker/distribution/reference/normalize.go +++ /dev/null @@ -1,170 +0,0 @@ -package reference - -import ( - "errors" - "fmt" - "strings" - - "github.com/docker/distribution/digestset" - "github.com/opencontainers/go-digest" -) - -var ( - legacyDefaultDomain = "index.docker.io" - defaultDomain = "docker.io" - officialRepoName = "library" - defaultTag = "latest" -) - -// normalizedNamed represents a name which has been -// normalized and has a familiar form. A familiar name -// is what is used in Docker UI. An example normalized -// name is "docker.io/library/ubuntu" and corresponding -// familiar name of "ubuntu". -type normalizedNamed interface { - Named - Familiar() Named -} - -// 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. -func ParseNormalizedNamed(s string) (Named, error) { - if ok := anchoredIdentifierRegexp.MatchString(s); ok { - return nil, fmt.Errorf("invalid repository name (%s), cannot specify 64-byte hexadecimal strings", s) - } - domain, remainder := splitDockerDomain(s) - var remoteName string - if tagSep := strings.IndexRune(remainder, ':'); tagSep > -1 { - remoteName = remainder[:tagSep] - } else { - remoteName = remainder - } - if strings.ToLower(remoteName) != remoteName { - return nil, errors.New("invalid reference format: repository name must be lowercase") - } - - ref, err := Parse(domain + "/" + remainder) - if err != nil { - return nil, err - } - named, isNamed := ref.(Named) - if !isNamed { - return nil, fmt.Errorf("reference %s has no name", ref.String()) - } - return named, nil -} - -// splitDockerDomain splits a repository name to domain and remotename string. -// If no valid domain is found, the default domain is used. Repository name -// needs to be already validated before. -func splitDockerDomain(name string) (domain, remainder string) { - i := strings.IndexRune(name, '/') - if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") { - domain, remainder = defaultDomain, name - } else { - domain, remainder = name[:i], name[i+1:] - } - if domain == legacyDefaultDomain { - domain = defaultDomain - } - if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { - remainder = officialRepoName + "/" + remainder - } - return -} - -// familiarizeName returns a shortened version of the name familiar -// to to the Docker UI. Familiar names have the default domain -// "docker.io" and "library/" repository prefix removed. -// For example, "docker.io/library/redis" will have the familiar -// name "redis" and "docker.io/dmcgowan/myapp" will be "dmcgowan/myapp". -// Returns a familiarized named only reference. -func familiarizeName(named namedRepository) repository { - repo := repository{ - domain: named.Domain(), - path: named.Path(), - } - - if repo.domain == defaultDomain { - repo.domain = "" - // Handle official repositories which have the pattern "library/" - if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName { - repo.path = split[1] - } - } - return repo -} - -func (r reference) Familiar() Named { - return reference{ - namedRepository: familiarizeName(r.namedRepository), - tag: r.tag, - digest: r.digest, - } -} - -func (r repository) Familiar() Named { - return familiarizeName(r) -} - -func (t taggedReference) Familiar() Named { - return taggedReference{ - namedRepository: familiarizeName(t.namedRepository), - tag: t.tag, - } -} - -func (c canonicalReference) Familiar() Named { - return canonicalReference{ - namedRepository: familiarizeName(c.namedRepository), - digest: c.digest, - } -} - -// TagNameOnly adds the default tag "latest" to a reference if it only has -// a repo name. -func TagNameOnly(ref Named) Named { - if IsNameOnly(ref) { - namedTagged, err := WithTag(ref, defaultTag) - if err != nil { - // Default tag must be valid, to create a NamedTagged - // type with non-validated input the WithTag function - // should be used instead - panic(err) - } - return namedTagged - } - return ref -} - -// ParseAnyReference parses a reference string as a possible identifier, -// full digest, or familiar name. -func ParseAnyReference(ref string) (Reference, error) { - if ok := anchoredIdentifierRegexp.MatchString(ref); ok { - return digestReference("sha256:" + ref), nil - } - if dgst, err := digest.Parse(ref); err == nil { - return digestReference(dgst), nil - } - - return ParseNormalizedNamed(ref) -} - -// ParseAnyReferenceWithSet parses a reference string as a possible short -// identifier to be matched in a digest set, a full digest, or familiar name. -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 ParseNormalizedNamed(ref) -} diff --git a/vendor/github.com/docker/distribution/reference/reference.go b/vendor/github.com/docker/distribution/reference/reference.go deleted file mode 100644 index 2f66cca8..00000000 --- a/vendor/github.com/docker/distribution/reference/reference.go +++ /dev/null @@ -1,433 +0,0 @@ -// Package reference provides a general type to represent any way of referencing images within the registry. -// Its main purpose is to abstract tags and digests (content-addressable hash). -// -// Grammar -// -// reference := name [ ":" tag ] [ "@" digest ] -// name := [domain '/'] path-component ['/' path-component]* -// domain := domain-component ['.' domain-component]* [':' port-number] -// domain-component := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ -// port-number := /[0-9]+/ -// path-component := alpha-numeric [separator alpha-numeric]* -// alpha-numeric := /[a-z0-9]+/ -// separator := /[_.]|__|[-]*/ -// -// tag := /[\w][\w.-]{0,127}/ -// -// digest := digest-algorithm ":" digest-hex -// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]* -// digest-algorithm-separator := /[+.-_]/ -// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/ -// digest-hex := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value -// -// identifier := /[a-f0-9]{64}/ -// short-identifier := /[a-f0-9]{6,64}/ -package reference - -import ( - "errors" - "fmt" - "strings" - - "github.com/opencontainers/go-digest" -) - -const ( - // NameTotalLengthMax is the maximum total number of characters in a repository name. - NameTotalLengthMax = 255 -) - -var ( - // ErrReferenceInvalidFormat represents an error while trying to parse a string as a reference. - ErrReferenceInvalidFormat = errors.New("invalid reference format") - - // ErrTagInvalidFormat represents an error while trying to parse a string as a tag. - ErrTagInvalidFormat = errors.New("invalid tag format") - - // ErrDigestInvalidFormat represents an error while trying to parse a string as a tag. - ErrDigestInvalidFormat = errors.New("invalid digest format") - - // ErrNameContainsUppercase is returned for invalid repository names that contain uppercase characters. - ErrNameContainsUppercase = errors.New("repository name must be lowercase") - - // ErrNameEmpty is returned for empty, invalid repository names. - ErrNameEmpty = errors.New("repository name must have at least one component") - - // ErrNameTooLong is returned when a repository name is longer than NameTotalLengthMax. - ErrNameTooLong = fmt.Errorf("repository name must not be more than %v characters", NameTotalLengthMax) - - // ErrNameNotCanonical is returned when a name is not canonical. - ErrNameNotCanonical = errors.New("repository name must be canonical") -) - -// Reference is an opaque object reference identifier that may include -// modifiers such as a hostname, name, tag, and digest. -type Reference interface { - // String returns the full reference - String() string -} - -// Field provides a wrapper type for resolving correct reference types when -// working with encoding. -type Field struct { - reference Reference -} - -// AsField wraps a reference in a Field for encoding. -func AsField(reference Reference) Field { - return Field{reference} -} - -// Reference unwraps the reference type from the field to -// return the Reference object. This object should be -// of the appropriate type to further check for different -// reference types. -func (f Field) Reference() Reference { - return f.reference -} - -// MarshalText serializes the field to byte text which -// is the string of the reference. -func (f Field) MarshalText() (p []byte, err error) { - return []byte(f.reference.String()), nil -} - -// UnmarshalText parses text bytes by invoking the -// reference parser to ensure the appropriately -// typed reference object is wrapped by field. -func (f *Field) UnmarshalText(p []byte) error { - r, err := Parse(string(p)) - if err != nil { - return err - } - - f.reference = r - return nil -} - -// Named is an object with a full name -type Named interface { - Reference - Name() string -} - -// Tagged is an object which has a tag -type Tagged interface { - Reference - Tag() string -} - -// NamedTagged is an object including a name and tag. -type NamedTagged interface { - Named - Tag() string -} - -// Digested is an object which has a digest -// in which it can be referenced by -type Digested interface { - Reference - Digest() digest.Digest -} - -// Canonical reference is an object with a fully unique -// name including a name with domain and digest -type Canonical interface { - Named - Digest() digest.Digest -} - -// namedRepository is a reference to a repository with a name. -// A namedRepository has both domain and path components. -type namedRepository interface { - Named - Domain() string - Path() string -} - -// Domain returns the domain part of the Named reference -func Domain(named Named) string { - if r, ok := named.(namedRepository); ok { - return r.Domain() - } - domain, _ := splitDomain(named.Name()) - return domain -} - -// Path returns the name without the domain part of the Named reference -func Path(named Named) (name string) { - if r, ok := named.(namedRepository); ok { - return r.Path() - } - _, path := splitDomain(named.Name()) - return path -} - -func splitDomain(name string) (string, string) { - match := anchoredNameRegexp.FindStringSubmatch(name) - if len(match) != 3 { - return "", name - } - return match[1], match[2] -} - -// 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 Domain or Path -func SplitHostname(named Named) (string, string) { - if r, ok := named.(namedRepository); ok { - return r.Domain(), r.Path() - } - return splitDomain(named.Name()) -} - -// Parse parses s and returns a syntactically valid Reference. -// If an error was encountered it is returned, along with a nil Reference. -// NOTE: Parse will not handle short digests. -func Parse(s string) (Reference, error) { - matches := ReferenceRegexp.FindStringSubmatch(s) - if matches == nil { - if s == "" { - return nil, ErrNameEmpty - } - if ReferenceRegexp.FindStringSubmatch(strings.ToLower(s)) != nil { - return nil, ErrNameContainsUppercase - } - return nil, ErrReferenceInvalidFormat - } - - if len(matches[1]) > NameTotalLengthMax { - return nil, ErrNameTooLong - } - - var repo repository - - nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1]) - if nameMatch != nil && len(nameMatch) == 3 { - repo.domain = nameMatch[1] - repo.path = nameMatch[2] - } else { - repo.domain = "" - repo.path = matches[1] - } - - ref := reference{ - namedRepository: repo, - tag: matches[2], - } - if matches[3] != "" { - var err error - ref.digest, err = digest.Parse(matches[3]) - if err != nil { - return nil, err - } - } - - r := getBestReferenceType(ref) - if r == nil { - return nil, ErrNameEmpty - } - - return r, nil -} - -// 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. -// NOTE: ParseNamed will not handle short digests. -func ParseNamed(s string) (Named, error) { - named, err := ParseNormalizedNamed(s) - if err != nil { - return nil, err - } - if named.String() != s { - return nil, ErrNameNotCanonical - } - return named, nil -} - -// WithName returns a named object representing the given string. If the input -// is invalid ErrReferenceInvalidFormat will be returned. -func WithName(name string) (Named, error) { - if len(name) > NameTotalLengthMax { - return nil, ErrNameTooLong - } - - match := anchoredNameRegexp.FindStringSubmatch(name) - if match == nil || len(match) != 3 { - return nil, ErrReferenceInvalidFormat - } - return repository{ - domain: match[1], - path: match[2], - }, nil -} - -// WithTag combines the name from "name" and the tag from "tag" to form a -// reference incorporating both the name and the tag. -func WithTag(name Named, tag string) (NamedTagged, error) { - if !anchoredTagRegexp.MatchString(tag) { - return nil, ErrTagInvalidFormat - } - var repo repository - if r, ok := name.(namedRepository); ok { - repo.domain = r.Domain() - repo.path = r.Path() - } else { - repo.path = name.Name() - } - if canonical, ok := name.(Canonical); ok { - return reference{ - namedRepository: repo, - tag: tag, - digest: canonical.Digest(), - }, nil - } - return taggedReference{ - namedRepository: repo, - tag: tag, - }, nil -} - -// WithDigest combines the name from "name" and the digest from "digest" to form -// a reference incorporating both the name and the digest. -func WithDigest(name Named, digest digest.Digest) (Canonical, error) { - if !anchoredDigestRegexp.MatchString(digest.String()) { - return nil, ErrDigestInvalidFormat - } - var repo repository - if r, ok := name.(namedRepository); ok { - repo.domain = r.Domain() - repo.path = r.Path() - } else { - repo.path = name.Name() - } - if tagged, ok := name.(Tagged); ok { - return reference{ - namedRepository: repo, - tag: tagged.Tag(), - digest: digest, - }, nil - } - return canonicalReference{ - namedRepository: repo, - digest: digest, - }, nil -} - -// TrimNamed removes any tag or digest from the named reference. -func TrimNamed(ref Named) Named { - domain, path := SplitHostname(ref) - return repository{ - domain: domain, - path: path, - } -} - -func getBestReferenceType(ref reference) Reference { - if ref.Name() == "" { - // Allow digest only references - if ref.digest != "" { - return digestReference(ref.digest) - } - return nil - } - if ref.tag == "" { - if ref.digest != "" { - return canonicalReference{ - namedRepository: ref.namedRepository, - digest: ref.digest, - } - } - return ref.namedRepository - } - if ref.digest == "" { - return taggedReference{ - namedRepository: ref.namedRepository, - tag: ref.tag, - } - } - - return ref -} - -type reference struct { - namedRepository - tag string - digest digest.Digest -} - -func (r reference) String() string { - return r.Name() + ":" + r.tag + "@" + r.digest.String() -} - -func (r reference) Tag() string { - return r.tag -} - -func (r reference) Digest() digest.Digest { - return r.digest -} - -type repository struct { - domain string - path string -} - -func (r repository) String() string { - return r.Name() -} - -func (r repository) Name() string { - if r.domain == "" { - return r.path - } - return r.domain + "/" + r.path -} - -func (r repository) Domain() string { - return r.domain -} - -func (r repository) Path() string { - return r.path -} - -type digestReference digest.Digest - -func (d digestReference) String() string { - return digest.Digest(d).String() -} - -func (d digestReference) Digest() digest.Digest { - return digest.Digest(d) -} - -type taggedReference struct { - namedRepository - tag string -} - -func (t taggedReference) String() string { - return t.Name() + ":" + t.tag -} - -func (t taggedReference) Tag() string { - return t.tag -} - -type canonicalReference struct { - namedRepository - digest digest.Digest -} - -func (c canonicalReference) String() string { - return c.Name() + "@" + c.digest.String() -} - -func (c canonicalReference) Digest() digest.Digest { - return c.digest -} diff --git a/vendor/github.com/docker/distribution/reference/regexp.go b/vendor/github.com/docker/distribution/reference/regexp.go deleted file mode 100644 index 78603493..00000000 --- a/vendor/github.com/docker/distribution/reference/regexp.go +++ /dev/null @@ -1,143 +0,0 @@ -package reference - -import "regexp" - -var ( - // alphaNumericRegexp defines the alpha numeric atom, typically a - // component of names. This only allows lower case characters and digits. - alphaNumericRegexp = match(`[a-z0-9]+`) - - // separatorRegexp defines the separators allowed to be embedded in name - // components. This allow one period, one or two underscore and multiple - // dashes. - separatorRegexp = match(`(?:[._]|__|[-]*)`) - - // nameComponentRegexp restricts registry path component names to start - // with at least one letter or number, with following parts able to be - // separated by one period, one or two underscore and multiple dashes. - nameComponentRegexp = expression( - alphaNumericRegexp, - optional(repeated(separatorRegexp, alphaNumericRegexp))) - - // domainComponentRegexp restricts the registry domain component of a - // repository name to start with a component as defined by DomainRegexp - // and followed by an optional port. - domainComponentRegexp = match(`(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`) - - // DomainRegexp 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. - DomainRegexp = expression( - domainComponentRegexp, - optional(repeated(literal(`.`), domainComponentRegexp)), - optional(literal(`:`), match(`[0-9]+`))) - - // TagRegexp matches valid tag names. From docker/docker:graph/tags.go. - TagRegexp = match(`[\w][\w.-]{0,127}`) - - // anchoredTagRegexp matches valid tag names, anchored at the start and - // end of the matched string. - anchoredTagRegexp = anchored(TagRegexp) - - // DigestRegexp matches valid digests. - DigestRegexp = match(`[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}`) - - // anchoredDigestRegexp matches valid digests, anchored at the start and - // end of the matched string. - anchoredDigestRegexp = anchored(DigestRegexp) - - // NameRegexp is the format for the name component of references. The - // regexp has capturing groups for the domain and name part omitting - // the separating forward slash from either. - NameRegexp = expression( - optional(DomainRegexp, literal(`/`)), - nameComponentRegexp, - optional(repeated(literal(`/`), nameComponentRegexp))) - - // anchoredNameRegexp is used to parse a name value, capturing the - // domain and trailing components. - anchoredNameRegexp = anchored( - optional(capture(DomainRegexp), literal(`/`)), - capture(nameComponentRegexp, - optional(repeated(literal(`/`), nameComponentRegexp)))) - - // ReferenceRegexp is the full supported format of a reference. The regexp - // is anchored and has capturing groups for name, tag, and digest - // components. - ReferenceRegexp = anchored(capture(NameRegexp), - optional(literal(":"), capture(TagRegexp)), - optional(literal("@"), capture(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. - IdentifierRegexp = match(`([a-f0-9]{64})`) - - // 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. - ShortIdentifierRegexp = match(`([a-f0-9]{6,64})`) - - // anchoredIdentifierRegexp is used to check or match an - // identifier value, anchored at start and end of string. - anchoredIdentifierRegexp = anchored(IdentifierRegexp) - - // anchoredShortIdentifierRegexp is used to check if a value - // is a possible identifier prefix, anchored at start and end - // of string. - anchoredShortIdentifierRegexp = anchored(ShortIdentifierRegexp) -) - -// match compiles the string to a regular expression. -var match = regexp.MustCompile - -// literal compiles s into a literal regular expression, escaping any regexp -// reserved characters. -func literal(s string) *regexp.Regexp { - re := match(regexp.QuoteMeta(s)) - - if _, complete := re.LiteralPrefix(); !complete { - panic("must be a literal") - } - - return re -} - -// expression defines a full expression, where each regular expression must -// follow the previous. -func expression(res ...*regexp.Regexp) *regexp.Regexp { - var s string - for _, re := range res { - s += re.String() - } - - return match(s) -} - -// optional wraps the expression in a non-capturing group and makes the -// production optional. -func optional(res ...*regexp.Regexp) *regexp.Regexp { - return match(group(expression(res...)).String() + `?`) -} - -// repeated wraps the regexp in a non-capturing group to get one or more -// matches. -func repeated(res ...*regexp.Regexp) *regexp.Regexp { - return match(group(expression(res...)).String() + `+`) -} - -// group wraps the regexp in a non-capturing group. -func group(res ...*regexp.Regexp) *regexp.Regexp { - return match(`(?:` + expression(res...).String() + `)`) -} - -// capture wraps the expression in a capturing group. -func capture(res ...*regexp.Regexp) *regexp.Regexp { - return match(`(` + expression(res...).String() + `)`) -} - -// anchored anchors the regular expression by adding start and end delimiters. -func anchored(res ...*regexp.Regexp) *regexp.Regexp { - return match(`^` + expression(res...).String() + `$`) -} diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS deleted file mode 100644 index 246e2a33..00000000 --- a/vendor/github.com/docker/docker/AUTHORS +++ /dev/null @@ -1,1652 +0,0 @@ -# This file lists all individuals having contributed content to the repository. -# For how it is generated, see `hack/generate-authors.sh`. - -Aanand Prasad -Aaron Davidson -Aaron Feng -Aaron Huslage -Aaron Lehmann -Aaron Welch -Abel Muiño -Abhijeet Kasurde -Abhinav Ajgaonkar -Abhishek Chanda -Abin Shahab -Adam Avilla -Adam Kunk -Adam Miller -Adam Mills -Adam Singer -Adam Walz -Aditi Rajagopal -Aditya -Adolfo Ochagavía -Adria Casas -Adrian Moisey -Adrian Mouat -Adrian Oprea -Adrien Folie -Adrien Gallouët -Ahmed Kamal -Ahmet Alp Balkan -Aidan Feldman -Aidan Hobson Sayers -AJ Bowen -Ajey Charantimath -ajneu -Akihiro Suda -Al Tobey -alambike -Alan Scherger -Alan Thompson -Albert Callarisa -Albert Zhang -Aleksa Sarai -Aleksandrs Fadins -Alena Prokharchyk -Alessandro Boch -Alessio Biancalana -Alex Chan -Alex Coventry -Alex Crawford -Alex Ellis -Alex Gaynor -Alex Olshansky -Alex Samorukov -Alex Warhawk -Alexander Artemenko -Alexander Boyd -Alexander Larsson -Alexander Morozov -Alexander Shopov -Alexandre Beslic -Alexandre González -Alexandru Sfirlogea -Alexey Guskov -Alexey Kotlyarov -Alexey Shamrin -Alexis THOMAS -Ali Dehghani -Allen Madsen -Allen Sun -almoehi -Alvaro Saurin -Alvin Richards -amangoel -Amen Belayneh -Amit Bakshi -Amit Krishnan -Amit Shukla -Amy Lindburg -Anand Patil -AnandkumarPatel -Anatoly Borodin -Anchal Agrawal -Anders Janmyr -Andre Dublin <81dublin@gmail.com> -Andre Granovsky -Andrea Luzzardi -Andrea Turli -Andreas Köhler -Andreas Savvides -Andreas Tiefenthaler -Andrei Gherzan -Andrew C. Bodine -Andrew Clay Shafer -Andrew Duckworth -Andrew France -Andrew Gerrand -Andrew Guenther -Andrew Kuklewicz -Andrew Macgregor -Andrew Macpherson -Andrew Martin -Andrew Munsell -Andrew Po -Andrew Weiss -Andrew Williams -Andrews Medina -Andrey Petrov -Andrey Stolbovsky -André Martins -andy -Andy Chambers -andy diller -Andy Goldstein -Andy Kipp -Andy Rothfusz -Andy Smith -Andy Wilson -Anes Hasicic -Anil Belur -Anil Madhavapeddy -Ankush Agarwal -Anonmily -Anthon van der Neut -Anthony Baire -Anthony Bishopric -Anthony Dahanne -Anton Löfgren -Anton Nikitin -Anton Polonskiy -Anton Tiurin -Antonio Murdaca -Antonis Kalipetis -Antony Messerli -Anuj Bahuguna -Anusha Ragunathan -apocas -ArikaChen -Arnaud Lefebvre -Arnaud Porterie -Arthur Barr -Arthur Gautier -Artur Meyster -Arun Gupta -Asbjørn Enge -averagehuman -Avi Das -Avi Miller -Avi Vaid -ayoshitake -Azat Khuyiyakhmetov -Bardia Keyoumarsi -Barnaby Gray -Barry Allard -Bartłomiej Piotrowski -Bastiaan Bakker -bdevloed -Ben Firshman -Ben Golub -Ben Hall -Ben Sargent -Ben Severson -Ben Toews -Ben Wiklund -Benjamin Atkin -Benoit Chesneau -Bernerd Schaefer -Bert Goethals -Bharath Thiruveedula -Bhiraj Butala -Bilal Amarni -Bill W -bin liu -Blake Geno -Boaz Shuster -bobby abbott -boucher -Bouke Haarsma -Boyd Hemphill -boynux -Bradley Cicenas -Bradley Wright -Brandon Liu -Brandon Philips -Brandon Rhodes -Brendan Dixon -Brent Salisbury -Brett Higgins -Brett Kochendorfer -Brian (bex) Exelbierd -Brian Bland -Brian DeHamer -Brian Dorsey -Brian Flad -Brian Goff -Brian McCallister -Brian Olsen -Brian Shumate -Brian Torres-Gil -Brian Trump -Brice Jaglin -Briehan Lombaard -Bruno Bigras -Bruno Binet -Bruno Gazzera -Bruno Renié -Bryan Bess -Bryan Boreham -Bryan Matsuo -Bryan Murphy -buddhamagnet -Burke Libbey -Byung Kang -Caleb Spare -Calen Pennington -Cameron Boehmer -Cameron Spear -Campbell Allen -Candid Dauth -Cao Weiwei -Carl Henrik Lunde -Carl Loa Odin -Carl X. Su -Carlos Alexandro Becker -Carlos Sanchez -Carol Fager-Higgins -Cary -Casey Bisson -Cedric Davies -Cezar Sa Espinola -Chad Swenson -Chance Zibolski -Chander G -Charles Chan -Charles Hooper -Charles Law -Charles Lindsay -Charles Merriam -Charles Sarrazin -Charles Smith -Charlie Lewis -Chase Bolt -ChaYoung You -Chen Chao -Chen Hanxiao -cheney90 -Chewey -Chia-liang Kao -chli -Cholerae Hu -Chris Alfonso -Chris Armstrong -Chris Dituri -Chris Fordham -Chris Khoo -Chris McKinnel -Chris Seto -Chris Snow -Chris St. Pierre -Chris Stivers -Chris Swan -Chris Wahl -Chris Weyl -chrismckinnel -Christian Berendt -Christian Böhme -Christian Persson -Christian Rotzoll -Christian Simon -Christian Stefanescu -ChristoperBiscardi -Christophe Mehay -Christophe Troestler -Christopher Currie -Christopher Jones -Christopher Latham -Christopher Rigor -Christy Perez -Chun Chen -Ciro S. Costa -Clayton Coleman -Clinton Kitson -Coenraad Loubser -Colin Dunklau -Colin Rice -Colin Walters -Collin Guarino -Colm Hally -companycy -Cory Forsyth -cressie176 -CrimsonGlory -Cristian Staretu -cristiano balducci -Cruceru Calin-Cristian -Cyril F -Daan van Berkel -Daehyeok Mun -Dafydd Crosby -dalanlan -Damian Smyth -Damien Nadé -Damien Nozay -Damjan Georgievski -Dan Anolik -Dan Buch -Dan Cotora -Dan Feldman -Dan Griffin -Dan Hirsch -Dan Keder -Dan Levy -Dan McPherson -Dan Stine -Dan Walsh -Dan Williams -Daniel Antlinger -Daniel Exner -Daniel Farrell -Daniel Garcia -Daniel Gasienica -Daniel Hiltgen -Daniel Menet -Daniel Mizyrycki -Daniel Nephin -Daniel Norberg -Daniel Nordberg -Daniel Robinson -Daniel S -Daniel Von Fange -Daniel X Moore -Daniel YC Lin -Daniel Zhang -Daniel, Dao Quang Minh -Danny Berger -Danny Yates -Darren Coxall -Darren Shepherd -Darren Stahl -Davanum Srinivas -Dave Barboza -Dave Henderson -Dave MacDonald -Dave Tucker -David Anderson -David Calavera -David Corking -David Cramer -David Currie -David Davis -David Dooling -David Gageot -David Gebler -David Lawrence -David Lechner -David M. Karr -David Mackey -David Mat -David Mcanulty -David Pelaez -David R. Jenni -David Röthlisberger -David Sheets -David Sissitka -David Trott -David Xia -David Young -Davide Ceretti -Dawn Chen -dbdd -dcylabs -decadent -deed02392 -Deng Guangxing -Deni Bertovic -Denis Gladkikh -Denis Ollier -Dennis Docter -Derek -Derek -Derek Ch -Derek McGowan -Deric Crago -Deshi Xiao -devmeyster -Devvyn Murphy -Dharmit Shah -Dieter Reuter -Dillon Dixon -Dima Stopel -Dimitri John Ledkov -Dimitris Rozakis -Dimitry Andric -Dinesh Subhraveti -Diogo Monica -DiuDiugirl -Djibril Koné -dkumor -Dmitri Logvinenko -Dmitri Shuralyov -Dmitry Demeshchuk -Dmitry Gusev -Dmitry Smirnov -Dmitry V. Krivenok -Dmitry Vorobev -Dolph Mathews -Dominik Finkbeiner -Dominik Honnef -Don Kirkby -Don Kjer -Don Spaulding -Donald Huang -Dong Chen -Donovan Jones -Doron Podoleanu -Doug Davis -Doug MacEachern -Doug Tangren -Dr Nic Williams -dragon788 -Dražen Lučanin -Drew Erny -Dustin Sallings -Ed Costello -Edmund Wagner -Eiichi Tsukata -Eike Herzbach -Eivin Giske Skaaren -Eivind Uggedal -Elan Ruusamäe -Elias Probst -Elijah Zupancic -eluck -Elvir Kuric -Emil Hernvall -Emily Maier -Emily Rose -Emir Ozer -Enguerran -Eohyung Lee -Eric Barch -Eric Hanchrow -Eric Lee -Eric Myhre -Eric Paris -Eric Rafaloff -Eric Rosenberg -Eric Sage -Eric Windisch -Eric Yang -Eric-Olivier Lamey -Erik Bray -Erik Dubbelboer -Erik Hollensbe -Erik Inge Bolsø -Erik Kristensen -Erik Weathers -Erno Hopearuoho -Erwin van der Koogh -Euan -Eugene Yakubovich -eugenkrizo -evalle -Evan Allrich -Evan Carmi -Evan Hazlett -Evan Krall -Evan Phoenix -Evan Wies -Everett Toews -Evgeny Vereshchagin -Ewa Czechowska -Eystein Måløy Stenberg -ezbercih -Fabiano Rosas -Fabio Falci -Fabio Rapposelli -Fabio Rehm -Fabrizio Regini -Fabrizio Soppelsa -Faiz Khan -falmp -Fangyuan Gao <21551127@zju.edu.cn> -Fareed Dudhia -Fathi Boudra -Federico Gimenez -Felix Geisendörfer -Felix Hupfeld -Felix Rabe -Felix Ruess -Felix Schindler -Ferenc Szabo -Fernando -Fero Volar -Ferran Rodenas -Filipe Brandenburger -Filipe Oliveira -fl0yd -Flavio Castelli -FLGMwt -Florian -Florian Klein -Florian Maier -Florian Weingarten -Florin Asavoaie -fonglh -fortinux -Francesc Campoy -Francis Chuang -Francisco Carriedo -Francisco Souza -Frank Groeneveld -Frank Herrmann -Frank Macreery -Frank Rosquin -Fred Lifton -Frederick F. Kautz IV -Frederik Loeffert -Frederik Nordahl Jul Sabroe -Freek Kalter -frosforever -fy2462 -Félix Baylac-Jacqué -Félix Cantournet -Gabe Rosenhouse -Gabor Nagy -Gabriel Monroy -GabrielNicolasAvellaneda -Galen Sampson -Gareth Rushgrove -Garrett Barboza -Gaurav -gautam, prasanna -GennadySpb -Geoffrey Bachelet -George MacRorie -George Xie -Georgi Hristozov -Gereon Frey -German DZ -Gert van Valkenhoef -Gianluca Borello -Gildas Cuisinier -gissehel -Giuseppe Mazzotta -Gleb Fotengauer-Malinovskiy -Gleb M Borisov -Glyn Normington -GoBella -Goffert van Gool -Gosuke Miyashita -Gou Rao -Govinda Fichtner -Grant Reaber -Graydon Hoare -Greg Fausak -Greg Thornton -grossws -grunny -gs11 -Guilhem Lettron -Guilherme Salgado -Guillaume Dufour -Guillaume J. Charmes -guoxiuyan -Gurjeet Singh -Guruprasad -gwx296173 -Günter Zöchbauer -Hans Kristian Flaatten -Hans Rødtang -Hao Shu Wei -Hao Zhang <21521210@zju.edu.cn> -Harald Albers -Harley Laue -Harold Cooper -Harry Zhang -He Simei -heartlock <21521209@zju.edu.cn> -Hector Castro -Henning Sprang -Hobofan -Hollie Teal -Hong Xu -hsinko <21551195@zju.edu.cn> -Hu Keping -Hu Tao -Huanzhong Zhang -Huayi Zhang -Hugo Duncan -Hugo Marisco <0x6875676f@gmail.com> -Hunter Blanks -huqun -Huu Nguyen -hyeongkyu.lee -hyp3rdino -Hyzhou <1187766782@qq.com> -Ian Babrou -Ian Bishop -Ian Bull -Ian Calvert -Ian Lee -Ian Main -Ian Truslove -Iavael -Icaro Seara -Igor Dolzhikov -Ilkka Laukkanen -Ilya Dmitrichenko -Ilya Gusev -ILYA Khlopotov -imre Fitos -inglesp -Ingo Gottwald -Isaac Dupree -Isabel Jimenez -Isao Jonas -Ivan Babrou -Ivan Fraixedes -Ivan Grcic -J Bruni -J. Nunn -Jack Danger Canty -Jacob Atzen -Jacob Edelman -Jake Champlin -Jake Moshenko -jakedt -James Allen -James Carey -James Carr -James DeFelice -James Harrison Fisher -James Kyburz -James Kyle -James Lal -James Mills -James Nugent -James Turnbull -Jamie Hannaford -Jamshid Afshar -Jan Keromnes -Jan Koprowski -Jan Pazdziora -Jan Toebes -Jan-Gerd Tenberge -Jan-Jaap Driessen -Jana Radhakrishnan -Jannick Fahlbusch -Januar Wayong -Jared Biel -Jared Hocutt -Jaroslaw Zabiello -jaseg -Jasmine Hegman -Jason Divock -Jason Giedymin -Jason Green -Jason Hall -Jason Heiss -Jason Livesay -Jason McVetta -Jason Plum -Jason Shepherd -Jason Smith -Jason Sommer -Jason Stangroome -jaxgeller -Jay -Jay -Jay Kamat -Jean-Baptiste Barth -Jean-Baptiste Dalido -Jean-Paul Calderone -Jean-Tiare Le Bigot -Jeff Anderson -Jeff Johnston -Jeff Lindsay -Jeff Mickey -Jeff Minard -Jeff Nickoloff -Jeff Silberman -Jeff Welch -Jeffrey Bolle -Jeffrey Morgan -Jeffrey van Gogh -Jenny Gebske -Jeremy Grosser -Jeremy Price -Jeremy Qian -Jeremy Unruh -Jeroen Jacobs -Jesse Dearing -Jesse Dubay -Jessica Frazelle -Jezeniel Zapanta -jgeiger -Jhon Honce -Ji.Zhilong -Jian Zhang -jianbosun -Jilles Oldenbeuving -Jim Alateras -Jim Perrin -Jimmy Cuadra -Jimmy Puckett -jimmyxian -Jinsoo Park -Jiri Popelka -Jiří Župka -jjy -jmzwcn -Joao Fernandes -Joe Beda -Joe Doliner -Joe Ferguson -Joe Gordon -Joe Shaw -Joe Van Dyk -Joel Friedly -Joel Handwell -Joel Hansson -Joel Wurtz -Joey Geiger -Joey Gibson -Joffrey F -Johan Euphrosine -Johan Rydberg -Johanan Lieberman -Johannes 'fish' Ziemke -John Costa -John Feminella -John Gardiner Myers -John Gossman -John Howard (VM) -John OBrien III -John Starks -John Tims -John Warwick -John Willis -johnharris85 -Jon Wedaman -Jonas Pfenniger -Jonathan A. Sternberg -Jonathan Boulle -Jonathan Camp -Jonathan Dowland -Jonathan Lebon -Jonathan Lomas -Jonathan McCrohan -Jonathan Mueller -Jonathan Pares -Jonathan Rudenberg -Jonathan Stoppani -Joost Cassee -Jordan -Jordan Arentsen -Jordan Sissel -Jose Diaz-Gonzalez -Joseph Anthony Pasquale Holsten -Joseph Hager -Joseph Kern -Josh -Josh Bodah -Josh Chorlton -Josh Hawn -Josh Horwitz -Josh Poimboeuf -Josiah Kiehl -José Tomás Albornoz -JP -jrabbit -Julian Taylor -Julien Barbier -Julien Bisconti -Julien Bordellier -Julien Dubois -Julien Pervillé -Julio Montes -Jun-Ru Chang -Jussi Nummelin -Justas Brazauskas -Justin Cormack -Justin Force -Justin Plock -Justin Simonelis -Justin Terry -Justyn Temme -Jyrki Puttonen -Jérôme Petazzoni -Jörg Thalheim -Kai Blin -Kai Qiang Wu(Kennan) -Kamil Domański -kamjar gerami -Kanstantsin Shautsou -Kara Alexandra -Karan Lyons -Kareem Khazem -kargakis -Karl Grzeszczak -Karol Duleba -Katie McLaughlin -Kato Kazuyoshi -Katrina Owen -Kawsar Saiyeed -kayrus -Ke Xu -Keith Hudgins -Keli Hu -Ken Cochrane -Ken Herner -Ken ICHIKAWA -Kenfe-Mickaël Laventure -Kenjiro Nakayama -Kent Johnson -Kevin "qwazerty" Houdebert -Kevin Burke -Kevin Clark -Kevin J. Lynagh -Kevin Jing Qiu -Kevin Menard -Kevin P. Kucharczyk -Kevin Richardson -Kevin Shi -Kevin Wallace -Kevin Yap -kevinmeredith -Keyvan Fatehi -kies -Kim BKC Carlbacker -Kim Eik -Kimbro Staken -Kir Kolyshkin -Kiran Gangadharan -Kirill Kolyshkin -Kirill SIbirev -knappe -Kohei Tsuruta -Koichi Shiraishi -Konrad Kleine -Konstantin L -Konstantin Pelykh -Krasimir Georgiev -Kris-Mikael Krister -Kristian Haugene -Kristina Zabunova -krrg -Kun Zhang -Kunal Kushwaha -Kyle Conroy -Kyle Linden -kyu -Lachlan Coote -Lai Jiangshan -Lajos Papp -Lakshan Perera -Lalatendu Mohanty -lalyos -Lance Chen -Lance Kinley -Lars Butler -Lars Kellogg-Stedman -Lars R. Damerow -Laszlo Meszaros -Laurent Erignoux -Laurie Voss -Leandro Siqueira -Lee Chao <932819864@qq.com> -Lee, Meng-Han -leeplay -Lei Jitang -Len Weincier -Lennie -Leszek Kowalski -Levi Blackstone -Levi Gross -Lewis Marshall -Lewis Peckover -Liam Macgillavry -Liana Lo -Liang Mingqiang -Liang-Chi Hsieh -liaoqingwei -limsy -Lin Lu -LingFaKe -Linus Heckemann -Liran Tal -Liron Levin -Liu Bo -Liu Hua -lixiaobing10051267 -LIZAO LI -Lloyd Dewolf -Lokesh Mandvekar -longliqiang88 <394564827@qq.com> -Lorenz Leutgeb -Lorenzo Fontana -Louis Opter -Luca Marturana -Luca Orlandi -Luca-Bogdan Grigorescu -Lucas Chan -Lucas Chi -Luciano Mores -Luis Martínez de Bartolomé Izquierdo -Lukas Waslowski -lukaspustina -Lukasz Zajaczkowski -lukemarsden -Lynda O'Leary -Lénaïc Huard -Ma Shimiao -Mabin -Madhav Puri -Madhu Venugopal -Mageee <21521230.zju.edu.cn> -Mahesh Tiyyagura -malnick -Malte Janduda -manchoz -Manfred Touron -Manfred Zabarauskas -Mansi Nahar -mansinahar -Manuel Meurer -Manuel Woelker -mapk0y -Marc Abramowitz -Marc Kuo -Marc Tamsky -Marcelo Salazar -Marco Hennings -Marcus Farkas -Marcus Linke -Marcus Ramberg -Marek Goldmann -Marian Marinov -Marianna Tessel -Mario Loriedo -Marius Gundersen -Marius Sturm -Marius Voila -Mark Allen -Mark McGranaghan -Mark McKinstry -Mark West -Marko Mikulicic -Marko Tibold -Markus Fix -Martijn Dwars -Martijn van Oosterhout -Martin Honermeyer -Martin Kelly -Martin Mosegaard Amdisen -Martin Redmond -Mary Anthony -Masahito Zembutsu -Mason Malone -Mateusz Sulima -Mathias Monnerville -Mathieu Le Marec - Pasquet -Matt Apperson -Matt Bachmann -Matt Bentley -Matt Haggard -Matt Hoyle -Matt McCormick -Matt Moore -Matt Richardson -Matt Robenolt -Matthew Heon -Matthew Mayer -Matthew Mueller -Matthew Riley -Matthias Klumpp -Matthias Kühnle -Matthias Rampke -Matthieu Hauglustaine -mattymo -mattyw -Mauricio Garavaglia -mauriyouth -Max Shytikov -Maxim Fedchyshyn -Maxim Ivanov -Maxim Kulkin -Maxim Treskin -Maxime Petazzoni -Meaglith Ma -meejah -Megan Kostick -Mehul Kar -Mei ChunTao -Mengdi Gao -Mert Yazıcıoğlu -mgniu -Micah Zoltu -Michael A. Smith -Michael Bridgen -Michael Brown -Michael Chiang -Michael Crosby -Michael Currie -Michael Friis -Michael Gorsuch -Michael Grauer -Michael Holzheu -Michael Hudson-Doyle -Michael Huettermann -Michael Käufl -Michael Neale -Michael Prokop -Michael Scharf -Michael Stapelberg -Michael Steinert -Michael Thies -Michael West -Michal Fojtik -Michal Gebauer -Michal Jemala -Michal Minar -Michal Wieczorek -Michaël Pailloncy -Michał Czeraszkiewicz -Michiel@unhosted -Mickaël FORTUNATO -Miguel Angel Fernández -Miguel Morales -Mihai Borobocea -Mihuleacc Sergiu -Mike Brown -Mike Chelen -Mike Danese -Mike Dillon -Mike Dougherty -Mike Gaffney -Mike Goelzer -Mike Leone -Mike MacCana -Mike Naberezny -Mike Snitzer -mikelinjie <294893458@qq.com> -Mikhail Sobolev -Miloslav Trmač -mingqing -Mingzhen Feng -Misty Stanley-Jones -Mitch Capper -mlarcher -Mohammad Banikazemi -Mohammed Aaqib Ansari -Mohit Soni -Morgan Bauer -Morgante Pell -Morgy93 -Morten Siebuhr -Morton Fox -Moysés Borges -mqliang -Mrunal Patel -msabansal -mschurenko -muge -Mustafa Akın -Muthukumar R -Máximo Cuadros -Médi-Rémi Hashim -Nahum Shalman -Nakul Pathak -Nalin Dahyabhai -Nan Monnand Deng -Naoki Orii -Natalie Parker -Natanael Copa -Nate Brennand -Nate Eagleson -Nate Jones -Nathan Hsieh -Nathan Kleyn -Nathan LeClaire -Nathan McCauley -Nathan Williams -Neal McBurnett -Neil Peterson -Nelson Chen -Neyazul Haque -Nghia Tran -Niall O'Higgins -Nicholas E. Rabenau -nick -Nick DeCoursin -Nick Irvine -Nick Parker -Nick Payne -Nick Stenning -Nick Stinemates -Nicola Kabar -Nicolas Borboën -Nicolas De loof -Nicolas Dudebout -Nicolas Goy -Nicolas Kaiser -Nicolás Hock Isaza -Nigel Poulton -NikolaMandic -nikolas -Nirmal Mehta -Nishant Totla -NIWA Hideyuki -noducks -Nolan Darilek -nponeccop -Nuutti Kotivuori -nzwsch -O.S. Tezer -objectified -OddBloke -odk- -Oguz Bilgic -Oh Jinkyun -Ohad Schneider -ohmystack -Ole Reifschneider -Oliver Neal -Olivier Gambier -Olle Jonsson -Oriol Francès -orkaa -Oskar Niburski -Otto Kekäläinen -oyld -ozlerhakan -paetling -pandrew -panticz -Paolo G. Giarrusso -Pascal Borreli -Pascal Hartig -Patrick Böänziger -Patrick Devine -Patrick Hemmer -Patrick Stapleton -pattichen -Paul -paul -Paul Annesley -Paul Bellamy -Paul Bowsher -Paul Furtado -Paul Hammond -Paul Jimenez -Paul Lietar -Paul Liljenberg -Paul Morie -Paul Nasrat -Paul Weaver -Paulo Ribeiro -Pavel Lobashov -Pavel Pospisil -Pavel Sutyrin -Pavel Tikhomirov -Pavlos Ratis -Pavol Vargovcik -Peeyush Gupta -Peggy Li -Pei Su -Penghan Wang -perhapszzy@sina.com -pestophagous -Peter Bourgon -Peter Braden -Peter Choi -Peter Dave Hello -Peter Edge -Peter Ericson -Peter Esbensen -Peter Malmgren -Peter Salvatore -Peter Volpe -Peter Waller -Petr Švihlík -Phil -Phil Estes -Phil Spitler -Philip Monroe -Philipp Wahala -Philipp Weissensteiner -Phillip Alexander -pidster -Piergiuliano Bossi -Pierre -Pierre Carrier -Pierre Dal-Pra -Pierre Wacrenier -Pierre-Alain RIVIERE -Piotr Bogdan -pixelistik -Porjo -Poul Kjeldager Sørensen -Pradeep Chhetri -Prasanna Gautam -Prayag Verma -Przemek Hejman -pysqz -qg <1373319223@qq.com> -qhuang -Qiang Huang -qq690388648 <690388648@qq.com> -Quentin Brossard -Quentin Perez -Quentin Tayssier -r0n22 -Rafal Jeczalik -Rafe Colton -Raghavendra K T -Raghuram Devarakonda -Rajat Pandit -Rajdeep Dua -Ralf Sippl -Ralle -Ralph Bean -Ramkumar Ramachandra -Ramon Brooker -Ramon van Alteren -Ray Tsang -ReadmeCritic -Recursive Madman -Regan McCooey -Remi Rampin -Renato Riccieri Santos Zannon -resouer -rgstephens -Rhys Hiltner -Rich Moyse -Rich Seymour -Richard -Richard Burnison -Richard Harvey -Richard Mathie -Richard Metzler -Richard Scothern -Richo Healey -Rick Bradley -Rick van de Loo -Rick Wieman -Rik Nijessen -Riku Voipio -Riley Guerin -Ritesh H Shukla -Riyaz Faizullabhoy -Rob Vesse -Robert Bachmann -Robert Bittle -Robert Obryk -Robert Stern -Robert Terhaar -Robert Wallis -Roberto G. Hashioka -Robin Naundorf -Robin Schneider -Robin Speekenbrink -robpc -Rodolfo Carvalho -Rodrigo Vaz -Roel Van Nyen -Roger Peppe -Rohit Jnagal -Rohit Kadam -Roland Huß -Roland Kammerer -Roland Moriz -Roma Sokolov -Roman Strashkin -Ron Smits -Ron Williams -root -root -root -root -root -Rory Hunter -Rory McCune -Ross Boucher -Rovanion Luckey -Rozhnov Alexandr -rsmoorthy -Rudolph Gottesheim -Rui Lopes -Runshen Zhu -Ryan Anderson -Ryan Aslett -Ryan Belgrave -Ryan Detzel -Ryan Fowler -Ryan McLaughlin -Ryan O'Donnell -Ryan Seto -Ryan Thomas -Ryan Trauntvein -Ryan Wallner -RyanDeng -Rémy Greinhofer -s. rannou -s00318865 -Sabin Basyal -Sachin Joshi -Sagar Hani -Sainath Grandhi -sakeven -Sally O'Malley -Sam Abed -Sam Alba -Sam Bailey -Sam J Sharpe -Sam Neirinck -Sam Reis -Sam Rijs -Sambuddha Basu -Sami Wagiaalla -Samuel Andaya -Samuel Dion-Girardeau -Samuel Karp -Samuel PHAN -Sankar சங்கர் -Sanket Saurav -Santhosh Manohar -sapphiredev -Satnam Singh -satoru -Satoshi Amemiya -Satoshi Tagomori -scaleoutsean -Scott Bessler -Scott Collier -Scott Johnston -Scott Stamp -Scott Walls -sdreyesg -Sean Christopherson -Sean Cronin -Sean OMeara -Sean P. Kane -Sebastiaan van Steenis -Sebastiaan van Stijn -Senthil Kumar Selvaraj -Senthil Kumaran -SeongJae Park -Seongyeol Lim -Serge Hallyn -Sergey Alekseev -Sergey Evstifeev -Serhat Gülçiçek -Sevki Hasirci -Shane Canon -Shane da Silva -shaunol -Shawn Landden -Shawn Siefkas -shawnhe -Shekhar Gulati -Sheng Yang -Shengbo Song -Shev Yan -Shih-Yuan Lee -Shijiang Wei -Shishir Mahajan -Shoubhik Bose -Shourya Sarcar -shuai-z -Shukui Yang -Shuwei Hao -Sian Lerk Lau -sidharthamani -Silas Sewell -Simei He -Simon Eskildsen -Simon Leinen -Simon Taranto -Sindhu S -Sjoerd Langkemper -skaasten -Solganik Alexander -Solomon Hykes -Song Gao -Soshi Katsuta -Soulou -Spencer Brown -Spencer Smith -Sridatta Thatipamala -Sridhar Ratnakumar -Srini Brahmaroutu -srinsriv -Steeve Morin -Stefan Berger -Stefan J. Wernli -Stefan Praszalowicz -Stefan Scherer -Stefan Staudenmeyer -Stefan Weil -Stephen Crosby -Stephen Day -Stephen Drake -Stephen Rust -Steve Durrheimer -Steve Francia -Steve Koch -Steven Burgess -Steven Erenst -Steven Iveson -Steven Merrill -Steven Richards -Steven Taylor -Subhajit Ghosh -Sujith Haridasan -Suryakumar Sudar -Sven Dowideit -Swapnil Daingade -Sylvain Baubeau -Sylvain Bellemare -Sébastien -Sébastien Luttringer -Sébastien Stormacq -Tadej Janež -TAGOMORI Satoshi -tang0th -Tangi COLIN -Tatsuki Sugiura -Tatsushi Inagaki -Taylor Jones -tbonza -Ted M. Young -Tehmasp Chaudhri -Tejesh Mehta -terryding77 <550147740@qq.com> -tgic -Thatcher Peskens -theadactyl -Thell 'Bo' Fowler -Thermionix -Thijs Terlouw -Thomas Bikeev -Thomas Frössman -Thomas Gazagnaire -Thomas Grainger -Thomas Hansen -Thomas Leonard -Thomas LEVEIL -Thomas Orozco -Thomas Riccardi -Thomas Schroeter -Thomas Sjögren -Thomas Swift -Thomas Tanaka -Thomas Texier -Tianon Gravi -Tianyi Wang -Tibor Vass -Tiffany Jernigan -Tiffany Low -Tim Bosse -Tim Dettrick -Tim Düsterhus -Tim Hockin -Tim Ruffles -Tim Smith -Tim Terhorst -Tim Wang -Tim Waugh -Tim Wraight -timfeirg -Timothy Hobbs -tjwebb123 -tobe -Tobias Bieniek -Tobias Bradtke -Tobias Gesellchen -Tobias Klauser -Tobias Munk -Tobias Schmidt -Tobias Schwab -Todd Crane -Todd Lunter -Todd Whiteman -Toli Kuznets -Tom Barlow -Tom Denham -Tom Fotherby -Tom Howe -Tom Hulihan -Tom Maaswinkel -Tom X. Tobin -Tomas Tomecek -Tomasz Kopczynski -Tomasz Lipinski -Tomasz Nurkiewicz -Tommaso Visconti -Tomáš Hrčka -Tonis Tiigi -Tonny Xu -Tony Daws -Tony Miller -toogley -Torstein Husebø -tpng -tracylihui <793912329@qq.com> -Travis Cline -Travis Thieman -Trent Ogren -Trevor -Trevor Pounds -trishnaguha -Tristan Carel -Troy Denton -Tyler Brock -Tzu-Jung Lee -Tõnis Tiigi -Ulysse Carion -unknown -vagrant -Vaidas Jablonskis -Veres Lajos -vgeta -Victor Algaze -Victor Coisne -Victor Costan -Victor I. Wood -Victor Lyuboslavsky -Victor Marmol -Victor Palma -Victor Vieux -Victoria Bialas -Vijaya Kumar K -Viktor Stanchev -Viktor Vojnovski -VinayRaghavanKS -Vincent Batts -Vincent Bernat -Vincent Bernat -Vincent Demeester -Vincent Giersch -Vincent Mayers -Vincent Woo -Vinod Kulkarni -Vishal Doshi -Vishnu Kannan -Vitor Monteiro -Vivek Agarwal -Vivek Dasgupta -Vivek Goyal -Vladimir Bulyga -Vladimir Kirillov -Vladimir Pouzanov -Vladimir Rutsky -Vladimir Varankin -VladimirAus -Vojtech Vitek (V-Teq) -waitingkuo -Walter Leibbrandt -Walter Stanish -WANG Chao -Wang Xing -Ward Vandewege -WarheadsSE -Wayne Chang -Wei-Ting Kuo -weiyan -Weiyang Zhu -Wen Cheng Ma -Wendel Fleming -Wenkai Yin -Wenxuan Zhao -Wenyu You <21551128@zju.edu.cn> -Wes Morgan -Will Dietz -Will Rouesnel -Will Weaver -willhf -William Delanoue -William Henry -William Hubbs -William Riancho -William Thurston -WiseTrem -wlan0 -Wolfgang Powisch -wonderflow -Wonjun Kim -xamyzhao -Xianlu Bird -XiaoBing Jiang -Xiaoxu Chen -xiekeyang -Xinzi Zhou -Xiuming Chen -xlgao-zju -xuzhaokui -Yahya -YAMADA Tsuyoshi -Yan Feng -Yang Bai -yangshukui -Yanqiang Miao -Yasunori Mahata -Yestin Sun -Yi EungJun -Yibai Zhang -Yihang Ho -Ying Li -Yohei Ueda -Yong Tang -Yongzhi Pan -yorkie -Youcef YEKHLEF -Yuan Sun -yuchangchun -yuchengxia -yuexiao-wang -YuPengZTE -Yurii Rashkovskii -yuzou -Zac Dover -Zach Borboa -Zachary Jaffee -Zain Memon -Zaiste! -Zane DeGraffenried -Zefan Li -Zen Lin(Zhinan Lin) -Zhang Kun -Zhang Wei -Zhang Wentao -Zhenan Ye <21551168@zju.edu.cn> -zhouhao -Zhu Guihua -Zhuoyun Wei -Zilin Du -zimbatm -Ziming Dong -ZJUshuaizhou <21551191@zju.edu.cn> -zmarouf -Zoltan Tombol -zqh -Zuhayr Elahi -Zunayed Ali -Álex González -Álvaro Lázaro -Átila Camurça Alves -尹吉峰 -搏通 diff --git a/vendor/github.com/docker/docker/LICENSE b/vendor/github.com/docker/docker/LICENSE deleted file mode 100644 index 8f3fee62..00000000 --- a/vendor/github.com/docker/docker/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2013-2016 Docker, Inc. - - 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 - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/docker/NOTICE b/vendor/github.com/docker/docker/NOTICE deleted file mode 100644 index 8a37c1c7..00000000 --- a/vendor/github.com/docker/docker/NOTICE +++ /dev/null @@ -1,19 +0,0 @@ -Docker -Copyright 2012-2016 Docker, Inc. - -This product includes software developed at Docker, Inc. (https://www.docker.com). - -This product contains software (https://github.com/kr/pty) developed -by Keith Rarick, licensed under the MIT License. - -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/docker/docker/api/types/auth.go b/vendor/github.com/docker/docker/api/types/auth.go deleted file mode 100644 index 056af6b8..00000000 --- a/vendor/github.com/docker/docker/api/types/auth.go +++ /dev/null @@ -1,22 +0,0 @@ -package types - -// AuthConfig contains authorization information for connecting to a Registry -type AuthConfig struct { - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` - Auth string `json:"auth,omitempty"` - - // Email is an optional value associated with the username. - // This field is deprecated and will be removed in a later - // version of docker. - Email string `json:"email,omitempty"` - - ServerAddress string `json:"serveraddress,omitempty"` - - // IdentityToken is used to authenticate the user and get - // an access token for the registry. - IdentityToken string `json:"identitytoken,omitempty"` - - // RegistryToken is a bearer token to be sent to a registry - RegistryToken string `json:"registrytoken,omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go b/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go deleted file mode 100644 index 931ae10a..00000000 --- a/vendor/github.com/docker/docker/api/types/blkiodev/blkio.go +++ /dev/null @@ -1,23 +0,0 @@ -package blkiodev - -import "fmt" - -// WeightDevice is a structure that holds device:weight pair -type WeightDevice struct { - Path string - Weight uint16 -} - -func (w *WeightDevice) String() string { - return fmt.Sprintf("%s:%d", w.Path, w.Weight) -} - -// ThrottleDevice is a structure that holds device:rate_per_second pair -type ThrottleDevice struct { - Path string - Rate uint64 -} - -func (t *ThrottleDevice) String() string { - return fmt.Sprintf("%s:%d", t.Path, t.Rate) -} diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go deleted file mode 100644 index 7900d64f..00000000 --- a/vendor/github.com/docker/docker/api/types/client.go +++ /dev/null @@ -1,378 +0,0 @@ -package types - -import ( - "bufio" - "io" - "net" - "os" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "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 - ContainerID string - Running bool - ExitCode int - Pid int -} - -// ContainerListOptions holds parameters to list containers with. -type ContainerListOptions struct { - Quiet bool - 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 - 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 { - AllowOverwriteDirWithFile bool -} - -// EventsOptions holds parameters to filter events with. -type EventsOptions struct { - Since string - Until string - Filters filters.Args -} - -// NetworkListOptions holds parameters to filter the list of networks with. -type NetworkListOptions struct { - Filters filters.Args -} - -// HijackedResponse holds connection information for a hijacked request. -type HijackedResponse struct { - Conn net.Conn - Reader *bufio.Reader -} - -// Close closes the hijacked connection and reader. -func (h *HijackedResponse) Close() { - h.Conn.Close() -} - -// CloseWriter is an interface that implements structs -// that close input streams to prevent from writing. -type CloseWriter interface { - CloseWrite() error -} - -// CloseWrite closes a readWriter for writing. -func (h *HijackedResponse) CloseWrite() error { - if conn, ok := h.Conn.(CloseWriter); ok { - return conn.CloseWrite() - } - return nil -} - -// ImageBuildOptions holds the information -// necessary to build images. -type ImageBuildOptions struct { - Tags []string - SuppressOutput bool - RemoteContext string - NoCache bool - Remove bool - ForceRemove bool - PullParent bool - Isolation container.Isolation - CPUSetCPUs string - CPUSetMems string - CPUShares int64 - CPUQuota int64 - CPUPeriod int64 - Memory int64 - MemorySwap int64 - CgroupParent string - NetworkMode string - ShmSize int64 - Dockerfile string - Ulimits []*units.Ulimit - // See the parsing of buildArgs in api/server/router/build/build_routes.go - // for an explaination of why BuildArgs needs to use *string instead of - // just a string - BuildArgs map[string]*string - AuthConfigs map[string]AuthConfig - Context io.Reader - Labels map[string]string - // squash the resulting image's layers to the parent - // preserves the original image and creates a new one from the parent with all - // the changes applied to a single layer - Squash bool - // CacheFrom specifies images that are used for matching cache. Images - // specified here do not need to have a valid parent chain to match cache. - CacheFrom []string - SecurityOpt []string -} - -// ImageBuildResponse holds information -// returned by a server after building -// an image. -type ImageBuildResponse struct { - Body io.ReadCloser - OSType string -} - -// ImageCreateOptions holds information to create images. -type ImageCreateOptions struct { - RegistryAuth string // RegistryAuth is the base64 encoded credentials for 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 (mutually exclusive with SourceName) - SourceName string // SourceName is the name of the image to pull (mutually exclusive with Source) -} - -// 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 -} - -// ImageListOptions holds parameters to filter the list of images with. -type ImageListOptions struct { - All bool - Filters filters.Args -} - -// ImageLoadResponse returns information to the client about a load process. -type ImageLoadResponse struct { - // Body must be closed to avoid a resource leak - Body io.ReadCloser - 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 -} - -// RequestPrivilegeFunc is a function interface that -// clients can supply to retry operations after -// getting an authorization error. -// This function returns the registry authentication -// header value in base 64 format, or an error -// 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 - PrivilegeFunc RequestPrivilegeFunc - Filters filters.Args - 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 -} - -// VersionResponse holds version information for the client and the server -type VersionResponse struct { - Client *Version - Server *Version -} - -// ServerOK returns true when the client could connect to the docker server -// and parse the information received. It returns false otherwise. -func (v VersionResponse) ServerOK() bool { - return v.Server != nil -} - -// NodeListOptions holds parameters to list nodes with. -type NodeListOptions struct { - Filters filters.Args -} - -// NodeRemoveOptions holds parameters to remove nodes with. -type NodeRemoveOptions struct { - Force bool -} - -// ServiceCreateOptions contains the options to use when creating a service. -type ServiceCreateOptions struct { - // EncodedRegistryAuth is the encoded registry authorization credentials to - // use when updating the service. - // - // This field follows the format of the X-Registry-Auth header. - EncodedRegistryAuth string -} - -// 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" - RegistryAuthFromPreviousSpec = "previous-spec" -) - -// ServiceUpdateOptions contains the options to be used for updating services. -type ServiceUpdateOptions struct { - // EncodedRegistryAuth is the encoded registry authorization credentials to - // use when updating the service. - // - // This field follows the format of the X-Registry-Auth header. - EncodedRegistryAuth string - - // TODO(stevvooe): Consider moving the version parameter of ServiceUpdate - // into this field. While it does open API users up to racy writes, most - // users may not need that level of consistency in practice. - - // RegistryAuthFrom specifies where to find the registry authorization - // credentials if they are not given in EncodedRegistryAuth. Valid - // values are "spec" and "previous-spec". - RegistryAuthFrom string -} - -// ServiceListOptions holds parameters to list services with. -type ServiceListOptions struct { - Filters filters.Args -} - -// TaskListOptions holds parameters to list tasks with. -type TaskListOptions struct { - Filters filters.Args -} - -// PluginRemoveOptions holds parameters to remove plugins. -type PluginRemoveOptions struct { - Force bool -} - -// PluginEnableOptions holds parameters to enable plugins. -type PluginEnableOptions struct { - Timeout int -} - -// PluginDisableOptions holds parameters to disable plugins. -type PluginDisableOptions struct { - Force bool -} - -// PluginInstallOptions holds parameters to install a plugin. -type PluginInstallOptions struct { - Disabled bool - AcceptAllPermissions bool - RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry - RemoteRef string // RemoteRef is the plugin name on the registry - PrivilegeFunc RequestPrivilegeFunc - AcceptPermissionsFunc func(PluginPrivileges) (bool, error) - Args []string -} - -// SecretRequestOption is a type for requesting secrets -type SecretRequestOption struct { - Source string - Target string - UID string - GID string - Mode os.FileMode -} - -// SwarmUnlockKeyResponse contains the response for Engine API: -// GET /swarm/unlockkey -type SwarmUnlockKeyResponse struct { - // UnlockKey is the unlock key in ASCII-armored format. - UnlockKey string -} - -// PluginCreateOptions hold all options to plugin create. -type PluginCreateOptions struct { - RepoName string -} diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go deleted file mode 100644 index 20c19f21..00000000 --- a/vendor/github.com/docker/docker/api/types/configs.go +++ /dev/null @@ -1,69 +0,0 @@ -package types - -import ( - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/network" -) - -// 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 - 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 -} - -// ContainerCommitConfig contains build configs for commit operation, -// and is used when making a commit with the current state of the container. -type ContainerCommitConfig struct { - Pause bool - Repo string - Tag string - Author string - Comment string - // merge container config into commit config before commit - MergeConfigs bool - Config *container.Config -} - -// ExecConfig is a small subset of the Config struct that holds the configuration -// for the exec feature of docker. -type ExecConfig struct { - User string // User that will run the command - Privileged bool // Is the container in privileged mode - Tty bool // Attach standard streams to a tty. - AttachStdin bool // Attach the standard input, makes possible user interaction - AttachStderr bool // Attach the standard error - AttachStdout bool // Attach the standard output - Detach bool // Execute in detach mode - DetachKeys string // Escape keys for detach - Env []string // Environment variables - 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 -} diff --git a/vendor/github.com/docker/docker/api/types/container/config.go b/vendor/github.com/docker/docker/api/types/container/config.go deleted file mode 100644 index fc050e5d..00000000 --- a/vendor/github.com/docker/docker/api/types/container/config.go +++ /dev/null @@ -1,62 +0,0 @@ -package container - -import ( - "time" - - "github.com/docker/docker/api/types/strslice" - "github.com/docker/go-connections/nat" -) - -// 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. - - // Retries is the number of consecutive failures needed to consider a container as unhealthy. - // Zero means inherit. - Retries int `json:",omitempty"` -} - -// Config contains the configuration data about a container. -// It should hold only portable information about the container. -// Here, "portable" means "independent from the host we are running on". -// Non-portable information *should* appear in HostConfig. -// All fields added to this struct must be marked `omitempty` to keep getting -// predictable hashes from the old `v1Compatibility` configuration. -type Config struct { - Hostname string // Hostname - Domainname string // Domainname - User string // User that will run the command(s) inside the container, also support user:group - AttachStdin bool // Attach the standard input, makes possible user interaction - AttachStdout bool // Attach the standard output - AttachStderr bool // Attach the standard error - ExposedPorts nat.PortSet `json:",omitempty"` // List of exposed ports - Tty bool // Attach standard streams to a tty, including stdin if it is not closed. - OpenStdin bool // Open stdin - StdinOnce bool // If true, close stdin after the 1 attached client disconnects. - Env []string // List of environment variable to set in the container - Cmd strslice.StrSlice // Command to run when starting the container - Healthcheck *HealthConfig `json:",omitempty"` // Healthcheck describes how to check the container is healthy - ArgsEscaped bool `json:",omitempty"` // True if command is already escaped (Windows specific) - Image string // Name of the image as it was passed by the operator (e.g. could be symbolic) - Volumes map[string]struct{} // List of volumes (mounts) used for the container - 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 -} diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go deleted file mode 100644 index d028e3b1..00000000 --- a/vendor/github.com/docker/docker/api/types/container/container_create.go +++ /dev/null @@ -1,21 +0,0 @@ -package container - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -// ContainerCreateCreatedBody container create created body -// swagger:model ContainerCreateCreatedBody -type ContainerCreateCreatedBody struct { - - // The ID of the created container - // Required: true - ID string `json:"Id"` - - // Warnings encountered when creating the container - // Required: true - Warnings []string `json:"Warnings"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go deleted file mode 100644 index 81ee12c6..00000000 --- a/vendor/github.com/docker/docker/api/types/container/container_update.go +++ /dev/null @@ -1,17 +0,0 @@ -package container - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -// ContainerUpdateOKBody container update o k body -// swagger:model ContainerUpdateOKBody -type ContainerUpdateOKBody struct { - - // warnings - // Required: true - Warnings []string `json:"Warnings"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go deleted file mode 100644 index 16cf3353..00000000 --- a/vendor/github.com/docker/docker/api/types/container/container_wait.go +++ /dev/null @@ -1,17 +0,0 @@ -package container - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -// ContainerWaitOKBody container wait o k body -// swagger:model ContainerWaitOKBody -type ContainerWaitOKBody struct { - - // Exit code of the container - // Required: true - StatusCode int64 `json:"StatusCode"` -} diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go deleted file mode 100644 index 0c82d625..00000000 --- a/vendor/github.com/docker/docker/api/types/container/host_config.go +++ /dev/null @@ -1,333 +0,0 @@ -package container - -import ( - "strings" - - "github.com/docker/docker/api/types/blkiodev" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/api/types/strslice" - "github.com/docker/go-connections/nat" - "github.com/docker/go-units" -) - -// NetworkMode represents the container network stack. -type NetworkMode string - -// Isolation represents the isolation technology of a container. The supported -// values are platform specific -type Isolation string - -// IsDefault indicates the default isolation technology of a container. On Linux this -// is the native driver. On Windows, this is a Windows Server Container. -func (i Isolation) IsDefault() bool { - return strings.ToLower(string(i)) == "default" || string(i) == "" -} - -// IpcMode represents the container ipc stack. -type IpcMode string - -// IsPrivate indicates whether the container uses its private ipc stack. -func (n IpcMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) -} - -// IsHost indicates whether the container uses the host's ipc stack. -func (n IpcMode) IsHost() bool { - return n == "host" -} - -// IsContainer indicates whether the container uses a container's ipc stack. -func (n IpcMode) IsContainer() bool { - parts := strings.SplitN(string(n), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// Valid indicates whether the ipc stack is valid. -func (n IpcMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - case "container": - if len(parts) != 2 || parts[1] == "" { - return false - } - default: - return false - } - return true -} - -// Container returns the name of the container ipc stack is going to be used. -func (n IpcMode) Container() string { - parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// UsernsMode represents userns mode in the container. -type UsernsMode string - -// IsHost indicates whether the container uses the host's userns. -func (n UsernsMode) IsHost() bool { - return n == "host" -} - -// IsPrivate indicates whether the container uses the a private userns. -func (n UsernsMode) IsPrivate() bool { - return !(n.IsHost()) -} - -// Valid indicates whether the userns is valid. -func (n UsernsMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - default: - return false - } - return true -} - -// CgroupSpec represents the cgroup to use for the container. -type CgroupSpec string - -// IsContainer indicates whether the container is using another container cgroup -func (c CgroupSpec) IsContainer() bool { - parts := strings.SplitN(string(c), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// Valid indicates whether the cgroup spec is valid. -func (c CgroupSpec) Valid() bool { - return c.IsContainer() || c == "" -} - -// Container returns the name of the container whose cgroup will be used. -func (c CgroupSpec) Container() string { - parts := strings.SplitN(string(c), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// UTSMode represents the UTS namespace of the container. -type UTSMode string - -// IsPrivate indicates whether the container uses its private UTS namespace. -func (n UTSMode) IsPrivate() bool { - return !(n.IsHost()) -} - -// IsHost indicates whether the container uses the host's UTS namespace. -func (n UTSMode) IsHost() bool { - return n == "host" -} - -// Valid indicates whether the UTS namespace is valid. -func (n UTSMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - default: - return false - } - return true -} - -// PidMode represents the pid namespace of the container. -type PidMode string - -// IsPrivate indicates whether the container uses its own new pid namespace. -func (n PidMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) -} - -// IsHost indicates whether the container uses the host's pid namespace. -func (n PidMode) IsHost() bool { - return n == "host" -} - -// IsContainer indicates whether the container uses a container's pid namespace. -func (n PidMode) IsContainer() bool { - parts := strings.SplitN(string(n), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// Valid indicates whether the pid namespace is valid. -func (n PidMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - case "container": - if len(parts) != 2 || parts[1] == "" { - return false - } - default: - return false - } - return true -} - -// Container returns the name of the container whose pid namespace is going to be used. -func (n PidMode) Container() string { - parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// DeviceMapping represents the device mapping between the host and the container. -type DeviceMapping struct { - PathOnHost string - PathInContainer string - CgroupPermissions string -} - -// RestartPolicy represents the restart policies of the container. -type RestartPolicy struct { - Name string - MaximumRetryCount int -} - -// 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 == "" -} - -// 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" -} - -// 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" -} - -// 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" -} - -// IsSame compares two RestartPolicy to see if they are the same -func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool { - return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount -} - -// LogConfig represents the logging configuration of the container. -type LogConfig struct { - Type string - Config map[string]string -} - -// Resources contains container's resources (cgroups config, ulimits...) -type Resources struct { - // Applicable to all platforms - CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers) - Memory int64 // Memory limit (in bytes) - NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10-9 CPUs. - - // Applicable to UNIX platforms - CgroupParent string // Parent cgroup. - BlkioWeight uint16 // Block IO weight (relative weight vs. other containers) - BlkioWeightDevice []*blkiodev.WeightDevice - BlkioDeviceReadBps []*blkiodev.ThrottleDevice - BlkioDeviceWriteBps []*blkiodev.ThrottleDevice - BlkioDeviceReadIOps []*blkiodev.ThrottleDevice - BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice - CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period - CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota - CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period - CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime - CpusetCpus string // CpusetCpus 0-2, 0,1 - CpusetMems string // CpusetMems 0-2, 0,1 - Devices []DeviceMapping // List of devices to map inside the container - DiskQuota int64 // Disk limit (in bytes) - KernelMemory int64 // Kernel memory limit (in bytes) - MemoryReservation int64 // Memory soft limit (in bytes) - MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap - MemorySwappiness *int64 // Tuning container memory swappiness behaviour - OomKillDisable *bool // Whether to disable OOM Killer or not - PidsLimit int64 // Setting pids limit for a container - Ulimits []*units.Ulimit // List of ulimits to be set in the container - - // Applicable to Windows - CPUCount int64 `json:"CpuCount"` // CPU count - CPUPercent int64 `json:"CpuPercent"` // CPU percent - IOMaximumIOps uint64 // Maximum IOps for the container system drive - IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive -} - -// UpdateConfig holds the mutable attributes of a Container. -// Those attributes can be updated at runtime. -type UpdateConfig struct { - // Contains container's resources (cgroups, ulimits) - Resources - RestartPolicy RestartPolicy -} - -// HostConfig the non-portable Config structure of a container. -// Here, "non-portable" means "dependent of the host we are running on". -// Portable information *should* appear in Config. -type HostConfig struct { - // Applicable to all platforms - Binds []string // List of volume bindings for this container - ContainerIDFile string // File (path) where the containerId is written - LogConfig LogConfig // Configuration of the logs for this container - NetworkMode NetworkMode // Network mode to use for the container - PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host - RestartPolicy RestartPolicy // Restart policy to be used for the container - AutoRemove bool // Automatically remove container when it exits - VolumeDriver string // Name of the volume driver used to mount volumes - VolumesFrom []string // List of volumes to take from other container - - // Applicable to UNIX platforms - CapAdd strslice.StrSlice // List of kernel capabilities to add to the container - CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container - DNS []string `json:"Dns"` // List of DNS server to lookup - DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for - DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for - ExtraHosts []string // List of extra hosts - GroupAdd []string // List of additional groups that the container process will run as - IpcMode IpcMode // IPC namespace to use for the container - Cgroup CgroupSpec // Cgroup to use for the container - Links []string // List of links (in the name:alias form) - OomScoreAdj int // Container preference for OOM-killing - PidMode PidMode // PID namespace to use for the container - Privileged bool // Is the container in privileged mode - PublishAllPorts bool // Should docker publish all exposed port for the container - ReadonlyRootfs bool // Is the container root filesystem in read-only - SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux. - StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container. - Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container - UTSMode UTSMode // UTS namespace to use for the container - UsernsMode UsernsMode // The user namespace to use for the container - ShmSize int64 // Total shm memory usage - Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container - Runtime string `json:",omitempty"` // Runtime to use with this container - - // Applicable to Windows - ConsoleSize [2]uint // Initial console size (height,width) - Isolation Isolation // Isolation technology of the container (eg default, hyperv) - - // Contains container's resources (cgroups, ulimits) - Resources - - // Mounts specs used by the container - Mounts []mount.Mount `json:",omitempty"` - - // Run a custom init inside the container, if null, use the daemon's configured settings - Init *bool `json:",omitempty"` - - // Custom init path - InitPath string `json:",omitempty"` -} 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 deleted file mode 100644 index 9fb79bed..00000000 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig_unix.go +++ /dev/null @@ -1,81 +0,0 @@ -// +build !windows - -package container - -import "strings" - -// IsValid indicates if an isolation technology is valid -func (i Isolation) IsValid() bool { - return i.IsDefault() -} - -// IsPrivate indicates whether container uses its private network stack. -func (n NetworkMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) -} - -// IsDefault indicates whether container uses the default network stack. -func (n NetworkMode) IsDefault() bool { - return n == "default" -} - -// NetworkName returns the name of the network stack. -func (n NetworkMode) NetworkName() string { - if n.IsBridge() { - return "bridge" - } else if n.IsHost() { - return "host" - } else if n.IsContainer() { - return "container" - } else if n.IsNone() { - return "none" - } else if n.IsDefault() { - return "default" - } else if n.IsUserDefined() { - return n.UserDefined() - } - return "" -} - -// IsBridge indicates whether container uses the bridge network stack -func (n NetworkMode) IsBridge() bool { - return n == "bridge" -} - -// IsHost indicates whether container uses the host network stack. -func (n NetworkMode) IsHost() bool { - return n == "host" -} - -// IsContainer indicates whether container uses a container network stack. -func (n NetworkMode) IsContainer() bool { - parts := strings.SplitN(string(n), ":", 2) - return len(parts) > 1 && parts[0] == "container" -} - -// IsNone indicates whether container isn't using a network stack. -func (n NetworkMode) IsNone() bool { - return n == "none" -} - -// ConnectedContainer is the id of the container which network this container is connected to. -func (n NetworkMode) ConnectedContainer() string { - parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { - return parts[1] - } - return "" -} - -// IsUserDefined indicates user-created network -func (n NetworkMode) IsUserDefined() bool { - return !n.IsDefault() && !n.IsBridge() && !n.IsHost() && !n.IsNone() && !n.IsContainer() -} - -//UserDefined indicates user-created network -func (n NetworkMode) UserDefined() string { - if n.IsUserDefined() { - return string(n) - } - return "" -} 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 deleted file mode 100644 index 0ee332ba..00000000 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go +++ /dev/null @@ -1,87 +0,0 @@ -package container - -import ( - "strings" -) - -// IsDefault indicates whether container uses the default network stack. -func (n NetworkMode) IsDefault() bool { - return n == "default" -} - -// IsNone indicates whether container isn't using a network stack. -func (n NetworkMode) IsNone() bool { - return n == "none" -} - -// IsContainer indicates whether container uses a container network stack. -// Returns false as windows doesn't support this mode -func (n NetworkMode) IsContainer() bool { - return false -} - -// 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" -} - -// IsHost indicates whether container uses the host network stack. -// returns false as this is not supported by windows -func (n NetworkMode) IsHost() bool { - return false -} - -// IsPrivate indicates whether container uses its private network stack. -func (n NetworkMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) -} - -// ConnectedContainer is the id of the container which network this container is connected to. -// Returns blank string on windows -func (n NetworkMode) ConnectedContainer() string { - return "" -} - -// IsUserDefined indicates user-created network -func (n NetworkMode) IsUserDefined() bool { - return !n.IsDefault() && !n.IsNone() && !n.IsBridge() -} - -// IsHyperV indicates the use of a Hyper-V partition for isolation -func (i Isolation) IsHyperV() bool { - return strings.ToLower(string(i)) == "hyperv" -} - -// IsProcess indicates the use of process isolation -func (i Isolation) IsProcess() bool { - return strings.ToLower(string(i)) == "process" -} - -// IsValid indicates if an isolation technology is valid -func (i Isolation) IsValid() bool { - return i.IsDefault() || i.IsHyperV() || i.IsProcess() -} - -// NetworkName returns the name of the network stack. -func (n NetworkMode) NetworkName() string { - if n.IsDefault() { - return "default" - } else if n.IsBridge() { - return "nat" - } else if n.IsNone() { - return "none" - } else if n.IsUserDefined() { - return n.UserDefined() - } - - return "" -} - -//UserDefined indicates user-created network -func (n NetworkMode) UserDefined() string { - if n.IsUserDefined() { - return string(n) - } - return "" -} diff --git a/vendor/github.com/docker/docker/api/types/error_response.go b/vendor/github.com/docker/docker/api/types/error_response.go deleted file mode 100644 index dc942d9d..00000000 --- a/vendor/github.com/docker/docker/api/types/error_response.go +++ /dev/null @@ -1,13 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// ErrorResponse Represents an error. -// swagger:model ErrorResponse -type ErrorResponse struct { - - // The error message. - // Required: true - Message string `json:"message"` -} diff --git a/vendor/github.com/docker/docker/api/types/events/events.go b/vendor/github.com/docker/docker/api/types/events/events.go deleted file mode 100644 index 7129a65a..00000000 --- a/vendor/github.com/docker/docker/api/types/events/events.go +++ /dev/null @@ -1,42 +0,0 @@ -package events - -const ( - // ContainerEventType is the event type that containers generate - ContainerEventType = "container" - // DaemonEventType is the event type that daemon generate - DaemonEventType = "daemon" - // ImageEventType is the event type that images generate - ImageEventType = "image" - // NetworkEventType is the event type that networks generate - NetworkEventType = "network" - // PluginEventType is the event type that plugins generate - PluginEventType = "plugin" - // VolumeEventType is the event type that volumes generate - VolumeEventType = "volume" -) - -// Actor describes something that generates events, -// like a container, or a network, or a volume. -// It has a defined name and a set or attributes. -// The container attributes are its labels, other actors -// can generate these attributes from other properties. -type Actor struct { - ID string - Attributes map[string]string -} - -// Message represents the information an event contains -type Message struct { - // Deprecated information from JSONMessage. - // With data only in container events. - Status string `json:"status,omitempty"` - ID string `json:"id,omitempty"` - From string `json:"from,omitempty"` - - Type string - Action string - Actor Actor - - Time int64 `json:"time,omitempty"` - TimeNano int64 `json:"timeNano,omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go deleted file mode 100644 index e01a41de..00000000 --- a/vendor/github.com/docker/docker/api/types/filters/parse.go +++ /dev/null @@ -1,310 +0,0 @@ -// Package filters provides helper function to parse and handle command line -// filter, used for example in docker ps or docker images commands. -package filters - -import ( - "encoding/json" - "errors" - "fmt" - "regexp" - "strings" - - "github.com/docker/docker/api/types/versions" -) - -// Args stores filter arguments as map key:{map key: bool}. -// It contains an aggregation of the map of arguments (which are in the form -// of -f 'key=value') based on the key, and stores values for the same key -// in a map with string keys and boolean values. -// e.g given -f 'label=label1=1' -f 'label=label2=2' -f 'image.name=ubuntu' -// the args will be {"image.name":{"ubuntu":true},"label":{"label1=1":true,"label2=2":true}} -type Args struct { - fields map[string]map[string]bool -} - -// NewArgs initializes a new Args struct. -func NewArgs() Args { - return Args{fields: map[string]map[string]bool{}} -} - -// ParseFlag parses the argument to the filter flag. Like -// -// `docker ps -f 'created=today' -f 'image.name=ubuntu*'` -// -// If prev map is provided, then it is appended to, and returned. By default a new -// map is created. -func ParseFlag(arg string, prev Args) (Args, error) { - filters := prev - if len(arg) == 0 { - return filters, nil - } - - if !strings.Contains(arg, "=") { - return filters, ErrBadFormat - } - - f := strings.SplitN(arg, "=", 2) - - name := strings.ToLower(strings.TrimSpace(f[0])) - value := strings.TrimSpace(f[1]) - - filters.Add(name, value) - - return filters, nil -} - -// ErrBadFormat is an error returned in case of bad format for a filter. -var ErrBadFormat = errors.New("bad format of filter (expected name=value)") - -// ToParam packs the Args into a string for easy transport from client to server. -func ToParam(a Args) (string, error) { - // this way we don't URL encode {}, just empty space - if a.Len() == 0 { - return "", nil - } - - buf, err := json.Marshal(a.fields) - if err != nil { - return "", err - } - return string(buf), nil -} - -// ToParamWithVersion packs the Args into a string for easy transport from client to server. -// The generated string will depend on the specified version (corresponding to the API version). -func ToParamWithVersion(version string, a Args) (string, error) { - // this way we don't URL encode {}, just empty space - if a.Len() == 0 { - return "", nil - } - - // for daemons older than v1.10, filter must be of the form map[string][]string - buf := []byte{} - err := errors.New("") - if version != "" && versions.LessThan(version, "1.22") { - buf, err = json.Marshal(convertArgsToSlice(a.fields)) - } else { - buf, err = json.Marshal(a.fields) - } - if err != nil { - return "", err - } - return string(buf), nil -} - -// FromParam unpacks the filter Args. -func FromParam(p string) (Args, error) { - if len(p) == 0 { - return NewArgs(), nil - } - - r := strings.NewReader(p) - d := json.NewDecoder(r) - - m := map[string]map[string]bool{} - if err := d.Decode(&m); err != nil { - r.Seek(0, 0) - - // Allow parsing old arguments in slice format. - // Because other libraries might be sending them in this format. - deprecated := map[string][]string{} - if deprecatedErr := d.Decode(&deprecated); deprecatedErr == nil { - m = deprecatedArgs(deprecated) - } else { - return NewArgs(), err - } - } - return Args{m}, nil -} - -// Get returns the list of values associates with a field. -// It returns a slice of strings to keep backwards compatibility with old code. -func (filters Args) Get(field string) []string { - values := filters.fields[field] - if values == nil { - return make([]string, 0) - } - slice := make([]string, 0, len(values)) - for key := range values { - slice = append(slice, key) - } - return slice -} - -// Add adds a new value to a filter field. -func (filters Args) Add(name, value string) { - if _, ok := filters.fields[name]; ok { - filters.fields[name][value] = true - } else { - filters.fields[name] = map[string]bool{value: true} - } -} - -// Del removes a value from a filter field. -func (filters Args) Del(name, value string) { - if _, ok := filters.fields[name]; ok { - delete(filters.fields[name], value) - if len(filters.fields[name]) == 0 { - delete(filters.fields, name) - } - } -} - -// Len returns the number of fields in the arguments. -func (filters Args) Len() int { - return len(filters.fields) -} - -// MatchKVList returns true if the values for the specified field matches the ones -// from the sources. -// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, -// field is 'label' and sources are {'label1': '1', 'label2': '2'} -// it returns true. -func (filters Args) MatchKVList(field string, sources map[string]string) bool { - fieldValues := filters.fields[field] - - //do not filter if there is no filter set or cannot determine filter - if len(fieldValues) == 0 { - return true - } - - if len(sources) == 0 { - return false - } - - for name2match := range fieldValues { - testKV := strings.SplitN(name2match, "=", 2) - - v, ok := sources[testKV[0]] - if !ok { - return false - } - if len(testKV) == 2 && testKV[1] != v { - return false - } - } - - return true -} - -// Match returns true if the values for the specified field matches the source string -// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, -// field is 'image.name' and source is 'ubuntu' -// it returns true. -func (filters Args) Match(field, source string) bool { - if filters.ExactMatch(field, source) { - return true - } - - fieldValues := filters.fields[field] - for name2match := range fieldValues { - match, err := regexp.MatchString(name2match, source) - if err != nil { - continue - } - if match { - return true - } - } - return false -} - -// ExactMatch returns true if the source matches exactly one of the filters. -func (filters Args) ExactMatch(field, source string) bool { - fieldValues, ok := filters.fields[field] - //do not filter if there is no filter set or cannot determine filter - if !ok || len(fieldValues) == 0 { - return true - } - - // try to match full name value to avoid O(N) regular expression matching - return fieldValues[source] -} - -// UniqueExactMatch returns true if there is only one filter and the source matches exactly this one. -func (filters Args) UniqueExactMatch(field, source string) bool { - fieldValues := filters.fields[field] - //do not filter if there is no filter set or cannot determine filter - if len(fieldValues) == 0 { - return true - } - if len(filters.fields[field]) != 1 { - return false - } - - // try to match full name value to avoid O(N) regular expression matching - return fieldValues[source] -} - -// FuzzyMatch returns true if the source matches exactly one of the filters, -// or the source has one of the filters as a prefix. -func (filters Args) FuzzyMatch(field, source string) bool { - if filters.ExactMatch(field, source) { - return true - } - - fieldValues := filters.fields[field] - for prefix := range fieldValues { - if strings.HasPrefix(source, prefix) { - return true - } - } - return false -} - -// Include returns true if the name of the field to filter is in the filters. -func (filters Args) Include(field string) bool { - _, ok := filters.fields[field] - return ok -} - -// Validate ensures that all the fields in the filter are valid. -// It returns an error as soon as it finds an invalid field. -func (filters Args) Validate(accepted map[string]bool) error { - for name := range filters.fields { - if !accepted[name] { - return fmt.Errorf("Invalid filter '%s'", name) - } - } - return nil -} - -// WalkValues iterates over the list of filtered values for a field. -// It stops the iteration if it finds an error and it returns that error. -func (filters Args) WalkValues(field string, op func(value string) error) error { - if _, ok := filters.fields[field]; !ok { - return nil - } - for v := range filters.fields[field] { - if err := op(v); err != nil { - return err - } - } - return nil -} - -func deprecatedArgs(d map[string][]string) map[string]map[string]bool { - m := map[string]map[string]bool{} - for k, v := range d { - values := map[string]bool{} - for _, vv := range v { - values[vv] = true - } - m[k] = values - } - return m -} - -func convertArgsToSlice(f map[string]map[string]bool) map[string][]string { - m := map[string][]string{} - for k, v := range f { - values := []string{} - for kk := range v { - if v[kk] { - values = append(values, kk) - } - } - m[k] = values - } - return m -} diff --git a/vendor/github.com/docker/docker/api/types/id_response.go b/vendor/github.com/docker/docker/api/types/id_response.go deleted file mode 100644 index 7592d2f8..00000000 --- a/vendor/github.com/docker/docker/api/types/id_response.go +++ /dev/null @@ -1,13 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// IDResponse Response to an API call that returns just an Id -// swagger:model IdResponse -type IDResponse struct { - - // The id of the newly created object. - // Required: true - ID string `json:"Id"` -} diff --git a/vendor/github.com/docker/docker/api/types/image_summary.go b/vendor/github.com/docker/docker/api/types/image_summary.go deleted file mode 100644 index e145b3dc..00000000 --- a/vendor/github.com/docker/docker/api/types/image_summary.go +++ /dev/null @@ -1,49 +0,0 @@ -package types - -// 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 { - - // containers - // Required: true - Containers int64 `json:"Containers"` - - // created - // Required: true - Created int64 `json:"Created"` - - // Id - // Required: true - ID string `json:"Id"` - - // labels - // Required: true - Labels map[string]string `json:"Labels"` - - // parent Id - // Required: true - ParentID string `json:"ParentId"` - - // repo digests - // Required: true - RepoDigests []string `json:"RepoDigests"` - - // repo tags - // Required: true - RepoTags []string `json:"RepoTags"` - - // shared size - // Required: true - SharedSize int64 `json:"SharedSize"` - - // size - // Required: true - Size int64 `json:"Size"` - - // virtual size - // Required: true - VirtualSize int64 `json:"VirtualSize"` -} diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go deleted file mode 100644 index 31f2365b..00000000 --- a/vendor/github.com/docker/docker/api/types/mount/mount.go +++ /dev/null @@ -1,113 +0,0 @@ -package mount - -import ( - "os" -) - -// Type represents the type of a mount. -type Type string - -// Type constants -const ( - // TypeBind is the type for mounting host dir - TypeBind Type = "bind" - // TypeVolume is the type for remote storage volumes - TypeVolume Type = "volume" - // TypeTmpfs is the type for mounting tmpfs - TypeTmpfs Type = "tmpfs" -) - -// Mount represents a mount (volume). -type Mount struct { - Type Type `json:",omitempty"` - // Source specifies the name of the mount. Depending on mount type, this - // may be a volume name or a host path, or even ignored. - // Source is not supported for tmpfs (must be an empty value) - Source string `json:",omitempty"` - Target string `json:",omitempty"` - ReadOnly bool `json:",omitempty"` - - BindOptions *BindOptions `json:",omitempty"` - VolumeOptions *VolumeOptions `json:",omitempty"` - TmpfsOptions *TmpfsOptions `json:",omitempty"` -} - -// Propagation represents the propagation of a mount. -type Propagation string - -const ( - // PropagationRPrivate RPRIVATE - PropagationRPrivate Propagation = "rprivate" - // PropagationPrivate PRIVATE - PropagationPrivate Propagation = "private" - // PropagationRShared RSHARED - PropagationRShared Propagation = "rshared" - // PropagationShared SHARED - PropagationShared Propagation = "shared" - // PropagationRSlave RSLAVE - PropagationRSlave Propagation = "rslave" - // PropagationSlave SLAVE - PropagationSlave Propagation = "slave" -) - -// Propagations is the list of all valid mount propagations -var Propagations = []Propagation{ - PropagationRPrivate, - PropagationPrivate, - PropagationRShared, - PropagationShared, - PropagationRSlave, - PropagationSlave, -} - -// BindOptions defines options specific to mounts of type "bind". -type BindOptions struct { - Propagation Propagation `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"` - DriverConfig *Driver `json:",omitempty"` -} - -// Driver represents a volume driver. -type Driver struct { - Name string `json:",omitempty"` - Options map[string]string `json:",omitempty"` -} - -// TmpfsOptions defines options specific to mounts of type "tmpfs". -type TmpfsOptions struct { - // Size sets the size of the tmpfs, in bytes. - // - // This will be converted to an operating system specific value - // depending on the host. For example, on linux, it will be convered to - // use a 'k', 'm' or 'g' syntax. BSD, though not widely supported with - // docker, uses a straight byte value. - // - // Percentages are not supported. - SizeBytes int64 `json:",omitempty"` - // Mode of the tmpfs upon creation - Mode os.FileMode `json:",omitempty"` - - // TODO(stevvooe): There are several more tmpfs flags, specified in the - // daemon, that are accepted. Only the most basic are added for now. - // - // From docker/docker/pkg/mount/flags.go: - // - // var validFlags = map[string]bool{ - // "": true, - // "size": true, X - // "mode": true, X - // "uid": true, - // "gid": true, - // "nr_inodes": true, - // "nr_blocks": true, - // "mpol": true, - // } - // - // Some of these may be straightforward to add, but others, such as - // uid/gid have implications in a clustered system. -} diff --git a/vendor/github.com/docker/docker/api/types/network/network.go b/vendor/github.com/docker/docker/api/types/network/network.go deleted file mode 100644 index 832b3edb..00000000 --- a/vendor/github.com/docker/docker/api/types/network/network.go +++ /dev/null @@ -1,59 +0,0 @@ -package network - -// 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"` -} - -// PeerInfo represents one peer of a 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 -} - -// 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 { - EndpointsConfig map[string]*EndpointSettings // Endpoint configs for each connecting network -} diff --git a/vendor/github.com/docker/docker/api/types/plugin.go b/vendor/github.com/docker/docker/api/types/plugin.go deleted file mode 100644 index 6cc7a23b..00000000 --- a/vendor/github.com/docker/docker/api/types/plugin.go +++ /dev/null @@ -1,189 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// Plugin A plugin for the Engine API -// swagger:model Plugin -type Plugin struct { - - // config - // Required: true - Config PluginConfig `json:"Config"` - - // True when the plugin is running. False when the plugin is not running, only installed. - // Required: true - Enabled bool `json:"Enabled"` - - // Id - ID string `json:"Id,omitempty"` - - // name - // Required: true - Name string `json:"Name"` - - // plugin remote reference used to push/pull the plugin - PluginReference string `json:"PluginReference,omitempty"` - - // settings - // Required: true - Settings PluginSettings `json:"Settings"` -} - -// PluginConfig The config of a plugin. -// swagger:model PluginConfig -type PluginConfig struct { - - // args - // Required: true - Args PluginConfigArgs `json:"Args"` - - // description - // Required: true - Description string `json:"Description"` - - // documentation - // Required: true - Documentation string `json:"Documentation"` - - // entrypoint - // Required: true - Entrypoint []string `json:"Entrypoint"` - - // env - // Required: true - Env []PluginEnv `json:"Env"` - - // interface - // Required: true - Interface PluginConfigInterface `json:"Interface"` - - // linux - // Required: true - Linux PluginConfigLinux `json:"Linux"` - - // mounts - // Required: true - Mounts []PluginMount `json:"Mounts"` - - // network - // Required: true - Network PluginConfigNetwork `json:"Network"` - - // propagated mount - // Required: true - PropagatedMount string `json:"PropagatedMount"` - - // user - User PluginConfigUser `json:"User,omitempty"` - - // work dir - // Required: true - WorkDir string `json:"WorkDir"` - - // rootfs - Rootfs *PluginConfigRootfs `json:"rootfs,omitempty"` -} - -// PluginConfigArgs plugin config args -// swagger:model PluginConfigArgs -type PluginConfigArgs struct { - - // description - // Required: true - Description string `json:"Description"` - - // name - // Required: true - Name string `json:"Name"` - - // settable - // Required: true - Settable []string `json:"Settable"` - - // value - // Required: true - Value []string `json:"Value"` -} - -// PluginConfigInterface The interface between Docker and the plugin -// swagger:model PluginConfigInterface -type PluginConfigInterface struct { - - // socket - // Required: true - Socket string `json:"Socket"` - - // types - // Required: true - Types []PluginInterfaceType `json:"Types"` -} - -// PluginConfigLinux plugin config linux -// swagger:model PluginConfigLinux -type PluginConfigLinux struct { - - // allow all devices - // Required: true - AllowAllDevices bool `json:"AllowAllDevices"` - - // capabilities - // Required: true - Capabilities []string `json:"Capabilities"` - - // devices - // Required: true - Devices []PluginDevice `json:"Devices"` -} - -// PluginConfigNetwork plugin config network -// swagger:model PluginConfigNetwork -type PluginConfigNetwork struct { - - // type - // Required: true - Type string `json:"Type"` -} - -// PluginConfigRootfs plugin config rootfs -// swagger:model PluginConfigRootfs -type PluginConfigRootfs struct { - - // diff ids - DiffIds []string `json:"diff_ids"` - - // type - Type string `json:"type,omitempty"` -} - -// PluginConfigUser plugin config user -// swagger:model PluginConfigUser -type PluginConfigUser struct { - - // g ID - GID uint32 `json:"GID,omitempty"` - - // UID - UID uint32 `json:"UID,omitempty"` -} - -// PluginSettings Settings that can be modified by users. -// swagger:model PluginSettings -type PluginSettings struct { - - // args - // Required: true - Args []string `json:"Args"` - - // devices - // Required: true - Devices []PluginDevice `json:"Devices"` - - // env - // Required: true - Env []string `json:"Env"` - - // mounts - // Required: true - Mounts []PluginMount `json:"Mounts"` -} diff --git a/vendor/github.com/docker/docker/api/types/plugin_device.go b/vendor/github.com/docker/docker/api/types/plugin_device.go deleted file mode 100644 index 56990106..00000000 --- a/vendor/github.com/docker/docker/api/types/plugin_device.go +++ /dev/null @@ -1,25 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// PluginDevice plugin device -// swagger:model PluginDevice -type PluginDevice struct { - - // description - // Required: true - Description string `json:"Description"` - - // name - // Required: true - Name string `json:"Name"` - - // path - // Required: true - Path *string `json:"Path"` - - // settable - // Required: true - Settable []string `json:"Settable"` -} diff --git a/vendor/github.com/docker/docker/api/types/plugin_env.go b/vendor/github.com/docker/docker/api/types/plugin_env.go deleted file mode 100644 index 32962dc2..00000000 --- a/vendor/github.com/docker/docker/api/types/plugin_env.go +++ /dev/null @@ -1,25 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// PluginEnv plugin env -// swagger:model PluginEnv -type PluginEnv struct { - - // description - // Required: true - Description string `json:"Description"` - - // name - // Required: true - Name string `json:"Name"` - - // settable - // Required: true - Settable []string `json:"Settable"` - - // value - // Required: true - Value *string `json:"Value"` -} diff --git a/vendor/github.com/docker/docker/api/types/plugin_interface_type.go b/vendor/github.com/docker/docker/api/types/plugin_interface_type.go deleted file mode 100644 index c82f204e..00000000 --- a/vendor/github.com/docker/docker/api/types/plugin_interface_type.go +++ /dev/null @@ -1,21 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// PluginInterfaceType plugin interface type -// swagger:model PluginInterfaceType -type PluginInterfaceType struct { - - // capability - // Required: true - Capability string `json:"Capability"` - - // prefix - // Required: true - Prefix string `json:"Prefix"` - - // version - // Required: true - Version string `json:"Version"` -} diff --git a/vendor/github.com/docker/docker/api/types/plugin_mount.go b/vendor/github.com/docker/docker/api/types/plugin_mount.go deleted file mode 100644 index 5c031cf8..00000000 --- a/vendor/github.com/docker/docker/api/types/plugin_mount.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// PluginMount plugin mount -// swagger:model PluginMount -type PluginMount struct { - - // description - // Required: true - Description string `json:"Description"` - - // destination - // Required: true - Destination string `json:"Destination"` - - // name - // Required: true - Name string `json:"Name"` - - // options - // Required: true - Options []string `json:"Options"` - - // settable - // Required: true - Settable []string `json:"Settable"` - - // source - // Required: true - Source *string `json:"Source"` - - // type - // Required: true - Type string `json:"Type"` -} diff --git a/vendor/github.com/docker/docker/api/types/plugin_responses.go b/vendor/github.com/docker/docker/api/types/plugin_responses.go deleted file mode 100644 index d6f75531..00000000 --- a/vendor/github.com/docker/docker/api/types/plugin_responses.go +++ /dev/null @@ -1,64 +0,0 @@ -package types - -import ( - "encoding/json" - "fmt" -) - -// PluginsListResponse contains the response for the Engine API -type PluginsListResponse []*Plugin - -const ( - authzDriver = "AuthzDriver" - graphDriver = "GraphDriver" - ipamDriver = "IpamDriver" - networkDriver = "NetworkDriver" - volumeDriver = "VolumeDriver" -) - -// UnmarshalJSON implements json.Unmarshaler for PluginInterfaceType -func (t *PluginInterfaceType) UnmarshalJSON(p []byte) error { - versionIndex := len(p) - prefixIndex := 0 - if len(p) < 2 || p[0] != '"' || p[len(p)-1] != '"' { - return fmt.Errorf("%q is not a plugin interface type", p) - } - p = p[1 : len(p)-1] -loop: - for i, b := range p { - switch b { - case '.': - prefixIndex = i - case '/': - versionIndex = i - break loop - } - } - t.Prefix = string(p[:prefixIndex]) - t.Capability = string(p[prefixIndex+1 : versionIndex]) - if versionIndex < len(p) { - t.Version = string(p[versionIndex+1:]) - } - return nil -} - -// MarshalJSON implements json.Marshaler for PluginInterfaceType -func (t *PluginInterfaceType) MarshalJSON() ([]byte, error) { - return json.Marshal(t.String()) -} - -// String implements fmt.Stringer for PluginInterfaceType -func (t PluginInterfaceType) String() string { - return fmt.Sprintf("%s.%s/%s", t.Prefix, t.Capability, t.Version) -} - -// PluginPrivilege describes a permission the user has to accept -// upon installing a plugin. -type PluginPrivilege struct { - Name string - Description string - Value []string -} - -// PluginPrivileges is a list of PluginPrivilege -type PluginPrivileges []PluginPrivilege diff --git a/vendor/github.com/docker/docker/api/types/port.go b/vendor/github.com/docker/docker/api/types/port.go deleted file mode 100644 index ad52d46d..00000000 --- a/vendor/github.com/docker/docker/api/types/port.go +++ /dev/null @@ -1,23 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// Port An open port on a container -// swagger:model Port -type Port struct { - - // IP - IP string `json:"IP,omitempty"` - - // Port on the container - // Required: true - PrivatePort uint16 `json:"PrivatePort"` - - // Port exposed on the host - PublicPort uint16 `json:"PublicPort,omitempty"` - - // type - // Required: true - Type string `json:"Type"` -} diff --git a/vendor/github.com/docker/docker/api/types/reference/image_reference.go b/vendor/github.com/docker/docker/api/types/reference/image_reference.go deleted file mode 100644 index be9cf8eb..00000000 --- a/vendor/github.com/docker/docker/api/types/reference/image_reference.go +++ /dev/null @@ -1,34 +0,0 @@ -package reference - -import ( - distreference "github.com/docker/distribution/reference" -) - -// Parse parses the given references and returns the repository and -// tag (if present) from it. If there is an error during parsing, it will -// return an error. -func Parse(ref string) (string, string, error) { - distributionRef, err := distreference.ParseNamed(ref) - if err != nil { - return "", "", err - } - - tag := GetTagFromNamedRef(distributionRef) - return distributionRef.Name(), tag, nil -} - -// GetTagFromNamedRef returns a tag from the specified reference. -// This function is necessary as long as the docker "server" api makes the distinction between repository -// and tags. -func GetTagFromNamedRef(ref distreference.Named) string { - var tag string - switch x := ref.(type) { - case distreference.Digested: - tag = x.Digest().String() - case distreference.NamedTagged: - tag = x.Tag() - default: - tag = "latest" - } - return tag -} diff --git a/vendor/github.com/docker/docker/api/types/registry/authenticate.go b/vendor/github.com/docker/docker/api/types/registry/authenticate.go deleted file mode 100644 index 5e37d19b..00000000 --- a/vendor/github.com/docker/docker/api/types/registry/authenticate.go +++ /dev/null @@ -1,21 +0,0 @@ -package registry - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -// AuthenticateOKBody authenticate o k body -// swagger:model AuthenticateOKBody -type AuthenticateOKBody struct { - - // An opaque token used to authenticate a user after a successful login - // Required: true - IdentityToken string `json:"IdentityToken"` - - // The status of the authentication - // Required: true - Status string `json:"Status"` -} diff --git a/vendor/github.com/docker/docker/api/types/registry/registry.go b/vendor/github.com/docker/docker/api/types/registry/registry.go deleted file mode 100644 index 28fafab9..00000000 --- a/vendor/github.com/docker/docker/api/types/registry/registry.go +++ /dev/null @@ -1,104 +0,0 @@ -package registry - -import ( - "encoding/json" - "net" -) - -// ServiceConfig stores daemon registry services configuration. -type ServiceConfig struct { - InsecureRegistryCIDRs []*NetIPNet `json:"InsecureRegistryCIDRs"` - IndexConfigs map[string]*IndexInfo `json:"IndexConfigs"` - Mirrors []string -} - -// NetIPNet is the net.IPNet type, which can be marshalled and -// unmarshalled to JSON -type NetIPNet net.IPNet - -// String returns the CIDR notation of ipnet -func (ipnet *NetIPNet) String() string { - return (*net.IPNet)(ipnet).String() -} - -// MarshalJSON returns the JSON representation of the IPNet -func (ipnet *NetIPNet) MarshalJSON() ([]byte, error) { - return json.Marshal((*net.IPNet)(ipnet).String()) -} - -// UnmarshalJSON sets the IPNet from a byte array of JSON -func (ipnet *NetIPNet) UnmarshalJSON(b []byte) (err error) { - var ipnetStr string - if err = json.Unmarshal(b, &ipnetStr); err == nil { - var cidr *net.IPNet - if _, cidr, err = net.ParseCIDR(ipnetStr); err == nil { - *ipnet = NetIPNet(*cidr) - } - } - return -} - -// IndexInfo contains information about a registry -// -// RepositoryInfo Examples: -// { -// "Index" : { -// "Name" : "docker.io", -// "Mirrors" : ["https://registry-2.docker.io/v1/", "https://registry-3.docker.io/v1/"], -// "Secure" : true, -// "Official" : true, -// }, -// "RemoteName" : "library/debian", -// "LocalName" : "debian", -// "CanonicalName" : "docker.io/debian" -// "Official" : true, -// } -// -// { -// "Index" : { -// "Name" : "127.0.0.1:5000", -// "Mirrors" : [], -// "Secure" : false, -// "Official" : false, -// }, -// "RemoteName" : "user/repo", -// "LocalName" : "127.0.0.1:5000/user/repo", -// "CanonicalName" : "127.0.0.1:5000/user/repo", -// "Official" : false, -// } -type IndexInfo struct { - // Name is the name of the registry, such as "docker.io" - Name string - // Mirrors is a list of mirrors, expressed as URIs - Mirrors []string - // Secure is set to false if the registry is part of the list of - // insecure registries. Insecure registries accept HTTP and/or accept - // HTTPS with certificates from unknown CAs. - Secure bool - // Official indicates whether this is an official registry - Official bool -} - -// SearchResult describes a search result returned from a registry -type SearchResult struct { - // StarCount indicates the number of stars this repository has - StarCount int `json:"star_count"` - // IsOfficial is true if the result is from an official repository. - IsOfficial bool `json:"is_official"` - // Name is the name of the repository - Name string `json:"name"` - // IsAutomated indicates whether the result is automated - IsAutomated bool `json:"is_automated"` - // Description is a textual description of the repository - Description string `json:"description"` -} - -// SearchResults lists a collection search results returned from a registry -type SearchResults struct { - // Query contains the query string that generated the search results - Query string `json:"query"` - // NumResults indicates the number of results the query returned - NumResults int `json:"num_results"` - // Results is a slice containing the actual results for the search - Results []SearchResult `json:"results"` -} diff --git a/vendor/github.com/docker/docker/api/types/seccomp.go b/vendor/github.com/docker/docker/api/types/seccomp.go deleted file mode 100644 index 4f02ef36..00000000 --- a/vendor/github.com/docker/docker/api/types/seccomp.go +++ /dev/null @@ -1,93 +0,0 @@ -package types - -// Seccomp represents the config for a seccomp profile for syscall restriction. -type Seccomp struct { - DefaultAction Action `json:"defaultAction"` - // Architectures is kept to maintain backward compatibility with the old - // seccomp profile. - Architectures []Arch `json:"architectures,omitempty"` - ArchMap []Architecture `json:"archMap,omitempty"` - Syscalls []*Syscall `json:"syscalls"` -} - -// Architecture is used to represent an specific architecture -// and its sub-architectures -type Architecture struct { - Arch Arch `json:"architecture"` - SubArches []Arch `json:"subArchitectures"` -} - -// Arch used for architectures -type Arch string - -// Additional architectures permitted to be used for system calls -// By default only the native architecture of the kernel is permitted -const ( - ArchX86 Arch = "SCMP_ARCH_X86" - ArchX86_64 Arch = "SCMP_ARCH_X86_64" - ArchX32 Arch = "SCMP_ARCH_X32" - ArchARM Arch = "SCMP_ARCH_ARM" - ArchAARCH64 Arch = "SCMP_ARCH_AARCH64" - ArchMIPS Arch = "SCMP_ARCH_MIPS" - ArchMIPS64 Arch = "SCMP_ARCH_MIPS64" - ArchMIPS64N32 Arch = "SCMP_ARCH_MIPS64N32" - ArchMIPSEL Arch = "SCMP_ARCH_MIPSEL" - ArchMIPSEL64 Arch = "SCMP_ARCH_MIPSEL64" - ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32" - ArchPPC Arch = "SCMP_ARCH_PPC" - ArchPPC64 Arch = "SCMP_ARCH_PPC64" - ArchPPC64LE Arch = "SCMP_ARCH_PPC64LE" - ArchS390 Arch = "SCMP_ARCH_S390" - ArchS390X Arch = "SCMP_ARCH_S390X" -) - -// Action taken upon Seccomp rule match -type Action string - -// Define actions for Seccomp rules -const ( - ActKill Action = "SCMP_ACT_KILL" - ActTrap Action = "SCMP_ACT_TRAP" - ActErrno Action = "SCMP_ACT_ERRNO" - ActTrace Action = "SCMP_ACT_TRACE" - ActAllow Action = "SCMP_ACT_ALLOW" -) - -// Operator used to match syscall arguments in Seccomp -type Operator string - -// Define operators for syscall arguments in Seccomp -const ( - OpNotEqual Operator = "SCMP_CMP_NE" - OpLessThan Operator = "SCMP_CMP_LT" - OpLessEqual Operator = "SCMP_CMP_LE" - OpEqualTo Operator = "SCMP_CMP_EQ" - OpGreaterEqual Operator = "SCMP_CMP_GE" - OpGreaterThan Operator = "SCMP_CMP_GT" - OpMaskedEqual Operator = "SCMP_CMP_MASKED_EQ" -) - -// Arg used for matching specific syscall arguments in Seccomp -type Arg struct { - Index uint `json:"index"` - Value uint64 `json:"value"` - ValueTwo uint64 `json:"valueTwo"` - Op Operator `json:"op"` -} - -// Filter is used to conditionally apply Seccomp rules -type Filter struct { - Caps []string `json:"caps,omitempty"` - Arches []string `json:"arches,omitempty"` -} - -// Syscall is used to match a group of syscalls in Seccomp -type Syscall struct { - Name string `json:"name,omitempty"` - Names []string `json:"names,omitempty"` - Action Action `json:"action"` - Args []*Arg `json:"args"` - Comment string `json:"comment"` - Includes Filter `json:"includes"` - Excludes Filter `json:"excludes"` -} diff --git a/vendor/github.com/docker/docker/api/types/service_update_response.go b/vendor/github.com/docker/docker/api/types/service_update_response.go deleted file mode 100644 index 74ea64b1..00000000 --- a/vendor/github.com/docker/docker/api/types/service_update_response.go +++ /dev/null @@ -1,12 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// ServiceUpdateResponse service update response -// swagger:model ServiceUpdateResponse -type ServiceUpdateResponse struct { - - // Optional warning messages - Warnings []string `json:"Warnings"` -} diff --git a/vendor/github.com/docker/docker/api/types/stats.go b/vendor/github.com/docker/docker/api/types/stats.go deleted file mode 100644 index 9bf1928b..00000000 --- a/vendor/github.com/docker/docker/api/types/stats.go +++ /dev/null @@ -1,178 +0,0 @@ -// Package types is used for API stability in the types and response to the -// consumers of the API stats endpoint. -package types - -import "time" - -// ThrottlingData stores CPU throttling stats of one running container. -// Not used on Windows. -type ThrottlingData struct { - // Number of periods with throttling active - Periods uint64 `json:"periods"` - // Number of periods when the container hits its throttling limit. - ThrottledPeriods uint64 `json:"throttled_periods"` - // Aggregate time the container was throttled for in nanoseconds. - ThrottledTime uint64 `json:"throttled_time"` -} - -// CPUUsage stores All CPU stats aggregated since container inception. -type CPUUsage struct { - // Total CPU time consumed. - // Units: nanoseconds (Linux) - // Units: 100's of nanoseconds (Windows) - TotalUsage uint64 `json:"total_usage"` - - // Total CPU time consumed per core (Linux). Not used on Windows. - // Units: nanoseconds. - PercpuUsage []uint64 `json:"percpu_usage,omitempty"` - - // Time spent by tasks of the cgroup in kernel mode (Linux). - // Time spent by all container processes in kernel mode (Windows). - // Units: nanoseconds (Linux). - // Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers. - UsageInKernelmode uint64 `json:"usage_in_kernelmode"` - - // Time spent by tasks of the cgroup in user mode (Linux). - // Time spent by all container processes in user mode (Windows). - // Units: nanoseconds (Linux). - // Units: 100's of nanoseconds (Windows). Not populated for Hyper-V Containers - UsageInUsermode uint64 `json:"usage_in_usermode"` -} - -// CPUStats aggregates and wraps all CPU related info of container -type CPUStats struct { - // CPU Usage. Linux and Windows. - CPUUsage CPUUsage `json:"cpu_usage"` - - // System Usage. Linux only. - SystemUsage uint64 `json:"system_cpu_usage,omitempty"` - - // Throttling Data. Linux only. - ThrottlingData ThrottlingData `json:"throttling_data,omitempty"` -} - -// MemoryStats aggregates all memory stats since container inception on Linux. -// Windows returns stats for commit and private working set only. -type MemoryStats struct { - // Linux Memory Stats - - // current res_counter usage for memory - Usage uint64 `json:"usage,omitempty"` - // maximum usage ever recorded. - MaxUsage uint64 `json:"max_usage,omitempty"` - // TODO(vishh): Export these as stronger types. - // all the stats exported via memory.stat. - Stats map[string]uint64 `json:"stats,omitempty"` - // number of times memory usage hits limits. - Failcnt uint64 `json:"failcnt,omitempty"` - Limit uint64 `json:"limit,omitempty"` - - // Windows Memory Stats - // See https://technet.microsoft.com/en-us/magazine/ff382715.aspx - - // committed bytes - Commit uint64 `json:"commitbytes,omitempty"` - // peak committed bytes - CommitPeak uint64 `json:"commitpeakbytes,omitempty"` - // private working set - PrivateWorkingSet uint64 `json:"privateworkingset,omitempty"` -} - -// BlkioStatEntry is one small entity to store a piece of Blkio stats -// Not used on Windows. -type BlkioStatEntry struct { - Major uint64 `json:"major"` - Minor uint64 `json:"minor"` - Op string `json:"op"` - Value uint64 `json:"value"` -} - -// BlkioStats stores All IO service stats for data read and write. -// This is a Linux specific structure as the differences between expressing -// block I/O on Windows and Linux are sufficiently significant to make -// little sense attempting to morph into a combined structure. -type BlkioStats struct { - // number of bytes transferred to and from the block device - IoServiceBytesRecursive []BlkioStatEntry `json:"io_service_bytes_recursive"` - IoServicedRecursive []BlkioStatEntry `json:"io_serviced_recursive"` - IoQueuedRecursive []BlkioStatEntry `json:"io_queue_recursive"` - IoServiceTimeRecursive []BlkioStatEntry `json:"io_service_time_recursive"` - IoWaitTimeRecursive []BlkioStatEntry `json:"io_wait_time_recursive"` - IoMergedRecursive []BlkioStatEntry `json:"io_merged_recursive"` - IoTimeRecursive []BlkioStatEntry `json:"io_time_recursive"` - SectorsRecursive []BlkioStatEntry `json:"sectors_recursive"` -} - -// StorageStats is the disk I/O stats for read/write on Windows. -type StorageStats struct { - ReadCountNormalized uint64 `json:"read_count_normalized,omitempty"` - ReadSizeBytes uint64 `json:"read_size_bytes,omitempty"` - WriteCountNormalized uint64 `json:"write_count_normalized,omitempty"` - WriteSizeBytes uint64 `json:"write_size_bytes,omitempty"` -} - -// NetworkStats aggregates the network stats of one container -type NetworkStats struct { - // Bytes received. Windows and Linux. - RxBytes uint64 `json:"rx_bytes"` - // Packets received. Windows and Linux. - RxPackets uint64 `json:"rx_packets"` - // Received errors. Not used on Windows. Note that we dont `omitempty` this - // field as it is expected in the >=v1.21 API stats structure. - RxErrors uint64 `json:"rx_errors"` - // Incoming packets dropped. Windows and Linux. - RxDropped uint64 `json:"rx_dropped"` - // Bytes sent. Windows and Linux. - TxBytes uint64 `json:"tx_bytes"` - // Packets sent. Windows and Linux. - TxPackets uint64 `json:"tx_packets"` - // Sent errors. Not used on Windows. Note that we dont `omitempty` this - // field as it is expected in the >=v1.21 API stats structure. - TxErrors uint64 `json:"tx_errors"` - // Outgoing packets dropped. Windows and Linux. - TxDropped uint64 `json:"tx_dropped"` - // Endpoint ID. Not used on Linux. - EndpointID string `json:"endpoint_id,omitempty"` - // Instance ID. Not used on Linux. - InstanceID string `json:"instance_id,omitempty"` -} - -// PidsStats contains the stats of a container's pids -type PidsStats struct { - // Current is the number of pids in the cgroup - Current uint64 `json:"current,omitempty"` - // Limit is the hard limit on the number of pids in the cgroup. - // A "Limit" of 0 means that there is no limit. - Limit uint64 `json:"limit,omitempty"` -} - -// Stats is Ultimate struct aggregating all types of stats of one container -type Stats struct { - // Common stats - Read time.Time `json:"read"` - PreRead time.Time `json:"preread"` - - // Linux specific stats, not populated on Windows. - PidsStats PidsStats `json:"pids_stats,omitempty"` - BlkioStats BlkioStats `json:"blkio_stats,omitempty"` - - // Windows specific stats, not populated on Linux. - NumProcs uint32 `json:"num_procs"` - StorageStats StorageStats `json:"storage_stats,omitempty"` - - // Shared stats - CPUStats CPUStats `json:"cpu_stats,omitempty"` - PreCPUStats CPUStats `json:"precpu_stats,omitempty"` // "Pre"="Previous" - MemoryStats MemoryStats `json:"memory_stats,omitempty"` -} - -// StatsJSON is newly used Networks -type StatsJSON struct { - Stats - - Name string `json:"name,omitempty"` - ID string `json:"id,omitempty"` - - // Networks request version >=1.21 - Networks map[string]NetworkStats `json:"networks,omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/strslice/strslice.go b/vendor/github.com/docker/docker/api/types/strslice/strslice.go deleted file mode 100644 index bad493fb..00000000 --- a/vendor/github.com/docker/docker/api/types/strslice/strslice.go +++ /dev/null @@ -1,30 +0,0 @@ -package strslice - -import "encoding/json" - -// StrSlice represents a string or an array of strings. -// We need to override the json decoder to accept both options. -type StrSlice []string - -// UnmarshalJSON decodes the byte slice whether it's a string or an array of -// strings. This method is needed to implement json.Unmarshaler. -func (e *StrSlice) UnmarshalJSON(b []byte) error { - if len(b) == 0 { - // With no input, we preserve the existing value by returning nil and - // leaving the target alone. This allows defining default values for - // the type. - return nil - } - - p := make([]string, 0, 1) - if err := json.Unmarshal(b, &p); err != nil { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - p = append(p, s) - } - - *e = p - return nil -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/common.go b/vendor/github.com/docker/docker/api/types/swarm/common.go deleted file mode 100644 index 64a648ba..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/common.go +++ /dev/null @@ -1,27 +0,0 @@ -package swarm - -import "time" - -// Version represents the internal object version. -type Version struct { - Index uint64 `json:",omitempty"` -} - -// Meta is a base object inherited by most of the other once. -type Meta struct { - Version Version `json:",omitempty"` - CreatedAt time.Time `json:",omitempty"` - UpdatedAt time.Time `json:",omitempty"` -} - -// Annotations represents how to describe an object. -type Annotations struct { - Name string `json:",omitempty"` - Labels map[string]string `json:",omitempty"` -} - -// Driver represents a driver (network, logging). -type Driver struct { - Name string `json:",omitempty"` - Options map[string]string `json:",omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/container.go b/vendor/github.com/docker/docker/api/types/swarm/container.go deleted file mode 100644 index 4ab476cc..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/container.go +++ /dev/null @@ -1,46 +0,0 @@ -package swarm - -import ( - "time" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/mount" -) - -// DNSConfig specifies DNS related configurations in resolver configuration file (resolv.conf) -// Detailed documentation is available in: -// http://man7.org/linux/man-pages/man5/resolv.conf.5.html -// `nameserver`, `search`, `options` have been supported. -// TODO: `domain` is not supported yet. -type DNSConfig struct { - // Nameservers specifies the IP addresses of the name servers - Nameservers []string `json:",omitempty"` - // Search specifies the search list for host-name lookup - Search []string `json:",omitempty"` - // Options allows certain internal resolver variables to be modified - Options []string `json:",omitempty"` -} - -// ContainerSpec represents the spec of a container. -type ContainerSpec struct { - Image string `json:",omitempty"` - Labels map[string]string `json:",omitempty"` - Command []string `json:",omitempty"` - Args []string `json:",omitempty"` - Hostname string `json:",omitempty"` - Env []string `json:",omitempty"` - Dir string `json:",omitempty"` - User string `json:",omitempty"` - Groups []string `json:",omitempty"` - TTY bool `json:",omitempty"` - OpenStdin bool `json:",omitempty"` - Mounts []mount.Mount `json:",omitempty"` - StopGracePeriod *time.Duration `json:",omitempty"` - Healthcheck *container.HealthConfig `json:",omitempty"` - // The format of extra hosts on swarmkit is specified in: - // http://man7.org/linux/man-pages/man5/hosts.5.html - // IP_address canonical_hostname [aliases...] - Hosts []string `json:",omitempty"` - DNSConfig *DNSConfig `json:",omitempty"` - Secrets []*SecretReference `json:",omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/network.go b/vendor/github.com/docker/docker/api/types/swarm/network.go deleted file mode 100644 index 5a5e11bd..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/network.go +++ /dev/null @@ -1,111 +0,0 @@ -package swarm - -// Endpoint represents an endpoint. -type Endpoint struct { - Spec EndpointSpec `json:",omitempty"` - Ports []PortConfig `json:",omitempty"` - VirtualIPs []EndpointVirtualIP `json:",omitempty"` -} - -// EndpointSpec represents the spec of an endpoint. -type EndpointSpec struct { - Mode ResolutionMode `json:",omitempty"` - Ports []PortConfig `json:",omitempty"` -} - -// ResolutionMode represents a resolution mode. -type ResolutionMode string - -const ( - // ResolutionModeVIP VIP - ResolutionModeVIP ResolutionMode = "vip" - // ResolutionModeDNSRR DNSRR - ResolutionModeDNSRR ResolutionMode = "dnsrr" -) - -// PortConfig represents the config of a port. -type PortConfig struct { - Name string `json:",omitempty"` - Protocol PortConfigProtocol `json:",omitempty"` - // TargetPort is the port inside the container - TargetPort uint32 `json:",omitempty"` - // PublishedPort is the port on the swarm hosts - PublishedPort uint32 `json:",omitempty"` - // PublishMode is the mode in which port is published - PublishMode PortConfigPublishMode `json:",omitempty"` -} - -// PortConfigPublishMode represents the mode in which the port is to -// be published. -type PortConfigPublishMode string - -const ( - // PortConfigPublishModeIngress is used for ports published - // for ingress load balancing using routing mesh. - PortConfigPublishModeIngress PortConfigPublishMode = "ingress" - // PortConfigPublishModeHost is used for ports published - // for direct host level access on the host where the task is running. - PortConfigPublishModeHost PortConfigPublishMode = "host" -) - -// PortConfigProtocol represents the protocol of a port. -type PortConfigProtocol string - -const ( - // TODO(stevvooe): These should be used generally, not just for PortConfig. - - // PortConfigProtocolTCP TCP - PortConfigProtocolTCP PortConfigProtocol = "tcp" - // PortConfigProtocolUDP UDP - PortConfigProtocolUDP PortConfigProtocol = "udp" -) - -// EndpointVirtualIP represents the virtual ip of a port. -type EndpointVirtualIP struct { - NetworkID string `json:",omitempty"` - Addr string `json:",omitempty"` -} - -// Network represents a network. -type Network struct { - ID string - Meta - Spec NetworkSpec `json:",omitempty"` - DriverState Driver `json:",omitempty"` - IPAMOptions *IPAMOptions `json:",omitempty"` -} - -// NetworkSpec represents the spec of a network. -type NetworkSpec struct { - Annotations - DriverConfiguration *Driver `json:",omitempty"` - IPv6Enabled bool `json:",omitempty"` - Internal bool `json:",omitempty"` - Attachable bool `json:",omitempty"` - IPAMOptions *IPAMOptions `json:",omitempty"` -} - -// NetworkAttachmentConfig represents the configuration of a network attachment. -type NetworkAttachmentConfig struct { - Target string `json:",omitempty"` - Aliases []string `json:",omitempty"` -} - -// NetworkAttachment represents a network attachment. -type NetworkAttachment struct { - Network Network `json:",omitempty"` - Addresses []string `json:",omitempty"` -} - -// IPAMOptions represents ipam options. -type IPAMOptions struct { - Driver Driver `json:",omitempty"` - Configs []IPAMConfig `json:",omitempty"` -} - -// IPAMConfig represents ipam configuration. -type IPAMConfig struct { - Subnet string `json:",omitempty"` - Range string `json:",omitempty"` - Gateway string `json:",omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/node.go b/vendor/github.com/docker/docker/api/types/swarm/node.go deleted file mode 100644 index 379e17a7..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/node.go +++ /dev/null @@ -1,114 +0,0 @@ -package swarm - -// Node represents a node. -type Node struct { - ID string - Meta - // Spec defines the desired state of the node as specified by the user. - // The system will honor this and will *never* modify it. - Spec NodeSpec `json:",omitempty"` - // Description encapsulates the properties of the Node as reported by the - // agent. - Description NodeDescription `json:",omitempty"` - // Status provides the current status of the node, as seen by the manager. - Status NodeStatus `json:",omitempty"` - // ManagerStatus provides the current status of the node's manager - // component, if the node is a manager. - ManagerStatus *ManagerStatus `json:",omitempty"` -} - -// NodeSpec represents the spec of a node. -type NodeSpec struct { - Annotations - Role NodeRole `json:",omitempty"` - Availability NodeAvailability `json:",omitempty"` -} - -// NodeRole represents the role of a node. -type NodeRole string - -const ( - // NodeRoleWorker WORKER - NodeRoleWorker NodeRole = "worker" - // NodeRoleManager MANAGER - NodeRoleManager NodeRole = "manager" -) - -// NodeAvailability represents the availability of a node. -type NodeAvailability string - -const ( - // NodeAvailabilityActive ACTIVE - NodeAvailabilityActive NodeAvailability = "active" - // NodeAvailabilityPause PAUSE - NodeAvailabilityPause NodeAvailability = "pause" - // NodeAvailabilityDrain DRAIN - NodeAvailabilityDrain NodeAvailability = "drain" -) - -// NodeDescription represents the description of a node. -type NodeDescription struct { - Hostname string `json:",omitempty"` - Platform Platform `json:",omitempty"` - Resources Resources `json:",omitempty"` - Engine EngineDescription `json:",omitempty"` -} - -// Platform represents the platform (Arch/OS). -type Platform struct { - Architecture string `json:",omitempty"` - OS string `json:",omitempty"` -} - -// EngineDescription represents the description of an engine. -type EngineDescription struct { - EngineVersion string `json:",omitempty"` - Labels map[string]string `json:",omitempty"` - Plugins []PluginDescription `json:",omitempty"` -} - -// PluginDescription represents the description of an engine plugin. -type PluginDescription struct { - Type string `json:",omitempty"` - Name string `json:",omitempty"` -} - -// NodeStatus represents the status of a node. -type NodeStatus struct { - State NodeState `json:",omitempty"` - Message string `json:",omitempty"` - Addr string `json:",omitempty"` -} - -// Reachability represents the reachability of a node. -type Reachability string - -const ( - // ReachabilityUnknown UNKNOWN - ReachabilityUnknown Reachability = "unknown" - // ReachabilityUnreachable UNREACHABLE - ReachabilityUnreachable Reachability = "unreachable" - // ReachabilityReachable REACHABLE - ReachabilityReachable Reachability = "reachable" -) - -// ManagerStatus represents the status of a manager. -type ManagerStatus struct { - Leader bool `json:",omitempty"` - Reachability Reachability `json:",omitempty"` - Addr string `json:",omitempty"` -} - -// NodeState represents the state of a node. -type NodeState string - -const ( - // NodeStateUnknown UNKNOWN - NodeStateUnknown NodeState = "unknown" - // NodeStateDown DOWN - NodeStateDown NodeState = "down" - // NodeStateReady READY - NodeStateReady NodeState = "ready" - // NodeStateDisconnected DISCONNECTED - NodeStateDisconnected NodeState = "disconnected" -) diff --git a/vendor/github.com/docker/docker/api/types/swarm/secret.go b/vendor/github.com/docker/docker/api/types/swarm/secret.go deleted file mode 100644 index fdb23888..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/secret.go +++ /dev/null @@ -1,31 +0,0 @@ -package swarm - -import "os" - -// Secret represents a secret. -type Secret struct { - ID string - Meta - Spec SecretSpec -} - -// SecretSpec represents a secret specification from a secret in swarm -type SecretSpec struct { - Annotations - Data []byte `json:",omitempty"` -} - -// SecretReferenceFileTarget is a file target in a secret reference -type SecretReferenceFileTarget struct { - Name string - UID string - GID string - Mode os.FileMode -} - -// SecretReference is a reference to a secret in swarm -type SecretReference struct { - File *SecretReferenceFileTarget - SecretID string - SecretName string -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/service.go b/vendor/github.com/docker/docker/api/types/swarm/service.go deleted file mode 100644 index 2cf2642c..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/service.go +++ /dev/null @@ -1,105 +0,0 @@ -package swarm - -import "time" - -// Service represents a service. -type Service struct { - ID string - Meta - Spec ServiceSpec `json:",omitempty"` - PreviousSpec *ServiceSpec `json:",omitempty"` - Endpoint Endpoint `json:",omitempty"` - UpdateStatus UpdateStatus `json:",omitempty"` -} - -// ServiceSpec represents the spec of a service. -type ServiceSpec struct { - Annotations - - // TaskTemplate defines how the service should construct new tasks when - // orchestrating this service. - TaskTemplate TaskSpec `json:",omitempty"` - Mode ServiceMode `json:",omitempty"` - UpdateConfig *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 []NetworkAttachmentConfig `json:",omitempty"` - EndpointSpec *EndpointSpec `json:",omitempty"` -} - -// ServiceMode represents the mode of a service. -type ServiceMode struct { - Replicated *ReplicatedService `json:",omitempty"` - Global *GlobalService `json:",omitempty"` -} - -// UpdateState is the state of a service update. -type UpdateState string - -const ( - // UpdateStateUpdating is the updating state. - UpdateStateUpdating UpdateState = "updating" - // UpdateStatePaused is the paused state. - UpdateStatePaused UpdateState = "paused" - // UpdateStateCompleted is the completed state. - UpdateStateCompleted UpdateState = "completed" -) - -// UpdateStatus reports the status of a service update. -type UpdateStatus struct { - State UpdateState `json:",omitempty"` - StartedAt time.Time `json:",omitempty"` - CompletedAt time.Time `json:",omitempty"` - Message string `json:",omitempty"` -} - -// ReplicatedService is a kind of ServiceMode. -type ReplicatedService struct { - Replicas *uint64 `json:",omitempty"` -} - -// GlobalService is a kind of ServiceMode. -type GlobalService struct{} - -const ( - // UpdateFailureActionPause PAUSE - UpdateFailureActionPause = "pause" - // UpdateFailureActionContinue CONTINUE - UpdateFailureActionContinue = "continue" -) - -// UpdateConfig represents the update configuration. -type UpdateConfig struct { - // Maximum number of tasks to be updated in one iteration. - // 0 means unlimited parallelism. - Parallelism uint64 - - // Amount of time between updates. - Delay time.Duration `json:",omitempty"` - - // FailureAction is the action to take when an update failures. - FailureAction string `json:",omitempty"` - - // Monitor indicates how long to monitor a task for failure after it is - // created. If the task fails by ending up in one of the states - // REJECTED, COMPLETED, or FAILED, within Monitor from its creation, - // this counts as a failure. If it fails after Monitor, it does not - // count as a failure. If Monitor is unspecified, a default value will - // be used. - Monitor time.Duration `json:",omitempty"` - - // MaxFailureRatio is the fraction of tasks that may fail during - // an update before the failure action is invoked. Any task created by - // the current update which ends up in one of the states REJECTED, - // COMPLETED or FAILED within Monitor from its creation counts as a - // failure. The number of failures is divided by the number of tasks - // being updated, and if this fraction is greater than - // MaxFailureRatio, the failure action is invoked. - // - // If the failure action is CONTINUE, there is no effect. - // If the failure action is PAUSE, no more tasks will be updated until - // another update is started. - MaxFailureRatio float32 -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/swarm.go b/vendor/github.com/docker/docker/api/types/swarm/swarm.go deleted file mode 100644 index 0b422196..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/swarm.go +++ /dev/null @@ -1,197 +0,0 @@ -package swarm - -import "time" - -// ClusterInfo represents info about the cluster for outputing in "info" -// it contains the same information as "Swarm", but without the JoinTokens -type ClusterInfo struct { - ID string - Meta - Spec Spec -} - -// Swarm represents a swarm. -type Swarm struct { - ClusterInfo - JoinTokens JoinTokens -} - -// JoinTokens contains the tokens workers and managers need to join the swarm. -type JoinTokens struct { - // Worker is the join token workers may use to join the swarm. - Worker string - // Manager is the join token managers may use to join the swarm. - Manager string -} - -// Spec represents the spec of a swarm. -type Spec struct { - Annotations - - Orchestration OrchestrationConfig `json:",omitempty"` - Raft RaftConfig `json:",omitempty"` - Dispatcher DispatcherConfig `json:",omitempty"` - CAConfig CAConfig `json:",omitempty"` - TaskDefaults TaskDefaults `json:",omitempty"` - EncryptionConfig EncryptionConfig `json:",omitempty"` -} - -// OrchestrationConfig represents orchestration configuration. -type OrchestrationConfig struct { - // TaskHistoryRetentionLimit is the number of historic tasks to keep per instance or - // node. If negative, never remove completed or failed tasks. - TaskHistoryRetentionLimit *int64 `json:",omitempty"` -} - -// TaskDefaults parameterizes cluster-level task creation with default values. -type TaskDefaults struct { - // LogDriver selects the log driver to use for tasks created in the - // orchestrator if unspecified by a service. - // - // Updating this value will only have an affect on new tasks. Old tasks - // will continue use their previously configured log driver until - // recreated. - LogDriver *Driver `json:",omitempty"` -} - -// EncryptionConfig controls at-rest encryption of data and keys. -type EncryptionConfig struct { - // AutoLockManagers specifies whether or not managers TLS keys and raft data - // should be encrypted at rest in such a way that they must be unlocked - // before the manager node starts up again. - AutoLockManagers bool -} - -// RaftConfig represents raft configuration. -type RaftConfig struct { - // SnapshotInterval is the number of log entries between snapshots. - SnapshotInterval uint64 `json:",omitempty"` - - // KeepOldSnapshots is the number of snapshots to keep beyond the - // current snapshot. - KeepOldSnapshots *uint64 `json:",omitempty"` - - // LogEntriesForSlowFollowers is the number of log entries to keep - // around to sync up slow followers after a snapshot is created. - LogEntriesForSlowFollowers uint64 `json:",omitempty"` - - // ElectionTick is the number of ticks that a follower will wait for a message - // from the leader before becoming a candidate and starting an election. - // ElectionTick must be greater than HeartbeatTick. - // - // A tick currently defaults to one second, so these translate directly to - // seconds currently, but this is NOT guaranteed. - ElectionTick int - - // HeartbeatTick is the number of ticks between heartbeats. Every - // HeartbeatTick ticks, the leader will send a heartbeat to the - // followers. - // - // A tick currently defaults to one second, so these translate directly to - // seconds currently, but this is NOT guaranteed. - HeartbeatTick int -} - -// DispatcherConfig represents dispatcher configuration. -type DispatcherConfig struct { - // HeartbeatPeriod defines how often agent should send heartbeats to - // dispatcher. - HeartbeatPeriod time.Duration `json:",omitempty"` -} - -// CAConfig represents CA configuration. -type CAConfig struct { - // NodeCertExpiry is the duration certificates should be issued for - NodeCertExpiry time.Duration `json:",omitempty"` - - // ExternalCAs is a list of CAs to which a manager node will make - // certificate signing requests for node certificates. - ExternalCAs []*ExternalCA `json:",omitempty"` -} - -// ExternalCAProtocol represents type of external CA. -type ExternalCAProtocol string - -// ExternalCAProtocolCFSSL CFSSL -const ExternalCAProtocolCFSSL ExternalCAProtocol = "cfssl" - -// ExternalCA defines external CA to be used by the cluster. -type ExternalCA struct { - // Protocol is the protocol used by this external CA. - Protocol ExternalCAProtocol - - // URL is the URL where the external CA can be reached. - URL string - - // Options is a set of additional key/value pairs whose interpretation - // depends on the specified CA type. - Options map[string]string `json:",omitempty"` -} - -// InitRequest is the request used to init a swarm. -type InitRequest struct { - ListenAddr string - AdvertiseAddr string - ForceNewCluster bool - Spec Spec - AutoLockManagers bool -} - -// JoinRequest is the request used to join a swarm. -type JoinRequest struct { - ListenAddr string - AdvertiseAddr string - RemoteAddrs []string - JoinToken string // accept by secret -} - -// UnlockRequest is the request used to unlock a swarm. -type UnlockRequest struct { - // UnlockKey is the unlock key in ASCII-armored format. - UnlockKey string -} - -// LocalNodeState represents the state of the local node. -type LocalNodeState string - -const ( - // LocalNodeStateInactive INACTIVE - LocalNodeStateInactive LocalNodeState = "inactive" - // LocalNodeStatePending PENDING - LocalNodeStatePending LocalNodeState = "pending" - // LocalNodeStateActive ACTIVE - LocalNodeStateActive LocalNodeState = "active" - // LocalNodeStateError ERROR - LocalNodeStateError LocalNodeState = "error" - // LocalNodeStateLocked LOCKED - LocalNodeStateLocked LocalNodeState = "locked" -) - -// Info represents generic information about swarm. -type Info struct { - NodeID string - NodeAddr string - - LocalNodeState LocalNodeState - ControlAvailable bool - Error string - - RemoteManagers []Peer - Nodes int - Managers int - - Cluster ClusterInfo -} - -// Peer represents a peer. -type Peer struct { - NodeID string - Addr string -} - -// UpdateFlags contains flags for SwarmUpdate. -type UpdateFlags struct { - RotateWorkerToken bool - RotateManagerToken bool - RotateManagerUnlockKey bool -} diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go deleted file mode 100644 index ace12cc8..00000000 --- a/vendor/github.com/docker/docker/api/types/swarm/task.go +++ /dev/null @@ -1,128 +0,0 @@ -package swarm - -import "time" - -// TaskState represents the state of a task. -type TaskState string - -const ( - // TaskStateNew NEW - TaskStateNew TaskState = "new" - // TaskStateAllocated ALLOCATED - TaskStateAllocated TaskState = "allocated" - // TaskStatePending PENDING - TaskStatePending TaskState = "pending" - // TaskStateAssigned ASSIGNED - TaskStateAssigned TaskState = "assigned" - // TaskStateAccepted ACCEPTED - TaskStateAccepted TaskState = "accepted" - // TaskStatePreparing PREPARING - TaskStatePreparing TaskState = "preparing" - // TaskStateReady READY - TaskStateReady TaskState = "ready" - // TaskStateStarting STARTING - TaskStateStarting TaskState = "starting" - // TaskStateRunning RUNNING - TaskStateRunning TaskState = "running" - // TaskStateComplete COMPLETE - TaskStateComplete TaskState = "complete" - // TaskStateShutdown SHUTDOWN - TaskStateShutdown TaskState = "shutdown" - // TaskStateFailed FAILED - TaskStateFailed TaskState = "failed" - // TaskStateRejected REJECTED - TaskStateRejected TaskState = "rejected" -) - -// Task represents a task. -type Task struct { - ID string - Meta - Annotations - - Spec TaskSpec `json:",omitempty"` - ServiceID string `json:",omitempty"` - Slot int `json:",omitempty"` - NodeID string `json:",omitempty"` - Status TaskStatus `json:",omitempty"` - DesiredState TaskState `json:",omitempty"` - NetworksAttachments []NetworkAttachment `json:",omitempty"` -} - -// TaskSpec represents the spec of a task. -type TaskSpec struct { - ContainerSpec ContainerSpec `json:",omitempty"` - Resources *ResourceRequirements `json:",omitempty"` - RestartPolicy *RestartPolicy `json:",omitempty"` - Placement *Placement `json:",omitempty"` - Networks []NetworkAttachmentConfig `json:",omitempty"` - - // LogDriver specifies the LogDriver to use for tasks created from this - // spec. If not present, the one on cluster default on swarm.Spec will be - // used, finally falling back to the engine default if not specified. - LogDriver *Driver `json:",omitempty"` - - // ForceUpdate is a counter that triggers an update even if no relevant - // parameters have been changed. - ForceUpdate uint64 -} - -// Resources represents resources (CPU/Memory). -type Resources struct { - NanoCPUs int64 `json:",omitempty"` - MemoryBytes int64 `json:",omitempty"` -} - -// ResourceRequirements represents resources requirements. -type ResourceRequirements struct { - Limits *Resources `json:",omitempty"` - Reservations *Resources `json:",omitempty"` -} - -// Placement represents orchestration parameters. -type Placement struct { - Constraints []string `json:",omitempty"` -} - -// RestartPolicy represents the restart policy. -type RestartPolicy struct { - Condition RestartPolicyCondition `json:",omitempty"` - Delay *time.Duration `json:",omitempty"` - MaxAttempts *uint64 `json:",omitempty"` - Window *time.Duration `json:",omitempty"` -} - -// RestartPolicyCondition represents when to restart. -type RestartPolicyCondition string - -const ( - // RestartPolicyConditionNone NONE - RestartPolicyConditionNone RestartPolicyCondition = "none" - // RestartPolicyConditionOnFailure ON_FAILURE - RestartPolicyConditionOnFailure RestartPolicyCondition = "on-failure" - // RestartPolicyConditionAny ANY - RestartPolicyConditionAny RestartPolicyCondition = "any" -) - -// TaskStatus represents the status of a task. -type TaskStatus struct { - Timestamp time.Time `json:",omitempty"` - State TaskState `json:",omitempty"` - Message string `json:",omitempty"` - Err string `json:",omitempty"` - ContainerStatus ContainerStatus `json:",omitempty"` - PortStatus PortStatus `json:",omitempty"` -} - -// ContainerStatus represents the status of a container. -type ContainerStatus struct { - ContainerID string `json:",omitempty"` - PID int `json:",omitempty"` - ExitCode int `json:",omitempty"` -} - -// PortStatus represents the port status of a task's host ports whose -// service has published host ports -type PortStatus struct { - Ports []PortConfig `json:",omitempty"` -} diff --git a/vendor/github.com/docker/docker/api/types/time/duration_convert.go b/vendor/github.com/docker/docker/api/types/time/duration_convert.go deleted file mode 100644 index 63e1eec1..00000000 --- a/vendor/github.com/docker/docker/api/types/time/duration_convert.go +++ /dev/null @@ -1,12 +0,0 @@ -package time - -import ( - "strconv" - "time" -) - -// DurationToSecondsString converts the specified duration to the number -// seconds it represents, formatted as a string. -func DurationToSecondsString(duration time.Duration) string { - return strconv.FormatFloat(duration.Seconds(), 'f', 0, 64) -} diff --git a/vendor/github.com/docker/docker/api/types/time/timestamp.go b/vendor/github.com/docker/docker/api/types/time/timestamp.go deleted file mode 100644 index d3695ba7..00000000 --- a/vendor/github.com/docker/docker/api/types/time/timestamp.go +++ /dev/null @@ -1,124 +0,0 @@ -package time - -import ( - "fmt" - "math" - "strconv" - "strings" - "time" -) - -// These are additional predefined layouts for use in Time.Format and Time.Parse -// with --since and --until parameters for `docker logs` and `docker events` -const ( - rFC3339Local = "2006-01-02T15:04:05" // RFC3339 with local timezone - rFC3339NanoLocal = "2006-01-02T15:04:05.999999999" // RFC3339Nano with local timezone - dateWithZone = "2006-01-02Z07:00" // RFC3339 with time at 00:00:00 - dateLocal = "2006-01-02" // RFC3339 with local timezone and time at 00:00:00 -) - -// GetTimestamp tries to parse given string as golang duration, -// then RFC3339 time and finally as a Unix timestamp. If -// any of these were successful, it returns a Unix timestamp -// as string otherwise returns the given value back. -// In case of duration input, the returned timestamp is computed -// as the given reference time minus the amount of the duration. -func GetTimestamp(value string, reference time.Time) (string, error) { - if d, err := time.ParseDuration(value); value != "0" && err == nil { - return strconv.FormatInt(reference.Add(-d).Unix(), 10), nil - } - - var format string - var parseInLocation bool - - // if the string has a Z or a + or three dashes use parse otherwise use parseinlocation - parseInLocation = !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3) - - if strings.Contains(value, ".") { - if parseInLocation { - format = rFC3339NanoLocal - } else { - format = time.RFC3339Nano - } - } else if strings.Contains(value, "T") { - // we want the number of colons in the T portion of the timestamp - tcolons := strings.Count(value, ":") - // if parseInLocation is off and we have a +/- zone offset (not Z) then - // there will be an extra colon in the input for the tz offset subtract that - // colon from the tcolons count - if !parseInLocation && !strings.ContainsAny(value, "zZ") && tcolons > 0 { - tcolons-- - } - if parseInLocation { - switch tcolons { - case 0: - format = "2006-01-02T15" - case 1: - format = "2006-01-02T15:04" - default: - format = rFC3339Local - } - } else { - switch tcolons { - case 0: - format = "2006-01-02T15Z07:00" - case 1: - format = "2006-01-02T15:04Z07:00" - default: - format = time.RFC3339 - } - } - } else if parseInLocation { - format = dateLocal - } else { - format = dateWithZone - } - - var t time.Time - var err error - - if parseInLocation { - t, err = time.ParseInLocation(format, value, time.FixedZone(reference.Zone())) - } else { - t, err = time.Parse(format, value) - } - - if err != nil { - // if there is a `-` then its an RFC3339 like timestamp otherwise assume unixtimestamp - if strings.Contains(value, "-") { - return "", err // was probably an RFC3339 like timestamp but the parser failed with an error - } - return value, nil // unixtimestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server) - } - - return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil -} - -// ParseTimestamps returns seconds and nanoseconds from a timestamp that has the -// format "%d.%09d", time.Unix(), int64(time.Nanosecond())) -// if the incoming nanosecond portion is longer or shorter than 9 digits it is -// converted to nanoseconds. The expectation is that the seconds and -// seconds will be used to create a time variable. For example: -// seconds, nanoseconds, err := ParseTimestamp("1136073600.000000001",0) -// if err == nil since := time.Unix(seconds, nanoseconds) -// returns seconds as def(aultSeconds) if value == "" -func ParseTimestamps(value string, def int64) (int64, int64, error) { - if value == "" { - return def, 0, nil - } - sa := strings.SplitN(value, ".", 2) - s, err := strconv.ParseInt(sa[0], 10, 64) - if err != nil { - return s, 0, err - } - if len(sa) != 2 { - return s, 0, nil - } - n, err := strconv.ParseInt(sa[1], 10, 64) - if err != nil { - return s, n, err - } - // should already be in nanoseconds but just in case convert n to nanoseonds - n = int64(float64(n) * math.Pow(float64(10), float64(9-len(sa[1])))) - return s, n, nil -} diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go deleted file mode 100644 index a82c3e88..00000000 --- a/vendor/github.com/docker/docker/api/types/types.go +++ /dev/null @@ -1,549 +0,0 @@ -package 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/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/go-connections/nat" -) - -// ContainerChange contains response of Engine API: -// GET "/containers/{name:.*}/changes" -type ContainerChange struct { - Kind int - Path string -} - -// ImageHistory contains response of Engine API: -// GET "/images/{name:.*}/history" -type ImageHistory struct { - ID string `json:"Id"` - Created int64 - CreatedBy string - Tags []string - Size int64 - Comment string -} - -// ImageDelete contains response of Engine API: -// DELETE "/images/{name:.*}" -type ImageDelete struct { - Untagged string `json:",omitempty"` - Deleted string `json:",omitempty"` -} - -// GraphDriverData returns Image's graph driver config info -// when calling inspect command -type GraphDriverData struct { - Name string - Data map[string]string -} - -// RootFS returns Image's RootFS description including the layer IDs. -type RootFS struct { - Type string - Layers []string `json:",omitempty"` - BaseLayer string `json:",omitempty"` -} - -// ImageInspect contains response of Engine API: -// GET "/images/{name:.*}/json" -type ImageInspect struct { - ID string `json:"Id"` - RepoTags []string - RepoDigests []string - Parent string - Comment string - Created string - Container string - ContainerConfig *container.Config - DockerVersion string - Author string - Config *container.Config - Architecture string - Os string - OsVersion string `json:",omitempty"` - Size int64 - VirtualSize int64 - GraphDriver GraphDriverData - RootFS RootFS -} - -// Container contains response of Engine API: -// GET "/containers/json" -type Container struct { - ID string `json:"Id"` - Names []string - Image string - ImageID string - Command string - Created int64 - Ports []Port - SizeRw int64 `json:",omitempty"` - SizeRootFs int64 `json:",omitempty"` - Labels map[string]string - State string - Status string - HostConfig struct { - NetworkMode string `json:",omitempty"` - } - NetworkSettings *SummaryNetworkSettings - Mounts []MountPoint -} - -// CopyConfig contains request body of Engine API: -// POST "/containers/"+containerID+"/copy" -type CopyConfig struct { - Resource string -} - -// ContainerPathStat is used to encode the header from -// GET "/containers/{name:.*}/archive" -// "Name" is the file or directory name. -type ContainerPathStat struct { - Name string `json:"name"` - Size int64 `json:"size"` - Mode os.FileMode `json:"mode"` - Mtime time.Time `json:"mtime"` - LinkTarget string `json:"linkTarget"` -} - -// ContainerStats contains response of Engine API: -// GET "/stats" -type ContainerStats struct { - Body io.ReadCloser `json:"body"` - OSType string `json:"ostype"` -} - -// ContainerProcessList contains response of Engine API: -// GET "/containers/{name:.*}/top" -type ContainerProcessList struct { - Processes [][]string - Titles []string -} - -// Ping contains response of Engine API: -// GET "/_ping" -type Ping struct { - APIVersion string - Experimental bool -} - -// Version contains response of Engine API: -// GET "/version" -type Version struct { - Version string - APIVersion string `json:"ApiVersion"` - MinAPIVersion string `json:"MinAPIVersion,omitempty"` - GitCommit string - GoVersion string - Os string - Arch string - KernelVersion string `json:",omitempty"` - Experimental bool `json:",omitempty"` - BuildTime string `json:",omitempty"` -} - -// Commit records a external tool actual commit id version along the -// one expect by dockerd as set at build time -type Commit struct { - ID string - Expected string -} - -// 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 - Plugins PluginsInfo - MemoryLimit bool - SwapLimit bool - KernelMemory bool - CPUCfsPeriod bool `json:"CpuCfsPeriod"` - CPUCfsQuota bool `json:"CpuCfsQuota"` - CPUShares bool - CPUSet bool - IPv4Forwarding bool - BridgeNfIptables bool - BridgeNfIP6tables bool `json:"BridgeNfIp6tables"` - Debug bool - NFd int - OomKillDisable bool - NGoroutines int - SystemTime string - LoggingDriver string - CgroupDriver string - NEventsListener int - KernelVersion string - OperatingSystem string - OSType string - Architecture string - IndexServerAddress string - RegistryConfig *registry.ServiceConfig - NCPU int - MemTotal int64 - DockerRootDir string - HTTPProxy string `json:"HttpProxy"` - HTTPSProxy string `json:"HttpsProxy"` - NoProxy string - Name string - Labels []string - ExperimentalBuild bool - ServerVersion string - ClusterStore string - ClusterAdvertise 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 -} - -// KeyValue holds a key/value pair -type KeyValue struct { - Key, Value string -} - -// 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{} - split := strings.Split(opt, ",") - for _, s := range split { - kv := strings.SplitN(s, "=", 2) - if len(kv) != 2 { - return nil, fmt.Errorf("invalid security option %q", s) - } - if kv[0] == "" || kv[1] == "" { - return nil, errors.New("invalid empty security option") - } - if kv[0] == "name" { - secopt.Name = kv[1] - continue - } - secopt.Options = append(secopt.Options, KeyValue{Key: kv[0], Value: kv[1]}) - } - 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 -} - -// ExecStartCheck is a temp struct used by execStart -// Config fields is part of ExecConfig in runconfig package -type ExecStartCheck struct { - // ExecStart will first check if it's detached - Detach bool - // Check if there's a tty - Tty bool -} - -// HealthcheckResult stores information about a single run of a healthcheck probe -type HealthcheckResult struct { - Start time.Time // Start is the time this check started - End time.Time // End is the time this check ended - ExitCode int // ExitCode meanings: 0=healthy, 1=unhealthy, 2=reserved (considered unhealthy), else=error running probe - Output string // Output from last check -} - -// Health states -const ( - NoHealthcheck = "none" // Indicates there is no healthcheck - Starting = "starting" // Starting indicates that the container is not yet ready - Healthy = "healthy" // Healthy indicates that the container is running correctly - Unhealthy = "unhealthy" // Unhealthy indicates that the container has a problem -) - -// Health stores information about the container's healthcheck results -type Health struct { - Status string // Status is one of Starting, Healthy or Unhealthy - FailingStreak int // FailingStreak is the number of consecutive failures - Log []*HealthcheckResult // Log contains the last few results (oldest first) -} - -// ContainerState stores container's running state -// it's part of ContainerJSONBase and will return by "inspect" command -type ContainerState struct { - Status string - Running bool - Paused bool - Restarting bool - OOMKilled bool - Dead bool - Pid int - ExitCode int - Error string - StartedAt string - FinishedAt string - Health *Health `json:",omitempty"` -} - -// ContainerNode stores information about the node that a container -// is running on. It's only available in Docker Swarm -type ContainerNode struct { - ID string - IPAddress string `json:"IP"` - Addr string - Name string - Cpus int - Memory int64 - Labels map[string]string -} - -// ContainerJSONBase contains response of Engine API: -// GET "/containers/{name:.*}/json" -type ContainerJSONBase struct { - ID string `json:"Id"` - Created string - Path string - Args []string - State *ContainerState - Image string - ResolvConfPath string - HostnamePath string - HostsPath string - LogPath string - Node *ContainerNode `json:",omitempty"` - Name string - RestartCount int - Driver string - MountLabel string - ProcessLabel string - AppArmorProfile string - ExecIDs []string - HostConfig *container.HostConfig - GraphDriver GraphDriverData - SizeRw *int64 `json:",omitempty"` - SizeRootFs *int64 `json:",omitempty"` -} - -// ContainerJSON is newly used struct along with MountPoint -type ContainerJSON struct { - *ContainerJSONBase - Mounts []MountPoint - Config *container.Config - NetworkSettings *NetworkSettings -} - -// NetworkSettings exposes the network settings in the api -type NetworkSettings struct { - NetworkSettingsBase - DefaultNetworkSettings - Networks map[string]*network.EndpointSettings -} - -// SummaryNetworkSettings provides a summary of container's networks -// in /containers/json -type SummaryNetworkSettings struct { - Networks map[string]*network.EndpointSettings -} - -// NetworkSettingsBase holds basic information about networks -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 -} - -// DefaultNetworkSettings holds network information -// during the 2 release deprecation period. -// It will be removed in Docker 1.11. -type DefaultNetworkSettings struct { - EndpointID string // EndpointID uniquely represents a service endpoint in a Sandbox - Gateway string // Gateway holds the gateway address for the network - GlobalIPv6Address string // GlobalIPv6Address holds network's global IPv6 address - GlobalIPv6PrefixLen int // GlobalIPv6PrefixLen represents mask length of network's global IPv6 address - IPAddress string // IPAddress holds the IPv4 address for the network - IPPrefixLen int // IPPrefixLen represents mask length of network's IPv4 address - IPv6Gateway string // IPv6Gateway holds gateway address specific for IPv6 - MacAddress string // MacAddress holds the MAC address for the network -} - -// MountPoint represents a mount point configuration inside the container. -// This is used for reporting the mountpoints in use by a container. -type MountPoint struct { - Type mount.Type `json:",omitempty"` - Name string `json:",omitempty"` - Source string - Destination string - Driver string `json:",omitempty"` - Mode string - RW bool - Propagation mount.Propagation -} - -// NetworkResource is the body of the "get network" http response message -type NetworkResource struct { - Name string // Name is the requested name of the network - ID string `json:"Id"` // ID uniquely identifies a network on a single machine - Created time.Time // Created is the time the network created - Scope string // Scope describes the level at which the network exists (e.g. `global` for cluster-wide or `local` for machine level) - Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`) - EnableIPv6 bool // EnableIPv6 represents whether to enable IPv6 - IPAM network.IPAM // IPAM is the network's IP Address Management - Internal bool // Internal represents if the network is used internal only - Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode. - Containers map[string]EndpointResource // Containers contains endpoints belonging to the network - Options map[string]string // Options holds the network specific options to use for when creating the network - Labels map[string]string // Labels holds metadata specific to the network being created - Peers []network.PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network -} - -// EndpointResource contains network resources allocated and used for a container in a network -type EndpointResource struct { - Name string - EndpointID string - MacAddress string - IPv4Address string - IPv6Address string -} - -// NetworkCreate is the expected body of the "create network" http request message -type NetworkCreate struct { - CheckDuplicate bool - Driver string - EnableIPv6 bool - IPAM *network.IPAM - Internal bool - Attachable bool - Options map[string]string - Labels map[string]string -} - -// NetworkCreateRequest is the request message sent to the server for network create call. -type NetworkCreateRequest struct { - NetworkCreate - Name string -} - -// NetworkCreateResponse is the response message sent by the server for network create call -type NetworkCreateResponse struct { - ID string `json:"Id"` - Warning string -} - -// NetworkConnect represents the data to be used to connect a container to the network -type NetworkConnect struct { - Container string - EndpointConfig *network.EndpointSettings `json:",omitempty"` -} - -// NetworkDisconnect represents the data to be used to disconnect a container from the network -type NetworkDisconnect struct { - Container string - Force 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 { - Path string `json:"path"` - Args []string `json:"runtimeArgs,omitempty"` -} - -// DiskUsage contains response of Engine API: -// GET "/system/df" -type DiskUsage struct { - LayersSize int64 - Images []*ImageSummary - Containers []*Container - Volumes []*Volume -} - -// ContainersPruneReport contains the response for Engine API: -// POST "/containers/prune" -type ContainersPruneReport struct { - ContainersDeleted []string - SpaceReclaimed uint64 -} - -// VolumesPruneReport contains the response for Engine API: -// POST "/volumes/prune" -type VolumesPruneReport struct { - VolumesDeleted []string - SpaceReclaimed uint64 -} - -// ImagesPruneReport contains the response for Engine API: -// POST "/images/prune" -type ImagesPruneReport struct { - ImagesDeleted []ImageDelete - SpaceReclaimed uint64 -} - -// NetworksPruneReport contains the response for Engine API: -// POST "/networks/prune" -type NetworksPruneReport struct { - NetworksDeleted []string -} - -// SecretCreateResponse contains the information returned to a client -// on the creation of a new secret. -type SecretCreateResponse struct { - // ID is the id of the created secret. - ID string -} - -// SecretListOptions holds parameters to list secrets -type SecretListOptions struct { - Filters filters.Args -} 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 cdac50a5..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/versions/compare.go b/vendor/github.com/docker/docker/api/types/versions/compare.go deleted file mode 100644 index 611d4fed..00000000 --- a/vendor/github.com/docker/docker/api/types/versions/compare.go +++ /dev/null @@ -1,62 +0,0 @@ -package versions - -import ( - "strconv" - "strings" -) - -// compare compares two version strings -// returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise. -func compare(v1, v2 string) int { - var ( - currTab = strings.Split(v1, ".") - otherTab = strings.Split(v2, ".") - ) - - max := len(currTab) - if len(otherTab) > max { - max = len(otherTab) - } - for i := 0; i < max; i++ { - var currInt, otherInt int - - if len(currTab) > i { - currInt, _ = strconv.Atoi(currTab[i]) - } - if len(otherTab) > i { - otherInt, _ = strconv.Atoi(otherTab[i]) - } - if currInt > otherInt { - return 1 - } - if otherInt > currInt { - return -1 - } - } - return 0 -} - -// LessThan checks if a version is less than another -func LessThan(v, other string) bool { - return compare(v, other) == -1 -} - -// LessThanOrEqualTo checks if a version is less than or equal to another -func LessThanOrEqualTo(v, other string) bool { - return compare(v, other) <= 0 -} - -// GreaterThan checks if a version is greater than another -func GreaterThan(v, other string) bool { - return compare(v, other) == 1 -} - -// GreaterThanOrEqualTo checks if a version is greater than or equal to another -func GreaterThanOrEqualTo(v, other string) bool { - return compare(v, other) >= 0 -} - -// Equal checks if a version is equal to another -func Equal(v, other string) bool { - return compare(v, other) == 0 -} diff --git a/vendor/github.com/docker/docker/api/types/volume.go b/vendor/github.com/docker/docker/api/types/volume.go deleted file mode 100644 index da4f8ebd..00000000 --- a/vendor/github.com/docker/docker/api/types/volume.go +++ /dev/null @@ -1,58 +0,0 @@ -package types - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -// Volume volume -// swagger:model Volume -type Volume struct { - - // Name of the volume driver used by the volume. - // Required: true - Driver string `json:"Driver"` - - // User-defined key/value metadata. - // Required: true - Labels map[string]string `json:"Labels"` - - // Mount path of the volume on the host. - // Required: true - Mountpoint string `json:"Mountpoint"` - - // Name of the volume. - // Required: true - Name string `json:"Name"` - - // The driver specific options used when creating the volume. - // Required: true - Options map[string]string `json:"Options"` - - // The level at which the volume exists. Either `global` for cluster-wide, or `local` for machine level. - // Required: true - Scope string `json:"Scope"` - - // Low-level details about the volume, provided by the volume driver. - // Details are returned as a map with key/value pairs: - // `{"key":"value","key2":"value2"}`. - // - // The `Status` field is optional, and is omitted if the volume driver - // does not support this feature. - // - Status map[string]interface{} `json:"Status,omitempty"` - - // usage data - UsageData *VolumeUsageData `json:"UsageData,omitempty"` -} - -// VolumeUsageData volume usage data -// swagger:model VolumeUsageData -type VolumeUsageData struct { - - // The number of containers referencing this volume. - // Required: true - RefCount int64 `json:"RefCount"` - - // The disk space used by the volume (local driver only) - // Required: true - Size int64 `json:"Size"` -} diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go b/vendor/github.com/docker/docker/api/types/volume/volumes_create.go deleted file mode 100644 index 679c1600..00000000 --- a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go +++ /dev/null @@ -1,29 +0,0 @@ -package volume - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -// VolumesCreateBody volumes create body -// swagger:model VolumesCreateBody -type VolumesCreateBody struct { - - // Name of the volume driver to use. - // Required: true - Driver string `json:"Driver"` - - // A mapping of driver options and values. These options are passed directly to the driver and are driver specific. - // Required: true - DriverOpts map[string]string `json:"DriverOpts"` - - // User-defined key/value metadata. - // Required: true - Labels map[string]string `json:"Labels"` - - // The new volume's name. If not specified, Docker generates a name. - // Required: true - Name string `json:"Name"` -} diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go b/vendor/github.com/docker/docker/api/types/volume/volumes_list.go deleted file mode 100644 index 7770bcb8..00000000 --- a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go +++ /dev/null @@ -1,23 +0,0 @@ -package volume - -// ---------------------------------------------------------------------------- -// DO NOT EDIT THIS FILE -// This file was generated by `swagger generate operation` -// -// See hack/swagger-gen.sh -// ---------------------------------------------------------------------------- - -import "github.com/docker/docker/api/types" - -// VolumesListOKBody volumes list o k body -// swagger:model VolumesListOKBody -type VolumesListOKBody struct { - - // List of volumes - // Required: true - Volumes []*types.Volume `json:"Volumes"` - - // Warnings that occurred when fetching the list of volumes - // Required: true - Warnings []string `json:"Warnings"` -} diff --git a/vendor/github.com/docker/docker/client/README.md b/vendor/github.com/docker/docker/client/README.md deleted file mode 100644 index 059dfb3c..00000000 --- a/vendor/github.com/docker/docker/client/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# 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. - -For example, to list running containers (the equivalent of `docker ps`): - -```go -package main - -import ( - "context" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" -) - -func main() { - cli, err := client.NewEnvClient() - if err != nil { - panic(err) - } - - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) - if err != nil { - panic(err) - } - - for _, container := range containers { - fmt.Printf("%s %s\n", container.ID[:10], container.Image) - } -} -``` - -[Full documentation is available on GoDoc.](https://godoc.org/github.com/docker/docker/client) diff --git a/vendor/github.com/docker/docker/client/checkpoint_create.go b/vendor/github.com/docker/docker/client/checkpoint_create.go deleted file mode 100644 index 0effe498..00000000 --- a/vendor/github.com/docker/docker/client/checkpoint_create.go +++ /dev/null @@ -1,13 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// 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 { - 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 deleted file mode 100644 index e6e75588..00000000 --- a/vendor/github.com/docker/docker/client/checkpoint_delete.go +++ /dev/null @@ -1,20 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// 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 { - query := url.Values{} - if options.CheckpointDir != "" { - query.Set("dir", options.CheckpointDir) - } - - resp, err := cli.delete(ctx, "/containers/"+containerID+"/checkpoints/"+options.CheckpointID, query, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go deleted file mode 100644 index 8eb720a6..00000000 --- a/vendor/github.com/docker/docker/client/checkpoint_list.go +++ /dev/null @@ -1,28 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// CheckpointList returns the volumes configured in the docker host. -func (cli *Client) CheckpointList(ctx context.Context, container string, options types.CheckpointListOptions) ([]types.Checkpoint, error) { - var checkpoints []types.Checkpoint - - query := url.Values{} - if options.CheckpointDir != "" { - query.Set("dir", options.CheckpointDir) - } - - resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil) - if err != nil { - return checkpoints, err - } - - err = json.NewDecoder(resp.body).Decode(&checkpoints) - ensureReaderClosed(resp) - return checkpoints, err -} diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go deleted file mode 100644 index a9bdab6b..00000000 --- a/vendor/github.com/docker/docker/client/client.go +++ /dev/null @@ -1,246 +0,0 @@ -/* -Package client is a 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. - -For more information about the Engine API, see the documentation: -https://docs.docker.com/engine/reference/api/ - -Usage - -You use the library by creating a client object and calling methods on it. The -client can be created either from environment variables with NewEnvClient, or -configured manually with NewClient. - -For example, to list running containers (the equivalent of "docker ps"): - - package main - - import ( - "context" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - ) - - func main() { - cli, err := client.NewEnvClient() - if err != nil { - panic(err) - } - - containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) - if err != nil { - panic(err) - } - - for _, container := range containers { - fmt.Printf("%s %s\n", container.ID[:10], container.Image) - } - } - -*/ -package client - -import ( - "fmt" - "net/http" - "net/url" - "os" - "path/filepath" - "strings" - - "github.com/docker/go-connections/sockets" - "github.com/docker/go-connections/tlsconfig" -) - -// DefaultVersion is the version of the current stable API -const DefaultVersion string = "1.25" - -// Client is the API client that performs all operations -// against a docker server. -type Client struct { - // scheme sets the scheme for the client - scheme string - // host holds the server address to connect to - host string - // proto holds the client protocol i.e. unix. - proto string - // addr holds the client address. - addr string - // basePath holds the path to prepend to the requests. - basePath string - // client used to send and receive http requests. - client *http.Client - // version of the server to talk to. - version 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 -} - -// NewEnvClient initializes a new API client based on environment variables. -// Use DOCKER_HOST to set the url to the docker server. -// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. -// Use DOCKER_CERT_PATH to load the tls certificates from. -// Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. -func NewEnvClient() (*Client, error) { - var client *http.Client - if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" { - options := tlsconfig.Options{ - CAFile: filepath.Join(dockerCertPath, "ca.pem"), - CertFile: filepath.Join(dockerCertPath, "cert.pem"), - KeyFile: filepath.Join(dockerCertPath, "key.pem"), - InsecureSkipVerify: os.Getenv("DOCKER_TLS_VERIFY") == "", - } - tlsc, err := tlsconfig.Client(options) - if err != nil { - return nil, err - } - - client = &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: tlsc, - }, - } - } - - host := os.Getenv("DOCKER_HOST") - if host == "" { - host = DefaultDockerHost - } - version := os.Getenv("DOCKER_API_VERSION") - if version == "" { - version = DefaultVersion - } - - cli, err := NewClient(host, version, client, nil) - if err != nil { - return cli, err - } - if os.Getenv("DOCKER_API_VERSION") != "" { - cli.manualOverride = true - } - return cli, nil -} - -// NewClient initializes a new API client for the given host and API version. -// It uses the given http client as transport. -// It also initializes the custom http headers to add to each request. -// -// It won't send any version information if the version number is empty. It is -// highly recommended that you set a version or your client may break if the -// server is upgraded. -func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) { - proto, addr, basePath, err := ParseHost(host) - if err != nil { - return nil, err - } - - if client != nil { - if _, ok := client.Transport.(*http.Transport); !ok { - return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport) - } - } else { - transport := new(http.Transport) - sockets.ConfigureTransport(transport, proto, addr) - client = &http.Client{ - Transport: transport, - } - } - - scheme := "http" - tlsConfig := resolveTLSConfig(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. - scheme = "https" - } - - return &Client{ - scheme: scheme, - host: host, - proto: proto, - addr: addr, - basePath: basePath, - client: client, - version: version, - customHTTPHeaders: httpHeaders, - }, nil -} - -// Close ensures that transport.Client is closed -// especially needed while using NewClient with *http.Client = nil -// for example -// client.NewClient("unix:///var/run/docker.sock", nil, "v1.18", map[string]string{"User-Agent": "engine-api-cli-1.0"}) -func (cli *Client) Close() error { - - if t, ok := cli.client.Transport.(*http.Transport); ok { - t.CloseIdleConnections() - } - - return nil -} - -// 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(p string, query url.Values) string { - var apiPath string - if cli.version != "" { - v := strings.TrimPrefix(cli.version, "v") - apiPath = fmt.Sprintf("%s/v%s%s", cli.basePath, v, p) - } else { - apiPath = fmt.Sprintf("%s%s", cli.basePath, p) - } - - u := &url.URL{ - Path: apiPath, - } - if len(query) > 0 { - u.RawQuery = query.Encode() - } - return u.String() -} - -// ClientVersion returns the version string associated with this -// instance of the Client. Note that this value can be changed -// via the DOCKER_API_VERSION env var. -func (cli *Client) ClientVersion() string { - return cli.version -} - -// UpdateClientVersion updates the version string associated with this -// instance of the Client. -func (cli *Client) UpdateClientVersion(v string) { - if !cli.manualOverride { - cli.version = v - } - -} - -// ParseHost verifies that the given host strings is valid. -func ParseHost(host string) (string, string, string, error) { - protoAddrParts := strings.SplitN(host, "://", 2) - if len(protoAddrParts) == 1 { - return "", "", "", fmt.Errorf("unable to parse docker host `%s`", host) - } - - var basePath string - proto, addr := protoAddrParts[0], protoAddrParts[1] - if proto == "tcp" { - parsed, err := url.Parse("tcp://" + addr) - if err != nil { - return "", "", "", err - } - addr = parsed.Host - basePath = parsed.Path - } - return proto, addr, basePath, nil -} diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go deleted file mode 100644 index 89de892c..00000000 --- a/vendor/github.com/docker/docker/client/client_unix.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build linux freebsd solaris openbsd darwin - -package client - -// DefaultDockerHost defines os specific default if DOCKER_HOST is unset -const DefaultDockerHost = "unix:///var/run/docker.sock" diff --git a/vendor/github.com/docker/docker/client/client_windows.go b/vendor/github.com/docker/docker/client/client_windows.go deleted file mode 100644 index 07c0c7a7..00000000 --- a/vendor/github.com/docker/docker/client/client_windows.go +++ /dev/null @@ -1,4 +0,0 @@ -package client - -// DefaultDockerHost defines os specific default if DOCKER_HOST is unset -const DefaultDockerHost = "npipe:////./pipe/docker_engine" diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go deleted file mode 100644 index eea46821..00000000 --- a/vendor/github.com/docker/docker/client/container_attach.go +++ /dev/null @@ -1,37 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerAttach attaches a connection to a container in the server. -// It returns a types.HijackedConnection with the hijacked connection -// and the a reader to get output. It's up to the called to close -// the hijacked connection by calling types.HijackedResponse.Close. -func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) { - query := url.Values{} - if options.Stream { - query.Set("stream", "1") - } - if options.Stdin { - query.Set("stdin", "1") - } - if options.Stdout { - query.Set("stdout", "1") - } - if options.Stderr { - query.Set("stderr", "1") - } - if options.DetachKeys != "" { - query.Set("detachKeys", options.DetachKeys) - } - if options.Logs { - query.Set("logs", "1") - } - - headers := map[string][]string{"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 deleted file mode 100644 index c766d62e..00000000 --- a/vendor/github.com/docker/docker/client/container_commit.go +++ /dev/null @@ -1,53 +0,0 @@ -package client - -import ( - "encoding/json" - "errors" - "net/url" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/reference" - "golang.org/x/net/context" -) - -// ContainerCommit applies changes into a container and creates a new tagged image. -func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) { - var repository, tag string - if options.Reference != "" { - distributionRef, err := distreference.ParseNamed(options.Reference) - if err != nil { - return types.IDResponse{}, err - } - - if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { - return types.IDResponse{}, errors.New("refusing to create a tag with a digest reference") - } - - tag = reference.GetTagFromNamedRef(distributionRef) - repository = distributionRef.Name() - } - - query := url.Values{} - query.Set("container", container) - query.Set("repo", repository) - query.Set("tag", tag) - query.Set("comment", options.Comment) - query.Set("author", options.Author) - for _, change := range options.Changes { - query.Add("changes", change) - } - if options.Pause != true { - query.Set("pause", "0") - } - - var response types.IDResponse - resp, err := cli.post(ctx, "/commit", query, options.Config, nil) - if err != nil { - return response, err - } - - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go deleted file mode 100644 index 8380eeab..00000000 --- a/vendor/github.com/docker/docker/client/container_copy.go +++ /dev/null @@ -1,97 +0,0 @@ -package client - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "path/filepath" - "strings" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" -) - -// ContainerStatPath returns Stat information about a path inside the container filesystem. -func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) { - query := url.Values{} - query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. - - urlStr := fmt.Sprintf("/containers/%s/archive", containerID) - response, err := cli.head(ctx, urlStr, query, nil) - if err != nil { - return types.ContainerPathStat{}, err - } - defer ensureReaderClosed(response) - return getContainerPathStatFromHeader(response.header) -} - -// CopyToContainer copies content into the container filesystem. -func (cli *Client) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error { - query := url.Values{} - query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. - // Do not allow for an existing directory to be overwritten by a non-directory and vice versa. - if !options.AllowOverwriteDirWithFile { - query.Set("noOverwriteDirNonDir", "true") - } - - apiPath := fmt.Sprintf("/containers/%s/archive", container) - - response, err := cli.putRaw(ctx, apiPath, query, content, nil) - if err != nil { - return err - } - defer ensureReaderClosed(response) - - if response.statusCode != http.StatusOK { - return fmt.Errorf("unexpected status code from daemon: %d", response.statusCode) - } - - return nil -} - -// CopyFromContainer gets the content from the container and returns it as a Reader -// to manipulate it in the host. It's up to the caller to close the reader. -func (cli *Client) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { - query := make(url.Values, 1) - query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API. - - apiPath := fmt.Sprintf("/containers/%s/archive", container) - response, err := cli.get(ctx, apiPath, query, nil) - if err != nil { - return nil, types.ContainerPathStat{}, err - } - - if response.statusCode != http.StatusOK { - return nil, types.ContainerPathStat{}, fmt.Errorf("unexpected status code from daemon: %d", response.statusCode) - } - - // In order to get the copy behavior right, we need to know information - // about both the source and the destination. The response headers include - // stat info about the source that we can use in deciding exactly how to - // copy it locally. Along with the stat info about the local destination, - // we have everything we need to handle the multiple possibilities there - // can be when copying a file/dir from one location to another file/dir. - stat, err := getContainerPathStatFromHeader(response.header) - if err != nil { - return nil, stat, fmt.Errorf("unable to get resource stat from response: %s", err) - } - return response.body, stat, err -} - -func getContainerPathStatFromHeader(header http.Header) (types.ContainerPathStat, error) { - var stat types.ContainerPathStat - - encodedStat := header.Get("X-Docker-Container-Path-Stat") - statDecoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encodedStat)) - - err := json.NewDecoder(statDecoder).Decode(&stat) - if err != nil { - err = fmt.Errorf("unable to decode container path stat header: %s", err) - } - - return stat, err -} diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go deleted file mode 100644 index 9f627aaf..00000000 --- a/vendor/github.com/docker/docker/client/container_create.go +++ /dev/null @@ -1,50 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - "strings" - - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/network" - "golang.org/x/net/context" -) - -type configWrapper struct { - *container.Config - HostConfig *container.HostConfig - NetworkingConfig *network.NetworkingConfig -} - -// ContainerCreate creates a new container based in the given configuration. -// It can be associated with a name, but it's not mandatory. -func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) { - var response container.ContainerCreateCreatedBody - - if err := cli.NewVersionError("1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { - return response, err - } - - query := url.Values{} - if containerName != "" { - query.Set("name", containerName) - } - - body := configWrapper{ - Config: config, - HostConfig: hostConfig, - NetworkingConfig: networkingConfig, - } - - serverResp, err := cli.post(ctx, "/containers/create", query, body, nil) - if err != nil { - if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") { - return response, imageNotFoundError{config.Image} - } - return response, err - } - - err = json.NewDecoder(serverResp.body).Decode(&response) - ensureReaderClosed(serverResp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/container_diff.go b/vendor/github.com/docker/docker/client/container_diff.go deleted file mode 100644 index 1e3e554f..00000000 --- a/vendor/github.com/docker/docker/client/container_diff.go +++ /dev/null @@ -1,23 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerDiff shows differences in a container filesystem since it was started. -func (cli *Client) ContainerDiff(ctx context.Context, containerID string) ([]types.ContainerChange, error) { - var changes []types.ContainerChange - - serverResp, err := cli.get(ctx, "/containers/"+containerID+"/changes", url.Values{}, nil) - if err != nil { - return changes, err - } - - err = json.NewDecoder(serverResp.body).Decode(&changes) - ensureReaderClosed(serverResp) - return changes, err -} diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go deleted file mode 100644 index 0665c54f..00000000 --- a/vendor/github.com/docker/docker/client/container_exec.go +++ /dev/null @@ -1,54 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerExecCreate creates a new exec configuration to run an exec process. -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 { - return response, err - } - - resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, config, nil) - if err != nil { - return response, err - } - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} - -// ContainerExecStart starts an exec process already created in the docker host. -func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error { - resp, err := cli.post(ctx, "/exec/"+execID+"/start", nil, config, nil) - ensureReaderClosed(resp) - return err -} - -// ContainerExecAttach attaches a connection to an exec process in the server. -// It returns a types.HijackedConnection with the hijacked connection -// and the a reader to get output. It's up to the called to close -// the hijacked connection by calling types.HijackedResponse.Close. -func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) { - headers := map[string][]string{"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. -func (cli *Client) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) { - var response types.ContainerExecInspect - resp, err := cli.get(ctx, "/exec/"+execID+"/json", nil, nil) - if err != nil { - return response, err - } - - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/container_export.go b/vendor/github.com/docker/docker/client/container_export.go deleted file mode 100644 index 52194f3d..00000000 --- a/vendor/github.com/docker/docker/client/container_export.go +++ /dev/null @@ -1,20 +0,0 @@ -package client - -import ( - "io" - "net/url" - - "golang.org/x/net/context" -) - -// ContainerExport retrieves the raw contents of a container -// and returns them as an io.ReadCloser. It's up to the caller -// to close the stream. -func (cli *Client) ContainerExport(ctx context.Context, containerID string) (io.ReadCloser, error) { - serverResp, err := cli.get(ctx, "/containers/"+containerID+"/export", url.Values{}, nil) - if err != nil { - return nil, err - } - - return serverResp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/container_inspect.go b/vendor/github.com/docker/docker/client/container_inspect.go deleted file mode 100644 index 17f18097..00000000 --- a/vendor/github.com/docker/docker/client/container_inspect.go +++ /dev/null @@ -1,54 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerInspect returns the container information. -func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) { - serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil) - if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ContainerJSON{}, containerNotFoundError{containerID} - } - return types.ContainerJSON{}, err - } - - var response types.ContainerJSON - err = json.NewDecoder(serverResp.body).Decode(&response) - ensureReaderClosed(serverResp) - return response, err -} - -// ContainerInspectWithRaw returns the container information and its raw representation. -func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID string, getSize bool) (types.ContainerJSON, []byte, error) { - query := url.Values{} - if getSize { - query.Set("size", "1") - } - serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil) - if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ContainerJSON{}, nil, containerNotFoundError{containerID} - } - return types.ContainerJSON{}, nil, err - } - defer ensureReaderClosed(serverResp) - - body, err := ioutil.ReadAll(serverResp.body) - if err != nil { - return types.ContainerJSON{}, nil, err - } - - var response types.ContainerJSON - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&response) - return response, body, err -} diff --git a/vendor/github.com/docker/docker/client/container_kill.go b/vendor/github.com/docker/docker/client/container_kill.go deleted file mode 100644 index 29f80c73..00000000 --- a/vendor/github.com/docker/docker/client/container_kill.go +++ /dev/null @@ -1,17 +0,0 @@ -package client - -import ( - "net/url" - - "golang.org/x/net/context" -) - -// ContainerKill terminates the container process but does not remove the container from the docker host. -func (cli *Client) ContainerKill(ctx context.Context, containerID, signal string) error { - query := url.Values{} - query.Set("signal", signal) - - resp, err := cli.post(ctx, "/containers/"+containerID+"/kill", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go deleted file mode 100644 index 43989121..00000000 --- a/vendor/github.com/docker/docker/client/container_list.go +++ /dev/null @@ -1,56 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - "strconv" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// ContainerList returns the list of containers in the docker host. -func (cli *Client) ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) { - query := url.Values{} - - if options.All { - query.Set("all", "1") - } - - if options.Limit != -1 { - query.Set("limit", strconv.Itoa(options.Limit)) - } - - if options.Since != "" { - query.Set("since", options.Since) - } - - if options.Before != "" { - query.Set("before", options.Before) - } - - if options.Size { - query.Set("size", "1") - } - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) - - if err != nil { - return nil, err - } - - query.Set("filters", filterJSON) - } - - resp, err := cli.get(ctx, "/containers/json", query, nil) - if err != nil { - return nil, err - } - - var containers []types.Container - err = json.NewDecoder(resp.body).Decode(&containers) - ensureReaderClosed(resp) - return containers, err -} diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go deleted file mode 100644 index 69056b63..00000000 --- a/vendor/github.com/docker/docker/client/container_logs.go +++ /dev/null @@ -1,52 +0,0 @@ -package client - -import ( - "io" - "net/url" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - timetypes "github.com/docker/docker/api/types/time" -) - -// ContainerLogs returns the logs generated by a container in an io.ReadCloser. -// It's up to the caller to close the stream. -func (cli *Client) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) { - query := url.Values{} - if options.ShowStdout { - query.Set("stdout", "1") - } - - if options.ShowStderr { - query.Set("stderr", "1") - } - - if options.Since != "" { - ts, err := timetypes.GetTimestamp(options.Since, time.Now()) - if err != nil { - return nil, err - } - query.Set("since", ts) - } - - if options.Timestamps { - query.Set("timestamps", "1") - } - - if options.Details { - query.Set("details", "1") - } - - if options.Follow { - query.Set("follow", "1") - } - query.Set("tail", options.Tail) - - resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil) - if err != nil { - return nil, err - } - return resp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/container_pause.go b/vendor/github.com/docker/docker/client/container_pause.go deleted file mode 100644 index 412067a7..00000000 --- a/vendor/github.com/docker/docker/client/container_pause.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -import "golang.org/x/net/context" - -// ContainerPause pauses the main process of a given container without terminating it. -func (cli *Client) ContainerPause(ctx context.Context, containerID string) error { - resp, err := cli.post(ctx, "/containers/"+containerID+"/pause", nil, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_prune.go b/vendor/github.com/docker/docker/client/container_prune.go deleted file mode 100644 index b5821708..00000000 --- a/vendor/github.com/docker/docker/client/container_prune.go +++ /dev/null @@ -1,36 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// ContainersPrune requests the daemon to delete unused data -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 { - return report, err - } - - query, err := getFiltersQuery(pruneFilters) - if err != nil { - return report, err - } - - serverResp, err := cli.post(ctx, "/containers/prune", query, nil, nil) - if err != nil { - return report, err - } - defer ensureReaderClosed(serverResp) - - if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { - return report, fmt.Errorf("Error retrieving disk usage: %v", err) - } - - return report, nil -} diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go deleted file mode 100644 index 3a79590c..00000000 --- a/vendor/github.com/docker/docker/client/container_remove.go +++ /dev/null @@ -1,27 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerRemove kills and removes a container from the docker host. -func (cli *Client) ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error { - query := url.Values{} - if options.RemoveVolumes { - query.Set("v", "1") - } - if options.RemoveLinks { - query.Set("link", "1") - } - - if options.Force { - query.Set("force", "1") - } - - resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_rename.go b/vendor/github.com/docker/docker/client/container_rename.go deleted file mode 100644 index 0e718da7..00000000 --- a/vendor/github.com/docker/docker/client/container_rename.go +++ /dev/null @@ -1,16 +0,0 @@ -package client - -import ( - "net/url" - - "golang.org/x/net/context" -) - -// ContainerRename changes the name of a given container. -func (cli *Client) ContainerRename(ctx context.Context, containerID, newContainerName string) error { - query := url.Values{} - query.Set("name", newContainerName) - resp, err := cli.post(ctx, "/containers/"+containerID+"/rename", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_resize.go b/vendor/github.com/docker/docker/client/container_resize.go deleted file mode 100644 index 66c3cc19..00000000 --- a/vendor/github.com/docker/docker/client/container_resize.go +++ /dev/null @@ -1,29 +0,0 @@ -package client - -import ( - "net/url" - "strconv" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerResize changes the size of the tty for a container. -func (cli *Client) ContainerResize(ctx context.Context, containerID string, options types.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 { - return cli.resize(ctx, "/exec/"+execID, options.Height, options.Width) -} - -func (cli *Client) resize(ctx context.Context, basePath string, height, width uint) error { - query := url.Values{} - query.Set("h", strconv.Itoa(int(height))) - query.Set("w", strconv.Itoa(int(width))) - - resp, err := cli.post(ctx, basePath+"/resize", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go deleted file mode 100644 index 74d7455f..00000000 --- a/vendor/github.com/docker/docker/client/container_restart.go +++ /dev/null @@ -1,22 +0,0 @@ -package client - -import ( - "net/url" - "time" - - timetypes "github.com/docker/docker/api/types/time" - "golang.org/x/net/context" -) - -// ContainerRestart stops and starts a container again. -// It makes the daemon to wait for the container to be up again for -// a specific amount of time, given the timeout. -func (cli *Client) ContainerRestart(ctx context.Context, containerID string, timeout *time.Duration) error { - query := url.Values{} - if timeout != nil { - query.Set("t", timetypes.DurationToSecondsString(*timeout)) - } - resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_start.go b/vendor/github.com/docker/docker/client/container_start.go deleted file mode 100644 index b1f08de4..00000000 --- a/vendor/github.com/docker/docker/client/container_start.go +++ /dev/null @@ -1,24 +0,0 @@ -package client - -import ( - "net/url" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" -) - -// 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 { - query := url.Values{} - if len(options.CheckpointID) != 0 { - query.Set("checkpoint", options.CheckpointID) - } - if len(options.CheckpointDir) != 0 { - query.Set("checkpoint-dir", options.CheckpointDir) - } - - resp, err := cli.post(ctx, "/containers/"+containerID+"/start", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go deleted file mode 100644 index 4758c66e..00000000 --- a/vendor/github.com/docker/docker/client/container_stats.go +++ /dev/null @@ -1,26 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerStats returns near realtime stats for a given container. -// It's up to the caller to close the io.ReadCloser returned. -func (cli *Client) ContainerStats(ctx context.Context, containerID string, stream bool) (types.ContainerStats, error) { - query := url.Values{} - query.Set("stream", "0") - if stream { - query.Set("stream", "1") - } - - resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil) - if err != nil { - return types.ContainerStats{}, err - } - - osType := getDockerOS(resp.header.Get("Server")) - return types.ContainerStats{Body: resp.body, OSType: osType}, err -} diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go deleted file mode 100644 index b5418ae8..00000000 --- a/vendor/github.com/docker/docker/client/container_stop.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "net/url" - "time" - - timetypes "github.com/docker/docker/api/types/time" - "golang.org/x/net/context" -) - -// ContainerStop stops a container without terminating the process. -// The process is blocked until the container stops or the timeout expires. -func (cli *Client) ContainerStop(ctx context.Context, containerID string, timeout *time.Duration) error { - query := url.Values{} - if timeout != nil { - query.Set("t", timetypes.DurationToSecondsString(*timeout)) - } - resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_top.go b/vendor/github.com/docker/docker/client/container_top.go deleted file mode 100644 index 4e7270ea..00000000 --- a/vendor/github.com/docker/docker/client/container_top.go +++ /dev/null @@ -1,28 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - "strings" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ContainerTop shows process information from within a container. -func (cli *Client) ContainerTop(ctx context.Context, containerID string, arguments []string) (types.ContainerProcessList, error) { - var response types.ContainerProcessList - query := url.Values{} - if len(arguments) > 0 { - query.Set("ps_args", strings.Join(arguments, " ")) - } - - resp, err := cli.get(ctx, "/containers/"+containerID+"/top", query, nil) - if err != nil { - return response, err - } - - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/container_unpause.go b/vendor/github.com/docker/docker/client/container_unpause.go deleted file mode 100644 index 5c762112..00000000 --- a/vendor/github.com/docker/docker/client/container_unpause.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -import "golang.org/x/net/context" - -// ContainerUnpause resumes the process execution within a container -func (cli *Client) ContainerUnpause(ctx context.Context, containerID string) error { - resp, err := cli.post(ctx, "/containers/"+containerID+"/unpause", nil, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go deleted file mode 100644 index 5082f22d..00000000 --- a/vendor/github.com/docker/docker/client/container_update.go +++ /dev/null @@ -1,22 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" -) - -// ContainerUpdate updates resources of a container -func (cli *Client) ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) { - var response container.ContainerUpdateOKBody - serverResp, err := cli.post(ctx, "/containers/"+containerID+"/update", nil, updateConfig, nil) - if err != nil { - return response, err - } - - err = json.NewDecoder(serverResp.body).Decode(&response) - - ensureReaderClosed(serverResp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go deleted file mode 100644 index 93212c70..00000000 --- a/vendor/github.com/docker/docker/client/container_wait.go +++ /dev/null @@ -1,26 +0,0 @@ -package client - -import ( - "encoding/json" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types/container" -) - -// ContainerWait pauses execution until a container exits. -// It returns the API status code as response of its readiness. -func (cli *Client) ContainerWait(ctx context.Context, containerID string) (int64, error) { - resp, err := cli.post(ctx, "/containers/"+containerID+"/wait", nil, nil, nil) - if err != nil { - return -1, err - } - defer ensureReaderClosed(resp) - - var res container.ContainerWaitOKBody - if err := json.NewDecoder(resp.body).Decode(&res); err != nil { - return -1, err - } - - return res.StatusCode, nil -} diff --git a/vendor/github.com/docker/docker/client/disk_usage.go b/vendor/github.com/docker/docker/client/disk_usage.go deleted file mode 100644 index 03c80b39..00000000 --- a/vendor/github.com/docker/docker/client/disk_usage.go +++ /dev/null @@ -1,26 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// DiskUsage requests the current data usage from the daemon -func (cli *Client) DiskUsage(ctx context.Context) (types.DiskUsage, error) { - var du types.DiskUsage - - serverResp, err := cli.get(ctx, "/system/df", nil, nil) - if err != nil { - return du, err - } - defer ensureReaderClosed(serverResp) - - if err := json.NewDecoder(serverResp.body).Decode(&du); err != nil { - return du, fmt.Errorf("Error retrieving disk usage: %v", err) - } - - return du, nil -} diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go deleted file mode 100644 index bf6923f1..00000000 --- a/vendor/github.com/docker/docker/client/errors.go +++ /dev/null @@ -1,278 +0,0 @@ -package client - -import ( - "fmt" - - "github.com/docker/docker/api/types/versions" - "github.com/pkg/errors" -) - -// errConnectionFailed implements an error returned when connection failed. -type errConnectionFailed struct { - host string -} - -// 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) -} - -// IsErrConnectionFailed returns true if the error is caused by connection failed. -func IsErrConnectionFailed(err error) bool { - _, ok := errors.Cause(err).(errConnectionFailed) - return ok -} - -// 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} -} - -type notFound interface { - error - NotFound() bool // Is the error a NotFound error -} - -// IsErrNotFound returns true if the error is caused with an -// object (image, container, network, volume, …) is not found in the docker host. -func IsErrNotFound(err error) bool { - te, ok := err.(notFound) - return ok && te.NotFound() -} - -// imageNotFoundError implements an error returned when an image is not in the docker host. -type imageNotFoundError struct { - imageID string -} - -// NotFound indicates that this error type is of NotFound -func (e imageNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of an imageNotFoundError -func (e imageNotFoundError) Error() string { - return fmt.Sprintf("Error: No such image: %s", e.imageID) -} - -// IsErrImageNotFound returns true if the error is caused -// when an image is not found in the docker host. -func IsErrImageNotFound(err error) bool { - return IsErrNotFound(err) -} - -// containerNotFoundError implements an error returned when a container is not in the docker host. -type containerNotFoundError struct { - containerID string -} - -// NotFound indicates that this error type is of NotFound -func (e containerNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a containerNotFoundError -func (e containerNotFoundError) Error() string { - return fmt.Sprintf("Error: No such container: %s", e.containerID) -} - -// IsErrContainerNotFound returns true if the error is caused -// when a container is not found in the docker host. -func IsErrContainerNotFound(err error) bool { - return IsErrNotFound(err) -} - -// networkNotFoundError implements an error returned when a network is not in the docker host. -type networkNotFoundError struct { - networkID string -} - -// NotFound indicates that this error type is of NotFound -func (e networkNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a networkNotFoundError -func (e networkNotFoundError) Error() string { - return fmt.Sprintf("Error: No such network: %s", e.networkID) -} - -// IsErrNetworkNotFound returns true if the error is caused -// when a network is not found in the docker host. -func IsErrNetworkNotFound(err error) bool { - return IsErrNotFound(err) -} - -// volumeNotFoundError implements an error returned when a volume is not in the docker host. -type volumeNotFoundError struct { - volumeID string -} - -// NotFound indicates that this error type is of NotFound -func (e volumeNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a volumeNotFoundError -func (e volumeNotFoundError) Error() string { - return fmt.Sprintf("Error: No such volume: %s", e.volumeID) -} - -// IsErrVolumeNotFound returns true if the error is caused -// when a volume is not found in the docker host. -func IsErrVolumeNotFound(err error) bool { - return IsErrNotFound(err) -} - -// unauthorizedError represents an authorization error in a remote registry. -type unauthorizedError struct { - cause error -} - -// Error returns a string representation of an unauthorizedError -func (u unauthorizedError) Error() string { - return u.cause.Error() -} - -// IsErrUnauthorized returns true if the error is caused -// when a remote registry authentication fails -func IsErrUnauthorized(err error) bool { - _, ok := err.(unauthorizedError) - return ok -} - -// nodeNotFoundError implements an error returned when a node is not found. -type nodeNotFoundError struct { - nodeID string -} - -// Error returns a string representation of a nodeNotFoundError -func (e nodeNotFoundError) Error() string { - return fmt.Sprintf("Error: No such node: %s", e.nodeID) -} - -// NotFound indicates that this error type is of NotFound -func (e nodeNotFoundError) NotFound() bool { - return true -} - -// IsErrNodeNotFound returns true if the error is caused -// when a node is not found. -func IsErrNodeNotFound(err error) bool { - _, ok := err.(nodeNotFoundError) - return ok -} - -// serviceNotFoundError implements an error returned when a service is not found. -type serviceNotFoundError struct { - serviceID string -} - -// Error returns a string representation of a serviceNotFoundError -func (e serviceNotFoundError) Error() string { - return fmt.Sprintf("Error: No such service: %s", e.serviceID) -} - -// NotFound indicates that this error type is of NotFound -func (e serviceNotFoundError) NotFound() bool { - return true -} - -// IsErrServiceNotFound returns true if the error is caused -// when a service is not found. -func IsErrServiceNotFound(err error) bool { - _, ok := err.(serviceNotFoundError) - return ok -} - -// taskNotFoundError implements an error returned when a task is not found. -type taskNotFoundError struct { - taskID string -} - -// Error returns a string representation of a taskNotFoundError -func (e taskNotFoundError) Error() string { - return fmt.Sprintf("Error: No such task: %s", e.taskID) -} - -// NotFound indicates that this error type is of NotFound -func (e taskNotFoundError) NotFound() bool { - return true -} - -// IsErrTaskNotFound returns true if the error is caused -// when a task is not found. -func IsErrTaskNotFound(err error) bool { - _, ok := err.(taskNotFoundError) - return ok -} - -type pluginPermissionDenied struct { - name string -} - -func (e pluginPermissionDenied) Error() string { - return "Permission denied while installing plugin " + e.name -} - -// IsErrPluginPermissionDenied returns true if the error is caused -// when a user denies a plugin's permissions -func IsErrPluginPermissionDenied(err error) bool { - _, ok := err.(pluginPermissionDenied) - return ok -} - -// NewVersionError returns an error if the APIVersion required -// if less than the current supported version -func (cli *Client) NewVersionError(APIrequired, feature string) error { - if versions.LessThan(cli.version, APIrequired) { - return fmt.Errorf("%q requires API version %s, but the Docker server is version %s", feature, APIrequired, cli.version) - } - return nil -} - -// secretNotFoundError implements an error returned when a secret is not found. -type secretNotFoundError struct { - name string -} - -// Error returns a string representation of a secretNotFoundError -func (e secretNotFoundError) Error() string { - return fmt.Sprintf("Error: no such secret: %s", e.name) -} - -// NoFound indicates that this error type is of NotFound -func (e secretNotFoundError) NotFound() bool { - return true -} - -// IsErrSecretNotFound returns true if the error is caused -// when a secret is not found. -func IsErrSecretNotFound(err error) bool { - _, ok := err.(secretNotFoundError) - return ok -} - -// pluginNotFoundError implements an error returned when a plugin is not in the docker host. -type pluginNotFoundError struct { - name string -} - -// NotFound indicates that this error type is of NotFound -func (e pluginNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a pluginNotFoundError -func (e pluginNotFoundError) Error() string { - return fmt.Sprintf("Error: No such plugin: %s", e.name) -} - -// IsErrPluginNotFound returns true if the error is caused -// when a plugin is not found in the docker host. -func IsErrPluginNotFound(err error) bool { - return IsErrNotFound(err) -} diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go deleted file mode 100644 index af47aefa..00000000 --- a/vendor/github.com/docker/docker/client/events.go +++ /dev/null @@ -1,102 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - timetypes "github.com/docker/docker/api/types/time" -) - -// Events returns a stream of events in the daemon. It's up to the caller to close the stream -// by cancelling the context. Once the stream has been completely read an io.EOF error will -// be sent over the error channel. If an error is sent all processing will be stopped. It's up -// to the caller to reopen the stream in the event of an error by reinvoking this method. -func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) { - - messages := make(chan events.Message) - errs := make(chan error, 1) - - started := make(chan struct{}) - go func() { - defer close(errs) - - query, err := buildEventsQueryParams(cli.version, options) - if err != nil { - close(started) - errs <- err - return - } - - resp, err := cli.get(ctx, "/events", query, nil) - if err != nil { - close(started) - errs <- err - return - } - defer resp.body.Close() - - decoder := json.NewDecoder(resp.body) - - close(started) - for { - select { - case <-ctx.Done(): - errs <- ctx.Err() - return - default: - var event events.Message - if err := decoder.Decode(&event); err != nil { - errs <- err - return - } - - select { - case messages <- event: - case <-ctx.Done(): - errs <- ctx.Err() - return - } - } - } - }() - <-started - - return messages, errs -} - -func buildEventsQueryParams(cliVersion string, options types.EventsOptions) (url.Values, error) { - query := url.Values{} - ref := time.Now() - - if options.Since != "" { - ts, err := timetypes.GetTimestamp(options.Since, ref) - if err != nil { - return nil, err - } - query.Set("since", ts) - } - - if options.Until != "" { - ts, err := timetypes.GetTimestamp(options.Until, ref) - if err != nil { - return nil, err - } - query.Set("until", ts) - } - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParamWithVersion(cliVersion, options.Filters) - if err != nil { - return nil, err - } - query.Set("filters", filterJSON) - } - - return query, nil -} diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go deleted file mode 100644 index 74c53f52..00000000 --- a/vendor/github.com/docker/docker/client/hijack.go +++ /dev/null @@ -1,177 +0,0 @@ -package client - -import ( - "crypto/tls" - "errors" - "fmt" - "net" - "net/http" - "net/http/httputil" - "net/url" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/tlsconfig" - "github.com/docker/go-connections/sockets" - "golang.org/x/net/context" -) - -// tlsClientCon holds tls information and a dialed connection. -type tlsClientCon struct { - *tls.Conn - rawConn net.Conn -} - -func (c *tlsClientCon) CloseWrite() error { - // Go standard tls.Conn doesn't provide the CloseWrite() method so we do it - // on its underlying connection. - if conn, ok := c.rawConn.(types.CloseWriter); ok { - return conn.CloseWrite() - } - return nil -} - -// postHijacked sends a POST request and hijacks the connection. -func (cli *Client) postHijacked(ctx context.Context, path string, query url.Values, body interface{}, headers map[string][]string) (types.HijackedResponse, error) { - bodyEncoded, err := encodeData(body) - if err != nil { - return types.HijackedResponse{}, err - } - - apiPath := cli.getAPIPath(path, query) - req, err := http.NewRequest("POST", apiPath, bodyEncoded) - if err != nil { - return types.HijackedResponse{}, err - } - req = cli.addHeaders(req, headers) - - req.Host = cli.addr - req.Header.Set("Connection", "Upgrade") - req.Header.Set("Upgrade", "tcp") - - conn, err := dial(cli.proto, cli.addr, resolveTLSConfig(cli.client.Transport)) - if err != nil { - if strings.Contains(err.Error(), "connection refused") { - return types.HijackedResponse{}, fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?") - } - return types.HijackedResponse{}, err - } - - // 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 - // network setups may cause ECONNTIMEOUT, leaving the client in an unknown - // state. Setting TCP KeepAlive on the socket connection will prohibit - // ECONNTIMEOUT unless the socket connection truly is broken - if tcpConn, ok := conn.(*net.TCPConn); ok { - tcpConn.SetKeepAlive(true) - tcpConn.SetKeepAlivePeriod(30 * time.Second) - } - - clientconn := httputil.NewClientConn(conn, nil) - defer clientconn.Close() - - // Server hijacks the connection, error 'connection closed' expected - _, err = clientconn.Do(req) - - rwc, br := clientconn.Hijack() - - return types.HijackedResponse{Conn: rwc, Reader: br}, err -} - -func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) { - return tlsDialWithDialer(new(net.Dialer), network, addr, config) -} - -// We need to copy Go's implementation of tls.Dial (pkg/cryptor/tls/tls.go) in -// order to return our custom tlsClientCon struct which holds both the tls.Conn -// object _and_ its underlying raw connection. The rationale for this is that -// we need to be able to close the write end of the connection when attaching, -// which tls.Conn does not provide. -func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Config) (net.Conn, error) { - // We want the Timeout and Deadline values from dialer to cover the - // whole process: TCP connection and TLS handshake. This means that we - // also need to start our own timers now. - timeout := dialer.Timeout - - if !dialer.Deadline.IsZero() { - deadlineTimeout := dialer.Deadline.Sub(time.Now()) - if timeout == 0 || deadlineTimeout < timeout { - timeout = deadlineTimeout - } - } - - var errChannel chan error - - if timeout != 0 { - errChannel = make(chan error, 2) - time.AfterFunc(timeout, func() { - errChannel <- errors.New("") - }) - } - - proxyDialer, err := sockets.DialerFromEnvironment(dialer) - if err != nil { - return nil, err - } - - rawConn, err := proxyDialer.Dial(network, addr) - if err != nil { - return nil, err - } - // 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 - // network setups may cause ECONNTIMEOUT, leaving the client in an unknown - // state. Setting TCP KeepAlive on the socket connection will prohibit - // ECONNTIMEOUT unless the socket connection truly is broken - if tcpConn, ok := rawConn.(*net.TCPConn); ok { - tcpConn.SetKeepAlive(true) - tcpConn.SetKeepAlivePeriod(30 * time.Second) - } - - colonPos := strings.LastIndex(addr, ":") - if colonPos == -1 { - colonPos = len(addr) - } - hostname := addr[:colonPos] - - // If no ServerName is set, infer the ServerName - // from the hostname we're connecting to. - if config.ServerName == "" { - // Make a copy to avoid polluting argument or default. - config = tlsconfig.Clone(config) - config.ServerName = hostname - } - - conn := tls.Client(rawConn, config) - - if timeout == 0 { - err = conn.Handshake() - } else { - go func() { - errChannel <- conn.Handshake() - }() - - err = <-errChannel - } - - if err != nil { - rawConn.Close() - return nil, err - } - - // This is Docker difference with standard's crypto/tls package: returned a - // wrapper which holds both the TLS and raw connections. - return &tlsClientCon{conn, rawConn}, nil -} - -func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) { - if tlsConfig != nil && proto != "unix" && proto != "npipe" { - // Notice this isn't Go standard's tls.Dial function - return tlsDial(proto, addr, tlsConfig) - } - if proto == "npipe" { - return sockets.DialPipe(addr, 32*time.Second) - } - return net.Dial(proto, addr) -} diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go deleted file mode 100644 index 6fde75dc..00000000 --- a/vendor/github.com/docker/docker/client/image_build.go +++ /dev/null @@ -1,123 +0,0 @@ -package client - -import ( - "encoding/base64" - "encoding/json" - "io" - "net/http" - "net/url" - "strconv" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" -) - -// ImageBuild sends request to the daemon to build images. -// The Body in the response implement 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) - 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.Set("Content-Type", "application/tar") - - serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) - if err != nil { - return types.ImageBuildResponse{}, err - } - - osType := getDockerOS(serverResp.header.Get("Server")) - - return types.ImageBuildResponse{ - Body: serverResp.body, - OSType: osType, - }, nil -} - -func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (url.Values, error) { - query := url.Values{ - "t": options.Tags, - "securityopt": options.SecurityOpt, - } - if options.SuppressOutput { - query.Set("q", "1") - } - if options.RemoteContext != "" { - query.Set("remote", options.RemoteContext) - } - if options.NoCache { - query.Set("nocache", "1") - } - if options.Remove { - query.Set("rm", "1") - } else { - query.Set("rm", "0") - } - - if options.ForceRemove { - query.Set("forcerm", "1") - } - - if options.PullParent { - query.Set("pull", "1") - } - - if options.Squash { - if err := cli.NewVersionError("1.25", "squash"); err != nil { - return query, err - } - query.Set("squash", "1") - } - - if !container.Isolation.IsDefault(options.Isolation) { - query.Set("isolation", string(options.Isolation)) - } - - query.Set("cpusetcpus", options.CPUSetCPUs) - query.Set("networkmode", options.NetworkMode) - query.Set("cpusetmems", options.CPUSetMems) - query.Set("cpushares", strconv.FormatInt(options.CPUShares, 10)) - query.Set("cpuquota", strconv.FormatInt(options.CPUQuota, 10)) - query.Set("cpuperiod", strconv.FormatInt(options.CPUPeriod, 10)) - query.Set("memory", strconv.FormatInt(options.Memory, 10)) - query.Set("memswap", strconv.FormatInt(options.MemorySwap, 10)) - query.Set("cgroupparent", options.CgroupParent) - query.Set("shmsize", strconv.FormatInt(options.ShmSize, 10)) - query.Set("dockerfile", options.Dockerfile) - - ulimitsJSON, err := json.Marshal(options.Ulimits) - if err != nil { - return query, err - } - query.Set("ulimits", string(ulimitsJSON)) - - buildArgsJSON, err := json.Marshal(options.BuildArgs) - if err != nil { - return query, err - } - query.Set("buildargs", string(buildArgsJSON)) - - labelsJSON, err := json.Marshal(options.Labels) - if err != nil { - return query, err - } - query.Set("labels", string(labelsJSON)) - - cacheFromJSON, err := json.Marshal(options.CacheFrom) - if err != nil { - return query, err - } - query.Set("cachefrom", string(cacheFromJSON)) - - return query, nil -} diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go deleted file mode 100644 index cf023a71..00000000 --- a/vendor/github.com/docker/docker/client/image_create.go +++ /dev/null @@ -1,34 +0,0 @@ -package client - -import ( - "io" - "net/url" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/reference" -) - -// ImageCreate creates a new image based in 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) { - repository, tag, err := reference.Parse(parentReference) - if err != nil { - return nil, err - } - - query := url.Values{} - query.Set("fromImage", repository) - query.Set("tag", tag) - resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) - if err != nil { - return nil, err - } - return resp.body, nil -} - -func (cli *Client) tryImageCreate(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} - return cli.post(ctx, "/images/create", query, nil, headers) -} diff --git a/vendor/github.com/docker/docker/client/image_history.go b/vendor/github.com/docker/docker/client/image_history.go deleted file mode 100644 index acb1ee92..00000000 --- a/vendor/github.com/docker/docker/client/image_history.go +++ /dev/null @@ -1,22 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ImageHistory returns the changes in an image in history format. -func (cli *Client) ImageHistory(ctx context.Context, imageID string) ([]types.ImageHistory, error) { - var history []types.ImageHistory - serverResp, err := cli.get(ctx, "/images/"+imageID+"/history", url.Values{}, nil) - if err != nil { - return history, err - } - - err = json.NewDecoder(serverResp.body).Decode(&history) - ensureReaderClosed(serverResp) - return history, err -} diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go deleted file mode 100644 index c6f154b2..00000000 --- a/vendor/github.com/docker/docker/client/image_import.go +++ /dev/null @@ -1,37 +0,0 @@ -package client - -import ( - "io" - "net/url" - - "golang.org/x/net/context" - - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" -) - -// ImageImport creates a new image based in 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) { - if ref != "" { - //Check if the given image name can be resolved - if _, err := reference.ParseNamed(ref); err != nil { - return nil, err - } - } - - query := url.Values{} - query.Set("fromSrc", source.SourceName) - query.Set("repo", ref) - query.Set("tag", options.Tag) - query.Set("message", options.Message) - for _, change := range options.Changes { - query.Add("changes", change) - } - - resp, err := cli.postRaw(ctx, "/images/create", query, source.Source, nil) - if err != nil { - return nil, err - } - return resp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/image_inspect.go b/vendor/github.com/docker/docker/client/image_inspect.go deleted file mode 100644 index b3a64ce2..00000000 --- a/vendor/github.com/docker/docker/client/image_inspect.go +++ /dev/null @@ -1,33 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ImageInspectWithRaw returns the image information and its raw representation. -func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) { - serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil) - if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ImageInspect{}, nil, imageNotFoundError{imageID} - } - return types.ImageInspect{}, nil, err - } - defer ensureReaderClosed(serverResp) - - body, err := ioutil.ReadAll(serverResp.body) - if err != nil { - return types.ImageInspect{}, nil, err - } - - var response types.ImageInspect - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&response) - return response, body, err -} diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go deleted file mode 100644 index f26464f6..00000000 --- a/vendor/github.com/docker/docker/client/image_list.go +++ /dev/null @@ -1,45 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" -) - -// 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 - query := url.Values{} - - optionFilters := options.Filters - referenceFilters := optionFilters.Get("reference") - if versions.LessThan(cli.version, "1.25") && len(referenceFilters) > 0 { - query.Set("filter", referenceFilters[0]) - for _, filterValue := range referenceFilters { - optionFilters.Del("reference", filterValue) - } - } - if optionFilters.Len() > 0 { - filterJSON, err := filters.ToParamWithVersion(cli.version, optionFilters) - if err != nil { - return images, err - } - query.Set("filters", filterJSON) - } - if options.All { - query.Set("all", "1") - } - - serverResp, err := cli.get(ctx, "/images/json", query, nil) - if err != nil { - return images, err - } - - err = json.NewDecoder(serverResp.body).Decode(&images) - ensureReaderClosed(serverResp) - return images, err -} diff --git a/vendor/github.com/docker/docker/client/image_load.go b/vendor/github.com/docker/docker/client/image_load.go deleted file mode 100644 index 77aaf1af..00000000 --- a/vendor/github.com/docker/docker/client/image_load.go +++ /dev/null @@ -1,30 +0,0 @@ -package client - -import ( - "io" - "net/url" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" -) - -// ImageLoad loads an image in the docker host from the client host. -// It's up to the caller to close the io.ReadCloser in the -// ImageLoadResponse returned by this function. -func (cli *Client) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) { - v := url.Values{} - v.Set("quiet", "0") - 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) - if err != nil { - return types.ImageLoadResponse{}, err - } - return types.ImageLoadResponse{ - Body: resp.body, - JSON: resp.header.Get("Content-Type") == "application/json", - }, nil -} diff --git a/vendor/github.com/docker/docker/client/image_prune.go b/vendor/github.com/docker/docker/client/image_prune.go deleted file mode 100644 index 5ef98b7f..00000000 --- a/vendor/github.com/docker/docker/client/image_prune.go +++ /dev/null @@ -1,36 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// ImagesPrune requests the daemon to delete unused data -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 { - return report, err - } - - query, err := getFiltersQuery(pruneFilters) - if err != nil { - return report, err - } - - serverResp, err := cli.post(ctx, "/images/prune", query, nil, nil) - if err != nil { - return report, err - } - defer ensureReaderClosed(serverResp) - - if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { - return report, fmt.Errorf("Error retrieving disk usage: %v", err) - } - - return report, nil -} diff --git a/vendor/github.com/docker/docker/client/image_pull.go b/vendor/github.com/docker/docker/client/image_pull.go deleted file mode 100644 index 3bffdb70..00000000 --- a/vendor/github.com/docker/docker/client/image_pull.go +++ /dev/null @@ -1,46 +0,0 @@ -package client - -import ( - "io" - "net/http" - "net/url" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/reference" -) - -// ImagePull requests the docker host to pull an image from a remote registry. -// 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. -// -// 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, ref string, options types.ImagePullOptions) (io.ReadCloser, error) { - repository, tag, err := reference.Parse(ref) - if err != nil { - return nil, err - } - - query := url.Values{} - query.Set("fromImage", repository) - if tag != "" && !options.All { - query.Set("tag", tag) - } - - resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) - if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { - newAuthHeader, privilegeErr := options.PrivilegeFunc() - if privilegeErr != nil { - return nil, privilegeErr - } - resp, err = cli.tryImageCreate(ctx, query, newAuthHeader) - } - if err != nil { - return nil, err - } - return resp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go deleted file mode 100644 index 8e73d28f..00000000 --- a/vendor/github.com/docker/docker/client/image_push.go +++ /dev/null @@ -1,54 +0,0 @@ -package client - -import ( - "errors" - "io" - "net/http" - "net/url" - - "golang.org/x/net/context" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" -) - -// ImagePush requests the docker host to push an image to a remote registry. -// 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, ref string, options types.ImagePushOptions) (io.ReadCloser, error) { - distributionRef, err := distreference.ParseNamed(ref) - if err != nil { - return nil, err - } - - if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { - return nil, errors.New("cannot push a digest reference") - } - - var tag = "" - if nameTaggedRef, isNamedTagged := distributionRef.(distreference.NamedTagged); isNamedTagged { - tag = nameTaggedRef.Tag() - } - - query := url.Values{} - query.Set("tag", tag) - - resp, err := cli.tryImagePush(ctx, distributionRef.Name(), query, options.RegistryAuth) - if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { - newAuthHeader, privilegeErr := options.PrivilegeFunc() - if privilegeErr != nil { - return nil, privilegeErr - } - resp, err = cli.tryImagePush(ctx, distributionRef.Name(), query, newAuthHeader) - } - if err != nil { - return nil, err - } - return resp.body, nil -} - -func (cli *Client) tryImagePush(ctx context.Context, imageID string, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} - return cli.post(ctx, "/images/"+imageID+"/push", query, nil, headers) -} diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go deleted file mode 100644 index 839e5311..00000000 --- a/vendor/github.com/docker/docker/client/image_remove.go +++ /dev/null @@ -1,31 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ImageRemove removes an image from the docker host. -func (cli *Client) ImageRemove(ctx context.Context, imageID string, options types.ImageRemoveOptions) ([]types.ImageDelete, error) { - query := url.Values{} - - if options.Force { - query.Set("force", "1") - } - if !options.PruneChildren { - query.Set("noprune", "1") - } - - resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) - if err != nil { - return nil, err - } - - var dels []types.ImageDelete - err = json.NewDecoder(resp.body).Decode(&dels) - ensureReaderClosed(resp) - return dels, err -} diff --git a/vendor/github.com/docker/docker/client/image_save.go b/vendor/github.com/docker/docker/client/image_save.go deleted file mode 100644 index ecac880a..00000000 --- a/vendor/github.com/docker/docker/client/image_save.go +++ /dev/null @@ -1,22 +0,0 @@ -package client - -import ( - "io" - "net/url" - - "golang.org/x/net/context" -) - -// ImageSave retrieves one or more images from the docker host as an io.ReadCloser. -// It's up to the caller to store the images and close the stream. -func (cli *Client) ImageSave(ctx context.Context, imageIDs []string) (io.ReadCloser, error) { - query := url.Values{ - "names": imageIDs, - } - - resp, err := cli.get(ctx, "/images/get", query, nil) - if err != nil { - return nil, err - } - return resp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go deleted file mode 100644 index b0fcd5c2..00000000 --- a/vendor/github.com/docker/docker/client/image_search.go +++ /dev/null @@ -1,51 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - "net/http" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" -) - -// ImageSearch makes the docker host to search by a term in a remote registry. -// The list of results is not sorted in any fashion. -func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { - var results []registry.SearchResult - query := url.Values{} - query.Set("term", term) - query.Set("limit", fmt.Sprintf("%d", options.Limit)) - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) - if err != nil { - return results, err - } - query.Set("filters", filterJSON) - } - - resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth) - if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { - newAuthHeader, privilegeErr := options.PrivilegeFunc() - if privilegeErr != nil { - return results, privilegeErr - } - resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) - } - if err != nil { - return results, err - } - - err = json.NewDecoder(resp.body).Decode(&results) - ensureReaderClosed(resp) - return results, err -} - -func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} - return cli.get(ctx, "/images/search", query, headers) -} diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go deleted file mode 100644 index bdbf94ad..00000000 --- a/vendor/github.com/docker/docker/client/image_tag.go +++ /dev/null @@ -1,34 +0,0 @@ -package client - -import ( - "errors" - "fmt" - "net/url" - - "golang.org/x/net/context" - - distreference "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types/reference" -) - -// ImageTag tags an image in the docker host -func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error { - distributionRef, err := distreference.ParseNamed(ref) - if err != nil { - return fmt.Errorf("Error parsing reference: %q is not a valid repository/tag", ref) - } - - if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { - return errors.New("refusing to create a tag with a digest reference") - } - - tag := reference.GetTagFromNamedRef(distributionRef) - - query := url.Values{} - query.Set("repo", distributionRef.Name()) - query.Set("tag", tag) - - resp, err := cli.post(ctx, "/images/"+imageID+"/tag", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/info.go b/vendor/github.com/docker/docker/client/info.go deleted file mode 100644 index ac079612..00000000 --- a/vendor/github.com/docker/docker/client/info.go +++ /dev/null @@ -1,26 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// Info returns information about the docker server. -func (cli *Client) Info(ctx context.Context) (types.Info, error) { - var info types.Info - serverResp, err := cli.get(ctx, "/info", url.Values{}, nil) - if err != nil { - return info, err - } - defer ensureReaderClosed(serverResp) - - if err := json.NewDecoder(serverResp.body).Decode(&info); err != nil { - return info, fmt.Errorf("Error reading remote info: %v", err) - } - - return info, nil -} diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go deleted file mode 100644 index 05978039..00000000 --- a/vendor/github.com/docker/docker/client/interface.go +++ /dev/null @@ -1,171 +0,0 @@ -package client - -import ( - "io" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/events" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/network" - "github.com/docker/docker/api/types/registry" - "github.com/docker/docker/api/types/swarm" - volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" -) - -// CommonAPIClient is the common methods between stable and experimental versions of APIClient. -type CommonAPIClient interface { - ContainerAPIClient - ImageAPIClient - NodeAPIClient - NetworkAPIClient - PluginAPIClient - ServiceAPIClient - SwarmAPIClient - SecretAPIClient - SystemAPIClient - VolumeAPIClient - ClientVersion() string - ServerVersion(ctx context.Context) (types.Version, error) - UpdateClientVersion(v string) -} - -// 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) - ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) - ContainerDiff(ctx context.Context, container string) ([]types.ContainerChange, error) - ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (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 - 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) - ContainerPause(ctx context.Context, container string) error - ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error - ContainerRename(ctx context.Context, container, newContainerName string) error - ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error - ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error - ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) - ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) - ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error - ContainerStop(ctx context.Context, container string, timeout *time.Duration) error - ContainerTop(ctx context.Context, container string, arguments []string) (types.ContainerProcessList, error) - ContainerUnpause(ctx context.Context, container string) error - ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) - ContainerWait(ctx context.Context, container string) (int64, error) - CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) - CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error - ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) -} - -// ImageAPIClient defines API client methods for the images -type ImageAPIClient interface { - ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) - ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) - ImageHistory(ctx context.Context, image string) ([]types.ImageHistory, error) - ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) - ImageInspectWithRaw(ctx context.Context, image string) (types.ImageInspect, []byte, error) - ImageList(ctx context.Context, options types.ImageListOptions) ([]types.ImageSummary, 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.ImageDelete, 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 - ImagesPrune(ctx context.Context, pruneFilter filters.Args) (types.ImagesPruneReport, error) -} - -// NetworkAPIClient defines API client methods for the networks -type NetworkAPIClient interface { - NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error - NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) - NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error - NetworkInspect(ctx context.Context, networkID string) (types.NetworkResource, error) - NetworkInspectWithRaw(ctx context.Context, networkID string) (types.NetworkResource, []byte, error) - NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) - NetworkRemove(ctx context.Context, networkID string) error - NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error) -} - -// NodeAPIClient defines API client methods for the nodes -type NodeAPIClient interface { - NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) - NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error) - NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error - NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error -} - -// PluginAPIClient defines API client methods for the plugins -type PluginAPIClient interface { - PluginList(ctx context.Context) (types.PluginsListResponse, error) - PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error - PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error - PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error - PluginInstall(ctx context.Context, name string, options types.PluginInstallOptions) (io.ReadCloser, error) - PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (io.ReadCloser, error) - PluginPush(ctx context.Context, name string, registryAuth string) (io.ReadCloser, error) - PluginSet(ctx context.Context, name string, args []string) error - PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) - PluginCreate(ctx context.Context, createContext io.Reader, options types.PluginCreateOptions) error -} - -// ServiceAPIClient defines API client methods for the services -type ServiceAPIClient interface { - ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) - ServiceInspectWithRaw(ctx context.Context, serviceID string) (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) - TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) - TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) -} - -// SwarmAPIClient defines API client methods for the swarm -type SwarmAPIClient interface { - SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error) - SwarmJoin(ctx context.Context, req swarm.JoinRequest) error - SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error) - SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error - SwarmLeave(ctx context.Context, force bool) error - SwarmInspect(ctx context.Context) (swarm.Swarm, error) - SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error -} - -// 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) - RegistryLogin(ctx context.Context, auth types.AuthConfig) (registry.AuthenticateOKBody, error) - DiskUsage(ctx context.Context) (types.DiskUsage, error) - Ping(ctx context.Context) (types.Ping, error) -} - -// VolumeAPIClient defines API client methods for the volumes -type VolumeAPIClient interface { - VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) - VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) - VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) - VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) - VolumeRemove(ctx context.Context, volumeID string, force bool) error - VolumesPrune(ctx context.Context, pruneFilter filters.Args) (types.VolumesPruneReport, error) -} - -// SecretAPIClient defines API client methods for secrets -type SecretAPIClient interface { - SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) - SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) - SecretRemove(ctx context.Context, id string) error - SecretInspectWithRaw(ctx context.Context, name string) (swarm.Secret, []byte, error) - SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error -} diff --git a/vendor/github.com/docker/docker/client/interface_experimental.go b/vendor/github.com/docker/docker/client/interface_experimental.go deleted file mode 100644 index 51da98ec..00000000 --- a/vendor/github.com/docker/docker/client/interface_experimental.go +++ /dev/null @@ -1,17 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -type apiClientExperimental interface { - CheckpointAPIClient -} - -// 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) -} diff --git a/vendor/github.com/docker/docker/client/interface_stable.go b/vendor/github.com/docker/docker/client/interface_stable.go deleted file mode 100644 index cc90a3cb..00000000 --- a/vendor/github.com/docker/docker/client/interface_stable.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -// APIClient is an interface that clients that talk with a docker server must implement. -type APIClient interface { - CommonAPIClient - apiClientExperimental -} - -// Ensure that Client always implements APIClient. -var _ APIClient = &Client{} diff --git a/vendor/github.com/docker/docker/client/login.go b/vendor/github.com/docker/docker/client/login.go deleted file mode 100644 index 600dc719..00000000 --- a/vendor/github.com/docker/docker/client/login.go +++ /dev/null @@ -1,29 +0,0 @@ -package client - -import ( - "encoding/json" - "net/http" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" -) - -// RegistryLogin authenticates the docker server with a given docker registry. -// It returns UnauthorizerError when the authentication fails. -func (cli *Client) RegistryLogin(ctx context.Context, auth types.AuthConfig) (registry.AuthenticateOKBody, error) { - resp, err := cli.post(ctx, "/auth", url.Values{}, auth, nil) - - if resp.statusCode == http.StatusUnauthorized { - return registry.AuthenticateOKBody{}, unauthorizedError{err} - } - if err != nil { - return registry.AuthenticateOKBody{}, err - } - - var response registry.AuthenticateOKBody - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/network_connect.go b/vendor/github.com/docker/docker/client/network_connect.go deleted file mode 100644 index c022c17b..00000000 --- a/vendor/github.com/docker/docker/client/network_connect.go +++ /dev/null @@ -1,18 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/network" - "golang.org/x/net/context" -) - -// NetworkConnect connects a container to an existent network in the docker host. -func (cli *Client) NetworkConnect(ctx context.Context, networkID, containerID string, config *network.EndpointSettings) error { - nc := types.NetworkConnect{ - Container: containerID, - EndpointConfig: config, - } - resp, err := cli.post(ctx, "/networks/"+networkID+"/connect", nil, nc, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/network_create.go b/vendor/github.com/docker/docker/client/network_create.go deleted file mode 100644 index 4067a541..00000000 --- a/vendor/github.com/docker/docker/client/network_create.go +++ /dev/null @@ -1,25 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// NetworkCreate creates a new network in the docker host. -func (cli *Client) NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) { - networkCreateRequest := types.NetworkCreateRequest{ - NetworkCreate: options, - Name: name, - } - var response types.NetworkCreateResponse - serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil) - if err != nil { - return response, err - } - - json.NewDecoder(serverResp.body).Decode(&response) - ensureReaderClosed(serverResp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/network_disconnect.go b/vendor/github.com/docker/docker/client/network_disconnect.go deleted file mode 100644 index 24b58e3c..00000000 --- a/vendor/github.com/docker/docker/client/network_disconnect.go +++ /dev/null @@ -1,14 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// NetworkDisconnect disconnects a container from an existent network in the docker host. -func (cli *Client) NetworkDisconnect(ctx context.Context, networkID, containerID string, force bool) error { - nd := types.NetworkDisconnect{Container: containerID, Force: force} - resp, err := cli.post(ctx, "/networks/"+networkID+"/disconnect", nil, nd, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/network_inspect.go b/vendor/github.com/docker/docker/client/network_inspect.go deleted file mode 100644 index 5ad4ea5b..00000000 --- a/vendor/github.com/docker/docker/client/network_inspect.go +++ /dev/null @@ -1,38 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// NetworkInspect returns the information for a specific network configured in the docker host. -func (cli *Client) NetworkInspect(ctx context.Context, networkID string) (types.NetworkResource, error) { - networkResource, _, err := cli.NetworkInspectWithRaw(ctx, networkID) - return networkResource, err -} - -// NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation. -func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string) (types.NetworkResource, []byte, error) { - var networkResource types.NetworkResource - resp, err := cli.get(ctx, "/networks/"+networkID, nil, nil) - if err != nil { - if resp.statusCode == http.StatusNotFound { - return networkResource, nil, networkNotFoundError{networkID} - } - return networkResource, nil, err - } - defer ensureReaderClosed(resp) - - body, err := ioutil.ReadAll(resp.body) - if err != nil { - return networkResource, nil, err - } - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&networkResource) - return networkResource, body, err -} diff --git a/vendor/github.com/docker/docker/client/network_list.go b/vendor/github.com/docker/docker/client/network_list.go deleted file mode 100644 index e566a93e..00000000 --- a/vendor/github.com/docker/docker/client/network_list.go +++ /dev/null @@ -1,31 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// NetworkList returns the list of networks configured in the docker host. -func (cli *Client) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) { - query := url.Values{} - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filters) - if err != nil { - return nil, err - } - - query.Set("filters", filterJSON) - } - var networkResources []types.NetworkResource - resp, err := cli.get(ctx, "/networks", query, nil) - if err != nil { - return networkResources, err - } - err = json.NewDecoder(resp.body).Decode(&networkResources) - ensureReaderClosed(resp) - return networkResources, err -} diff --git a/vendor/github.com/docker/docker/client/network_prune.go b/vendor/github.com/docker/docker/client/network_prune.go deleted file mode 100644 index 7352a7f0..00000000 --- a/vendor/github.com/docker/docker/client/network_prune.go +++ /dev/null @@ -1,36 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// NetworksPrune requests the daemon to delete unused networks -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 { - return report, err - } - - query, err := getFiltersQuery(pruneFilters) - if err != nil { - return report, err - } - - serverResp, err := cli.post(ctx, "/networks/prune", query, nil, nil) - if err != nil { - return report, err - } - defer ensureReaderClosed(serverResp) - - if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { - return report, fmt.Errorf("Error retrieving network prune report: %v", err) - } - - return report, nil -} diff --git a/vendor/github.com/docker/docker/client/network_remove.go b/vendor/github.com/docker/docker/client/network_remove.go deleted file mode 100644 index 6bd67489..00000000 --- a/vendor/github.com/docker/docker/client/network_remove.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -import "golang.org/x/net/context" - -// NetworkRemove removes an existent network from the docker host. -func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error { - resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/node_inspect.go b/vendor/github.com/docker/docker/client/node_inspect.go deleted file mode 100644 index abf505d2..00000000 --- a/vendor/github.com/docker/docker/client/node_inspect.go +++ /dev/null @@ -1,33 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// NodeInspectWithRaw returns the node information. -func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) { - serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil) - if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Node{}, nil, nodeNotFoundError{nodeID} - } - return swarm.Node{}, nil, err - } - defer ensureReaderClosed(serverResp) - - body, err := ioutil.ReadAll(serverResp.body) - if err != nil { - return swarm.Node{}, nil, err - } - - var response swarm.Node - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&response) - return response, body, err -} diff --git a/vendor/github.com/docker/docker/client/node_list.go b/vendor/github.com/docker/docker/client/node_list.go deleted file mode 100644 index 3e8440f0..00000000 --- a/vendor/github.com/docker/docker/client/node_list.go +++ /dev/null @@ -1,36 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// NodeList returns the list of nodes. -func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error) { - query := url.Values{} - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) - - if err != nil { - return nil, err - } - - query.Set("filters", filterJSON) - } - - resp, err := cli.get(ctx, "/nodes", query, nil) - if err != nil { - return nil, err - } - - var nodes []swarm.Node - err = json.NewDecoder(resp.body).Decode(&nodes) - ensureReaderClosed(resp) - return nodes, err -} diff --git a/vendor/github.com/docker/docker/client/node_remove.go b/vendor/github.com/docker/docker/client/node_remove.go deleted file mode 100644 index 0a77f3d5..00000000 --- a/vendor/github.com/docker/docker/client/node_remove.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - - "golang.org/x/net/context" -) - -// NodeRemove removes a Node. -func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error { - query := url.Values{} - if options.Force { - query.Set("force", "1") - } - - resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/node_update.go b/vendor/github.com/docker/docker/client/node_update.go deleted file mode 100644 index 3ca97602..00000000 --- a/vendor/github.com/docker/docker/client/node_update.go +++ /dev/null @@ -1,18 +0,0 @@ -package client - -import ( - "net/url" - "strconv" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// NodeUpdate updates a Node. -func (cli *Client) NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error { - query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) - resp, err := cli.post(ctx, "/nodes/"+nodeID+"/update", query, node, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go deleted file mode 100644 index 22dcda24..00000000 --- a/vendor/github.com/docker/docker/client/ping.go +++ /dev/null @@ -1,30 +0,0 @@ -package client - -import ( - "fmt" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// Ping pings the server and return the value of the "Docker-Experimental" & "API-Version" headers -func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { - var ping types.Ping - req, err := cli.buildRequest("GET", fmt.Sprintf("%s/_ping", cli.basePath), nil, nil) - if err != nil { - return ping, err - } - serverResp, err := cli.doRequest(ctx, req) - if err != nil { - return ping, err - } - defer ensureReaderClosed(serverResp) - - ping.APIVersion = serverResp.header.Get("API-Version") - - if serverResp.header.Get("Docker-Experimental") == "true" { - ping.Experimental = true - } - - return ping, nil -} diff --git a/vendor/github.com/docker/docker/client/plugin_create.go b/vendor/github.com/docker/docker/client/plugin_create.go deleted file mode 100644 index a660ba57..00000000 --- a/vendor/github.com/docker/docker/client/plugin_create.go +++ /dev/null @@ -1,26 +0,0 @@ -package client - -import ( - "io" - "net/http" - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// PluginCreate creates a plugin -func (cli *Client) PluginCreate(ctx context.Context, createContext io.Reader, createOptions types.PluginCreateOptions) error { - headers := http.Header(make(map[string][]string)) - headers.Set("Content-Type", "application/tar") - - query := url.Values{} - query.Set("name", createOptions.RepoName) - - resp, err := cli.postRaw(ctx, "/plugins/create", query, createContext, headers) - if err != nil { - return err - } - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/plugin_disable.go b/vendor/github.com/docker/docker/client/plugin_disable.go deleted file mode 100644 index 30467db7..00000000 --- a/vendor/github.com/docker/docker/client/plugin_disable.go +++ /dev/null @@ -1,19 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// PluginDisable disables a plugin -func (cli *Client) PluginDisable(ctx context.Context, name string, options types.PluginDisableOptions) error { - query := url.Values{} - if options.Force { - query.Set("force", "1") - } - resp, err := cli.post(ctx, "/plugins/"+name+"/disable", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/plugin_enable.go b/vendor/github.com/docker/docker/client/plugin_enable.go deleted file mode 100644 index 95517c4b..00000000 --- a/vendor/github.com/docker/docker/client/plugin_enable.go +++ /dev/null @@ -1,19 +0,0 @@ -package client - -import ( - "net/url" - "strconv" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// PluginEnable enables a plugin -func (cli *Client) PluginEnable(ctx context.Context, name string, options types.PluginEnableOptions) error { - query := url.Values{} - query.Set("timeout", strconv.Itoa(options.Timeout)) - - resp, err := cli.post(ctx, "/plugins/"+name+"/enable", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/plugin_inspect.go b/vendor/github.com/docker/docker/client/plugin_inspect.go deleted file mode 100644 index 89f39ee2..00000000 --- a/vendor/github.com/docker/docker/client/plugin_inspect.go +++ /dev/null @@ -1,32 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// PluginInspectWithRaw inspects an existing plugin -func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) { - resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil) - if err != nil { - if resp.statusCode == http.StatusNotFound { - return nil, nil, pluginNotFoundError{name} - } - return nil, nil, err - } - - defer ensureReaderClosed(resp) - body, err := ioutil.ReadAll(resp.body) - if err != nil { - return nil, nil, err - } - var p types.Plugin - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&p) - return &p, body, err -} diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go deleted file mode 100644 index 3217c4cf..00000000 --- a/vendor/github.com/docker/docker/client/plugin_install.go +++ /dev/null @@ -1,113 +0,0 @@ -package client - -import ( - "encoding/json" - "io" - "net/http" - "net/url" - - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -// PluginInstall installs a plugin -func (cli *Client) PluginInstall(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) { - query := url.Values{} - if _, err := reference.ParseNamed(options.RemoteRef); err != nil { - return nil, errors.Wrap(err, "invalid remote reference") - } - query.Set("remote", options.RemoteRef) - - privileges, err := cli.checkPluginPermissions(ctx, query, options) - if err != nil { - return nil, err - } - - // set name for plugin pull, if empty should default to remote reference - query.Set("name", name) - - resp, err := cli.tryPluginPull(ctx, query, privileges, options.RegistryAuth) - if err != nil { - return nil, err - } - - name = resp.header.Get("Docker-Plugin-Name") - - pr, pw := io.Pipe() - go func() { // todo: the client should probably be designed more around the actual api - _, err := io.Copy(pw, resp.body) - if err != nil { - pw.CloseWithError(err) - return - } - defer func() { - if err != nil { - delResp, _ := cli.delete(ctx, "/plugins/"+name, nil, nil) - ensureReaderClosed(delResp) - } - }() - if len(options.Args) > 0 { - if err := cli.PluginSet(ctx, name, options.Args); err != nil { - pw.CloseWithError(err) - return - } - } - - if options.Disabled { - pw.Close() - return - } - - err = cli.PluginEnable(ctx, name, types.PluginEnableOptions{Timeout: 0}) - pw.CloseWithError(err) - }() - return pr, nil -} - -func (cli *Client) tryPluginPrivileges(ctx context.Context, query url.Values, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} - return cli.get(ctx, "/plugins/privileges", query, headers) -} - -func (cli *Client) tryPluginPull(ctx context.Context, query url.Values, privileges types.PluginPrivileges, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} - return cli.post(ctx, "/plugins/pull", query, privileges, headers) -} - -func (cli *Client) checkPluginPermissions(ctx context.Context, query url.Values, options types.PluginInstallOptions) (types.PluginPrivileges, error) { - resp, err := cli.tryPluginPrivileges(ctx, query, options.RegistryAuth) - if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { - // todo: do inspect before to check existing name before checking privileges - newAuthHeader, privilegeErr := options.PrivilegeFunc() - if privilegeErr != nil { - ensureReaderClosed(resp) - return nil, privilegeErr - } - options.RegistryAuth = newAuthHeader - resp, err = cli.tryPluginPrivileges(ctx, query, options.RegistryAuth) - } - if err != nil { - ensureReaderClosed(resp) - return nil, err - } - - var privileges types.PluginPrivileges - if err := json.NewDecoder(resp.body).Decode(&privileges); err != nil { - ensureReaderClosed(resp) - return nil, err - } - ensureReaderClosed(resp) - - if !options.AcceptAllPermissions && options.AcceptPermissionsFunc != nil && len(privileges) > 0 { - accept, err := options.AcceptPermissionsFunc(privileges) - if err != nil { - return nil, err - } - if !accept { - return nil, pluginPermissionDenied{options.RemoteRef} - } - } - return privileges, nil -} diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go deleted file mode 100644 index 88c480a3..00000000 --- a/vendor/github.com/docker/docker/client/plugin_list.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// PluginList returns the installed plugins -func (cli *Client) PluginList(ctx context.Context) (types.PluginsListResponse, error) { - var plugins types.PluginsListResponse - resp, err := cli.get(ctx, "/plugins", nil, nil) - if err != nil { - return plugins, err - } - - err = json.NewDecoder(resp.body).Decode(&plugins) - ensureReaderClosed(resp) - return plugins, err -} diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go deleted file mode 100644 index 1e5f9632..00000000 --- a/vendor/github.com/docker/docker/client/plugin_push.go +++ /dev/null @@ -1,17 +0,0 @@ -package client - -import ( - "io" - - "golang.org/x/net/context" -) - -// 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{"X-Registry-Auth": {registryAuth}} - resp, err := cli.post(ctx, "/plugins/"+name+"/push", nil, nil, headers) - if err != nil { - return nil, err - } - return resp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/plugin_remove.go b/vendor/github.com/docker/docker/client/plugin_remove.go deleted file mode 100644 index b017e4d3..00000000 --- a/vendor/github.com/docker/docker/client/plugin_remove.go +++ /dev/null @@ -1,20 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// PluginRemove removes a plugin -func (cli *Client) PluginRemove(ctx context.Context, name string, options types.PluginRemoveOptions) error { - query := url.Values{} - if options.Force { - query.Set("force", "1") - } - - resp, err := cli.delete(ctx, "/plugins/"+name, query, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/plugin_set.go b/vendor/github.com/docker/docker/client/plugin_set.go deleted file mode 100644 index 3260d2a9..00000000 --- a/vendor/github.com/docker/docker/client/plugin_set.go +++ /dev/null @@ -1,12 +0,0 @@ -package client - -import ( - "golang.org/x/net/context" -) - -// PluginSet modifies settings for an existing plugin -func (cli *Client) PluginSet(ctx context.Context, name string, args []string) error { - resp, err := cli.post(ctx, "/plugins/"+name+"/set", nil, args, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go deleted file mode 100644 index 95a4356b..00000000 --- a/vendor/github.com/docker/docker/client/plugin_upgrade.go +++ /dev/null @@ -1,37 +0,0 @@ -package client - -import ( - "fmt" - "io" - "net/url" - - "github.com/docker/distribution/reference" - "github.com/docker/docker/api/types" - "github.com/pkg/errors" - "golang.org/x/net/context" -) - -// PluginUpgrade upgrades a plugin -func (cli *Client) PluginUpgrade(ctx context.Context, name string, options types.PluginInstallOptions) (rc io.ReadCloser, err error) { - query := url.Values{} - if _, err := reference.ParseNamed(options.RemoteRef); err != nil { - return nil, errors.Wrap(err, "invalid remote reference") - } - query.Set("remote", options.RemoteRef) - - privileges, err := cli.checkPluginPermissions(ctx, query, options) - if err != nil { - return nil, err - } - - resp, err := cli.tryPluginUpgrade(ctx, query, privileges, name, options.RegistryAuth) - if err != nil { - return nil, err - } - return resp.body, nil -} - -func (cli *Client) tryPluginUpgrade(ctx context.Context, query url.Values, privileges types.PluginPrivileges, name, registryAuth string) (serverResponse, error) { - headers := map[string][]string{"X-Registry-Auth": {registryAuth}} - return cli.post(ctx, fmt.Sprintf("/plugins/%s/upgrade", name), query, privileges, headers) -} diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go deleted file mode 100644 index ac053636..00000000 --- a/vendor/github.com/docker/docker/client/request.go +++ /dev/null @@ -1,247 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "os" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/versions" - "github.com/pkg/errors" - "golang.org/x/net/context" - "golang.org/x/net/context/ctxhttp" -) - -// serverResponse is a wrapper for http API responses. -type serverResponse struct { - body io.ReadCloser - header http.Header - statusCode int -} - -// 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) { - return cli.sendRequest(ctx, "HEAD", path, query, nil, headers) -} - -// getWithContext 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) { - return cli.sendRequest(ctx, "GET", path, query, nil, headers) -} - -// postWithContext 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) { - body, headers, err := encodeBody(obj, headers) - if err != nil { - return serverResponse{}, err - } - return cli.sendRequest(ctx, "POST", 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) { - return cli.sendRequest(ctx, "POST", path, query, body, headers) -} - -// put sends an http request to the docker API using the method PUT. -func (cli *Client) put(ctx context.Context, path string, query url.Values, obj interface{}, headers map[string][]string) (serverResponse, error) { - body, headers, err := encodeBody(obj, headers) - if err != nil { - return serverResponse{}, err - } - return cli.sendRequest(ctx, "PUT", path, query, body, headers) -} - -// put 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) { - return cli.sendRequest(ctx, "PUT", 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) { - return cli.sendRequest(ctx, "DELETE", path, query, nil, headers) -} - -type headers map[string][]string - -func encodeBody(obj interface{}, headers headers) (io.Reader, headers, error) { - if obj == nil { - return nil, headers, nil - } - - body, err := encodeData(obj) - if err != nil { - return nil, headers, err - } - if headers == nil { - headers = make(map[string][]string) - } - headers["Content-Type"] = []string{"application/json"} - return body, headers, nil -} - -func (cli *Client) buildRequest(method, path string, body io.Reader, headers headers) (*http.Request, error) { - expectedPayload := (method == "POST" || method == "PUT") - if expectedPayload && body == nil { - body = bytes.NewReader([]byte{}) - } - - req, err := http.NewRequest(method, path, body) - if err != nil { - return nil, err - } - req = cli.addHeaders(req, headers) - - if cli.proto == "unix" || cli.proto == "npipe" { - // For local communications, it doesn't matter what the host is. We just - // need a valid and meaningful host name. (See #189) - req.Host = "docker" - } - - req.URL.Host = cli.addr - req.URL.Scheme = cli.scheme - - if expectedPayload && 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(path, query), body, headers) - if err != nil { - return serverResponse{}, err - } - return cli.doRequest(ctx, req) -} - -func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) { - serverResp := serverResponse{statusCode: -1} - - resp, err := ctxhttp.Do(ctx, cli.client, 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) - } - - if cli.scheme == "https" && strings.Contains(err.Error(), "bad certificate") { - return serverResp, fmt.Errorf("The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings: %v", err) - } - - // Don't decorate context sentinel errors; users may be comparing to - // them directly. - switch err { - case context.Canceled, context.DeadlineExceeded: - return serverResp, err - } - - if nErr, ok := err.(*url.Error); ok { - if nErr, ok := nErr.Err.(*net.OpError); ok { - if os.IsPermission(nErr.Err) { - return serverResp, errors.Wrapf(err, "Got 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() { - return serverResp, ErrorConnectionFailed(cli.host) - } - if !err.Temporary() { - if strings.Contains(err.Error(), "connection refused") || strings.Contains(err.Error(), "dial unix") { - return serverResp, ErrorConnectionFailed(cli.host) - } - } - } - - // Although there's not a strongly typed error for this in go-winio, - // lots of people are using the default configuration for the docker - // daemon on Windows where the daemon is listening on a named pipe - // `//./pipe/docker_engine, and the client must be running elevated. - // Give users a clue rather than the not-overly useful message - // such as `error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.25/info: - // open //./pipe/docker_engine: The system cannot find the file specified.`. - // Note we can't string compare "The system cannot find the file specified" as - // this is localised - for example in French the error would be - // `open //./pipe/docker_engine: Le fichier spécifié est introuvable.` - if strings.Contains(err.Error(), `open //./pipe/docker_engine`) { - err = errors.New(err.Error() + " In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.") - } - - return serverResp, errors.Wrap(err, "error during connect") - } - - if resp != nil { - serverResp.statusCode = resp.StatusCode - } - - if serverResp.statusCode < 200 || serverResp.statusCode >= 400 { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return serverResp, err - } - if len(body) == 0 { - return serverResp, fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), req.URL) - } - - var errorMessage string - if (cli.version == "" || versions.GreaterThan(cli.version, "1.23")) && - resp.Header.Get("Content-Type") == "application/json" { - var errorResponse types.ErrorResponse - if err := json.Unmarshal(body, &errorResponse); err != nil { - return serverResp, fmt.Errorf("Error reading JSON: %v", err) - } - errorMessage = errorResponse.Message - } else { - errorMessage = string(body) - } - - return serverResp, fmt.Errorf("Error response from daemon: %s", strings.TrimSpace(errorMessage)) - } - - serverResp.body = resp.Body - serverResp.header = resp.Header - return serverResp, nil -} - -func (cli *Client) addHeaders(req *http.Request, headers headers) *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 { - if versions.LessThan(cli.version, "1.25") && k == "User-Agent" { - continue - } - req.Header.Set(k, v) - } - - if headers != nil { - for k, v := range headers { - req.Header[k] = v - } - } - return req -} - -func encodeData(data interface{}) (*bytes.Buffer, error) { - params := bytes.NewBuffer(nil) - if data != nil { - if err := json.NewEncoder(params).Encode(data); err != nil { - return nil, err - } - } - return params, nil -} - -func ensureReaderClosed(response serverResponse) { - if body := response.body; body != nil { - // Drain up to 512 bytes and close the body to let the Transport reuse the connection - io.CopyN(ioutil.Discard, body, 512) - response.body.Close() - } -} diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go deleted file mode 100644 index de8b0415..00000000 --- a/vendor/github.com/docker/docker/client/secret_create.go +++ /dev/null @@ -1,24 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SecretCreate creates a new Secret. -func (cli *Client) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) { - var headers map[string][]string - - var response types.SecretCreateResponse - resp, err := cli.post(ctx, "/secrets/create", nil, secret, headers) - if err != nil { - return response, err - } - - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go deleted file mode 100644 index f7745761..00000000 --- a/vendor/github.com/docker/docker/client/secret_inspect.go +++ /dev/null @@ -1,34 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SecretInspectWithRaw returns the secret information with raw data -func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.Secret, []byte, error) { - resp, err := cli.get(ctx, "/secrets/"+id, nil, nil) - if err != nil { - if resp.statusCode == http.StatusNotFound { - return swarm.Secret{}, nil, secretNotFoundError{id} - } - return swarm.Secret{}, nil, err - } - defer ensureReaderClosed(resp) - - body, err := ioutil.ReadAll(resp.body) - if err != nil { - return swarm.Secret{}, nil, err - } - - var secret swarm.Secret - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&secret) - - return secret, body, err -} diff --git a/vendor/github.com/docker/docker/client/secret_list.go b/vendor/github.com/docker/docker/client/secret_list.go deleted file mode 100644 index 7e9d5ec1..00000000 --- a/vendor/github.com/docker/docker/client/secret_list.go +++ /dev/null @@ -1,35 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SecretList returns the list of secrets. -func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) { - query := url.Values{} - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) - if err != nil { - return nil, err - } - - query.Set("filters", filterJSON) - } - - resp, err := cli.get(ctx, "/secrets", query, nil) - if err != nil { - return nil, err - } - - var secrets []swarm.Secret - err = json.NewDecoder(resp.body).Decode(&secrets) - ensureReaderClosed(resp) - return secrets, err -} diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go deleted file mode 100644 index 1955b988..00000000 --- a/vendor/github.com/docker/docker/client/secret_remove.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -import "golang.org/x/net/context" - -// SecretRemove removes a Secret. -func (cli *Client) SecretRemove(ctx context.Context, id string) error { - resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go deleted file mode 100644 index b94e24aa..00000000 --- a/vendor/github.com/docker/docker/client/secret_update.go +++ /dev/null @@ -1,19 +0,0 @@ -package client - -import ( - "net/url" - "strconv" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SecretUpdate updates a Secret. Currently, the only part of a secret spec -// which can be updated is Labels. -func (cli *Client) SecretUpdate(ctx context.Context, id string, version swarm.Version, secret swarm.SecretSpec) error { - query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) - resp, err := cli.post(ctx, "/secrets/"+id+"/update", query, secret, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go deleted file mode 100644 index 3d1be225..00000000 --- a/vendor/github.com/docker/docker/client/service_create.go +++ /dev/null @@ -1,30 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// ServiceCreate creates a new Service. -func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) { - var headers map[string][]string - - if options.EncodedRegistryAuth != "" { - headers = map[string][]string{ - "X-Registry-Auth": {options.EncodedRegistryAuth}, - } - } - - var response types.ServiceCreateResponse - resp, err := cli.post(ctx, "/services/create", nil, service, headers) - if err != nil { - return response, err - } - - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/service_inspect.go b/vendor/github.com/docker/docker/client/service_inspect.go deleted file mode 100644 index ca71cbde..00000000 --- a/vendor/github.com/docker/docker/client/service_inspect.go +++ /dev/null @@ -1,33 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// ServiceInspectWithRaw returns the service information and the raw data. -func (cli *Client) ServiceInspectWithRaw(ctx context.Context, serviceID string) (swarm.Service, []byte, error) { - serverResp, err := cli.get(ctx, "/services/"+serviceID, nil, nil) - if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Service{}, nil, serviceNotFoundError{serviceID} - } - return swarm.Service{}, nil, err - } - defer ensureReaderClosed(serverResp) - - body, err := ioutil.ReadAll(serverResp.body) - if err != nil { - return swarm.Service{}, nil, err - } - - var response swarm.Service - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&response) - return response, body, err -} diff --git a/vendor/github.com/docker/docker/client/service_list.go b/vendor/github.com/docker/docker/client/service_list.go deleted file mode 100644 index c29e6d40..00000000 --- a/vendor/github.com/docker/docker/client/service_list.go +++ /dev/null @@ -1,35 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// ServiceList returns the list of services. -func (cli *Client) ServiceList(ctx context.Context, options types.ServiceListOptions) ([]swarm.Service, error) { - query := url.Values{} - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) - if err != nil { - return nil, err - } - - query.Set("filters", filterJSON) - } - - resp, err := cli.get(ctx, "/services", query, nil) - if err != nil { - return nil, err - } - - var services []swarm.Service - err = json.NewDecoder(resp.body).Decode(&services) - ensureReaderClosed(resp) - return services, err -} diff --git a/vendor/github.com/docker/docker/client/service_logs.go b/vendor/github.com/docker/docker/client/service_logs.go deleted file mode 100644 index 24384e3e..00000000 --- a/vendor/github.com/docker/docker/client/service_logs.go +++ /dev/null @@ -1,52 +0,0 @@ -package client - -import ( - "io" - "net/url" - "time" - - "golang.org/x/net/context" - - "github.com/docker/docker/api/types" - timetypes "github.com/docker/docker/api/types/time" -) - -// 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) { - query := url.Values{} - if options.ShowStdout { - query.Set("stdout", "1") - } - - if options.ShowStderr { - query.Set("stderr", "1") - } - - if options.Since != "" { - ts, err := timetypes.GetTimestamp(options.Since, time.Now()) - if err != nil { - return nil, err - } - query.Set("since", ts) - } - - if options.Timestamps { - query.Set("timestamps", "1") - } - - if options.Details { - query.Set("details", "1") - } - - if options.Follow { - query.Set("follow", "1") - } - query.Set("tail", options.Tail) - - resp, err := cli.get(ctx, "/services/"+serviceID+"/logs", query, nil) - if err != nil { - return nil, err - } - return resp.body, nil -} diff --git a/vendor/github.com/docker/docker/client/service_remove.go b/vendor/github.com/docker/docker/client/service_remove.go deleted file mode 100644 index a9331f92..00000000 --- a/vendor/github.com/docker/docker/client/service_remove.go +++ /dev/null @@ -1,10 +0,0 @@ -package client - -import "golang.org/x/net/context" - -// ServiceRemove kills and removes a service. -func (cli *Client) ServiceRemove(ctx context.Context, serviceID string) error { - resp, err := cli.delete(ctx, "/services/"+serviceID, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go deleted file mode 100644 index afa94d47..00000000 --- a/vendor/github.com/docker/docker/client/service_update.go +++ /dev/null @@ -1,41 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - "strconv" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// ServiceUpdate updates a Service. -func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { - var ( - headers map[string][]string - query = url.Values{} - ) - - if options.EncodedRegistryAuth != "" { - headers = map[string][]string{ - "X-Registry-Auth": {options.EncodedRegistryAuth}, - } - } - - if options.RegistryAuthFrom != "" { - query.Set("registryAuthFrom", options.RegistryAuthFrom) - } - - query.Set("version", strconv.FormatUint(version.Index, 10)) - - var response types.ServiceUpdateResponse - resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) - if err != nil { - return response, err - } - - err = json.NewDecoder(resp.body).Decode(&response) - ensureReaderClosed(resp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go deleted file mode 100644 index be28d326..00000000 --- a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// SwarmGetUnlockKey retrieves the swarm's unlock key. -func (cli *Client) SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error) { - serverResp, err := cli.get(ctx, "/swarm/unlockkey", nil, nil) - if err != nil { - return types.SwarmUnlockKeyResponse{}, err - } - - var response types.SwarmUnlockKeyResponse - err = json.NewDecoder(serverResp.body).Decode(&response) - ensureReaderClosed(serverResp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/swarm_init.go b/vendor/github.com/docker/docker/client/swarm_init.go deleted file mode 100644 index fd45d066..00000000 --- a/vendor/github.com/docker/docker/client/swarm_init.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SwarmInit initializes the Swarm. -func (cli *Client) SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error) { - serverResp, err := cli.post(ctx, "/swarm/init", nil, req, nil) - if err != nil { - return "", err - } - - var response string - err = json.NewDecoder(serverResp.body).Decode(&response) - ensureReaderClosed(serverResp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/swarm_inspect.go b/vendor/github.com/docker/docker/client/swarm_inspect.go deleted file mode 100644 index 6d95cfc0..00000000 --- a/vendor/github.com/docker/docker/client/swarm_inspect.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SwarmInspect inspects the Swarm. -func (cli *Client) SwarmInspect(ctx context.Context) (swarm.Swarm, error) { - serverResp, err := cli.get(ctx, "/swarm", nil, nil) - if err != nil { - return swarm.Swarm{}, err - } - - var response swarm.Swarm - err = json.NewDecoder(serverResp.body).Decode(&response) - ensureReaderClosed(serverResp) - return response, err -} diff --git a/vendor/github.com/docker/docker/client/swarm_join.go b/vendor/github.com/docker/docker/client/swarm_join.go deleted file mode 100644 index cda99930..00000000 --- a/vendor/github.com/docker/docker/client/swarm_join.go +++ /dev/null @@ -1,13 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SwarmJoin joins the Swarm. -func (cli *Client) SwarmJoin(ctx context.Context, req swarm.JoinRequest) error { - resp, err := cli.post(ctx, "/swarm/join", nil, req, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/swarm_leave.go b/vendor/github.com/docker/docker/client/swarm_leave.go deleted file mode 100644 index a4df7321..00000000 --- a/vendor/github.com/docker/docker/client/swarm_leave.go +++ /dev/null @@ -1,18 +0,0 @@ -package client - -import ( - "net/url" - - "golang.org/x/net/context" -) - -// SwarmLeave leaves the Swarm. -func (cli *Client) SwarmLeave(ctx context.Context, force bool) error { - query := url.Values{} - if force { - query.Set("force", "1") - } - resp, err := cli.post(ctx, "/swarm/leave", query, nil, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/swarm_unlock.go b/vendor/github.com/docker/docker/client/swarm_unlock.go deleted file mode 100644 index addfb59f..00000000 --- a/vendor/github.com/docker/docker/client/swarm_unlock.go +++ /dev/null @@ -1,17 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SwarmUnlock unlockes locked swarm. -func (cli *Client) SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error { - serverResp, err := cli.post(ctx, "/swarm/unlock", nil, req, nil) - if err != nil { - return err - } - - ensureReaderClosed(serverResp) - return err -} diff --git a/vendor/github.com/docker/docker/client/swarm_update.go b/vendor/github.com/docker/docker/client/swarm_update.go deleted file mode 100644 index cc8eeb65..00000000 --- a/vendor/github.com/docker/docker/client/swarm_update.go +++ /dev/null @@ -1,22 +0,0 @@ -package client - -import ( - "fmt" - "net/url" - "strconv" - - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// SwarmUpdate updates the Swarm. -func (cli *Client) SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error { - query := url.Values{} - query.Set("version", strconv.FormatUint(version.Index, 10)) - query.Set("rotateWorkerToken", fmt.Sprintf("%v", flags.RotateWorkerToken)) - query.Set("rotateManagerToken", fmt.Sprintf("%v", flags.RotateManagerToken)) - query.Set("rotateManagerUnlockKey", fmt.Sprintf("%v", flags.RotateManagerUnlockKey)) - resp, err := cli.post(ctx, "/swarm/update", query, swarm, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go deleted file mode 100644 index bc8058fc..00000000 --- a/vendor/github.com/docker/docker/client/task_inspect.go +++ /dev/null @@ -1,34 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types/swarm" - - "golang.org/x/net/context" -) - -// TaskInspectWithRaw returns the task information and its raw representation.. -func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { - serverResp, err := cli.get(ctx, "/tasks/"+taskID, nil, nil) - if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Task{}, nil, taskNotFoundError{taskID} - } - return swarm.Task{}, nil, err - } - defer ensureReaderClosed(serverResp) - - body, err := ioutil.ReadAll(serverResp.body) - if err != nil { - return swarm.Task{}, nil, err - } - - var response swarm.Task - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&response) - return response, body, err -} diff --git a/vendor/github.com/docker/docker/client/task_list.go b/vendor/github.com/docker/docker/client/task_list.go deleted file mode 100644 index 66324da9..00000000 --- a/vendor/github.com/docker/docker/client/task_list.go +++ /dev/null @@ -1,35 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" -) - -// TaskList returns the list of tasks. -func (cli *Client) TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) { - query := url.Values{} - - if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) - if err != nil { - return nil, err - } - - query.Set("filters", filterJSON) - } - - resp, err := cli.get(ctx, "/tasks", query, nil) - if err != nil { - return nil, err - } - - var tasks []swarm.Task - err = json.NewDecoder(resp.body).Decode(&tasks) - ensureReaderClosed(resp) - return tasks, err -} 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 f04e6016..00000000 --- a/vendor/github.com/docker/docker/client/transport.go +++ /dev/null @@ -1,28 +0,0 @@ -package client - -import ( - "crypto/tls" - "errors" - "net/http" -) - -var errTLSConfigUnavailable = errors.New("TLSConfig unavailable") - -// transportFunc allows us to inject a mock transport for testing. We define it -// here so we can detect the tlsconfig and return nil for only this type. -type transportFunc func(*http.Request) (*http.Response, error) - -func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) { - return tf(req) -} - -// 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/utils.go b/vendor/github.com/docker/docker/client/utils.go deleted file mode 100644 index 23d520ec..00000000 --- a/vendor/github.com/docker/docker/client/utils.go +++ /dev/null @@ -1,33 +0,0 @@ -package client - -import ( - "github.com/docker/docker/api/types/filters" - "net/url" - "regexp" -) - -var headerRegexp = regexp.MustCompile(`\ADocker/.+\s\((.+)\)\z`) - -// getDockerOS returns the operating system based on the server header from the daemon. -func getDockerOS(serverHeader string) string { - var osType string - matches := headerRegexp.FindStringSubmatch(serverHeader) - if len(matches) > 0 { - osType = matches[1] - } - return osType -} - -// getFiltersQuery returns a url query with "filters" query term, based on the -// filters provided. -func getFiltersQuery(f filters.Args) (url.Values, error) { - query := url.Values{} - if f.Len() > 0 { - filterJSON, err := filters.ToParam(f) - if err != nil { - return query, err - } - query.Set("filters", filterJSON) - } - return query, nil -} diff --git a/vendor/github.com/docker/docker/client/version.go b/vendor/github.com/docker/docker/client/version.go deleted file mode 100644 index 933ceb4a..00000000 --- a/vendor/github.com/docker/docker/client/version.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// ServerVersion returns information of the docker client and server host. -func (cli *Client) ServerVersion(ctx context.Context) (types.Version, error) { - resp, err := cli.get(ctx, "/version", nil, nil) - if err != nil { - return types.Version{}, err - } - - var server types.Version - err = json.NewDecoder(resp.body).Decode(&server) - ensureReaderClosed(resp) - return server, err -} diff --git a/vendor/github.com/docker/docker/client/volume_create.go b/vendor/github.com/docker/docker/client/volume_create.go deleted file mode 100644 index 9620c87c..00000000 --- a/vendor/github.com/docker/docker/client/volume_create.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "encoding/json" - - "github.com/docker/docker/api/types" - volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" -) - -// VolumeCreate creates a volume in the docker host. -func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) { - var volume types.Volume - resp, err := cli.post(ctx, "/volumes/create", nil, options, nil) - if err != nil { - return volume, err - } - err = json.NewDecoder(resp.body).Decode(&volume) - ensureReaderClosed(resp) - return volume, err -} diff --git a/vendor/github.com/docker/docker/client/volume_inspect.go b/vendor/github.com/docker/docker/client/volume_inspect.go deleted file mode 100644 index 3860e9b2..00000000 --- a/vendor/github.com/docker/docker/client/volume_inspect.go +++ /dev/null @@ -1,38 +0,0 @@ -package client - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/docker/docker/api/types" - "golang.org/x/net/context" -) - -// VolumeInspect returns the information about a specific volume in the docker host. -func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) { - volume, _, err := cli.VolumeInspectWithRaw(ctx, volumeID) - return volume, err -} - -// VolumeInspectWithRaw returns the information about a specific volume in the docker host and its raw representation -func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) { - var volume types.Volume - resp, err := cli.get(ctx, "/volumes/"+volumeID, nil, nil) - if err != nil { - if resp.statusCode == http.StatusNotFound { - return volume, nil, volumeNotFoundError{volumeID} - } - return volume, nil, err - } - defer ensureReaderClosed(resp) - - body, err := ioutil.ReadAll(resp.body) - if err != nil { - return volume, nil, err - } - rdr := bytes.NewReader(body) - err = json.NewDecoder(rdr).Decode(&volume) - return volume, body, err -} diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go deleted file mode 100644 index 32247ce1..00000000 --- a/vendor/github.com/docker/docker/client/volume_list.go +++ /dev/null @@ -1,32 +0,0 @@ -package client - -import ( - "encoding/json" - "net/url" - - "github.com/docker/docker/api/types/filters" - volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" -) - -// VolumeList returns the volumes configured in the docker host. -func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) { - var volumes volumetypes.VolumesListOKBody - query := url.Values{} - - if filter.Len() > 0 { - filterJSON, err := filters.ToParamWithVersion(cli.version, filter) - if err != nil { - return volumes, err - } - query.Set("filters", filterJSON) - } - resp, err := cli.get(ctx, "/volumes", query, nil) - if err != nil { - return volumes, err - } - - err = json.NewDecoder(resp.body).Decode(&volumes) - ensureReaderClosed(resp) - return volumes, err -} diff --git a/vendor/github.com/docker/docker/client/volume_prune.go b/vendor/github.com/docker/docker/client/volume_prune.go deleted file mode 100644 index a07e4ce6..00000000 --- a/vendor/github.com/docker/docker/client/volume_prune.go +++ /dev/null @@ -1,36 +0,0 @@ -package client - -import ( - "encoding/json" - "fmt" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" -) - -// VolumesPrune requests the daemon to delete unused data -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 { - return report, err - } - - query, err := getFiltersQuery(pruneFilters) - if err != nil { - return report, err - } - - serverResp, err := cli.post(ctx, "/volumes/prune", query, nil, nil) - if err != nil { - return report, err - } - defer ensureReaderClosed(serverResp) - - if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { - return report, fmt.Errorf("Error retrieving disk usage: %v", err) - } - - return report, nil -} diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go deleted file mode 100644 index 6c26575b..00000000 --- a/vendor/github.com/docker/docker/client/volume_remove.go +++ /dev/null @@ -1,21 +0,0 @@ -package client - -import ( - "net/url" - - "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" -) - -// 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 { - query.Set("force", "1") - } - } - resp, err := cli.delete(ctx, "/volumes/"+volumeID, query, nil) - ensureReaderClosed(resp) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go deleted file mode 100644 index e4dec3a5..00000000 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build go1.8 - -package tlsconfig - -import "crypto/tls" - -// Clone returns a clone of tls.Config. This function is provided for -// compatibility for go1.7 that doesn't include this method in stdlib. -func Clone(c *tls.Config) *tls.Config { - return c.Clone() -} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go deleted file mode 100644 index 0b816650..00000000 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go16.go +++ /dev/null @@ -1,31 +0,0 @@ -// +build go1.6,!go1.7 - -package tlsconfig - -import "crypto/tls" - -// Clone returns a clone of tls.Config. This function is provided for -// compatibility for go1.6 that doesn't include this method in stdlib. -func Clone(c *tls.Config) *tls.Config { - return &tls.Config{ - Rand: c.Rand, - Time: c.Time, - Certificates: c.Certificates, - NameToCertificate: c.NameToCertificate, - GetCertificate: c.GetCertificate, - RootCAs: c.RootCAs, - NextProtos: c.NextProtos, - ServerName: c.ServerName, - ClientAuth: c.ClientAuth, - ClientCAs: c.ClientCAs, - InsecureSkipVerify: c.InsecureSkipVerify, - CipherSuites: c.CipherSuites, - PreferServerCipherSuites: c.PreferServerCipherSuites, - SessionTicketsDisabled: c.SessionTicketsDisabled, - SessionTicketKey: c.SessionTicketKey, - ClientSessionCache: c.ClientSessionCache, - MinVersion: c.MinVersion, - MaxVersion: c.MaxVersion, - CurvePreferences: c.CurvePreferences, - } -} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go deleted file mode 100644 index 0d5b448f..00000000 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build go1.7,!go1.8 - -package tlsconfig - -import "crypto/tls" - -// Clone returns a clone of tls.Config. This function is provided for -// compatibility for go1.7 that doesn't include this method in stdlib. -func Clone(c *tls.Config) *tls.Config { - return &tls.Config{ - Rand: c.Rand, - Time: c.Time, - Certificates: c.Certificates, - NameToCertificate: c.NameToCertificate, - GetCertificate: c.GetCertificate, - RootCAs: c.RootCAs, - NextProtos: c.NextProtos, - ServerName: c.ServerName, - ClientAuth: c.ClientAuth, - ClientCAs: c.ClientCAs, - InsecureSkipVerify: c.InsecureSkipVerify, - CipherSuites: c.CipherSuites, - PreferServerCipherSuites: c.PreferServerCipherSuites, - SessionTicketsDisabled: c.SessionTicketsDisabled, - SessionTicketKey: c.SessionTicketKey, - ClientSessionCache: c.ClientSessionCache, - MinVersion: c.MinVersion, - MaxVersion: c.MaxVersion, - CurvePreferences: c.CurvePreferences, - DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, - Renegotiation: c.Renegotiation, - } -} diff --git a/vendor/github.com/docker/go-connections/LICENSE b/vendor/github.com/docker/go-connections/LICENSE deleted file mode 100644 index b55b37bc..00000000 --- a/vendor/github.com/docker/go-connections/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2015 Docker, Inc. - - 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 - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/go-connections/nat/nat.go b/vendor/github.com/docker/go-connections/nat/nat.go deleted file mode 100644 index bb7e4e33..00000000 --- a/vendor/github.com/docker/go-connections/nat/nat.go +++ /dev/null @@ -1,242 +0,0 @@ -// Package nat is a convenience package for manipulation of strings describing network ports. -package nat - -import ( - "fmt" - "net" - "strconv" - "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 - HostIP string `json:"HostIp"` - // HostPort is the host port number - HostPort string -} - -// PortMap is a collection of PortBinding indexed by Port -type PortMap map[Port][]PortBinding - -// PortSet is a collection of structs indexed by Port -type PortSet map[Port]struct{} - -// Port is a string containing port number and protocol in the format "80/tcp" -type Port string - -// NewPort creates a new instance of a Port given a protocol and port number or port range -func NewPort(proto, port string) (Port, error) { - // Check for parsing issues on "port" now so we can avoid having - // to check it later on. - - portStartInt, portEndInt, err := ParsePortRangeToInt(port) - if err != nil { - return "", err - } - - if portStartInt == portEndInt { - return Port(fmt.Sprintf("%d/%s", portStartInt, proto)), nil - } - return Port(fmt.Sprintf("%d-%d/%s", portStartInt, portEndInt, proto)), nil -} - -// ParsePort parses the port number string and returns an int -func ParsePort(rawPort string) (int, error) { - if len(rawPort) == 0 { - return 0, nil - } - port, err := strconv.ParseUint(rawPort, 10, 16) - if err != nil { - return 0, err - } - return int(port), nil -} - -// ParsePortRangeToInt parses the port range string and returns start/end ints -func ParsePortRangeToInt(rawPort string) (int, int, error) { - if len(rawPort) == 0 { - return 0, 0, nil - } - start, end, err := ParsePortRange(rawPort) - if err != nil { - return 0, 0, err - } - return int(start), int(end), nil -} - -// Proto returns the protocol of a Port -func (p Port) Proto() string { - proto, _ := SplitProtoPort(string(p)) - return proto -} - -// Port returns the port number of a Port -func (p Port) Port() string { - _, port := SplitProtoPort(string(p)) - return port -} - -// Int returns the port number of a Port as an int -func (p Port) Int() int { - portStr := p.Port() - // We don't need to check for an error because we're going to - // assume that any error would have been found, and reported, in NewPort() - port, _ := ParsePort(portStr) - return port -} - -// Range returns the start/end port numbers of a Port range as ints -func (p Port) Range() (int, int, error) { - return ParsePortRangeToInt(p.Port()) -} - -// SplitProtoPort splits a port in the format of proto/port -func SplitProtoPort(rawPort string) (string, string) { - parts := strings.Split(rawPort, "/") - l := len(parts) - if len(rawPort) == 0 || l == 0 || len(parts[0]) == 0 { - return "", "" - } - if l == 1 { - return "tcp", rawPort - } - if len(parts[1]) == 0 { - return "tcp", parts[0] - } - return parts[1], parts[0] -} - -func validateProto(proto string) bool { - for _, availableProto := range []string{"tcp", "udp", "sctp"} { - if availableProto == proto { - return true - } - } - return false -} - -// ParsePortSpecs receives port specs in the format of ip:public:private/proto and parses -// these in to the internal types -func ParsePortSpecs(ports []string) (map[Port]struct{}, map[Port][]PortBinding, error) { - var ( - exposedPorts = make(map[Port]struct{}, len(ports)) - bindings = make(map[Port][]PortBinding) - ) - for _, rawPort := range ports { - portMappings, err := ParsePortSpec(rawPort) - if err != nil { - return nil, nil, err - } - - for _, portMapping := range portMappings { - port := portMapping.Port - if _, exists := exposedPorts[port]; !exists { - exposedPorts[port] = struct{}{} - } - bslice, exists := bindings[port] - if !exists { - bslice = []PortBinding{} - } - bindings[port] = append(bslice, portMapping.Binding) - } - } - return exposedPorts, bindings, nil -} - -// PortMapping is a data object mapping a Port to a PortBinding -type PortMapping struct { - Port Port - Binding PortBinding -} - -func splitParts(rawport string) (string, string, string) { - parts := strings.Split(rawport, ":") - n := len(parts) - containerport := parts[n-1] - - switch n { - case 1: - return "", "", containerport - case 2: - return "", parts[0], containerport - case 3: - return parts[0], parts[1], containerport - default: - 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) - 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 != "" && net.ParseIP(ip) == nil { - return nil, fmt.Errorf("Invalid ip address: %s", ip) - } - if containerPort == "" { - 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) - } - - 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) - } - } - - if hostPort != "" && (endPort-startPort) != (endHostPort-startHostPort) { - // Allow host port range iff containerPort is not a range. - // 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) - } - } - - if !validateProto(strings.ToLower(proto)) { - return nil, fmt.Errorf("Invalid proto: %s", proto) - } - - ports := []PortMapping{} - for i := uint64(0); i <= (endPort - startPort); i++ { - containerPort = strconv.FormatUint(startPort+i, 10) - if len(hostPort) > 0 { - hostPort = strconv.FormatUint(startHostPort+i, 10) - } - // Set hostPort to a range only if there is a single container port - // and a dynamic host port. - if startPort == endPort && startHostPort != endHostPort { - hostPort = fmt.Sprintf("%s-%s", hostPort, strconv.FormatUint(endHostPort, 10)) - } - port, err := NewPort(strings.ToLower(proto), containerPort) - if err != nil { - return nil, err - } - - binding := PortBinding{ - HostIP: ip, - HostPort: hostPort, - } - ports = append(ports, PortMapping{Port: port, Binding: binding}) - } - return ports, nil -} diff --git a/vendor/github.com/docker/go-connections/nat/parse.go b/vendor/github.com/docker/go-connections/nat/parse.go deleted file mode 100644 index 892adf8c..00000000 --- a/vendor/github.com/docker/go-connections/nat/parse.go +++ /dev/null @@ -1,57 +0,0 @@ -package nat - -import ( - "fmt" - "strconv" - "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.") - } - if !strings.Contains(ports, "-") { - start, err := strconv.ParseUint(ports, 10, 16) - end := start - return start, end, err - } - - parts := strings.Split(ports, "-") - start, err := strconv.ParseUint(parts[0], 10, 16) - if err != nil { - return 0, 0, err - } - end, err := strconv.ParseUint(parts[1], 10, 16) - if err != nil { - return 0, 0, err - } - if end < start { - return 0, 0, fmt.Errorf("Invalid range specified for the 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 deleted file mode 100644 index ce950171..00000000 --- a/vendor/github.com/docker/go-connections/nat/sort.go +++ /dev/null @@ -1,96 +0,0 @@ -package nat - -import ( - "sort" - "strings" -) - -type portSorter struct { - ports []Port - by func(i, j Port) bool -} - -func (s *portSorter) Len() int { - return len(s.ports) -} - -func (s *portSorter) Swap(i, j int) { - s.ports[i], s.ports[j] = s.ports[j], s.ports[i] -} - -func (s *portSorter) Less(i, j int) bool { - ip := s.ports[i] - jp := s.ports[j] - - return s.by(ip, jp) -} - -// Sort sorts a list of ports using the provided predicate -// This function should compare `i` and `j`, returning true if `i` is -// considered to be less than `j` -func Sort(ports []Port, predicate func(i, j Port) bool) { - s := &portSorter{ports, predicate} - sort.Sort(s) -} - -type portMapEntry struct { - port Port - binding PortBinding -} - -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: -// 1. port with larger specified bindings -// 2. larger port -// 3. port with tcp protocol -func (s portMapSorter) Less(i, j int) bool { - pi, pj := s[i].port, s[j].port - hpi, hpj := toInt(s[i].binding.HostPort), toInt(s[j].binding.HostPort) - return hpi > hpj || pi.Int() > pj.Int() || (pi.Int() == pj.Int() && strings.ToLower(pi.Proto()) == "tcp") -} - -// SortPortMap sorts the list of ports and their respected mapping. The ports -// will explicit HostPort will be placed first. -func SortPortMap(ports []Port, bindings PortMap) { - s := portMapSorter{} - for _, p := range ports { - if binding, ok := bindings[p]; ok { - for _, b := range binding { - s = append(s, portMapEntry{port: p, binding: b}) - } - bindings[p] = []PortBinding{} - } else { - s = append(s, portMapEntry{port: p}) - } - } - - sort.Sort(s) - var ( - i int - pm = make(map[Port]struct{}) - ) - // reorder ports - for _, entry := range s { - if _, ok := pm[entry.port]; !ok { - ports[i] = entry.port - pm[entry.port] = struct{}{} - i++ - } - // reorder bindings for this port - if _, ok := bindings[entry.port]; ok { - bindings[entry.port] = append(bindings[entry.port], entry.binding) - } - } -} - -func toInt(s string) uint64 { - i, _, err := ParsePortRange(s) - if err != nil { - i = 0 - } - return i -} diff --git a/vendor/github.com/docker/go-connections/sockets/README.md b/vendor/github.com/docker/go-connections/sockets/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go b/vendor/github.com/docker/go-connections/sockets/inmem_socket.go deleted file mode 100644 index 99846ffd..00000000 --- a/vendor/github.com/docker/go-connections/sockets/inmem_socket.go +++ /dev/null @@ -1,81 +0,0 @@ -package sockets - -import ( - "errors" - "net" - "sync" -) - -var errClosed = errors.New("use of closed network connection") - -// InmemSocket implements net.Listener using in-memory only connections. -type InmemSocket struct { - chConn chan net.Conn - chClose chan struct{} - addr string - mu sync.Mutex -} - -// dummyAddr is used to satisfy net.Addr for the in-mem socket -// it is just stored as a string and returns the string for all calls -type dummyAddr string - -// NewInmemSocket creates an in-memory only net.Listener -// The addr argument can be any string, but is used to satisfy the `Addr()` part -// of the net.Listener interface -func NewInmemSocket(addr string, bufSize int) *InmemSocket { - return &InmemSocket{ - chConn: make(chan net.Conn, bufSize), - chClose: make(chan struct{}), - addr: addr, - } -} - -// Addr returns the socket's addr string to satisfy net.Listener -func (s *InmemSocket) Addr() net.Addr { - return dummyAddr(s.addr) -} - -// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn. -func (s *InmemSocket) Accept() (net.Conn, error) { - select { - case conn := <-s.chConn: - return conn, nil - case <-s.chClose: - return nil, errClosed - } -} - -// Close closes the listener. It will be unavailable for use once closed. -func (s *InmemSocket) Close() error { - s.mu.Lock() - defer s.mu.Unlock() - select { - case <-s.chClose: - default: - close(s.chClose) - } - return nil -} - -// Dial is used to establish a connection with the in-mem server -func (s *InmemSocket) Dial(network, addr string) (net.Conn, error) { - srvConn, clientConn := net.Pipe() - select { - case s.chConn <- srvConn: - case <-s.chClose: - return nil, errClosed - } - - return clientConn, nil -} - -// Network returns the addr string, satisfies net.Addr -func (a dummyAddr) Network() string { - return string(a) -} - -// String returns the string form -func (a dummyAddr) String() string { - return string(a) -} diff --git a/vendor/github.com/docker/go-connections/sockets/proxy.go b/vendor/github.com/docker/go-connections/sockets/proxy.go deleted file mode 100644 index 98e9a1dc..00000000 --- a/vendor/github.com/docker/go-connections/sockets/proxy.go +++ /dev/null @@ -1,51 +0,0 @@ -package sockets - -import ( - "net" - "net/url" - "os" - "strings" - - "golang.org/x/net/proxy" -) - -// GetProxyEnv allows access to the uppercase and the lowercase forms of -// proxy-related variables. See the Go specification for details on these -// variables. https://golang.org/pkg/net/http/ -func GetProxyEnv(key string) string { - proxyValue := os.Getenv(strings.ToUpper(key)) - if proxyValue == "" { - return os.Getenv(strings.ToLower(key)) - } - 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 -} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets.go b/vendor/github.com/docker/go-connections/sockets/sockets.go deleted file mode 100644 index a1d7beb4..00000000 --- a/vendor/github.com/docker/go-connections/sockets/sockets.go +++ /dev/null @@ -1,38 +0,0 @@ -// Package sockets provides helper functions to create and configure Unix or TCP sockets. -package sockets - -import ( - "errors" - "net" - "net/http" - "time" -) - -// Why 32? See https://github.com/docker/docker/pull/8035. -const defaultTimeout = 32 * 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. -func ConfigureTransport(tr *http.Transport, proto, addr string) error { - switch proto { - case "unix": - return configureUnixTransport(tr, proto, addr) - case "npipe": - return configureNpipeTransport(tr, proto, addr) - default: - tr.Proxy = http.ProxyFromEnvironment - dialer, err := DialerFromEnvironment(&net.Dialer{ - Timeout: defaultTimeout, - }) - if err != nil { - return err - } - tr.Dial = dialer.Dial - } - 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 deleted file mode 100644 index 386cf0db..00000000 --- a/vendor/github.com/docker/go-connections/sockets/sockets_unix.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build !windows - -package sockets - -import ( - "fmt" - "net" - "net/http" - "syscall" - "time" -) - -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) - } - // No need for compression in local communications. - tr.DisableCompression = true - tr.Dial = func(_, _ string) (net.Conn, error) { - return net.DialTimeout(proto, addr, defaultTimeout) - } - return nil -} - -func configureNpipeTransport(tr *http.Transport, proto, addr string) error { - return ErrProtocolNotAvailable -} - -// DialPipe connects to a Windows named pipe. -// This is not supported on other OSes. -func DialPipe(_ string, _ time.Duration) (net.Conn, error) { - return nil, syscall.EAFNOSUPPORT -} diff --git a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go b/vendor/github.com/docker/go-connections/sockets/sockets_windows.go deleted file mode 100644 index 5c21644e..00000000 --- a/vendor/github.com/docker/go-connections/sockets/sockets_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -package sockets - -import ( - "net" - "net/http" - "time" - - "github.com/Microsoft/go-winio" -) - -func configureUnixTransport(tr *http.Transport, proto, addr string) error { - return ErrProtocolNotAvailable -} - -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) - } - return nil -} - -// DialPipe connects to a Windows named pipe. -func DialPipe(addr string, timeout time.Duration) (net.Conn, error) { - return winio.DialPipe(addr, &timeout) -} diff --git a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go b/vendor/github.com/docker/go-connections/sockets/tcp_socket.go deleted file mode 100644 index 53cbb6c7..00000000 --- a/vendor/github.com/docker/go-connections/sockets/tcp_socket.go +++ /dev/null @@ -1,22 +0,0 @@ -// Package sockets provides helper functions to create and configure Unix or TCP sockets. -package sockets - -import ( - "crypto/tls" - "net" -) - -// NewTCPSocket creates a TCP socket listener with the specified address and -// the specified tls configuration. If TLSConfig is set, will encapsulate the -// TCP listener inside a TLS one. -func NewTCPSocket(addr string, tlsConfig *tls.Config) (net.Listener, error) { - l, err := net.Listen("tcp", addr) - if err != nil { - return nil, err - } - if tlsConfig != nil { - tlsConfig.NextProtos = []string{"http/1.1"} - l = tls.NewListener(l, tlsConfig) - } - return l, 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 deleted file mode 100644 index a8b5dbb6..00000000 --- a/vendor/github.com/docker/go-connections/sockets/unix_socket.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build !windows - -package sockets - -import ( - "net" - "os" - "syscall" -) - -// NewUnixSocket creates a unix socket with the specified path and group. -func NewUnixSocket(path string, gid int) (net.Listener, error) { - if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) { - return nil, err - } - mask := syscall.Umask(0777) - defer syscall.Umask(mask) - - l, err := net.Listen("unix", path) - 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 - } - return l, nil -} diff --git a/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go b/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go deleted file mode 100644 index 1ca0965e..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/certpool_go17.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build go1.7 - -package tlsconfig - -import ( - "crypto/x509" - "runtime" -) - -// SystemCertPool returns a copy of the system cert pool, -// returns an error if failed to load or empty pool on windows. -func SystemCertPool() (*x509.CertPool, error) { - certpool, err := x509.SystemCertPool() - if err != nil && runtime.GOOS == "windows" { - return x509.NewCertPool(), nil - } - return certpool, err -} 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 1ff81c33..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/certpool_other.go +++ /dev/null @@ -1,13 +0,0 @@ -// +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 deleted file mode 100644 index 0ef3fdcb..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/config.go +++ /dev/null @@ -1,254 +0,0 @@ -// Package tlsconfig provides primitives to retrieve secure-enough TLS configurations for both clients and servers. -// -// As a reminder from https://golang.org/pkg/crypto/tls/#Config: -// A Config structure is used to configure a TLS client or server. After one has been passed to a TLS function it must not be modified. -// A Config may be reused; the tls package will also not modify it. -package tlsconfig - -import ( - "crypto/tls" - "crypto/x509" - "encoding/pem" - "fmt" - "io/ioutil" - "os" - - "github.com/pkg/errors" -) - -// Options represents the information needed to create client and server TLS configurations. -type Options struct { - CAFile string - - // If either CertFile or KeyFile is empty, Client() will not load them - // preventing the client from authenticating to the server. - // However, Server() requires them and will error out if they are empty. - CertFile string - KeyFile string - - // client-only option - InsecureSkipVerify bool - // server-only option - ClientAuth tls.ClientAuthType - // If ExclusiveRootPools is set, then if a CA file is provided, the root pool used for TLS - // creds will include exclusively the roots in that CA file. If no CA file is provided, - // the system pool will be used. - ExclusiveRootPools bool - MinVersion uint16 - // If Passphrase is set, it will be used to decrypt a TLS private key - // if the key is encrypted - Passphrase string -} - -// Extra (server-side) accepted CBC cipher suites - will phase out in the future -var acceptedCBCCiphers = []uint16{ - tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, -} - -// DefaultServerAcceptedCiphers should be uses by code which already has a crypto/tls -// options struct but wants to use a commonly accepted set of TLS cipher suites, with -// 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{ - // Avoid fallback by default to SSL protocols < TLS1.2 - MinVersion: tls.VersionTLS12, - PreferServerCipherSuites: true, - CipherSuites: DefaultServerAcceptedCiphers, - } - - for _, op := range ops { - op(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{ - // Prefer TLS1.2 as the client minimum - MinVersion: tls.VersionTLS12, - CipherSuites: clientCipherSuites, - } - - for _, op := range ops { - op(tlsconfig) - } - - return tlsconfig -} - -// certPool returns an X.509 certificate pool from `caFile`, the certificate file. -func certPool(caFile string, exclusivePool bool) (*x509.CertPool, error) { - // If we should verify the server, we need to load a trusted ca - var ( - certPool *x509.CertPool - err error - ) - if exclusivePool { - certPool = x509.NewCertPool() - } else { - certPool, err = SystemCertPool() - if err != nil { - return nil, fmt.Errorf("failed to read system certificates: %v", err) - } - } - pem, err := ioutil.ReadFile(caFile) - if err != nil { - return nil, fmt.Errorf("could not read CA certificate %q: %v", caFile, err) - } - if !certPool.AppendCertsFromPEM(pem) { - return nil, fmt.Errorf("failed to append certificates from PEM file: %q", caFile) - } - return certPool, nil -} - -// isValidMinVersion checks that the input value is a valid tls minimum version -func isValidMinVersion(version uint16) bool { - _, ok := allTLSVersions[version] - return ok -} - -// adjustMinVersion sets the MinVersion on `config`, the input configuration. -// It assumes the current MinVersion on the `config` is the lowest allowed. -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) - } - if options.MinVersion < config.MinVersion { - return fmt.Errorf("Requested minimum TLS version is too low. Should be at-least: %x", config.MinVersion) - } - config.MinVersion = options.MinVersion - } - - return nil -} - -// IsErrEncryptedKey returns true if the 'err' is an error of incorrect -// password when tryin to decrypt a TLS private key -func IsErrEncryptedKey(err error) bool { - return errors.Cause(err) == x509.IncorrectPasswordError -} - -// getPrivateKey returns the private key in 'keyBytes', in PEM-encoded format. -// If the private key is encrypted, 'passphrase' is used to decrypted the -// private key. -func getPrivateKey(keyBytes []byte, passphrase string) ([]byte, error) { - // this section makes some small changes to code from notary/tuf/utils/x509.go - pemBlock, _ := pem.Decode(keyBytes) - if pemBlock == nil { - return nil, fmt.Errorf("no valid private key found") - } - - var err error - if x509.IsEncryptedPEMBlock(pemBlock) { - keyBytes, err = x509.DecryptPEMBlock(pemBlock, []byte(passphrase)) - if err != nil { - return nil, errors.Wrap(err, "private key is encrypted, but could not decrypt it") - } - keyBytes = pem.EncodeToMemory(&pem.Block{Type: pemBlock.Type, Bytes: keyBytes}) - } - - return keyBytes, nil -} - -// getCert returns a Certificate from the CertFile and KeyFile in 'options', -// if the key is encrypted, the Passphrase in 'options' will be used to -// decrypt it. -func getCert(options Options) ([]tls.Certificate, error) { - if options.CertFile == "" && options.KeyFile == "" { - return nil, nil - } - - errMessage := "Could not load X509 key pair" - - cert, err := ioutil.ReadFile(options.CertFile) - if err != nil { - return nil, errors.Wrap(err, errMessage) - } - - prKeyBytes, err := ioutil.ReadFile(options.KeyFile) - if err != nil { - return nil, errors.Wrap(err, errMessage) - } - - prKeyBytes, err = getPrivateKey(prKeyBytes, options.Passphrase) - if err != nil { - return nil, errors.Wrap(err, errMessage) - } - - tlsCert, err := tls.X509KeyPair(cert, prKeyBytes) - if err != nil { - return nil, errors.Wrap(err, errMessage) - } - - return []tls.Certificate{tlsCert}, nil -} - -// Client returns a TLS configuration meant to be used by a client. -func Client(options Options) (*tls.Config, error) { - tlsConfig := ClientDefault() - tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify - if !options.InsecureSkipVerify && options.CAFile != "" { - CAs, err := certPool(options.CAFile, options.ExclusiveRootPools) - if err != nil { - return nil, err - } - tlsConfig.RootCAs = CAs - } - - tlsCerts, err := getCert(options) - if err != nil { - return nil, err - } - tlsConfig.Certificates = tlsCerts - - if err := adjustMinVersion(options, tlsConfig); err != nil { - return nil, err - } - - return tlsConfig, nil -} - -// Server returns a TLS configuration meant to be used by a server. -func Server(options Options) (*tls.Config, error) { - tlsConfig := ServerDefault() - tlsConfig.ClientAuth = options.ClientAuth - 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("Error reading X509 key pair (cert: %q, key: %q): %v. Make sure the key is not encrypted.", options.CertFile, options.KeyFile, err) - } - tlsConfig.Certificates = []tls.Certificate{tlsCert} - if options.ClientAuth >= tls.VerifyClientCertIfGiven && options.CAFile != "" { - CAs, err := certPool(options.CAFile, options.ExclusiveRootPools) - if err != nil { - return nil, err - } - tlsConfig.ClientCAs = CAs - } - - if err := adjustMinVersion(options, tlsConfig); err != nil { - return nil, err - } - - return tlsConfig, nil -} 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 deleted file mode 100644 index 6b4c6a7c..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/config_client_ciphers.go +++ /dev/null @@ -1,17 +0,0 @@ -// +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_256_GCM_SHA384, - tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, -} 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 ee22df47..00000000 --- a/vendor/github.com/docker/go-connections/tlsconfig/config_legacy_client_ciphers.go +++ /dev/null @@ -1,15 +0,0 @@ -// +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/docker/go-units/CONTRIBUTING.md b/vendor/github.com/docker/go-units/CONTRIBUTING.md deleted file mode 100644 index 9ea86d78..00000000 --- a/vendor/github.com/docker/go-units/CONTRIBUTING.md +++ /dev/null @@ -1,67 +0,0 @@ -# Contributing to go-units - -Want to hack on go-units? Awesome! Here are instructions to get you started. - -go-units is a part of the [Docker](https://www.docker.com) project, and follows -the same rules and principles. If you're already familiar with the way -Docker does things, you'll feel right at home. - -Otherwise, go read Docker's -[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md), -[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md), -[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and -[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md). - -### Sign your work - -The sign-off is a simple line at the end of the explanation for the patch. Your -signature certifies that you wrote the patch or otherwise have the right to pass -it on as an open-source patch. The rules are pretty simple: if you can certify -the below (from [developercertificate.org](http://developercertificate.org/)): - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -Then you just add a line to every git commit message: - - Signed-off-by: Joe Smith - -Use your real name (sorry, no pseudonyms or anonymous contributions.) - -If you set your `user.name` and `user.email` git configs, you can sign your -commit automatically with `git commit -s`. diff --git a/vendor/github.com/docker/go-units/LICENSE b/vendor/github.com/docker/go-units/LICENSE deleted file mode 100644 index b55b37bc..00000000 --- a/vendor/github.com/docker/go-units/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2015 Docker, Inc. - - 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 - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/go-units/MAINTAINERS b/vendor/github.com/docker/go-units/MAINTAINERS deleted file mode 100644 index 4aac7c74..00000000 --- a/vendor/github.com/docker/go-units/MAINTAINERS +++ /dev/null @@ -1,46 +0,0 @@ -# go-units maintainers file -# -# This file describes who runs the docker/go-units project and how. -# This is a living document - if you see something out of date or missing, speak up! -# -# It is structured to be consumable by both humans and programs. -# To extract its contents programmatically, use any TOML-compliant parser. -# -# This file is compiled into the MAINTAINERS file in docker/opensource. -# -[Org] - [Org."Core maintainers"] - people = [ - "akihirosuda", - "dnephin", - "thajeztah", - "vdemeester", - ] - -[people] - -# A reference list of all people associated with the project. -# All other sections should refer to people by their canonical key -# in the people section. - - # ADD YOURSELF HERE IN ALPHABETICAL ORDER - - [people.akihirosuda] - Name = "Akihiro Suda" - Email = "akihiro.suda.cz@hco.ntt.co.jp" - GitHub = "AkihiroSuda" - - [people.dnephin] - Name = "Daniel Nephin" - Email = "dnephin@gmail.com" - GitHub = "dnephin" - - [people.thajeztah] - Name = "Sebastiaan van Stijn" - Email = "github@gone.nl" - GitHub = "thaJeztah" - - [people.vdemeester] - Name = "Vincent Demeester" - Email = "vincent@sbr.pm" - GitHub = "vdemeester" \ No newline at end of file diff --git a/vendor/github.com/docker/go-units/README.md b/vendor/github.com/docker/go-units/README.md deleted file mode 100644 index 4f70a4e1..00000000 --- a/vendor/github.com/docker/go-units/README.md +++ /dev/null @@ -1,16 +0,0 @@ -[![GoDoc](https://godoc.org/github.com/docker/go-units?status.svg)](https://godoc.org/github.com/docker/go-units) - -# Introduction - -go-units is a library to transform human friendly measurements into machine friendly values. - -## Usage - -See the [docs in godoc](https://godoc.org/github.com/docker/go-units) for examples and documentation. - -## Copyright and license - -Copyright © 2015 Docker, Inc. - -go-units is licensed under the Apache License, Version 2.0. -See [LICENSE](LICENSE) for the full text of the license. diff --git a/vendor/github.com/docker/go-units/circle.yml b/vendor/github.com/docker/go-units/circle.yml deleted file mode 100644 index af9d6055..00000000 --- a/vendor/github.com/docker/go-units/circle.yml +++ /dev/null @@ -1,11 +0,0 @@ -dependencies: - post: - # install golint - - go get golang.org/x/lint/golint - -test: - pre: - # run analysis before tests - - go vet ./... - - test -z "$(golint ./... | tee /dev/stderr)" - - test -z "$(gofmt -s -l . | tee /dev/stderr)" diff --git a/vendor/github.com/docker/go-units/duration.go b/vendor/github.com/docker/go-units/duration.go deleted file mode 100644 index 48dd8744..00000000 --- a/vendor/github.com/docker/go-units/duration.go +++ /dev/null @@ -1,35 +0,0 @@ -// Package units provides helper function to parse and print size and time units -// in human-readable format. -package units - -import ( - "fmt" - "time" -) - -// HumanDuration returns a human-readable approximation of a duration -// (eg. "About a minute", "4 hours ago", etc.). -func HumanDuration(d time.Duration) string { - if seconds := int(d.Seconds()); seconds < 1 { - return "Less than a second" - } else if seconds == 1 { - return "1 second" - } else if seconds < 60 { - return fmt.Sprintf("%d seconds", seconds) - } else if minutes := int(d.Minutes()); minutes == 1 { - return "About a minute" - } else if minutes < 60 { - return fmt.Sprintf("%d minutes", minutes) - } else if hours := int(d.Hours() + 0.5); hours == 1 { - return "About an hour" - } else if hours < 48 { - return fmt.Sprintf("%d hours", hours) - } else if hours < 24*7*2 { - return fmt.Sprintf("%d days", hours/24) - } else if hours < 24*30*2 { - return fmt.Sprintf("%d weeks", hours/24/7) - } else if hours < 24*365*2 { - return fmt.Sprintf("%d months", hours/24/30) - } - return fmt.Sprintf("%d years", int(d.Hours())/24/365) -} diff --git a/vendor/github.com/docker/go-units/size.go b/vendor/github.com/docker/go-units/size.go deleted file mode 100644 index 85f6ab07..00000000 --- a/vendor/github.com/docker/go-units/size.go +++ /dev/null @@ -1,108 +0,0 @@ -package units - -import ( - "fmt" - "regexp" - "strconv" - "strings" -) - -// See: http://en.wikipedia.org/wiki/Binary_prefix -const ( - // Decimal - - KB = 1000 - MB = 1000 * KB - GB = 1000 * MB - TB = 1000 * GB - PB = 1000 * TB - - // Binary - - KiB = 1024 - MiB = 1024 * KiB - GiB = 1024 * MiB - TiB = 1024 * GiB - PiB = 1024 * TiB -) - -type unitMap map[string]int64 - -var ( - decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB} - binaryMap = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB} - sizeRegex = regexp.MustCompile(`^(\d+(\.\d+)*) ?([kKmMgGtTpP])?[iI]?[bB]?$`) -) - -var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"} -var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"} - -func getSizeAndUnit(size float64, base float64, _map []string) (float64, string) { - i := 0 - unitsLimit := len(_map) - 1 - for size >= base && i < unitsLimit { - size = size / base - i++ - } - return size, _map[i] -} - -// CustomSize returns a human-readable approximation of a size -// using custom format. -func CustomSize(format string, size float64, base float64, _map []string) string { - size, unit := getSizeAndUnit(size, base, _map) - return fmt.Sprintf(format, size, unit) -} - -// HumanSizeWithPrecision allows the size to be in any precision, -// instead of 4 digit precision used in units.HumanSize. -func HumanSizeWithPrecision(size float64, precision int) string { - size, unit := getSizeAndUnit(size, 1000.0, decimapAbbrs) - return fmt.Sprintf("%.*g%s", precision, size, unit) -} - -// HumanSize returns a human-readable approximation of a size -// capped at 4 valid numbers (eg. "2.746 MB", "796 KB"). -func HumanSize(size float64) string { - return HumanSizeWithPrecision(size, 4) -} - -// BytesSize returns a human-readable size in bytes, kibibytes, -// mebibytes, gibibytes, or tebibytes (eg. "44kiB", "17MiB"). -func BytesSize(size float64) string { - return CustomSize("%.4g%s", size, 1024.0, binaryAbbrs) -} - -// FromHumanSize returns an integer from a human-readable specification of a -// size using SI standard (eg. "44kB", "17MB"). -func FromHumanSize(size string) (int64, error) { - return parseSize(size, decimalMap) -} - -// RAMInBytes parses a human-readable string representing an amount of RAM -// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and -// returns the number of bytes, or -1 if the string is unparseable. -// Units are case-insensitive, and the 'b' suffix is optional. -func RAMInBytes(size string) (int64, error) { - return parseSize(size, binaryMap) -} - -// Parses the human-readable size string into the amount it represents. -func parseSize(sizeStr string, uMap unitMap) (int64, error) { - matches := sizeRegex.FindStringSubmatch(sizeStr) - if len(matches) != 4 { - return -1, fmt.Errorf("invalid size: '%s'", sizeStr) - } - - size, err := strconv.ParseFloat(matches[1], 64) - if err != nil { - return -1, err - } - - unitPrefix := strings.ToLower(matches[3]) - if mul, ok := uMap[unitPrefix]; ok { - size *= float64(mul) - } - - return int64(size), nil -} diff --git a/vendor/github.com/docker/go-units/ulimit.go b/vendor/github.com/docker/go-units/ulimit.go deleted file mode 100644 index fca0400c..00000000 --- a/vendor/github.com/docker/go-units/ulimit.go +++ /dev/null @@ -1,123 +0,0 @@ -package units - -import ( - "fmt" - "strconv" - "strings" -) - -// Ulimit is a human friendly version of Rlimit. -type Ulimit struct { - Name string - Hard int64 - Soft int64 -} - -// Rlimit specifies the resource limits, such as max open files. -type Rlimit struct { - Type int `json:"type,omitempty"` - Hard uint64 `json:"hard,omitempty"` - Soft uint64 `json:"soft,omitempty"` -} - -const ( - // magic numbers for making the syscall - // some of these are defined in the syscall package, but not all. - // Also since Windows client doesn't get access to the syscall package, need to - // define these here - rlimitAs = 9 - rlimitCore = 4 - rlimitCPU = 0 - rlimitData = 2 - rlimitFsize = 1 - rlimitLocks = 10 - rlimitMemlock = 8 - rlimitMsgqueue = 12 - rlimitNice = 13 - rlimitNofile = 7 - rlimitNproc = 6 - rlimitRss = 5 - rlimitRtprio = 14 - rlimitRttime = 15 - rlimitSigpending = 11 - rlimitStack = 3 -) - -var ulimitNameMapping = map[string]int{ - //"as": rlimitAs, // Disabled since this doesn't seem usable with the way Docker inits a container. - "core": rlimitCore, - "cpu": rlimitCPU, - "data": rlimitData, - "fsize": rlimitFsize, - "locks": rlimitLocks, - "memlock": rlimitMemlock, - "msgqueue": rlimitMsgqueue, - "nice": rlimitNice, - "nofile": rlimitNofile, - "nproc": rlimitNproc, - "rss": rlimitRss, - "rtprio": rlimitRtprio, - "rttime": rlimitRttime, - "sigpending": rlimitSigpending, - "stack": rlimitStack, -} - -// ParseUlimit parses and returns a Ulimit from the specified string. -func ParseUlimit(val string) (*Ulimit, error) { - parts := strings.SplitN(val, "=", 2) - if len(parts) != 2 { - return nil, fmt.Errorf("invalid ulimit argument: %s", val) - } - - if _, exists := ulimitNameMapping[parts[0]]; !exists { - return nil, fmt.Errorf("invalid ulimit type: %s", parts[0]) - } - - var ( - soft int64 - hard = &soft // default to soft in case no hard was set - temp int64 - err error - ) - switch limitVals := strings.Split(parts[1], ":"); len(limitVals) { - case 2: - temp, err = strconv.ParseInt(limitVals[1], 10, 64) - if err != nil { - return nil, err - } - hard = &temp - fallthrough - case 1: - soft, err = strconv.ParseInt(limitVals[0], 10, 64) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("too many limit value arguments - %s, can only have up to two, `soft[:hard]`", parts[1]) - } - - if *hard != -1 { - if soft == -1 { - return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: soft: -1 (unlimited), hard: %d", *hard) - } - if soft > *hard { - return nil, fmt.Errorf("ulimit soft limit must be less than or equal to hard limit: %d > %d", soft, *hard) - } - } - - return &Ulimit{Name: parts[0], Soft: soft, Hard: *hard}, nil -} - -// GetRlimit returns the RLimit corresponding to Ulimit. -func (u *Ulimit) GetRlimit() (*Rlimit, error) { - t, exists := ulimitNameMapping[u.Name] - if !exists { - return nil, fmt.Errorf("invalid ulimit name %s", u.Name) - } - - return &Rlimit{Type: t, Soft: uint64(u.Soft), Hard: uint64(u.Hard)}, nil -} - -func (u *Ulimit) String() string { - return fmt.Sprintf("%s=%d:%d", u.Name, u.Soft, u.Hard) -} diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/LICENSE b/vendor/github.com/elazarl/go-bindata-assetfs/LICENSE deleted file mode 100644 index 5782c726..00000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2014, Elazar Leibovich -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/README.md b/vendor/github.com/elazarl/go-bindata-assetfs/README.md deleted file mode 100644 index 27ee48f0..00000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# go-bindata-assetfs - -Serve embedded files from [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) with `net/http`. - -[GoDoc](http://godoc.org/github.com/elazarl/go-bindata-assetfs) - -### Installation - -Install with - - $ go get github.com/jteeuwen/go-bindata/... - $ go get github.com/elazarl/go-bindata-assetfs/... - -### Creating embedded data - -Usage is identical to [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) usage, -instead of running `go-bindata` run `go-bindata-assetfs`. - -The tool will create a `bindata_assetfs.go` file, which contains the embedded data. - -A typical use case is - - $ go-bindata-assetfs data/... - -### Using assetFS in your code - -The generated file provides an `assetFS()` function that returns a `http.Filesystem` -wrapping the embedded files. What you usually want to do is: - - http.Handle("/", http.FileServer(assetFS())) - -This would run an HTTP server serving the embedded files. - -## Without running binary tool - -You can always just run the `go-bindata` tool, and then - -use - - import "github.com/elazarl/go-bindata-assetfs" - ... - http.Handle("/", - http.FileServer( - &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: AssetInfo, Prefix: "data"})) - -to serve files embedded from the `data` directory. diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go b/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go deleted file mode 100644 index 04f6d7a3..00000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/assetfs.go +++ /dev/null @@ -1,167 +0,0 @@ -package assetfs - -import ( - "bytes" - "errors" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "strings" - "time" -) - -var ( - defaultFileTimestamp = time.Now() -) - -// FakeFile implements os.FileInfo interface for a given path and size -type FakeFile struct { - // Path is the path of this file - Path string - // Dir marks of the path is a directory - Dir bool - // Len is the length of the fake file, zero if it is a directory - Len int64 - // Timestamp is the ModTime of this file - Timestamp time.Time -} - -func (f *FakeFile) Name() string { - _, name := filepath.Split(f.Path) - return name -} - -func (f *FakeFile) Mode() os.FileMode { - mode := os.FileMode(0644) - if f.Dir { - return mode | os.ModeDir - } - return mode -} - -func (f *FakeFile) ModTime() time.Time { - return f.Timestamp -} - -func (f *FakeFile) Size() int64 { - return f.Len -} - -func (f *FakeFile) IsDir() bool { - return f.Mode().IsDir() -} - -func (f *FakeFile) Sys() interface{} { - return nil -} - -// AssetFile implements http.File interface for a no-directory file with content -type AssetFile struct { - *bytes.Reader - io.Closer - FakeFile -} - -func NewAssetFile(name string, content []byte, timestamp time.Time) *AssetFile { - if timestamp.IsZero() { - timestamp = defaultFileTimestamp - } - return &AssetFile{ - bytes.NewReader(content), - ioutil.NopCloser(nil), - FakeFile{name, false, int64(len(content)), timestamp}} -} - -func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) { - return nil, errors.New("not a directory") -} - -func (f *AssetFile) Size() int64 { - return f.FakeFile.Size() -} - -func (f *AssetFile) Stat() (os.FileInfo, error) { - return f, nil -} - -// AssetDirectory implements http.File interface for a directory -type AssetDirectory struct { - AssetFile - ChildrenRead int - Children []os.FileInfo -} - -func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory { - fileinfos := make([]os.FileInfo, 0, len(children)) - for _, child := range children { - _, err := fs.AssetDir(filepath.Join(name, child)) - fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0, time.Time{}}) - } - return &AssetDirectory{ - AssetFile{ - bytes.NewReader(nil), - ioutil.NopCloser(nil), - FakeFile{name, true, 0, time.Time{}}, - }, - 0, - fileinfos} -} - -func (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) { - if count <= 0 { - return f.Children, nil - } - if f.ChildrenRead+count > len(f.Children) { - count = len(f.Children) - f.ChildrenRead - } - rv := f.Children[f.ChildrenRead : f.ChildrenRead+count] - f.ChildrenRead += count - return rv, nil -} - -func (f *AssetDirectory) Stat() (os.FileInfo, error) { - return f, nil -} - -// AssetFS implements http.FileSystem, allowing -// embedded files to be served from net/http package. -type AssetFS struct { - // Asset should return content of file in path if exists - Asset func(path string) ([]byte, error) - // AssetDir should return list of files in the path - AssetDir func(path string) ([]string, error) - // AssetInfo should return the info of file in path if exists - AssetInfo func(path string) (os.FileInfo, error) - // Prefix would be prepended to http requests - Prefix string -} - -func (fs *AssetFS) Open(name string) (http.File, error) { - name = path.Join(fs.Prefix, name) - if len(name) > 0 && name[0] == '/' { - name = name[1:] - } - if b, err := fs.Asset(name); err == nil { - timestamp := defaultFileTimestamp - if fs.AssetInfo != nil { - if info, err := fs.AssetInfo(name); err == nil { - timestamp = info.ModTime() - } - } - return NewAssetFile(name, b, timestamp), nil - } - if children, err := fs.AssetDir(name); err == nil { - return NewAssetDirectory(name, children, fs), nil - } else { - // If the error is not found, return an error that will - // result in a 404 error. Otherwise the server returns - // a 500 error for files not found. - if strings.Contains(err.Error(), "not found") { - return nil, os.ErrNotExist - } - return nil, err - } -} diff --git a/vendor/github.com/elazarl/go-bindata-assetfs/doc.go b/vendor/github.com/elazarl/go-bindata-assetfs/doc.go deleted file mode 100644 index a664249f..00000000 --- a/vendor/github.com/elazarl/go-bindata-assetfs/doc.go +++ /dev/null @@ -1,13 +0,0 @@ -// assetfs allows packages to serve static content embedded -// with the go-bindata tool with the standard net/http package. -// -// See https://github.com/jteeuwen/go-bindata for more information -// about embedding binary data with go-bindata. -// -// Usage example, after running -// $ go-bindata data/... -// use: -// http.Handle("/", -// http.FileServer( -// &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"})) -package assetfs diff --git a/vendor/github.com/emirpasic/gods/LICENSE b/vendor/github.com/emirpasic/gods/LICENSE deleted file mode 100644 index e5e449b6..00000000 --- a/vendor/github.com/emirpasic/gods/LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -Copyright (c) 2015, Emir Pasic -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -------------------------------------------------------------------------------- - -AVL Tree: - -Copyright (c) 2017 Benjamin Scher Purcell - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/emirpasic/gods/containers/containers.go b/vendor/github.com/emirpasic/gods/containers/containers.go deleted file mode 100644 index c35ab36d..00000000 --- a/vendor/github.com/emirpasic/gods/containers/containers.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package containers provides core interfaces and functions for data structures. -// -// Container is the base interface for all data structures to implement. -// -// Iterators provide stateful iterators. -// -// Enumerable provides Ruby inspired (each, select, map, find, any?, etc.) container functions. -// -// Serialization provides serializers (marshalers) and deserializers (unmarshalers). -package containers - -import "github.com/emirpasic/gods/utils" - -// Container is base interface that all data structures implement. -type Container interface { - Empty() bool - Size() int - Clear() - Values() []interface{} -} - -// GetSortedValues returns sorted container's elements with respect to the passed comparator. -// Does not effect the ordering of elements within the container. -func GetSortedValues(container Container, comparator utils.Comparator) []interface{} { - values := container.Values() - if len(values) < 2 { - return values - } - utils.Sort(values, comparator) - return values -} diff --git a/vendor/github.com/emirpasic/gods/containers/enumerable.go b/vendor/github.com/emirpasic/gods/containers/enumerable.go deleted file mode 100644 index ac48b545..00000000 --- a/vendor/github.com/emirpasic/gods/containers/enumerable.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package containers - -// EnumerableWithIndex provides functions for ordered containers whose values can be fetched by an index. -type EnumerableWithIndex interface { - // Each calls the given function once for each element, passing that element's index and value. - Each(func(index int, value interface{})) - - // Map invokes the given function once for each element and returns a - // container containing the values returned by the given function. - // TODO would appreciate help on how to enforce this in containers (don't want to type assert when chaining) - // Map(func(index int, value interface{}) interface{}) Container - - // Select returns a new container containing all elements for which the given function returns a true value. - // TODO need help on how to enforce this in containers (don't want to type assert when chaining) - // Select(func(index int, value interface{}) bool) Container - - // Any passes each element of the container to the given function and - // returns true if the function ever returns true for any element. - Any(func(index int, value interface{}) bool) bool - - // All passes each element of the container to the given function and - // returns true if the function returns true for all elements. - All(func(index int, value interface{}) bool) bool - - // Find passes each element of the container to the given function and returns - // the first (index,value) for which the function is true or -1,nil otherwise - // if no element matches the criteria. - Find(func(index int, value interface{}) bool) (int, interface{}) -} - -// EnumerableWithKey provides functions for ordered containers whose values whose elements are key/value pairs. -type EnumerableWithKey interface { - // Each calls the given function once for each element, passing that element's key and value. - Each(func(key interface{}, value interface{})) - - // Map invokes the given function once for each element and returns a container - // containing the values returned by the given function as key/value pairs. - // TODO need help on how to enforce this in containers (don't want to type assert when chaining) - // Map(func(key interface{}, value interface{}) (interface{}, interface{})) Container - - // Select returns a new container containing all elements for which the given function returns a true value. - // TODO need help on how to enforce this in containers (don't want to type assert when chaining) - // Select(func(key interface{}, value interface{}) bool) Container - - // Any passes each element of the container to the given function and - // returns true if the function ever returns true for any element. - Any(func(key interface{}, value interface{}) bool) bool - - // All passes each element of the container to the given function and - // returns true if the function returns true for all elements. - All(func(key interface{}, value interface{}) bool) bool - - // Find passes each element of the container to the given function and returns - // the first (key,value) for which the function is true or nil,nil otherwise if no element - // matches the criteria. - Find(func(key interface{}, value interface{}) bool) (interface{}, interface{}) -} diff --git a/vendor/github.com/emirpasic/gods/containers/iterator.go b/vendor/github.com/emirpasic/gods/containers/iterator.go deleted file mode 100644 index f1a52a36..00000000 --- a/vendor/github.com/emirpasic/gods/containers/iterator.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package containers - -// IteratorWithIndex is stateful iterator for ordered containers whose values can be fetched by an index. -type IteratorWithIndex interface { - // Next moves the iterator to the next element and returns true if there was a next element in the container. - // If Next() returns true, then next element's index and value can be retrieved by Index() and Value(). - // If Next() was called for the first time, then it will point the iterator to the first element if it exists. - // Modifies the state of the iterator. - Next() bool - - // Value returns the current element's value. - // Does not modify the state of the iterator. - Value() interface{} - - // Index returns the current element's index. - // Does not modify the state of the iterator. - Index() int - - // Begin resets the iterator to its initial state (one-before-first) - // Call Next() to fetch the first element if any. - Begin() - - // First moves the iterator to the first element and returns true if there was a first element in the container. - // If First() returns true, then first element's index and value can be retrieved by Index() and Value(). - // Modifies the state of the iterator. - First() bool -} - -// IteratorWithKey is a stateful iterator for ordered containers whose elements are key value pairs. -type IteratorWithKey interface { - // Next moves the iterator to the next element and returns true if there was a next element in the container. - // If Next() returns true, then next element's key and value can be retrieved by Key() and Value(). - // If Next() was called for the first time, then it will point the iterator to the first element if it exists. - // Modifies the state of the iterator. - Next() bool - - // Value returns the current element's value. - // Does not modify the state of the iterator. - Value() interface{} - - // Key returns the current element's key. - // Does not modify the state of the iterator. - Key() interface{} - - // Begin resets the iterator to its initial state (one-before-first) - // Call Next() to fetch the first element if any. - Begin() - - // First moves the iterator to the first element and returns true if there was a first element in the container. - // If First() returns true, then first element's key and value can be retrieved by Key() and Value(). - // Modifies the state of the iterator. - First() bool -} - -// ReverseIteratorWithIndex is stateful iterator for ordered containers whose values can be fetched by an index. -// -// Essentially it is the same as IteratorWithIndex, but provides additional: -// -// Prev() function to enable traversal in reverse -// -// Last() function to move the iterator to the last element. -// -// End() function to move the iterator past the last element (one-past-the-end). -type ReverseIteratorWithIndex interface { - // Prev moves the iterator to the previous element and returns true if there was a previous element in the container. - // If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value(). - // Modifies the state of the iterator. - Prev() bool - - // End moves the iterator past the last element (one-past-the-end). - // Call Prev() to fetch the last element if any. - End() - - // Last moves the iterator to the last element and returns true if there was a last element in the container. - // If Last() returns true, then last element's index and value can be retrieved by Index() and Value(). - // Modifies the state of the iterator. - Last() bool - - IteratorWithIndex -} - -// ReverseIteratorWithKey is a stateful iterator for ordered containers whose elements are key value pairs. -// -// Essentially it is the same as IteratorWithKey, but provides additional: -// -// Prev() function to enable traversal in reverse -// -// Last() function to move the iterator to the last element. -type ReverseIteratorWithKey interface { - // Prev moves the iterator to the previous element and returns true if there was a previous element in the container. - // If Prev() returns true, then previous element's key and value can be retrieved by Key() and Value(). - // Modifies the state of the iterator. - Prev() bool - - // End moves the iterator past the last element (one-past-the-end). - // Call Prev() to fetch the last element if any. - End() - - // Last moves the iterator to the last element and returns true if there was a last element in the container. - // If Last() returns true, then last element's key and value can be retrieved by Key() and Value(). - // Modifies the state of the iterator. - Last() bool - - IteratorWithKey -} diff --git a/vendor/github.com/emirpasic/gods/containers/serialization.go b/vendor/github.com/emirpasic/gods/containers/serialization.go deleted file mode 100644 index d7c90c83..00000000 --- a/vendor/github.com/emirpasic/gods/containers/serialization.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package containers - -// JSONSerializer provides JSON serialization -type JSONSerializer interface { - // ToJSON outputs the JSON representation of containers's elements. - ToJSON() ([]byte, error) -} - -// JSONDeserializer provides JSON deserialization -type JSONDeserializer interface { - // FromJSON populates containers's elements from the input JSON representation. - FromJSON([]byte) error -} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go b/vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go deleted file mode 100644 index bfedac9e..00000000 --- a/vendor/github.com/emirpasic/gods/lists/arraylist/arraylist.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package arraylist implements the array list. -// -// Structure is not thread safe. -// -// Reference: https://en.wikipedia.org/wiki/List_%28abstract_data_type%29 -package arraylist - -import ( - "fmt" - "strings" - - "github.com/emirpasic/gods/lists" - "github.com/emirpasic/gods/utils" -) - -func assertListImplementation() { - var _ lists.List = (*List)(nil) -} - -// List holds the elements in a slice -type List struct { - elements []interface{} - size int -} - -const ( - growthFactor = float32(2.0) // growth by 100% - shrinkFactor = float32(0.25) // shrink when size is 25% of capacity (0 means never shrink) -) - -// New instantiates a new list and adds the passed values, if any, to the list -func New(values ...interface{}) *List { - list := &List{} - if len(values) > 0 { - list.Add(values...) - } - return list -} - -// Add appends a value at the end of the list -func (list *List) Add(values ...interface{}) { - list.growBy(len(values)) - for _, value := range values { - list.elements[list.size] = value - list.size++ - } -} - -// Get returns the element at index. -// Second return parameter is true if index is within bounds of the array and array is not empty, otherwise false. -func (list *List) Get(index int) (interface{}, bool) { - - if !list.withinRange(index) { - return nil, false - } - - return list.elements[index], true -} - -// Remove removes the element at the given index from the list. -func (list *List) Remove(index int) { - - if !list.withinRange(index) { - return - } - - list.elements[index] = nil // cleanup reference - copy(list.elements[index:], list.elements[index+1:list.size]) // shift to the left by one (slow operation, need ways to optimize this) - list.size-- - - list.shrink() -} - -// Contains checks if elements (one or more) are present in the set. -// All elements have to be present in the set for the method to return true. -// Performance time complexity of n^2. -// Returns true if no arguments are passed at all, i.e. set is always super-set of empty set. -func (list *List) Contains(values ...interface{}) bool { - - for _, searchValue := range values { - found := false - for _, element := range list.elements { - if element == searchValue { - found = true - break - } - } - if !found { - return false - } - } - return true -} - -// Values returns all elements in the list. -func (list *List) Values() []interface{} { - newElements := make([]interface{}, list.size, list.size) - copy(newElements, list.elements[:list.size]) - return newElements -} - -//IndexOf returns index of provided element -func (list *List) IndexOf(value interface{}) int { - if list.size == 0 { - return -1 - } - for index, element := range list.elements { - if element == value { - return index - } - } - return -1 -} - -// Empty returns true if list does not contain any elements. -func (list *List) Empty() bool { - return list.size == 0 -} - -// Size returns number of elements within the list. -func (list *List) Size() int { - return list.size -} - -// Clear removes all elements from the list. -func (list *List) Clear() { - list.size = 0 - list.elements = []interface{}{} -} - -// Sort sorts values (in-place) using. -func (list *List) Sort(comparator utils.Comparator) { - if len(list.elements) < 2 { - return - } - utils.Sort(list.elements[:list.size], comparator) -} - -// Swap swaps the two values at the specified positions. -func (list *List) Swap(i, j int) { - if list.withinRange(i) && list.withinRange(j) { - list.elements[i], list.elements[j] = list.elements[j], list.elements[i] - } -} - -// Insert inserts values at specified index position shifting the value at that position (if any) and any subsequent elements to the right. -// Does not do anything if position is negative or bigger than list's size -// Note: position equal to list's size is valid, i.e. append. -func (list *List) Insert(index int, values ...interface{}) { - - if !list.withinRange(index) { - // Append - if index == list.size { - list.Add(values...) - } - return - } - - l := len(values) - list.growBy(l) - list.size += l - copy(list.elements[index+l:], list.elements[index:list.size-l]) - copy(list.elements[index:], values) -} - -// Set the value at specified index -// Does not do anything if position is negative or bigger than list's size -// Note: position equal to list's size is valid, i.e. append. -func (list *List) Set(index int, value interface{}) { - - if !list.withinRange(index) { - // Append - if index == list.size { - list.Add(value) - } - return - } - - list.elements[index] = value -} - -// String returns a string representation of container -func (list *List) String() string { - str := "ArrayList\n" - values := []string{} - for _, value := range list.elements[:list.size] { - values = append(values, fmt.Sprintf("%v", value)) - } - str += strings.Join(values, ", ") - return str -} - -// Check that the index is within bounds of the list -func (list *List) withinRange(index int) bool { - return index >= 0 && index < list.size -} - -func (list *List) resize(cap int) { - newElements := make([]interface{}, cap, cap) - copy(newElements, list.elements) - list.elements = newElements -} - -// Expand the array if necessary, i.e. capacity will be reached if we add n elements -func (list *List) growBy(n int) { - // When capacity is reached, grow by a factor of growthFactor and add number of elements - currentCapacity := cap(list.elements) - if list.size+n >= currentCapacity { - newCapacity := int(growthFactor * float32(currentCapacity+n)) - list.resize(newCapacity) - } -} - -// Shrink the array if necessary, i.e. when size is shrinkFactor percent of current capacity -func (list *List) shrink() { - if shrinkFactor == 0.0 { - return - } - // Shrink when size is at shrinkFactor * capacity - currentCapacity := cap(list.elements) - if list.size <= int(float32(currentCapacity)*shrinkFactor) { - list.resize(list.size) - } -} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go b/vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go deleted file mode 100644 index b3a87388..00000000 --- a/vendor/github.com/emirpasic/gods/lists/arraylist/enumerable.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package arraylist - -import "github.com/emirpasic/gods/containers" - -func assertEnumerableImplementation() { - var _ containers.EnumerableWithIndex = (*List)(nil) -} - -// Each calls the given function once for each element, passing that element's index and value. -func (list *List) Each(f func(index int, value interface{})) { - iterator := list.Iterator() - for iterator.Next() { - f(iterator.Index(), iterator.Value()) - } -} - -// Map invokes the given function once for each element and returns a -// container containing the values returned by the given function. -func (list *List) Map(f func(index int, value interface{}) interface{}) *List { - newList := &List{} - iterator := list.Iterator() - for iterator.Next() { - newList.Add(f(iterator.Index(), iterator.Value())) - } - return newList -} - -// Select returns a new container containing all elements for which the given function returns a true value. -func (list *List) Select(f func(index int, value interface{}) bool) *List { - newList := &List{} - iterator := list.Iterator() - for iterator.Next() { - if f(iterator.Index(), iterator.Value()) { - newList.Add(iterator.Value()) - } - } - return newList -} - -// Any passes each element of the collection to the given function and -// returns true if the function ever returns true for any element. -func (list *List) Any(f func(index int, value interface{}) bool) bool { - iterator := list.Iterator() - for iterator.Next() { - if f(iterator.Index(), iterator.Value()) { - return true - } - } - return false -} - -// All passes each element of the collection to the given function and -// returns true if the function returns true for all elements. -func (list *List) All(f func(index int, value interface{}) bool) bool { - iterator := list.Iterator() - for iterator.Next() { - if !f(iterator.Index(), iterator.Value()) { - return false - } - } - return true -} - -// Find passes each element of the container to the given function and returns -// the first (index,value) for which the function is true or -1,nil otherwise -// if no element matches the criteria. -func (list *List) Find(f func(index int, value interface{}) bool) (int, interface{}) { - iterator := list.Iterator() - for iterator.Next() { - if f(iterator.Index(), iterator.Value()) { - return iterator.Index(), iterator.Value() - } - } - return -1, nil -} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go b/vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go deleted file mode 100644 index 38a93f3a..00000000 --- a/vendor/github.com/emirpasic/gods/lists/arraylist/iterator.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package arraylist - -import "github.com/emirpasic/gods/containers" - -func assertIteratorImplementation() { - var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil) -} - -// Iterator holding the iterator's state -type Iterator struct { - list *List - index int -} - -// Iterator returns a stateful iterator whose values can be fetched by an index. -func (list *List) Iterator() Iterator { - return Iterator{list: list, index: -1} -} - -// Next moves the iterator to the next element and returns true if there was a next element in the container. -// If Next() returns true, then next element's index and value can be retrieved by Index() and Value(). -// If Next() was called for the first time, then it will point the iterator to the first element if it exists. -// Modifies the state of the iterator. -func (iterator *Iterator) Next() bool { - if iterator.index < iterator.list.size { - iterator.index++ - } - return iterator.list.withinRange(iterator.index) -} - -// Prev moves the iterator to the previous element and returns true if there was a previous element in the container. -// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value(). -// Modifies the state of the iterator. -func (iterator *Iterator) Prev() bool { - if iterator.index >= 0 { - iterator.index-- - } - return iterator.list.withinRange(iterator.index) -} - -// Value returns the current element's value. -// Does not modify the state of the iterator. -func (iterator *Iterator) Value() interface{} { - return iterator.list.elements[iterator.index] -} - -// Index returns the current element's index. -// Does not modify the state of the iterator. -func (iterator *Iterator) Index() int { - return iterator.index -} - -// Begin resets the iterator to its initial state (one-before-first) -// Call Next() to fetch the first element if any. -func (iterator *Iterator) Begin() { - iterator.index = -1 -} - -// End moves the iterator past the last element (one-past-the-end). -// Call Prev() to fetch the last element if any. -func (iterator *Iterator) End() { - iterator.index = iterator.list.size -} - -// First moves the iterator to the first element and returns true if there was a first element in the container. -// If First() returns true, then first element's index and value can be retrieved by Index() and Value(). -// Modifies the state of the iterator. -func (iterator *Iterator) First() bool { - iterator.Begin() - return iterator.Next() -} - -// Last moves the iterator to the last element and returns true if there was a last element in the container. -// If Last() returns true, then last element's index and value can be retrieved by Index() and Value(). -// Modifies the state of the iterator. -func (iterator *Iterator) Last() bool { - iterator.End() - return iterator.Prev() -} diff --git a/vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go b/vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go deleted file mode 100644 index 2f283fb9..00000000 --- a/vendor/github.com/emirpasic/gods/lists/arraylist/serialization.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package arraylist - -import ( - "encoding/json" - "github.com/emirpasic/gods/containers" -) - -func assertSerializationImplementation() { - var _ containers.JSONSerializer = (*List)(nil) - var _ containers.JSONDeserializer = (*List)(nil) -} - -// ToJSON outputs the JSON representation of list's elements. -func (list *List) ToJSON() ([]byte, error) { - return json.Marshal(list.elements[:list.size]) -} - -// FromJSON populates list's elements from the input JSON representation. -func (list *List) FromJSON(data []byte) error { - err := json.Unmarshal(data, &list.elements) - if err == nil { - list.size = len(list.elements) - } - return err -} diff --git a/vendor/github.com/emirpasic/gods/lists/lists.go b/vendor/github.com/emirpasic/gods/lists/lists.go deleted file mode 100644 index 1f6bb08e..00000000 --- a/vendor/github.com/emirpasic/gods/lists/lists.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package lists provides an abstract List interface. -// -// In computer science, a list or sequence is an abstract data type that represents an ordered sequence of values, where the same value may occur more than once. An instance of a list is a computer representation of the mathematical concept of a finite sequence; the (potentially) infinite analog of a list is a stream. Lists are a basic example of containers, as they contain other values. If the same value occurs multiple times, each occurrence is considered a distinct item. -// -// Reference: https://en.wikipedia.org/wiki/List_%28abstract_data_type%29 -package lists - -import ( - "github.com/emirpasic/gods/containers" - "github.com/emirpasic/gods/utils" -) - -// List interface that all lists implement -type List interface { - Get(index int) (interface{}, bool) - Remove(index int) - Add(values ...interface{}) - Contains(values ...interface{}) bool - Sort(comparator utils.Comparator) - Swap(index1, index2 int) - Insert(index int, values ...interface{}) - Set(index int, value interface{}) - - containers.Container - // Empty() bool - // Size() int - // Clear() - // Values() []interface{} -} diff --git a/vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go b/vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go deleted file mode 100644 index 70b28cf5..00000000 --- a/vendor/github.com/emirpasic/gods/trees/binaryheap/binaryheap.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package binaryheap implements a binary heap backed by array list. -// -// Comparator defines this heap as either min or max heap. -// -// Structure is not thread safe. -// -// References: http://en.wikipedia.org/wiki/Binary_heap -package binaryheap - -import ( - "fmt" - "github.com/emirpasic/gods/lists/arraylist" - "github.com/emirpasic/gods/trees" - "github.com/emirpasic/gods/utils" - "strings" -) - -func assertTreeImplementation() { - var _ trees.Tree = (*Heap)(nil) -} - -// Heap holds elements in an array-list -type Heap struct { - list *arraylist.List - Comparator utils.Comparator -} - -// NewWith instantiates a new empty heap tree with the custom comparator. -func NewWith(comparator utils.Comparator) *Heap { - return &Heap{list: arraylist.New(), Comparator: comparator} -} - -// NewWithIntComparator instantiates a new empty heap with the IntComparator, i.e. elements are of type int. -func NewWithIntComparator() *Heap { - return &Heap{list: arraylist.New(), Comparator: utils.IntComparator} -} - -// NewWithStringComparator instantiates a new empty heap with the StringComparator, i.e. elements are of type string. -func NewWithStringComparator() *Heap { - return &Heap{list: arraylist.New(), Comparator: utils.StringComparator} -} - -// Push adds a value onto the heap and bubbles it up accordingly. -func (heap *Heap) Push(values ...interface{}) { - if len(values) == 1 { - heap.list.Add(values[0]) - heap.bubbleUp() - } else { - // Reference: https://en.wikipedia.org/wiki/Binary_heap#Building_a_heap - for _, value := range values { - heap.list.Add(value) - } - size := heap.list.Size()/2 + 1 - for i := size; i >= 0; i-- { - heap.bubbleDownIndex(i) - } - } -} - -// Pop removes top element on heap and returns it, or nil if heap is empty. -// Second return parameter is true, unless the heap was empty and there was nothing to pop. -func (heap *Heap) Pop() (value interface{}, ok bool) { - value, ok = heap.list.Get(0) - if !ok { - return - } - lastIndex := heap.list.Size() - 1 - heap.list.Swap(0, lastIndex) - heap.list.Remove(lastIndex) - heap.bubbleDown() - return -} - -// Peek returns top element on the heap without removing it, or nil if heap is empty. -// Second return parameter is true, unless the heap was empty and there was nothing to peek. -func (heap *Heap) Peek() (value interface{}, ok bool) { - return heap.list.Get(0) -} - -// Empty returns true if heap does not contain any elements. -func (heap *Heap) Empty() bool { - return heap.list.Empty() -} - -// Size returns number of elements within the heap. -func (heap *Heap) Size() int { - return heap.list.Size() -} - -// Clear removes all elements from the heap. -func (heap *Heap) Clear() { - heap.list.Clear() -} - -// Values returns all elements in the heap. -func (heap *Heap) Values() []interface{} { - return heap.list.Values() -} - -// String returns a string representation of container -func (heap *Heap) String() string { - str := "BinaryHeap\n" - values := []string{} - for _, value := range heap.list.Values() { - values = append(values, fmt.Sprintf("%v", value)) - } - str += strings.Join(values, ", ") - return str -} - -// Performs the "bubble down" operation. This is to place the element that is at the root -// of the heap in its correct place so that the heap maintains the min/max-heap order property. -func (heap *Heap) bubbleDown() { - heap.bubbleDownIndex(0) -} - -// Performs the "bubble down" operation. This is to place the element that is at the index -// of the heap in its correct place so that the heap maintains the min/max-heap order property. -func (heap *Heap) bubbleDownIndex(index int) { - size := heap.list.Size() - for leftIndex := index<<1 + 1; leftIndex < size; leftIndex = index<<1 + 1 { - rightIndex := index<<1 + 2 - smallerIndex := leftIndex - leftValue, _ := heap.list.Get(leftIndex) - rightValue, _ := heap.list.Get(rightIndex) - if rightIndex < size && heap.Comparator(leftValue, rightValue) > 0 { - smallerIndex = rightIndex - } - indexValue, _ := heap.list.Get(index) - smallerValue, _ := heap.list.Get(smallerIndex) - if heap.Comparator(indexValue, smallerValue) > 0 { - heap.list.Swap(index, smallerIndex) - } else { - break - } - index = smallerIndex - } -} - -// Performs the "bubble up" operation. This is to place a newly inserted -// element (i.e. last element in the list) in its correct place so that -// the heap maintains the min/max-heap order property. -func (heap *Heap) bubbleUp() { - index := heap.list.Size() - 1 - for parentIndex := (index - 1) >> 1; index > 0; parentIndex = (index - 1) >> 1 { - indexValue, _ := heap.list.Get(index) - parentValue, _ := heap.list.Get(parentIndex) - if heap.Comparator(parentValue, indexValue) <= 0 { - break - } - heap.list.Swap(index, parentIndex) - index = parentIndex - } -} - -// Check that the index is within bounds of the list -func (heap *Heap) withinRange(index int) bool { - return index >= 0 && index < heap.list.Size() -} diff --git a/vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go b/vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go deleted file mode 100644 index beeb8d70..00000000 --- a/vendor/github.com/emirpasic/gods/trees/binaryheap/iterator.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package binaryheap - -import "github.com/emirpasic/gods/containers" - -func assertIteratorImplementation() { - var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil) -} - -// Iterator returns a stateful iterator whose values can be fetched by an index. -type Iterator struct { - heap *Heap - index int -} - -// Iterator returns a stateful iterator whose values can be fetched by an index. -func (heap *Heap) Iterator() Iterator { - return Iterator{heap: heap, index: -1} -} - -// Next moves the iterator to the next element and returns true if there was a next element in the container. -// If Next() returns true, then next element's index and value can be retrieved by Index() and Value(). -// If Next() was called for the first time, then it will point the iterator to the first element if it exists. -// Modifies the state of the iterator. -func (iterator *Iterator) Next() bool { - if iterator.index < iterator.heap.Size() { - iterator.index++ - } - return iterator.heap.withinRange(iterator.index) -} - -// Prev moves the iterator to the previous element and returns true if there was a previous element in the container. -// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value(). -// Modifies the state of the iterator. -func (iterator *Iterator) Prev() bool { - if iterator.index >= 0 { - iterator.index-- - } - return iterator.heap.withinRange(iterator.index) -} - -// Value returns the current element's value. -// Does not modify the state of the iterator. -func (iterator *Iterator) Value() interface{} { - value, _ := iterator.heap.list.Get(iterator.index) - return value -} - -// Index returns the current element's index. -// Does not modify the state of the iterator. -func (iterator *Iterator) Index() int { - return iterator.index -} - -// Begin resets the iterator to its initial state (one-before-first) -// Call Next() to fetch the first element if any. -func (iterator *Iterator) Begin() { - iterator.index = -1 -} - -// End moves the iterator past the last element (one-past-the-end). -// Call Prev() to fetch the last element if any. -func (iterator *Iterator) End() { - iterator.index = iterator.heap.Size() -} - -// First moves the iterator to the first element and returns true if there was a first element in the container. -// If First() returns true, then first element's index and value can be retrieved by Index() and Value(). -// Modifies the state of the iterator. -func (iterator *Iterator) First() bool { - iterator.Begin() - return iterator.Next() -} - -// Last moves the iterator to the last element and returns true if there was a last element in the container. -// If Last() returns true, then last element's index and value can be retrieved by Index() and Value(). -// Modifies the state of the iterator. -func (iterator *Iterator) Last() bool { - iterator.End() - return iterator.Prev() -} diff --git a/vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go b/vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go deleted file mode 100644 index 00d0c771..00000000 --- a/vendor/github.com/emirpasic/gods/trees/binaryheap/serialization.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package binaryheap - -import "github.com/emirpasic/gods/containers" - -func assertSerializationImplementation() { - var _ containers.JSONSerializer = (*Heap)(nil) - var _ containers.JSONDeserializer = (*Heap)(nil) -} - -// ToJSON outputs the JSON representation of the heap. -func (heap *Heap) ToJSON() ([]byte, error) { - return heap.list.ToJSON() -} - -// FromJSON populates the heap from the input JSON representation. -func (heap *Heap) FromJSON(data []byte) error { - return heap.list.FromJSON(data) -} diff --git a/vendor/github.com/emirpasic/gods/trees/trees.go b/vendor/github.com/emirpasic/gods/trees/trees.go deleted file mode 100644 index a5a7427d..00000000 --- a/vendor/github.com/emirpasic/gods/trees/trees.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package trees provides an abstract Tree interface. -// -// In computer science, a tree is a widely used abstract data type (ADT) or data structure implementing this ADT that simulates a hierarchical tree structure, with a root value and subtrees of children with a parent node, represented as a set of linked nodes. -// -// Reference: https://en.wikipedia.org/wiki/Tree_%28data_structure%29 -package trees - -import "github.com/emirpasic/gods/containers" - -// Tree interface that all trees implement -type Tree interface { - containers.Container - // Empty() bool - // Size() int - // Clear() - // Values() []interface{} -} diff --git a/vendor/github.com/emirpasic/gods/utils/comparator.go b/vendor/github.com/emirpasic/gods/utils/comparator.go deleted file mode 100644 index 6a9afbf3..00000000 --- a/vendor/github.com/emirpasic/gods/utils/comparator.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package utils - -import "time" - -// Comparator will make type assertion (see IntComparator for example), -// which will panic if a or b are not of the asserted type. -// -// Should return a number: -// negative , if a < b -// zero , if a == b -// positive , if a > b -type Comparator func(a, b interface{}) int - -// StringComparator provides a fast comparison on strings -func StringComparator(a, b interface{}) int { - s1 := a.(string) - s2 := b.(string) - min := len(s2) - if len(s1) < len(s2) { - min = len(s1) - } - diff := 0 - for i := 0; i < min && diff == 0; i++ { - diff = int(s1[i]) - int(s2[i]) - } - if diff == 0 { - diff = len(s1) - len(s2) - } - if diff < 0 { - return -1 - } - if diff > 0 { - return 1 - } - return 0 -} - -// IntComparator provides a basic comparison on int -func IntComparator(a, b interface{}) int { - aAsserted := a.(int) - bAsserted := b.(int) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// Int8Comparator provides a basic comparison on int8 -func Int8Comparator(a, b interface{}) int { - aAsserted := a.(int8) - bAsserted := b.(int8) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// Int16Comparator provides a basic comparison on int16 -func Int16Comparator(a, b interface{}) int { - aAsserted := a.(int16) - bAsserted := b.(int16) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// Int32Comparator provides a basic comparison on int32 -func Int32Comparator(a, b interface{}) int { - aAsserted := a.(int32) - bAsserted := b.(int32) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// Int64Comparator provides a basic comparison on int64 -func Int64Comparator(a, b interface{}) int { - aAsserted := a.(int64) - bAsserted := b.(int64) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// UIntComparator provides a basic comparison on uint -func UIntComparator(a, b interface{}) int { - aAsserted := a.(uint) - bAsserted := b.(uint) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// UInt8Comparator provides a basic comparison on uint8 -func UInt8Comparator(a, b interface{}) int { - aAsserted := a.(uint8) - bAsserted := b.(uint8) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// UInt16Comparator provides a basic comparison on uint16 -func UInt16Comparator(a, b interface{}) int { - aAsserted := a.(uint16) - bAsserted := b.(uint16) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// UInt32Comparator provides a basic comparison on uint32 -func UInt32Comparator(a, b interface{}) int { - aAsserted := a.(uint32) - bAsserted := b.(uint32) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// UInt64Comparator provides a basic comparison on uint64 -func UInt64Comparator(a, b interface{}) int { - aAsserted := a.(uint64) - bAsserted := b.(uint64) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// Float32Comparator provides a basic comparison on float32 -func Float32Comparator(a, b interface{}) int { - aAsserted := a.(float32) - bAsserted := b.(float32) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// Float64Comparator provides a basic comparison on float64 -func Float64Comparator(a, b interface{}) int { - aAsserted := a.(float64) - bAsserted := b.(float64) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// ByteComparator provides a basic comparison on byte -func ByteComparator(a, b interface{}) int { - aAsserted := a.(byte) - bAsserted := b.(byte) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// RuneComparator provides a basic comparison on rune -func RuneComparator(a, b interface{}) int { - aAsserted := a.(rune) - bAsserted := b.(rune) - switch { - case aAsserted > bAsserted: - return 1 - case aAsserted < bAsserted: - return -1 - default: - return 0 - } -} - -// TimeComparator provides a basic comparison on time.Time -func TimeComparator(a, b interface{}) int { - aAsserted := a.(time.Time) - bAsserted := b.(time.Time) - - switch { - case aAsserted.After(bAsserted): - return 1 - case aAsserted.Before(bAsserted): - return -1 - default: - return 0 - } -} diff --git a/vendor/github.com/emirpasic/gods/utils/sort.go b/vendor/github.com/emirpasic/gods/utils/sort.go deleted file mode 100644 index 79ced1f5..00000000 --- a/vendor/github.com/emirpasic/gods/utils/sort.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package utils - -import "sort" - -// Sort sorts values (in-place) with respect to the given comparator. -// -// Uses Go's sort (hybrid of quicksort for large and then insertion sort for smaller slices). -func Sort(values []interface{}, comparator Comparator) { - sort.Sort(sortable{values, comparator}) -} - -type sortable struct { - values []interface{} - comparator Comparator -} - -func (s sortable) Len() int { - return len(s.values) -} -func (s sortable) Swap(i, j int) { - s.values[i], s.values[j] = s.values[j], s.values[i] -} -func (s sortable) Less(i, j int) bool { - return s.comparator(s.values[i], s.values[j]) < 0 -} diff --git a/vendor/github.com/emirpasic/gods/utils/utils.go b/vendor/github.com/emirpasic/gods/utils/utils.go deleted file mode 100644 index 1ad49cbc..00000000 --- a/vendor/github.com/emirpasic/gods/utils/utils.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2015, Emir Pasic. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package utils provides common utility functions. -// -// Provided functionalities: -// - sorting -// - comparators -package utils - -import ( - "fmt" - "strconv" -) - -// ToString converts a value to string. -func ToString(value interface{}) string { - switch value.(type) { - case string: - return value.(string) - case int8: - return strconv.FormatInt(int64(value.(int8)), 10) - case int16: - return strconv.FormatInt(int64(value.(int16)), 10) - case int32: - return strconv.FormatInt(int64(value.(int32)), 10) - case int64: - return strconv.FormatInt(int64(value.(int64)), 10) - case uint8: - return strconv.FormatUint(uint64(value.(uint8)), 10) - case uint16: - return strconv.FormatUint(uint64(value.(uint16)), 10) - case uint32: - return strconv.FormatUint(uint64(value.(uint32)), 10) - case uint64: - return strconv.FormatUint(uint64(value.(uint64)), 10) - case float32: - return strconv.FormatFloat(float64(value.(float32)), 'g', -1, 64) - case float64: - return strconv.FormatFloat(float64(value.(float64)), 'g', -1, 64) - case bool: - return strconv.FormatBool(value.(bool)) - default: - return fmt.Sprintf("%+v", value) - } -} diff --git a/vendor/github.com/fatih/structs/.gitignore b/vendor/github.com/fatih/structs/.gitignore deleted file mode 100644 index 83656241..00000000 --- a/vendor/github.com/fatih/structs/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test diff --git a/vendor/github.com/fatih/structs/.travis.yml b/vendor/github.com/fatih/structs/.travis.yml deleted file mode 100644 index a08df798..00000000 --- a/vendor/github.com/fatih/structs/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go -go: - - 1.7.x - - 1.8.x - - 1.9.x - - tip -sudo: false -before_install: -- go get github.com/axw/gocov/gocov -- go get github.com/mattn/goveralls -- if ! go get github.com/golang/tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi -script: -- $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/vendor/github.com/fatih/structs/LICENSE b/vendor/github.com/fatih/structs/LICENSE deleted file mode 100644 index 34504e4b..00000000 --- a/vendor/github.com/fatih/structs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Fatih Arslan - -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. \ No newline at end of file diff --git a/vendor/github.com/fatih/structs/README.md b/vendor/github.com/fatih/structs/README.md deleted file mode 100644 index a75eabf3..00000000 --- a/vendor/github.com/fatih/structs/README.md +++ /dev/null @@ -1,163 +0,0 @@ -# Structs [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/fatih/structs) [![Build Status](http://img.shields.io/travis/fatih/structs.svg?style=flat-square)](https://travis-ci.org/fatih/structs) [![Coverage Status](http://img.shields.io/coveralls/fatih/structs.svg?style=flat-square)](https://coveralls.io/r/fatih/structs) - -Structs contains various utilities to work with Go (Golang) structs. It was -initially used by me to convert a struct into a `map[string]interface{}`. With -time I've added other utilities for structs. It's basically a high level -package based on primitives from the reflect package. Feel free to add new -functions or improve the existing code. - -## Install - -```bash -go get github.com/fatih/structs -``` - -## Usage and Examples - -Just like the standard lib `strings`, `bytes` and co packages, `structs` has -many global functions to manipulate or organize your struct data. Lets define -and declare a struct: - -```go -type Server struct { - Name string `json:"name,omitempty"` - ID int - Enabled bool - users []string // not exported - http.Server // embedded -} - -server := &Server{ - Name: "gopher", - ID: 123456, - Enabled: true, -} -``` - -```go -// Convert a struct to a map[string]interface{} -// => {"Name":"gopher", "ID":123456, "Enabled":true} -m := structs.Map(server) - -// Convert the values of a struct to a []interface{} -// => ["gopher", 123456, true] -v := structs.Values(server) - -// Convert the names of a struct to a []string -// (see "Names methods" for more info about fields) -n := structs.Names(server) - -// Convert the values of a struct to a []*Field -// (see "Field methods" for more info about fields) -f := structs.Fields(server) - -// Return the struct name => "Server" -n := structs.Name(server) - -// Check if any field of a struct is initialized or not. -h := structs.HasZero(server) - -// Check if all fields of a struct is initialized or not. -z := structs.IsZero(server) - -// Check if server is a struct or a pointer to struct -i := structs.IsStruct(server) -``` - -### Struct methods - -The structs functions can be also used as independent methods by creating a new -`*structs.Struct`. This is handy if you want to have more control over the -structs (such as retrieving a single Field). - -```go -// Create a new struct type: -s := structs.New(server) - -m := s.Map() // Get a map[string]interface{} -v := s.Values() // Get a []interface{} -f := s.Fields() // Get a []*Field -n := s.Names() // Get a []string -f := s.Field(name) // Get a *Field based on the given field name -f, ok := s.FieldOk(name) // Get a *Field based on the given field name -n := s.Name() // Get the struct name -h := s.HasZero() // Check if any field is uninitialized -z := s.IsZero() // Check if all fields are uninitialized -``` - -### Field methods - -We can easily examine a single Field for more detail. Below you can see how we -get and interact with various field methods: - - -```go -s := structs.New(server) - -// Get the Field struct for the "Name" field -name := s.Field("Name") - -// Get the underlying value, value => "gopher" -value := name.Value().(string) - -// Set the field's value -name.Set("another gopher") - -// Get the field's kind, kind => "string" -name.Kind() - -// Check if the field is exported or not -if name.IsExported() { - fmt.Println("Name field is exported") -} - -// Check if the value is a zero value, such as "" for string, 0 for int -if !name.IsZero() { - fmt.Println("Name is initialized") -} - -// Check if the field is an anonymous (embedded) field -if !name.IsEmbedded() { - fmt.Println("Name is not an embedded field") -} - -// Get the Field's tag value for tag name "json", tag value => "name,omitempty" -tagValue := name.Tag("json") -``` - -Nested structs are supported too: - -```go -addrField := s.Field("Server").Field("Addr") - -// Get the value for addr -a := addrField.Value().(string) - -// Or get all fields -httpServer := s.Field("Server").Fields() -``` - -We can also get a slice of Fields from the Struct type to iterate over all -fields. This is handy if you wish to examine all fields: - -```go -s := structs.New(server) - -for _, f := range s.Fields() { - fmt.Printf("field name: %+v\n", f.Name()) - - if f.IsExported() { - fmt.Printf("value : %+v\n", f.Value()) - fmt.Printf("is zero : %+v\n", f.IsZero()) - } -} -``` - -## Credits - - * [Fatih Arslan](https://github.com/fatih) - * [Cihangir Savas](https://github.com/cihangir) - -## License - -The MIT License (MIT) - see LICENSE.md for more details diff --git a/vendor/github.com/fatih/structs/field.go b/vendor/github.com/fatih/structs/field.go deleted file mode 100644 index e6978323..00000000 --- a/vendor/github.com/fatih/structs/field.go +++ /dev/null @@ -1,141 +0,0 @@ -package structs - -import ( - "errors" - "fmt" - "reflect" -) - -var ( - errNotExported = errors.New("field is not exported") - errNotSettable = errors.New("field is not settable") -) - -// Field represents a single struct field that encapsulates high level -// functions around the field. -type Field struct { - value reflect.Value - field reflect.StructField - defaultTag string -} - -// Tag returns the value associated with key in the tag string. If there is no -// such key in the tag, Tag returns the empty string. -func (f *Field) Tag(key string) string { - return f.field.Tag.Get(key) -} - -// Value returns the underlying value of the field. It panics if the field -// is not exported. -func (f *Field) Value() interface{} { - return f.value.Interface() -} - -// IsEmbedded returns true if the given field is an anonymous field (embedded) -func (f *Field) IsEmbedded() bool { - return f.field.Anonymous -} - -// IsExported returns true if the given field is exported. -func (f *Field) IsExported() bool { - return f.field.PkgPath == "" -} - -// IsZero returns true if the given field is not initialized (has a zero value). -// It panics if the field is not exported. -func (f *Field) IsZero() bool { - zero := reflect.Zero(f.value.Type()).Interface() - current := f.Value() - - return reflect.DeepEqual(current, zero) -} - -// Name returns the name of the given field -func (f *Field) Name() string { - return f.field.Name -} - -// Kind returns the fields kind, such as "string", "map", "bool", etc .. -func (f *Field) Kind() reflect.Kind { - return f.value.Kind() -} - -// Set sets the field to given value v. It returns an error if the field is not -// settable (not addressable or not exported) or if the given value's type -// doesn't match the fields type. -func (f *Field) Set(val interface{}) error { - // we can't set unexported fields, so be sure this field is exported - if !f.IsExported() { - return errNotExported - } - - // do we get here? not sure... - if !f.value.CanSet() { - return errNotSettable - } - - given := reflect.ValueOf(val) - - if f.value.Kind() != given.Kind() { - return fmt.Errorf("wrong kind. got: %s want: %s", given.Kind(), f.value.Kind()) - } - - f.value.Set(given) - return nil -} - -// Zero sets the field to its zero value. It returns an error if the field is not -// settable (not addressable or not exported). -func (f *Field) Zero() error { - zero := reflect.Zero(f.value.Type()).Interface() - return f.Set(zero) -} - -// Fields returns a slice of Fields. This is particular handy to get the fields -// of a nested struct . A struct tag with the content of "-" ignores the -// checking of that particular field. Example: -// -// // Field is ignored by this package. -// Field *http.Request `structs:"-"` -// -// It panics if field is not exported or if field's kind is not struct -func (f *Field) Fields() []*Field { - return getFields(f.value, f.defaultTag) -} - -// Field returns the field from a nested struct. It panics if the nested struct -// is not exported or if the field was not found. -func (f *Field) Field(name string) *Field { - field, ok := f.FieldOk(name) - if !ok { - panic("field not found") - } - - return field -} - -// FieldOk returns the field from a nested struct. The boolean returns whether -// the field was found (true) or not (false). -func (f *Field) FieldOk(name string) (*Field, bool) { - value := &f.value - // value must be settable so we need to make sure it holds the address of the - // variable and not a copy, so we can pass the pointer to strctVal instead of a - // copy (which is not assigned to any variable, hence not settable). - // see "https://blog.golang.org/laws-of-reflection#TOC_8." - if f.value.Kind() != reflect.Ptr { - a := f.value.Addr() - value = &a - } - v := strctVal(value.Interface()) - t := v.Type() - - field, ok := t.FieldByName(name) - if !ok { - return nil, false - } - - return &Field{ - field: field, - value: v.FieldByName(name), - }, true -} diff --git a/vendor/github.com/fatih/structs/structs.go b/vendor/github.com/fatih/structs/structs.go deleted file mode 100644 index 3a877065..00000000 --- a/vendor/github.com/fatih/structs/structs.go +++ /dev/null @@ -1,584 +0,0 @@ -// Package structs contains various utilities functions to work with structs. -package structs - -import ( - "fmt" - - "reflect" -) - -var ( - // DefaultTagName is the default tag name for struct fields which provides - // a more granular to tweak certain structs. Lookup the necessary functions - // for more info. - DefaultTagName = "structs" // struct's field default tag name -) - -// Struct encapsulates a struct type to provide several high level functions -// around the struct. -type Struct struct { - raw interface{} - value reflect.Value - TagName string -} - -// New returns a new *Struct with the struct s. It panics if the s's kind is -// not struct. -func New(s interface{}) *Struct { - return &Struct{ - raw: s, - value: strctVal(s), - TagName: DefaultTagName, - } -} - -// Map converts the given struct to a map[string]interface{}, where the keys -// of the map are the field names and the values of the map the associated -// values of the fields. The default key string is the struct field name but -// can be changed in the struct field's tag value. The "structs" key in the -// struct's field tag value is the key name. Example: -// -// // Field appears in map as key "myName". -// Name string `structs:"myName"` -// -// A tag value with the content of "-" ignores that particular field. Example: -// -// // Field is ignored by this package. -// Field bool `structs:"-"` -// -// A tag value with the content of "string" uses the stringer to get the value. Example: -// -// // The value will be output of Animal's String() func. -// // Map will panic if Animal does not implement String(). -// Field *Animal `structs:"field,string"` -// -// A tag value with the option of "flatten" used in a struct field is to flatten its fields -// in the output map. Example: -// -// // The FieldStruct's fields will be flattened into the output map. -// FieldStruct time.Time `structs:",flatten"` -// -// A tag value with the option of "omitnested" stops iterating further if the type -// is a struct. Example: -// -// // Field is not processed further by this package. -// Field time.Time `structs:"myName,omitnested"` -// Field *http.Request `structs:",omitnested"` -// -// A tag value with the option of "omitempty" ignores that particular field if -// the field value is empty. Example: -// -// // Field appears in map as key "myName", but the field is -// // skipped if empty. -// Field string `structs:"myName,omitempty"` -// -// // Field appears in map as key "Field" (the default), but -// // the field is skipped if empty. -// Field string `structs:",omitempty"` -// -// Note that only exported fields of a struct can be accessed, non exported -// fields will be neglected. -func (s *Struct) Map() map[string]interface{} { - out := make(map[string]interface{}) - s.FillMap(out) - return out -} - -// FillMap is the same as Map. Instead of returning the output, it fills the -// given map. -func (s *Struct) FillMap(out map[string]interface{}) { - if out == nil { - return - } - - fields := s.structFields() - - for _, field := range fields { - name := field.Name - val := s.value.FieldByName(name) - isSubStruct := false - var finalVal interface{} - - tagName, tagOpts := parseTag(field.Tag.Get(s.TagName)) - if tagName != "" { - name = tagName - } - - // if the value is a zero value and the field is marked as omitempty do - // not include - if tagOpts.Has("omitempty") { - zero := reflect.Zero(val.Type()).Interface() - current := val.Interface() - - if reflect.DeepEqual(current, zero) { - continue - } - } - - if !tagOpts.Has("omitnested") { - finalVal = s.nested(val) - - v := reflect.ValueOf(val.Interface()) - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - switch v.Kind() { - case reflect.Map, reflect.Struct: - isSubStruct = true - } - } else { - finalVal = val.Interface() - } - - if tagOpts.Has("string") { - s, ok := val.Interface().(fmt.Stringer) - if ok { - out[name] = s.String() - } - continue - } - - if isSubStruct && (tagOpts.Has("flatten")) { - for k := range finalVal.(map[string]interface{}) { - out[k] = finalVal.(map[string]interface{})[k] - } - } else { - out[name] = finalVal - } - } -} - -// Values converts the given s struct's field values to a []interface{}. A -// struct tag with the content of "-" ignores the that particular field. -// Example: -// -// // Field is ignored by this package. -// Field int `structs:"-"` -// -// A value with the option of "omitnested" stops iterating further if the type -// is a struct. Example: -// -// // Fields is not processed further by this package. -// Field time.Time `structs:",omitnested"` -// Field *http.Request `structs:",omitnested"` -// -// A tag value with the option of "omitempty" ignores that particular field and -// is not added to the values if the field value is empty. Example: -// -// // Field is skipped if empty -// Field string `structs:",omitempty"` -// -// Note that only exported fields of a struct can be accessed, non exported -// fields will be neglected. -func (s *Struct) Values() []interface{} { - fields := s.structFields() - - var t []interface{} - - for _, field := range fields { - val := s.value.FieldByName(field.Name) - - _, tagOpts := parseTag(field.Tag.Get(s.TagName)) - - // if the value is a zero value and the field is marked as omitempty do - // not include - if tagOpts.Has("omitempty") { - zero := reflect.Zero(val.Type()).Interface() - current := val.Interface() - - if reflect.DeepEqual(current, zero) { - continue - } - } - - if tagOpts.Has("string") { - s, ok := val.Interface().(fmt.Stringer) - if ok { - t = append(t, s.String()) - } - continue - } - - if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { - // look out for embedded structs, and convert them to a - // []interface{} to be added to the final values slice - t = append(t, Values(val.Interface())...) - } else { - t = append(t, val.Interface()) - } - } - - return t -} - -// Fields returns a slice of Fields. A struct tag with the content of "-" -// ignores the checking of that particular field. Example: -// -// // Field is ignored by this package. -// Field bool `structs:"-"` -// -// It panics if s's kind is not struct. -func (s *Struct) Fields() []*Field { - return getFields(s.value, s.TagName) -} - -// Names returns a slice of field names. A struct tag with the content of "-" -// ignores the checking of that particular field. Example: -// -// // Field is ignored by this package. -// Field bool `structs:"-"` -// -// It panics if s's kind is not struct. -func (s *Struct) Names() []string { - fields := getFields(s.value, s.TagName) - - names := make([]string, len(fields)) - - for i, field := range fields { - names[i] = field.Name() - } - - return names -} - -func getFields(v reflect.Value, tagName string) []*Field { - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - t := v.Type() - - var fields []*Field - - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - - if tag := field.Tag.Get(tagName); tag == "-" { - continue - } - - f := &Field{ - field: field, - value: v.FieldByName(field.Name), - } - - fields = append(fields, f) - - } - - return fields -} - -// Field returns a new Field struct that provides several high level functions -// around a single struct field entity. It panics if the field is not found. -func (s *Struct) Field(name string) *Field { - f, ok := s.FieldOk(name) - if !ok { - panic("field not found") - } - - return f -} - -// FieldOk returns a new Field struct that provides several high level functions -// around a single struct field entity. The boolean returns true if the field -// was found. -func (s *Struct) FieldOk(name string) (*Field, bool) { - t := s.value.Type() - - field, ok := t.FieldByName(name) - if !ok { - return nil, false - } - - return &Field{ - field: field, - value: s.value.FieldByName(name), - defaultTag: s.TagName, - }, true -} - -// IsZero returns true if all fields in a struct is a zero value (not -// initialized) A struct tag with the content of "-" ignores the checking of -// that particular field. Example: -// -// // Field is ignored by this package. -// Field bool `structs:"-"` -// -// A value with the option of "omitnested" stops iterating further if the type -// is a struct. Example: -// -// // Field is not processed further by this package. -// Field time.Time `structs:"myName,omitnested"` -// Field *http.Request `structs:",omitnested"` -// -// Note that only exported fields of a struct can be accessed, non exported -// fields will be neglected. It panics if s's kind is not struct. -func (s *Struct) IsZero() bool { - fields := s.structFields() - - for _, field := range fields { - val := s.value.FieldByName(field.Name) - - _, tagOpts := parseTag(field.Tag.Get(s.TagName)) - - if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { - ok := IsZero(val.Interface()) - if !ok { - return false - } - - continue - } - - // zero value of the given field, such as "" for string, 0 for int - zero := reflect.Zero(val.Type()).Interface() - - // current value of the given field - current := val.Interface() - - if !reflect.DeepEqual(current, zero) { - return false - } - } - - return true -} - -// HasZero returns true if a field in a struct is not initialized (zero value). -// A struct tag with the content of "-" ignores the checking of that particular -// field. Example: -// -// // Field is ignored by this package. -// Field bool `structs:"-"` -// -// A value with the option of "omitnested" stops iterating further if the type -// is a struct. Example: -// -// // Field is not processed further by this package. -// Field time.Time `structs:"myName,omitnested"` -// Field *http.Request `structs:",omitnested"` -// -// Note that only exported fields of a struct can be accessed, non exported -// fields will be neglected. It panics if s's kind is not struct. -func (s *Struct) HasZero() bool { - fields := s.structFields() - - for _, field := range fields { - val := s.value.FieldByName(field.Name) - - _, tagOpts := parseTag(field.Tag.Get(s.TagName)) - - if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { - ok := HasZero(val.Interface()) - if ok { - return true - } - - continue - } - - // zero value of the given field, such as "" for string, 0 for int - zero := reflect.Zero(val.Type()).Interface() - - // current value of the given field - current := val.Interface() - - if reflect.DeepEqual(current, zero) { - return true - } - } - - return false -} - -// Name returns the structs's type name within its package. For more info refer -// to Name() function. -func (s *Struct) Name() string { - return s.value.Type().Name() -} - -// structFields returns the exported struct fields for a given s struct. This -// is a convenient helper method to avoid duplicate code in some of the -// functions. -func (s *Struct) structFields() []reflect.StructField { - t := s.value.Type() - - var f []reflect.StructField - - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - // we can't access the value of unexported fields - if field.PkgPath != "" { - continue - } - - // don't check if it's omitted - if tag := field.Tag.Get(s.TagName); tag == "-" { - continue - } - - f = append(f, field) - } - - return f -} - -func strctVal(s interface{}) reflect.Value { - v := reflect.ValueOf(s) - - // if pointer get the underlying element≤ - for v.Kind() == reflect.Ptr { - v = v.Elem() - } - - if v.Kind() != reflect.Struct { - panic("not struct") - } - - return v -} - -// Map converts the given struct to a map[string]interface{}. For more info -// refer to Struct types Map() method. It panics if s's kind is not struct. -func Map(s interface{}) map[string]interface{} { - return New(s).Map() -} - -// FillMap is the same as Map. Instead of returning the output, it fills the -// given map. -func FillMap(s interface{}, out map[string]interface{}) { - New(s).FillMap(out) -} - -// Values converts the given struct to a []interface{}. For more info refer to -// Struct types Values() method. It panics if s's kind is not struct. -func Values(s interface{}) []interface{} { - return New(s).Values() -} - -// Fields returns a slice of *Field. For more info refer to Struct types -// Fields() method. It panics if s's kind is not struct. -func Fields(s interface{}) []*Field { - return New(s).Fields() -} - -// Names returns a slice of field names. For more info refer to Struct types -// Names() method. It panics if s's kind is not struct. -func Names(s interface{}) []string { - return New(s).Names() -} - -// IsZero returns true if all fields is equal to a zero value. For more info -// refer to Struct types IsZero() method. It panics if s's kind is not struct. -func IsZero(s interface{}) bool { - return New(s).IsZero() -} - -// HasZero returns true if any field is equal to a zero value. For more info -// refer to Struct types HasZero() method. It panics if s's kind is not struct. -func HasZero(s interface{}) bool { - return New(s).HasZero() -} - -// IsStruct returns true if the given variable is a struct or a pointer to -// struct. -func IsStruct(s interface{}) bool { - v := reflect.ValueOf(s) - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - // uninitialized zero value of a struct - if v.Kind() == reflect.Invalid { - return false - } - - return v.Kind() == reflect.Struct -} - -// Name returns the structs's type name within its package. It returns an -// empty string for unnamed types. It panics if s's kind is not struct. -func Name(s interface{}) string { - return New(s).Name() -} - -// nested retrieves recursively all types for the given value and returns the -// nested value. -func (s *Struct) nested(val reflect.Value) interface{} { - var finalVal interface{} - - v := reflect.ValueOf(val.Interface()) - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - - switch v.Kind() { - case reflect.Struct: - n := New(val.Interface()) - n.TagName = s.TagName - m := n.Map() - - // do not add the converted value if there are no exported fields, ie: - // time.Time - if len(m) == 0 { - finalVal = val.Interface() - } else { - finalVal = m - } - case reflect.Map: - // get the element type of the map - mapElem := val.Type() - switch val.Type().Kind() { - case reflect.Ptr, reflect.Array, reflect.Map, - reflect.Slice, reflect.Chan: - mapElem = val.Type().Elem() - if mapElem.Kind() == reflect.Ptr { - mapElem = mapElem.Elem() - } - } - - // only iterate over struct types, ie: map[string]StructType, - // map[string][]StructType, - if mapElem.Kind() == reflect.Struct || - (mapElem.Kind() == reflect.Slice && - mapElem.Elem().Kind() == reflect.Struct) { - m := make(map[string]interface{}, val.Len()) - for _, k := range val.MapKeys() { - m[k.String()] = s.nested(val.MapIndex(k)) - } - finalVal = m - break - } - - // TODO(arslan): should this be optional? - finalVal = val.Interface() - case reflect.Slice, reflect.Array: - if val.Type().Kind() == reflect.Interface { - finalVal = val.Interface() - break - } - - // TODO(arslan): should this be optional? - // do not iterate of non struct types, just pass the value. Ie: []int, - // []string, co... We only iterate further if it's a struct. - // i.e []foo or []*foo - if val.Type().Elem().Kind() != reflect.Struct && - !(val.Type().Elem().Kind() == reflect.Ptr && - val.Type().Elem().Elem().Kind() == reflect.Struct) { - finalVal = val.Interface() - break - } - - slices := make([]interface{}, val.Len()) - for x := 0; x < val.Len(); x++ { - slices[x] = s.nested(val.Index(x)) - } - finalVal = slices - default: - finalVal = val.Interface() - } - - return finalVal -} diff --git a/vendor/github.com/fatih/structs/tags.go b/vendor/github.com/fatih/structs/tags.go deleted file mode 100644 index 136a31eb..00000000 --- a/vendor/github.com/fatih/structs/tags.go +++ /dev/null @@ -1,32 +0,0 @@ -package structs - -import "strings" - -// tagOptions contains a slice of tag options -type tagOptions []string - -// Has returns true if the given option is available in tagOptions -func (t tagOptions) Has(opt string) bool { - for _, tagOpt := range t { - if tagOpt == opt { - return true - } - } - - return false -} - -// parseTag splits a struct field's tag into its name and a list of options -// which comes after a name. A tag is in the form of: "name,option1,option2". -// The name can be neglectected. -func parseTag(tag string) (string, tagOptions) { - // tag is one of followings: - // "" - // "name" - // "name,opt" - // "name,opt,opt2" - // ",opt" - - res := strings.Split(tag, ",") - return res[0], res[1:] -} diff --git a/vendor/github.com/gin-contrib/cors/.gitignore b/vendor/github.com/gin-contrib/cors/.gitignore deleted file mode 100644 index b4ecae3a..00000000 --- a/vendor/github.com/gin-contrib/cors/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -*.o -*.a -*.so - -_obj -_test - -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof - -coverage.out diff --git a/vendor/github.com/gin-contrib/cors/.travis.yml b/vendor/github.com/gin-contrib/cors/.travis.yml deleted file mode 100644 index e5308a10..00000000 --- a/vendor/github.com/gin-contrib/cors/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -language: go -sudo: false - -go: - - 1.11.x - - 1.12.x - - 1.13.x - - 1.14.x - - master - -matrix: - fast_finish: true - include: - - go: 1.11.x - env: GO111MODULE=on - - go: 1.12.x - env: GO111MODULE=on - -script: - - go test -v -covermode=atomic -coverprofile=coverage.out - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/acc2c57482e94b44f557 - on_success: change - on_failure: always - on_start: false diff --git a/vendor/github.com/gin-contrib/cors/LICENSE b/vendor/github.com/gin-contrib/cors/LICENSE deleted file mode 100644 index 4e2cfb01..00000000 --- a/vendor/github.com/gin-contrib/cors/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Gin-Gonic - -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/gin-contrib/cors/README.md b/vendor/github.com/gin-contrib/cors/README.md deleted file mode 100644 index bd567b10..00000000 --- a/vendor/github.com/gin-contrib/cors/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# CORS gin's middleware - -[![Build Status](https://travis-ci.org/gin-contrib/cors.svg)](https://travis-ci.org/gin-contrib/cors) -[![codecov](https://codecov.io/gh/gin-contrib/cors/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/cors) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/cors)](https://goreportcard.com/report/github.com/gin-contrib/cors) -[![GoDoc](https://godoc.org/github.com/gin-contrib/cors?status.svg)](https://godoc.org/github.com/gin-contrib/cors) -[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin) - -Gin middleware/handler to enable CORS support. - -## Usage - -### Start using it - -Download and install it: - -```sh -$ go get github.com/gin-contrib/cors -``` - -Import it in your code: - -```go -import "github.com/gin-contrib/cors" -``` - -### Canonical example: - -```go -package main - -import ( - "time" - - "github.com/gin-contrib/cors" - "github.com/gin-gonic/gin" -) - -func main() { - router := gin.Default() - // CORS for https://foo.com and https://github.com origins, allowing: - // - PUT and PATCH methods - // - Origin header - // - Credentials share - // - Preflight requests cached for 12 hours - router.Use(cors.New(cors.Config{ - AllowOrigins: []string{"https://foo.com"}, - AllowMethods: []string{"PUT", "PATCH"}, - AllowHeaders: []string{"Origin"}, - ExposeHeaders: []string{"Content-Length"}, - AllowCredentials: true, - AllowOriginFunc: func(origin string) bool { - return origin == "https://github.com" - }, - MaxAge: 12 * time.Hour, - })) - router.Run() -} -``` - -### Using DefaultConfig as start point - -```go -func main() { - router := gin.Default() - // - No origin allowed by default - // - GET,POST, PUT, HEAD methods - // - Credentials share disabled - // - Preflight requests cached for 12 hours - config := cors.DefaultConfig() - config.AllowOrigins = []string{"http://google.com"} - // config.AllowOrigins == []string{"http://google.com", "http://facebook.com"} - - router.Use(cors.New(config)) - router.Run() -} -``` - -### Default() allows all origins - -```go -func main() { - router := gin.Default() - // same as - // config := cors.DefaultConfig() - // config.AllowAllOrigins = true - // router.Use(cors.New(config)) - router.Use(cors.Default()) - router.Run() -} -``` diff --git a/vendor/github.com/gin-contrib/cors/config.go b/vendor/github.com/gin-contrib/cors/config.go deleted file mode 100644 index d4fc1180..00000000 --- a/vendor/github.com/gin-contrib/cors/config.go +++ /dev/null @@ -1,134 +0,0 @@ -package cors - -import ( - "net/http" - "strings" - - "github.com/gin-gonic/gin" -) - -type cors struct { - allowAllOrigins bool - allowCredentials bool - allowOriginFunc func(string) bool - allowOrigins []string - exposeHeaders []string - normalHeaders http.Header - preflightHeaders http.Header - wildcardOrigins [][]string -} - -var ( - DefaultSchemas = []string{ - "http://", - "https://", - } - ExtensionSchemas = []string{ - "chrome-extension://", - "safari-extension://", - "moz-extension://", - "ms-browser-extension://", - } - FileSchemas = []string{ - "file://", - } - WebSocketSchemas = []string{ - "ws://", - "wss://", - } -) - -func newCors(config Config) *cors { - if err := config.Validate(); err != nil { - panic(err.Error()) - } - - return &cors{ - allowOriginFunc: config.AllowOriginFunc, - allowAllOrigins: config.AllowAllOrigins, - allowCredentials: config.AllowCredentials, - allowOrigins: normalize(config.AllowOrigins), - normalHeaders: generateNormalHeaders(config), - preflightHeaders: generatePreflightHeaders(config), - wildcardOrigins: config.parseWildcardRules(), - } -} - -func (cors *cors) applyCors(c *gin.Context) { - origin := c.Request.Header.Get("Origin") - if len(origin) == 0 { - // request is not a CORS request - return - } - host := c.Request.Host - - if origin == "http://"+host || origin == "https://"+host { - // request is not a CORS request but have origin header. - // for example, use fetch api - return - } - - if !cors.validateOrigin(origin) { - c.AbortWithStatus(http.StatusForbidden) - return - } - - if c.Request.Method == "OPTIONS" { - cors.handlePreflight(c) - defer c.AbortWithStatus(http.StatusNoContent) // Using 204 is better than 200 when the request status is OPTIONS - } else { - cors.handleNormal(c) - } - - if !cors.allowAllOrigins { - c.Header("Access-Control-Allow-Origin", origin) - } -} - -func (cors *cors) validateWildcardOrigin(origin string) bool { - for _, w := range cors.wildcardOrigins { - if w[0] == "*" && strings.HasSuffix(origin, w[1]) { - return true - } - if w[1] == "*" && strings.HasPrefix(origin, w[0]) { - return true - } - if strings.HasPrefix(origin, w[0]) && strings.HasSuffix(origin, w[1]) { - return true - } - } - - return false -} - -func (cors *cors) validateOrigin(origin string) bool { - if cors.allowAllOrigins { - return true - } - for _, value := range cors.allowOrigins { - if value == origin { - return true - } - } - if len(cors.wildcardOrigins) > 0 && cors.validateWildcardOrigin(origin) { - return true - } - if cors.allowOriginFunc != nil { - return cors.allowOriginFunc(origin) - } - return false -} - -func (cors *cors) handlePreflight(c *gin.Context) { - header := c.Writer.Header() - for key, value := range cors.preflightHeaders { - header[key] = value - } -} - -func (cors *cors) handleNormal(c *gin.Context) { - header := c.Writer.Header() - for key, value := range cors.normalHeaders { - header[key] = value - } -} diff --git a/vendor/github.com/gin-contrib/cors/cors.go b/vendor/github.com/gin-contrib/cors/cors.go deleted file mode 100644 index d6d06de0..00000000 --- a/vendor/github.com/gin-contrib/cors/cors.go +++ /dev/null @@ -1,171 +0,0 @@ -package cors - -import ( - "errors" - "strings" - "time" - - "github.com/gin-gonic/gin" -) - -// Config represents all available options for the middleware. -type Config struct { - AllowAllOrigins bool - - // AllowOrigins is a list of origins a cross-domain request can be executed from. - // If the special "*" value is present in the list, all origins will be allowed. - // Default value is [] - AllowOrigins []string - - // AllowOriginFunc is a custom function to validate the origin. It take the origin - // as argument and returns true if allowed or false otherwise. If this option is - // set, the content of AllowOrigins is ignored. - AllowOriginFunc func(origin string) bool - - // AllowMethods is a list of methods the client is allowed to use with - // cross-domain requests. Default value is simple methods (GET and POST) - AllowMethods []string - - // AllowHeaders is list of non simple headers the client is allowed to use with - // cross-domain requests. - AllowHeaders []string - - // AllowCredentials indicates whether the request can include user credentials like - // cookies, HTTP authentication or client side SSL certificates. - AllowCredentials bool - - // ExposedHeaders indicates which headers are safe to expose to the API of a CORS - // API specification - ExposeHeaders []string - - // MaxAge indicates how long (in seconds) the results of a preflight request - // can be cached - MaxAge time.Duration - - // Allows to add origins like http://some-domain/*, https://api.* or http://some.*.subdomain.com - AllowWildcard bool - - // Allows usage of popular browser extensions schemas - AllowBrowserExtensions bool - - // Allows usage of WebSocket protocol - AllowWebSockets bool - - // Allows usage of file:// schema (dangerous!) use it only when you 100% sure it's needed - AllowFiles bool -} - -// AddAllowMethods is allowed to add custom methods -func (c *Config) AddAllowMethods(methods ...string) { - c.AllowMethods = append(c.AllowMethods, methods...) -} - -// AddAllowHeaders is allowed to add custom headers -func (c *Config) AddAllowHeaders(headers ...string) { - c.AllowHeaders = append(c.AllowHeaders, headers...) -} - -// AddExposeHeaders is allowed to add custom expose headers -func (c *Config) AddExposeHeaders(headers ...string) { - c.ExposeHeaders = append(c.ExposeHeaders, headers...) -} - -func (c Config) getAllowedSchemas() []string { - allowedSchemas := DefaultSchemas - if c.AllowBrowserExtensions { - allowedSchemas = append(allowedSchemas, ExtensionSchemas...) - } - if c.AllowWebSockets { - allowedSchemas = append(allowedSchemas, WebSocketSchemas...) - } - if c.AllowFiles { - allowedSchemas = append(allowedSchemas, FileSchemas...) - } - return allowedSchemas -} - -func (c Config) validateAllowedSchemas(origin string) bool { - allowedSchemas := c.getAllowedSchemas() - for _, schema := range allowedSchemas { - if strings.HasPrefix(origin, schema) { - return true - } - } - return false -} - -// Validate is check configuration of user defined. -func (c *Config) Validate() error { - if c.AllowAllOrigins && (c.AllowOriginFunc != nil || len(c.AllowOrigins) > 0) { - return errors.New("conflict settings: all origins are allowed. AllowOriginFunc or AllowOrigins is not needed") - } - if !c.AllowAllOrigins && c.AllowOriginFunc == nil && len(c.AllowOrigins) == 0 { - return errors.New("conflict settings: all origins disabled") - } - for _, origin := range c.AllowOrigins { - if origin == "*" { - c.AllowAllOrigins = true - return nil - } else if !strings.Contains(origin, "*") && !c.validateAllowedSchemas(origin) { - return errors.New("bad origin: origins must contain '*' or include " + strings.Join(c.getAllowedSchemas(), ",")) - } - } - return nil -} - -func (c Config) parseWildcardRules() [][]string { - var wRules [][]string - - if !c.AllowWildcard { - return wRules - } - - for _, o := range c.AllowOrigins { - if !strings.Contains(o, "*") { - continue - } - - if c := strings.Count(o, "*"); c > 1 { - panic(errors.New("only one * is allowed").Error()) - } - - i := strings.Index(o, "*") - if i == 0 { - wRules = append(wRules, []string{"*", o[1:]}) - continue - } - if i == (len(o) - 1) { - wRules = append(wRules, []string{o[:i-1], "*"}) - continue - } - - wRules = append(wRules, []string{o[:i], o[i+1:]}) - } - - return wRules -} - -// DefaultConfig returns a generic default configuration mapped to localhost. -func DefaultConfig() Config { - return Config{ - AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"}, - AllowHeaders: []string{"Origin", "Content-Length", "Content-Type"}, - AllowCredentials: false, - MaxAge: 12 * time.Hour, - } -} - -// Default returns the location middleware with default configuration. -func Default() gin.HandlerFunc { - config := DefaultConfig() - config.AllowAllOrigins = true - return New(config) -} - -// New returns the location middleware with user-defined custom configuration. -func New(config Config) gin.HandlerFunc { - cors := newCors(config) - return func(c *gin.Context) { - cors.applyCors(c) - } -} diff --git a/vendor/github.com/gin-contrib/cors/go.mod b/vendor/github.com/gin-contrib/cors/go.mod deleted file mode 100644 index 9981c457..00000000 --- a/vendor/github.com/gin-contrib/cors/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/gin-contrib/cors - -go 1.13 - -require ( - github.com/gin-gonic/gin v1.5.0 - github.com/kr/pretty v0.1.0 // indirect - github.com/stretchr/testify v1.4.0 - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect -) diff --git a/vendor/github.com/gin-contrib/cors/go.sum b/vendor/github.com/gin-contrib/cors/go.sum deleted file mode 100644 index 8da9e75d..00000000 --- a/vendor/github.com/gin-contrib/cors/go.sum +++ /dev/null @@ -1,52 +0,0 @@ -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/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/gin-contrib/cors/utils.go b/vendor/github.com/gin-contrib/cors/utils.go deleted file mode 100644 index 460ef178..00000000 --- a/vendor/github.com/gin-contrib/cors/utils.go +++ /dev/null @@ -1,85 +0,0 @@ -package cors - -import ( - "net/http" - "strconv" - "strings" - "time" -) - -type converter func(string) string - -func generateNormalHeaders(c Config) http.Header { - headers := make(http.Header) - if c.AllowCredentials { - headers.Set("Access-Control-Allow-Credentials", "true") - } - if len(c.ExposeHeaders) > 0 { - exposeHeaders := convert(normalize(c.ExposeHeaders), http.CanonicalHeaderKey) - headers.Set("Access-Control-Expose-Headers", strings.Join(exposeHeaders, ",")) - } - if c.AllowAllOrigins { - headers.Set("Access-Control-Allow-Origin", "*") - } else { - headers.Set("Vary", "Origin") - } - return headers -} - -func generatePreflightHeaders(c Config) http.Header { - headers := make(http.Header) - if c.AllowCredentials { - headers.Set("Access-Control-Allow-Credentials", "true") - } - if len(c.AllowMethods) > 0 { - allowMethods := convert(normalize(c.AllowMethods), strings.ToUpper) - value := strings.Join(allowMethods, ",") - headers.Set("Access-Control-Allow-Methods", value) - } - if len(c.AllowHeaders) > 0 { - allowHeaders := convert(normalize(c.AllowHeaders), http.CanonicalHeaderKey) - value := strings.Join(allowHeaders, ",") - headers.Set("Access-Control-Allow-Headers", value) - } - if c.MaxAge > time.Duration(0) { - value := strconv.FormatInt(int64(c.MaxAge/time.Second), 10) - headers.Set("Access-Control-Max-Age", value) - } - if c.AllowAllOrigins { - headers.Set("Access-Control-Allow-Origin", "*") - } else { - // Always set Vary headers - // see https://github.com/rs/cors/issues/10, - // https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001 - - headers.Add("Vary", "Origin") - headers.Add("Vary", "Access-Control-Request-Method") - headers.Add("Vary", "Access-Control-Request-Headers") - } - return headers -} - -func normalize(values []string) []string { - if values == nil { - return nil - } - distinctMap := make(map[string]bool, len(values)) - normalized := make([]string, 0, len(values)) - for _, value := range values { - value = strings.TrimSpace(value) - value = strings.ToLower(value) - if _, seen := distinctMap[value]; !seen { - normalized = append(normalized, value) - distinctMap[value] = true - } - } - return normalized -} - -func convert(s []string, c converter) []string { - var out []string - for _, i := range s { - out = append(out, c(i)) - } - return out -} diff --git a/vendor/github.com/gin-contrib/sse/.travis.yml b/vendor/github.com/gin-contrib/sse/.travis.yml deleted file mode 100644 index d0e8fcf9..00000000 --- a/vendor/github.com/gin-contrib/sse/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: go -sudo: false -go: - - 1.8.x - - 1.9.x - - 1.10.x - - 1.11.x - - 1.12.x - - master - -git: - depth: 10 - -matrix: - fast_finish: true - include: - - go: 1.11.x - env: GO111MODULE=on - - go: 1.12.x - env: GO111MODULE=on - -script: - - go test -v -covermode=count -coverprofile=coverage.out - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/gin-contrib/sse/LICENSE b/vendor/github.com/gin-contrib/sse/LICENSE deleted file mode 100644 index 1ff7f370..00000000 --- a/vendor/github.com/gin-contrib/sse/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Manuel Martínez-Almeida - -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/gin-contrib/sse/README.md b/vendor/github.com/gin-contrib/sse/README.md deleted file mode 100644 index c9c49cf9..00000000 --- a/vendor/github.com/gin-contrib/sse/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Server-Sent Events - -[![GoDoc](https://godoc.org/github.com/gin-contrib/sse?status.svg)](https://godoc.org/github.com/gin-contrib/sse) -[![Build Status](https://travis-ci.org/gin-contrib/sse.svg)](https://travis-ci.org/gin-contrib/sse) -[![codecov](https://codecov.io/gh/gin-contrib/sse/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/sse) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/sse)](https://goreportcard.com/report/github.com/gin-contrib/sse) - -Server-sent events (SSE) is a technology where a browser receives automatic updates from a server via HTTP connection. The Server-Sent Events EventSource API is [standardized as part of HTML5[1] by the W3C](http://www.w3.org/TR/2009/WD-eventsource-20091029/). - -- [Read this great SSE introduction by the HTML5Rocks guys](http://www.html5rocks.com/en/tutorials/eventsource/basics/) -- [Browser support](http://caniuse.com/#feat=eventsource) - -## Sample code - -```go -import "github.com/gin-contrib/sse" - -func httpHandler(w http.ResponseWriter, req *http.Request) { - // data can be a primitive like a string, an integer or a float - sse.Encode(w, sse.Event{ - Event: "message", - Data: "some data\nmore data", - }) - - // also a complex type, like a map, a struct or a slice - sse.Encode(w, sse.Event{ - Id: "124", - Event: "message", - Data: map[string]interface{}{ - "user": "manu", - "date": time.Now().Unix(), - "content": "hi!", - }, - }) -} -``` -``` -event: message -data: some data\\nmore data - -id: 124 -event: message -data: {"content":"hi!","date":1431540810,"user":"manu"} - -``` - -## Content-Type - -```go -fmt.Println(sse.ContentType) -``` -``` -text/event-stream -``` - -## Decoding support - -There is a client-side implementation of SSE coming soon. diff --git a/vendor/github.com/gin-contrib/sse/go.mod b/vendor/github.com/gin-contrib/sse/go.mod deleted file mode 100644 index b9c03f47..00000000 --- a/vendor/github.com/gin-contrib/sse/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/gin-contrib/sse - -go 1.12 - -require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/gin-contrib/sse/go.sum b/vendor/github.com/gin-contrib/sse/go.sum deleted file mode 100644 index 4347755a..00000000 --- a/vendor/github.com/gin-contrib/sse/go.sum +++ /dev/null @@ -1,7 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/gin-contrib/sse/sse-decoder.go b/vendor/github.com/gin-contrib/sse/sse-decoder.go deleted file mode 100644 index fd49b9c3..00000000 --- a/vendor/github.com/gin-contrib/sse/sse-decoder.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sse - -import ( - "bytes" - "io" - "io/ioutil" -) - -type decoder struct { - events []Event -} - -func Decode(r io.Reader) ([]Event, error) { - var dec decoder - return dec.decode(r) -} - -func (d *decoder) dispatchEvent(event Event, data string) { - dataLength := len(data) - if dataLength > 0 { - //If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer. - data = data[:dataLength-1] - dataLength-- - } - if dataLength == 0 && event.Event == "" { - return - } - if event.Event == "" { - event.Event = "message" - } - event.Data = data - d.events = append(d.events, event) -} - -func (d *decoder) decode(r io.Reader) ([]Event, error) { - buf, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - - var currentEvent Event - var dataBuffer *bytes.Buffer = new(bytes.Buffer) - // TODO (and unit tests) - // Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair, - // a single U+000A LINE FEED (LF) character, - // or a single U+000D CARRIAGE RETURN (CR) character. - lines := bytes.Split(buf, []byte{'\n'}) - for _, line := range lines { - if len(line) == 0 { - // If the line is empty (a blank line). Dispatch the event. - d.dispatchEvent(currentEvent, dataBuffer.String()) - - // reset current event and data buffer - currentEvent = Event{} - dataBuffer.Reset() - continue - } - if line[0] == byte(':') { - // If the line starts with a U+003A COLON character (:), ignore the line. - continue - } - - var field, value []byte - colonIndex := bytes.IndexRune(line, ':') - if colonIndex != -1 { - // If the line contains a U+003A COLON character character (:) - // Collect the characters on the line before the first U+003A COLON character (:), - // and let field be that string. - field = line[:colonIndex] - // Collect the characters on the line after the first U+003A COLON character (:), - // and let value be that string. - value = line[colonIndex+1:] - // If value starts with a single U+0020 SPACE character, remove it from value. - if len(value) > 0 && value[0] == ' ' { - value = value[1:] - } - } else { - // Otherwise, the string is not empty but does not contain a U+003A COLON character character (:) - // Use the whole line as the field name, and the empty string as the field value. - field = line - value = []byte{} - } - // The steps to process the field given a field name and a field value depend on the field name, - // as given in the following list. Field names must be compared literally, - // with no case folding performed. - switch string(field) { - case "event": - // Set the event name buffer to field value. - currentEvent.Event = string(value) - case "id": - // Set the event stream's last event ID to the field value. - currentEvent.Id = string(value) - case "retry": - // If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), - // then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer. - // Otherwise, ignore the field. - currentEvent.Id = string(value) - case "data": - // Append the field value to the data buffer, - dataBuffer.Write(value) - // then append a single U+000A LINE FEED (LF) character to the data buffer. - dataBuffer.WriteString("\n") - default: - //Otherwise. The field is ignored. - continue - } - } - // Once the end of the file is reached, the user agent must dispatch the event one final time. - d.dispatchEvent(currentEvent, dataBuffer.String()) - - return d.events, nil -} diff --git a/vendor/github.com/gin-contrib/sse/sse-encoder.go b/vendor/github.com/gin-contrib/sse/sse-encoder.go deleted file mode 100644 index f9c80875..00000000 --- a/vendor/github.com/gin-contrib/sse/sse-encoder.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sse - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "reflect" - "strconv" - "strings" -) - -// Server-Sent Events -// W3C Working Draft 29 October 2009 -// http://www.w3.org/TR/2009/WD-eventsource-20091029/ - -const ContentType = "text/event-stream" - -var contentType = []string{ContentType} -var noCache = []string{"no-cache"} - -var fieldReplacer = strings.NewReplacer( - "\n", "\\n", - "\r", "\\r") - -var dataReplacer = strings.NewReplacer( - "\n", "\ndata:", - "\r", "\\r") - -type Event struct { - Event string - Id string - Retry uint - Data interface{} -} - -func Encode(writer io.Writer, event Event) error { - w := checkWriter(writer) - writeId(w, event.Id) - writeEvent(w, event.Event) - writeRetry(w, event.Retry) - return writeData(w, event.Data) -} - -func writeId(w stringWriter, id string) { - if len(id) > 0 { - w.WriteString("id:") - fieldReplacer.WriteString(w, id) - w.WriteString("\n") - } -} - -func writeEvent(w stringWriter, event string) { - if len(event) > 0 { - w.WriteString("event:") - fieldReplacer.WriteString(w, event) - w.WriteString("\n") - } -} - -func writeRetry(w stringWriter, retry uint) { - if retry > 0 { - w.WriteString("retry:") - w.WriteString(strconv.FormatUint(uint64(retry), 10)) - w.WriteString("\n") - } -} - -func writeData(w stringWriter, data interface{}) error { - w.WriteString("data:") - switch kindOfData(data) { - case reflect.Struct, reflect.Slice, reflect.Map: - err := json.NewEncoder(w).Encode(data) - if err != nil { - return err - } - w.WriteString("\n") - default: - dataReplacer.WriteString(w, fmt.Sprint(data)) - w.WriteString("\n\n") - } - return nil -} - -func (r Event) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - return Encode(w, r) -} - -func (r Event) WriteContentType(w http.ResponseWriter) { - header := w.Header() - header["Content-Type"] = contentType - - if _, exist := header["Cache-Control"]; !exist { - header["Cache-Control"] = noCache - } -} - -func kindOfData(data interface{}) reflect.Kind { - value := reflect.ValueOf(data) - valueType := value.Kind() - if valueType == reflect.Ptr { - valueType = value.Elem().Kind() - } - return valueType -} diff --git a/vendor/github.com/gin-contrib/sse/writer.go b/vendor/github.com/gin-contrib/sse/writer.go deleted file mode 100644 index 6f9806c5..00000000 --- a/vendor/github.com/gin-contrib/sse/writer.go +++ /dev/null @@ -1,24 +0,0 @@ -package sse - -import "io" - -type stringWriter interface { - io.Writer - WriteString(string) (int, error) -} - -type stringWrapper struct { - io.Writer -} - -func (w stringWrapper) WriteString(str string) (int, error) { - return w.Writer.Write([]byte(str)) -} - -func checkWriter(writer io.Writer) stringWriter { - if w, ok := writer.(stringWriter); ok { - return w - } else { - return stringWrapper{writer} - } -} diff --git a/vendor/github.com/gin-gonic/gin/.gitignore b/vendor/github.com/gin-gonic/gin/.gitignore deleted file mode 100644 index bdd50c95..00000000 --- a/vendor/github.com/gin-gonic/gin/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -vendor/* -!vendor/vendor.json -coverage.out -count.out -test -profile.out -tmp.out diff --git a/vendor/github.com/gin-gonic/gin/.travis.yml b/vendor/github.com/gin-gonic/gin/.travis.yml deleted file mode 100644 index 6680a5b3..00000000 --- a/vendor/github.com/gin-gonic/gin/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -language: go - -matrix: - fast_finish: true - include: - - go: 1.11.x - env: GO111MODULE=on - - go: 1.12.x - env: GO111MODULE=on - - go: 1.13.x - - go: 1.13.x - env: - - TESTTAGS=nomsgpack - - go: 1.14.x - - go: 1.14.x - env: - - TESTTAGS=nomsgpack - - go: master - -git: - depth: 10 - -before_install: - - if [[ "${GO111MODULE}" = "on" ]]; then mkdir "${HOME}/go"; export GOPATH="${HOME}/go"; fi - -install: - - if [[ "${GO111MODULE}" = "on" ]]; then go mod download; fi - - if [[ "${GO111MODULE}" = "on" ]]; then export PATH="${GOPATH}/bin:${GOROOT}/bin:${PATH}"; fi - - if [[ "${GO111MODULE}" = "on" ]]; then make tools; fi - -go_import_path: github.com/gin-gonic/gin - -script: - - make vet - - make fmt-check - - make misspell-check - - make test - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/7f95bf605c4d356372f4 - on_success: change # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: false # default: false diff --git a/vendor/github.com/gin-gonic/gin/AUTHORS.md b/vendor/github.com/gin-gonic/gin/AUTHORS.md deleted file mode 100644 index dda19bcf..00000000 --- a/vendor/github.com/gin-gonic/gin/AUTHORS.md +++ /dev/null @@ -1,231 +0,0 @@ -List of all the awesome people working to make Gin the best Web Framework in Go. - -## gin 1.x series authors - -**Gin Core Team:** Bo-Yi Wu (@appleboy), 田欧 (@thinkerou), Javier Provecho (@javierprovecho) - -## gin 0.x series authors - -**Maintainers:** Manu Martinez-Almeida (@manucorporat), Javier Provecho (@javierprovecho) - -People and companies, who have contributed, in alphabetical order. - -**@858806258 (杰哥)** -- Fix typo in example - - -**@achedeuzot (Klemen Sever)** -- Fix newline debug printing - - -**@adammck (Adam Mckaig)** -- Add MIT license - - -**@AlexanderChen1989 (Alexander)** -- Typos in README - - -**@alexanderdidenko (Aleksandr Didenko)** -- Add support multipart/form-data - - -**@alexandernyquist (Alexander Nyquist)** -- Using template.Must to fix multiple return issue -- ★ Added support for OPTIONS verb -- ★ Setting response headers before calling WriteHeader -- Improved documentation for model binding -- ★ Added Content.Redirect() -- ★ Added tons of Unit tests - - -**@austinheap (Austin Heap)** -- Added travis CI integration - - -**@andredublin (Andre Dublin)** -- Fix typo in comment - - -**@bredov (Ludwig Valda Vasquez)** -- Fix html templating in debug mode - - -**@bluele (Jun Kimura)** -- Fixes code examples in README - - -**@chad-russell** -- ★ Support for serializing gin.H into XML - - -**@dickeyxxx (Jeff Dickey)** -- Typos in README -- Add example about serving static files - - -**@donileo (Adonis)** -- Add NoMethod handler - - -**@dutchcoders (DutchCoders)** -- ★ Fix security bug that allows client to spoof ip -- Fix typo. r.HTMLTemplates -> SetHTMLTemplate - - -**@el3ctro- (Joshua Loper)** -- Fix typo in example - - -**@ethankan (Ethan Kan)** -- Unsigned integers in binding - - -**(Evgeny Persienko)** -- Validate sub structures - - -**@frankbille (Frank Bille)** -- Add support for HTTP Realm Auth - - -**@fmd (Fareed Dudhia)** -- Fix typo. SetHTTPTemplate -> SetHTMLTemplate - - -**@ironiridis (Christopher Harrington)** -- Remove old reference - - -**@jammie-stackhouse (Jamie Stackhouse)** -- Add more shortcuts for router methods - - -**@jasonrhansen** -- Fix spelling and grammar errors in documentation - - -**@JasonSoft (Jason Lee)** -- Fix typo in comment - - -**@joiggama (Ignacio Galindo)** -- Add utf-8 charset header on renders - - -**@julienschmidt (Julien Schmidt)** -- gofmt the code examples - - -**@kelcecil (Kel Cecil)** -- Fix readme typo - - -**@kyledinh (Kyle Dinh)** -- Adds RunTLS() - - -**@LinusU (Linus Unnebäck)** -- Small fixes in README - - -**@loongmxbt (Saint Asky)** -- Fix typo in example - - -**@lucas-clemente (Lucas Clemente)** -- ★ work around path.Join removing trailing slashes from routes - - -**@mattn (Yasuhiro Matsumoto)** -- Improve color logger - - -**@mdigger (Dmitry Sedykh)** -- Fixes Form binding when content-type is x-www-form-urlencoded -- No repeat call c.Writer.Status() in gin.Logger -- Fixes Content-Type for json render - - -**@mirzac (Mirza Ceric)** -- Fix debug printing - - -**@mopemope (Yutaka Matsubara)** -- ★ Adds Godep support (Dependencies Manager) -- Fix variadic parameter in the flexible render API -- Fix Corrupted plain render -- Add Pluggable View Renderer Example - - -**@msemenistyi (Mykyta Semenistyi)** -- update Readme.md. Add code to String method - - -**@msoedov (Sasha Myasoedov)** -- ★ Adds tons of unit tests. - - -**@ngerakines (Nick Gerakines)** -- ★ Improves API, c.GET() doesn't panic -- Adds MustGet() method - - -**@r8k (Rajiv Kilaparti)** -- Fix Port usage in README. - - -**@rayrod2030 (Ray Rodriguez)** -- Fix typo in example - - -**@rns** -- Fix typo in example - - -**@RobAWilkinson (Robert Wilkinson)** -- Add example of forms and params - - -**@rogierlommers (Rogier Lommers)** -- Add updated static serve example - - -**@se77en (Damon Zhao)** -- Improve color logging - - -**@silasb (Silas Baronda)** -- Fixing quotes in README - - -**@SkuliOskarsson (Skuli Oskarsson)** -- Fixes some texts in README II - - -**@slimmy (Jimmy Pettersson)** -- Added messages for required bindings - - -**@smira (Andrey Smirnov)** -- Add support for ignored/unexported fields in binding - - -**@superalsrk (SRK.Lyu)** -- Update httprouter godeps - - -**@tebeka (Miki Tebeka)** -- Use net/http constants instead of numeric values - - -**@techjanitor** -- Update context.go reserved IPs - - -**@yosssi (Keiji Yoshida)** -- Fix link in README - - -**@yuyabee** -- Fixed README diff --git a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md deleted file mode 100644 index e4ff4677..00000000 --- a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md +++ /dev/null @@ -1,693 +0,0 @@ - -## Benchmark System - -**VM HOST:** DigitalOcean -**Machine:** 12 CPU, 24 GB RAM. Ubuntu 16.04.2 x64 -**Date:** Nov 26th, 2019 -**Go Version:** 1.13.4 linux/amd64 -**Source:** [Go HTTP Router Benchmark](https://github.com/julienschmidt/go-http-routing-benchmark) -**Result:** [See the gist](https://gist.github.com/appleboy/b5f2ecfaf50824ae9c64dcfb9165ae5e) - -## Static Routes: 157 - -``` -Gin: 34936 Bytes - -HttpServeMux: 14512 Bytes -Ace: 30648 Bytes -Aero: 800696 Bytes -Bear: 30664 Bytes -Beego: 98456 Bytes -Bone: 40224 Bytes -Chi: 83608 Bytes -CloudyKitRouter: 30448 Bytes -Denco: 9928 Bytes -Echo: 76584 Bytes -GocraftWeb: 55496 Bytes -Goji: 29744 Bytes -Gojiv2: 105840 Bytes -GoJsonRest: 137512 Bytes -GoRestful: 816936 Bytes -GorillaMux: 585632 Bytes -GowwwRouter: 24968 Bytes -HttpRouter: 21680 Bytes -HttpTreeMux: 73448 Bytes -Kocha: 115472 Bytes -LARS: 30640 Bytes -Macaron: 38592 Bytes -Martini: 310864 Bytes -Pat: 19696 Bytes -Possum: 89920 Bytes -R2router: 23712 Bytes -Rivet: 24608 Bytes -Tango: 28264 Bytes -TigerTonic: 78768 Bytes -Traffic: 538976 Bytes -Vulcan: 369960 Bytes -``` - -## GithubAPI Routes: 203 - -``` -Gin: 58512 Bytes - -Ace: 48640 Bytes -Aero: 1386208 Bytes -Bear: 82536 Bytes -Beego: 150936 Bytes -Bone: 100976 Bytes -Chi: 95112 Bytes -CloudyKitRouter: 93704 Bytes -Denco: 36736 Bytes -Echo: 96328 Bytes -GocraftWeb: 95432 Bytes -Goji: 51600 Bytes -Gojiv2: 104704 Bytes -GoJsonRest: 142024 Bytes -GoRestful: 1241656 Bytes -GorillaMux: 1322784 Bytes -GowwwRouter: 80008 Bytes -HttpRouter: 37096 Bytes -HttpTreeMux: 78800 Bytes -Kocha: 785408 Bytes -LARS: 48600 Bytes -Macaron: 93680 Bytes -Martini: 485264 Bytes -Pat: 21200 Bytes -Possum: 85312 Bytes -R2router: 47104 Bytes -Rivet: 42840 Bytes -Tango: 54840 Bytes -TigerTonic: 96176 Bytes -Traffic: 921744 Bytes -Vulcan: 425368 Bytes -``` - -## GPlusAPI Routes: 13 - -``` -Gin: 4384 Bytes - -Ace: 3 664 Bytes -Aero: 88248 Bytes -Bear: 7112 Bytes -Beego: 10272 Bytes -Bone: 6688 Bytes -Chi: 8024 Bytes -CloudyKitRouter: 6728 Bytes -Denco: 3264 Bytes -Echo: 9272 Bytes -GocraftWeb: 7496 Bytes -Goji: 3152 Bytes -Gojiv2: 7376 Bytes -GoJsonRest: 11416 Bytes -GoRestful: 74328 Bytes -GorillaMux: 66208 Bytes -GowwwRouter: 5744 Bytes -HttpRouter: 2760 Bytes -HttpTreeMux: 7440 Bytes -Kocha: 128880 Bytes -LARS: 3656 Bytes -Macaron: 8656 Bytes -Martini: 23920 Bytes -Pat: 1856 Bytes -Possum: 7248 Bytes -R2router: 3928 Bytes -Rivet: 3064 Bytes -Tango: 5168 Bytes -TigerTonic: 9408 Bytes -Traffic: 46400 Bytes -Vulcan: 25544 Bytes -``` - -## ParseAPI Routes: 26 - -``` -Gin: 7776 Bytes - -Ace: 6656 Bytes -Aero: 163736 Bytes -Bear: 12528 Bytes -Beego: 19280 Bytes -Bone: 11440 Bytes -Chi: 9744 Bytes -Denco: 4192 Bytes -Echo: 11648 Bytes -GocraftWeb: 12800 Bytes -Goji: 5680 Bytes -Gojiv2: 14464 Bytes -GoJsonRest: 14424 Bytes -GoRestful: 116264 Bytes -GorillaMux: 105880 Bytes -GowwwRouter: 9344 Bytes -HttpRouter: 5024 Bytes -HttpTreeMux: 7848 Bytes -Kocha: 181712 Bytes -LARS: 6632 Bytes -Macaron: 13648 Bytes -Martini: 45888 Bytes -Pat: 2560 Bytes -Possum: 9200 Bytes -R2router: 7056 Bytes -Rivet: 5680 Bytes -Tango: 8920 Bytes -TigerTonic: 9840 Bytes -Traffic: 79096 Bytes -Vulcan: 44504 Bytes -``` - -## Static Routes - -``` -BenchmarkGin_StaticAll 25604 45487 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_StaticAll 28402 42046 ns/op 0 B/op 0 allocs/op -BenchmarkAero_StaticAll 38766 30333 ns/op 0 B/op 0 allocs/op -BenchmarkHttpServeMux_StaticAll 25728 46511 ns/op 0 B/op 0 allocs/op -BenchmarkBeego_StaticAll 5098 288527 ns/op 55264 B/op 471 allocs/op -BenchmarkBear_StaticAll 10000 126323 ns/op 20272 B/op 469 allocs/op -BenchmarkBone_StaticAll 9499 113631 ns/op 0 B/op 0 allocs/op -BenchmarkChi_StaticAll 7912 237363 ns/op 67824 B/op 471 allocs/op -BenchmarkCloudyKitRouter_StaticAll 41626 28668 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_StaticAll 95774 12221 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_StaticAll 26246 44603 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_StaticAll 10000 193337 ns/op 46312 B/op 785 allocs/op -BenchmarkGoji_StaticAll 15886 75789 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_StaticAll 1886 597374 ns/op 205984 B/op 1570 allocs/op -BenchmarkGoJsonRest_StaticAll 4700 307144 ns/op 51653 B/op 1727 allocs/op -BenchmarkGoRestful_StaticAll 429 2880165 ns/op 613280 B/op 2053 allocs/op -BenchmarkGorillaMux_StaticAll 754 1491761 ns/op 153233 B/op 1413 allocs/op -BenchmarkGowwwRouter_StaticAll 28071 42629 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_StaticAll 47672 24875 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_StaticAll 46770 25100 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_StaticAll 61045 19494 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_StaticAll 36103 32700 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_StaticAll 4261 430131 ns/op 115552 B/op 1256 allocs/op -BenchmarkMartini_StaticAll 481 2320157 ns/op 125444 B/op 1717 allocs/op -BenchmarkPat_StaticAll 325 3739521 ns/op 602832 B/op 12559 allocs/op -BenchmarkPossum_StaticAll 10000 203575 ns/op 65312 B/op 471 allocs/op -BenchmarkR2router_StaticAll 10000 110536 ns/op 22608 B/op 628 allocs/op -BenchmarkRivet_StaticAll 23344 51174 ns/op 0 B/op 0 allocs/op -BenchmarkTango_StaticAll 3596 340045 ns/op 39209 B/op 1256 allocs/op -BenchmarkTigerTonic_StaticAll 16784 71807 ns/op 7376 B/op 157 allocs/op -BenchmarkTraffic_StaticAll 350 3435155 ns/op 754862 B/op 14601 allocs/op -BenchmarkVulcan_StaticAll 5930 200284 ns/op 15386 B/op 471 allocs/op -``` - -## Micro Benchmarks - -``` -BenchmarkGin_Param 8623915 139 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_Param 3976539 290 ns/op 32 B/op 1 allocs/op -BenchmarkAero_Param 8948976 133 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Param 1000000 1277 ns/op 456 B/op 5 allocs/op -BenchmarkBeego_Param 889404 1785 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Param 1000000 2219 ns/op 816 B/op 6 allocs/op -BenchmarkChi_Param 1000000 1386 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_Param 18343244 61.2 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_Param 5637424 204 ns/op 32 B/op 1 allocs/op -BenchmarkEcho_Param 9540910 122 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param 1000000 1939 ns/op 648 B/op 8 allocs/op -BenchmarkGoji_Param 1283509 938 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Param 331266 3554 ns/op 1328 B/op 11 allocs/op -BenchmarkGoJsonRest_Param 908851 2158 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_Param 135781 9339 ns/op 4192 B/op 14 allocs/op -BenchmarkGorillaMux_Param 308407 3893 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_Param 1000000 1044 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Param 6653476 162 ns/op 32 B/op 1 allocs/op -BenchmarkHttpTreeMux_Param 1361378 819 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_Param 3084330 353 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_Param 11502079 107 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param 439095 3750 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_Param 177099 7479 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_Param 729747 2048 ns/op 536 B/op 11 allocs/op -BenchmarkPossum_Param 995989 1705 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Param 1000000 1037 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Param 4057065 271 ns/op 48 B/op 1 allocs/op -BenchmarkTango_Param 812029 1682 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_Param 450592 3358 ns/op 776 B/op 16 allocs/op -BenchmarkTraffic_Param 206390 5661 ns/op 1856 B/op 21 allocs/op -BenchmarkVulcan_Param 1441147 792 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_Param5 1891473 632 ns/op 160 B/op 1 allocs/op -BenchmarkAero_Param5 5191258 227 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Param5 988882 1734 ns/op 501 B/op 5 allocs/op -BenchmarkBeego_Param5 625438 2132 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Param5 622030 3061 ns/op 864 B/op 6 allocs/op -BenchmarkChi_Param5 1000000 1735 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_Param5 5167868 225 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_Param5 2174550 550 ns/op 160 B/op 1 allocs/op -BenchmarkEcho_Param5 4272258 275 ns/op 0 B/op 0 allocs/op -BenchmarkGin_Param5 4190391 275 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param5 623739 3107 ns/op 920 B/op 11 allocs/op -BenchmarkGoji_Param5 1000000 1310 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Param5 314694 3803 ns/op 1392 B/op 11 allocs/op -BenchmarkGoJsonRest_Param5 308203 4108 ns/op 1097 B/op 16 allocs/op -BenchmarkGoRestful_Param5 115048 9787 ns/op 4288 B/op 14 allocs/op -BenchmarkGorillaMux_Param5 180812 5658 ns/op 1344 B/op 10 allocs/op -BenchmarkGowwwRouter_Param5 1000000 1156 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Param5 2395767 502 ns/op 160 B/op 1 allocs/op -BenchmarkHttpTreeMux_Param5 899263 2096 ns/op 576 B/op 6 allocs/op -BenchmarkKocha_Param5 1000000 1639 ns/op 440 B/op 10 allocs/op -BenchmarkLARS_Param5 5807994 203 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param5 272967 4087 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_Param5 120735 8886 ns/op 1232 B/op 11 allocs/op -BenchmarkPat_Param5 294714 4943 ns/op 888 B/op 29 allocs/op -BenchmarkPossum_Param5 1000000 1689 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Param5 1000000 1319 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Param5 1347289 883 ns/op 240 B/op 1 allocs/op -BenchmarkTango_Param5 617077 2091 ns/op 360 B/op 8 allocs/op -BenchmarkTigerTonic_Param5 113659 11212 ns/op 2279 B/op 39 allocs/op -BenchmarkTraffic_Param5 134148 9039 ns/op 2208 B/op 27 allocs/op -BenchmarkVulcan_Param5 1000000 1095 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_Param20 1000000 1838 ns/op 640 B/op 1 allocs/op -BenchmarkAero_Param20 17120668 66.1 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Param20 205585 5332 ns/op 1665 B/op 5 allocs/op -BenchmarkBeego_Param20 230522 5382 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Param20 167190 8076 ns/op 2031 B/op 6 allocs/op -BenchmarkChi_Param20 480528 3044 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_Param20 1347794 872 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_Param20 1000000 1867 ns/op 640 B/op 1 allocs/op -BenchmarkEcho_Param20 1363526 897 ns/op 0 B/op 0 allocs/op -BenchmarkGin_Param20 1607217 748 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param20 97314 11671 ns/op 3795 B/op 15 allocs/op -BenchmarkGoji_Param20 289407 4220 ns/op 1246 B/op 2 allocs/op -BenchmarkGojiv2_Param20 245186 4869 ns/op 1632 B/op 11 allocs/op -BenchmarkGoJsonRest_Param20 78049 15725 ns/op 4485 B/op 20 allocs/op -BenchmarkGoRestful_Param20 66907 18031 ns/op 6716 B/op 18 allocs/op -BenchmarkGorillaMux_Param20 81866 12422 ns/op 3452 B/op 12 allocs/op -BenchmarkGowwwRouter_Param20 955983 1688 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Param20 1000000 1629 ns/op 640 B/op 1 allocs/op -BenchmarkHttpTreeMux_Param20 108940 10241 ns/op 3195 B/op 10 allocs/op -BenchmarkKocha_Param20 197022 5488 ns/op 1808 B/op 27 allocs/op -BenchmarkLARS_Param20 2451241 490 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param20 106770 10788 ns/op 2923 B/op 12 allocs/op -BenchmarkMartini_Param20 69028 17112 ns/op 3596 B/op 13 allocs/op -BenchmarkPat_Param20 56275 21535 ns/op 4424 B/op 93 allocs/op -BenchmarkPossum_Param20 1000000 1705 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Param20 172215 7099 ns/op 2283 B/op 7 allocs/op -BenchmarkRivet_Param20 447265 2987 ns/op 1024 B/op 1 allocs/op -BenchmarkTango_Param20 327494 3850 ns/op 856 B/op 8 allocs/op -BenchmarkTigerTonic_Param20 27176 44571 ns/op 9871 B/op 119 allocs/op -BenchmarkTraffic_Param20 38828 31025 ns/op 7856 B/op 47 allocs/op -BenchmarkVulcan_Param20 560442 1807 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_ParamWrite 2712150 442 ns/op 40 B/op 2 allocs/op -BenchmarkAero_ParamWrite 6392880 189 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParamWrite 1000000 1338 ns/op 456 B/op 5 allocs/op -BenchmarkBeego_ParamWrite 821431 1886 ns/op 360 B/op 4 allocs/op -BenchmarkBone_ParamWrite 913227 2350 ns/op 816 B/op 6 allocs/op -BenchmarkChi_ParamWrite 1000000 1427 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_ParamWrite 18645724 60.9 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_ParamWrite 4394764 264 ns/op 32 B/op 1 allocs/op -BenchmarkEcho_ParamWrite 5288883 242 ns/op 8 B/op 1 allocs/op -BenchmarkGin_ParamWrite 4584932 253 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParamWrite 866242 2094 ns/op 656 B/op 9 allocs/op -BenchmarkGoji_ParamWrite 1201875 1004 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_ParamWrite 317766 3777 ns/op 1360 B/op 13 allocs/op -BenchmarkGoJsonRest_ParamWrite 380242 3447 ns/op 1128 B/op 18 allocs/op -BenchmarkGoRestful_ParamWrite 131046 9340 ns/op 4200 B/op 15 allocs/op -BenchmarkGorillaMux_ParamWrite 298428 3970 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_ParamWrite 655940 2744 ns/op 976 B/op 8 allocs/op -BenchmarkHttpRouter_ParamWrite 5237014 219 ns/op 32 B/op 1 allocs/op -BenchmarkHttpTreeMux_ParamWrite 1379904 853 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_ParamWrite 2939042 400 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_ParamWrite 6181642 199 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParamWrite 352497 4670 ns/op 1176 B/op 14 allocs/op -BenchmarkMartini_ParamWrite 138259 8543 ns/op 1176 B/op 14 allocs/op -BenchmarkPat_ParamWrite 552386 3262 ns/op 960 B/op 15 allocs/op -BenchmarkPossum_ParamWrite 1000000 1711 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_ParamWrite 1000000 1085 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_ParamWrite 2374513 489 ns/op 112 B/op 2 allocs/op -BenchmarkTango_ParamWrite 1443907 812 ns/op 136 B/op 4 allocs/op -BenchmarkTigerTonic_ParamWrite 324264 4874 ns/op 1216 B/op 21 allocs/op -BenchmarkTraffic_ParamWrite 170726 7155 ns/op 2280 B/op 25 allocs/op -BenchmarkVulcan_ParamWrite 1498888 776 ns/op 98 B/op 3 allocs/op - -``` - -## GitHub - -``` -BenchmarkGin_GithubStatic 5866748 194 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_GithubStatic 5815826 205 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GithubStatic 10822906 106 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubStatic 1678065 707 ns/op 120 B/op 3 allocs/op -BenchmarkBeego_GithubStatic 828814 1717 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GithubStatic 67484 18858 ns/op 2880 B/op 60 allocs/op -BenchmarkCloudyKitRouter_GithubStatic 10219297 115 ns/op 0 B/op 0 allocs/op -BenchmarkChi_GithubStatic 1000000 1348 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_GithubStatic 15220622 75.4 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_GithubStatic 7255897 158 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubStatic 1000000 1198 ns/op 296 B/op 5 allocs/op -BenchmarkGoji_GithubStatic 3659361 320 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_GithubStatic 402402 3384 ns/op 1312 B/op 10 allocs/op -BenchmarkGoRestful_GithubStatic 54592 22045 ns/op 4256 B/op 13 allocs/op -BenchmarkGoJsonRest_GithubStatic 801067 1673 ns/op 329 B/op 11 allocs/op -BenchmarkGorillaMux_GithubStatic 169690 8171 ns/op 976 B/op 9 allocs/op -BenchmarkGowwwRouter_GithubStatic 5372910 218 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_GithubStatic 10965576 103 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GithubStatic 10505365 106 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_GithubStatic 14153763 81.9 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_GithubStatic 7874017 152 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubStatic 696940 2678 ns/op 736 B/op 8 allocs/op -BenchmarkMartini_GithubStatic 102384 12276 ns/op 768 B/op 9 allocs/op -BenchmarkPat_GithubStatic 69907 17437 ns/op 3648 B/op 76 allocs/op -BenchmarkPossum_GithubStatic 1000000 1262 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_GithubStatic 1981592 614 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_GithubStatic 6103872 196 ns/op 0 B/op 0 allocs/op -BenchmarkTango_GithubStatic 629551 2023 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_GithubStatic 2801569 424 ns/op 48 B/op 1 allocs/op -BenchmarkTraffic_GithubStatic 63716 18009 ns/op 4664 B/op 90 allocs/op -BenchmarkVulcan_GithubStatic 885640 1177 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_GithubParam 2016942 582 ns/op 96 B/op 1 allocs/op -BenchmarkAero_GithubParam 4009522 296 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubParam 1000000 1575 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_GithubParam 796662 2038 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GithubParam 114823 10325 ns/op 1888 B/op 19 allocs/op -BenchmarkChi_GithubParam 1000000 1783 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_GithubParam 3910996 303 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_GithubParam 2298172 521 ns/op 128 B/op 1 allocs/op -BenchmarkEcho_GithubParam 3336364 357 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GithubParam 2729161 439 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubParam 825784 2338 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_GithubParam 933397 1559 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GithubParam 253884 4335 ns/op 1408 B/op 13 allocs/op -BenchmarkGoJsonRest_GithubParam 575532 2967 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_GithubParam 38160 30638 ns/op 4352 B/op 16 allocs/op -BenchmarkGorillaMux_GithubParam 94554 12035 ns/op 1296 B/op 10 allocs/op -BenchmarkGowwwRouter_GithubParam 1000000 1223 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_GithubParam 2562079 468 ns/op 96 B/op 1 allocs/op -BenchmarkHttpTreeMux_GithubParam 1000000 1386 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_GithubParam 1573026 754 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_GithubParam 4203394 282 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubParam 365078 4137 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_GithubParam 71608 15811 ns/op 1152 B/op 11 allocs/op -BenchmarkPat_GithubParam 92768 13297 ns/op 2408 B/op 48 allocs/op -BenchmarkPossum_GithubParam 1000000 1704 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_GithubParam 1000000 1120 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GithubParam 1642794 720 ns/op 96 B/op 1 allocs/op -BenchmarkTango_GithubParam 574195 2345 ns/op 344 B/op 8 allocs/op -BenchmarkTigerTonic_GithubParam 272430 5493 ns/op 1176 B/op 22 allocs/op -BenchmarkTraffic_GithubParam 81914 15078 ns/op 2816 B/op 40 allocs/op -BenchmarkVulcan_GithubParam 581272 1902 ns/op 98 B/op 3 allocs/op - - -BenchmarkAce_GithubAll 10000 103571 ns/op 13792 B/op 167 allocs/op -BenchmarkAero_GithubAll 21366 55615 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubAll 5288 327648 ns/op 86448 B/op 943 allocs/op -BenchmarkBeego_GithubAll 3974 413453 ns/op 71456 B/op 609 allocs/op -BenchmarkBone_GithubAll 267 4450294 ns/op 720160 B/op 8620 allocs/op -BenchmarkChi_GithubAll 5067 358773 ns/op 87696 B/op 609 allocs/op -BenchmarkCloudyKitRouter_GithubAll 24210 49233 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_GithubAll 12508 95341 ns/op 20224 B/op 167 allocs/op -BenchmarkEcho_GithubAll 16353 73267 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GithubAll 15516 77716 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubAll 2908 466970 ns/op 131656 B/op 1686 allocs/op -BenchmarkGoji_GithubAll 1746 691392 ns/op 56112 B/op 334 allocs/op -BenchmarkGojiv2_GithubAll 954 1289604 ns/op 352720 B/op 4321 allocs/op -BenchmarkGoJsonRest_GithubAll 2013 599088 ns/op 134371 B/op 2737 allocs/op -BenchmarkGoRestful_GithubAll 223 5404307 ns/op 910144 B/op 2938 allocs/op -BenchmarkGorillaMux_GithubAll 202 5943565 ns/op 251650 B/op 1994 allocs/op -BenchmarkGowwwRouter_GithubAll 9009 227799 ns/op 72144 B/op 501 allocs/op -BenchmarkHttpRouter_GithubAll 14570 78718 ns/op 13792 B/op 167 allocs/op -BenchmarkHttpTreeMux_GithubAll 7226 242491 ns/op 65856 B/op 671 allocs/op -BenchmarkKocha_GithubAll 8282 159873 ns/op 23304 B/op 843 allocs/op -BenchmarkLARS_GithubAll 22711 52745 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubAll 2067 563117 ns/op 149409 B/op 1624 allocs/op -BenchmarkMartini_GithubAll 218 5455290 ns/op 226552 B/op 2325 allocs/op -BenchmarkPat_GithubAll 174 6801582 ns/op 1483152 B/op 26963 allocs/op -BenchmarkPossum_GithubAll 8113 263665 ns/op 84448 B/op 609 allocs/op -BenchmarkR2router_GithubAll 7172 247198 ns/op 77328 B/op 979 allocs/op -BenchmarkRivet_GithubAll 10000 128086 ns/op 16272 B/op 167 allocs/op -BenchmarkTango_GithubAll 3316 472753 ns/op 63825 B/op 1618 allocs/op -BenchmarkTigerTonic_GithubAll 1176 1041991 ns/op 193856 B/op 4474 allocs/op -BenchmarkTraffic_GithubAll 226 5312082 ns/op 820742 B/op 14114 allocs/op -BenchmarkVulcan_GithubAll 3904 304440 ns/op 19894 B/op 609 allocs/op -``` - -## Google+ - -``` -BenchmarkGin_GPlusStatic 9172405 124 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_GPlusStatic 7784710 152 ns/op 0 B/op 0 allocs/op -BenchmarkAero_GPlusStatic 12771894 89.2 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusStatic 2351325 512 ns/op 104 B/op 3 allocs/op -BenchmarkBeego_GPlusStatic 1000000 1643 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GPlusStatic 4419217 263 ns/op 32 B/op 1 allocs/op -BenchmarkChi_GPlusStatic 1000000 1282 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_GPlusStatic 17730754 61.9 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_GPlusStatic 29549895 38.3 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_GPlusStatic 10521789 111 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusStatic 1000000 1053 ns/op 280 B/op 5 allocs/op -BenchmarkGoji_GPlusStatic 5209968 228 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_GPlusStatic 306363 3348 ns/op 1312 B/op 10 allocs/op -BenchmarkGoJsonRest_GPlusStatic 1000000 1424 ns/op 329 B/op 11 allocs/op -BenchmarkGoRestful_GPlusStatic 130754 8760 ns/op 3872 B/op 13 allocs/op -BenchmarkGorillaMux_GPlusStatic 496250 2860 ns/op 976 B/op 9 allocs/op -BenchmarkGowwwRouter_GPlusStatic 16401519 66.5 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_GPlusStatic 21323139 50.3 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GPlusStatic 14877926 68.7 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_GPlusStatic 18375128 57.6 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_GPlusStatic 11153810 101 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusStatic 652598 2720 ns/op 736 B/op 8 allocs/op -BenchmarkMartini_GPlusStatic 218824 6532 ns/op 768 B/op 9 allocs/op -BenchmarkPat_GPlusStatic 2825560 428 ns/op 96 B/op 2 allocs/op -BenchmarkPossum_GPlusStatic 1000000 1236 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_GPlusStatic 2222193 541 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_GPlusStatic 9802023 114 ns/op 0 B/op 0 allocs/op -BenchmarkTango_GPlusStatic 980658 1465 ns/op 200 B/op 8 allocs/op -BenchmarkTigerTonic_GPlusStatic 4882701 239 ns/op 32 B/op 1 allocs/op -BenchmarkTraffic_GPlusStatic 508060 3465 ns/op 1112 B/op 16 allocs/op -BenchmarkVulcan_GPlusStatic 1608979 725 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_GPlusParam 2962957 414 ns/op 64 B/op 1 allocs/op -BenchmarkAero_GPlusParam 5667668 202 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusParam 1000000 1271 ns/op 480 B/op 5 allocs/op -BenchmarkBeego_GPlusParam 869858 1874 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GPlusParam 869476 2395 ns/op 816 B/op 6 allocs/op -BenchmarkChi_GPlusParam 1000000 1469 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_GPlusParam 11149783 108 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_GPlusParam 4007298 301 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_GPlusParam 6448201 174 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GPlusParam 5470827 218 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusParam 1000000 1939 ns/op 648 B/op 8 allocs/op -BenchmarkGoji_GPlusParam 1207621 997 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GPlusParam 271326 4013 ns/op 1328 B/op 11 allocs/op -BenchmarkGoJsonRest_GPlusParam 781062 2303 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_GPlusParam 121267 9871 ns/op 4192 B/op 14 allocs/op -BenchmarkGorillaMux_GPlusParam 228406 5156 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_GPlusParam 1000000 1074 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_GPlusParam 4399740 276 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_GPlusParam 1309540 898 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_GPlusParam 2930965 403 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_GPlusParam 7588237 151 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusParam 434997 4195 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_GPlusParam 148207 8144 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_GPlusParam 566829 2533 ns/op 576 B/op 11 allocs/op -BenchmarkPossum_GPlusParam 1000000 1723 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_GPlusParam 1000000 1100 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GPlusParam 3309052 331 ns/op 48 B/op 1 allocs/op -BenchmarkTango_GPlusParam 693728 1825 ns/op 264 B/op 8 allocs/op -BenchmarkTigerTonic_GPlusParam 417693 3800 ns/op 856 B/op 16 allocs/op -BenchmarkTraffic_GPlusParam 179424 6641 ns/op 1872 B/op 21 allocs/op -BenchmarkVulcan_GPlusParam 1000000 1063 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_GPlus2Params 2720149 460 ns/op 64 B/op 1 allocs/op -BenchmarkAero_GPlus2Params 3525165 343 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlus2Params 1000000 1502 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_GPlus2Params 730123 2102 ns/op 352 B/op 3 allocs/op -BenchmarkBone_GPlus2Params 253177 5583 ns/op 1168 B/op 10 allocs/op -BenchmarkChi_GPlus2Params 1000000 1531 ns/op 432 B/op 3 allocs/op -BenchmarkCloudyKitRouter_GPlus2Params 6943176 168 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_GPlus2Params 2912601 413 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_GPlus2Params 4149189 278 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GPlus2Params 3271269 356 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlus2Params 915531 2321 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_GPlus2Params 1000000 1413 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GPlus2Params 256640 4521 ns/op 1408 B/op 14 allocs/op -BenchmarkGoJsonRest_GPlus2Params 499140 3076 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_GPlus2Params 105928 10148 ns/op 4384 B/op 16 allocs/op -BenchmarkGorillaMux_GPlus2Params 110953 9682 ns/op 1296 B/op 10 allocs/op -BenchmarkGowwwRouter_GPlus2Params 1000000 1112 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_GPlus2Params 3491893 321 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_GPlus2Params 1000000 1341 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_GPlus2Params 1445288 790 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_GPlus2Params 6644953 185 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlus2Params 424291 4321 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_GPlus2Params 70866 16407 ns/op 1200 B/op 13 allocs/op -BenchmarkPat_GPlus2Params 121308 10221 ns/op 2168 B/op 33 allocs/op -BenchmarkPossum_GPlus2Params 1000000 1847 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_GPlus2Params 1000000 1267 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GPlus2Params 2017526 590 ns/op 96 B/op 1 allocs/op -BenchmarkTango_GPlus2Params 846003 2143 ns/op 344 B/op 8 allocs/op -BenchmarkTigerTonic_GPlus2Params 303597 5736 ns/op 1200 B/op 22 allocs/op -BenchmarkTraffic_GPlus2Params 95032 12817 ns/op 2248 B/op 28 allocs/op -BenchmarkVulcan_GPlus2Params 692610 1575 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_GPlusAll 271720 4948 ns/op 640 B/op 11 allocs/op -BenchmarkAero_GPlusAll 367956 2926 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusAll 68161 17883 ns/op 5488 B/op 61 allocs/op -BenchmarkBeego_GPlusAll 46634 25369 ns/op 4576 B/op 39 allocs/op -BenchmarkBone_GPlusAll 24628 49198 ns/op 11744 B/op 109 allocs/op -BenchmarkChi_GPlusAll 60778 19356 ns/op 5616 B/op 39 allocs/op -BenchmarkCloudyKitRouter_GPlusAll 706952 1693 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_GPlusAll 327422 4222 ns/op 672 B/op 11 allocs/op -BenchmarkEcho_GPlusAll 331987 3176 ns/op 0 B/op 0 allocs/op -BenchmarkGin_GPlusAll 289526 3559 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusAll 45805 26768 ns/op 8040 B/op 103 allocs/op -BenchmarkGoji_GPlusAll 74786 14428 ns/op 3696 B/op 22 allocs/op -BenchmarkGojiv2_GPlusAll 23822 50355 ns/op 17616 B/op 154 allocs/op -BenchmarkGoJsonRest_GPlusAll 35280 32989 ns/op 8117 B/op 170 allocs/op -BenchmarkGoRestful_GPlusAll 10000 129418 ns/op 55520 B/op 192 allocs/op -BenchmarkGorillaMux_GPlusAll 15968 76492 ns/op 16112 B/op 128 allocs/op -BenchmarkGowwwRouter_GPlusAll 100096 12644 ns/op 4752 B/op 33 allocs/op -BenchmarkHttpRouter_GPlusAll 474584 3704 ns/op 640 B/op 11 allocs/op -BenchmarkHttpTreeMux_GPlusAll 98506 12480 ns/op 4032 B/op 38 allocs/op -BenchmarkKocha_GPlusAll 213709 7358 ns/op 976 B/op 43 allocs/op -BenchmarkLARS_GPlusAll 466608 2363 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusAll 34136 35790 ns/op 9568 B/op 104 allocs/op -BenchmarkMartini_GPlusAll 8911 124543 ns/op 14016 B/op 145 allocs/op -BenchmarkPat_GPlusAll 17391 69198 ns/op 15264 B/op 271 allocs/op -BenchmarkPossum_GPlusAll 66774 17004 ns/op 5408 B/op 39 allocs/op -BenchmarkR2router_GPlusAll 79681 13996 ns/op 5040 B/op 63 allocs/op -BenchmarkRivet_GPlusAll 258788 5344 ns/op 768 B/op 11 allocs/op -BenchmarkTango_GPlusAll 46930 25591 ns/op 3656 B/op 104 allocs/op -BenchmarkTigerTonic_GPlusAll 20768 58038 ns/op 11600 B/op 242 allocs/op -BenchmarkTraffic_GPlusAll 10000 108031 ns/op 26248 B/op 341 allocs/op -BenchmarkVulcan_GPlusAll 71826 15724 ns/op 1274 B/op 39 allocs/op -``` - -## Parse.com - -``` -BenchmarkGin_ParseStatic 8683893 140 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_ParseStatic 7255582 160 ns/op 0 B/op 0 allocs/op -BenchmarkAero_ParseStatic 11960128 95.0 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseStatic 1791033 659 ns/op 120 B/op 3 allocs/op -BenchmarkBeego_ParseStatic 937918 1688 ns/op 352 B/op 3 allocs/op -BenchmarkBone_ParseStatic 1261682 949 ns/op 144 B/op 3 allocs/op -BenchmarkChi_ParseStatic 1000000 1303 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_ParseStatic 23731242 49.8 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_ParseStatic 10585060 116 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseStatic 1000000 1156 ns/op 296 B/op 5 allocs/op -BenchmarkGoji_ParseStatic 3927530 300 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_ParseStatic 474836 3281 ns/op 1312 B/op 10 allocs/op -BenchmarkGoJsonRest_ParseStatic 1000000 1445 ns/op 329 B/op 11 allocs/op -BenchmarkGoRestful_ParseStatic 101262 11612 ns/op 4256 B/op 13 allocs/op -BenchmarkGorillaMux_ParseStatic 562705 3530 ns/op 976 B/op 9 allocs/op -BenchmarkGowwwRouter_ParseStatic 16479007 69.5 ns/op 0 B/op 0 allocs/op -BenchmarkHttpRouter_ParseStatic 23205590 51.5 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_ParseStatic 10763127 106 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_ParseStatic 17850259 60.9 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_ParseStatic 10727432 108 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseStatic 685586 2665 ns/op 736 B/op 8 allocs/op -BenchmarkMartini_ParseStatic 200642 7158 ns/op 768 B/op 9 allocs/op -BenchmarkPat_ParseStatic 1000000 1139 ns/op 240 B/op 5 allocs/op -BenchmarkPossum_ParseStatic 1000000 1241 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_ParseStatic 2035426 597 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_ParseStatic 9707011 127 ns/op 0 B/op 0 allocs/op -BenchmarkTango_ParseStatic 910617 1693 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_ParseStatic 3168885 385 ns/op 48 B/op 1 allocs/op -BenchmarkTraffic_ParseStatic 493339 4264 ns/op 1256 B/op 19 allocs/op -BenchmarkVulcan_ParseStatic 1394142 848 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_ParseParam 3106903 387 ns/op 64 B/op 1 allocs/op -BenchmarkAero_ParseParam 8045266 141 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseParam 1000000 1434 ns/op 467 B/op 5 allocs/op -BenchmarkBeego_ParseParam 951460 1937 ns/op 352 B/op 3 allocs/op -BenchmarkBone_ParseParam 855555 2776 ns/op 896 B/op 7 allocs/op -BenchmarkChi_ParseParam 1000000 1457 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_ParseParam 4084116 301 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_ParseParam 8440170 142 ns/op 0 B/op 0 allocs/op -BenchmarkGin_ParseParam 7716948 157 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseParam 886284 2045 ns/op 664 B/op 8 allocs/op -BenchmarkGoji_ParseParam 1000000 1167 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_ParseParam 269731 3945 ns/op 1360 B/op 12 allocs/op -BenchmarkGoJsonRest_ParseParam 719587 2277 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_ParseParam 96408 11925 ns/op 4576 B/op 14 allocs/op -BenchmarkGorillaMux_ParseParam 289303 4154 ns/op 1280 B/op 10 allocs/op -BenchmarkGowwwRouter_ParseParam 1000000 1070 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_ParseParam 4917758 232 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_ParseParam 1445443 828 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_ParseParam 3116233 382 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_ParseParam 10584750 113 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseParam 413617 3872 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_ParseParam 166545 7605 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_ParseParam 491829 3394 ns/op 992 B/op 15 allocs/op -BenchmarkPossum_ParseParam 1000000 1692 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_ParseParam 1000000 1059 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_ParseParam 3572359 311 ns/op 48 B/op 1 allocs/op -BenchmarkTango_ParseParam 787552 1889 ns/op 280 B/op 8 allocs/op -BenchmarkTigerTonic_ParseParam 487208 3706 ns/op 784 B/op 15 allocs/op -BenchmarkTraffic_ParseParam 186190 5812 ns/op 1896 B/op 21 allocs/op -BenchmarkVulcan_ParseParam 1275432 892 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_Parse2Params 2959621 412 ns/op 64 B/op 1 allocs/op -BenchmarkAero_Parse2Params 6208641 192 ns/op 0 B/op 0 allocs/op -BenchmarkBear_Parse2Params 1000000 1512 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_Parse2Params 761940 1973 ns/op 352 B/op 3 allocs/op -BenchmarkBone_Parse2Params 715987 2582 ns/op 848 B/op 6 allocs/op -BenchmarkChi_Parse2Params 1000000 1495 ns/op 432 B/op 3 allocs/op -BenchmarkDenco_Parse2Params 3585452 341 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_Parse2Params 5193693 204 ns/op 0 B/op 0 allocs/op -BenchmarkGin_Parse2Params 5338316 236 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Parse2Params 939637 2299 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_Parse2Params 1000000 1094 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Parse2Params 339514 3733 ns/op 1344 B/op 11 allocs/op -BenchmarkGoJsonRest_Parse2Params 512572 2733 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_Parse2Params 95913 12973 ns/op 4928 B/op 14 allocs/op -BenchmarkGorillaMux_Parse2Params 261208 4758 ns/op 1296 B/op 10 allocs/op -BenchmarkGowwwRouter_Parse2Params 1000000 1084 ns/op 432 B/op 3 allocs/op -BenchmarkHttpRouter_Parse2Params 4399953 277 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_Parse2Params 1000000 1198 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_Parse2Params 1669431 683 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_Parse2Params 8535754 142 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Parse2Params 424590 3959 ns/op 1072 B/op 10 allocs/op -BenchmarkMartini_Parse2Params 162448 8141 ns/op 1152 B/op 11 allocs/op -BenchmarkPat_Parse2Params 431336 3484 ns/op 752 B/op 16 allocs/op -BenchmarkPossum_Parse2Params 1000000 1721 ns/op 496 B/op 5 allocs/op -BenchmarkR2router_Parse2Params 1000000 1136 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Parse2Params 2630935 442 ns/op 96 B/op 1 allocs/op -BenchmarkTango_Parse2Params 759218 1876 ns/op 312 B/op 8 allocs/op -BenchmarkTigerTonic_Parse2Params 290810 5558 ns/op 1168 B/op 22 allocs/op -BenchmarkTraffic_Parse2Params 181099 6917 ns/op 1944 B/op 22 allocs/op -BenchmarkVulcan_Parse2Params 1000000 1080 ns/op 98 B/op 3 allocs/op - -BenchmarkAce_ParseAll 162906 7888 ns/op 640 B/op 16 allocs/op -BenchmarkAero_ParseAll 219260 4833 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseAll 37566 32863 ns/op 8928 B/op 110 allocs/op -BenchmarkBeego_ParseAll 25400 46518 ns/op 9152 B/op 78 allocs/op -BenchmarkBone_ParseAll 19568 61814 ns/op 16208 B/op 147 allocs/op -BenchmarkChi_ParseAll 30562 38281 ns/op 11232 B/op 78 allocs/op -BenchmarkDenco_ParseAll 232554 6371 ns/op 928 B/op 16 allocs/op -BenchmarkEcho_ParseAll 224400 5090 ns/op 0 B/op 0 allocs/op -BenchmarkGin_ParseAll 189829 6134 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseAll 25446 47000 ns/op 13728 B/op 181 allocs/op -BenchmarkGoji_ParseAll 50503 22949 ns/op 5376 B/op 32 allocs/op -BenchmarkGojiv2_ParseAll 12806 93106 ns/op 34448 B/op 277 allocs/op -BenchmarkGoJsonRest_ParseAll 20764 57021 ns/op 13866 B/op 321 allocs/op -BenchmarkGoRestful_ParseAll 4234 317238 ns/op 117600 B/op 354 allocs/op -BenchmarkGorillaMux_ParseAll 10000 146942 ns/op 30288 B/op 250 allocs/op -BenchmarkGowwwRouter_ParseAll 62548 19363 ns/op 6912 B/op 48 allocs/op -BenchmarkHttpRouter_ParseAll 286662 5091 ns/op 640 B/op 16 allocs/op -BenchmarkHttpTreeMux_ParseAll 66952 18262 ns/op 5728 B/op 51 allocs/op -BenchmarkKocha_ParseAll 109771 9811 ns/op 1112 B/op 54 allocs/op -BenchmarkLARS_ParseAll 272516 3976 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseAll 17094 71634 ns/op 19136 B/op 208 allocs/op -BenchmarkMartini_ParseAll 6799 208122 ns/op 25072 B/op 253 allocs/op -BenchmarkPat_ParseAll 15993 74594 ns/op 15216 B/op 308 allocs/op -BenchmarkPossum_ParseAll 34897 33398 ns/op 10816 B/op 78 allocs/op -BenchmarkR2router_ParseAll 46909 25410 ns/op 8352 B/op 120 allocs/op -BenchmarkRivet_ParseAll 185193 7725 ns/op 912 B/op 16 allocs/op -BenchmarkTango_ParseAll 24481 47963 ns/op 7168 B/op 208 allocs/op -BenchmarkTigerTonic_ParseAll 15236 79623 ns/op 16048 B/op 332 allocs/op -BenchmarkTraffic_ParseAll 8955 169411 ns/op 45520 B/op 605 allocs/op -BenchmarkVulcan_ParseAll 40406 28971 ns/op 2548 B/op 78 allocs/op -``` diff --git a/vendor/github.com/gin-gonic/gin/CHANGELOG.md b/vendor/github.com/gin-gonic/gin/CHANGELOG.md deleted file mode 100644 index 592c2abc..00000000 --- a/vendor/github.com/gin-gonic/gin/CHANGELOG.md +++ /dev/null @@ -1,373 +0,0 @@ -# Gin ChangeLog - -## Gin v1.6.3 - -### ENHANCEMENTS - - * Improve performance: Change `*sync.RWMutex` to `sync.RWMutex` in context. [#2351](https://github.com/gin-gonic/gin/pull/2351) - -## Gin v1.6.2 - -### BUFIXES - * fix missing initial sync.RWMutex [#2305](https://github.com/gin-gonic/gin/pull/2305) -### ENHANCEMENTS - * Add set samesite in cookie. [#2306](https://github.com/gin-gonic/gin/pull/2306) - -## Gin v1.6.1 - -### BUFIXES - * Revert "fix accept incoming network connections" [#2294](https://github.com/gin-gonic/gin/pull/2294) - -## Gin v1.6.0 - -### BREAKING - * chore(performance): Improve performance for adding RemoveExtraSlash flag [#2159](https://github.com/gin-gonic/gin/pull/2159) - * drop support govendor [#2148](https://github.com/gin-gonic/gin/pull/2148) - * Added support for SameSite cookie flag [#1615](https://github.com/gin-gonic/gin/pull/1615) -### FEATURES - * add yaml negotitation [#2220](https://github.com/gin-gonic/gin/pull/2220) - * FileFromFS [#2112](https://github.com/gin-gonic/gin/pull/2112) -### BUGFIXES - * Unix Socket Handling [#2280](https://github.com/gin-gonic/gin/pull/2280) - * Use json marshall in context json to fix breaking new line issue. Fixes #2209 [#2228](https://github.com/gin-gonic/gin/pull/2228) - * fix accept incoming network connections [#2216](https://github.com/gin-gonic/gin/pull/2216) - * Fixed a bug in the calculation of the maximum number of parameters [#2166](https://github.com/gin-gonic/gin/pull/2166) - * [FIX] allow empty headers on DataFromReader [#2121](https://github.com/gin-gonic/gin/pull/2121) - * Add mutex for protect Context.Keys map [#1391](https://github.com/gin-gonic/gin/pull/1391) -### ENHANCEMENTS - * Add mitigation for log injection [#2277](https://github.com/gin-gonic/gin/pull/2277) - * tree: range over nodes values [#2229](https://github.com/gin-gonic/gin/pull/2229) - * tree: remove duplicate assignment [#2222](https://github.com/gin-gonic/gin/pull/2222) - * chore: upgrade go-isatty and json-iterator/go [#2215](https://github.com/gin-gonic/gin/pull/2215) - * path: sync code with httprouter [#2212](https://github.com/gin-gonic/gin/pull/2212) - * Use zero-copy approach to convert types between string and byte slice [#2206](https://github.com/gin-gonic/gin/pull/2206) - * Reuse bytes when cleaning the URL paths [#2179](https://github.com/gin-gonic/gin/pull/2179) - * tree: remove one else statement [#2177](https://github.com/gin-gonic/gin/pull/2177) - * tree: sync httprouter update (#2173) (#2172) [#2171](https://github.com/gin-gonic/gin/pull/2171) - * tree: sync part httprouter codes and reduce if/else [#2163](https://github.com/gin-gonic/gin/pull/2163) - * use http method constant [#2155](https://github.com/gin-gonic/gin/pull/2155) - * upgrade go-validator to v10 [#2149](https://github.com/gin-gonic/gin/pull/2149) - * Refactor redirect request in gin.go [#1970](https://github.com/gin-gonic/gin/pull/1970) - * Add build tag nomsgpack [#1852](https://github.com/gin-gonic/gin/pull/1852) -### DOCS - * docs(path): improve comments [#2223](https://github.com/gin-gonic/gin/pull/2223) - * Renew README to fit the modification of SetCookie method [#2217](https://github.com/gin-gonic/gin/pull/2217) - * Fix spelling [#2202](https://github.com/gin-gonic/gin/pull/2202) - * Remove broken link from README. [#2198](https://github.com/gin-gonic/gin/pull/2198) - * Update docs on Context.Done(), Context.Deadline() and Context.Err() [#2196](https://github.com/gin-gonic/gin/pull/2196) - * Update validator to v10 [#2190](https://github.com/gin-gonic/gin/pull/2190) - * upgrade go-validator to v10 for README [#2189](https://github.com/gin-gonic/gin/pull/2189) - * Update to currently output [#2188](https://github.com/gin-gonic/gin/pull/2188) - * Fix "Custom Validators" example [#2186](https://github.com/gin-gonic/gin/pull/2186) - * Add project to README [#2165](https://github.com/gin-gonic/gin/pull/2165) - * docs(benchmarks): for gin v1.5 [#2153](https://github.com/gin-gonic/gin/pull/2153) - * Changed wording for clarity in README.md [#2122](https://github.com/gin-gonic/gin/pull/2122) -### MISC - * ci support go1.14 [#2262](https://github.com/gin-gonic/gin/pull/2262) - * chore: upgrade depend version [#2231](https://github.com/gin-gonic/gin/pull/2231) - * Drop support go1.10 [#2147](https://github.com/gin-gonic/gin/pull/2147) - * fix comment in `mode.go` [#2129](https://github.com/gin-gonic/gin/pull/2129) - -## Gin v1.5.0 - -- [FIX] Use DefaultWriter and DefaultErrorWriter for debug messages [#1891](https://github.com/gin-gonic/gin/pull/1891) -- [NEW] Now you can parse the inline lowercase start structure [#1893](https://github.com/gin-gonic/gin/pull/1893) -- [FIX] Some code improvements [#1909](https://github.com/gin-gonic/gin/pull/1909) -- [FIX] Use encode replace json marshal increase json encoder speed [#1546](https://github.com/gin-gonic/gin/pull/1546) -- [NEW] Hold matched route full path in the Context [#1826](https://github.com/gin-gonic/gin/pull/1826) -- [FIX] Fix context.Params race condition on Copy() [#1841](https://github.com/gin-gonic/gin/pull/1841) -- [NEW] Add context param query cache [#1450](https://github.com/gin-gonic/gin/pull/1450) -- [FIX] Improve GetQueryMap performance [#1918](https://github.com/gin-gonic/gin/pull/1918) -- [FIX] Improve get post data [#1920](https://github.com/gin-gonic/gin/pull/1920) -- [FIX] Use context instead of x/net/context [#1922](https://github.com/gin-gonic/gin/pull/1922) -- [FIX] Attempt to fix PostForm cache bug [#1931](https://github.com/gin-gonic/gin/pull/1931) -- [NEW] Add support of multipart multi files [#1949](https://github.com/gin-gonic/gin/pull/1949) -- [NEW] Support bind http header param [#1957](https://github.com/gin-gonic/gin/pull/1957) -- [FIX] Drop support for go1.8 and go1.9 [#1933](https://github.com/gin-gonic/gin/pull/1933) -- [FIX] Bugfix for the FullPath feature [#1919](https://github.com/gin-gonic/gin/pull/1919) -- [FIX] Gin1.5 bytes.Buffer to strings.Builder [#1939](https://github.com/gin-gonic/gin/pull/1939) -- [FIX] Upgrade github.com/ugorji/go/codec [#1969](https://github.com/gin-gonic/gin/pull/1969) -- [NEW] Support bind unix time [#1980](https://github.com/gin-gonic/gin/pull/1980) -- [FIX] Simplify code [#2004](https://github.com/gin-gonic/gin/pull/2004) -- [NEW] Support negative Content-Length in DataFromReader [#1981](https://github.com/gin-gonic/gin/pull/1981) -- [FIX] Identify terminal on a RISC-V architecture for auto-colored logs [#2019](https://github.com/gin-gonic/gin/pull/2019) -- [BREAKING] `Context.JSONP()` now expects a semicolon (`;`) at the end [#2007](https://github.com/gin-gonic/gin/pull/2007) -- [BREAKING] Upgrade default `binding.Validator` to v9 (see [its changelog](https://github.com/go-playground/validator/releases/tag/v9.0.0)) [#1015](https://github.com/gin-gonic/gin/pull/1015) -- [NEW] Add `DisallowUnknownFields()` in `Context.BindJSON()` [#2028](https://github.com/gin-gonic/gin/pull/2028) -- [NEW] Use specific `net.Listener` with `Engine.RunListener()` [#2023](https://github.com/gin-gonic/gin/pull/2023) -- [FIX] Fix some typo [#2079](https://github.com/gin-gonic/gin/pull/2079) [#2080](https://github.com/gin-gonic/gin/pull/2080) -- [FIX] Relocate binding body tests [#2086](https://github.com/gin-gonic/gin/pull/2086) -- [FIX] Use Writer in Context.Status [#1606](https://github.com/gin-gonic/gin/pull/1606) -- [FIX] `Engine.RunUnix()` now returns the error if it can't change the file mode [#2093](https://github.com/gin-gonic/gin/pull/2093) -- [FIX] `RouterGroup.StaticFS()` leaked files. Now it closes them. [#2118](https://github.com/gin-gonic/gin/pull/2118) -- [FIX] `Context.Request.FormFile` leaked file. Now it closes it. [#2114](https://github.com/gin-gonic/gin/pull/2114) -- [FIX] Ignore walking on `form:"-"` mapping [#1943](https://github.com/gin-gonic/gin/pull/1943) - -### Gin v1.4.0 - -- [NEW] Support for [Go Modules](https://github.com/golang/go/wiki/Modules) [#1569](https://github.com/gin-gonic/gin/pull/1569) -- [NEW] Refactor of form mapping multipart request [#1829](https://github.com/gin-gonic/gin/pull/1829) -- [FIX] Truncate Latency precision in long running request [#1830](https://github.com/gin-gonic/gin/pull/1830) -- [FIX] IsTerm flag should not be affected by DisableConsoleColor method. [#1802](https://github.com/gin-gonic/gin/pull/1802) -- [NEW] Supporting file binding [#1264](https://github.com/gin-gonic/gin/pull/1264) -- [NEW] Add support for mapping arrays [#1797](https://github.com/gin-gonic/gin/pull/1797) -- [FIX] Readme updates [#1793](https://github.com/gin-gonic/gin/pull/1793) [#1788](https://github.com/gin-gonic/gin/pull/1788) [1789](https://github.com/gin-gonic/gin/pull/1789) -- [FIX] StaticFS: Fixed Logging two log lines on 404. [#1805](https://github.com/gin-gonic/gin/pull/1805), [#1804](https://github.com/gin-gonic/gin/pull/1804) -- [NEW] Make context.Keys available as LogFormatterParams [#1779](https://github.com/gin-gonic/gin/pull/1779) -- [NEW] Use internal/json for Marshal/Unmarshal [#1791](https://github.com/gin-gonic/gin/pull/1791) -- [NEW] Support mapping time.Duration [#1794](https://github.com/gin-gonic/gin/pull/1794) -- [NEW] Refactor form mappings [#1749](https://github.com/gin-gonic/gin/pull/1749) -- [NEW] Added flag to context.Stream indicates if client disconnected in middle of stream [#1252](https://github.com/gin-gonic/gin/pull/1252) -- [FIX] Moved [examples](https://github.com/gin-gonic/examples) to stand alone Repo [#1775](https://github.com/gin-gonic/gin/pull/1775) -- [NEW] Extend context.File to allow for the content-disposition attachments via a new method context.Attachment [#1260](https://github.com/gin-gonic/gin/pull/1260) -- [FIX] Support HTTP content negotiation wildcards [#1112](https://github.com/gin-gonic/gin/pull/1112) -- [NEW] Add prefix from X-Forwarded-Prefix in redirectTrailingSlash [#1238](https://github.com/gin-gonic/gin/pull/1238) -- [FIX] context.Copy() race condition [#1020](https://github.com/gin-gonic/gin/pull/1020) -- [NEW] Add context.HandlerNames() [#1729](https://github.com/gin-gonic/gin/pull/1729) -- [FIX] Change color methods to public in the defaultLogger. [#1771](https://github.com/gin-gonic/gin/pull/1771) -- [FIX] Update writeHeaders method to use http.Header.Set [#1722](https://github.com/gin-gonic/gin/pull/1722) -- [NEW] Add response size to LogFormatterParams [#1752](https://github.com/gin-gonic/gin/pull/1752) -- [NEW] Allow ignoring field on form mapping [#1733](https://github.com/gin-gonic/gin/pull/1733) -- [NEW] Add a function to force color in console output. [#1724](https://github.com/gin-gonic/gin/pull/1724) -- [FIX] Context.Next() - recheck len of handlers on every iteration. [#1745](https://github.com/gin-gonic/gin/pull/1745) -- [FIX] Fix all errcheck warnings [#1739](https://github.com/gin-gonic/gin/pull/1739) [#1653](https://github.com/gin-gonic/gin/pull/1653) -- [NEW] context: inherits context cancellation and deadline from http.Request context for Go>=1.7 [#1690](https://github.com/gin-gonic/gin/pull/1690) -- [NEW] Binding for URL Params [#1694](https://github.com/gin-gonic/gin/pull/1694) -- [NEW] Add LoggerWithFormatter method [#1677](https://github.com/gin-gonic/gin/pull/1677) -- [FIX] CI testing updates [#1671](https://github.com/gin-gonic/gin/pull/1671) [#1670](https://github.com/gin-gonic/gin/pull/1670) [#1682](https://github.com/gin-gonic/gin/pull/1682) [#1669](https://github.com/gin-gonic/gin/pull/1669) -- [FIX] StaticFS(): Send 404 when path does not exist [#1663](https://github.com/gin-gonic/gin/pull/1663) -- [FIX] Handle nil body for JSON binding [#1638](https://github.com/gin-gonic/gin/pull/1638) -- [FIX] Support bind uri param [#1612](https://github.com/gin-gonic/gin/pull/1612) -- [FIX] recovery: fix issue with syscall import on google app engine [#1640](https://github.com/gin-gonic/gin/pull/1640) -- [FIX] Make sure the debug log contains line breaks [#1650](https://github.com/gin-gonic/gin/pull/1650) -- [FIX] Panic stack trace being printed during recovery of broken pipe [#1089](https://github.com/gin-gonic/gin/pull/1089) [#1259](https://github.com/gin-gonic/gin/pull/1259) -- [NEW] RunFd method to run http.Server through a file descriptor [#1609](https://github.com/gin-gonic/gin/pull/1609) -- [NEW] Yaml binding support [#1618](https://github.com/gin-gonic/gin/pull/1618) -- [FIX] Pass MaxMultipartMemory when FormFile is called [#1600](https://github.com/gin-gonic/gin/pull/1600) -- [FIX] LoadHTML* tests [#1559](https://github.com/gin-gonic/gin/pull/1559) -- [FIX] Removed use of sync.pool from HandleContext [#1565](https://github.com/gin-gonic/gin/pull/1565) -- [FIX] Format output log to os.Stderr [#1571](https://github.com/gin-gonic/gin/pull/1571) -- [FIX] Make logger use a yellow background and a darkgray text for legibility [#1570](https://github.com/gin-gonic/gin/pull/1570) -- [FIX] Remove sensitive request information from panic log. [#1370](https://github.com/gin-gonic/gin/pull/1370) -- [FIX] log.Println() does not print timestamp [#829](https://github.com/gin-gonic/gin/pull/829) [#1560](https://github.com/gin-gonic/gin/pull/1560) -- [NEW] Add PureJSON renderer [#694](https://github.com/gin-gonic/gin/pull/694) -- [FIX] Add missing copyright and update if/else [#1497](https://github.com/gin-gonic/gin/pull/1497) -- [FIX] Update msgpack usage [#1498](https://github.com/gin-gonic/gin/pull/1498) -- [FIX] Use protobuf on render [#1496](https://github.com/gin-gonic/gin/pull/1496) -- [FIX] Add support for Protobuf format response [#1479](https://github.com/gin-gonic/gin/pull/1479) -- [NEW] Set default time format in form binding [#1487](https://github.com/gin-gonic/gin/pull/1487) -- [FIX] Add BindXML and ShouldBindXML [#1485](https://github.com/gin-gonic/gin/pull/1485) -- [NEW] Upgrade dependency libraries [#1491](https://github.com/gin-gonic/gin/pull/1491) - - -## Gin v1.3.0 - -- [NEW] Add [`func (*Context) QueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.QueryMap), [`func (*Context) GetQueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetQueryMap), [`func (*Context) PostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.PostFormMap) and [`func (*Context) GetPostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetPostFormMap) to support `type map[string]string` as query string or form parameters, see [#1383](https://github.com/gin-gonic/gin/pull/1383) -- [NEW] Add [`func (*Context) AsciiJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.AsciiJSON), see [#1358](https://github.com/gin-gonic/gin/pull/1358) -- [NEW] Add `Pusher()` in [`type ResponseWriter`](https://godoc.org/github.com/gin-gonic/gin#ResponseWriter) for supporting http2 push, see [#1273](https://github.com/gin-gonic/gin/pull/1273) -- [NEW] Add [`func (*Context) DataFromReader`](https://godoc.org/github.com/gin-gonic/gin#Context.DataFromReader) for serving dynamic data, see [#1304](https://github.com/gin-gonic/gin/pull/1304) -- [NEW] Add [`func (*Context) ShouldBindBodyWith`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindBodyWith) allowing to call binding multiple times, see [#1341](https://github.com/gin-gonic/gin/pull/1341) -- [NEW] Support pointers in form binding, see [#1336](https://github.com/gin-gonic/gin/pull/1336) -- [NEW] Add [`func (*Context) JSONP`](https://godoc.org/github.com/gin-gonic/gin#Context.JSONP), see [#1333](https://github.com/gin-gonic/gin/pull/1333) -- [NEW] Support default value in form binding, see [#1138](https://github.com/gin-gonic/gin/pull/1138) -- [NEW] Expose validator engine in [`type StructValidator`](https://godoc.org/github.com/gin-gonic/gin/binding#StructValidator), see [#1277](https://github.com/gin-gonic/gin/pull/1277) -- [NEW] Add [`func (*Context) ShouldBind`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind), [`func (*Context) ShouldBindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindQuery) and [`func (*Context) ShouldBindJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindJSON), see [#1047](https://github.com/gin-gonic/gin/pull/1047) -- [NEW] Add support for `time.Time` location in form binding, see [#1117](https://github.com/gin-gonic/gin/pull/1117) -- [NEW] Add [`func (*Context) BindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.BindQuery), see [#1029](https://github.com/gin-gonic/gin/pull/1029) -- [NEW] Make [jsonite](https://github.com/json-iterator/go) optional with build tags, see [#1026](https://github.com/gin-gonic/gin/pull/1026) -- [NEW] Show query string in logger, see [#999](https://github.com/gin-gonic/gin/pull/999) -- [NEW] Add [`func (*Context) SecureJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.SecureJSON), see [#987](https://github.com/gin-gonic/gin/pull/987) and [#993](https://github.com/gin-gonic/gin/pull/993) -- [DEPRECATE] `func (*Context) GetCookie` for [`func (*Context) Cookie`](https://godoc.org/github.com/gin-gonic/gin#Context.Cookie) -- [FIX] Don't display color tags if [`func DisableConsoleColor`](https://godoc.org/github.com/gin-gonic/gin#DisableConsoleColor) called, see [#1072](https://github.com/gin-gonic/gin/pull/1072) -- [FIX] Gin Mode `""` when calling [`func Mode`](https://godoc.org/github.com/gin-gonic/gin#Mode) now returns `const DebugMode`, see [#1250](https://github.com/gin-gonic/gin/pull/1250) -- [FIX] `Flush()` now doesn't overwrite `responseWriter` status code, see [#1460](https://github.com/gin-gonic/gin/pull/1460) - -## Gin 1.2.0 - -- [NEW] Switch from godeps to govendor -- [NEW] Add support for Let's Encrypt via gin-gonic/autotls -- [NEW] Improve README examples and add extra at examples folder -- [NEW] Improved support with App Engine -- [NEW] Add custom template delimiters, see #860 -- [NEW] Add Template Func Maps, see #962 -- [NEW] Add \*context.Handler(), see #928 -- [NEW] Add \*context.GetRawData() -- [NEW] Add \*context.GetHeader() (request) -- [NEW] Add \*context.AbortWithStatusJSON() (JSON content type) -- [NEW] Add \*context.Keys type cast helpers -- [NEW] Add \*context.ShouldBindWith() -- [NEW] Add \*context.MustBindWith() -- [NEW] Add \*engine.SetFuncMap() -- [DEPRECATE] On next release: \*context.BindWith(), see #855 -- [FIX] Refactor render -- [FIX] Reworked tests -- [FIX] logger now supports cygwin -- [FIX] Use X-Forwarded-For before X-Real-Ip -- [FIX] time.Time binding (#904) - -## Gin 1.1.4 - -- [NEW] Support google appengine for IsTerminal func - -## Gin 1.1.3 - -- [FIX] Reverted Logger: skip ANSI color commands - -## Gin 1.1 - -- [NEW] Implement QueryArray and PostArray methods -- [NEW] Refactor GetQuery and GetPostForm -- [NEW] Add contribution guide -- [FIX] Corrected typos in README -- [FIX] Removed additional Iota -- [FIX] Changed imports to gopkg instead of github in README (#733) -- [FIX] Logger: skip ANSI color commands if output is not a tty - -## Gin 1.0rc2 (...) - -- [PERFORMANCE] Fast path for writing Content-Type. -- [PERFORMANCE] Much faster 404 routing -- [PERFORMANCE] Allocation optimizations -- [PERFORMANCE] Faster root tree lookup -- [PERFORMANCE] Zero overhead, String() and JSON() rendering. -- [PERFORMANCE] Faster ClientIP parsing -- [PERFORMANCE] Much faster SSE implementation -- [NEW] Benchmarks suite -- [NEW] Bind validation can be disabled and replaced with custom validators. -- [NEW] More flexible HTML render -- [NEW] Multipart and PostForm bindings -- [NEW] Adds method to return all the registered routes -- [NEW] Context.HandlerName() returns the main handler's name -- [NEW] Adds Error.IsType() helper -- [FIX] Binding multipart form -- [FIX] Integration tests -- [FIX] Crash when binding non struct object in Context. -- [FIX] RunTLS() implementation -- [FIX] Logger() unit tests -- [FIX] Adds SetHTMLTemplate() warning -- [FIX] Context.IsAborted() -- [FIX] More unit tests -- [FIX] JSON, XML, HTML renders accept custom content-types -- [FIX] gin.AbortIndex is unexported -- [FIX] Better approach to avoid directory listing in StaticFS() -- [FIX] Context.ClientIP() always returns the IP with trimmed spaces. -- [FIX] Better warning when running in debug mode. -- [FIX] Google App Engine integration. debugPrint does not use os.Stdout -- [FIX] Fixes integer overflow in error type -- [FIX] Error implements the json.Marshaller interface -- [FIX] MIT license in every file - - -## Gin 1.0rc1 (May 22, 2015) - -- [PERFORMANCE] Zero allocation router -- [PERFORMANCE] Faster JSON, XML and text rendering -- [PERFORMANCE] Custom hand optimized HttpRouter for Gin -- [PERFORMANCE] Misc code optimizations. Inlining, tail call optimizations -- [NEW] Built-in support for golang.org/x/net/context -- [NEW] Any(path, handler). Create a route that matches any path -- [NEW] Refactored rendering pipeline (faster and static typed) -- [NEW] Refactored errors API -- [NEW] IndentedJSON() prints pretty JSON -- [NEW] Added gin.DefaultWriter -- [NEW] UNIX socket support -- [NEW] RouterGroup.BasePath is exposed -- [NEW] JSON validation using go-validate-yourself (very powerful options) -- [NEW] Completed suite of unit tests -- [NEW] HTTP streaming with c.Stream() -- [NEW] StaticFile() creates a router for serving just one file. -- [NEW] StaticFS() has an option to disable directory listing. -- [NEW] StaticFS() for serving static files through virtual filesystems -- [NEW] Server-Sent Events native support -- [NEW] WrapF() and WrapH() helpers for wrapping http.HandlerFunc and http.Handler -- [NEW] Added LoggerWithWriter() middleware -- [NEW] Added RecoveryWithWriter() middleware -- [NEW] Added DefaultPostFormValue() -- [NEW] Added DefaultFormValue() -- [NEW] Added DefaultParamValue() -- [FIX] BasicAuth() when using custom realm -- [FIX] Bug when serving static files in nested routing group -- [FIX] Redirect using built-in http.Redirect() -- [FIX] Logger when printing the requested path -- [FIX] Documentation typos -- [FIX] Context.Engine renamed to Context.engine -- [FIX] Better debugging messages -- [FIX] ErrorLogger -- [FIX] Debug HTTP render -- [FIX] Refactored binding and render modules -- [FIX] Refactored Context initialization -- [FIX] Refactored BasicAuth() -- [FIX] NoMethod/NoRoute handlers -- [FIX] Hijacking http -- [FIX] Better support for Google App Engine (using log instead of fmt) - - -## Gin 0.6 (Mar 9, 2015) - -- [NEW] Support multipart/form-data -- [NEW] NoMethod handler -- [NEW] Validate sub structures -- [NEW] Support for HTTP Realm Auth -- [FIX] Unsigned integers in binding -- [FIX] Improve color logger - - -## Gin 0.5 (Feb 7, 2015) - -- [NEW] Content Negotiation -- [FIX] Solved security bug that allow a client to spoof ip -- [FIX] Fix unexported/ignored fields in binding - - -## Gin 0.4 (Aug 21, 2014) - -- [NEW] Development mode -- [NEW] Unit tests -- [NEW] Add Content.Redirect() -- [FIX] Deferring WriteHeader() -- [FIX] Improved documentation for model binding - - -## Gin 0.3 (Jul 18, 2014) - -- [PERFORMANCE] Normal log and error log are printed in the same call. -- [PERFORMANCE] Improve performance of NoRouter() -- [PERFORMANCE] Improve context's memory locality, reduce CPU cache faults. -- [NEW] Flexible rendering API -- [NEW] Add Context.File() -- [NEW] Add shortcut RunTLS() for http.ListenAndServeTLS -- [FIX] Rename NotFound404() to NoRoute() -- [FIX] Errors in context are purged -- [FIX] Adds HEAD method in Static file serving -- [FIX] Refactors Static() file serving -- [FIX] Using keyed initialization to fix app-engine integration -- [FIX] Can't unmarshal JSON array, #63 -- [FIX] Renaming Context.Req to Context.Request -- [FIX] Check application/x-www-form-urlencoded when parsing form - - -## Gin 0.2b (Jul 08, 2014) -- [PERFORMANCE] Using sync.Pool to allocatio/gc overhead -- [NEW] Travis CI integration -- [NEW] Completely new logger -- [NEW] New API for serving static files. gin.Static() -- [NEW] gin.H() can be serialized into XML -- [NEW] Typed errors. Errors can be typed. Internet/external/custom. -- [NEW] Support for Godeps -- [NEW] Travis/Godocs badges in README -- [NEW] New Bind() and BindWith() methods for parsing request body. -- [NEW] Add Content.Copy() -- [NEW] Add context.LastError() -- [NEW] Add shortcut for OPTIONS HTTP method -- [FIX] Tons of README fixes -- [FIX] Header is written before body -- [FIX] BasicAuth() and changes API a little bit -- [FIX] Recovery() middleware only prints panics -- [FIX] Context.Get() does not panic anymore. Use MustGet() instead. -- [FIX] Multiple http.WriteHeader() in NotFound handlers -- [FIX] Engine.Run() panics if http server can't be set up -- [FIX] Crash when route path doesn't start with '/' -- [FIX] Do not update header when status code is negative -- [FIX] Setting response headers before calling WriteHeader in context.String() -- [FIX] Add MIT license -- [FIX] Changes behaviour of ErrorLogger() and Logger() diff --git a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md deleted file mode 100644 index 4ea14f39..00000000 --- a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at teamgingonic@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md deleted file mode 100644 index 547b777a..00000000 --- a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -## Contributing - -- With issues: - - Use the search tool before opening a new issue. - - Please provide source code and commit sha if you found a bug. - - Review existing issues and provide feedback or react to them. - -- With pull requests: - - Open your pull request against `master` - - Your pull request should have no more than two commits, if not you should squash them. - - It should pass all tests in the available continuous integrations systems such as TravisCI. - - You should add/modify tests to cover your proposed code changes. - - If your pull request contains a new feature, please document it on the README. diff --git a/vendor/github.com/gin-gonic/gin/LICENSE b/vendor/github.com/gin-gonic/gin/LICENSE deleted file mode 100644 index 1ff7f370..00000000 --- a/vendor/github.com/gin-gonic/gin/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Manuel Martínez-Almeida - -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/gin-gonic/gin/Makefile b/vendor/github.com/gin-gonic/gin/Makefile deleted file mode 100644 index 1a991939..00000000 --- a/vendor/github.com/gin-gonic/gin/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -GO ?= go -GOFMT ?= gofmt "-s" -PACKAGES ?= $(shell $(GO) list ./...) -VETPACKAGES ?= $(shell $(GO) list ./... | grep -v /examples/) -GOFILES := $(shell find . -name "*.go") -TESTFOLDER := $(shell $(GO) list ./... | grep -E 'gin$$|binding$$|render$$' | grep -v examples) -TESTTAGS ?= "" - -.PHONY: test -test: - echo "mode: count" > coverage.out - for d in $(TESTFOLDER); do \ - $(GO) test -tags $(TESTTAGS) -v -covermode=count -coverprofile=profile.out $$d > tmp.out; \ - cat tmp.out; \ - if grep -q "^--- FAIL" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - elif grep -q "build failed" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - elif grep -q "setup failed" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - fi; \ - if [ -f profile.out ]; then \ - cat profile.out | grep -v "mode:" >> coverage.out; \ - rm profile.out; \ - fi; \ - done - -.PHONY: fmt -fmt: - $(GOFMT) -w $(GOFILES) - -.PHONY: fmt-check -fmt-check: - @diff=$$($(GOFMT) -d $(GOFILES)); \ - if [ -n "$$diff" ]; then \ - echo "Please run 'make fmt' and commit the result:"; \ - echo "$${diff}"; \ - exit 1; \ - fi; - -vet: - $(GO) vet $(VETPACKAGES) - -.PHONY: lint -lint: - @hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u golang.org/x/lint/golint; \ - fi - for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; - -.PHONY: misspell-check -misspell-check: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -error $(GOFILES) - -.PHONY: misspell -misspell: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -w $(GOFILES) - -.PHONY: tools -tools: - go install golang.org/x/lint/golint; \ - go install github.com/client9/misspell/cmd/misspell; diff --git a/vendor/github.com/gin-gonic/gin/README.md b/vendor/github.com/gin-gonic/gin/README.md deleted file mode 100644 index 998783a3..00000000 --- a/vendor/github.com/gin-gonic/gin/README.md +++ /dev/null @@ -1,2127 +0,0 @@ -# Gin Web Framework - - - -[![Build Status](https://travis-ci.org/gin-gonic/gin.svg)](https://travis-ci.org/gin-gonic/gin) -[![codecov](https://codecov.io/gh/gin-gonic/gin/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-gonic/gin) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-gonic/gin)](https://goreportcard.com/report/github.com/gin-gonic/gin) -[![GoDoc](https://godoc.org/github.com/gin-gonic/gin?status.svg)](https://godoc.org/github.com/gin-gonic/gin) -[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Sourcegraph](https://sourcegraph.com/github.com/gin-gonic/gin/-/badge.svg)](https://sourcegraph.com/github.com/gin-gonic/gin?badge) -[![Open Source Helpers](https://www.codetriage.com/gin-gonic/gin/badges/users.svg)](https://www.codetriage.com/gin-gonic/gin) -[![Release](https://img.shields.io/github/release/gin-gonic/gin.svg?style=flat-square)](https://github.com/gin-gonic/gin/releases) -[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/gin-gonic/gin)](https://www.tickgit.com/browse?repo=github.com/gin-gonic/gin) - -Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin. - - -## Contents - -- [Gin Web Framework](#gin-web-framework) - - [Contents](#contents) - - [Installation](#installation) - - [Quick start](#quick-start) - - [Benchmarks](#benchmarks) - - [Gin v1. stable](#gin-v1-stable) - - [Build with jsoniter](#build-with-jsoniter) - - [API Examples](#api-examples) - - [Using GET, POST, PUT, PATCH, DELETE and OPTIONS](#using-get-post-put-patch-delete-and-options) - - [Parameters in path](#parameters-in-path) - - [Querystring parameters](#querystring-parameters) - - [Multipart/Urlencoded Form](#multiparturlencoded-form) - - [Another example: query + post form](#another-example-query--post-form) - - [Map as querystring or postform parameters](#map-as-querystring-or-postform-parameters) - - [Upload files](#upload-files) - - [Single file](#single-file) - - [Multiple files](#multiple-files) - - [Grouping routes](#grouping-routes) - - [Blank Gin without middleware by default](#blank-gin-without-middleware-by-default) - - [Using middleware](#using-middleware) - - [How to write log file](#how-to-write-log-file) - - [Custom Log Format](#custom-log-format) - - [Controlling Log output coloring](#controlling-log-output-coloring) - - [Model binding and validation](#model-binding-and-validation) - - [Custom Validators](#custom-validators) - - [Only Bind Query String](#only-bind-query-string) - - [Bind Query String or Post Data](#bind-query-string-or-post-data) - - [Bind Uri](#bind-uri) - - [Bind Header](#bind-header) - - [Bind HTML checkboxes](#bind-html-checkboxes) - - [Multipart/Urlencoded binding](#multiparturlencoded-binding) - - [XML, JSON, YAML and ProtoBuf rendering](#xml-json-yaml-and-protobuf-rendering) - - [SecureJSON](#securejson) - - [JSONP](#jsonp) - - [AsciiJSON](#asciijson) - - [PureJSON](#purejson) - - [Serving static files](#serving-static-files) - - [Serving data from reader](#serving-data-from-reader) - - [HTML rendering](#html-rendering) - - [Custom Template renderer](#custom-template-renderer) - - [Custom Delimiters](#custom-delimiters) - - [Custom Template Funcs](#custom-template-funcs) - - [Multitemplate](#multitemplate) - - [Redirects](#redirects) - - [Custom Middleware](#custom-middleware) - - [Using BasicAuth() middleware](#using-basicauth-middleware) - - [Goroutines inside a middleware](#goroutines-inside-a-middleware) - - [Custom HTTP configuration](#custom-http-configuration) - - [Support Let's Encrypt](#support-lets-encrypt) - - [Run multiple service using Gin](#run-multiple-service-using-gin) - - [Graceful shutdown or restart](#graceful-shutdown-or-restart) - - [Build a single binary with templates](#build-a-single-binary-with-templates) - - [Bind form-data request with custom struct](#bind-form-data-request-with-custom-struct) - - [Try to bind body into different structs](#try-to-bind-body-into-different-structs) - - [http2 server push](#http2-server-push) - - [Define format for the log of routes](#define-format-for-the-log-of-routes) - - [Set and get a cookie](#set-and-get-a-cookie) - - [Testing](#testing) - - [Users](#users) - -## Installation - -To install Gin package, you need to install Go and set your Go workspace first. - -1. The first need [Go](https://golang.org/) installed (**version 1.11+ is required**), then you can use the below Go command to install Gin. - -```sh -$ go get -u github.com/gin-gonic/gin -``` - -2. Import it in your code: - -```go -import "github.com/gin-gonic/gin" -``` - -3. (Optional) Import `net/http`. This is required for example if using constants such as `http.StatusOK`. - -```go -import "net/http" -``` - -## Quick start - -```sh -# assume the following codes in example.go file -$ cat example.go -``` - -```go -package main - -import "github.com/gin-gonic/gin" - -func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.JSON(200, gin.H{ - "message": "pong", - }) - }) - r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") -} -``` - -``` -# run example.go and visit 0.0.0.0:8080/ping (for windows "localhost:8080/ping") on browser -$ go run example.go -``` - -## Benchmarks - -Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter) - -[See all benchmarks](/BENCHMARKS.md) - -Benchmark name | (1) | (2) | (3) | (4) ---------------------------------------------|-----------:|------------:|-----------:|---------: -**BenchmarkGin_GithubAll** | **30000** | **48375** | **0** | **0** -BenchmarkAce_GithubAll | 10000 | 134059 | 13792 | 167 -BenchmarkBear_GithubAll | 5000 | 534445 | 86448 | 943 -BenchmarkBeego_GithubAll | 3000 | 592444 | 74705 | 812 -BenchmarkBone_GithubAll | 200 | 6957308 | 698784 | 8453 -BenchmarkDenco_GithubAll | 10000 | 158819 | 20224 | 167 -BenchmarkEcho_GithubAll | 10000 | 154700 | 6496 | 203 -BenchmarkGocraftWeb_GithubAll | 3000 | 570806 | 131656 | 1686 -BenchmarkGoji_GithubAll | 2000 | 818034 | 56112 | 334 -BenchmarkGojiv2_GithubAll | 2000 | 1213973 | 274768 | 3712 -BenchmarkGoJsonRest_GithubAll | 2000 | 785796 | 134371 | 2737 -BenchmarkGoRestful_GithubAll | 300 | 5238188 | 689672 | 4519 -BenchmarkGorillaMux_GithubAll | 100 | 10257726 | 211840 | 2272 -BenchmarkHttpRouter_GithubAll | 20000 | 105414 | 13792 | 167 -BenchmarkHttpTreeMux_GithubAll | 10000 | 319934 | 65856 | 671 -BenchmarkKocha_GithubAll | 10000 | 209442 | 23304 | 843 -BenchmarkLARS_GithubAll | 20000 | 62565 | 0 | 0 -BenchmarkMacaron_GithubAll | 2000 | 1161270 | 204194 | 2000 -BenchmarkMartini_GithubAll | 200 | 9991713 | 226549 | 2325 -BenchmarkPat_GithubAll | 200 | 5590793 | 1499568 | 27435 -BenchmarkPossum_GithubAll | 10000 | 319768 | 84448 | 609 -BenchmarkR2router_GithubAll | 10000 | 305134 | 77328 | 979 -BenchmarkRivet_GithubAll | 10000 | 132134 | 16272 | 167 -BenchmarkTango_GithubAll | 3000 | 552754 | 63826 | 1618 -BenchmarkTigerTonic_GithubAll | 1000 | 1439483 | 239104 | 5374 -BenchmarkTraffic_GithubAll | 100 | 11383067 | 2659329 | 21848 -BenchmarkVulcan_GithubAll | 5000 | 394253 | 19894 | 609 - -- (1): Total Repetitions achieved in constant time, higher means more confident result -- (2): Single Repetition Duration (ns/op), lower is better -- (3): Heap Memory (B/op), lower is better -- (4): Average Allocations per Repetition (allocs/op), lower is better - -## Gin v1. stable - -- [x] Zero allocation router. -- [x] Still the fastest http router and framework. From routing to writing. -- [x] Complete suite of unit tests -- [x] Battle tested -- [x] API frozen, new releases will not break your code. - -## Build with [jsoniter](https://github.com/json-iterator/go) - -Gin uses `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags. - -```sh -$ go build -tags=jsoniter . -``` - -## API Examples - -You can find a number of ready-to-run examples at [Gin examples repository](https://github.com/gin-gonic/examples). - -### Using GET, POST, PUT, PATCH, DELETE and OPTIONS - -```go -func main() { - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/someGet", getting) - router.POST("/somePost", posting) - router.PUT("/somePut", putting) - router.DELETE("/someDelete", deleting) - router.PATCH("/somePatch", patching) - router.HEAD("/someHead", head) - router.OPTIONS("/someOptions", options) - - // By default it serves on :8080 unless a - // PORT environment variable was defined. - router.Run() - // router.Run(":3000") for a hard coded port -} -``` - -### Parameters in path - -```go -func main() { - router := gin.Default() - - // This handler will match /user/john but will not match /user/ or /user - router.GET("/user/:name", func(c *gin.Context) { - name := c.Param("name") - c.String(http.StatusOK, "Hello %s", name) - }) - - // However, this one will match /user/john/ and also /user/john/send - // If no other routers match /user/john, it will redirect to /user/john/ - router.GET("/user/:name/*action", func(c *gin.Context) { - name := c.Param("name") - action := c.Param("action") - message := name + " is " + action - c.String(http.StatusOK, message) - }) - - // For each matched request Context will hold the route definition - router.POST("/user/:name/*action", func(c *gin.Context) { - c.FullPath() == "/user/:name/*action" // true - }) - - router.Run(":8080") -} -``` - -### Querystring parameters - -```go -func main() { - router := gin.Default() - - // Query string parameters are parsed using the existing underlying request object. - // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe - router.GET("/welcome", func(c *gin.Context) { - firstname := c.DefaultQuery("firstname", "Guest") - lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname") - - c.String(http.StatusOK, "Hello %s %s", firstname, lastname) - }) - router.Run(":8080") -} -``` - -### Multipart/Urlencoded Form - -```go -func main() { - router := gin.Default() - - router.POST("/form_post", func(c *gin.Context) { - message := c.PostForm("message") - nick := c.DefaultPostForm("nick", "anonymous") - - c.JSON(200, gin.H{ - "status": "posted", - "message": message, - "nick": nick, - }) - }) - router.Run(":8080") -} -``` - -### Another example: query + post form - -``` -POST /post?id=1234&page=1 HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - -name=manu&message=this_is_great -``` - -```go -func main() { - router := gin.Default() - - router.POST("/post", func(c *gin.Context) { - - id := c.Query("id") - page := c.DefaultQuery("page", "0") - name := c.PostForm("name") - message := c.PostForm("message") - - fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message) - }) - router.Run(":8080") -} -``` - -``` -id: 1234; page: 1; name: manu; message: this_is_great -``` - -### Map as querystring or postform parameters - -``` -POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - -names[first]=thinkerou&names[second]=tianou -``` - -```go -func main() { - router := gin.Default() - - router.POST("/post", func(c *gin.Context) { - - ids := c.QueryMap("ids") - names := c.PostFormMap("names") - - fmt.Printf("ids: %v; names: %v", ids, names) - }) - router.Run(":8080") -} -``` - -``` -ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou] -``` - -### Upload files - -#### Single file - -References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single). - -`file.Filename` **SHOULD NOT** be trusted. See [`Content-Disposition` on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Directives) and [#1693](https://github.com/gin-gonic/gin/issues/1693) - -> The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done. - -```go -func main() { - router := gin.Default() - // Set a lower memory limit for multipart forms (default is 32 MiB) - // router.MaxMultipartMemory = 8 << 20 // 8 MiB - router.POST("/upload", func(c *gin.Context) { - // single file - file, _ := c.FormFile("file") - log.Println(file.Filename) - - // Upload the file to specific dst. - // c.SaveUploadedFile(file, dst) - - c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) - }) - router.Run(":8080") -} -``` - -How to `curl`: - -```bash -curl -X POST http://localhost:8080/upload \ - -F "file=@/Users/appleboy/test.zip" \ - -H "Content-Type: multipart/form-data" -``` - -#### Multiple files - -See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). - -```go -func main() { - router := gin.Default() - // Set a lower memory limit for multipart forms (default is 32 MiB) - // router.MaxMultipartMemory = 8 << 20 // 8 MiB - router.POST("/upload", func(c *gin.Context) { - // Multipart form - form, _ := c.MultipartForm() - files := form.File["upload[]"] - - for _, file := range files { - log.Println(file.Filename) - - // Upload the file to specific dst. - // c.SaveUploadedFile(file, dst) - } - c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) - }) - router.Run(":8080") -} -``` - -How to `curl`: - -```bash -curl -X POST http://localhost:8080/upload \ - -F "upload[]=@/Users/appleboy/test1.zip" \ - -F "upload[]=@/Users/appleboy/test2.zip" \ - -H "Content-Type: multipart/form-data" -``` - -### Grouping routes - -```go -func main() { - router := gin.Default() - - // Simple group: v1 - v1 := router.Group("/v1") - { - v1.POST("/login", loginEndpoint) - v1.POST("/submit", submitEndpoint) - v1.POST("/read", readEndpoint) - } - - // Simple group: v2 - v2 := router.Group("/v2") - { - v2.POST("/login", loginEndpoint) - v2.POST("/submit", submitEndpoint) - v2.POST("/read", readEndpoint) - } - - router.Run(":8080") -} -``` - -### Blank Gin without middleware by default - -Use - -```go -r := gin.New() -``` - -instead of - -```go -// Default With the Logger and Recovery middleware already attached -r := gin.Default() -``` - - -### Using middleware -```go -func main() { - // Creates a router without any middleware by default - r := gin.New() - - // Global middleware - // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. - // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) - - // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) - - // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) - - // Authorization group - // authorized := r.Group("/", AuthRequired()) - // exactly the same as: - authorized := r.Group("/") - // per group middleware! in this case we use the custom created - // AuthRequired() middleware just in the "authorized" group. - authorized.Use(AuthRequired()) - { - authorized.POST("/login", loginEndpoint) - authorized.POST("/submit", submitEndpoint) - authorized.POST("/read", readEndpoint) - - // nested group - testing := authorized.Group("testing") - testing.GET("/analytics", analyticsEndpoint) - } - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### How to write log file -```go -func main() { - // Disable Console Color, you don't need console color when writing the logs to file. - gin.DisableConsoleColor() - - // Logging to a file. - f, _ := os.Create("gin.log") - gin.DefaultWriter = io.MultiWriter(f) - - // Use the following code if you need to write the logs to file and console at the same time. - // gin.DefaultWriter = io.MultiWriter(f, os.Stdout) - - router := gin.Default() - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - -    router.Run(":8080") -} -``` - -### Custom Log Format -```go -func main() { - router := gin.New() - - // LoggerWithFormatter middleware will write the logs to gin.DefaultWriter - // By default gin.DefaultWriter = os.Stdout - router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { - - // your custom format - return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n", - param.ClientIP, - param.TimeStamp.Format(time.RFC1123), - param.Method, - param.Path, - param.Request.Proto, - param.StatusCode, - param.Latency, - param.Request.UserAgent(), - param.ErrorMessage, - ) - })) - router.Use(gin.Recovery()) - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -**Sample Output** -``` -::1 - [Fri, 07 Dec 2018 17:04:38 JST] "GET /ping HTTP/1.1 200 122.767µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" " -``` - -### Controlling Log output coloring - -By default, logs output on console should be colorized depending on the detected TTY. - -Never colorize logs: - -```go -func main() { - // Disable log's color - gin.DisableConsoleColor() - - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -Always colorize logs: - -```go -func main() { - // Force log's color - gin.ForceConsoleColor() - - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -### Model binding and validation - -To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). - -Gin uses [**go-playground/validator/v10**](https://github.com/go-playground/validator) for validation. Check the full docs on tags usage [here](https://godoc.org/github.com/go-playground/validator#hdr-Baked_In_Validators_and_Tags). - -Note that you need to set the corresponding binding tag on all fields you want to bind. For example, when binding from JSON, set `json:"fieldname"`. - -Also, Gin provides two sets of methods for binding: -- **Type** - Must bind - - **Methods** - `Bind`, `BindJSON`, `BindXML`, `BindQuery`, `BindYAML`, `BindHeader` - - **Behavior** - These methods use `MustBindWith` under the hood. If there is a binding error, the request is aborted with `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. This sets the response status code to 400 and the `Content-Type` header is set to `text/plain; charset=utf-8`. Note that if you try to set the response code after this, it will result in a warning `[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422`. If you wish to have greater control over the behavior, consider using the `ShouldBind` equivalent method. -- **Type** - Should bind - - **Methods** - `ShouldBind`, `ShouldBindJSON`, `ShouldBindXML`, `ShouldBindQuery`, `ShouldBindYAML`, `ShouldBindHeader` - - **Behavior** - These methods use `ShouldBindWith` under the hood. If there is a binding error, the error is returned and it is the developer's responsibility to handle the request and error appropriately. - -When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use `MustBindWith` or `ShouldBindWith`. - -You can also specify that specific fields are required. If a field is decorated with `binding:"required"` and has a empty value when binding, an error will be returned. - -```go -// Binding from JSON -type Login struct { - User string `form:"user" json:"user" xml:"user" binding:"required"` - Password string `form:"password" json:"password" xml:"password" binding:"required"` -} - -func main() { - router := gin.Default() - - // Example for binding JSON ({"user": "manu", "password": "123"}) - router.POST("/loginJSON", func(c *gin.Context) { - var json Login - if err := c.ShouldBindJSON(&json); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if json.User != "manu" || json.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Example for binding XML ( - // - // - // user - // 123 - // ) - router.POST("/loginXML", func(c *gin.Context) { - var xml Login - if err := c.ShouldBindXML(&xml); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if xml.User != "manu" || xml.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Example for binding a HTML form (user=manu&password=123) - router.POST("/loginForm", func(c *gin.Context) { - var form Login - // This will infer what binder to use depending on the content-type header. - if err := c.ShouldBind(&form); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if form.User != "manu" || form.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Listen and serve on 0.0.0.0:8080 - router.Run(":8080") -} -``` - -**Sample request** -```shell -$ curl -v -X POST \ - http://localhost:8080/loginJSON \ - -H 'content-type: application/json' \ - -d '{ "user": "manu" }' -> POST /loginJSON HTTP/1.1 -> Host: localhost:8080 -> User-Agent: curl/7.51.0 -> Accept: */* -> content-type: application/json -> Content-Length: 18 -> -* upload completely sent off: 18 out of 18 bytes -< HTTP/1.1 400 Bad Request -< Content-Type: application/json; charset=utf-8 -< Date: Fri, 04 Aug 2017 03:51:31 GMT -< Content-Length: 100 -< -{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"} -``` - -**Skip validate** - -When running the above example using the above the `curl` command, it returns error. Because the example use `binding:"required"` for `Password`. If use `binding:"-"` for `Password`, then it will not return error when running the above example again. - -### Custom Validators - -It is also possible to register custom validators. See the [example code](https://github.com/gin-gonic/examples/tree/master/custom-validation/server.go). - -```go -package main - -import ( - "net/http" - "time" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "gopkg.in/go-playground/validator.v10" -) - -// Booking contains binded and validated data. -type Booking struct { - CheckIn time.Time `form:"check_in" binding:"required" time_format:"2006-01-02"` - CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"` -} - -var bookableDate validator.Func = func(fl validator.FieldLevel) bool { - date, ok := fl.Field().Interface().(time.Time) - if ok { - today := time.Now() - if today.After(date) { - return false - } - } - return true -} - -func main() { - route := gin.Default() - - if v, ok := binding.Validator.Engine().(*validator.Validate); ok { - v.RegisterValidation("bookabledate", bookableDate) - } - - route.GET("/bookable", getBookable) - route.Run(":8085") -} - -func getBookable(c *gin.Context) { - var b Booking - if err := c.ShouldBindWith(&b, binding.Query); err == nil { - c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"}) - } else { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - } -} -``` - -```console -$ curl "localhost:8085/bookable?check_in=2018-04-16&check_out=2018-04-17" -{"message":"Booking dates are valid!"} - -$ curl "localhost:8085/bookable?check_in=2018-03-10&check_out=2018-03-09" -{"error":"Key: 'Booking.CheckOut' Error:Field validation for 'CheckOut' failed on the 'gtfield' tag"} -``` - -[Struct level validations](https://github.com/go-playground/validator/releases/tag/v8.7) can also be registered this way. -See the [struct-lvl-validation example](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations) to learn more. - -### Only Bind Query String - -`ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/gin" -) - -type Person struct { - Name string `form:"name"` - Address string `form:"address"` -} - -func main() { - route := gin.Default() - route.Any("/testing", startPage) - route.Run(":8085") -} - -func startPage(c *gin.Context) { - var person Person - if c.ShouldBindQuery(&person) == nil { - log.Println("====== Only Bind By Query String ======") - log.Println(person.Name) - log.Println(person.Address) - } - c.String(200, "Success") -} - -``` - -### Bind Query String or Post Data - -See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). - -```go -package main - -import ( - "log" - "time" - - "github.com/gin-gonic/gin" -) - -type Person struct { - Name string `form:"name"` - Address string `form:"address"` - Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"` - CreateTime time.Time `form:"createTime" time_format:"unixNano"` - UnixTime time.Time `form:"unixTime" time_format:"unix"` -} - -func main() { - route := gin.Default() - route.GET("/testing", startPage) - route.Run(":8085") -} - -func startPage(c *gin.Context) { - var person Person - // If `GET`, only `Form` binding engine (`query`) used. - // If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`). - // See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48 - if c.ShouldBind(&person) == nil { - log.Println(person.Name) - log.Println(person.Address) - log.Println(person.Birthday) - log.Println(person.CreateTime) - log.Println(person.UnixTime) - } - - c.String(200, "Success") -} -``` - -Test it with: -```sh -$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15&createTime=1562400033000000123&unixTime=1562400033" -``` - -### Bind Uri - -See the [detail information](https://github.com/gin-gonic/gin/issues/846). - -```go -package main - -import "github.com/gin-gonic/gin" - -type Person struct { - ID string `uri:"id" binding:"required,uuid"` - Name string `uri:"name" binding:"required"` -} - -func main() { - route := gin.Default() - route.GET("/:name/:id", func(c *gin.Context) { - var person Person - if err := c.ShouldBindUri(&person); err != nil { - c.JSON(400, gin.H{"msg": err}) - return - } - c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID}) - }) - route.Run(":8088") -} -``` - -Test it with: -```sh -$ curl -v localhost:8088/thinkerou/987fbc97-4bed-5078-9f07-9141ba07c9f3 -$ curl -v localhost:8088/thinkerou/not-uuid -``` - -### Bind Header - -```go -package main - -import ( - "fmt" - "github.com/gin-gonic/gin" -) - -type testHeader struct { - Rate int `header:"Rate"` - Domain string `header:"Domain"` -} - -func main() { - r := gin.Default() - r.GET("/", func(c *gin.Context) { - h := testHeader{} - - if err := c.ShouldBindHeader(&h); err != nil { - c.JSON(200, err) - } - - fmt.Printf("%#v\n", h) - c.JSON(200, gin.H{"Rate": h.Rate, "Domain": h.Domain}) - }) - - r.Run() - -// client -// curl -H "rate:300" -H "domain:music" 127.0.0.1:8080/ -// output -// {"Domain":"music","Rate":300} -} -``` - -### Bind HTML checkboxes - -See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) - -main.go - -```go -... - -type myForm struct { - Colors []string `form:"colors[]"` -} - -... - -func formHandler(c *gin.Context) { - var fakeForm myForm - c.ShouldBind(&fakeForm) - c.JSON(200, gin.H{"color": fakeForm.Colors}) -} - -... - -``` - -form.html - -```html -
-

Check some colors

- - - - - - - -
-``` - -result: - -``` -{"color":["red","green","blue"]} -``` - -### Multipart/Urlencoded binding - -```go -type ProfileForm struct { - Name string `form:"name" binding:"required"` - Avatar *multipart.FileHeader `form:"avatar" binding:"required"` - - // or for multiple files - // Avatars []*multipart.FileHeader `form:"avatar" binding:"required"` -} - -func main() { - router := gin.Default() - router.POST("/profile", func(c *gin.Context) { - // you can bind multipart form with explicit binding declaration: - // c.ShouldBindWith(&form, binding.Form) - // or you can simply use autobinding with ShouldBind method: - var form ProfileForm - // in this case proper binding will be automatically selected - if err := c.ShouldBind(&form); err != nil { - c.String(http.StatusBadRequest, "bad request") - return - } - - err := c.SaveUploadedFile(form.Avatar, form.Avatar.Filename) - if err != nil { - c.String(http.StatusInternalServerError, "unknown error") - return - } - - // db.Save(&form) - - c.String(http.StatusOK, "ok") - }) - router.Run(":8080") -} -``` - -Test it with: -```sh -$ curl -X POST -v --form name=user --form "avatar=@./avatar.png" http://localhost:8080/profile -``` - -### XML, JSON, YAML and ProtoBuf rendering - -```go -func main() { - r := gin.Default() - - // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/moreJSON", func(c *gin.Context) { - // You also can use a struct - var msg struct { - Name string `json:"user"` - Message string - Number int - } - msg.Name = "Lena" - msg.Message = "hey" - msg.Number = 123 - // Note that msg.Name becomes "user" in the JSON - // Will output : {"user": "Lena", "Message": "hey", "Number": 123} - c.JSON(http.StatusOK, msg) - }) - - r.GET("/someXML", func(c *gin.Context) { - c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/someYAML", func(c *gin.Context) { - c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/someProtoBuf", func(c *gin.Context) { - reps := []int64{int64(1), int64(2)} - label := "test" - // The specific definition of protobuf is written in the testdata/protoexample file. - data := &protoexample.Test{ - Label: &label, - Reps: reps, - } - // Note that data becomes binary data in the response - // Will output protoexample.Test protobuf serialized data - c.ProtoBuf(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### SecureJSON - -Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. - -```go -func main() { - r := gin.Default() - - // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") - - r.GET("/someJSON", func(c *gin.Context) { - names := []string{"lena", "austin", "foo"} - - // Will output : while(1);["lena","austin","foo"] - c.SecureJSON(http.StatusOK, names) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` -#### JSONP - -Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. - -```go -func main() { - r := gin.Default() - - r.GET("/JSONP", func(c *gin.Context) { - data := gin.H{ - "foo": "bar", - } - - //callback is x - // Will output : x({\"foo\":\"bar\"}) - c.JSONP(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") - - // client - // curl http://127.0.0.1:8080/JSONP?callback=x -} -``` - -#### AsciiJSON - -Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII characters. - -```go -func main() { - r := gin.Default() - - r.GET("/someJSON", func(c *gin.Context) { - data := gin.H{ - "lang": "GO语言", - "tag": "
", - } - - // will output : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"} - c.AsciiJSON(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### PureJSON - -Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. -This feature is unavailable in Go 1.6 and lower. - -```go -func main() { - r := gin.Default() - - // Serves unicode entities - r.GET("/json", func(c *gin.Context) { - c.JSON(200, gin.H{ - "html": "Hello, world!", - }) - }) - - // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { - c.PureJSON(200, gin.H{ - "html": "Hello, world!", - }) - }) - - // listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Serving static files - -```go -func main() { - router := gin.Default() - router.Static("/assets", "./assets") - router.StaticFS("/more_static", http.Dir("my_file_system")) - router.StaticFile("/favicon.ico", "./resources/favicon.ico") - - // Listen and serve on 0.0.0.0:8080 - router.Run(":8080") -} -``` - -### Serving data from file - -```go -func main() { - router := gin.Default() - - router.GET("/local/file", func(c *gin.Context) { - c.File("local/file.go") - }) - - var fs http.FileSystem = // ... - router.GET("/fs/file", func(c *gin.Context) { - c.FileFromFS("fs/file.go", fs) - }) -} - -``` - -### Serving data from reader - -```go -func main() { - router := gin.Default() - router.GET("/someDataFromReader", func(c *gin.Context) { - response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png") - if err != nil || response.StatusCode != http.StatusOK { - c.Status(http.StatusServiceUnavailable) - return - } - - reader := response.Body - contentLength := response.ContentLength - contentType := response.Header.Get("Content-Type") - - extraHeaders := map[string]string{ - "Content-Disposition": `attachment; filename="gopher.png"`, - } - - c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) - }) - router.Run(":8080") -} -``` - -### HTML rendering - -Using LoadHTMLGlob() or LoadHTMLFiles() - -```go -func main() { - router := gin.Default() - router.LoadHTMLGlob("templates/*") - //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html") - router.GET("/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "index.tmpl", gin.H{ - "title": "Main website", - }) - }) - router.Run(":8080") -} -``` - -templates/index.tmpl - -```html - -

- {{ .title }} -

- -``` - -Using templates with same name in different directories - -```go -func main() { - router := gin.Default() - router.LoadHTMLGlob("templates/**/*") - router.GET("/posts/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ - "title": "Posts", - }) - }) - router.GET("/users/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ - "title": "Users", - }) - }) - router.Run(":8080") -} -``` - -templates/posts/index.tmpl - -```html -{{ define "posts/index.tmpl" }} -

- {{ .title }} -

-

Using posts/index.tmpl

- -{{ end }} -``` - -templates/users/index.tmpl - -```html -{{ define "users/index.tmpl" }} -

- {{ .title }} -

-

Using users/index.tmpl

- -{{ end }} -``` - -#### Custom Template renderer - -You can also use your own html template render - -```go -import "html/template" - -func main() { - router := gin.Default() - html := template.Must(template.ParseFiles("file1", "file2")) - router.SetHTMLTemplate(html) - router.Run(":8080") -} -``` - -#### Custom Delimiters - -You may use custom delims - -```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") -``` - -#### Custom Template Funcs - -See the detail [example code](https://github.com/gin-gonic/examples/tree/master/template). - -main.go - -```go -import ( - "fmt" - "html/template" - "net/http" - "time" - - "github.com/gin-gonic/gin" -) - -func formatAsDate(t time.Time) string { - year, month, day := t.Date() - return fmt.Sprintf("%d%02d/%02d", year, month, day) -} - -func main() { - router := gin.Default() - router.Delims("{[{", "}]}") - router.SetFuncMap(template.FuncMap{ - "formatAsDate": formatAsDate, - }) - router.LoadHTMLFiles("./testdata/template/raw.tmpl") - - router.GET("/raw", func(c *gin.Context) { - c.HTML(http.StatusOK, "raw.tmpl", gin.H{ - "now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), - }) - }) - - router.Run(":8080") -} - -``` - -raw.tmpl - -```html -Date: {[{.now | formatAsDate}]} -``` - -Result: -``` -Date: 2017/07/01 -``` - -### Multitemplate - -Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. - -### Redirects - -Issuing a HTTP redirect is easy. Both internal and external locations are supported. - -```go -r.GET("/test", func(c *gin.Context) { - c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") -}) -``` - - -Issuing a Router redirect, use `HandleContext` like below. - -``` go -r.GET("/test", func(c *gin.Context) { - c.Request.URL.Path = "/test2" - r.HandleContext(c) -}) -r.GET("/test2", func(c *gin.Context) { - c.JSON(200, gin.H{"hello": "world"}) -}) -``` - - -### Custom Middleware - -```go -func Logger() gin.HandlerFunc { - return func(c *gin.Context) { - t := time.Now() - - // Set example variable - c.Set("example", "12345") - - // before request - - c.Next() - - // after request - latency := time.Since(t) - log.Print(latency) - - // access the status we are sending - status := c.Writer.Status() - log.Println(status) - } -} - -func main() { - r := gin.New() - r.Use(Logger()) - - r.GET("/test", func(c *gin.Context) { - example := c.MustGet("example").(string) - - // it would print: "12345" - log.Println(example) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Using BasicAuth() middleware - -```go -// simulate some private data -var secrets = gin.H{ - "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, - "austin": gin.H{"email": "austin@example.com", "phone": "666"}, - "lena": gin.H{"email": "lena@guapa.com", "phone": "523443"}, -} - -func main() { - r := gin.Default() - - // Group using gin.BasicAuth() middleware - // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ - "foo": "bar", - "austin": "1234", - "lena": "hello2", - "manu": "4321", - })) - - // /admin/secrets endpoint - // hit "localhost:8080/admin/secrets - authorized.GET("/secrets", func(c *gin.Context) { - // get user, it was set by the BasicAuth middleware - user := c.MustGet(gin.AuthUserKey).(string) - if secret, ok := secrets[user]; ok { - c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret}) - } else { - c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("}) - } - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Goroutines inside a middleware - -When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. - -```go -func main() { - r := gin.Default() - - r.GET("/long_async", func(c *gin.Context) { - // create copy to be used inside the goroutine - cCp := c.Copy() - go func() { - // simulate a long task with time.Sleep(). 5 seconds - time.Sleep(5 * time.Second) - - // note that you are using the copied context "cCp", IMPORTANT - log.Println("Done! in path " + cCp.Request.URL.Path) - }() - }) - - r.GET("/long_sync", func(c *gin.Context) { - // simulate a long task with time.Sleep(). 5 seconds - time.Sleep(5 * time.Second) - - // since we are NOT using a goroutine, we do not have to copy the context - log.Println("Done! in path " + c.Request.URL.Path) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Custom HTTP configuration - -Use `http.ListenAndServe()` directly, like this: - -```go -func main() { - router := gin.Default() - http.ListenAndServe(":8080", router) -} -``` -or - -```go -func main() { - router := gin.Default() - - s := &http.Server{ - Addr: ":8080", - Handler: router, - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, - MaxHeaderBytes: 1 << 20, - } - s.ListenAndServe() -} -``` - -### Support Let's Encrypt - -example for 1-line LetsEncrypt HTTPS servers. - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/autotls" - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - - // Ping handler - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - log.Fatal(autotls.Run(r, "example1.com", "example2.com")) -} -``` - -example for custom autocert manager. - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/autotls" - "github.com/gin-gonic/gin" - "golang.org/x/crypto/acme/autocert" -) - -func main() { - r := gin.Default() - - // Ping handler - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - m := autocert.Manager{ - Prompt: autocert.AcceptTOS, - HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"), - Cache: autocert.DirCache("/var/www/.cache"), - } - - log.Fatal(autotls.RunWithManager(r, &m)) -} -``` - -### Run multiple service using Gin - -See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: - -```go -package main - -import ( - "log" - "net/http" - "time" - - "github.com/gin-gonic/gin" - "golang.org/x/sync/errgroup" -) - -var ( - g errgroup.Group -) - -func router01() http.Handler { - e := gin.New() - e.Use(gin.Recovery()) - e.GET("/", func(c *gin.Context) { - c.JSON( - http.StatusOK, - gin.H{ - "code": http.StatusOK, - "error": "Welcome server 01", - }, - ) - }) - - return e -} - -func router02() http.Handler { - e := gin.New() - e.Use(gin.Recovery()) - e.GET("/", func(c *gin.Context) { - c.JSON( - http.StatusOK, - gin.H{ - "code": http.StatusOK, - "error": "Welcome server 02", - }, - ) - }) - - return e -} - -func main() { - server01 := &http.Server{ - Addr: ":8080", - Handler: router01(), - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - } - - server02 := &http.Server{ - Addr: ":8081", - Handler: router02(), - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - } - - g.Go(func() error { - err := server01.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - log.Fatal(err) - } - return err - }) - - g.Go(func() error { - err := server02.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - log.Fatal(err) - } - return err - }) - - if err := g.Wait(); err != nil { - log.Fatal(err) - } -} -``` - -### Graceful shutdown or restart - -There are a few approaches you can use to perform a graceful shutdown or restart. You can make use of third-party packages specifically built for that, or you can manually do the same with the functions and methods from the built-in packages. - -#### Third-party packages - -We can use [fvbock/endless](https://github.com/fvbock/endless) to replace the default `ListenAndServe`. Refer to issue [#296](https://github.com/gin-gonic/gin/issues/296) for more details. - -```go -router := gin.Default() -router.GET("/", handler) -// [...] -endless.ListenAndServe(":4242", router) -``` - -Alternatives: - -* [manners](https://github.com/braintree/manners): A polite Go HTTP server that shuts down gracefully. -* [graceful](https://github.com/tylerb/graceful): Graceful is a Go package enabling graceful shutdown of an http.Handler server. -* [grace](https://github.com/facebookgo/grace): Graceful restart & zero downtime deploy for Go servers. - -#### Manually - -In case you are using Go 1.8 or a later version, you may not need to use those libraries. Consider using `http.Server`'s built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. The example below describes its usage, and we've got more examples using gin [here](https://github.com/gin-gonic/examples/tree/master/graceful-shutdown). - -```go -// +build go1.8 - -package main - -import ( - "context" - "log" - "net/http" - "os" - "os/signal" - "syscall" - "time" - - "github.com/gin-gonic/gin" -) - -func main() { - router := gin.Default() - router.GET("/", func(c *gin.Context) { - time.Sleep(5 * time.Second) - c.String(http.StatusOK, "Welcome Gin Server") - }) - - srv := &http.Server{ - Addr: ":8080", - Handler: router, - } - - // Initializing the server in a goroutine so that - // it won't block the graceful shutdown handling below - go func() { - if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { - log.Fatalf("listen: %s\n", err) - } - }() - - // Wait for interrupt signal to gracefully shutdown the server with - // a timeout of 5 seconds. - quit := make(chan os.Signal) - // kill (no param) default send syscall.SIGTERM - // kill -2 is syscall.SIGINT - // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it - signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) - <-quit - log.Println("Shuting down server...") - - // The context is used to inform the server it has 5 seconds to finish - // the request it is currently handling - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := srv.Shutdown(ctx); err != nil { - log.Fatal("Server forced to shutdown:", err) - } - - log.Println("Server exiting") -} -``` - -### Build a single binary with templates - -You can build a server into a single binary containing templates by using [go-assets][]. - -[go-assets]: https://github.com/jessevdk/go-assets - -```go -func main() { - r := gin.New() - - t, err := loadTemplate() - if err != nil { - panic(err) - } - r.SetHTMLTemplate(t) - - r.GET("/", func(c *gin.Context) { - c.HTML(http.StatusOK, "/html/index.tmpl",nil) - }) - r.Run(":8080") -} - -// loadTemplate loads templates embedded by go-assets-builder -func loadTemplate() (*template.Template, error) { - t := template.New("") - for name, file := range Assets.Files { - defer file.Close() - if file.IsDir() || !strings.HasSuffix(name, ".tmpl") { - continue - } - h, err := ioutil.ReadAll(file) - if err != nil { - return nil, err - } - t, err = t.New(name).Parse(string(h)) - if err != nil { - return nil, err - } - } - return t, nil -} -``` - -See a complete example in the `https://github.com/gin-gonic/examples/tree/master/assets-in-binary` directory. - -### Bind form-data request with custom struct - -The follow example using custom struct: - -```go -type StructA struct { - FieldA string `form:"field_a"` -} - -type StructB struct { - NestedStruct StructA - FieldB string `form:"field_b"` -} - -type StructC struct { - NestedStructPointer *StructA - FieldC string `form:"field_c"` -} - -type StructD struct { - NestedAnonyStruct struct { - FieldX string `form:"field_x"` - } - FieldD string `form:"field_d"` -} - -func GetDataB(c *gin.Context) { - var b StructB - c.Bind(&b) - c.JSON(200, gin.H{ - "a": b.NestedStruct, - "b": b.FieldB, - }) -} - -func GetDataC(c *gin.Context) { - var b StructC - c.Bind(&b) - c.JSON(200, gin.H{ - "a": b.NestedStructPointer, - "c": b.FieldC, - }) -} - -func GetDataD(c *gin.Context) { - var b StructD - c.Bind(&b) - c.JSON(200, gin.H{ - "x": b.NestedAnonyStruct, - "d": b.FieldD, - }) -} - -func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) - - r.Run() -} -``` - -Using the command `curl` command result: - -``` -$ curl "http://localhost:8080/getb?field_a=hello&field_b=world" -{"a":{"FieldA":"hello"},"b":"world"} -$ curl "http://localhost:8080/getc?field_a=hello&field_c=world" -{"a":{"FieldA":"hello"},"c":"world"} -$ curl "http://localhost:8080/getd?field_x=hello&field_d=world" -{"d":"world","x":{"FieldX":"hello"}} -``` - -### Try to bind body into different structs - -The normal methods for binding request body consumes `c.Request.Body` and they -cannot be called multiple times. - -```go -type formA struct { - Foo string `json:"foo" xml:"foo" binding:"required"` -} - -type formB struct { - Bar string `json:"bar" xml:"bar" binding:"required"` -} - -func SomeHandler(c *gin.Context) { - objA := formA{} - objB := formB{} - // This c.ShouldBind consumes c.Request.Body and it cannot be reused. - if errA := c.ShouldBind(&objA); errA == nil { - c.String(http.StatusOK, `the body should be formA`) - // Always an error is occurred by this because c.Request.Body is EOF now. - } else if errB := c.ShouldBind(&objB); errB == nil { - c.String(http.StatusOK, `the body should be formB`) - } else { - ... - } -} -``` - -For this, you can use `c.ShouldBindBodyWith`. - -```go -func SomeHandler(c *gin.Context) { - objA := formA{} - objB := formB{} - // This reads c.Request.Body and stores the result into the context. - if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil { - c.String(http.StatusOK, `the body should be formA`) - // At this time, it reuses body stored in the context. - } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil { - c.String(http.StatusOK, `the body should be formB JSON`) - // And it can accepts other formats - } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil { - c.String(http.StatusOK, `the body should be formB XML`) - } else { - ... - } -} -``` - -* `c.ShouldBindBodyWith` stores body into the context before binding. This has -a slight impact to performance, so you should not use this method if you are -enough to call binding at once. -* This feature is only needed for some formats -- `JSON`, `XML`, `MsgPack`, -`ProtoBuf`. For other formats, `Query`, `Form`, `FormPost`, `FormMultipart`, -can be called by `c.ShouldBind()` multiple times without any damage to -performance (See [#1341](https://github.com/gin-gonic/gin/pull/1341)). - -### http2 server push - -http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. - -```go -package main - -import ( - "html/template" - "log" - - "github.com/gin-gonic/gin" -) - -var html = template.Must(template.New("https").Parse(` - - - Https Test - - - -

Welcome, Ginner!

- - -`)) - -func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) - - r.GET("/", func(c *gin.Context) { - if pusher := c.Writer.Pusher(); pusher != nil { - // use pusher.Push() to do server push - if err := pusher.Push("/assets/app.js", nil); err != nil { - log.Printf("Failed to push: %v", err) - } - } - c.HTML(200, "https", gin.H{ - "status": "success", - }) - }) - - // Listen and Server in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") -} -``` - -### Define format for the log of routes - -The default log of routes is: -``` -[GIN-debug] POST /foo --> main.main.func1 (3 handlers) -[GIN-debug] GET /bar --> main.main.func2 (3 handlers) -[GIN-debug] GET /status --> main.main.func3 (3 handlers) -``` - -If you want to log this information in given format (e.g. JSON, key values or something else), then you can define this format with `gin.DebugPrintRouteFunc`. -In the example below, we log all routes with standard log package but you can use another log tools that suits of your needs. -```go -import ( - "log" - "net/http" - - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { - log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) - } - - r.POST("/foo", func(c *gin.Context) { - c.JSON(http.StatusOK, "foo") - }) - - r.GET("/bar", func(c *gin.Context) { - c.JSON(http.StatusOK, "bar") - }) - - r.GET("/status", func(c *gin.Context) { - c.JSON(http.StatusOK, "ok") - }) - - // Listen and Server in http://0.0.0.0:8080 - r.Run() -} -``` - -### Set and get a cookie - -```go -import ( - "fmt" - - "github.com/gin-gonic/gin" -) - -func main() { - - router := gin.Default() - - router.GET("/cookie", func(c *gin.Context) { - - cookie, err := c.Cookie("gin_cookie") - - if err != nil { - cookie = "NotSet" - c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", http.SameSiteLaxMode, false, true) - } - - fmt.Printf("Cookie value: %s \n", cookie) - }) - - router.Run() -} -``` - - -## Testing - -The `net/http/httptest` package is preferable way for HTTP testing. - -```go -package main - -func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - return r -} - -func main() { - r := setupRouter() - r.Run(":8080") -} -``` - -Test for code example above: - -```go -package main - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestPingRoute(t *testing.T) { - router := setupRouter() - - w := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "/ping", nil) - router.ServeHTTP(w, req) - - assert.Equal(t, 200, w.Code) - assert.Equal(t, "pong", w.Body.String()) -} -``` - -## Users - -Awesome project lists using [Gin](https://github.com/gin-gonic/gin) web framework. - -* [gorush](https://github.com/appleboy/gorush): A push notification server written in Go. -* [fnproject](https://github.com/fnproject/fn): The container native, cloud agnostic serverless platform. -* [photoprism](https://github.com/photoprism/photoprism): Personal photo management powered by Go and Google TensorFlow. -* [krakend](https://github.com/devopsfaith/krakend): Ultra performant API Gateway with middlewares. -* [picfit](https://github.com/thoas/picfit): An image resizing server written in Go. -* [brigade](https://github.com/brigadecore/brigade): Event-based Scripting for Kubernetes. -* [dkron](https://github.com/distribworks/dkron): Distributed, fault tolerant job scheduling system. diff --git a/vendor/github.com/gin-gonic/gin/auth.go b/vendor/github.com/gin-gonic/gin/auth.go deleted file mode 100644 index 9e5d4cf6..00000000 --- a/vendor/github.com/gin-gonic/gin/auth.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "encoding/base64" - "net/http" - "strconv" - - "github.com/gin-gonic/gin/internal/bytesconv" -) - -// AuthUserKey is the cookie name for user credential in basic auth. -const AuthUserKey = "user" - -// Accounts defines a key/value for user/pass list of authorized logins. -type Accounts map[string]string - -type authPair struct { - value string - user string -} - -type authPairs []authPair - -func (a authPairs) searchCredential(authValue string) (string, bool) { - if authValue == "" { - return "", false - } - for _, pair := range a { - if pair.value == authValue { - return pair.user, true - } - } - return "", false -} - -// BasicAuthForRealm returns a Basic HTTP Authorization middleware. It takes as arguments a map[string]string where -// the key is the user name and the value is the password, as well as the name of the Realm. -// If the realm is empty, "Authorization Required" will be used by default. -// (see http://tools.ietf.org/html/rfc2617#section-1.2) -func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc { - if realm == "" { - realm = "Authorization Required" - } - realm = "Basic realm=" + strconv.Quote(realm) - pairs := processAccounts(accounts) - return func(c *Context) { - // Search user in the slice of allowed credentials - user, found := pairs.searchCredential(c.requestHeader("Authorization")) - if !found { - // Credentials doesn't match, we return 401 and abort handlers chain. - c.Header("WWW-Authenticate", realm) - c.AbortWithStatus(http.StatusUnauthorized) - return - } - - // The user credentials was found, set user's id to key AuthUserKey in this context, the user's id can be read later using - // c.MustGet(gin.AuthUserKey). - c.Set(AuthUserKey, user) - } -} - -// BasicAuth returns a Basic HTTP Authorization middleware. It takes as argument a map[string]string where -// the key is the user name and the value is the password. -func BasicAuth(accounts Accounts) HandlerFunc { - return BasicAuthForRealm(accounts, "") -} - -func processAccounts(accounts Accounts) authPairs { - assert1(len(accounts) > 0, "Empty list of authorized credentials") - pairs := make(authPairs, 0, len(accounts)) - for user, password := range accounts { - assert1(user != "", "User can not be empty") - value := authorizationHeader(user, password) - pairs = append(pairs, authPair{ - value: value, - user: user, - }) - } - return pairs -} - -func authorizationHeader(user, password string) string { - base := user + ":" + password - return "Basic " + base64.StdEncoding.EncodeToString(bytesconv.StringToBytes(base)) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/binding.go b/vendor/github.com/gin-gonic/gin/binding/binding.go deleted file mode 100644 index 57562845..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/binding.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build !nomsgpack - -package binding - -import "net/http" - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = "application/json" - MIMEHTML = "text/html" - MIMEXML = "application/xml" - MIMEXML2 = "text/xml" - MIMEPlain = "text/plain" - MIMEPOSTForm = "application/x-www-form-urlencoded" - MIMEMultipartPOSTForm = "multipart/form-data" - MIMEPROTOBUF = "application/x-protobuf" - MIMEMSGPACK = "application/x-msgpack" - MIMEMSGPACK2 = "application/msgpack" - MIMEYAML = "application/x-yaml" -) - -// Binding describes the interface which needs to be implemented for binding the -// data present in the request such as JSON request body, query parameters or -// the form POST. -type Binding interface { - Name() string - Bind(*http.Request, interface{}) error -} - -// BindingBody adds BindBody method to Binding. BindBody is similar with Bind, -// but it reads the body from supplied bytes instead of req.Body. -type BindingBody interface { - Binding - BindBody([]byte, interface{}) error -} - -// BindingUri adds BindUri method to Binding. BindUri is similar with Bind, -// but it read the Params. -type BindingUri interface { - Name() string - BindUri(map[string][]string, interface{}) error -} - -// StructValidator is the minimal interface which needs to be implemented in -// order for it to be used as the validator engine for ensuring the correctness -// of the request. Gin provides a default implementation for this using -// https://github.com/go-playground/validator/tree/v8.18.2. -type StructValidator interface { - // ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right. - // If the received type is not a struct, any validation should be skipped and nil must be returned. - // If the received type is a struct or pointer to a struct, the validation should be performed. - // If the struct is not valid or the validation itself fails, a descriptive error should be returned. - // Otherwise nil must be returned. - ValidateStruct(interface{}) error - - // Engine returns the underlying validator engine which powers the - // StructValidator implementation. - Engine() interface{} -} - -// Validator is the default validator which implements the StructValidator -// interface. It uses https://github.com/go-playground/validator/tree/v8.18.2 -// under the hood. -var Validator StructValidator = &defaultValidator{} - -// These implement the Binding interface and can be used to bind the data -// present in the request to struct instances. -var ( - JSON = jsonBinding{} - XML = xmlBinding{} - Form = formBinding{} - Query = queryBinding{} - FormPost = formPostBinding{} - FormMultipart = formMultipartBinding{} - ProtoBuf = protobufBinding{} - MsgPack = msgpackBinding{} - YAML = yamlBinding{} - Uri = uriBinding{} - Header = headerBinding{} -) - -// Default returns the appropriate Binding instance based on the HTTP method -// and the content type. -func Default(method, contentType string) Binding { - if method == http.MethodGet { - return Form - } - - switch contentType { - case MIMEJSON: - return JSON - case MIMEXML, MIMEXML2: - return XML - case MIMEPROTOBUF: - return ProtoBuf - case MIMEMSGPACK, MIMEMSGPACK2: - return MsgPack - case MIMEYAML: - return YAML - case MIMEMultipartPOSTForm: - return FormMultipart - default: // case MIMEPOSTForm: - return Form - } -} - -func validate(obj interface{}) error { - if Validator == nil { - return nil - } - return Validator.ValidateStruct(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go b/vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go deleted file mode 100644 index fd227b11..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2020 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build nomsgpack - -package binding - -import "net/http" - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = "application/json" - MIMEHTML = "text/html" - MIMEXML = "application/xml" - MIMEXML2 = "text/xml" - MIMEPlain = "text/plain" - MIMEPOSTForm = "application/x-www-form-urlencoded" - MIMEMultipartPOSTForm = "multipart/form-data" - MIMEPROTOBUF = "application/x-protobuf" - MIMEYAML = "application/x-yaml" -) - -// Binding describes the interface which needs to be implemented for binding the -// data present in the request such as JSON request body, query parameters or -// the form POST. -type Binding interface { - Name() string - Bind(*http.Request, interface{}) error -} - -// BindingBody adds BindBody method to Binding. BindBody is similar with Bind, -// but it reads the body from supplied bytes instead of req.Body. -type BindingBody interface { - Binding - BindBody([]byte, interface{}) error -} - -// BindingUri adds BindUri method to Binding. BindUri is similar with Bind, -// but it read the Params. -type BindingUri interface { - Name() string - BindUri(map[string][]string, interface{}) error -} - -// StructValidator is the minimal interface which needs to be implemented in -// order for it to be used as the validator engine for ensuring the correctness -// of the request. Gin provides a default implementation for this using -// https://github.com/go-playground/validator/tree/v8.18.2. -type StructValidator interface { - // ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right. - // If the received type is not a struct, any validation should be skipped and nil must be returned. - // If the received type is a struct or pointer to a struct, the validation should be performed. - // If the struct is not valid or the validation itself fails, a descriptive error should be returned. - // Otherwise nil must be returned. - ValidateStruct(interface{}) error - - // Engine returns the underlying validator engine which powers the - // StructValidator implementation. - Engine() interface{} -} - -// Validator is the default validator which implements the StructValidator -// interface. It uses https://github.com/go-playground/validator/tree/v8.18.2 -// under the hood. -var Validator StructValidator = &defaultValidator{} - -// These implement the Binding interface and can be used to bind the data -// present in the request to struct instances. -var ( - JSON = jsonBinding{} - XML = xmlBinding{} - Form = formBinding{} - Query = queryBinding{} - FormPost = formPostBinding{} - FormMultipart = formMultipartBinding{} - ProtoBuf = protobufBinding{} - YAML = yamlBinding{} - Uri = uriBinding{} - Header = headerBinding{} -) - -// Default returns the appropriate Binding instance based on the HTTP method -// and the content type. -func Default(method, contentType string) Binding { - if method == "GET" { - return Form - } - - switch contentType { - case MIMEJSON: - return JSON - case MIMEXML, MIMEXML2: - return XML - case MIMEPROTOBUF: - return ProtoBuf - case MIMEYAML: - return YAML - case MIMEMultipartPOSTForm: - return FormMultipart - default: // case MIMEPOSTForm: - return Form - } -} - -func validate(obj interface{}) error { - if Validator == nil { - return nil - } - return Validator.ValidateStruct(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/default_validator.go b/vendor/github.com/gin-gonic/gin/binding/default_validator.go deleted file mode 100644 index a4c1a7f6..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/default_validator.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "reflect" - "sync" - - "github.com/go-playground/validator/v10" -) - -type defaultValidator struct { - once sync.Once - validate *validator.Validate -} - -var _ StructValidator = &defaultValidator{} - -// ValidateStruct receives any kind of type, but only performed struct or pointer to struct type. -func (v *defaultValidator) ValidateStruct(obj interface{}) error { - value := reflect.ValueOf(obj) - valueType := value.Kind() - if valueType == reflect.Ptr { - valueType = value.Elem().Kind() - } - if valueType == reflect.Struct { - v.lazyinit() - if err := v.validate.Struct(obj); err != nil { - return err - } - } - return nil -} - -// Engine returns the underlying validator engine which powers the default -// Validator instance. This is useful if you want to register custom validations -// or struct level validations. See validator GoDoc for more info - -// https://godoc.org/gopkg.in/go-playground/validator.v8 -func (v *defaultValidator) Engine() interface{} { - v.lazyinit() - return v.validate -} - -func (v *defaultValidator) lazyinit() { - v.once.Do(func() { - v.validate = validator.New() - v.validate.SetTagName("binding") - }) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/form.go b/vendor/github.com/gin-gonic/gin/binding/form.go deleted file mode 100644 index b93c34cf..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/form.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "net/http" -) - -const defaultMemory = 32 << 20 - -type formBinding struct{} -type formPostBinding struct{} -type formMultipartBinding struct{} - -func (formBinding) Name() string { - return "form" -} - -func (formBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseForm(); err != nil { - return err - } - if err := req.ParseMultipartForm(defaultMemory); err != nil { - if err != http.ErrNotMultipart { - return err - } - } - if err := mapForm(obj, req.Form); err != nil { - return err - } - return validate(obj) -} - -func (formPostBinding) Name() string { - return "form-urlencoded" -} - -func (formPostBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseForm(); err != nil { - return err - } - if err := mapForm(obj, req.PostForm); err != nil { - return err - } - return validate(obj) -} - -func (formMultipartBinding) Name() string { - return "multipart/form-data" -} - -func (formMultipartBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseMultipartForm(defaultMemory); err != nil { - return err - } - if err := mappingByPtr(obj, (*multipartRequest)(req), "form"); err != nil { - return err - } - - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go b/vendor/github.com/gin-gonic/gin/binding/form_mapping.go deleted file mode 100644 index b81ad195..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "time" - - "github.com/gin-gonic/gin/internal/bytesconv" - "github.com/gin-gonic/gin/internal/json" -) - -var errUnknownType = errors.New("unknown type") - -func mapUri(ptr interface{}, m map[string][]string) error { - return mapFormByTag(ptr, m, "uri") -} - -func mapForm(ptr interface{}, form map[string][]string) error { - return mapFormByTag(ptr, form, "form") -} - -var emptyField = reflect.StructField{} - -func mapFormByTag(ptr interface{}, form map[string][]string, tag string) error { - return mappingByPtr(ptr, formSource(form), tag) -} - -// setter tries to set value on a walking by fields of a struct -type setter interface { - TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) -} - -type formSource map[string][]string - -var _ setter = formSource(nil) - -// TrySet tries to set a value by request's form source (like map[string][]string) -func (form formSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (isSetted bool, err error) { - return setByForm(value, field, form, tagValue, opt) -} - -func mappingByPtr(ptr interface{}, setter setter, tag string) error { - _, err := mapping(reflect.ValueOf(ptr), emptyField, setter, tag) - return err -} - -func mapping(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { - if field.Tag.Get(tag) == "-" { // just ignoring this field - return false, nil - } - - var vKind = value.Kind() - - if vKind == reflect.Ptr { - var isNew bool - vPtr := value - if value.IsNil() { - isNew = true - vPtr = reflect.New(value.Type().Elem()) - } - isSetted, err := mapping(vPtr.Elem(), field, setter, tag) - if err != nil { - return false, err - } - if isNew && isSetted { - value.Set(vPtr) - } - return isSetted, nil - } - - if vKind != reflect.Struct || !field.Anonymous { - ok, err := tryToSetValue(value, field, setter, tag) - if err != nil { - return false, err - } - if ok { - return true, nil - } - } - - if vKind == reflect.Struct { - tValue := value.Type() - - var isSetted bool - for i := 0; i < value.NumField(); i++ { - sf := tValue.Field(i) - if sf.PkgPath != "" && !sf.Anonymous { // unexported - continue - } - ok, err := mapping(value.Field(i), tValue.Field(i), setter, tag) - if err != nil { - return false, err - } - isSetted = isSetted || ok - } - return isSetted, nil - } - return false, nil -} - -type setOptions struct { - isDefaultExists bool - defaultValue string -} - -func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { - var tagValue string - var setOpt setOptions - - tagValue = field.Tag.Get(tag) - tagValue, opts := head(tagValue, ",") - - if tagValue == "" { // default value is FieldName - tagValue = field.Name - } - if tagValue == "" { // when field is "emptyField" variable - return false, nil - } - - var opt string - for len(opts) > 0 { - opt, opts = head(opts, ",") - - if k, v := head(opt, "="); k == "default" { - setOpt.isDefaultExists = true - setOpt.defaultValue = v - } - } - - return setter.TrySet(value, field, tagValue, setOpt) -} - -func setByForm(value reflect.Value, field reflect.StructField, form map[string][]string, tagValue string, opt setOptions) (isSetted bool, err error) { - vs, ok := form[tagValue] - if !ok && !opt.isDefaultExists { - return false, nil - } - - switch value.Kind() { - case reflect.Slice: - if !ok { - vs = []string{opt.defaultValue} - } - return true, setSlice(vs, value, field) - case reflect.Array: - if !ok { - vs = []string{opt.defaultValue} - } - if len(vs) != value.Len() { - return false, fmt.Errorf("%q is not valid value for %s", vs, value.Type().String()) - } - return true, setArray(vs, value, field) - default: - var val string - if !ok { - val = opt.defaultValue - } - - if len(vs) > 0 { - val = vs[0] - } - return true, setWithProperType(val, value, field) - } -} - -func setWithProperType(val string, value reflect.Value, field reflect.StructField) error { - switch value.Kind() { - case reflect.Int: - return setIntField(val, 0, value) - case reflect.Int8: - return setIntField(val, 8, value) - case reflect.Int16: - return setIntField(val, 16, value) - case reflect.Int32: - return setIntField(val, 32, value) - case reflect.Int64: - switch value.Interface().(type) { - case time.Duration: - return setTimeDuration(val, value, field) - } - return setIntField(val, 64, value) - case reflect.Uint: - return setUintField(val, 0, value) - case reflect.Uint8: - return setUintField(val, 8, value) - case reflect.Uint16: - return setUintField(val, 16, value) - case reflect.Uint32: - return setUintField(val, 32, value) - case reflect.Uint64: - return setUintField(val, 64, value) - case reflect.Bool: - return setBoolField(val, value) - case reflect.Float32: - return setFloatField(val, 32, value) - case reflect.Float64: - return setFloatField(val, 64, value) - case reflect.String: - value.SetString(val) - case reflect.Struct: - switch value.Interface().(type) { - case time.Time: - return setTimeField(val, field, value) - } - return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) - case reflect.Map: - return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) - default: - return errUnknownType - } - return nil -} - -func setIntField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0" - } - intVal, err := strconv.ParseInt(val, 10, bitSize) - if err == nil { - field.SetInt(intVal) - } - return err -} - -func setUintField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0" - } - uintVal, err := strconv.ParseUint(val, 10, bitSize) - if err == nil { - field.SetUint(uintVal) - } - return err -} - -func setBoolField(val string, field reflect.Value) error { - if val == "" { - val = "false" - } - boolVal, err := strconv.ParseBool(val) - if err == nil { - field.SetBool(boolVal) - } - return err -} - -func setFloatField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0.0" - } - floatVal, err := strconv.ParseFloat(val, bitSize) - if err == nil { - field.SetFloat(floatVal) - } - return err -} - -func setTimeField(val string, structField reflect.StructField, value reflect.Value) error { - timeFormat := structField.Tag.Get("time_format") - if timeFormat == "" { - timeFormat = time.RFC3339 - } - - switch tf := strings.ToLower(timeFormat); tf { - case "unix", "unixnano": - tv, err := strconv.ParseInt(val, 10, 0) - if err != nil { - return err - } - - d := time.Duration(1) - if tf == "unixnano" { - d = time.Second - } - - t := time.Unix(tv/int64(d), tv%int64(d)) - value.Set(reflect.ValueOf(t)) - return nil - - } - - if val == "" { - value.Set(reflect.ValueOf(time.Time{})) - return nil - } - - l := time.Local - if isUTC, _ := strconv.ParseBool(structField.Tag.Get("time_utc")); isUTC { - l = time.UTC - } - - if locTag := structField.Tag.Get("time_location"); locTag != "" { - loc, err := time.LoadLocation(locTag) - if err != nil { - return err - } - l = loc - } - - t, err := time.ParseInLocation(timeFormat, val, l) - if err != nil { - return err - } - - value.Set(reflect.ValueOf(t)) - return nil -} - -func setArray(vals []string, value reflect.Value, field reflect.StructField) error { - for i, s := range vals { - err := setWithProperType(s, value.Index(i), field) - if err != nil { - return err - } - } - return nil -} - -func setSlice(vals []string, value reflect.Value, field reflect.StructField) error { - slice := reflect.MakeSlice(value.Type(), len(vals), len(vals)) - err := setArray(vals, slice, field) - if err != nil { - return err - } - value.Set(slice) - return nil -} - -func setTimeDuration(val string, value reflect.Value, field reflect.StructField) error { - d, err := time.ParseDuration(val) - if err != nil { - return err - } - value.Set(reflect.ValueOf(d)) - return nil -} - -func head(str, sep string) (head string, tail string) { - idx := strings.Index(str, sep) - if idx < 0 { - return str, "" - } - return str[:idx], str[idx+len(sep):] -} diff --git a/vendor/github.com/gin-gonic/gin/binding/header.go b/vendor/github.com/gin-gonic/gin/binding/header.go deleted file mode 100644 index 179ce4ea..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/header.go +++ /dev/null @@ -1,34 +0,0 @@ -package binding - -import ( - "net/http" - "net/textproto" - "reflect" -) - -type headerBinding struct{} - -func (headerBinding) Name() string { - return "header" -} - -func (headerBinding) Bind(req *http.Request, obj interface{}) error { - - if err := mapHeader(obj, req.Header); err != nil { - return err - } - - return validate(obj) -} - -func mapHeader(ptr interface{}, h map[string][]string) error { - return mappingByPtr(ptr, headerSource(h), "header") -} - -type headerSource map[string][]string - -var _ setter = headerSource(nil) - -func (hs headerSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (isSetted bool, err error) { - return setByForm(value, field, hs, textproto.CanonicalMIMEHeaderKey(tagValue), opt) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/json.go b/vendor/github.com/gin-gonic/gin/binding/json.go deleted file mode 100644 index d62e0705..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/json.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "fmt" - "io" - "net/http" - - "github.com/gin-gonic/gin/internal/json" -) - -// EnableDecoderUseNumber is used to call the UseNumber method on the JSON -// Decoder instance. UseNumber causes the Decoder to unmarshal a number into an -// interface{} as a Number instead of as a float64. -var EnableDecoderUseNumber = false - -// EnableDecoderDisallowUnknownFields is used to call the DisallowUnknownFields method -// on the JSON Decoder instance. DisallowUnknownFields causes the Decoder to -// return an error when the destination is a struct and the input contains object -// keys which do not match any non-ignored, exported fields in the destination. -var EnableDecoderDisallowUnknownFields = false - -type jsonBinding struct{} - -func (jsonBinding) Name() string { - return "json" -} - -func (jsonBinding) Bind(req *http.Request, obj interface{}) error { - if req == nil || req.Body == nil { - return fmt.Errorf("invalid request") - } - return decodeJSON(req.Body, obj) -} - -func (jsonBinding) BindBody(body []byte, obj interface{}) error { - return decodeJSON(bytes.NewReader(body), obj) -} - -func decodeJSON(r io.Reader, obj interface{}) error { - decoder := json.NewDecoder(r) - if EnableDecoderUseNumber { - decoder.UseNumber() - } - if EnableDecoderDisallowUnknownFields { - decoder.DisallowUnknownFields() - } - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/msgpack.go b/vendor/github.com/gin-gonic/gin/binding/msgpack.go deleted file mode 100644 index a5bc2ad2..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/msgpack.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build !nomsgpack - -package binding - -import ( - "bytes" - "io" - "net/http" - - "github.com/ugorji/go/codec" -) - -type msgpackBinding struct{} - -func (msgpackBinding) Name() string { - return "msgpack" -} - -func (msgpackBinding) Bind(req *http.Request, obj interface{}) error { - return decodeMsgPack(req.Body, obj) -} - -func (msgpackBinding) BindBody(body []byte, obj interface{}) error { - return decodeMsgPack(bytes.NewReader(body), obj) -} - -func decodeMsgPack(r io.Reader, obj interface{}) error { - cdc := new(codec.MsgpackHandle) - if err := codec.NewDecoder(r, cdc).Decode(&obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go b/vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go deleted file mode 100644 index f85a1aa6..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "errors" - "mime/multipart" - "net/http" - "reflect" -) - -type multipartRequest http.Request - -var _ setter = (*multipartRequest)(nil) - -// TrySet tries to set a value by the multipart request with the binding a form file -func (r *multipartRequest) TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) { - if files := r.MultipartForm.File[key]; len(files) != 0 { - return setByMultipartFormFile(value, field, files) - } - - return setByForm(value, field, r.MultipartForm.Value, key, opt) -} - -func setByMultipartFormFile(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) { - switch value.Kind() { - case reflect.Ptr: - switch value.Interface().(type) { - case *multipart.FileHeader: - value.Set(reflect.ValueOf(files[0])) - return true, nil - } - case reflect.Struct: - switch value.Interface().(type) { - case multipart.FileHeader: - value.Set(reflect.ValueOf(*files[0])) - return true, nil - } - case reflect.Slice: - slice := reflect.MakeSlice(value.Type(), len(files), len(files)) - isSetted, err = setArrayOfMultipartFormFiles(slice, field, files) - if err != nil || !isSetted { - return isSetted, err - } - value.Set(slice) - return true, nil - case reflect.Array: - return setArrayOfMultipartFormFiles(value, field, files) - } - return false, errors.New("unsupported field type for multipart.FileHeader") -} - -func setArrayOfMultipartFormFiles(value reflect.Value, field reflect.StructField, files []*multipart.FileHeader) (isSetted bool, err error) { - if value.Len() != len(files) { - return false, errors.New("unsupported len of array for []*multipart.FileHeader") - } - for i := range files { - setted, err := setByMultipartFormFile(value.Index(i), field, files[i:i+1]) - if err != nil || !setted { - return setted, err - } - } - return true, nil -} diff --git a/vendor/github.com/gin-gonic/gin/binding/protobuf.go b/vendor/github.com/gin-gonic/gin/binding/protobuf.go deleted file mode 100644 index f9ece928..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/protobuf.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "io/ioutil" - "net/http" - - "github.com/golang/protobuf/proto" -) - -type protobufBinding struct{} - -func (protobufBinding) Name() string { - return "protobuf" -} - -func (b protobufBinding) Bind(req *http.Request, obj interface{}) error { - buf, err := ioutil.ReadAll(req.Body) - if err != nil { - return err - } - return b.BindBody(buf, obj) -} - -func (protobufBinding) BindBody(body []byte, obj interface{}) error { - if err := proto.Unmarshal(body, obj.(proto.Message)); err != nil { - return err - } - // Here it's same to return validate(obj), but util now we can't add - // `binding:""` to the struct which automatically generate by gen-proto - return nil - // return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/query.go b/vendor/github.com/gin-gonic/gin/binding/query.go deleted file mode 100644 index 219743f2..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/query.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import "net/http" - -type queryBinding struct{} - -func (queryBinding) Name() string { - return "query" -} - -func (queryBinding) Bind(req *http.Request, obj interface{}) error { - values := req.URL.Query() - if err := mapForm(obj, values); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/uri.go b/vendor/github.com/gin-gonic/gin/binding/uri.go deleted file mode 100644 index f91ec381..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/uri.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -type uriBinding struct{} - -func (uriBinding) Name() string { - return "uri" -} - -func (uriBinding) BindUri(m map[string][]string, obj interface{}) error { - if err := mapUri(obj, m); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/xml.go b/vendor/github.com/gin-gonic/gin/binding/xml.go deleted file mode 100644 index 4e901149..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/xml.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "encoding/xml" - "io" - "net/http" -) - -type xmlBinding struct{} - -func (xmlBinding) Name() string { - return "xml" -} - -func (xmlBinding) Bind(req *http.Request, obj interface{}) error { - return decodeXML(req.Body, obj) -} - -func (xmlBinding) BindBody(body []byte, obj interface{}) error { - return decodeXML(bytes.NewReader(body), obj) -} -func decodeXML(r io.Reader, obj interface{}) error { - decoder := xml.NewDecoder(r) - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/yaml.go b/vendor/github.com/gin-gonic/gin/binding/yaml.go deleted file mode 100644 index a2d36d6a..00000000 --- a/vendor/github.com/gin-gonic/gin/binding/yaml.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "io" - "net/http" - - "gopkg.in/yaml.v2" -) - -type yamlBinding struct{} - -func (yamlBinding) Name() string { - return "yaml" -} - -func (yamlBinding) Bind(req *http.Request, obj interface{}) error { - return decodeYAML(req.Body, obj) -} - -func (yamlBinding) BindBody(body []byte, obj interface{}) error { - return decodeYAML(bytes.NewReader(body), obj) -} - -func decodeYAML(r io.Reader, obj interface{}) error { - decoder := yaml.NewDecoder(r) - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/codecov.yml b/vendor/github.com/gin-gonic/gin/codecov.yml deleted file mode 100644 index c9c9a522..00000000 --- a/vendor/github.com/gin-gonic/gin/codecov.yml +++ /dev/null @@ -1,5 +0,0 @@ -coverage: - notify: - gitter: - default: - url: https://webhooks.gitter.im/e/d90dcdeeab2f1e357165 diff --git a/vendor/github.com/gin-gonic/gin/context.go b/vendor/github.com/gin-gonic/gin/context.go deleted file mode 100644 index fb7f54e9..00000000 --- a/vendor/github.com/gin-gonic/gin/context.go +++ /dev/null @@ -1,1106 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "math" - "mime/multipart" - "net" - "net/http" - "net/url" - "os" - "strings" - "sync" - "time" - - "github.com/gin-contrib/sse" - "github.com/gin-gonic/gin/binding" - "github.com/gin-gonic/gin/render" -) - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = binding.MIMEJSON - MIMEHTML = binding.MIMEHTML - MIMEXML = binding.MIMEXML - MIMEXML2 = binding.MIMEXML2 - MIMEPlain = binding.MIMEPlain - MIMEPOSTForm = binding.MIMEPOSTForm - MIMEMultipartPOSTForm = binding.MIMEMultipartPOSTForm - MIMEYAML = binding.MIMEYAML - BodyBytesKey = "_gin-gonic/gin/bodybyteskey" -) - -const abortIndex int8 = math.MaxInt8 / 2 - -// Context is the most important part of gin. It allows us to pass variables between middleware, -// manage the flow, validate the JSON of a request and render a JSON response for example. -type Context struct { - writermem responseWriter - Request *http.Request - Writer ResponseWriter - - Params Params - handlers HandlersChain - index int8 - fullPath string - - engine *Engine - - // This mutex protect Keys map - mu sync.RWMutex - - // Keys is a key/value pair exclusively for the context of each request. - Keys map[string]interface{} - - // Errors is a list of errors attached to all the handlers/middlewares who used this context. - Errors errorMsgs - - // Accepted defines a list of manually accepted formats for content negotiation. - Accepted []string - - // queryCache use url.ParseQuery cached the param query result from c.Request.URL.Query() - queryCache url.Values - - // formCache use url.ParseQuery cached PostForm contains the parsed form data from POST, PATCH, - // or PUT body parameters. - formCache url.Values - - // SameSite allows a server to define a cookie attribute making it impossible for - // the browser to send this cookie along with cross-site requests. - sameSite http.SameSite -} - -/************************************/ -/********** CONTEXT CREATION ********/ -/************************************/ - -func (c *Context) reset() { - c.Writer = &c.writermem - c.Params = c.Params[0:0] - c.handlers = nil - c.index = -1 - - c.fullPath = "" - c.Keys = nil - c.Errors = c.Errors[0:0] - c.Accepted = nil - c.queryCache = nil - c.formCache = nil -} - -// Copy returns a copy of the current context that can be safely used outside the request's scope. -// This has to be used when the context has to be passed to a goroutine. -func (c *Context) Copy() *Context { - cp := Context{ - writermem: c.writermem, - Request: c.Request, - Params: c.Params, - engine: c.engine, - } - cp.writermem.ResponseWriter = nil - cp.Writer = &cp.writermem - cp.index = abortIndex - cp.handlers = nil - cp.Keys = map[string]interface{}{} - for k, v := range c.Keys { - cp.Keys[k] = v - } - paramCopy := make([]Param, len(cp.Params)) - copy(paramCopy, cp.Params) - cp.Params = paramCopy - return &cp -} - -// HandlerName returns the main handler's name. For example if the handler is "handleGetUsers()", -// this function will return "main.handleGetUsers". -func (c *Context) HandlerName() string { - return nameOfFunction(c.handlers.Last()) -} - -// HandlerNames returns a list of all registered handlers for this context in descending order, -// following the semantics of HandlerName() -func (c *Context) HandlerNames() []string { - hn := make([]string, 0, len(c.handlers)) - for _, val := range c.handlers { - hn = append(hn, nameOfFunction(val)) - } - return hn -} - -// Handler returns the main handler. -func (c *Context) Handler() HandlerFunc { - return c.handlers.Last() -} - -// FullPath returns a matched route full path. For not found routes -// returns an empty string. -// router.GET("/user/:id", func(c *gin.Context) { -// c.FullPath() == "/user/:id" // true -// }) -func (c *Context) FullPath() string { - return c.fullPath -} - -/************************************/ -/*********** FLOW CONTROL ***********/ -/************************************/ - -// Next should be used only inside middleware. -// It executes the pending handlers in the chain inside the calling handler. -// See example in GitHub. -func (c *Context) Next() { - c.index++ - for c.index < int8(len(c.handlers)) { - c.handlers[c.index](c) - c.index++ - } -} - -// IsAborted returns true if the current context was aborted. -func (c *Context) IsAborted() bool { - return c.index >= abortIndex -} - -// Abort prevents pending handlers from being called. Note that this will not stop the current handler. -// Let's say you have an authorization middleware that validates that the current request is authorized. -// If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers -// for this request are not called. -func (c *Context) Abort() { - c.index = abortIndex -} - -// AbortWithStatus calls `Abort()` and writes the headers with the specified status code. -// For example, a failed attempt to authenticate a request could use: context.AbortWithStatus(401). -func (c *Context) AbortWithStatus(code int) { - c.Status(code) - c.Writer.WriteHeaderNow() - c.Abort() -} - -// AbortWithStatusJSON calls `Abort()` and then `JSON` internally. -// This method stops the chain, writes the status code and return a JSON body. -// It also sets the Content-Type as "application/json". -func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{}) { - c.Abort() - c.JSON(code, jsonObj) -} - -// AbortWithError calls `AbortWithStatus()` and `Error()` internally. -// This method stops the chain, writes the status code and pushes the specified error to `c.Errors`. -// See Context.Error() for more details. -func (c *Context) AbortWithError(code int, err error) *Error { - c.AbortWithStatus(code) - return c.Error(err) -} - -/************************************/ -/********* ERROR MANAGEMENT *********/ -/************************************/ - -// Error attaches an error to the current context. The error is pushed to a list of errors. -// It's a good idea to call Error for each error that occurred during the resolution of a request. -// A middleware can be used to collect all the errors and push them to a database together, -// print a log, or append it in the HTTP response. -// Error will panic if err is nil. -func (c *Context) Error(err error) *Error { - if err == nil { - panic("err is nil") - } - - parsedError, ok := err.(*Error) - if !ok { - parsedError = &Error{ - Err: err, - Type: ErrorTypePrivate, - } - } - - c.Errors = append(c.Errors, parsedError) - return parsedError -} - -/************************************/ -/******** METADATA MANAGEMENT********/ -/************************************/ - -// Set is used to store a new key/value pair exclusively for this context. -// It also lazy initializes c.Keys if it was not used previously. -func (c *Context) Set(key string, value interface{}) { - c.mu.Lock() - if c.Keys == nil { - c.Keys = make(map[string]interface{}) - } - - c.Keys[key] = value - c.mu.Unlock() -} - -// Get returns the value for the given key, ie: (value, true). -// If the value does not exists it returns (nil, false) -func (c *Context) Get(key string) (value interface{}, exists bool) { - c.mu.RLock() - value, exists = c.Keys[key] - c.mu.RUnlock() - return -} - -// MustGet returns the value for the given key if it exists, otherwise it panics. -func (c *Context) MustGet(key string) interface{} { - if value, exists := c.Get(key); exists { - return value - } - panic("Key \"" + key + "\" does not exist") -} - -// GetString returns the value associated with the key as a string. -func (c *Context) GetString(key string) (s string) { - if val, ok := c.Get(key); ok && val != nil { - s, _ = val.(string) - } - return -} - -// GetBool returns the value associated with the key as a boolean. -func (c *Context) GetBool(key string) (b bool) { - if val, ok := c.Get(key); ok && val != nil { - b, _ = val.(bool) - } - return -} - -// GetInt returns the value associated with the key as an integer. -func (c *Context) GetInt(key string) (i int) { - if val, ok := c.Get(key); ok && val != nil { - i, _ = val.(int) - } - return -} - -// GetInt64 returns the value associated with the key as an integer. -func (c *Context) GetInt64(key string) (i64 int64) { - if val, ok := c.Get(key); ok && val != nil { - i64, _ = val.(int64) - } - return -} - -// GetFloat64 returns the value associated with the key as a float64. -func (c *Context) GetFloat64(key string) (f64 float64) { - if val, ok := c.Get(key); ok && val != nil { - f64, _ = val.(float64) - } - return -} - -// GetTime returns the value associated with the key as time. -func (c *Context) GetTime(key string) (t time.Time) { - if val, ok := c.Get(key); ok && val != nil { - t, _ = val.(time.Time) - } - return -} - -// GetDuration returns the value associated with the key as a duration. -func (c *Context) GetDuration(key string) (d time.Duration) { - if val, ok := c.Get(key); ok && val != nil { - d, _ = val.(time.Duration) - } - return -} - -// GetStringSlice returns the value associated with the key as a slice of strings. -func (c *Context) GetStringSlice(key string) (ss []string) { - if val, ok := c.Get(key); ok && val != nil { - ss, _ = val.([]string) - } - return -} - -// GetStringMap returns the value associated with the key as a map of interfaces. -func (c *Context) GetStringMap(key string) (sm map[string]interface{}) { - if val, ok := c.Get(key); ok && val != nil { - sm, _ = val.(map[string]interface{}) - } - return -} - -// GetStringMapString returns the value associated with the key as a map of strings. -func (c *Context) GetStringMapString(key string) (sms map[string]string) { - if val, ok := c.Get(key); ok && val != nil { - sms, _ = val.(map[string]string) - } - return -} - -// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings. -func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string) { - if val, ok := c.Get(key); ok && val != nil { - smss, _ = val.(map[string][]string) - } - return -} - -/************************************/ -/************ INPUT DATA ************/ -/************************************/ - -// Param returns the value of the URL param. -// It is a shortcut for c.Params.ByName(key) -// router.GET("/user/:id", func(c *gin.Context) { -// // a GET request to /user/john -// id := c.Param("id") // id == "john" -// }) -func (c *Context) Param(key string) string { - return c.Params.ByName(key) -} - -// Query returns the keyed url query value if it exists, -// otherwise it returns an empty string `("")`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// GET /path?id=1234&name=Manu&value= -// c.Query("id") == "1234" -// c.Query("name") == "Manu" -// c.Query("value") == "" -// c.Query("wtf") == "" -func (c *Context) Query(key string) string { - value, _ := c.GetQuery(key) - return value -} - -// DefaultQuery returns the keyed url query value if it exists, -// otherwise it returns the specified defaultValue string. -// See: Query() and GetQuery() for further information. -// GET /?name=Manu&lastname= -// c.DefaultQuery("name", "unknown") == "Manu" -// c.DefaultQuery("id", "none") == "none" -// c.DefaultQuery("lastname", "none") == "" -func (c *Context) DefaultQuery(key, defaultValue string) string { - if value, ok := c.GetQuery(key); ok { - return value - } - return defaultValue -} - -// GetQuery is like Query(), it returns the keyed url query value -// if it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns `("", false)`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// GET /?name=Manu&lastname= -// ("Manu", true) == c.GetQuery("name") -// ("", false) == c.GetQuery("id") -// ("", true) == c.GetQuery("lastname") -func (c *Context) GetQuery(key string) (string, bool) { - if values, ok := c.GetQueryArray(key); ok { - return values[0], ok - } - return "", false -} - -// QueryArray returns a slice of strings for a given query key. -// The length of the slice depends on the number of params with the given key. -func (c *Context) QueryArray(key string) []string { - values, _ := c.GetQueryArray(key) - return values -} - -func (c *Context) getQueryCache() { - if c.queryCache == nil { - c.queryCache = c.Request.URL.Query() - } -} - -// GetQueryArray returns a slice of strings for a given query key, plus -// a boolean value whether at least one value exists for the given key. -func (c *Context) GetQueryArray(key string) ([]string, bool) { - c.getQueryCache() - if values, ok := c.queryCache[key]; ok && len(values) > 0 { - return values, true - } - return []string{}, false -} - -// QueryMap returns a map for a given query key. -func (c *Context) QueryMap(key string) map[string]string { - dicts, _ := c.GetQueryMap(key) - return dicts -} - -// GetQueryMap returns a map for a given query key, plus a boolean value -// whether at least one value exists for the given key. -func (c *Context) GetQueryMap(key string) (map[string]string, bool) { - c.getQueryCache() - return c.get(c.queryCache, key) -} - -// PostForm returns the specified key from a POST urlencoded form or multipart form -// when it exists, otherwise it returns an empty string `("")`. -func (c *Context) PostForm(key string) string { - value, _ := c.GetPostForm(key) - return value -} - -// DefaultPostForm returns the specified key from a POST urlencoded form or multipart form -// when it exists, otherwise it returns the specified defaultValue string. -// See: PostForm() and GetPostForm() for further information. -func (c *Context) DefaultPostForm(key, defaultValue string) string { - if value, ok := c.GetPostForm(key); ok { - return value - } - return defaultValue -} - -// GetPostForm is like PostForm(key). It returns the specified key from a POST urlencoded -// form or multipart form when it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns ("", false). -// For example, during a PATCH request to update the user's email: -// email=mail@example.com --> ("mail@example.com", true) := GetPostForm("email") // set email to "mail@example.com" -// email= --> ("", true) := GetPostForm("email") // set email to "" -// --> ("", false) := GetPostForm("email") // do nothing with email -func (c *Context) GetPostForm(key string) (string, bool) { - if values, ok := c.GetPostFormArray(key); ok { - return values[0], ok - } - return "", false -} - -// PostFormArray returns a slice of strings for a given form key. -// The length of the slice depends on the number of params with the given key. -func (c *Context) PostFormArray(key string) []string { - values, _ := c.GetPostFormArray(key) - return values -} - -func (c *Context) getFormCache() { - if c.formCache == nil { - c.formCache = make(url.Values) - req := c.Request - if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - if err != http.ErrNotMultipart { - debugPrint("error on parse multipart form array: %v", err) - } - } - c.formCache = req.PostForm - } -} - -// GetPostFormArray returns a slice of strings for a given form key, plus -// a boolean value whether at least one value exists for the given key. -func (c *Context) GetPostFormArray(key string) ([]string, bool) { - c.getFormCache() - if values := c.formCache[key]; len(values) > 0 { - return values, true - } - return []string{}, false -} - -// PostFormMap returns a map for a given form key. -func (c *Context) PostFormMap(key string) map[string]string { - dicts, _ := c.GetPostFormMap(key) - return dicts -} - -// GetPostFormMap returns a map for a given form key, plus a boolean value -// whether at least one value exists for the given key. -func (c *Context) GetPostFormMap(key string) (map[string]string, bool) { - c.getFormCache() - return c.get(c.formCache, key) -} - -// get is an internal method and returns a map which satisfy conditions. -func (c *Context) get(m map[string][]string, key string) (map[string]string, bool) { - dicts := make(map[string]string) - exist := false - for k, v := range m { - if i := strings.IndexByte(k, '['); i >= 1 && k[0:i] == key { - if j := strings.IndexByte(k[i+1:], ']'); j >= 1 { - exist = true - dicts[k[i+1:][:j]] = v[0] - } - } - } - return dicts, exist -} - -// FormFile returns the first file for the provided form key. -func (c *Context) FormFile(name string) (*multipart.FileHeader, error) { - if c.Request.MultipartForm == nil { - if err := c.Request.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - return nil, err - } - } - f, fh, err := c.Request.FormFile(name) - if err != nil { - return nil, err - } - f.Close() - return fh, err -} - -// MultipartForm is the parsed multipart form, including file uploads. -func (c *Context) MultipartForm() (*multipart.Form, error) { - err := c.Request.ParseMultipartForm(c.engine.MaxMultipartMemory) - return c.Request.MultipartForm, err -} - -// SaveUploadedFile uploads the form file to specific dst. -func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error { - src, err := file.Open() - if err != nil { - return err - } - defer src.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} - -// Bind checks the Content-Type to select a binding engine automatically, -// Depending the "Content-Type" header different bindings are used: -// "application/json" --> JSON binding -// "application/xml" --> XML binding -// otherwise --> returns an error. -// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. -// It decodes the json payload into the struct specified as a pointer. -// It writes a 400 error and sets Content-Type header "text/plain" in the response if input is not valid. -func (c *Context) Bind(obj interface{}) error { - b := binding.Default(c.Request.Method, c.ContentType()) - return c.MustBindWith(obj, b) -} - -// BindJSON is a shortcut for c.MustBindWith(obj, binding.JSON). -func (c *Context) BindJSON(obj interface{}) error { - return c.MustBindWith(obj, binding.JSON) -} - -// BindXML is a shortcut for c.MustBindWith(obj, binding.BindXML). -func (c *Context) BindXML(obj interface{}) error { - return c.MustBindWith(obj, binding.XML) -} - -// BindQuery is a shortcut for c.MustBindWith(obj, binding.Query). -func (c *Context) BindQuery(obj interface{}) error { - return c.MustBindWith(obj, binding.Query) -} - -// BindYAML is a shortcut for c.MustBindWith(obj, binding.YAML). -func (c *Context) BindYAML(obj interface{}) error { - return c.MustBindWith(obj, binding.YAML) -} - -// BindHeader is a shortcut for c.MustBindWith(obj, binding.Header). -func (c *Context) BindHeader(obj interface{}) error { - return c.MustBindWith(obj, binding.Header) -} - -// BindUri binds the passed struct pointer using binding.Uri. -// It will abort the request with HTTP 400 if any error occurs. -func (c *Context) BindUri(obj interface{}) error { - if err := c.ShouldBindUri(obj); err != nil { - c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck - return err - } - return nil -} - -// MustBindWith binds the passed struct pointer using the specified binding engine. -// It will abort the request with HTTP 400 if any error occurs. -// See the binding package. -func (c *Context) MustBindWith(obj interface{}, b binding.Binding) error { - if err := c.ShouldBindWith(obj, b); err != nil { - c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck - return err - } - return nil -} - -// ShouldBind checks the Content-Type to select a binding engine automatically, -// Depending the "Content-Type" header different bindings are used: -// "application/json" --> JSON binding -// "application/xml" --> XML binding -// otherwise --> returns an error -// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. -// It decodes the json payload into the struct specified as a pointer. -// Like c.Bind() but this method does not set the response status code to 400 and abort if the json is not valid. -func (c *Context) ShouldBind(obj interface{}) error { - b := binding.Default(c.Request.Method, c.ContentType()) - return c.ShouldBindWith(obj, b) -} - -// ShouldBindJSON is a shortcut for c.ShouldBindWith(obj, binding.JSON). -func (c *Context) ShouldBindJSON(obj interface{}) error { - return c.ShouldBindWith(obj, binding.JSON) -} - -// ShouldBindXML is a shortcut for c.ShouldBindWith(obj, binding.XML). -func (c *Context) ShouldBindXML(obj interface{}) error { - return c.ShouldBindWith(obj, binding.XML) -} - -// ShouldBindQuery is a shortcut for c.ShouldBindWith(obj, binding.Query). -func (c *Context) ShouldBindQuery(obj interface{}) error { - return c.ShouldBindWith(obj, binding.Query) -} - -// ShouldBindYAML is a shortcut for c.ShouldBindWith(obj, binding.YAML). -func (c *Context) ShouldBindYAML(obj interface{}) error { - return c.ShouldBindWith(obj, binding.YAML) -} - -// ShouldBindHeader is a shortcut for c.ShouldBindWith(obj, binding.Header). -func (c *Context) ShouldBindHeader(obj interface{}) error { - return c.ShouldBindWith(obj, binding.Header) -} - -// ShouldBindUri binds the passed struct pointer using the specified binding engine. -func (c *Context) ShouldBindUri(obj interface{}) error { - m := make(map[string][]string) - for _, v := range c.Params { - m[v.Key] = []string{v.Value} - } - return binding.Uri.BindUri(m, obj) -} - -// ShouldBindWith binds the passed struct pointer using the specified binding engine. -// See the binding package. -func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error { - return b.Bind(c.Request, obj) -} - -// ShouldBindBodyWith is similar with ShouldBindWith, but it stores the request -// body into the context, and reuse when it is called again. -// -// NOTE: This method reads the body before binding. So you should use -// ShouldBindWith for better performance if you need to call only once. -func (c *Context) ShouldBindBodyWith(obj interface{}, bb binding.BindingBody) (err error) { - var body []byte - if cb, ok := c.Get(BodyBytesKey); ok { - if cbb, ok := cb.([]byte); ok { - body = cbb - } - } - if body == nil { - body, err = ioutil.ReadAll(c.Request.Body) - if err != nil { - return err - } - c.Set(BodyBytesKey, body) - } - return bb.BindBody(body, obj) -} - -// ClientIP implements a best effort algorithm to return the real client IP, it parses -// X-Real-IP and X-Forwarded-For in order to work properly with reverse-proxies such us: nginx or haproxy. -// Use X-Forwarded-For before X-Real-Ip as nginx uses X-Real-Ip with the proxy's IP. -func (c *Context) ClientIP() string { - if c.engine.ForwardedByClientIP { - clientIP := c.requestHeader("X-Forwarded-For") - clientIP = strings.TrimSpace(strings.Split(clientIP, ",")[0]) - if clientIP == "" { - clientIP = strings.TrimSpace(c.requestHeader("X-Real-Ip")) - } - if clientIP != "" { - return clientIP - } - } - - if c.engine.AppEngine { - if addr := c.requestHeader("X-Appengine-Remote-Addr"); addr != "" { - return addr - } - } - - if ip, _, err := net.SplitHostPort(strings.TrimSpace(c.Request.RemoteAddr)); err == nil { - return ip - } - - return "" -} - -// ContentType returns the Content-Type header of the request. -func (c *Context) ContentType() string { - return filterFlags(c.requestHeader("Content-Type")) -} - -// IsWebsocket returns true if the request headers indicate that a websocket -// handshake is being initiated by the client. -func (c *Context) IsWebsocket() bool { - if strings.Contains(strings.ToLower(c.requestHeader("Connection")), "upgrade") && - strings.EqualFold(c.requestHeader("Upgrade"), "websocket") { - return true - } - return false -} - -func (c *Context) requestHeader(key string) string { - return c.Request.Header.Get(key) -} - -/************************************/ -/******** RESPONSE RENDERING ********/ -/************************************/ - -// bodyAllowedForStatus is a copy of http.bodyAllowedForStatus non-exported function. -func bodyAllowedForStatus(status int) bool { - switch { - case status >= 100 && status <= 199: - return false - case status == http.StatusNoContent: - return false - case status == http.StatusNotModified: - return false - } - return true -} - -// Status sets the HTTP response code. -func (c *Context) Status(code int) { - c.Writer.WriteHeader(code) -} - -// Header is a intelligent shortcut for c.Writer.Header().Set(key, value). -// It writes a header in the response. -// If value == "", this method removes the header `c.Writer.Header().Del(key)` -func (c *Context) Header(key, value string) { - if value == "" { - c.Writer.Header().Del(key) - return - } - c.Writer.Header().Set(key, value) -} - -// GetHeader returns value from request headers. -func (c *Context) GetHeader(key string) string { - return c.requestHeader(key) -} - -// GetRawData return stream data. -func (c *Context) GetRawData() ([]byte, error) { - return ioutil.ReadAll(c.Request.Body) -} - -// SetSameSite with cookie -func (c *Context) SetSameSite(samesite http.SameSite) { - c.sameSite = samesite -} - -// SetCookie adds a Set-Cookie header to the ResponseWriter's headers. -// The provided cookie must have a valid Name. Invalid cookies may be -// silently dropped. -func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) { - if path == "" { - path = "/" - } - http.SetCookie(c.Writer, &http.Cookie{ - Name: name, - Value: url.QueryEscape(value), - MaxAge: maxAge, - Path: path, - Domain: domain, - SameSite: c.sameSite, - Secure: secure, - HttpOnly: httpOnly, - }) -} - -// Cookie returns the named cookie provided in the request or -// ErrNoCookie if not found. And return the named cookie is unescaped. -// If multiple cookies match the given name, only one cookie will -// be returned. -func (c *Context) Cookie(name string) (string, error) { - cookie, err := c.Request.Cookie(name) - if err != nil { - return "", err - } - val, _ := url.QueryUnescape(cookie.Value) - return val, nil -} - -// Render writes the response headers and calls render.Render to render data. -func (c *Context) Render(code int, r render.Render) { - c.Status(code) - - if !bodyAllowedForStatus(code) { - r.WriteContentType(c.Writer) - c.Writer.WriteHeaderNow() - return - } - - if err := r.Render(c.Writer); err != nil { - panic(err) - } -} - -// HTML renders the HTTP template specified by its file name. -// It also updates the HTTP code and sets the Content-Type as "text/html". -// See http://golang.org/doc/articles/wiki/ -func (c *Context) HTML(code int, name string, obj interface{}) { - instance := c.engine.HTMLRender.Instance(name, obj) - c.Render(code, instance) -} - -// IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body. -// It also sets the Content-Type as "application/json". -// WARNING: we recommend to use this only for development purposes since printing pretty JSON is -// more CPU and bandwidth consuming. Use Context.JSON() instead. -func (c *Context) IndentedJSON(code int, obj interface{}) { - c.Render(code, render.IndentedJSON{Data: obj}) -} - -// SecureJSON serializes the given struct as Secure JSON into the response body. -// Default prepends "while(1)," to response body if the given struct is array values. -// It also sets the Content-Type as "application/json". -func (c *Context) SecureJSON(code int, obj interface{}) { - c.Render(code, render.SecureJSON{Prefix: c.engine.secureJsonPrefix, Data: obj}) -} - -// JSONP serializes the given struct as JSON into the response body. -// It add padding to response body to request data from a server residing in a different domain than the client. -// It also sets the Content-Type as "application/javascript". -func (c *Context) JSONP(code int, obj interface{}) { - callback := c.DefaultQuery("callback", "") - if callback == "" { - c.Render(code, render.JSON{Data: obj}) - return - } - c.Render(code, render.JsonpJSON{Callback: callback, Data: obj}) -} - -// JSON serializes the given struct as JSON into the response body. -// It also sets the Content-Type as "application/json". -func (c *Context) JSON(code int, obj interface{}) { - c.Render(code, render.JSON{Data: obj}) -} - -// AsciiJSON serializes the given struct as JSON into the response body with unicode to ASCII string. -// It also sets the Content-Type as "application/json". -func (c *Context) AsciiJSON(code int, obj interface{}) { - c.Render(code, render.AsciiJSON{Data: obj}) -} - -// PureJSON serializes the given struct as JSON into the response body. -// PureJSON, unlike JSON, does not replace special html characters with their unicode entities. -func (c *Context) PureJSON(code int, obj interface{}) { - c.Render(code, render.PureJSON{Data: obj}) -} - -// XML serializes the given struct as XML into the response body. -// It also sets the Content-Type as "application/xml". -func (c *Context) XML(code int, obj interface{}) { - c.Render(code, render.XML{Data: obj}) -} - -// YAML serializes the given struct as YAML into the response body. -func (c *Context) YAML(code int, obj interface{}) { - c.Render(code, render.YAML{Data: obj}) -} - -// ProtoBuf serializes the given struct as ProtoBuf into the response body. -func (c *Context) ProtoBuf(code int, obj interface{}) { - c.Render(code, render.ProtoBuf{Data: obj}) -} - -// String writes the given string into the response body. -func (c *Context) String(code int, format string, values ...interface{}) { - c.Render(code, render.String{Format: format, Data: values}) -} - -// Redirect returns a HTTP redirect to the specific location. -func (c *Context) Redirect(code int, location string) { - c.Render(-1, render.Redirect{ - Code: code, - Location: location, - Request: c.Request, - }) -} - -// Data writes some data into the body stream and updates the HTTP code. -func (c *Context) Data(code int, contentType string, data []byte) { - c.Render(code, render.Data{ - ContentType: contentType, - Data: data, - }) -} - -// DataFromReader writes the specified reader into the body stream and updates the HTTP code. -func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) { - c.Render(code, render.Reader{ - Headers: extraHeaders, - ContentType: contentType, - ContentLength: contentLength, - Reader: reader, - }) -} - -// File writes the specified file into the body stream in a efficient way. -func (c *Context) File(filepath string) { - http.ServeFile(c.Writer, c.Request, filepath) -} - -// FileFromFS writes the specified file from http.FileSytem into the body stream in an efficient way. -func (c *Context) FileFromFS(filepath string, fs http.FileSystem) { - defer func(old string) { - c.Request.URL.Path = old - }(c.Request.URL.Path) - - c.Request.URL.Path = filepath - - http.FileServer(fs).ServeHTTP(c.Writer, c.Request) -} - -// FileAttachment writes the specified file into the body stream in an efficient way -// On the client side, the file will typically be downloaded with the given filename -func (c *Context) FileAttachment(filepath, filename string) { - c.Writer.Header().Set("content-disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) - http.ServeFile(c.Writer, c.Request, filepath) -} - -// SSEvent writes a Server-Sent Event into the body stream. -func (c *Context) SSEvent(name string, message interface{}) { - c.Render(-1, sse.Event{ - Event: name, - Data: message, - }) -} - -// Stream sends a streaming response and returns a boolean -// indicates "Is client disconnected in middle of stream" -func (c *Context) Stream(step func(w io.Writer) bool) bool { - w := c.Writer - clientGone := w.CloseNotify() - for { - select { - case <-clientGone: - return true - default: - keepOpen := step(w) - w.Flush() - if !keepOpen { - return false - } - } - } -} - -/************************************/ -/******** CONTENT NEGOTIATION *******/ -/************************************/ - -// Negotiate contains all negotiations data. -type Negotiate struct { - Offered []string - HTMLName string - HTMLData interface{} - JSONData interface{} - XMLData interface{} - YAMLData interface{} - Data interface{} -} - -// Negotiate calls different Render according acceptable Accept format. -func (c *Context) Negotiate(code int, config Negotiate) { - switch c.NegotiateFormat(config.Offered...) { - case binding.MIMEJSON: - data := chooseData(config.JSONData, config.Data) - c.JSON(code, data) - - case binding.MIMEHTML: - data := chooseData(config.HTMLData, config.Data) - c.HTML(code, config.HTMLName, data) - - case binding.MIMEXML: - data := chooseData(config.XMLData, config.Data) - c.XML(code, data) - - case binding.MIMEYAML: - data := chooseData(config.YAMLData, config.Data) - c.YAML(code, data) - - default: - c.AbortWithError(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server")) // nolint: errcheck - } -} - -// NegotiateFormat returns an acceptable Accept format. -func (c *Context) NegotiateFormat(offered ...string) string { - assert1(len(offered) > 0, "you must provide at least one offer") - - if c.Accepted == nil { - c.Accepted = parseAccept(c.requestHeader("Accept")) - } - if len(c.Accepted) == 0 { - return offered[0] - } - for _, accepted := range c.Accepted { - for _, offer := range offered { - // According to RFC 2616 and RFC 2396, non-ASCII characters are not allowed in headers, - // therefore we can just iterate over the string without casting it into []rune - i := 0 - for ; i < len(accepted); i++ { - if accepted[i] == '*' || offer[i] == '*' { - return offer - } - if accepted[i] != offer[i] { - break - } - } - if i == len(accepted) { - return offer - } - } - } - return "" -} - -// SetAccepted sets Accept header data. -func (c *Context) SetAccepted(formats ...string) { - c.Accepted = formats -} - -/************************************/ -/***** GOLANG.ORG/X/NET/CONTEXT *****/ -/************************************/ - -// Deadline always returns that there is no deadline (ok==false), -// maybe you want to use Request.Context().Deadline() instead. -func (c *Context) Deadline() (deadline time.Time, ok bool) { - return -} - -// Done always returns nil (chan which will wait forever), -// if you want to abort your work when the connection was closed -// you should use Request.Context().Done() instead. -func (c *Context) Done() <-chan struct{} { - return nil -} - -// Err always returns nil, maybe you want to use Request.Context().Err() instead. -func (c *Context) Err() error { - return nil -} - -// Value returns the value associated with this context for key, or nil -// if no value is associated with key. Successive calls to Value with -// the same key returns the same result. -func (c *Context) Value(key interface{}) interface{} { - if key == 0 { - return c.Request - } - if keyAsString, ok := key.(string); ok { - val, _ := c.Get(keyAsString) - return val - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/context_appengine.go b/vendor/github.com/gin-gonic/gin/context_appengine.go deleted file mode 100644 index 38c189a0..00000000 --- a/vendor/github.com/gin-gonic/gin/context_appengine.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build appengine - -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -func init() { - defaultAppEngine = true -} diff --git a/vendor/github.com/gin-gonic/gin/debug.go b/vendor/github.com/gin-gonic/gin/debug.go deleted file mode 100644 index c66ca440..00000000 --- a/vendor/github.com/gin-gonic/gin/debug.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "html/template" - "runtime" - "strconv" - "strings" -) - -const ginSupportMinGoVer = 10 - -// IsDebugging returns true if the framework is running in debug mode. -// Use SetMode(gin.ReleaseMode) to disable debug mode. -func IsDebugging() bool { - return ginMode == debugCode -} - -// DebugPrintRouteFunc indicates debug log output format. -var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int) - -func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) { - if IsDebugging() { - nuHandlers := len(handlers) - handlerName := nameOfFunction(handlers.Last()) - if DebugPrintRouteFunc == nil { - debugPrint("%-6s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers) - } else { - DebugPrintRouteFunc(httpMethod, absolutePath, handlerName, nuHandlers) - } - } -} - -func debugPrintLoadTemplate(tmpl *template.Template) { - if IsDebugging() { - var buf strings.Builder - for _, tmpl := range tmpl.Templates() { - buf.WriteString("\t- ") - buf.WriteString(tmpl.Name()) - buf.WriteString("\n") - } - debugPrint("Loaded HTML Templates (%d): \n%s\n", len(tmpl.Templates()), buf.String()) - } -} - -func debugPrint(format string, values ...interface{}) { - if IsDebugging() { - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...) - } -} - -func getMinVer(v string) (uint64, error) { - first := strings.IndexByte(v, '.') - last := strings.LastIndexByte(v, '.') - if first == last { - return strconv.ParseUint(v[first+1:], 10, 64) - } - return strconv.ParseUint(v[first+1:last], 10, 64) -} - -func debugPrintWARNINGDefault() { - if v, e := getMinVer(runtime.Version()); e == nil && v <= ginSupportMinGoVer { - debugPrint(`[WARNING] Now Gin requires Go 1.11 or later and Go 1.12 will be required soon. - -`) - } - debugPrint(`[WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. - -`) -} - -func debugPrintWARNINGNew() { - debugPrint(`[WARNING] Running in "debug" mode. Switch to "release" mode in production. - - using env: export GIN_MODE=release - - using code: gin.SetMode(gin.ReleaseMode) - -`) -} - -func debugPrintWARNINGSetHTMLTemplate() { - debugPrint(`[WARNING] Since SetHTMLTemplate() is NOT thread-safe. It should only be called -at initialization. ie. before any route is registered or the router is listening in a socket: - - router := gin.Default() - router.SetHTMLTemplate(template) // << good place - -`) -} - -func debugPrintError(err error) { - if err != nil { - if IsDebugging() { - fmt.Fprintf(DefaultErrorWriter, "[GIN-debug] [ERROR] %v\n", err) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/deprecated.go b/vendor/github.com/gin-gonic/gin/deprecated.go deleted file mode 100644 index ab447429..00000000 --- a/vendor/github.com/gin-gonic/gin/deprecated.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "log" - - "github.com/gin-gonic/gin/binding" -) - -// BindWith binds the passed struct pointer using the specified binding engine. -// See the binding package. -func (c *Context) BindWith(obj interface{}, b binding.Binding) error { - log.Println(`BindWith(\"interface{}, binding.Binding\") error is going to - be deprecated, please check issue #662 and either use MustBindWith() if you - want HTTP 400 to be automatically returned if any error occur, or use - ShouldBindWith() if you need to manage the error.`) - return c.MustBindWith(obj, b) -} diff --git a/vendor/github.com/gin-gonic/gin/doc.go b/vendor/github.com/gin-gonic/gin/doc.go deleted file mode 100644 index 1bd03864..00000000 --- a/vendor/github.com/gin-gonic/gin/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -/* -Package gin implements a HTTP web framework called gin. - -See https://gin-gonic.com/ for more information about gin. -*/ -package gin // import "github.com/gin-gonic/gin" diff --git a/vendor/github.com/gin-gonic/gin/errors.go b/vendor/github.com/gin-gonic/gin/errors.go deleted file mode 100644 index 25e8ff60..00000000 --- a/vendor/github.com/gin-gonic/gin/errors.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "reflect" - "strings" - - "github.com/gin-gonic/gin/internal/json" -) - -// ErrorType is an unsigned 64-bit error code as defined in the gin spec. -type ErrorType uint64 - -const ( - // ErrorTypeBind is used when Context.Bind() fails. - ErrorTypeBind ErrorType = 1 << 63 - // ErrorTypeRender is used when Context.Render() fails. - ErrorTypeRender ErrorType = 1 << 62 - // ErrorTypePrivate indicates a private error. - ErrorTypePrivate ErrorType = 1 << 0 - // ErrorTypePublic indicates a public error. - ErrorTypePublic ErrorType = 1 << 1 - // ErrorTypeAny indicates any other error. - ErrorTypeAny ErrorType = 1<<64 - 1 - // ErrorTypeNu indicates any other error. - ErrorTypeNu = 2 -) - -// Error represents a error's specification. -type Error struct { - Err error - Type ErrorType - Meta interface{} -} - -type errorMsgs []*Error - -var _ error = &Error{} - -// SetType sets the error's type. -func (msg *Error) SetType(flags ErrorType) *Error { - msg.Type = flags - return msg -} - -// SetMeta sets the error's meta data. -func (msg *Error) SetMeta(data interface{}) *Error { - msg.Meta = data - return msg -} - -// JSON creates a properly formatted JSON -func (msg *Error) JSON() interface{} { - json := H{} - if msg.Meta != nil { - value := reflect.ValueOf(msg.Meta) - switch value.Kind() { - case reflect.Struct: - return msg.Meta - case reflect.Map: - for _, key := range value.MapKeys() { - json[key.String()] = value.MapIndex(key).Interface() - } - default: - json["meta"] = msg.Meta - } - } - if _, ok := json["error"]; !ok { - json["error"] = msg.Error() - } - return json -} - -// MarshalJSON implements the json.Marshaller interface. -func (msg *Error) MarshalJSON() ([]byte, error) { - return json.Marshal(msg.JSON()) -} - -// Error implements the error interface. -func (msg Error) Error() string { - return msg.Err.Error() -} - -// IsType judges one error. -func (msg *Error) IsType(flags ErrorType) bool { - return (msg.Type & flags) > 0 -} - -// ByType returns a readonly copy filtered the byte. -// ie ByType(gin.ErrorTypePublic) returns a slice of errors with type=ErrorTypePublic. -func (a errorMsgs) ByType(typ ErrorType) errorMsgs { - if len(a) == 0 { - return nil - } - if typ == ErrorTypeAny { - return a - } - var result errorMsgs - for _, msg := range a { - if msg.IsType(typ) { - result = append(result, msg) - } - } - return result -} - -// Last returns the last error in the slice. It returns nil if the array is empty. -// Shortcut for errors[len(errors)-1]. -func (a errorMsgs) Last() *Error { - if length := len(a); length > 0 { - return a[length-1] - } - return nil -} - -// Errors returns an array will all the error messages. -// Example: -// c.Error(errors.New("first")) -// c.Error(errors.New("second")) -// c.Error(errors.New("third")) -// c.Errors.Errors() // == []string{"first", "second", "third"} -func (a errorMsgs) Errors() []string { - if len(a) == 0 { - return nil - } - errorStrings := make([]string, len(a)) - for i, err := range a { - errorStrings[i] = err.Error() - } - return errorStrings -} - -func (a errorMsgs) JSON() interface{} { - switch len(a) { - case 0: - return nil - case 1: - return a.Last().JSON() - default: - json := make([]interface{}, len(a)) - for i, err := range a { - json[i] = err.JSON() - } - return json - } -} - -// MarshalJSON implements the json.Marshaller interface. -func (a errorMsgs) MarshalJSON() ([]byte, error) { - return json.Marshal(a.JSON()) -} - -func (a errorMsgs) String() string { - if len(a) == 0 { - return "" - } - var buffer strings.Builder - for i, msg := range a { - fmt.Fprintf(&buffer, "Error #%02d: %s\n", i+1, msg.Err) - if msg.Meta != nil { - fmt.Fprintf(&buffer, " Meta: %v\n", msg.Meta) - } - } - return buffer.String() -} diff --git a/vendor/github.com/gin-gonic/gin/fs.go b/vendor/github.com/gin-gonic/gin/fs.go deleted file mode 100644 index 7a6738a6..00000000 --- a/vendor/github.com/gin-gonic/gin/fs.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "net/http" - "os" -) - -type onlyfilesFS struct { - fs http.FileSystem -} - -type neuteredReaddirFile struct { - http.File -} - -// Dir returns a http.Filesystem that can be used by http.FileServer(). It is used internally -// in router.Static(). -// if listDirectory == true, then it works the same as http.Dir() otherwise it returns -// a filesystem that prevents http.FileServer() to list the directory files. -func Dir(root string, listDirectory bool) http.FileSystem { - fs := http.Dir(root) - if listDirectory { - return fs - } - return &onlyfilesFS{fs} -} - -// Open conforms to http.Filesystem. -func (fs onlyfilesFS) Open(name string) (http.File, error) { - f, err := fs.fs.Open(name) - if err != nil { - return nil, err - } - return neuteredReaddirFile{f}, nil -} - -// Readdir overrides the http.File default implementation. -func (f neuteredReaddirFile) Readdir(count int) ([]os.FileInfo, error) { - // this disables directory listing - return nil, nil -} diff --git a/vendor/github.com/gin-gonic/gin/gin.go b/vendor/github.com/gin-gonic/gin/gin.go deleted file mode 100644 index ab1d0a46..00000000 --- a/vendor/github.com/gin-gonic/gin/gin.go +++ /dev/null @@ -1,497 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "html/template" - "net" - "net/http" - "os" - "path" - "sync" - - "github.com/gin-gonic/gin/internal/bytesconv" - "github.com/gin-gonic/gin/render" -) - -const defaultMultipartMemory = 32 << 20 // 32 MB - -var ( - default404Body = []byte("404 page not found") - default405Body = []byte("405 method not allowed") - defaultAppEngine bool -) - -// HandlerFunc defines the handler used by gin middleware as return value. -type HandlerFunc func(*Context) - -// HandlersChain defines a HandlerFunc array. -type HandlersChain []HandlerFunc - -// Last returns the last handler in the chain. ie. the last handler is the main one. -func (c HandlersChain) Last() HandlerFunc { - if length := len(c); length > 0 { - return c[length-1] - } - return nil -} - -// RouteInfo represents a request route's specification which contains method and path and its handler. -type RouteInfo struct { - Method string - Path string - Handler string - HandlerFunc HandlerFunc -} - -// RoutesInfo defines a RouteInfo array. -type RoutesInfo []RouteInfo - -// Engine is the framework's instance, it contains the muxer, middleware and configuration settings. -// Create an instance of Engine, by using New() or Default() -type Engine struct { - RouterGroup - - // Enables automatic redirection if the current route can't be matched but a - // handler for the path with (without) the trailing slash exists. - // For example if /foo/ is requested but a route only exists for /foo, the - // client is redirected to /foo with http status code 301 for GET requests - // and 307 for all other request methods. - RedirectTrailingSlash bool - - // If enabled, the router tries to fix the current request path, if no - // handle is registered for it. - // First superfluous path elements like ../ or // are removed. - // Afterwards the router does a case-insensitive lookup of the cleaned path. - // If a handle can be found for this route, the router makes a redirection - // to the corrected path with status code 301 for GET requests and 307 for - // all other request methods. - // For example /FOO and /..//Foo could be redirected to /foo. - // RedirectTrailingSlash is independent of this option. - RedirectFixedPath bool - - // If enabled, the router checks if another method is allowed for the - // current route, if the current request can not be routed. - // If this is the case, the request is answered with 'Method Not Allowed' - // and HTTP status code 405. - // If no other Method is allowed, the request is delegated to the NotFound - // handler. - HandleMethodNotAllowed bool - ForwardedByClientIP bool - - // #726 #755 If enabled, it will thrust some headers starting with - // 'X-AppEngine...' for better integration with that PaaS. - AppEngine bool - - // If enabled, the url.RawPath will be used to find parameters. - UseRawPath bool - - // If true, the path value will be unescaped. - // If UseRawPath is false (by default), the UnescapePathValues effectively is true, - // as url.Path gonna be used, which is already unescaped. - UnescapePathValues bool - - // Value of 'maxMemory' param that is given to http.Request's ParseMultipartForm - // method call. - MaxMultipartMemory int64 - - // RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes. - // See the PR #1817 and issue #1644 - RemoveExtraSlash bool - - delims render.Delims - secureJsonPrefix string - HTMLRender render.HTMLRender - FuncMap template.FuncMap - allNoRoute HandlersChain - allNoMethod HandlersChain - noRoute HandlersChain - noMethod HandlersChain - pool sync.Pool - trees methodTrees -} - -var _ IRouter = &Engine{} - -// New returns a new blank Engine instance without any middleware attached. -// By default the configuration is: -// - RedirectTrailingSlash: true -// - RedirectFixedPath: false -// - HandleMethodNotAllowed: false -// - ForwardedByClientIP: true -// - UseRawPath: false -// - UnescapePathValues: true -func New() *Engine { - debugPrintWARNINGNew() - engine := &Engine{ - RouterGroup: RouterGroup{ - Handlers: nil, - basePath: "/", - root: true, - }, - FuncMap: template.FuncMap{}, - RedirectTrailingSlash: true, - RedirectFixedPath: false, - HandleMethodNotAllowed: false, - ForwardedByClientIP: true, - AppEngine: defaultAppEngine, - UseRawPath: false, - RemoveExtraSlash: false, - UnescapePathValues: true, - MaxMultipartMemory: defaultMultipartMemory, - trees: make(methodTrees, 0, 9), - delims: render.Delims{Left: "{{", Right: "}}"}, - secureJsonPrefix: "while(1);", - } - engine.RouterGroup.engine = engine - engine.pool.New = func() interface{} { - return engine.allocateContext() - } - return engine -} - -// Default returns an Engine instance with the Logger and Recovery middleware already attached. -func Default() *Engine { - debugPrintWARNINGDefault() - engine := New() - engine.Use(Logger(), Recovery()) - return engine -} - -func (engine *Engine) allocateContext() *Context { - return &Context{engine: engine} -} - -// Delims sets template left and right delims and returns a Engine instance. -func (engine *Engine) Delims(left, right string) *Engine { - engine.delims = render.Delims{Left: left, Right: right} - return engine -} - -// SecureJsonPrefix sets the secureJsonPrefix used in Context.SecureJSON. -func (engine *Engine) SecureJsonPrefix(prefix string) *Engine { - engine.secureJsonPrefix = prefix - return engine -} - -// LoadHTMLGlob loads HTML files identified by glob pattern -// and associates the result with HTML renderer. -func (engine *Engine) LoadHTMLGlob(pattern string) { - left := engine.delims.Left - right := engine.delims.Right - templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern)) - - if IsDebugging() { - debugPrintLoadTemplate(templ) - engine.HTMLRender = render.HTMLDebug{Glob: pattern, FuncMap: engine.FuncMap, Delims: engine.delims} - return - } - - engine.SetHTMLTemplate(templ) -} - -// LoadHTMLFiles loads a slice of HTML files -// and associates the result with HTML renderer. -func (engine *Engine) LoadHTMLFiles(files ...string) { - if IsDebugging() { - engine.HTMLRender = render.HTMLDebug{Files: files, FuncMap: engine.FuncMap, Delims: engine.delims} - return - } - - templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...)) - engine.SetHTMLTemplate(templ) -} - -// SetHTMLTemplate associate a template with HTML renderer. -func (engine *Engine) SetHTMLTemplate(templ *template.Template) { - if len(engine.trees) > 0 { - debugPrintWARNINGSetHTMLTemplate() - } - - engine.HTMLRender = render.HTMLProduction{Template: templ.Funcs(engine.FuncMap)} -} - -// SetFuncMap sets the FuncMap used for template.FuncMap. -func (engine *Engine) SetFuncMap(funcMap template.FuncMap) { - engine.FuncMap = funcMap -} - -// NoRoute adds handlers for NoRoute. It return a 404 code by default. -func (engine *Engine) NoRoute(handlers ...HandlerFunc) { - engine.noRoute = handlers - engine.rebuild404Handlers() -} - -// NoMethod sets the handlers called when... TODO. -func (engine *Engine) NoMethod(handlers ...HandlerFunc) { - engine.noMethod = handlers - engine.rebuild405Handlers() -} - -// Use attaches a global middleware to the router. ie. the middleware attached though Use() will be -// included in the handlers chain for every single request. Even 404, 405, static files... -// For example, this is the right place for a logger or error management middleware. -func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes { - engine.RouterGroup.Use(middleware...) - engine.rebuild404Handlers() - engine.rebuild405Handlers() - return engine -} - -func (engine *Engine) rebuild404Handlers() { - engine.allNoRoute = engine.combineHandlers(engine.noRoute) -} - -func (engine *Engine) rebuild405Handlers() { - engine.allNoMethod = engine.combineHandlers(engine.noMethod) -} - -func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { - assert1(path[0] == '/', "path must begin with '/'") - assert1(method != "", "HTTP method can not be empty") - assert1(len(handlers) > 0, "there must be at least one handler") - - debugPrintRoute(method, path, handlers) - root := engine.trees.get(method) - if root == nil { - root = new(node) - root.fullPath = "/" - engine.trees = append(engine.trees, methodTree{method: method, root: root}) - } - root.addRoute(path, handlers) -} - -// Routes returns a slice of registered routes, including some useful information, such as: -// the http method, path and the handler name. -func (engine *Engine) Routes() (routes RoutesInfo) { - for _, tree := range engine.trees { - routes = iterate("", tree.method, routes, tree.root) - } - return routes -} - -func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo { - path += root.path - if len(root.handlers) > 0 { - handlerFunc := root.handlers.Last() - routes = append(routes, RouteInfo{ - Method: method, - Path: path, - Handler: nameOfFunction(handlerFunc), - HandlerFunc: handlerFunc, - }) - } - for _, child := range root.children { - routes = iterate(path, method, routes, child) - } - return routes -} - -// Run attaches the router to a http.Server and starts listening and serving HTTP requests. -// It is a shortcut for http.ListenAndServe(addr, router) -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) Run(addr ...string) (err error) { - defer func() { debugPrintError(err) }() - - address := resolveAddress(addr) - debugPrint("Listening and serving HTTP on %s\n", address) - err = http.ListenAndServe(address, engine) - return -} - -// RunTLS attaches the router to a http.Server and starts listening and serving HTTPS (secure) requests. -// It is a shortcut for http.ListenAndServeTLS(addr, certFile, keyFile, router) -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) { - debugPrint("Listening and serving HTTPS on %s\n", addr) - defer func() { debugPrintError(err) }() - - err = http.ListenAndServeTLS(addr, certFile, keyFile, engine) - return -} - -// RunUnix attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified unix socket (ie. a file). -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunUnix(file string) (err error) { - debugPrint("Listening and serving HTTP on unix:/%s", file) - defer func() { debugPrintError(err) }() - - listener, err := net.Listen("unix", file) - if err != nil { - return - } - defer listener.Close() - defer os.Remove(file) - - err = http.Serve(listener, engine) - return -} - -// RunFd attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified file descriptor. -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunFd(fd int) (err error) { - debugPrint("Listening and serving HTTP on fd@%d", fd) - defer func() { debugPrintError(err) }() - - f := os.NewFile(uintptr(fd), fmt.Sprintf("fd@%d", fd)) - listener, err := net.FileListener(f) - if err != nil { - return - } - defer listener.Close() - err = engine.RunListener(listener) - return -} - -// RunListener attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified net.Listener -func (engine *Engine) RunListener(listener net.Listener) (err error) { - debugPrint("Listening and serving HTTP on listener what's bind with address@%s", listener.Addr()) - defer func() { debugPrintError(err) }() - err = http.Serve(listener, engine) - return -} - -// ServeHTTP conforms to the http.Handler interface. -func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { - c := engine.pool.Get().(*Context) - c.writermem.reset(w) - c.Request = req - c.reset() - - engine.handleHTTPRequest(c) - - engine.pool.Put(c) -} - -// HandleContext re-enter a context that has been rewritten. -// This can be done by setting c.Request.URL.Path to your new target. -// Disclaimer: You can loop yourself to death with this, use wisely. -func (engine *Engine) HandleContext(c *Context) { - oldIndexValue := c.index - c.reset() - engine.handleHTTPRequest(c) - - c.index = oldIndexValue -} - -func (engine *Engine) handleHTTPRequest(c *Context) { - httpMethod := c.Request.Method - rPath := c.Request.URL.Path - unescape := false - if engine.UseRawPath && len(c.Request.URL.RawPath) > 0 { - rPath = c.Request.URL.RawPath - unescape = engine.UnescapePathValues - } - - if engine.RemoveExtraSlash { - rPath = cleanPath(rPath) - } - - // Find root of the tree for the given HTTP method - t := engine.trees - for i, tl := 0, len(t); i < tl; i++ { - if t[i].method != httpMethod { - continue - } - root := t[i].root - // Find route in tree - value := root.getValue(rPath, c.Params, unescape) - if value.handlers != nil { - c.handlers = value.handlers - c.Params = value.params - c.fullPath = value.fullPath - c.Next() - c.writermem.WriteHeaderNow() - return - } - if httpMethod != "CONNECT" && rPath != "/" { - if value.tsr && engine.RedirectTrailingSlash { - redirectTrailingSlash(c) - return - } - if engine.RedirectFixedPath && redirectFixedPath(c, root, engine.RedirectFixedPath) { - return - } - } - break - } - - if engine.HandleMethodNotAllowed { - for _, tree := range engine.trees { - if tree.method == httpMethod { - continue - } - if value := tree.root.getValue(rPath, nil, unescape); value.handlers != nil { - c.handlers = engine.allNoMethod - serveError(c, http.StatusMethodNotAllowed, default405Body) - return - } - } - } - c.handlers = engine.allNoRoute - serveError(c, http.StatusNotFound, default404Body) -} - -var mimePlain = []string{MIMEPlain} - -func serveError(c *Context, code int, defaultMessage []byte) { - c.writermem.status = code - c.Next() - if c.writermem.Written() { - return - } - if c.writermem.Status() == code { - c.writermem.Header()["Content-Type"] = mimePlain - _, err := c.Writer.Write(defaultMessage) - if err != nil { - debugPrint("cannot write message to writer during serve error: %v", err) - } - return - } - c.writermem.WriteHeaderNow() -} - -func redirectTrailingSlash(c *Context) { - req := c.Request - p := req.URL.Path - if prefix := path.Clean(c.Request.Header.Get("X-Forwarded-Prefix")); prefix != "." { - p = prefix + "/" + req.URL.Path - } - req.URL.Path = p + "/" - if length := len(p); length > 1 && p[length-1] == '/' { - req.URL.Path = p[:length-1] - } - redirectRequest(c) -} - -func redirectFixedPath(c *Context, root *node, trailingSlash bool) bool { - req := c.Request - rPath := req.URL.Path - - if fixedPath, ok := root.findCaseInsensitivePath(cleanPath(rPath), trailingSlash); ok { - req.URL.Path = bytesconv.BytesToString(fixedPath) - redirectRequest(c) - return true - } - return false -} - -func redirectRequest(c *Context) { - req := c.Request - rPath := req.URL.Path - rURL := req.URL.String() - - code := http.StatusMovedPermanently // Permanent redirect, request with GET method - if req.Method != http.MethodGet { - code = http.StatusTemporaryRedirect - } - debugPrint("redirecting request %d: %s --> %s", code, rPath, rURL) - http.Redirect(c.Writer, req, rURL, code) - c.writermem.WriteHeaderNow() -} diff --git a/vendor/github.com/gin-gonic/gin/go.mod b/vendor/github.com/gin-gonic/gin/go.mod deleted file mode 100644 index cfaee746..00000000 --- a/vendor/github.com/gin-gonic/gin/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/gin-gonic/gin - -go 1.13 - -require ( - github.com/gin-contrib/sse v0.1.0 - github.com/go-playground/validator/v10 v10.2.0 - github.com/golang/protobuf v1.3.3 - github.com/json-iterator/go v1.1.9 - github.com/mattn/go-isatty v0.0.12 - github.com/stretchr/testify v1.4.0 - github.com/ugorji/go/codec v1.1.7 - gopkg.in/yaml.v2 v2.2.8 -) diff --git a/vendor/github.com/gin-gonic/gin/go.sum b/vendor/github.com/gin-gonic/gin/go.sum deleted file mode 100644 index 4c14fb83..00000000 --- a/vendor/github.com/gin-gonic/gin/go.sum +++ /dev/null @@ -1,45 +0,0 @@ -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/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go b/vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go deleted file mode 100644 index 32c2b59e..00000000 --- a/vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go +++ /dev/null @@ -1,19 +0,0 @@ -package bytesconv - -import ( - "reflect" - "unsafe" -) - -// StringToBytes converts string to byte slice without a memory allocation. -func StringToBytes(s string) (b []byte) { - sh := *(*reflect.StringHeader)(unsafe.Pointer(&s)) - bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - bh.Data, bh.Len, bh.Cap = sh.Data, sh.Len, sh.Len - return b -} - -// BytesToString converts byte slice to string without a memory allocation. -func BytesToString(b []byte) string { - return *(*string)(unsafe.Pointer(&b)) -} diff --git a/vendor/github.com/gin-gonic/gin/internal/json/json.go b/vendor/github.com/gin-gonic/gin/internal/json/json.go deleted file mode 100644 index 480e8bff..00000000 --- a/vendor/github.com/gin-gonic/gin/internal/json/json.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 Bo-Yi Wu. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build !jsoniter - -package json - -import "encoding/json" - -var ( - // Marshal is exported by gin/json package. - Marshal = json.Marshal - // Unmarshal is exported by gin/json package. - Unmarshal = json.Unmarshal - // MarshalIndent is exported by gin/json package. - MarshalIndent = json.MarshalIndent - // NewDecoder is exported by gin/json package. - NewDecoder = json.NewDecoder - // NewEncoder is exported by gin/json package. - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go b/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go deleted file mode 100644 index fabd7b84..00000000 --- a/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 Bo-Yi Wu. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build jsoniter - -package json - -import "github.com/json-iterator/go" - -var ( - json = jsoniter.ConfigCompatibleWithStandardLibrary - // Marshal is exported by gin/json package. - Marshal = json.Marshal - // Unmarshal is exported by gin/json package. - Unmarshal = json.Unmarshal - // MarshalIndent is exported by gin/json package. - MarshalIndent = json.MarshalIndent - // NewDecoder is exported by gin/json package. - NewDecoder = json.NewDecoder - // NewEncoder is exported by gin/json package. - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/gin-gonic/gin/logger.go b/vendor/github.com/gin-gonic/gin/logger.go deleted file mode 100644 index d361b74d..00000000 --- a/vendor/github.com/gin-gonic/gin/logger.go +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "io" - "net/http" - "os" - "time" - - "github.com/mattn/go-isatty" -) - -type consoleColorModeValue int - -const ( - autoColor consoleColorModeValue = iota - disableColor - forceColor -) - -const ( - green = "\033[97;42m" - white = "\033[90;47m" - yellow = "\033[90;43m" - red = "\033[97;41m" - blue = "\033[97;44m" - magenta = "\033[97;45m" - cyan = "\033[97;46m" - reset = "\033[0m" -) - -var consoleColorMode = autoColor - -// LoggerConfig defines the config for Logger middleware. -type LoggerConfig struct { - // Optional. Default value is gin.defaultLogFormatter - Formatter LogFormatter - - // Output is a writer where logs are written. - // Optional. Default value is gin.DefaultWriter. - Output io.Writer - - // SkipPaths is a url path array which logs are not written. - // Optional. - SkipPaths []string -} - -// LogFormatter gives the signature of the formatter function passed to LoggerWithFormatter -type LogFormatter func(params LogFormatterParams) string - -// LogFormatterParams is the structure any formatter will be handed when time to log comes -type LogFormatterParams struct { - Request *http.Request - - // TimeStamp shows the time after the server returns a response. - TimeStamp time.Time - // StatusCode is HTTP response code. - StatusCode int - // Latency is how much time the server cost to process a certain request. - Latency time.Duration - // ClientIP equals Context's ClientIP method. - ClientIP string - // Method is the HTTP method given to the request. - Method string - // Path is a path the client requests. - Path string - // ErrorMessage is set if error has occurred in processing the request. - ErrorMessage string - // isTerm shows whether does gin's output descriptor refers to a terminal. - isTerm bool - // BodySize is the size of the Response Body - BodySize int - // Keys are the keys set on the request's context. - Keys map[string]interface{} -} - -// StatusCodeColor is the ANSI color for appropriately logging http status code to a terminal. -func (p *LogFormatterParams) StatusCodeColor() string { - code := p.StatusCode - - switch { - case code >= http.StatusOK && code < http.StatusMultipleChoices: - return green - case code >= http.StatusMultipleChoices && code < http.StatusBadRequest: - return white - case code >= http.StatusBadRequest && code < http.StatusInternalServerError: - return yellow - default: - return red - } -} - -// MethodColor is the ANSI color for appropriately logging http method to a terminal. -func (p *LogFormatterParams) MethodColor() string { - method := p.Method - - switch method { - case http.MethodGet: - return blue - case http.MethodPost: - return cyan - case http.MethodPut: - return yellow - case http.MethodDelete: - return red - case http.MethodPatch: - return green - case http.MethodHead: - return magenta - case http.MethodOptions: - return white - default: - return reset - } -} - -// ResetColor resets all escape attributes. -func (p *LogFormatterParams) ResetColor() string { - return reset -} - -// IsOutputColor indicates whether can colors be outputted to the log. -func (p *LogFormatterParams) IsOutputColor() bool { - return consoleColorMode == forceColor || (consoleColorMode == autoColor && p.isTerm) -} - -// defaultLogFormatter is the default log format function Logger middleware uses. -var defaultLogFormatter = func(param LogFormatterParams) string { - var statusColor, methodColor, resetColor string - if param.IsOutputColor() { - statusColor = param.StatusCodeColor() - methodColor = param.MethodColor() - resetColor = param.ResetColor() - } - - if param.Latency > time.Minute { - // Truncate in a golang < 1.8 safe way - param.Latency = param.Latency - param.Latency%time.Second - } - return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %#v\n%s", - param.TimeStamp.Format("2006/01/02 - 15:04:05"), - statusColor, param.StatusCode, resetColor, - param.Latency, - param.ClientIP, - methodColor, param.Method, resetColor, - param.Path, - param.ErrorMessage, - ) -} - -// DisableConsoleColor disables color output in the console. -func DisableConsoleColor() { - consoleColorMode = disableColor -} - -// ForceConsoleColor force color output in the console. -func ForceConsoleColor() { - consoleColorMode = forceColor -} - -// ErrorLogger returns a handlerfunc for any error type. -func ErrorLogger() HandlerFunc { - return ErrorLoggerT(ErrorTypeAny) -} - -// ErrorLoggerT returns a handlerfunc for a given error type. -func ErrorLoggerT(typ ErrorType) HandlerFunc { - return func(c *Context) { - c.Next() - errors := c.Errors.ByType(typ) - if len(errors) > 0 { - c.JSON(-1, errors) - } - } -} - -// Logger instances a Logger middleware that will write the logs to gin.DefaultWriter. -// By default gin.DefaultWriter = os.Stdout. -func Logger() HandlerFunc { - return LoggerWithConfig(LoggerConfig{}) -} - -// LoggerWithFormatter instance a Logger middleware with the specified log format function. -func LoggerWithFormatter(f LogFormatter) HandlerFunc { - return LoggerWithConfig(LoggerConfig{ - Formatter: f, - }) -} - -// LoggerWithWriter instance a Logger middleware with the specified writer buffer. -// Example: os.Stdout, a file opened in write mode, a socket... -func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc { - return LoggerWithConfig(LoggerConfig{ - Output: out, - SkipPaths: notlogged, - }) -} - -// LoggerWithConfig instance a Logger middleware with config. -func LoggerWithConfig(conf LoggerConfig) HandlerFunc { - formatter := conf.Formatter - if formatter == nil { - formatter = defaultLogFormatter - } - - out := conf.Output - if out == nil { - out = DefaultWriter - } - - notlogged := conf.SkipPaths - - isTerm := true - - if w, ok := out.(*os.File); !ok || os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd())) { - isTerm = false - } - - var skip map[string]struct{} - - if length := len(notlogged); length > 0 { - skip = make(map[string]struct{}, length) - - for _, path := range notlogged { - skip[path] = struct{}{} - } - } - - return func(c *Context) { - // Start timer - start := time.Now() - path := c.Request.URL.Path - raw := c.Request.URL.RawQuery - - // Process request - c.Next() - - // Log only when path is not being skipped - if _, ok := skip[path]; !ok { - param := LogFormatterParams{ - Request: c.Request, - isTerm: isTerm, - Keys: c.Keys, - } - - // Stop timer - param.TimeStamp = time.Now() - param.Latency = param.TimeStamp.Sub(start) - - param.ClientIP = c.ClientIP() - param.Method = c.Request.Method - param.StatusCode = c.Writer.Status() - param.ErrorMessage = c.Errors.ByType(ErrorTypePrivate).String() - - param.BodySize = c.Writer.Size() - - if raw != "" { - path = path + "?" + raw - } - - param.Path = path - - fmt.Fprint(out, formatter(param)) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/mode.go b/vendor/github.com/gin-gonic/gin/mode.go deleted file mode 100644 index edfc2940..00000000 --- a/vendor/github.com/gin-gonic/gin/mode.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "io" - "os" - - "github.com/gin-gonic/gin/binding" -) - -// EnvGinMode indicates environment name for gin mode. -const EnvGinMode = "GIN_MODE" - -const ( - // DebugMode indicates gin mode is debug. - DebugMode = "debug" - // ReleaseMode indicates gin mode is release. - ReleaseMode = "release" - // TestMode indicates gin mode is test. - TestMode = "test" -) -const ( - debugCode = iota - releaseCode - testCode -) - -// DefaultWriter is the default io.Writer used by Gin for debug output and -// middleware output like Logger() or Recovery(). -// Note that both Logger and Recovery provides custom ways to configure their -// output io.Writer. -// To support coloring in Windows use: -// import "github.com/mattn/go-colorable" -// gin.DefaultWriter = colorable.NewColorableStdout() -var DefaultWriter io.Writer = os.Stdout - -// DefaultErrorWriter is the default io.Writer used by Gin to debug errors -var DefaultErrorWriter io.Writer = os.Stderr - -var ginMode = debugCode -var modeName = DebugMode - -func init() { - mode := os.Getenv(EnvGinMode) - SetMode(mode) -} - -// SetMode sets gin mode according to input string. -func SetMode(value string) { - switch value { - case DebugMode, "": - ginMode = debugCode - case ReleaseMode: - ginMode = releaseCode - case TestMode: - ginMode = testCode - default: - panic("gin mode unknown: " + value) - } - if value == "" { - value = DebugMode - } - modeName = value -} - -// DisableBindValidation closes the default validator. -func DisableBindValidation() { - binding.Validator = nil -} - -// EnableJsonDecoderUseNumber sets true for binding.EnableDecoderUseNumber to -// call the UseNumber method on the JSON Decoder instance. -func EnableJsonDecoderUseNumber() { - binding.EnableDecoderUseNumber = true -} - -// EnableJsonDecoderDisallowUnknownFields sets true for binding.EnableDecoderDisallowUnknownFields to -// call the DisallowUnknownFields method on the JSON Decoder instance. -func EnableJsonDecoderDisallowUnknownFields() { - binding.EnableDecoderDisallowUnknownFields = true -} - -// Mode returns currently gin mode. -func Mode() string { - return modeName -} diff --git a/vendor/github.com/gin-gonic/gin/path.go b/vendor/github.com/gin-gonic/gin/path.go deleted file mode 100644 index 51346e4a..00000000 --- a/vendor/github.com/gin-gonic/gin/path.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2013 Julien Schmidt. All rights reserved. -// Based on the path package, Copyright 2009 The Go Authors. -// Use of this source code is governed by a BSD-style license that can be found -// at https://github.com/julienschmidt/httprouter/blob/master/LICENSE. - -package gin - -// cleanPath is the URL version of path.Clean, it returns a canonical URL path -// for p, eliminating . and .. elements. -// -// The following rules are applied iteratively until no further processing can -// be done: -// 1. Replace multiple slashes with a single slash. -// 2. Eliminate each . path name element (the current directory). -// 3. Eliminate each inner .. path name element (the parent directory) -// along with the non-.. element that precedes it. -// 4. Eliminate .. elements that begin a rooted path: -// that is, replace "/.." by "/" at the beginning of a path. -// -// If the result of this process is an empty string, "/" is returned. -func cleanPath(p string) string { - const stackBufSize = 128 - // Turn empty string into "/" - if p == "" { - return "/" - } - - // Reasonably sized buffer on stack to avoid allocations in the common case. - // If a larger buffer is required, it gets allocated dynamically. - buf := make([]byte, 0, stackBufSize) - - n := len(p) - - // Invariants: - // reading from path; r is index of next byte to process. - // writing to buf; w is index of next byte to write. - - // path must start with '/' - r := 1 - w := 1 - - if p[0] != '/' { - r = 0 - - if n+1 > stackBufSize { - buf = make([]byte, n+1) - } else { - buf = buf[:n+1] - } - buf[0] = '/' - } - - trailing := n > 1 && p[n-1] == '/' - - // A bit more clunky without a 'lazybuf' like the path package, but the loop - // gets completely inlined (bufApp calls). - // loop has no expensive function calls (except 1x make) // So in contrast to the path package this loop has no expensive function - // calls (except make, if needed). - - for r < n { - switch { - case p[r] == '/': - // empty path element, trailing slash is added after the end - r++ - - case p[r] == '.' && r+1 == n: - trailing = true - r++ - - case p[r] == '.' && p[r+1] == '/': - // . element - r += 2 - - case p[r] == '.' && p[r+1] == '.' && (r+2 == n || p[r+2] == '/'): - // .. element: remove to last / - r += 3 - - if w > 1 { - // can backtrack - w-- - - if len(buf) == 0 { - for w > 1 && p[w] != '/' { - w-- - } - } else { - for w > 1 && buf[w] != '/' { - w-- - } - } - } - - default: - // Real path element. - // Add slash if needed - if w > 1 { - bufApp(&buf, p, w, '/') - w++ - } - - // Copy element - for r < n && p[r] != '/' { - bufApp(&buf, p, w, p[r]) - w++ - r++ - } - } - } - - // Re-append trailing slash - if trailing && w > 1 { - bufApp(&buf, p, w, '/') - w++ - } - - // If the original string was not modified (or only shortened at the end), - // return the respective substring of the original string. - // Otherwise return a new string from the buffer. - if len(buf) == 0 { - return p[:w] - } - return string(buf[:w]) -} - -// Internal helper to lazily create a buffer if necessary. -// Calls to this function get inlined. -func bufApp(buf *[]byte, s string, w int, c byte) { - b := *buf - if len(b) == 0 { - // No modification of the original string so far. - // If the next character is the same as in the original string, we do - // not yet have to allocate a buffer. - if s[w] == c { - return - } - - // Otherwise use either the stack buffer, if it is large enough, or - // allocate a new buffer on the heap, and copy all previous characters. - if l := len(s); l > cap(b) { - *buf = make([]byte, len(s)) - } else { - *buf = (*buf)[:l] - } - b = *buf - - copy(b, s[:w]) - } - b[w] = c -} diff --git a/vendor/github.com/gin-gonic/gin/recovery.go b/vendor/github.com/gin-gonic/gin/recovery.go deleted file mode 100644 index bc946c03..00000000 --- a/vendor/github.com/gin-gonic/gin/recovery.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "log" - "net" - "net/http" - "net/http/httputil" - "os" - "runtime" - "strings" - "time" -) - -var ( - dunno = []byte("???") - centerDot = []byte("·") - dot = []byte(".") - slash = []byte("/") -) - -// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one. -func Recovery() HandlerFunc { - return RecoveryWithWriter(DefaultErrorWriter) -} - -// RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one. -func RecoveryWithWriter(out io.Writer) HandlerFunc { - var logger *log.Logger - if out != nil { - logger = log.New(out, "\n\n\x1b[31m", log.LstdFlags) - } - return func(c *Context) { - defer func() { - if err := recover(); err != nil { - // Check for a broken connection, as it is not really a - // condition that warrants a panic stack trace. - var brokenPipe bool - if ne, ok := err.(*net.OpError); ok { - if se, ok := ne.Err.(*os.SyscallError); ok { - if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") { - brokenPipe = true - } - } - } - if logger != nil { - stack := stack(3) - httpRequest, _ := httputil.DumpRequest(c.Request, false) - headers := strings.Split(string(httpRequest), "\r\n") - for idx, header := range headers { - current := strings.Split(header, ":") - if current[0] == "Authorization" { - headers[idx] = current[0] + ": *" - } - } - if brokenPipe { - logger.Printf("%s\n%s%s", err, string(httpRequest), reset) - } else if IsDebugging() { - logger.Printf("[Recovery] %s panic recovered:\n%s\n%s\n%s%s", - timeFormat(time.Now()), strings.Join(headers, "\r\n"), err, stack, reset) - } else { - logger.Printf("[Recovery] %s panic recovered:\n%s\n%s%s", - timeFormat(time.Now()), err, stack, reset) - } - } - - // If the connection is dead, we can't write a status to it. - if brokenPipe { - c.Error(err.(error)) // nolint: errcheck - c.Abort() - } else { - c.AbortWithStatus(http.StatusInternalServerError) - } - } - }() - c.Next() - } -} - -// stack returns a nicely formatted stack frame, skipping skip frames. -func stack(skip int) []byte { - buf := new(bytes.Buffer) // the returned data - // As we loop, we open files and read them. These variables record the currently - // loaded file. - var lines [][]byte - var lastFile string - for i := skip; ; i++ { // Skip the expected number of frames - pc, file, line, ok := runtime.Caller(i) - if !ok { - break - } - // Print this much at least. If we can't find the source, it won't show. - fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc) - if file != lastFile { - data, err := ioutil.ReadFile(file) - if err != nil { - continue - } - lines = bytes.Split(data, []byte{'\n'}) - lastFile = file - } - fmt.Fprintf(buf, "\t%s: %s\n", function(pc), source(lines, line)) - } - return buf.Bytes() -} - -// source returns a space-trimmed slice of the n'th line. -func source(lines [][]byte, n int) []byte { - n-- // in stack trace, lines are 1-indexed but our array is 0-indexed - if n < 0 || n >= len(lines) { - return dunno - } - return bytes.TrimSpace(lines[n]) -} - -// function returns, if possible, the name of the function containing the PC. -func function(pc uintptr) []byte { - fn := runtime.FuncForPC(pc) - if fn == nil { - return dunno - } - name := []byte(fn.Name()) - // The name includes the path name to the package, which is unnecessary - // since the file name is already included. Plus, it has center dots. - // That is, we see - // runtime/debug.*T·ptrmethod - // and want - // *T.ptrmethod - // Also the package path might contains dot (e.g. code.google.com/...), - // so first eliminate the path prefix - if lastSlash := bytes.LastIndex(name, slash); lastSlash >= 0 { - name = name[lastSlash+1:] - } - if period := bytes.Index(name, dot); period >= 0 { - name = name[period+1:] - } - name = bytes.Replace(name, centerDot, dot, -1) - return name -} - -func timeFormat(t time.Time) string { - var timeString = t.Format("2006/01/02 - 15:04:05") - return timeString -} diff --git a/vendor/github.com/gin-gonic/gin/render/data.go b/vendor/github.com/gin-gonic/gin/render/data.go deleted file mode 100644 index 6ba657ba..00000000 --- a/vendor/github.com/gin-gonic/gin/render/data.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import "net/http" - -// Data contains ContentType and bytes data. -type Data struct { - ContentType string - Data []byte -} - -// Render (Data) writes data with custom ContentType. -func (r Data) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - _, err = w.Write(r.Data) - return -} - -// WriteContentType (Data) writes custom ContentType. -func (r Data) WriteContentType(w http.ResponseWriter) { - writeContentType(w, []string{r.ContentType}) -} diff --git a/vendor/github.com/gin-gonic/gin/render/html.go b/vendor/github.com/gin-gonic/gin/render/html.go deleted file mode 100644 index 6696ece9..00000000 --- a/vendor/github.com/gin-gonic/gin/render/html.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "html/template" - "net/http" -) - -// Delims represents a set of Left and Right delimiters for HTML template rendering. -type Delims struct { - // Left delimiter, defaults to {{. - Left string - // Right delimiter, defaults to }}. - Right string -} - -// HTMLRender interface is to be implemented by HTMLProduction and HTMLDebug. -type HTMLRender interface { - // Instance returns an HTML instance. - Instance(string, interface{}) Render -} - -// HTMLProduction contains template reference and its delims. -type HTMLProduction struct { - Template *template.Template - Delims Delims -} - -// HTMLDebug contains template delims and pattern and function with file list. -type HTMLDebug struct { - Files []string - Glob string - Delims Delims - FuncMap template.FuncMap -} - -// HTML contains template reference and its name with given interface object. -type HTML struct { - Template *template.Template - Name string - Data interface{} -} - -var htmlContentType = []string{"text/html; charset=utf-8"} - -// Instance (HTMLProduction) returns an HTML instance which it realizes Render interface. -func (r HTMLProduction) Instance(name string, data interface{}) Render { - return HTML{ - Template: r.Template, - Name: name, - Data: data, - } -} - -// Instance (HTMLDebug) returns an HTML instance which it realizes Render interface. -func (r HTMLDebug) Instance(name string, data interface{}) Render { - return HTML{ - Template: r.loadTemplate(), - Name: name, - Data: data, - } -} -func (r HTMLDebug) loadTemplate() *template.Template { - if r.FuncMap == nil { - r.FuncMap = template.FuncMap{} - } - if len(r.Files) > 0 { - return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseFiles(r.Files...)) - } - if r.Glob != "" { - return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseGlob(r.Glob)) - } - panic("the HTML debug render was created without files or glob pattern") -} - -// Render (HTML) executes template and writes its result with custom ContentType for response. -func (r HTML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - if r.Name == "" { - return r.Template.Execute(w, r.Data) - } - return r.Template.ExecuteTemplate(w, r.Name, r.Data) -} - -// WriteContentType (HTML) writes HTML ContentType. -func (r HTML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, htmlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/json.go b/vendor/github.com/gin-gonic/gin/render/json.go deleted file mode 100644 index 015c0dbb..00000000 --- a/vendor/github.com/gin-gonic/gin/render/json.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "bytes" - "fmt" - "html/template" - "net/http" - - "github.com/gin-gonic/gin/internal/bytesconv" - "github.com/gin-gonic/gin/internal/json" -) - -// JSON contains the given interface object. -type JSON struct { - Data interface{} -} - -// IndentedJSON contains the given interface object. -type IndentedJSON struct { - Data interface{} -} - -// SecureJSON contains the given interface object and its prefix. -type SecureJSON struct { - Prefix string - Data interface{} -} - -// JsonpJSON contains the given interface object its callback. -type JsonpJSON struct { - Callback string - Data interface{} -} - -// AsciiJSON contains the given interface object. -type AsciiJSON struct { - Data interface{} -} - -// SecureJSONPrefix is a string which represents SecureJSON prefix. -type SecureJSONPrefix string - -// PureJSON contains the given interface object. -type PureJSON struct { - Data interface{} -} - -var jsonContentType = []string{"application/json; charset=utf-8"} -var jsonpContentType = []string{"application/javascript; charset=utf-8"} -var jsonAsciiContentType = []string{"application/json"} - -// Render (JSON) writes data with custom ContentType. -func (r JSON) Render(w http.ResponseWriter) (err error) { - if err = WriteJSON(w, r.Data); err != nil { - panic(err) - } - return -} - -// WriteContentType (JSON) writes JSON ContentType. -func (r JSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// WriteJSON marshals the given interface object and writes it with custom ContentType. -func WriteJSON(w http.ResponseWriter, obj interface{}) error { - writeContentType(w, jsonContentType) - jsonBytes, err := json.Marshal(obj) - if err != nil { - return err - } - _, err = w.Write(jsonBytes) - return err -} - -// Render (IndentedJSON) marshals the given interface object and writes it with custom ContentType. -func (r IndentedJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - jsonBytes, err := json.MarshalIndent(r.Data, "", " ") - if err != nil { - return err - } - _, err = w.Write(jsonBytes) - return err -} - -// WriteContentType (IndentedJSON) writes JSON ContentType. -func (r IndentedJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// Render (SecureJSON) marshals the given interface object and writes it with custom ContentType. -func (r SecureJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - jsonBytes, err := json.Marshal(r.Data) - if err != nil { - return err - } - // if the jsonBytes is array values - if bytes.HasPrefix(jsonBytes, bytesconv.StringToBytes("[")) && bytes.HasSuffix(jsonBytes, - bytesconv.StringToBytes("]")) { - _, err = w.Write(bytesconv.StringToBytes(r.Prefix)) - if err != nil { - return err - } - } - _, err = w.Write(jsonBytes) - return err -} - -// WriteContentType (SecureJSON) writes JSON ContentType. -func (r SecureJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// Render (JsonpJSON) marshals the given interface object and writes it and its callback with custom ContentType. -func (r JsonpJSON) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - ret, err := json.Marshal(r.Data) - if err != nil { - return err - } - - if r.Callback == "" { - _, err = w.Write(ret) - return err - } - - callback := template.JSEscapeString(r.Callback) - _, err = w.Write(bytesconv.StringToBytes(callback)) - if err != nil { - return err - } - _, err = w.Write(bytesconv.StringToBytes("(")) - if err != nil { - return err - } - _, err = w.Write(ret) - if err != nil { - return err - } - _, err = w.Write(bytesconv.StringToBytes(");")) - if err != nil { - return err - } - - return nil -} - -// WriteContentType (JsonpJSON) writes Javascript ContentType. -func (r JsonpJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonpContentType) -} - -// Render (AsciiJSON) marshals the given interface object and writes it with custom ContentType. -func (r AsciiJSON) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - ret, err := json.Marshal(r.Data) - if err != nil { - return err - } - - var buffer bytes.Buffer - for _, r := range bytesconv.BytesToString(ret) { - cvt := string(r) - if r >= 128 { - cvt = fmt.Sprintf("\\u%04x", int64(r)) - } - buffer.WriteString(cvt) - } - - _, err = w.Write(buffer.Bytes()) - return err -} - -// WriteContentType (AsciiJSON) writes JSON ContentType. -func (r AsciiJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonAsciiContentType) -} - -// Render (PureJSON) writes custom ContentType and encodes the given interface object. -func (r PureJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - encoder := json.NewEncoder(w) - encoder.SetEscapeHTML(false) - return encoder.Encode(r.Data) -} - -// WriteContentType (PureJSON) writes custom ContentType. -func (r PureJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/msgpack.go b/vendor/github.com/gin-gonic/gin/render/msgpack.go deleted file mode 100644 index be2d45c5..00000000 --- a/vendor/github.com/gin-gonic/gin/render/msgpack.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build !nomsgpack - -package render - -import ( - "net/http" - - "github.com/ugorji/go/codec" -) - -var ( - _ Render = MsgPack{} -) - -// MsgPack contains the given interface object. -type MsgPack struct { - Data interface{} -} - -var msgpackContentType = []string{"application/msgpack; charset=utf-8"} - -// WriteContentType (MsgPack) writes MsgPack ContentType. -func (r MsgPack) WriteContentType(w http.ResponseWriter) { - writeContentType(w, msgpackContentType) -} - -// Render (MsgPack) encodes the given interface object and writes data with custom ContentType. -func (r MsgPack) Render(w http.ResponseWriter) error { - return WriteMsgPack(w, r.Data) -} - -// WriteMsgPack writes MsgPack ContentType and encodes the given interface object. -func WriteMsgPack(w http.ResponseWriter, obj interface{}) error { - writeContentType(w, msgpackContentType) - var mh codec.MsgpackHandle - return codec.NewEncoder(w, &mh).Encode(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/render/protobuf.go b/vendor/github.com/gin-gonic/gin/render/protobuf.go deleted file mode 100644 index 15aca995..00000000 --- a/vendor/github.com/gin-gonic/gin/render/protobuf.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "github.com/golang/protobuf/proto" -) - -// ProtoBuf contains the given interface object. -type ProtoBuf struct { - Data interface{} -} - -var protobufContentType = []string{"application/x-protobuf"} - -// Render (ProtoBuf) marshals the given interface object and writes data with custom ContentType. -func (r ProtoBuf) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - bytes, err := proto.Marshal(r.Data.(proto.Message)) - if err != nil { - return err - } - - _, err = w.Write(bytes) - return err -} - -// WriteContentType (ProtoBuf) writes ProtoBuf ContentType. -func (r ProtoBuf) WriteContentType(w http.ResponseWriter) { - writeContentType(w, protobufContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/reader.go b/vendor/github.com/gin-gonic/gin/render/reader.go deleted file mode 100644 index d5282e49..00000000 --- a/vendor/github.com/gin-gonic/gin/render/reader.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "io" - "net/http" - "strconv" -) - -// Reader contains the IO reader and its length, and custom ContentType and other headers. -type Reader struct { - ContentType string - ContentLength int64 - Reader io.Reader - Headers map[string]string -} - -// Render (Reader) writes data with custom ContentType and headers. -func (r Reader) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - if r.ContentLength >= 0 { - if r.Headers == nil { - r.Headers = map[string]string{} - } - r.Headers["Content-Length"] = strconv.FormatInt(r.ContentLength, 10) - } - r.writeHeaders(w, r.Headers) - _, err = io.Copy(w, r.Reader) - return -} - -// WriteContentType (Reader) writes custom ContentType. -func (r Reader) WriteContentType(w http.ResponseWriter) { - writeContentType(w, []string{r.ContentType}) -} - -// writeHeaders writes custom Header. -func (r Reader) writeHeaders(w http.ResponseWriter, headers map[string]string) { - header := w.Header() - for k, v := range headers { - if header.Get(k) == "" { - header.Set(k, v) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/render/redirect.go b/vendor/github.com/gin-gonic/gin/render/redirect.go deleted file mode 100644 index c006691c..00000000 --- a/vendor/github.com/gin-gonic/gin/render/redirect.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "fmt" - "net/http" -) - -// Redirect contains the http request reference and redirects status code and location. -type Redirect struct { - Code int - Request *http.Request - Location string -} - -// Render (Redirect) redirects the http request to new location and writes redirect response. -func (r Redirect) Render(w http.ResponseWriter) error { - if (r.Code < http.StatusMultipleChoices || r.Code > http.StatusPermanentRedirect) && r.Code != http.StatusCreated { - panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code)) - } - http.Redirect(w, r.Request, r.Location, r.Code) - return nil -} - -// WriteContentType (Redirect) don't write any ContentType. -func (r Redirect) WriteContentType(http.ResponseWriter) {} diff --git a/vendor/github.com/gin-gonic/gin/render/render.go b/vendor/github.com/gin-gonic/gin/render/render.go deleted file mode 100644 index bcd568bf..00000000 --- a/vendor/github.com/gin-gonic/gin/render/render.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import "net/http" - -// Render interface is to be implemented by JSON, XML, HTML, YAML and so on. -type Render interface { - // Render writes data with custom ContentType. - Render(http.ResponseWriter) error - // WriteContentType writes custom ContentType. - WriteContentType(w http.ResponseWriter) -} - -var ( - _ Render = JSON{} - _ Render = IndentedJSON{} - _ Render = SecureJSON{} - _ Render = JsonpJSON{} - _ Render = XML{} - _ Render = String{} - _ Render = Redirect{} - _ Render = Data{} - _ Render = HTML{} - _ HTMLRender = HTMLDebug{} - _ HTMLRender = HTMLProduction{} - _ Render = YAML{} - _ Render = Reader{} - _ Render = AsciiJSON{} - _ Render = ProtoBuf{} -) - -func writeContentType(w http.ResponseWriter, value []string) { - header := w.Header() - if val := header["Content-Type"]; len(val) == 0 { - header["Content-Type"] = value - } -} diff --git a/vendor/github.com/gin-gonic/gin/render/text.go b/vendor/github.com/gin-gonic/gin/render/text.go deleted file mode 100644 index 4e52d4c5..00000000 --- a/vendor/github.com/gin-gonic/gin/render/text.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "fmt" - "io" - "net/http" -) - -// String contains the given interface object slice and its format. -type String struct { - Format string - Data []interface{} -} - -var plainContentType = []string{"text/plain; charset=utf-8"} - -// Render (String) writes data with custom ContentType. -func (r String) Render(w http.ResponseWriter) error { - return WriteString(w, r.Format, r.Data) -} - -// WriteContentType (String) writes Plain ContentType. -func (r String) WriteContentType(w http.ResponseWriter) { - writeContentType(w, plainContentType) -} - -// WriteString writes data according to its format and write custom ContentType. -func WriteString(w http.ResponseWriter, format string, data []interface{}) (err error) { - writeContentType(w, plainContentType) - if len(data) > 0 { - _, err = fmt.Fprintf(w, format, data...) - return - } - _, err = io.WriteString(w, format) - return -} diff --git a/vendor/github.com/gin-gonic/gin/render/xml.go b/vendor/github.com/gin-gonic/gin/render/xml.go deleted file mode 100644 index cc5390a2..00000000 --- a/vendor/github.com/gin-gonic/gin/render/xml.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "encoding/xml" - "net/http" -) - -// XML contains the given interface object. -type XML struct { - Data interface{} -} - -var xmlContentType = []string{"application/xml; charset=utf-8"} - -// Render (XML) encodes the given interface object and writes data with custom ContentType. -func (r XML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - return xml.NewEncoder(w).Encode(r.Data) -} - -// WriteContentType (XML) writes XML ContentType for response. -func (r XML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, xmlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/yaml.go b/vendor/github.com/gin-gonic/gin/render/yaml.go deleted file mode 100644 index 0df78360..00000000 --- a/vendor/github.com/gin-gonic/gin/render/yaml.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "gopkg.in/yaml.v2" -) - -// YAML contains the given interface object. -type YAML struct { - Data interface{} -} - -var yamlContentType = []string{"application/x-yaml; charset=utf-8"} - -// Render (YAML) marshals the given interface object and writes data with custom ContentType. -func (r YAML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - bytes, err := yaml.Marshal(r.Data) - if err != nil { - return err - } - - _, err = w.Write(bytes) - return err -} - -// WriteContentType (YAML) writes YAML ContentType for response. -func (r YAML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, yamlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/response_writer.go b/vendor/github.com/gin-gonic/gin/response_writer.go deleted file mode 100644 index 26826689..00000000 --- a/vendor/github.com/gin-gonic/gin/response_writer.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bufio" - "io" - "net" - "net/http" -) - -const ( - noWritten = -1 - defaultStatus = http.StatusOK -) - -// ResponseWriter ... -type ResponseWriter interface { - http.ResponseWriter - http.Hijacker - http.Flusher - http.CloseNotifier - - // Returns the HTTP response status code of the current request. - Status() int - - // Returns the number of bytes already written into the response http body. - // See Written() - Size() int - - // Writes the string into the response body. - WriteString(string) (int, error) - - // Returns true if the response body was already written. - Written() bool - - // Forces to write the http header (status code + headers). - WriteHeaderNow() - - // get the http.Pusher for server push - Pusher() http.Pusher -} - -type responseWriter struct { - http.ResponseWriter - size int - status int -} - -var _ ResponseWriter = &responseWriter{} - -func (w *responseWriter) reset(writer http.ResponseWriter) { - w.ResponseWriter = writer - w.size = noWritten - w.status = defaultStatus -} - -func (w *responseWriter) WriteHeader(code int) { - if code > 0 && w.status != code { - if w.Written() { - debugPrint("[WARNING] Headers were already written. Wanted to override status code %d with %d", w.status, code) - } - w.status = code - } -} - -func (w *responseWriter) WriteHeaderNow() { - if !w.Written() { - w.size = 0 - w.ResponseWriter.WriteHeader(w.status) - } -} - -func (w *responseWriter) Write(data []byte) (n int, err error) { - w.WriteHeaderNow() - n, err = w.ResponseWriter.Write(data) - w.size += n - return -} - -func (w *responseWriter) WriteString(s string) (n int, err error) { - w.WriteHeaderNow() - n, err = io.WriteString(w.ResponseWriter, s) - w.size += n - return -} - -func (w *responseWriter) Status() int { - return w.status -} - -func (w *responseWriter) Size() int { - return w.size -} - -func (w *responseWriter) Written() bool { - return w.size != noWritten -} - -// Hijack implements the http.Hijacker interface. -func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - if w.size < 0 { - w.size = 0 - } - return w.ResponseWriter.(http.Hijacker).Hijack() -} - -// CloseNotify implements the http.CloseNotify interface. -func (w *responseWriter) CloseNotify() <-chan bool { - return w.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -// Flush implements the http.Flush interface. -func (w *responseWriter) Flush() { - w.WriteHeaderNow() - w.ResponseWriter.(http.Flusher).Flush() -} - -func (w *responseWriter) Pusher() (pusher http.Pusher) { - if pusher, ok := w.ResponseWriter.(http.Pusher); ok { - return pusher - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/routergroup.go b/vendor/github.com/gin-gonic/gin/routergroup.go deleted file mode 100644 index 9ff7c038..00000000 --- a/vendor/github.com/gin-gonic/gin/routergroup.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "net/http" - "path" - "regexp" - "strings" -) - -// IRouter defines all router handle interface includes single and group router. -type IRouter interface { - IRoutes - Group(string, ...HandlerFunc) *RouterGroup -} - -// IRoutes defines all router handle interface. -type IRoutes interface { - Use(...HandlerFunc) IRoutes - - Handle(string, string, ...HandlerFunc) IRoutes - Any(string, ...HandlerFunc) IRoutes - GET(string, ...HandlerFunc) IRoutes - POST(string, ...HandlerFunc) IRoutes - DELETE(string, ...HandlerFunc) IRoutes - PATCH(string, ...HandlerFunc) IRoutes - PUT(string, ...HandlerFunc) IRoutes - OPTIONS(string, ...HandlerFunc) IRoutes - HEAD(string, ...HandlerFunc) IRoutes - - StaticFile(string, string) IRoutes - Static(string, string) IRoutes - StaticFS(string, http.FileSystem) IRoutes -} - -// RouterGroup is used internally to configure router, a RouterGroup is associated with -// a prefix and an array of handlers (middleware). -type RouterGroup struct { - Handlers HandlersChain - basePath string - engine *Engine - root bool -} - -var _ IRouter = &RouterGroup{} - -// Use adds middleware to the group, see example code in GitHub. -func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes { - group.Handlers = append(group.Handlers, middleware...) - return group.returnObj() -} - -// Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix. -// For example, all the routes that use a common middleware for authorization could be grouped. -func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup { - return &RouterGroup{ - Handlers: group.combineHandlers(handlers), - basePath: group.calculateAbsolutePath(relativePath), - engine: group.engine, - } -} - -// BasePath returns the base path of router group. -// For example, if v := router.Group("/rest/n/v1/api"), v.BasePath() is "/rest/n/v1/api". -func (group *RouterGroup) BasePath() string { - return group.basePath -} - -func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes { - absolutePath := group.calculateAbsolutePath(relativePath) - handlers = group.combineHandlers(handlers) - group.engine.addRoute(httpMethod, absolutePath, handlers) - return group.returnObj() -} - -// Handle registers a new request handle and middleware with the given path and method. -// The last handler should be the real handler, the other ones should be middleware that can and should be shared among different routes. -// See the example code in GitHub. -// -// For GET, POST, PUT, PATCH and DELETE requests the respective shortcut -// functions can be used. -// -// This function is intended for bulk loading and to allow the usage of less -// frequently used, non-standardized or custom methods (e.g. for internal -// communication with a proxy). -func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc) IRoutes { - if matches, err := regexp.MatchString("^[A-Z]+$", httpMethod); !matches || err != nil { - panic("http method " + httpMethod + " is not valid") - } - return group.handle(httpMethod, relativePath, handlers) -} - -// POST is a shortcut for router.Handle("POST", path, handle). -func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodPost, relativePath, handlers) -} - -// GET is a shortcut for router.Handle("GET", path, handle). -func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodGet, relativePath, handlers) -} - -// DELETE is a shortcut for router.Handle("DELETE", path, handle). -func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodDelete, relativePath, handlers) -} - -// PATCH is a shortcut for router.Handle("PATCH", path, handle). -func (group *RouterGroup) PATCH(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodPatch, relativePath, handlers) -} - -// PUT is a shortcut for router.Handle("PUT", path, handle). -func (group *RouterGroup) PUT(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodPut, relativePath, handlers) -} - -// OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle). -func (group *RouterGroup) OPTIONS(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodOptions, relativePath, handlers) -} - -// HEAD is a shortcut for router.Handle("HEAD", path, handle). -func (group *RouterGroup) HEAD(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle(http.MethodHead, relativePath, handlers) -} - -// Any registers a route that matches all the HTTP methods. -// GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE. -func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) IRoutes { - group.handle(http.MethodGet, relativePath, handlers) - group.handle(http.MethodPost, relativePath, handlers) - group.handle(http.MethodPut, relativePath, handlers) - group.handle(http.MethodPatch, relativePath, handlers) - group.handle(http.MethodHead, relativePath, handlers) - group.handle(http.MethodOptions, relativePath, handlers) - group.handle(http.MethodDelete, relativePath, handlers) - group.handle(http.MethodConnect, relativePath, handlers) - group.handle(http.MethodTrace, relativePath, handlers) - return group.returnObj() -} - -// StaticFile registers a single route in order to serve a single file of the local filesystem. -// router.StaticFile("favicon.ico", "./resources/favicon.ico") -func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes { - if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { - panic("URL parameters can not be used when serving a static file") - } - handler := func(c *Context) { - c.File(filepath) - } - group.GET(relativePath, handler) - group.HEAD(relativePath, handler) - return group.returnObj() -} - -// Static serves files from the given file system root. -// Internally a http.FileServer is used, therefore http.NotFound is used instead -// of the Router's NotFound handler. -// To use the operating system's file system implementation, -// use : -// router.Static("/static", "/var/www") -func (group *RouterGroup) Static(relativePath, root string) IRoutes { - return group.StaticFS(relativePath, Dir(root, false)) -} - -// StaticFS works just like `Static()` but a custom `http.FileSystem` can be used instead. -// Gin by default user: gin.Dir() -func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes { - if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { - panic("URL parameters can not be used when serving a static folder") - } - handler := group.createStaticHandler(relativePath, fs) - urlPattern := path.Join(relativePath, "/*filepath") - - // Register GET and HEAD handlers - group.GET(urlPattern, handler) - group.HEAD(urlPattern, handler) - return group.returnObj() -} - -func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc { - absolutePath := group.calculateAbsolutePath(relativePath) - fileServer := http.StripPrefix(absolutePath, http.FileServer(fs)) - - return func(c *Context) { - if _, nolisting := fs.(*onlyfilesFS); nolisting { - c.Writer.WriteHeader(http.StatusNotFound) - } - - file := c.Param("filepath") - // Check if file exists and/or if we have permission to access it - f, err := fs.Open(file) - if err != nil { - c.Writer.WriteHeader(http.StatusNotFound) - c.handlers = group.engine.noRoute - // Reset index - c.index = -1 - return - } - f.Close() - - fileServer.ServeHTTP(c.Writer, c.Request) - } -} - -func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain { - finalSize := len(group.Handlers) + len(handlers) - if finalSize >= int(abortIndex) { - panic("too many handlers") - } - mergedHandlers := make(HandlersChain, finalSize) - copy(mergedHandlers, group.Handlers) - copy(mergedHandlers[len(group.Handlers):], handlers) - return mergedHandlers -} - -func (group *RouterGroup) calculateAbsolutePath(relativePath string) string { - return joinPaths(group.basePath, relativePath) -} - -func (group *RouterGroup) returnObj() IRoutes { - if group.root { - return group.engine - } - return group -} diff --git a/vendor/github.com/gin-gonic/gin/test_helpers.go b/vendor/github.com/gin-gonic/gin/test_helpers.go deleted file mode 100644 index 3a7a5ddf..00000000 --- a/vendor/github.com/gin-gonic/gin/test_helpers.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import "net/http" - -// CreateTestContext returns a fresh engine and context for testing purposes -func CreateTestContext(w http.ResponseWriter) (c *Context, r *Engine) { - r = New() - c = r.allocateContext() - c.reset() - c.writermem.reset(w) - return -} diff --git a/vendor/github.com/gin-gonic/gin/tree.go b/vendor/github.com/gin-gonic/gin/tree.go deleted file mode 100644 index b687ec43..00000000 --- a/vendor/github.com/gin-gonic/gin/tree.go +++ /dev/null @@ -1,684 +0,0 @@ -// Copyright 2013 Julien Schmidt. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be found -// at https://github.com/julienschmidt/httprouter/blob/master/LICENSE - -package gin - -import ( - "net/url" - "strings" - "unicode" -) - -// Param is a single URL parameter, consisting of a key and a value. -type Param struct { - Key string - Value string -} - -// Params is a Param-slice, as returned by the router. -// The slice is ordered, the first URL parameter is also the first slice value. -// It is therefore safe to read values by the index. -type Params []Param - -// Get returns the value of the first Param which key matches the given name. -// If no matching Param is found, an empty string is returned. -func (ps Params) Get(name string) (string, bool) { - for _, entry := range ps { - if entry.Key == name { - return entry.Value, true - } - } - return "", false -} - -// ByName returns the value of the first Param which key matches the given name. -// If no matching Param is found, an empty string is returned. -func (ps Params) ByName(name string) (va string) { - va, _ = ps.Get(name) - return -} - -type methodTree struct { - method string - root *node -} - -type methodTrees []methodTree - -func (trees methodTrees) get(method string) *node { - for _, tree := range trees { - if tree.method == method { - return tree.root - } - } - return nil -} - -func min(a, b int) int { - if a <= b { - return a - } - return b -} - -func longestCommonPrefix(a, b string) int { - i := 0 - max := min(len(a), len(b)) - for i < max && a[i] == b[i] { - i++ - } - return i -} - -func countParams(path string) uint8 { - var n uint - for i := 0; i < len(path); i++ { - if path[i] == ':' || path[i] == '*' { - n++ - } - } - if n >= 255 { - return 255 - } - return uint8(n) -} - -type nodeType uint8 - -const ( - static nodeType = iota // default - root - param - catchAll -) - -type node struct { - path string - indices string - children []*node - handlers HandlersChain - priority uint32 - nType nodeType - maxParams uint8 - wildChild bool - fullPath string -} - -// increments priority of the given child and reorders if necessary. -func (n *node) incrementChildPrio(pos int) int { - cs := n.children - cs[pos].priority++ - prio := cs[pos].priority - - // Adjust position (move to front) - newPos := pos - for ; newPos > 0 && cs[newPos-1].priority < prio; newPos-- { - // Swap node positions - cs[newPos-1], cs[newPos] = cs[newPos], cs[newPos-1] - } - - // build new index char string - if newPos != pos { - n.indices = n.indices[:newPos] + // unchanged prefix, might be empty - n.indices[pos:pos+1] + // the index char we move - n.indices[newPos:pos] + n.indices[pos+1:] // rest without char at 'pos' - } - - return newPos -} - -// addRoute adds a node with the given handle to the path. -// Not concurrency-safe! -func (n *node) addRoute(path string, handlers HandlersChain) { - fullPath := path - n.priority++ - numParams := countParams(path) - - // Empty tree - if len(n.path) == 0 && len(n.children) == 0 { - n.insertChild(numParams, path, fullPath, handlers) - n.nType = root - return - } - - parentFullPathIndex := 0 - -walk: - for { - // Update maxParams of the current node - if numParams > n.maxParams { - n.maxParams = numParams - } - - // Find the longest common prefix. - // This also implies that the common prefix contains no ':' or '*' - // since the existing key can't contain those chars. - i := longestCommonPrefix(path, n.path) - - // Split edge - if i < len(n.path) { - child := node{ - path: n.path[i:], - wildChild: n.wildChild, - indices: n.indices, - children: n.children, - handlers: n.handlers, - priority: n.priority - 1, - fullPath: n.fullPath, - } - - // Update maxParams (max of all children) - for _, v := range child.children { - if v.maxParams > child.maxParams { - child.maxParams = v.maxParams - } - } - - n.children = []*node{&child} - // []byte for proper unicode char conversion, see #65 - n.indices = string([]byte{n.path[i]}) - n.path = path[:i] - n.handlers = nil - n.wildChild = false - n.fullPath = fullPath[:parentFullPathIndex+i] - } - - // Make new node a child of this node - if i < len(path) { - path = path[i:] - - if n.wildChild { - parentFullPathIndex += len(n.path) - n = n.children[0] - n.priority++ - - // Update maxParams of the child node - if numParams > n.maxParams { - n.maxParams = numParams - } - numParams-- - - // Check if the wildcard matches - if len(path) >= len(n.path) && n.path == path[:len(n.path)] { - // check for longer wildcard, e.g. :name and :names - if len(n.path) >= len(path) || path[len(n.path)] == '/' { - continue walk - } - } - - pathSeg := path - if n.nType != catchAll { - pathSeg = strings.SplitN(path, "/", 2)[0] - } - prefix := fullPath[:strings.Index(fullPath, pathSeg)] + n.path - panic("'" + pathSeg + - "' in new path '" + fullPath + - "' conflicts with existing wildcard '" + n.path + - "' in existing prefix '" + prefix + - "'") - } - - c := path[0] - - // slash after param - if n.nType == param && c == '/' && len(n.children) == 1 { - parentFullPathIndex += len(n.path) - n = n.children[0] - n.priority++ - continue walk - } - - // Check if a child with the next path byte exists - for i, max := 0, len(n.indices); i < max; i++ { - if c == n.indices[i] { - parentFullPathIndex += len(n.path) - i = n.incrementChildPrio(i) - n = n.children[i] - continue walk - } - } - - // Otherwise insert it - if c != ':' && c != '*' { - // []byte for proper unicode char conversion, see #65 - n.indices += string([]byte{c}) - child := &node{ - maxParams: numParams, - fullPath: fullPath, - } - n.children = append(n.children, child) - n.incrementChildPrio(len(n.indices) - 1) - n = child - } - n.insertChild(numParams, path, fullPath, handlers) - return - } - - // Otherwise and handle to current node - if n.handlers != nil { - panic("handlers are already registered for path '" + fullPath + "'") - } - n.handlers = handlers - return - } -} - -// Search for a wildcard segment and check the name for invalid characters. -// Returns -1 as index, if no wildcard war found. -func findWildcard(path string) (wildcard string, i int, valid bool) { - // Find start - for start, c := range []byte(path) { - // A wildcard starts with ':' (param) or '*' (catch-all) - if c != ':' && c != '*' { - continue - } - - // Find end and check for invalid characters - valid = true - for end, c := range []byte(path[start+1:]) { - switch c { - case '/': - return path[start : start+1+end], start, valid - case ':', '*': - valid = false - } - } - return path[start:], start, valid - } - return "", -1, false -} - -func (n *node) insertChild(numParams uint8, path string, fullPath string, handlers HandlersChain) { - for numParams > 0 { - // Find prefix until first wildcard - wildcard, i, valid := findWildcard(path) - if i < 0 { // No wildcard found - break - } - - // The wildcard name must not contain ':' and '*' - if !valid { - panic("only one wildcard per path segment is allowed, has: '" + - wildcard + "' in path '" + fullPath + "'") - } - - // check if the wildcard has a name - if len(wildcard) < 2 { - panic("wildcards must be named with a non-empty name in path '" + fullPath + "'") - } - - // Check if this node has existing children which would be - // unreachable if we insert the wildcard here - if len(n.children) > 0 { - panic("wildcard segment '" + wildcard + - "' conflicts with existing children in path '" + fullPath + "'") - } - - if wildcard[0] == ':' { // param - if i > 0 { - // Insert prefix before the current wildcard - n.path = path[:i] - path = path[i:] - } - - n.wildChild = true - child := &node{ - nType: param, - path: wildcard, - maxParams: numParams, - fullPath: fullPath, - } - n.children = []*node{child} - n = child - n.priority++ - numParams-- - - // if the path doesn't end with the wildcard, then there - // will be another non-wildcard subpath starting with '/' - if len(wildcard) < len(path) { - path = path[len(wildcard):] - - child := &node{ - maxParams: numParams, - priority: 1, - fullPath: fullPath, - } - n.children = []*node{child} - n = child - continue - } - - // Otherwise we're done. Insert the handle in the new leaf - n.handlers = handlers - return - } - - // catchAll - if i+len(wildcard) != len(path) || numParams > 1 { - panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'") - } - - if len(n.path) > 0 && n.path[len(n.path)-1] == '/' { - panic("catch-all conflicts with existing handle for the path segment root in path '" + fullPath + "'") - } - - // currently fixed width 1 for '/' - i-- - if path[i] != '/' { - panic("no / before catch-all in path '" + fullPath + "'") - } - - n.path = path[:i] - - // First node: catchAll node with empty path - child := &node{ - wildChild: true, - nType: catchAll, - maxParams: 1, - fullPath: fullPath, - } - // update maxParams of the parent node - if n.maxParams < 1 { - n.maxParams = 1 - } - n.children = []*node{child} - n.indices = string('/') - n = child - n.priority++ - - // second node: node holding the variable - child = &node{ - path: path[i:], - nType: catchAll, - maxParams: 1, - handlers: handlers, - priority: 1, - fullPath: fullPath, - } - n.children = []*node{child} - - return - } - - // If no wildcard was found, simply insert the path and handle - n.path = path - n.handlers = handlers - n.fullPath = fullPath -} - -// nodeValue holds return values of (*Node).getValue method -type nodeValue struct { - handlers HandlersChain - params Params - tsr bool - fullPath string -} - -// getValue returns the handle registered with the given path (key). The values of -// wildcards are saved to a map. -// If no handle can be found, a TSR (trailing slash redirect) recommendation is -// made if a handle exists with an extra (without the) trailing slash for the -// given path. -func (n *node) getValue(path string, po Params, unescape bool) (value nodeValue) { - value.params = po -walk: // Outer loop for walking the tree - for { - prefix := n.path - if path == prefix { - // We should have reached the node containing the handle. - // Check if this node has a handle registered. - if value.handlers = n.handlers; value.handlers != nil { - value.fullPath = n.fullPath - return - } - - if path == "/" && n.wildChild && n.nType != root { - value.tsr = true - return - } - - // No handle found. Check if a handle for this path + a - // trailing slash exists for trailing slash recommendation - indices := n.indices - for i, max := 0, len(indices); i < max; i++ { - if indices[i] == '/' { - n = n.children[i] - value.tsr = (len(n.path) == 1 && n.handlers != nil) || - (n.nType == catchAll && n.children[0].handlers != nil) - return - } - } - - return - } - - if len(path) > len(prefix) && path[:len(prefix)] == prefix { - path = path[len(prefix):] - // If this node does not have a wildcard (param or catchAll) - // child, we can just look up the next child node and continue - // to walk down the tree - if !n.wildChild { - c := path[0] - indices := n.indices - for i, max := 0, len(indices); i < max; i++ { - if c == indices[i] { - n = n.children[i] - continue walk - } - } - - // Nothing found. - // We can recommend to redirect to the same URL without a - // trailing slash if a leaf exists for that path. - value.tsr = path == "/" && n.handlers != nil - return - } - - // handle wildcard child - n = n.children[0] - switch n.nType { - case param: - // find param end (either '/' or path end) - end := 0 - for end < len(path) && path[end] != '/' { - end++ - } - - // save param value - if cap(value.params) < int(n.maxParams) { - value.params = make(Params, 0, n.maxParams) - } - i := len(value.params) - value.params = value.params[:i+1] // expand slice within preallocated capacity - value.params[i].Key = n.path[1:] - val := path[:end] - if unescape { - var err error - if value.params[i].Value, err = url.QueryUnescape(val); err != nil { - value.params[i].Value = val // fallback, in case of error - } - } else { - value.params[i].Value = val - } - - // we need to go deeper! - if end < len(path) { - if len(n.children) > 0 { - path = path[end:] - n = n.children[0] - continue walk - } - - // ... but we can't - value.tsr = len(path) == end+1 - return - } - - if value.handlers = n.handlers; value.handlers != nil { - value.fullPath = n.fullPath - return - } - if len(n.children) == 1 { - // No handle found. Check if a handle for this path + a - // trailing slash exists for TSR recommendation - n = n.children[0] - value.tsr = n.path == "/" && n.handlers != nil - } - return - - case catchAll: - // save param value - if cap(value.params) < int(n.maxParams) { - value.params = make(Params, 0, n.maxParams) - } - i := len(value.params) - value.params = value.params[:i+1] // expand slice within preallocated capacity - value.params[i].Key = n.path[2:] - if unescape { - var err error - if value.params[i].Value, err = url.QueryUnescape(path); err != nil { - value.params[i].Value = path // fallback, in case of error - } - } else { - value.params[i].Value = path - } - - value.handlers = n.handlers - value.fullPath = n.fullPath - return - - default: - panic("invalid node type") - } - } - - // Nothing found. We can recommend to redirect to the same URL with an - // extra trailing slash if a leaf exists for that path - value.tsr = (path == "/") || - (len(prefix) == len(path)+1 && prefix[len(path)] == '/' && - path == prefix[:len(prefix)-1] && n.handlers != nil) - return - } -} - -// findCaseInsensitivePath makes a case-insensitive lookup of the given path and tries to find a handler. -// It can optionally also fix trailing slashes. -// It returns the case-corrected path and a bool indicating whether the lookup -// was successful. -func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPath []byte, found bool) { - ciPath = make([]byte, 0, len(path)+1) // preallocate enough memory - - // Outer loop for walking the tree - for len(path) >= len(n.path) && strings.EqualFold(path[:len(n.path)], n.path) { - path = path[len(n.path):] - ciPath = append(ciPath, n.path...) - - if len(path) == 0 { - // We should have reached the node containing the handle. - // Check if this node has a handle registered. - if n.handlers != nil { - return ciPath, true - } - - // No handle found. - // Try to fix the path by adding a trailing slash - if fixTrailingSlash { - for i := 0; i < len(n.indices); i++ { - if n.indices[i] == '/' { - n = n.children[i] - if (len(n.path) == 1 && n.handlers != nil) || - (n.nType == catchAll && n.children[0].handlers != nil) { - return append(ciPath, '/'), true - } - return - } - } - } - return - } - - // If this node does not have a wildcard (param or catchAll) child, - // we can just look up the next child node and continue to walk down - // the tree - if !n.wildChild { - r := unicode.ToLower(rune(path[0])) - for i, index := range n.indices { - // must use recursive approach since both index and - // ToLower(index) could exist. We must check both. - if r == unicode.ToLower(index) { - out, found := n.children[i].findCaseInsensitivePath(path, fixTrailingSlash) - if found { - return append(ciPath, out...), true - } - } - } - - // Nothing found. We can recommend to redirect to the same URL - // without a trailing slash if a leaf exists for that path - found = fixTrailingSlash && path == "/" && n.handlers != nil - return - } - - n = n.children[0] - switch n.nType { - case param: - // Find param end (either '/' or path end) - end := 0 - for end < len(path) && path[end] != '/' { - end++ - } - - // add param value to case insensitive path - ciPath = append(ciPath, path[:end]...) - - // we need to go deeper! - if end < len(path) { - if len(n.children) > 0 { - path = path[end:] - n = n.children[0] - continue - } - - // ... but we can't - if fixTrailingSlash && len(path) == end+1 { - return ciPath, true - } - return - } - - if n.handlers != nil { - return ciPath, true - } - if fixTrailingSlash && len(n.children) == 1 { - // No handle found. Check if a handle for this path + a - // trailing slash exists - n = n.children[0] - if n.path == "/" && n.handlers != nil { - return append(ciPath, '/'), true - } - } - return - - case catchAll: - return append(ciPath, path...), true - - default: - panic("invalid node type") - } - } - - // Nothing found. - // Try to fix the path by adding / removing a trailing slash - if fixTrailingSlash { - if path == "/" { - return ciPath, true - } - if len(path)+1 == len(n.path) && n.path[len(path)] == '/' && - strings.EqualFold(path, n.path[:len(path)]) && - n.handlers != nil { - return append(ciPath, n.path...), true - } - } - return -} diff --git a/vendor/github.com/gin-gonic/gin/utils.go b/vendor/github.com/gin-gonic/gin/utils.go deleted file mode 100644 index 71b80de7..00000000 --- a/vendor/github.com/gin-gonic/gin/utils.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "encoding/xml" - "net/http" - "os" - "path" - "reflect" - "runtime" - "strings" -) - -// BindKey indicates a default bind key. -const BindKey = "_gin-gonic/gin/bindkey" - -// Bind is a helper function for given interface object and returns a Gin middleware. -func Bind(val interface{}) HandlerFunc { - value := reflect.ValueOf(val) - if value.Kind() == reflect.Ptr { - panic(`Bind struct can not be a pointer. Example: - Use: gin.Bind(Struct{}) instead of gin.Bind(&Struct{}) -`) - } - typ := value.Type() - - return func(c *Context) { - obj := reflect.New(typ).Interface() - if c.Bind(obj) == nil { - c.Set(BindKey, obj) - } - } -} - -// WrapF is a helper function for wrapping http.HandlerFunc and returns a Gin middleware. -func WrapF(f http.HandlerFunc) HandlerFunc { - return func(c *Context) { - f(c.Writer, c.Request) - } -} - -// WrapH is a helper function for wrapping http.Handler and returns a Gin middleware. -func WrapH(h http.Handler) HandlerFunc { - return func(c *Context) { - h.ServeHTTP(c.Writer, c.Request) - } -} - -// H is a shortcut for map[string]interface{} -type H map[string]interface{} - -// MarshalXML allows type H to be used with xml.Marshal. -func (h H) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - start.Name = xml.Name{ - Space: "", - Local: "map", - } - if err := e.EncodeToken(start); err != nil { - return err - } - for key, value := range h { - elem := xml.StartElement{ - Name: xml.Name{Space: "", Local: key}, - Attr: []xml.Attr{}, - } - if err := e.EncodeElement(value, elem); err != nil { - return err - } - } - - return e.EncodeToken(xml.EndElement{Name: start.Name}) -} - -func assert1(guard bool, text string) { - if !guard { - panic(text) - } -} - -func filterFlags(content string) string { - for i, char := range content { - if char == ' ' || char == ';' { - return content[:i] - } - } - return content -} - -func chooseData(custom, wildcard interface{}) interface{} { - if custom == nil { - if wildcard == nil { - panic("negotiation config is invalid") - } - return wildcard - } - return custom -} - -func parseAccept(acceptHeader string) []string { - parts := strings.Split(acceptHeader, ",") - out := make([]string, 0, len(parts)) - for _, part := range parts { - if part = strings.TrimSpace(strings.Split(part, ";")[0]); part != "" { - out = append(out, part) - } - } - return out -} - -func lastChar(str string) uint8 { - if str == "" { - panic("The length of the string can't be 0") - } - return str[len(str)-1] -} - -func nameOfFunction(f interface{}) string { - return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name() -} - -func joinPaths(absolutePath, relativePath string) string { - if relativePath == "" { - return absolutePath - } - - finalPath := path.Join(absolutePath, relativePath) - appendSlash := lastChar(relativePath) == '/' && lastChar(finalPath) != '/' - if appendSlash { - return finalPath + "/" - } - return finalPath -} - -func resolveAddress(addr []string) string { - switch len(addr) { - case 0: - if port := os.Getenv("PORT"); port != "" { - debugPrint("Environment variable PORT=\"%s\"", port) - return ":" + port - } - debugPrint("Environment variable PORT is undefined. Using port :8080 by default") - return ":8080" - case 1: - return addr[0] - default: - panic("too many parameters") - } -} diff --git a/vendor/github.com/gin-gonic/gin/version.go b/vendor/github.com/gin-gonic/gin/version.go deleted file mode 100644 index 3e9687dc..00000000 --- a/vendor/github.com/gin-gonic/gin/version.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -// Version is the current gin framework's version. -const Version = "v1.6.3" diff --git a/vendor/github.com/gliderlabs/ssh/LICENSE b/vendor/github.com/gliderlabs/ssh/LICENSE deleted file mode 100644 index 4a03f02a..00000000 --- a/vendor/github.com/gliderlabs/ssh/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2016 Glider Labs. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Glider Labs nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/gliderlabs/ssh/README.md b/vendor/github.com/gliderlabs/ssh/README.md deleted file mode 100644 index fbb2fbbb..00000000 --- a/vendor/github.com/gliderlabs/ssh/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# gliderlabs/ssh - -[![GoDoc](https://godoc.org/github.com/gliderlabs/ssh?status.svg)](https://godoc.org/github.com/gliderlabs/ssh) -[![CircleCI](https://img.shields.io/circleci/project/github/gliderlabs/ssh.svg)](https://circleci.com/gh/gliderlabs/ssh) -[![Go Report Card](https://goreportcard.com/badge/github.com/gliderlabs/ssh)](https://goreportcard.com/report/github.com/gliderlabs/ssh) -[![OpenCollective](https://opencollective.com/ssh/sponsors/badge.svg)](#sponsors) -[![Slack](http://slack.gliderlabs.com/badge.svg)](http://slack.gliderlabs.com) -[![Email Updates](https://img.shields.io/badge/updates-subscribe-yellow.svg)](https://app.convertkit.com/landing_pages/243312) - -> The Glider Labs SSH server package is dope. —[@bradfitz](https://twitter.com/bradfitz), Go team member - -This Go package wraps the [crypto/ssh -package](https://godoc.org/golang.org/x/crypto/ssh) with a higher-level API for -building SSH servers. The goal of the API was to make it as simple as using -[net/http](https://golang.org/pkg/net/http/), so the API is very similar: - -```go - package main - - import ( - "github.com/gliderlabs/ssh" - "io" - "log" - ) - - func main() { - ssh.Handle(func(s ssh.Session) { - io.WriteString(s, "Hello world\n") - }) - - log.Fatal(ssh.ListenAndServe(":2222", nil)) - } - -``` -This package was built by [@progrium](https://twitter.com/progrium) after working on nearly a dozen projects at Glider Labs using SSH and collaborating with [@shazow](https://twitter.com/shazow) (known for [ssh-chat](https://github.com/shazow/ssh-chat)). - -## Examples - -A bunch of great examples are in the `_examples` directory. - -## Usage - -[See GoDoc reference.](https://godoc.org/github.com/gliderlabs/ssh) - -## Contributing - -Pull requests are welcome! However, since this project is very much about API -design, please submit API changes as issues to discuss before submitting PRs. - -Also, you can [join our Slack](http://slack.gliderlabs.com) to discuss as well. - -## Roadmap - -* Non-session channel handlers -* Cleanup callback API -* 1.0 release -* High-level client? - -## Sponsors - -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/ssh#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## License - -[BSD](LICENSE) diff --git a/vendor/github.com/gliderlabs/ssh/agent.go b/vendor/github.com/gliderlabs/ssh/agent.go deleted file mode 100644 index d8dcb9a0..00000000 --- a/vendor/github.com/gliderlabs/ssh/agent.go +++ /dev/null @@ -1,83 +0,0 @@ -package ssh - -import ( - "io" - "io/ioutil" - "net" - "path" - "sync" - - gossh "golang.org/x/crypto/ssh" -) - -const ( - agentRequestType = "auth-agent-req@openssh.com" - agentChannelType = "auth-agent@openssh.com" - - agentTempDir = "auth-agent" - agentListenFile = "listener.sock" -) - -// contextKeyAgentRequest is an internal context key for storing if the -// client requested agent forwarding -var contextKeyAgentRequest = &contextKey{"auth-agent-req"} - -// SetAgentRequested sets up the session context so that AgentRequested -// returns true. -func SetAgentRequested(ctx Context) { - ctx.SetValue(contextKeyAgentRequest, true) -} - -// AgentRequested returns true if the client requested agent forwarding. -func AgentRequested(sess Session) bool { - return sess.Context().Value(contextKeyAgentRequest) == true -} - -// NewAgentListener sets up a temporary Unix socket that can be communicated -// to the session environment and used for forwarding connections. -func NewAgentListener() (net.Listener, error) { - dir, err := ioutil.TempDir("", agentTempDir) - if err != nil { - return nil, err - } - l, err := net.Listen("unix", path.Join(dir, agentListenFile)) - if err != nil { - return nil, err - } - return l, nil -} - -// ForwardAgentConnections takes connections from a listener to proxy into the -// session on the OpenSSH channel for agent connections. It blocks and services -// connections until the listener stop accepting. -func ForwardAgentConnections(l net.Listener, s Session) { - sshConn := s.Context().Value(ContextKeyConn).(gossh.Conn) - for { - conn, err := l.Accept() - if err != nil { - return - } - go func(conn net.Conn) { - defer conn.Close() - channel, reqs, err := sshConn.OpenChannel(agentChannelType, nil) - if err != nil { - return - } - defer channel.Close() - go gossh.DiscardRequests(reqs) - var wg sync.WaitGroup - wg.Add(2) - go func() { - io.Copy(conn, channel) - conn.(*net.UnixConn).CloseWrite() - wg.Done() - }() - go func() { - io.Copy(channel, conn) - channel.CloseWrite() - wg.Done() - }() - wg.Wait() - }(conn) - } -} diff --git a/vendor/github.com/gliderlabs/ssh/circle.yml b/vendor/github.com/gliderlabs/ssh/circle.yml deleted file mode 100644 index 08616b01..00000000 --- a/vendor/github.com/gliderlabs/ssh/circle.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: 2 -jobs: - build-go-latest: - docker: - - image: golang:latest - working_directory: /go/src/github.com/gliderlabs/ssh - steps: - - checkout - - run: go get - - run: go test -v -race - - build-go-1.9: - docker: - - image: golang:1.9 - working_directory: /go/src/github.com/gliderlabs/ssh - steps: - - checkout - - run: go get - - run: go test -v -race - -workflows: - version: 2 - build: - jobs: - - build-go-latest - - build-go-1.9 diff --git a/vendor/github.com/gliderlabs/ssh/conn.go b/vendor/github.com/gliderlabs/ssh/conn.go deleted file mode 100644 index ebef8845..00000000 --- a/vendor/github.com/gliderlabs/ssh/conn.go +++ /dev/null @@ -1,55 +0,0 @@ -package ssh - -import ( - "context" - "net" - "time" -) - -type serverConn struct { - net.Conn - - idleTimeout time.Duration - maxDeadline time.Time - closeCanceler context.CancelFunc -} - -func (c *serverConn) Write(p []byte) (n int, err error) { - c.updateDeadline() - n, err = c.Conn.Write(p) - if _, isNetErr := err.(net.Error); isNetErr && c.closeCanceler != nil { - c.closeCanceler() - } - return -} - -func (c *serverConn) Read(b []byte) (n int, err error) { - c.updateDeadline() - n, err = c.Conn.Read(b) - if _, isNetErr := err.(net.Error); isNetErr && c.closeCanceler != nil { - c.closeCanceler() - } - return -} - -func (c *serverConn) Close() (err error) { - err = c.Conn.Close() - if c.closeCanceler != nil { - c.closeCanceler() - } - return -} - -func (c *serverConn) updateDeadline() { - switch { - case c.idleTimeout > 0: - idleDeadline := time.Now().Add(c.idleTimeout) - if idleDeadline.Unix() < c.maxDeadline.Unix() || c.maxDeadline.IsZero() { - c.Conn.SetDeadline(idleDeadline) - return - } - fallthrough - default: - c.Conn.SetDeadline(c.maxDeadline) - } -} diff --git a/vendor/github.com/gliderlabs/ssh/context.go b/vendor/github.com/gliderlabs/ssh/context.go deleted file mode 100644 index 2f61a40d..00000000 --- a/vendor/github.com/gliderlabs/ssh/context.go +++ /dev/null @@ -1,152 +0,0 @@ -package ssh - -import ( - "context" - "encoding/hex" - "net" - "sync" - - gossh "golang.org/x/crypto/ssh" -) - -// contextKey is a value for use with context.WithValue. It's used as -// a pointer so it fits in an interface{} without allocation. -type contextKey struct { - name string -} - -var ( - // ContextKeyUser is a context key for use with Contexts in this package. - // The associated value will be of type string. - ContextKeyUser = &contextKey{"user"} - - // ContextKeySessionID is a context key for use with Contexts in this package. - // The associated value will be of type string. - ContextKeySessionID = &contextKey{"session-id"} - - // ContextKeyPermissions is a context key for use with Contexts in this package. - // The associated value will be of type *Permissions. - ContextKeyPermissions = &contextKey{"permissions"} - - // ContextKeyClientVersion is a context key for use with Contexts in this package. - // The associated value will be of type string. - ContextKeyClientVersion = &contextKey{"client-version"} - - // ContextKeyServerVersion is a context key for use with Contexts in this package. - // The associated value will be of type string. - ContextKeyServerVersion = &contextKey{"server-version"} - - // ContextKeyLocalAddr is a context key for use with Contexts in this package. - // The associated value will be of type net.Addr. - ContextKeyLocalAddr = &contextKey{"local-addr"} - - // ContextKeyRemoteAddr is a context key for use with Contexts in this package. - // The associated value will be of type net.Addr. - ContextKeyRemoteAddr = &contextKey{"remote-addr"} - - // ContextKeyServer is a context key for use with Contexts in this package. - // The associated value will be of type *Server. - ContextKeyServer = &contextKey{"ssh-server"} - - // ContextKeyConn is a context key for use with Contexts in this package. - // The associated value will be of type gossh.ServerConn. - ContextKeyConn = &contextKey{"ssh-conn"} - - // ContextKeyPublicKey is a context key for use with Contexts in this package. - // The associated value will be of type PublicKey. - ContextKeyPublicKey = &contextKey{"public-key"} -) - -// Context is a package specific context interface. It exposes connection -// metadata and allows new values to be easily written to it. It's used in -// authentication handlers and callbacks, and its underlying context.Context is -// exposed on Session in the session Handler. A connection-scoped lock is also -// embedded in the context to make it easier to limit operations per-connection. -type Context interface { - context.Context - sync.Locker - - // User returns the username used when establishing the SSH connection. - User() string - - // SessionID returns the session hash. - SessionID() string - - // ClientVersion returns the version reported by the client. - ClientVersion() string - - // ServerVersion returns the version reported by the server. - ServerVersion() string - - // RemoteAddr returns the remote address for this connection. - RemoteAddr() net.Addr - - // LocalAddr returns the local address for this connection. - LocalAddr() net.Addr - - // Permissions returns the Permissions object used for this connection. - Permissions() *Permissions - - // SetValue allows you to easily write new values into the underlying context. - SetValue(key, value interface{}) -} - -type sshContext struct { - context.Context - *sync.Mutex -} - -func newContext(srv *Server) (*sshContext, context.CancelFunc) { - innerCtx, cancel := context.WithCancel(context.Background()) - ctx := &sshContext{innerCtx, &sync.Mutex{}} - ctx.SetValue(ContextKeyServer, srv) - perms := &Permissions{&gossh.Permissions{}} - ctx.SetValue(ContextKeyPermissions, perms) - return ctx, cancel -} - -// this is separate from newContext because we will get ConnMetadata -// at different points so it needs to be applied separately -func applyConnMetadata(ctx Context, conn gossh.ConnMetadata) { - if ctx.Value(ContextKeySessionID) != nil { - return - } - ctx.SetValue(ContextKeySessionID, hex.EncodeToString(conn.SessionID())) - ctx.SetValue(ContextKeyClientVersion, string(conn.ClientVersion())) - ctx.SetValue(ContextKeyServerVersion, string(conn.ServerVersion())) - ctx.SetValue(ContextKeyUser, conn.User()) - ctx.SetValue(ContextKeyLocalAddr, conn.LocalAddr()) - ctx.SetValue(ContextKeyRemoteAddr, conn.RemoteAddr()) -} - -func (ctx *sshContext) SetValue(key, value interface{}) { - ctx.Context = context.WithValue(ctx.Context, key, value) -} - -func (ctx *sshContext) User() string { - return ctx.Value(ContextKeyUser).(string) -} - -func (ctx *sshContext) SessionID() string { - return ctx.Value(ContextKeySessionID).(string) -} - -func (ctx *sshContext) ClientVersion() string { - return ctx.Value(ContextKeyClientVersion).(string) -} - -func (ctx *sshContext) ServerVersion() string { - return ctx.Value(ContextKeyServerVersion).(string) -} - -func (ctx *sshContext) RemoteAddr() net.Addr { - return ctx.Value(ContextKeyRemoteAddr).(net.Addr) -} - -func (ctx *sshContext) LocalAddr() net.Addr { - return ctx.Value(ContextKeyLocalAddr).(net.Addr) -} - -func (ctx *sshContext) Permissions() *Permissions { - return ctx.Value(ContextKeyPermissions).(*Permissions) -} diff --git a/vendor/github.com/gliderlabs/ssh/doc.go b/vendor/github.com/gliderlabs/ssh/doc.go deleted file mode 100644 index 5a10393c..00000000 --- a/vendor/github.com/gliderlabs/ssh/doc.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Package ssh wraps the crypto/ssh package with a higher-level API for building -SSH servers. The goal of the API was to make it as simple as using net/http, so -the API is very similar. - -You should be able to build any SSH server using only this package, which wraps -relevant types and some functions from crypto/ssh. However, you still need to -use crypto/ssh for building SSH clients. - -ListenAndServe starts an SSH server with a given address, handler, and options. The -handler is usually nil, which means to use DefaultHandler. Handle sets DefaultHandler: - - ssh.Handle(func(s ssh.Session) { - io.WriteString(s, "Hello world\n") - }) - - log.Fatal(ssh.ListenAndServe(":2222", nil)) - -If you don't specify a host key, it will generate one every time. This is convenient -except you'll have to deal with clients being confused that the host key is different. -It's a better idea to generate or point to an existing key on your system: - - log.Fatal(ssh.ListenAndServe(":2222", nil, ssh.HostKeyFile("/Users/progrium/.ssh/id_rsa"))) - -Although all options have functional option helpers, another way to control the -server's behavior is by creating a custom Server: - - s := &ssh.Server{ - Addr: ":2222", - Handler: sessionHandler, - PublicKeyHandler: authHandler, - } - s.AddHostKey(hostKeySigner) - - log.Fatal(s.ListenAndServe()) - -This package automatically handles basic SSH requests like setting environment -variables, requesting PTY, and changing window size. These requests are -processed, responded to, and any relevant state is updated. This state is then -exposed to you via the Session interface. - -The one big feature missing from the Session abstraction is signals. This was -started, but not completed. Pull Requests welcome! -*/ -package ssh diff --git a/vendor/github.com/gliderlabs/ssh/options.go b/vendor/github.com/gliderlabs/ssh/options.go deleted file mode 100644 index af748985..00000000 --- a/vendor/github.com/gliderlabs/ssh/options.go +++ /dev/null @@ -1,77 +0,0 @@ -package ssh - -import ( - "io/ioutil" - - gossh "golang.org/x/crypto/ssh" -) - -// PasswordAuth returns a functional option that sets PasswordHandler on the server. -func PasswordAuth(fn PasswordHandler) Option { - return func(srv *Server) error { - srv.PasswordHandler = fn - return nil - } -} - -// PublicKeyAuth returns a functional option that sets PublicKeyHandler on the server. -func PublicKeyAuth(fn PublicKeyHandler) Option { - return func(srv *Server) error { - srv.PublicKeyHandler = fn - return nil - } -} - -// HostKeyFile returns a functional option that adds HostSigners to the server -// from a PEM file at filepath. -func HostKeyFile(filepath string) Option { - return func(srv *Server) error { - pemBytes, err := ioutil.ReadFile(filepath) - if err != nil { - return err - } - - signer, err := gossh.ParsePrivateKey(pemBytes) - if err != nil { - return err - } - - srv.AddHostKey(signer) - - return nil - } -} - -// HostKeyPEM returns a functional option that adds HostSigners to the server -// from a PEM file as bytes. -func HostKeyPEM(bytes []byte) Option { - return func(srv *Server) error { - signer, err := gossh.ParsePrivateKey(bytes) - if err != nil { - return err - } - - srv.AddHostKey(signer) - - return nil - } -} - -// NoPty returns a functional option that sets PtyCallback to return false, -// denying PTY requests. -func NoPty() Option { - return func(srv *Server) error { - srv.PtyCallback = func(ctx Context, pty Pty) bool { - return false - } - return nil - } -} - -// WrapConn returns a functional option that sets ConnCallback on the server. -func WrapConn(fn ConnCallback) Option { - return func(srv *Server) error { - srv.ConnCallback = fn - return nil - } -} diff --git a/vendor/github.com/gliderlabs/ssh/server.go b/vendor/github.com/gliderlabs/ssh/server.go deleted file mode 100644 index 359f9675..00000000 --- a/vendor/github.com/gliderlabs/ssh/server.go +++ /dev/null @@ -1,431 +0,0 @@ -package ssh - -import ( - "context" - "errors" - "fmt" - "net" - "sync" - "time" - - gossh "golang.org/x/crypto/ssh" -) - -// ErrServerClosed is returned by the Server's Serve, ListenAndServe, -// and ListenAndServeTLS methods after a call to Shutdown or Close. -var ErrServerClosed = errors.New("ssh: Server closed") - -type RequestHandler func(ctx Context, srv *Server, req *gossh.Request) (ok bool, payload []byte) - -var DefaultRequestHandlers = map[string]RequestHandler{} - -type ChannelHandler func(srv *Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx Context) - -var DefaultChannelHandlers = map[string]ChannelHandler{ - "session": DefaultSessionHandler, -} - -// Server defines parameters for running an SSH server. The zero value for -// Server is a valid configuration. When both PasswordHandler and -// PublicKeyHandler are nil, no client authentication is performed. -type Server struct { - Addr string // TCP address to listen on, ":22" if empty - Handler Handler // handler to invoke, ssh.DefaultHandler if nil - HostSigners []Signer // private keys for the host key, must have at least one - Version string // server version to be sent before the initial handshake - - KeyboardInteractiveHandler KeyboardInteractiveHandler // keyboard-interactive authentication handler - PasswordHandler PasswordHandler // password authentication handler - PublicKeyHandler PublicKeyHandler // public key authentication handler - PtyCallback PtyCallback // callback for allowing PTY sessions, allows all if nil - ConnCallback ConnCallback // optional callback for wrapping net.Conn before handling - LocalPortForwardingCallback LocalPortForwardingCallback // callback for allowing local port forwarding, denies all if nil - ReversePortForwardingCallback ReversePortForwardingCallback // callback for allowing reverse port forwarding, denies all if nil - ServerConfigCallback ServerConfigCallback // callback for configuring detailed SSH options - SessionRequestCallback SessionRequestCallback // callback for allowing or denying SSH sessions - - IdleTimeout time.Duration // connection timeout when no activity, none if empty - MaxTimeout time.Duration // absolute connection timeout, none if empty - - // ChannelHandlers allow overriding the built-in session handlers or provide - // extensions to the protocol, such as tcpip forwarding. By default only the - // "session" handler is enabled. - ChannelHandlers map[string]ChannelHandler - - // RequestHandlers allow overriding the server-level request handlers or - // provide extensions to the protocol, such as tcpip forwarding. By default - // no handlers are enabled. - RequestHandlers map[string]RequestHandler - - listenerWg sync.WaitGroup - mu sync.RWMutex - listeners map[net.Listener]struct{} - conns map[*gossh.ServerConn]struct{} - connWg sync.WaitGroup - doneChan chan struct{} -} - -func (srv *Server) ensureHostSigner() error { - srv.mu.Lock() - defer srv.mu.Unlock() - - if len(srv.HostSigners) == 0 { - signer, err := generateSigner() - if err != nil { - return err - } - srv.HostSigners = append(srv.HostSigners, signer) - } - return nil -} - -func (srv *Server) ensureHandlers() { - srv.mu.Lock() - defer srv.mu.Unlock() - - if srv.RequestHandlers == nil { - srv.RequestHandlers = map[string]RequestHandler{} - for k, v := range DefaultRequestHandlers { - srv.RequestHandlers[k] = v - } - } - if srv.ChannelHandlers == nil { - srv.ChannelHandlers = map[string]ChannelHandler{} - for k, v := range DefaultChannelHandlers { - srv.ChannelHandlers[k] = v - } - } -} - -func (srv *Server) config(ctx Context) *gossh.ServerConfig { - srv.mu.RLock() - defer srv.mu.RUnlock() - - var config *gossh.ServerConfig - if srv.ServerConfigCallback == nil { - config = &gossh.ServerConfig{} - } else { - config = srv.ServerConfigCallback(ctx) - } - for _, signer := range srv.HostSigners { - config.AddHostKey(signer) - } - if srv.PasswordHandler == nil && srv.PublicKeyHandler == nil { - config.NoClientAuth = true - } - if srv.Version != "" { - config.ServerVersion = "SSH-2.0-" + srv.Version - } - if srv.PasswordHandler != nil { - config.PasswordCallback = func(conn gossh.ConnMetadata, password []byte) (*gossh.Permissions, error) { - applyConnMetadata(ctx, conn) - if ok := srv.PasswordHandler(ctx, string(password)); !ok { - return ctx.Permissions().Permissions, fmt.Errorf("permission denied") - } - return ctx.Permissions().Permissions, nil - } - } - if srv.PublicKeyHandler != nil { - config.PublicKeyCallback = func(conn gossh.ConnMetadata, key gossh.PublicKey) (*gossh.Permissions, error) { - applyConnMetadata(ctx, conn) - if ok := srv.PublicKeyHandler(ctx, key); !ok { - return ctx.Permissions().Permissions, fmt.Errorf("permission denied") - } - ctx.SetValue(ContextKeyPublicKey, key) - return ctx.Permissions().Permissions, nil - } - } - if srv.KeyboardInteractiveHandler != nil { - config.KeyboardInteractiveCallback = func(conn gossh.ConnMetadata, challenger gossh.KeyboardInteractiveChallenge) (*gossh.Permissions, error) { - applyConnMetadata(ctx, conn) - if ok := srv.KeyboardInteractiveHandler(ctx, challenger); !ok { - return ctx.Permissions().Permissions, fmt.Errorf("permission denied") - } - return ctx.Permissions().Permissions, nil - } - } - return config -} - -// Handle sets the Handler for the server. -func (srv *Server) Handle(fn Handler) { - srv.mu.Lock() - defer srv.mu.Unlock() - - srv.Handler = fn -} - -// Close immediately closes all active listeners and all active -// connections. -// -// Close returns any error returned from closing the Server's -// underlying Listener(s). -func (srv *Server) Close() error { - srv.mu.Lock() - defer srv.mu.Unlock() - - srv.closeDoneChanLocked() - err := srv.closeListenersLocked() - for c := range srv.conns { - c.Close() - delete(srv.conns, c) - } - return err -} - -// Shutdown gracefully shuts down the server without interrupting any -// active connections. Shutdown works by first closing all open -// listeners, and then waiting indefinitely for connections to close. -// If the provided context expires before the shutdown is complete, -// then the context's error is returned. -func (srv *Server) Shutdown(ctx context.Context) error { - srv.mu.Lock() - lnerr := srv.closeListenersLocked() - srv.closeDoneChanLocked() - srv.mu.Unlock() - - finished := make(chan struct{}, 1) - go func() { - srv.listenerWg.Wait() - srv.connWg.Wait() - finished <- struct{}{} - }() - - select { - case <-ctx.Done(): - return ctx.Err() - case <-finished: - return lnerr - } -} - -// Serve accepts incoming connections on the Listener l, creating a new -// connection goroutine for each. The connection goroutines read requests and then -// calls srv.Handler to handle sessions. -// -// Serve always returns a non-nil error. -func (srv *Server) Serve(l net.Listener) error { - srv.ensureHandlers() - defer l.Close() - if err := srv.ensureHostSigner(); err != nil { - return err - } - if srv.Handler == nil { - srv.Handler = DefaultHandler - } - var tempDelay time.Duration - - srv.trackListener(l, true) - defer srv.trackListener(l, false) - for { - conn, e := l.Accept() - if e != nil { - select { - case <-srv.getDoneChan(): - return ErrServerClosed - default: - } - if ne, ok := e.(net.Error); ok && ne.Temporary() { - if tempDelay == 0 { - tempDelay = 5 * time.Millisecond - } else { - tempDelay *= 2 - } - if max := 1 * time.Second; tempDelay > max { - tempDelay = max - } - time.Sleep(tempDelay) - continue - } - return e - } - go srv.HandleConn(conn) - } -} - -func (srv *Server) HandleConn(newConn net.Conn) { - ctx, cancel := newContext(srv) - if srv.ConnCallback != nil { - cbConn := srv.ConnCallback(ctx, newConn) - if cbConn == nil { - newConn.Close() - return - } - newConn = cbConn - } - conn := &serverConn{ - Conn: newConn, - idleTimeout: srv.IdleTimeout, - closeCanceler: cancel, - } - if srv.MaxTimeout > 0 { - conn.maxDeadline = time.Now().Add(srv.MaxTimeout) - } - defer conn.Close() - sshConn, chans, reqs, err := gossh.NewServerConn(conn, srv.config(ctx)) - if err != nil { - // TODO: trigger event callback - return - } - - srv.trackConn(sshConn, true) - defer srv.trackConn(sshConn, false) - - ctx.SetValue(ContextKeyConn, sshConn) - applyConnMetadata(ctx, sshConn) - //go gossh.DiscardRequests(reqs) - go srv.handleRequests(ctx, reqs) - for ch := range chans { - handler := srv.ChannelHandlers[ch.ChannelType()] - if handler == nil { - handler = srv.ChannelHandlers["default"] - } - if handler == nil { - ch.Reject(gossh.UnknownChannelType, "unsupported channel type") - continue - } - go handler(srv, sshConn, ch, ctx) - } -} - -func (srv *Server) handleRequests(ctx Context, in <-chan *gossh.Request) { - for req := range in { - handler := srv.RequestHandlers[req.Type] - if handler == nil { - handler = srv.RequestHandlers["default"] - } - if handler == nil { - req.Reply(false, nil) - continue - } - /*reqCtx, cancel := context.WithCancel(ctx) - defer cancel() */ - ret, payload := handler(ctx, srv, req) - req.Reply(ret, payload) - } -} - -// ListenAndServe listens on the TCP network address srv.Addr and then calls -// Serve to handle incoming connections. If srv.Addr is blank, ":22" is used. -// ListenAndServe always returns a non-nil error. -func (srv *Server) ListenAndServe() error { - addr := srv.Addr - if addr == "" { - addr = ":22" - } - ln, err := net.Listen("tcp", addr) - if err != nil { - return err - } - return srv.Serve(ln) -} - -// AddHostKey adds a private key as a host key. If an existing host key exists -// with the same algorithm, it is overwritten. Each server config must have at -// least one host key. -func (srv *Server) AddHostKey(key Signer) { - srv.mu.Lock() - defer srv.mu.Unlock() - - // these are later added via AddHostKey on ServerConfig, which performs the - // check for one of every algorithm. - - // This check is based on the AddHostKey method from the x/crypto/ssh - // library. This allows us to only keep one active key for each type on a - // server at once. So, if you're dynamically updating keys at runtime, this - // list will not keep growing. - for i, k := range srv.HostSigners { - if k.PublicKey().Type() == key.PublicKey().Type() { - srv.HostSigners[i] = key - return - } - } - - srv.HostSigners = append(srv.HostSigners, key) -} - -// SetOption runs a functional option against the server. -func (srv *Server) SetOption(option Option) error { - // NOTE: there is a potential race here for any option that doesn't call an - // internal method. We can't actually lock here because if something calls - // (as an example) AddHostKey, it will deadlock. - - //srv.mu.Lock() - //defer srv.mu.Unlock() - - return option(srv) -} - -func (srv *Server) getDoneChan() <-chan struct{} { - srv.mu.Lock() - defer srv.mu.Unlock() - - return srv.getDoneChanLocked() -} - -func (srv *Server) getDoneChanLocked() chan struct{} { - if srv.doneChan == nil { - srv.doneChan = make(chan struct{}) - } - return srv.doneChan -} - -func (srv *Server) closeDoneChanLocked() { - ch := srv.getDoneChanLocked() - select { - case <-ch: - // Already closed. Don't close again. - default: - // Safe to close here. We're the only closer, guarded - // by srv.mu. - close(ch) - } -} - -func (srv *Server) closeListenersLocked() error { - var err error - for ln := range srv.listeners { - if cerr := ln.Close(); cerr != nil && err == nil { - err = cerr - } - delete(srv.listeners, ln) - } - return err -} - -func (srv *Server) trackListener(ln net.Listener, add bool) { - srv.mu.Lock() - defer srv.mu.Unlock() - - if srv.listeners == nil { - srv.listeners = make(map[net.Listener]struct{}) - } - if add { - // If the *Server is being reused after a previous - // Close or Shutdown, reset its doneChan: - if len(srv.listeners) == 0 && len(srv.conns) == 0 { - srv.doneChan = nil - } - srv.listeners[ln] = struct{}{} - srv.listenerWg.Add(1) - } else { - delete(srv.listeners, ln) - srv.listenerWg.Done() - } -} - -func (srv *Server) trackConn(c *gossh.ServerConn, add bool) { - srv.mu.Lock() - defer srv.mu.Unlock() - - if srv.conns == nil { - srv.conns = make(map[*gossh.ServerConn]struct{}) - } - if add { - srv.conns[c] = struct{}{} - srv.connWg.Add(1) - } else { - delete(srv.conns, c) - srv.connWg.Done() - } -} diff --git a/vendor/github.com/gliderlabs/ssh/session.go b/vendor/github.com/gliderlabs/ssh/session.go deleted file mode 100644 index 6c77d6c8..00000000 --- a/vendor/github.com/gliderlabs/ssh/session.go +++ /dev/null @@ -1,308 +0,0 @@ -package ssh - -import ( - "bytes" - "context" - "errors" - "fmt" - "net" - "sync" - - "github.com/anmitsu/go-shlex" - gossh "golang.org/x/crypto/ssh" -) - -// Session provides access to information about an SSH session and methods -// to read and write to the SSH channel with an embedded Channel interface from -// cypto/ssh. -// -// When Command() returns an empty slice, the user requested a shell. Otherwise -// the user is performing an exec with those command arguments. -// -// TODO: Signals -type Session interface { - gossh.Channel - - // User returns the username used when establishing the SSH connection. - User() string - - // RemoteAddr returns the net.Addr of the client side of the connection. - RemoteAddr() net.Addr - - // LocalAddr returns the net.Addr of the server side of the connection. - LocalAddr() net.Addr - - // Environ returns a copy of strings representing the environment set by the - // user for this session, in the form "key=value". - Environ() []string - - // Exit sends an exit status and then closes the session. - Exit(code int) error - - // Command returns a shell parsed slice of arguments that were provided by the - // user. Shell parsing splits the command string according to POSIX shell rules, - // which considers quoting not just whitespace. - Command() []string - - // RawCommand returns the exact command that was provided by the user. - RawCommand() string - - // PublicKey returns the PublicKey used to authenticate. If a public key was not - // used it will return nil. - PublicKey() PublicKey - - // Context returns the connection's context. The returned context is always - // non-nil and holds the same data as the Context passed into auth - // handlers and callbacks. - // - // The context is canceled when the client's connection closes or I/O - // operation fails. - Context() context.Context - - // Permissions returns a copy of the Permissions object that was available for - // setup in the auth handlers via the Context. - Permissions() Permissions - - // Pty returns PTY information, a channel of window size changes, and a boolean - // of whether or not a PTY was accepted for this session. - Pty() (Pty, <-chan Window, bool) - - // Signals registers a channel to receive signals sent from the client. The - // channel must handle signal sends or it will block the SSH request loop. - // Registering nil will unregister the channel from signal sends. During the - // time no channel is registered signals are buffered up to a reasonable amount. - // If there are buffered signals when a channel is registered, they will be - // sent in order on the channel immediately after registering. - Signals(c chan<- Signal) -} - -// maxSigBufSize is how many signals will be buffered -// when there is no signal channel specified -const maxSigBufSize = 128 - -func DefaultSessionHandler(srv *Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx Context) { - ch, reqs, err := newChan.Accept() - if err != nil { - // TODO: trigger event callback - return - } - sess := &session{ - Channel: ch, - conn: conn, - handler: srv.Handler, - ptyCb: srv.PtyCallback, - sessReqCb: srv.SessionRequestCallback, - ctx: ctx, - } - sess.handleRequests(reqs) -} - -type session struct { - sync.Mutex - gossh.Channel - conn *gossh.ServerConn - handler Handler - handled bool - exited bool - pty *Pty - winch chan Window - env []string - ptyCb PtyCallback - sessReqCb SessionRequestCallback - rawCmd string - ctx Context - sigCh chan<- Signal - sigBuf []Signal -} - -func (sess *session) Write(p []byte) (n int, err error) { - if sess.pty != nil { - m := len(p) - // normalize \n to \r\n when pty is accepted. - // this is a hardcoded shortcut since we don't support terminal modes. - p = bytes.Replace(p, []byte{'\n'}, []byte{'\r', '\n'}, -1) - p = bytes.Replace(p, []byte{'\r', '\r', '\n'}, []byte{'\r', '\n'}, -1) - n, err = sess.Channel.Write(p) - if n > m { - n = m - } - return - } - return sess.Channel.Write(p) -} - -func (sess *session) PublicKey() PublicKey { - sessionkey := sess.ctx.Value(ContextKeyPublicKey) - if sessionkey == nil { - return nil - } - return sessionkey.(PublicKey) -} - -func (sess *session) Permissions() Permissions { - // use context permissions because its properly - // wrapped and easier to dereference - perms := sess.ctx.Value(ContextKeyPermissions).(*Permissions) - return *perms -} - -func (sess *session) Context() context.Context { - return sess.ctx -} - -func (sess *session) Exit(code int) error { - sess.Lock() - defer sess.Unlock() - if sess.exited { - return errors.New("Session.Exit called multiple times") - } - sess.exited = true - - status := struct{ Status uint32 }{uint32(code)} - _, err := sess.SendRequest("exit-status", false, gossh.Marshal(&status)) - if err != nil { - return err - } - return sess.Close() -} - -func (sess *session) User() string { - return sess.conn.User() -} - -func (sess *session) RemoteAddr() net.Addr { - return sess.conn.RemoteAddr() -} - -func (sess *session) LocalAddr() net.Addr { - return sess.conn.LocalAddr() -} - -func (sess *session) Environ() []string { - return append([]string(nil), sess.env...) -} - -func (sess *session) RawCommand() string { - return sess.rawCmd -} - -func (sess *session) Command() []string { - cmd, _ := shlex.Split(sess.rawCmd, true) - return append([]string(nil), cmd...) -} - -func (sess *session) Pty() (Pty, <-chan Window, bool) { - if sess.pty != nil { - return *sess.pty, sess.winch, true - } - return Pty{}, sess.winch, false -} - -func (sess *session) Signals(c chan<- Signal) { - sess.Lock() - defer sess.Unlock() - sess.sigCh = c - if len(sess.sigBuf) > 0 { - go func() { - for _, sig := range sess.sigBuf { - sess.sigCh <- sig - } - }() - } -} - -func (sess *session) handleRequests(reqs <-chan *gossh.Request) { - for req := range reqs { - switch req.Type { - case "shell", "exec": - if sess.handled { - req.Reply(false, nil) - continue - } - - var payload = struct{ Value string }{} - gossh.Unmarshal(req.Payload, &payload) - sess.rawCmd = payload.Value - - // If there's a session policy callback, we need to confirm before - // accepting the session. - if sess.sessReqCb != nil && !sess.sessReqCb(sess, req.Type) { - sess.rawCmd = "" - req.Reply(false, nil) - continue - } - - sess.handled = true - req.Reply(true, nil) - - go func() { - sess.handler(sess) - sess.Exit(0) - }() - case "env": - if sess.handled { - req.Reply(false, nil) - continue - } - var kv struct{ Key, Value string } - gossh.Unmarshal(req.Payload, &kv) - sess.env = append(sess.env, fmt.Sprintf("%s=%s", kv.Key, kv.Value)) - req.Reply(true, nil) - case "signal": - var payload struct{ Signal string } - gossh.Unmarshal(req.Payload, &payload) - sess.Lock() - if sess.sigCh != nil { - sess.sigCh <- Signal(payload.Signal) - } else { - if len(sess.sigBuf) < maxSigBufSize { - sess.sigBuf = append(sess.sigBuf, Signal(payload.Signal)) - } - } - sess.Unlock() - case "pty-req": - if sess.handled || sess.pty != nil { - req.Reply(false, nil) - continue - } - ptyReq, ok := parsePtyRequest(req.Payload) - if !ok { - req.Reply(false, nil) - continue - } - if sess.ptyCb != nil { - ok := sess.ptyCb(sess.ctx, ptyReq) - if !ok { - req.Reply(false, nil) - continue - } - } - sess.pty = &ptyReq - sess.winch = make(chan Window, 1) - sess.winch <- ptyReq.Window - defer func() { - // when reqs is closed - close(sess.winch) - }() - req.Reply(ok, nil) - case "window-change": - if sess.pty == nil { - req.Reply(false, nil) - continue - } - win, ok := parseWinchRequest(req.Payload) - if ok { - sess.pty.Window = win - sess.winch <- win - } - req.Reply(ok, nil) - case agentRequestType: - // TODO: option/callback to allow agent forwarding - SetAgentRequested(sess.ctx) - req.Reply(true, nil) - default: - // TODO: debug log - req.Reply(false, nil) - } - } -} diff --git a/vendor/github.com/gliderlabs/ssh/ssh.go b/vendor/github.com/gliderlabs/ssh/ssh.go deleted file mode 100644 index 9673ac3e..00000000 --- a/vendor/github.com/gliderlabs/ssh/ssh.go +++ /dev/null @@ -1,123 +0,0 @@ -package ssh - -import ( - "crypto/subtle" - "net" - - gossh "golang.org/x/crypto/ssh" -) - -type Signal string - -// POSIX signals as listed in RFC 4254 Section 6.10. -const ( - SIGABRT Signal = "ABRT" - SIGALRM Signal = "ALRM" - SIGFPE Signal = "FPE" - SIGHUP Signal = "HUP" - SIGILL Signal = "ILL" - SIGINT Signal = "INT" - SIGKILL Signal = "KILL" - SIGPIPE Signal = "PIPE" - SIGQUIT Signal = "QUIT" - SIGSEGV Signal = "SEGV" - SIGTERM Signal = "TERM" - SIGUSR1 Signal = "USR1" - SIGUSR2 Signal = "USR2" -) - -// DefaultHandler is the default Handler used by Serve. -var DefaultHandler Handler - -// Option is a functional option handler for Server. -type Option func(*Server) error - -// Handler is a callback for handling established SSH sessions. -type Handler func(Session) - -// PublicKeyHandler is a callback for performing public key authentication. -type PublicKeyHandler func(ctx Context, key PublicKey) bool - -// PasswordHandler is a callback for performing password authentication. -type PasswordHandler func(ctx Context, password string) bool - -// KeyboardInteractiveHandler is a callback for performing keyboard-interactive authentication. -type KeyboardInteractiveHandler func(ctx Context, challenger gossh.KeyboardInteractiveChallenge) bool - -// PtyCallback is a hook for allowing PTY sessions. -type PtyCallback func(ctx Context, pty Pty) bool - -// SessionRequestCallback is a callback for allowing or denying SSH sessions. -type SessionRequestCallback func(sess Session, requestType string) bool - -// ConnCallback is a hook for new connections before handling. -// It allows wrapping for timeouts and limiting by returning -// the net.Conn that will be used as the underlying connection. -type ConnCallback func(ctx Context, conn net.Conn) net.Conn - -// LocalPortForwardingCallback is a hook for allowing port forwarding -type LocalPortForwardingCallback func(ctx Context, destinationHost string, destinationPort uint32) bool - -// ReversePortForwardingCallback is a hook for allowing reverse port forwarding -type ReversePortForwardingCallback func(ctx Context, bindHost string, bindPort uint32) bool - -// ServerConfigCallback is a hook for creating custom default server configs -type ServerConfigCallback func(ctx Context) *gossh.ServerConfig - -// Window represents the size of a PTY window. -type Window struct { - Width int - Height int -} - -// Pty represents a PTY request and configuration. -type Pty struct { - Term string - Window Window - // HELP WANTED: terminal modes! -} - -// Serve accepts incoming SSH connections on the listener l, creating a new -// connection goroutine for each. The connection goroutines read requests and -// then calls handler to handle sessions. Handler is typically nil, in which -// case the DefaultHandler is used. -func Serve(l net.Listener, handler Handler, options ...Option) error { - srv := &Server{Handler: handler} - for _, option := range options { - if err := srv.SetOption(option); err != nil { - return err - } - } - return srv.Serve(l) -} - -// ListenAndServe listens on the TCP network address addr and then calls Serve -// with handler to handle sessions on incoming connections. Handler is typically -// nil, in which case the DefaultHandler is used. -func ListenAndServe(addr string, handler Handler, options ...Option) error { - srv := &Server{Addr: addr, Handler: handler} - for _, option := range options { - if err := srv.SetOption(option); err != nil { - return err - } - } - return srv.ListenAndServe() -} - -// Handle registers the handler as the DefaultHandler. -func Handle(handler Handler) { - DefaultHandler = handler -} - -// KeysEqual is constant time compare of the keys to avoid timing attacks. -func KeysEqual(ak, bk PublicKey) bool { - - //avoid panic if one of the keys is nil, return false instead - if ak == nil || bk == nil { - return false - } - - a := ak.Marshal() - b := bk.Marshal() - return (len(a) == len(b) && subtle.ConstantTimeCompare(a, b) == 1) -} diff --git a/vendor/github.com/gliderlabs/ssh/tcpip.go b/vendor/github.com/gliderlabs/ssh/tcpip.go deleted file mode 100644 index 335fda65..00000000 --- a/vendor/github.com/gliderlabs/ssh/tcpip.go +++ /dev/null @@ -1,193 +0,0 @@ -package ssh - -import ( - "io" - "log" - "net" - "strconv" - "sync" - - gossh "golang.org/x/crypto/ssh" -) - -const ( - forwardedTCPChannelType = "forwarded-tcpip" -) - -// direct-tcpip data struct as specified in RFC4254, Section 7.2 -type localForwardChannelData struct { - DestAddr string - DestPort uint32 - - OriginAddr string - OriginPort uint32 -} - -// DirectTCPIPHandler can be enabled by adding it to the server's -// ChannelHandlers under direct-tcpip. -func DirectTCPIPHandler(srv *Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx Context) { - d := localForwardChannelData{} - if err := gossh.Unmarshal(newChan.ExtraData(), &d); err != nil { - newChan.Reject(gossh.ConnectionFailed, "error parsing forward data: "+err.Error()) - return - } - - if srv.LocalPortForwardingCallback == nil || !srv.LocalPortForwardingCallback(ctx, d.DestAddr, d.DestPort) { - newChan.Reject(gossh.Prohibited, "port forwarding is disabled") - return - } - - dest := net.JoinHostPort(d.DestAddr, strconv.FormatInt(int64(d.DestPort), 10)) - - var dialer net.Dialer - dconn, err := dialer.DialContext(ctx, "tcp", dest) - if err != nil { - newChan.Reject(gossh.ConnectionFailed, err.Error()) - return - } - - ch, reqs, err := newChan.Accept() - if err != nil { - dconn.Close() - return - } - go gossh.DiscardRequests(reqs) - - go func() { - defer ch.Close() - defer dconn.Close() - io.Copy(ch, dconn) - }() - go func() { - defer ch.Close() - defer dconn.Close() - io.Copy(dconn, ch) - }() -} - -type remoteForwardRequest struct { - BindAddr string - BindPort uint32 -} - -type remoteForwardSuccess struct { - BindPort uint32 -} - -type remoteForwardCancelRequest struct { - BindAddr string - BindPort uint32 -} - -type remoteForwardChannelData struct { - DestAddr string - DestPort uint32 - OriginAddr string - OriginPort uint32 -} - -// ForwardedTCPHandler can be enabled by creating a ForwardedTCPHandler and -// adding the HandleSSHRequest callback to the server's RequestHandlers under -// tcpip-forward and cancel-tcpip-forward. -type ForwardedTCPHandler struct { - forwards map[string]net.Listener - sync.Mutex -} - -func (h *ForwardedTCPHandler) HandleSSHRequest(ctx Context, srv *Server, req *gossh.Request) (bool, []byte) { - h.Lock() - if h.forwards == nil { - h.forwards = make(map[string]net.Listener) - } - h.Unlock() - conn := ctx.Value(ContextKeyConn).(*gossh.ServerConn) - switch req.Type { - case "tcpip-forward": - var reqPayload remoteForwardRequest - if err := gossh.Unmarshal(req.Payload, &reqPayload); err != nil { - // TODO: log parse failure - return false, []byte{} - } - if srv.ReversePortForwardingCallback == nil || !srv.ReversePortForwardingCallback(ctx, reqPayload.BindAddr, reqPayload.BindPort) { - return false, []byte("port forwarding is disabled") - } - addr := net.JoinHostPort(reqPayload.BindAddr, strconv.Itoa(int(reqPayload.BindPort))) - ln, err := net.Listen("tcp", addr) - if err != nil { - // TODO: log listen failure - return false, []byte{} - } - _, destPortStr, _ := net.SplitHostPort(ln.Addr().String()) - destPort, _ := strconv.Atoi(destPortStr) - h.Lock() - h.forwards[addr] = ln - h.Unlock() - go func() { - <-ctx.Done() - h.Lock() - ln, ok := h.forwards[addr] - h.Unlock() - if ok { - ln.Close() - } - }() - go func() { - for { - c, err := ln.Accept() - if err != nil { - // TODO: log accept failure - break - } - originAddr, orignPortStr, _ := net.SplitHostPort(c.RemoteAddr().String()) - originPort, _ := strconv.Atoi(orignPortStr) - payload := gossh.Marshal(&remoteForwardChannelData{ - DestAddr: reqPayload.BindAddr, - DestPort: uint32(destPort), - OriginAddr: originAddr, - OriginPort: uint32(originPort), - }) - go func() { - ch, reqs, err := conn.OpenChannel(forwardedTCPChannelType, payload) - if err != nil { - // TODO: log failure to open channel - log.Println(err) - c.Close() - return - } - go gossh.DiscardRequests(reqs) - go func() { - defer ch.Close() - defer c.Close() - io.Copy(ch, c) - }() - go func() { - defer ch.Close() - defer c.Close() - io.Copy(c, ch) - }() - }() - } - h.Lock() - delete(h.forwards, addr) - h.Unlock() - }() - return true, gossh.Marshal(&remoteForwardSuccess{uint32(destPort)}) - - case "cancel-tcpip-forward": - var reqPayload remoteForwardCancelRequest - if err := gossh.Unmarshal(req.Payload, &reqPayload); err != nil { - // TODO: log parse failure - return false, []byte{} - } - addr := net.JoinHostPort(reqPayload.BindAddr, strconv.Itoa(int(reqPayload.BindPort))) - h.Lock() - ln, ok := h.forwards[addr] - h.Unlock() - if ok { - ln.Close() - } - return true, nil - default: - return false, nil - } -} diff --git a/vendor/github.com/gliderlabs/ssh/util.go b/vendor/github.com/gliderlabs/ssh/util.go deleted file mode 100644 index 015a44ec..00000000 --- a/vendor/github.com/gliderlabs/ssh/util.go +++ /dev/null @@ -1,83 +0,0 @@ -package ssh - -import ( - "crypto/rand" - "crypto/rsa" - "encoding/binary" - - "golang.org/x/crypto/ssh" -) - -func generateSigner() (ssh.Signer, error) { - key, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - return nil, err - } - return ssh.NewSignerFromKey(key) -} - -func parsePtyRequest(s []byte) (pty Pty, ok bool) { - term, s, ok := parseString(s) - if !ok { - return - } - width32, s, ok := parseUint32(s) - if !ok { - return - } - height32, _, ok := parseUint32(s) - if !ok { - return - } - pty = Pty{ - Term: term, - Window: Window{ - Width: int(width32), - Height: int(height32), - }, - } - return -} - -func parseWinchRequest(s []byte) (win Window, ok bool) { - width32, s, ok := parseUint32(s) - if width32 < 1 { - ok = false - } - if !ok { - return - } - height32, _, ok := parseUint32(s) - if height32 < 1 { - ok = false - } - if !ok { - return - } - win = Window{ - Width: int(width32), - Height: int(height32), - } - return -} - -func parseString(in []byte) (out string, rest []byte, ok bool) { - if len(in) < 4 { - return - } - length := binary.BigEndian.Uint32(in) - if uint32(len(in)) < 4+length { - return - } - out = string(in[4 : 4+length]) - rest = in[4+length:] - ok = true - return -} - -func parseUint32(in []byte) (uint32, []byte, bool) { - if len(in) < 4 { - return 0, nil, false - } - return binary.BigEndian.Uint32(in), in[4:], true -} diff --git a/vendor/github.com/gliderlabs/ssh/wrap.go b/vendor/github.com/gliderlabs/ssh/wrap.go deleted file mode 100644 index d1f2b161..00000000 --- a/vendor/github.com/gliderlabs/ssh/wrap.go +++ /dev/null @@ -1,33 +0,0 @@ -package ssh - -import gossh "golang.org/x/crypto/ssh" - -// PublicKey is an abstraction of different types of public keys. -type PublicKey interface { - gossh.PublicKey -} - -// The Permissions type holds fine-grained permissions that are specific to a -// user or a specific authentication method for a user. Permissions, except for -// "source-address", must be enforced in the server application layer, after -// successful authentication. -type Permissions struct { - *gossh.Permissions -} - -// A Signer can create signatures that verify against a public key. -type Signer interface { - gossh.Signer -} - -// ParseAuthorizedKey parses a public key from an authorized_keys file used in -// OpenSSH according to the sshd(8) manual page. -func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) { - return gossh.ParseAuthorizedKey(in) -} - -// ParsePublicKey parses an SSH public key formatted for use in -// the SSH wire protocol according to RFC 4253, section 6.6. -func ParsePublicKey(in []byte) (out PublicKey, err error) { - return gossh.ParsePublicKey(in) -} diff --git a/vendor/github.com/go-playground/locales/.gitignore b/vendor/github.com/go-playground/locales/.gitignore deleted file mode 100644 index daf913b1..00000000 --- a/vendor/github.com/go-playground/locales/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof diff --git a/vendor/github.com/go-playground/locales/.travis.yml b/vendor/github.com/go-playground/locales/.travis.yml deleted file mode 100644 index d50237a6..00000000 --- a/vendor/github.com/go-playground/locales/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: go -go: - - 1.13.1 - - tip -matrix: - allow_failures: - - go: tip - -notifications: - email: - recipients: dean.karn@gmail.com - on_success: change - on_failure: always - -before_install: - - go install github.com/mattn/goveralls - -# Only clone the most recent commit. -git: - depth: 1 - -script: - - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... - -after_success: | - goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/locales/LICENSE b/vendor/github.com/go-playground/locales/LICENSE deleted file mode 100644 index 75854ac4..00000000 --- a/vendor/github.com/go-playground/locales/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Go Playground - -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. \ No newline at end of file diff --git a/vendor/github.com/go-playground/locales/README.md b/vendor/github.com/go-playground/locales/README.md deleted file mode 100644 index ba1b0680..00000000 --- a/vendor/github.com/go-playground/locales/README.md +++ /dev/null @@ -1,172 +0,0 @@ -## locales -![Project status](https://img.shields.io/badge/version-0.13.0-green.svg) -[![Build Status](https://travis-ci.org/go-playground/locales.svg?branch=master)](https://travis-ci.org/go-playground/locales) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/locales)](https://goreportcard.com/report/github.com/go-playground/locales) -[![GoDoc](https://godoc.org/github.com/go-playground/locales?status.svg)](https://godoc.org/github.com/go-playground/locales) -![License](https://img.shields.io/dub/l/vibe-d.svg) -[![Gitter](https://badges.gitter.im/go-playground/locales.svg)](https://gitter.im/go-playground/locales?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Locales is a set of locales generated from the [Unicode CLDR Project](http://cldr.unicode.org/) which can be used independently or within -an i18n package; these were built for use with, but not exclusive to, [Universal Translator](https://github.com/go-playground/universal-translator). - -Features --------- -- [x] Rules generated from the latest [CLDR](http://cldr.unicode.org/index/downloads) data, v31.0.1 -- [x] Contains Cardinal, Ordinal and Range Plural Rules -- [x] Contains Month, Weekday and Timezone translations built in -- [x] Contains Date & Time formatting functions -- [x] Contains Number, Currency, Accounting and Percent formatting functions -- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere ) - -Full Tests --------------------- -I could sure use your help adding tests for every locale, it is a huge undertaking and I just don't have the free time to do it all at the moment; -any help would be **greatly appreciated!!!!** please see [issue](https://github.com/go-playground/locales/issues/1) for details. - -Installation ------------ - -Use go get - -```shell -go get github.com/go-playground/locales -``` - -NOTES --------- -You'll notice most return types are []byte, this is because most of the time the results will be concatenated with a larger body -of text and can avoid some allocations if already appending to a byte array, otherwise just cast as string. - -Usage -------- -```go -package main - -import ( - "fmt" - "time" - - "github.com/go-playground/locales/currency" - "github.com/go-playground/locales/en_CA" -) - -func main() { - - loc, _ := time.LoadLocation("America/Toronto") - datetime := time.Date(2016, 02, 03, 9, 0, 1, 0, loc) - - l := en_CA.New() - - // Dates - fmt.Println(l.FmtDateFull(datetime)) - fmt.Println(l.FmtDateLong(datetime)) - fmt.Println(l.FmtDateMedium(datetime)) - fmt.Println(l.FmtDateShort(datetime)) - - // Times - fmt.Println(l.FmtTimeFull(datetime)) - fmt.Println(l.FmtTimeLong(datetime)) - fmt.Println(l.FmtTimeMedium(datetime)) - fmt.Println(l.FmtTimeShort(datetime)) - - // Months Wide - fmt.Println(l.MonthWide(time.January)) - fmt.Println(l.MonthWide(time.February)) - fmt.Println(l.MonthWide(time.March)) - // ... - - // Months Abbreviated - fmt.Println(l.MonthAbbreviated(time.January)) - fmt.Println(l.MonthAbbreviated(time.February)) - fmt.Println(l.MonthAbbreviated(time.March)) - // ... - - // Months Narrow - fmt.Println(l.MonthNarrow(time.January)) - fmt.Println(l.MonthNarrow(time.February)) - fmt.Println(l.MonthNarrow(time.March)) - // ... - - // Weekdays Wide - fmt.Println(l.WeekdayWide(time.Sunday)) - fmt.Println(l.WeekdayWide(time.Monday)) - fmt.Println(l.WeekdayWide(time.Tuesday)) - // ... - - // Weekdays Abbreviated - fmt.Println(l.WeekdayAbbreviated(time.Sunday)) - fmt.Println(l.WeekdayAbbreviated(time.Monday)) - fmt.Println(l.WeekdayAbbreviated(time.Tuesday)) - // ... - - // Weekdays Short - fmt.Println(l.WeekdayShort(time.Sunday)) - fmt.Println(l.WeekdayShort(time.Monday)) - fmt.Println(l.WeekdayShort(time.Tuesday)) - // ... - - // Weekdays Narrow - fmt.Println(l.WeekdayNarrow(time.Sunday)) - fmt.Println(l.WeekdayNarrow(time.Monday)) - fmt.Println(l.WeekdayNarrow(time.Tuesday)) - // ... - - var f64 float64 - - f64 = -10356.4523 - - // Number - fmt.Println(l.FmtNumber(f64, 2)) - - // Currency - fmt.Println(l.FmtCurrency(f64, 2, currency.CAD)) - fmt.Println(l.FmtCurrency(f64, 2, currency.USD)) - - // Accounting - fmt.Println(l.FmtAccounting(f64, 2, currency.CAD)) - fmt.Println(l.FmtAccounting(f64, 2, currency.USD)) - - f64 = 78.12 - - // Percent - fmt.Println(l.FmtPercent(f64, 0)) - - // Plural Rules for locale, so you know what rules you must cover - fmt.Println(l.PluralsCardinal()) - fmt.Println(l.PluralsOrdinal()) - - // Cardinal Plural Rules - fmt.Println(l.CardinalPluralRule(1, 0)) - fmt.Println(l.CardinalPluralRule(1.0, 0)) - fmt.Println(l.CardinalPluralRule(1.0, 1)) - fmt.Println(l.CardinalPluralRule(3, 0)) - - // Ordinal Plural Rules - fmt.Println(l.OrdinalPluralRule(21, 0)) // 21st - fmt.Println(l.OrdinalPluralRule(22, 0)) // 22nd - fmt.Println(l.OrdinalPluralRule(33, 0)) // 33rd - fmt.Println(l.OrdinalPluralRule(34, 0)) // 34th - - // Range Plural Rules - fmt.Println(l.RangePluralRule(1, 0, 1, 0)) // 1-1 - fmt.Println(l.RangePluralRule(1, 0, 2, 0)) // 1-2 - fmt.Println(l.RangePluralRule(5, 0, 8, 0)) // 5-8 -} -``` - -NOTES: -------- -These rules were generated from the [Unicode CLDR Project](http://cldr.unicode.org/), if you encounter any issues -I strongly encourage contributing to the CLDR project to get the locale information corrected and the next time -these locales are regenerated the fix will come with. - -I do however realize that time constraints are often important and so there are two options: - -1. Create your own locale, copy, paste and modify, and ensure it complies with the `Translator` interface. -2. Add an exception in the locale generation code directly and once regenerated, fix will be in place. - -Please to not make fixes inside the locale files, they WILL get overwritten when the locales are regenerated. - -License ------- -Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/locales/currency/currency.go b/vendor/github.com/go-playground/locales/currency/currency.go deleted file mode 100644 index cdaba596..00000000 --- a/vendor/github.com/go-playground/locales/currency/currency.go +++ /dev/null @@ -1,308 +0,0 @@ -package currency - -// Type is the currency type associated with the locales currency enum -type Type int - -// locale currencies -const ( - ADP Type = iota - AED - AFA - AFN - ALK - ALL - AMD - ANG - AOA - AOK - AON - AOR - ARA - ARL - ARM - ARP - ARS - ATS - AUD - AWG - AZM - AZN - BAD - BAM - BAN - BBD - BDT - BEC - BEF - BEL - BGL - BGM - BGN - BGO - BHD - BIF - BMD - BND - BOB - BOL - BOP - BOV - BRB - BRC - BRE - BRL - BRN - BRR - BRZ - BSD - BTN - BUK - BWP - BYB - BYN - BYR - BZD - CAD - CDF - CHE - CHF - CHW - CLE - CLF - CLP - CNH - CNX - CNY - COP - COU - CRC - CSD - CSK - CUC - CUP - CVE - CYP - CZK - DDM - DEM - DJF - DKK - DOP - DZD - ECS - ECV - EEK - EGP - ERN - ESA - ESB - ESP - ETB - EUR - FIM - FJD - FKP - FRF - GBP - GEK - GEL - GHC - GHS - GIP - GMD - GNF - GNS - GQE - GRD - GTQ - GWE - GWP - GYD - HKD - HNL - HRD - HRK - HTG - HUF - IDR - IEP - ILP - ILR - ILS - INR - IQD - IRR - ISJ - ISK - ITL - JMD - JOD - JPY - KES - KGS - KHR - KMF - KPW - KRH - KRO - KRW - KWD - KYD - KZT - LAK - LBP - LKR - LRD - LSL - LTL - LTT - LUC - LUF - LUL - LVL - LVR - LYD - MAD - MAF - MCF - MDC - MDL - MGA - MGF - MKD - MKN - MLF - MMK - MNT - MOP - MRO - MTL - MTP - MUR - MVP - MVR - MWK - MXN - MXP - MXV - MYR - MZE - MZM - MZN - NAD - NGN - NIC - NIO - NLG - NOK - NPR - NZD - OMR - PAB - PEI - PEN - PES - PGK - PHP - PKR - PLN - PLZ - PTE - PYG - QAR - RHD - ROL - RON - RSD - RUB - RUR - RWF - SAR - SBD - SCR - SDD - SDG - SDP - SEK - SGD - SHP - SIT - SKK - SLL - SOS - SRD - SRG - SSP - STD - STN - SUR - SVC - SYP - SZL - THB - TJR - TJS - TMM - TMT - TND - TOP - TPE - TRL - TRY - TTD - TWD - TZS - UAH - UAK - UGS - UGX - USD - USN - USS - UYI - UYP - UYU - UZS - VEB - VEF - VND - VNN - VUV - WST - XAF - XAG - XAU - XBA - XBB - XBC - XBD - XCD - XDR - XEU - XFO - XFU - XOF - XPD - XPF - XPT - XRE - XSU - XTS - XUA - XXX - YDD - YER - YUD - YUM - YUN - YUR - ZAL - ZAR - ZMK - ZMW - ZRN - ZRZ - ZWD - ZWL - ZWR -) diff --git a/vendor/github.com/go-playground/locales/go.mod b/vendor/github.com/go-playground/locales/go.mod deleted file mode 100644 index 34ab6f23..00000000 --- a/vendor/github.com/go-playground/locales/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/go-playground/locales - -go 1.13 - -require golang.org/x/text v0.3.2 diff --git a/vendor/github.com/go-playground/locales/go.sum b/vendor/github.com/go-playground/locales/go.sum deleted file mode 100644 index 63c9200f..00000000 --- a/vendor/github.com/go-playground/locales/go.sum +++ /dev/null @@ -1,3 +0,0 @@ -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/go-playground/locales/logo.png b/vendor/github.com/go-playground/locales/logo.png deleted file mode 100644 index 3038276e6873076ecd542099e95b25037b1c0c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37360 zcmV(-K-|BHP)ysx*JK zMpBX=dbK}5gAy}y3R{{beYQe$t~_(EI9HY=983!yQ4BbH2t9fee6m7kr7b^x7%_4X zJ9`gfp(=T?K~s?>F>nbtbqz;?9&D*HLWLAVf)p1<2qIzzh`mlUaSo2aQfQ+xioj4u zi57RSK09+4J$n}=VG1>K6C+;`IdT#dKnQiRIYfOMa;!RRrZpi|42HT(K7kH5Z51D0 z2RV8bBU%zznI$e~3~;G9N{kpKWf73XRDQWdPL3KgZV)nR5J7tvJAVu-VG5JQScJDo zR+bL!Ta3IbT6ncoYNbC?j4!6pWoxTBl*n#=wPJ6nPG_V?T&y%kcr-zED1W(DRHZFT zhB7~qA6u3+V3JBCZ4gs{L}jKoF=`!luS|!&X@DUWZdUYba2WIU7L}XOvil!bU7wAXuO|PIN?OtwU_FF?ptGuGegAxjs8(G9yYG zg|%{%%2R#1JvUt~pwDwIP%5I+ft0_2vEYw`$yQ3QA)Db+A{7b_0054wNkl}YE}wrc9DS+rDCwcq-kLn z6*rr9Gievg)&9W#+|En4X(tdH=fj-$InQ~{3w3k;I<^V903k*-k%?L`+gy zD<80`%CcVCt7&b)>-AWo}M*k4L#h*SN=*WN=wOPGQCc(S19x{GH}}yZ*TGF ziK2LMaUoYPF2r$dT&q?u0Q}(MpEI#8)^7>wy*j~dU6yeGL|G)4Z!`D?6v$J?4GNiF zGNUM+N-|jqFSt^;^pX20u^KaC*wKL1)CJS$%Vk@iEmQRU!98y?czh5h263h#&UI8G~>;F&}3tQ$@xhmG@h5396##KW2c6&nD-->t* zzH&?cgu?c})WwUscng4f{a@;`oGHloVP3&K8 zYWaY-m3_Qz=Z77^NgMadOSSCt@E=Ps4GgQlTkY0kAe~EC|Lpg z0C`J&DPN2UyU7&Gu-tM7^CfvM>!_q$|F7zV-={;NRk*zX^&Xy|sN>Mfv~agPsrszZ zST{=H##(12j$1JtBfT5p%`HZ(R~kw8ecKQFg5WJ*x&2m`V}}Y*yZ+#L(7tQhrOc;? zl-q4QvB#(*`_Y3X_Vss0x8Fk3#a~Y$nt>$Qn2*D~V85{yB8iQ{r9&gU|I zev9S7uL8Gt)I|dF=Y>|QegWzPvP@{V3Nn!IR4VydvXh@BKI2xUMBh(6aBL~@%r!AuWVG?f=&mJDxzGOktCLsq`D9Be0N@V+ zw0ap7DLEZtMdX4AhRfVstkov-f;^PxlkxbXr%Y<&X1CewisGbJ`y`1>y^eD%RgLHX zYcVG7w{0ENyVVm($?-3NBx$ln5*EKMtyUbD4wv+JlvSVUD^3~+YL43}RqjpaZ>3ze_N$kOC+VOY{hW+5B@jP%seQ7^>9XbyLO_reD=`#sdf2i+$u9o?M zdc~#Q*=#JUW~0w|6Dzl8Ec<(uJGK{c1uP-ECFnFoEcE?p>b=X@zgJgrNs7N?y_(l62vH_2aOTu; zH1Wkuhrd?fG^jc{yVoI7S9+u_MCut_7!Id3v9PUUb&ldf@7>y_JFay%O|e@o7B~1R zR>f}jzhMAekSBme7+=8B<$4CP2M`qy9;PHYV6Jyi@gzzQxufnYeT4}(ia$$dqsPwU z5sO*J_umWFSAy&Qz_!oZ_MFx;KV|fIOpaJ^|IlRj`#mo`7L%L${sFWDr)GmSX15!x z-ju0rqgjo2_ERjgP*qK!X^q!LX;y>Hu?d|?f1KrU_f9eo=CJlH^$aSqrQQSef(+VI zC|ev?=iM66d@OdmUC?cIyVcDG)WLl$UUUh>iAb>R_igW2u?(N61L7?ic^SATn9E7n zNxqRMszu^JF zAl2kMNq7&8r$ZVW%4{j9Mn@?q+c73i$N&u<3-i9;kLlEE%cl5$T`V6CkTnyOJ+mDaOaDWQ*^ecn!U$EDGLmsW}B zARh3Q)rAo6JL!FggZ3F6jy>B;&&!jW5FMg-Pfri`&2I0*$r<%!@Z{{~#$u(6L5tIC z^ct$p<0cjz2bs`3+o&=gg zN0I9tG<<%Iswa`AOAJdUZZ^xs-z{*A5120pqimm1%e$$8lj2Rz-5n3_^+!xU`FD3; z?p{7vc6^8QYfHemZ=l>~d!hFs`#E}j$4Ogk{OLe2Q=08L;!#{n!QPLNUsaV8bX6T_ zoZeWG8?W;fL^?9qw}QvFOlz1NW~S4EBF|xQlOZ}B-97Er#?yIiJSVn3uGPB5yDgsX za>d8T9K^q@j<*wkQ>~J@2auzPFOmx}x0!EFdB9!yU9WwxvgjR&?#kfg)Re^ zU-wz6Z!-%j`#HxBkmxujd;G3VYpX;y0Xtz}E(t{V$~uW0lOc^)=|GS@GK+e7MHx=# z!*RE|?AE3ejI;Sv?ZxLMm2b0E0P-M#%6ch}d~Pk7{t#OF7gYEvW_6V_EC`1%sm z;p`;DqvO$3nU9KswqGY#rE*CRhZCi6Vg+4BzY4?O1Z^=|F|5~1w-IQ|ecyr0B;3%> z6NBS&$4u{pLhhSaJ04eT@6<#cQlX#RA=lns%xy$Iav8;|8b2CeW=l2{s^~`vfxD{}nt5yRf<*f`crJol5KDpU+ooq#9&8 zolytKS$vp#7S*yGSBhp|TzSfi1;>|pT8b=!z8&|j&*(e&+8TUqFrCtl8|%?a$FBL@ z{y>@BXE$djM^uFJTU_rioz{q{e5Fbf#|)xZ>^Gwk$Huc-c9m^sKiA@Euns4o_3#?h z5i=0rkge;=Umc~s?o7dWGHh16c;nOB7RtO!P^{%PB)h}wuHU|SgU1_E^|#l+Q}qdS zH#zt}!9}+!7OMbK0D7Km3rMzut~&X`M`exqrYM-~VVJwhgjJnk7U?*AzI_a9V$zJD zYHhE&WAk}!5pOwiZ;S039$dytin18|FPwW+$P$X}!sSCocO(=%2_8{qAMNLT)*Y5M ztEsG{FE zcd6Zz*ty+c+4me7W7MhL5el9=Tt?^XuMb_;vSwBV%E_{HLRF>yV3AH_j|HcTm^;>a zvC_jO>{*oxChK<3CbtTePO|dXP!_ATF7#edCex`hO``srW-Zsv6_-_5+@v|i8We%Y zyMIuG>bHs?7YPXYC-gp6qnLxi$pt8CqEy8~wN7FkrU^!Uudp5tkYr|StbYSr7gfDV zsM%*}B(Tv6Atx0*<3}nIIDfx$@1=y-X3vRdKeE41dk)V6r>|lW>)}zv|MC*Fy`WVDgB%|{yeSf>k=9~(Lk%M*Vv}w0f(3C@}$xW z=X;gp5Q-lcaybmN2}XLiG@bn1#U(Pt?#M*{@CI`K@ZrY~KmPdP15Q4?y(75}eD891 zC_7n)=49M0h?tLJO|BA$D3Dz}f!wJx7^$#1Y~R+{IWt^h(BQN*7k{Rg64=2xqpssD zn`W{H_xI(6YZSCPV+TC8tNs^9A%it&I(jN+PxAE94F2TRn(Smgm^H4&{6j33fOh zZjjt+-FdS%$#sj9&A8U=j_334usFvB82#hjhsQtOJig5p-xephIDsOb#>Knora0d; z5&SmI<#x`^b0pP@Q&HaT3K3^9*D>9aop88;9J?Or>4dJ6EzBUTMqjBY_GmR4Fe6FO z3~ldwf$o=IUERAW(~Wh{VsiKmmaF?;oDlu_3w%;_Zb7fRgLaG6Y~wF^?Tgs-~d>j&DCZN@>`>j_xTR{}t_f9U)W2S+R648V8hb{3Dmp813n?7e z6LF4tmd&OUt5Qilew8{x$Uy@An?-AlX{&(3EiElA<#AhfOL=T557!owu4yP~DebPa ztx)PswzAR!84X=8C4fe0x=1Ru)JJIjfz$+3Ov@v(L?jKOMvF@vC=8ABl}ra>#Kgob zYE1lL)E|Bqy)c%ACEK~@obP-O%4%vKqpYuMEaDb% z>Xe*wLNU)%FK*z7Jri6>qYAqoQ~6u3ywE}DD8MH{89OM0G^)dF;hsksFBVOkXtT0L zA)0_y?A`NfeW$BFX`cjk;gmBhQ?bvFCP#gkc*f;o0ClWv2_(_=U@$V0blZKCc3>Z- zBH*?Mrjtn*NIp28+w$lrc+K<-%I$&t#c9`?SWEITs|_o5YRdX)Clyr@1azy>;plKs zILBxE2xv?d84A5>{!r^s^r5BjTb85%_(J2Zgm{-@VQR0h$oiG zruagSqDUa91*Hjf5jbT!=~D(dN$Ax^u%=i_N2ScHLF4s8w)Nt}WP($HD+eob4+B3P z2EH?PEIFp0@qxWyt=$peI9dq>gRu@o0?Cm`BpwOQCWH9i=%n2qna56ySnw)tT9SZx z7W;3W%9&~C7}KMVF^|Hnz%@C&C$MdCP+=BOb8{&*LJl6^&o&ZZ4|lRKcdWUR5qED&dJGwX)i)6B?n$ zOosG;3l-6!Kd&dR7|)UkH5H9Iqee`1;=ypJmBx9KQkSgDkU6M&@Vi>>Nx#3cdf>G)y~J z&y#G)I3rK8{v8dNM(U#AD~htsQ86ORxE5|0tFhji;NKFrW=+J=$c#L1JJ;M3Mo_yeqOj zI*IXjLAHKtzljb9u;77UFc6Gj1l&oB<)$6oo{t240gG#7-W|uHxO+xnbWFQPvFn(8 z06vU5$U{urHQalQn-%>gb9(cFpCbKaOy_`aLnc}uni3iZLGy;BwGx#%B&?Pz`TT~< zFIEW7G%Cug1j7}YPEPZslA;&+91*slk5kMm7b`V6lCvX`*`#a40zeNW<2d^Ek(+jmJ02821OEzy2yukV2AJ!GIcxE4Ry$&BNVa08W#W3>t(6_>z^&514EIOeh48)L8Is~0v&gIH(NED?41y597-PtVe ztf&wb7hftBovGq@#uW{fb@gJ6a7rT=iAw}xLt+TXNf>nJ_2#p+1oW!jxIpLhY~ImD z)3g=0m8H?JDzsiy-{OUD>}momhezG8Bi!@ho?h3ew`JS6?XyoO?MX`{Ih#D(y!*>9 z+lTvccHUpd#|p+Dy$89$(8o`yZD0gi7RQifvXf1ZYH!*`dtl5$w6P=Kgt*4kqBS`k zZ87L|XlFX4PEgbw;V@nSjrSXf1d#yj8;QQY>e`_$saY=MD$1%SN@bU1&CUD<4__hV z);A6)J(s#KahiuakvBoOl!z)MwHkBvl!nWJ!}XfO2yB<)O8EN?dLu~@C>lNY(lkk7 z%>nDC$81b5fCsm>ZD!Jk+96JX>F(s=w?{|5h$UdRj7(eX(}C@~J3Bka`S;#<@4-$0 zs&(!CIG#W-fb9;T-S`X!lEL|TOC(^QwOb;}TLyyISCYV#&QNUdD#Y z8cn6pZ6c?m`rBi=tFajL1t5>Cl`71}b}+o5E}^8lt4sD`?W>%+@rl6-nShT&4y3zu z8==dP>3Wy1BO2Ja{(tAGGVi5@LkIAJwZ<;7?X>ZyThF6J~`Y z)dCX%APghL<^pjCuKBRackk|hcl*w*Z@=B1Y#ROVdfolx?VXeNj^BImX<_HkJrc05 zj6_zF$ys;A9uG$1zIf2h-uU^X9kUJ%=Y~_m(xIEDwiTcqN6i|B)e9EEdXumwL8`1& zMpfH^;0e_3JWWwVDArE2OAW1aF%rh2G&ZEFl#M;DktuGJb$6dB@|-KL@Kn@^M9re{ zhQ2{g5qM3txY(o6C^cf4CS(u*89P+chm7aXN)cmGdP*JDJM<|%kEnDhfBfDX$0tW? zAoA>p2jW0=7V%I26rcSc=fUTpc+l`3#xgzGV?*%LG};1-3g@H=8*c-DhDDXIB6tJT zr5tkcWhiB#^XZIIm1NVpA^G9I5_BDio#spM7E7oU-V+LUlO z4fsyEh|j4W6I6>PM6!tv%1n_lIQmi&c7>6|9Ca9}s2ai{ipE?0aO7Z*GreB;q7}Kubavrj@AubsZ=XzW9AwkkEC&9KH}c1afW4b6*s)YD zhzARg)~`io0r_Y>i}1b~@L*74Bok~L#RinfAsDTdZgXPfuCWdqal^+`jaeh0fc2EuRfs}21N(Wucufk-eWo4VJO@TRbITCj|;iwPI3 z1%1Yu%S>+Uj_#b?-A|{dJj<)ku0H$4Zl-X1=iueT&4a0Qb}4_nxpU{>zRwbAdjF<< z#WKHQ58~KI;_j8Wdln22EEd`Ybk;qCgE(Vx2Uwi%VY4XQ&o){M|Jww}ga41D8AfPS z?I8TRJ~BpuZRphiB&omMIA}Ds8;H;i5Lu+{;Ka8 zjzHW{*EtRfFB|KtmGEwu`yh75Nb^Gp74AB28zK&*j9pPZ%7bJ@@?b*5*6VF)Q!{j1 zrjWUp$=qZ1!h0^)^ufu4^won0X|z54$mY8{yE~t}a_9bsZ|~g7ZebR_Iyzcgiv%od zcaKu8;0m!87n4#^Z#FKMQfWtRskx*I$t7X%HQl4ee4k?0&e z=jqeVA`sR->zDR%cc6xa!o83J4WaIv= z{lK4_CvT$6wfO%!W{v%f2UphcLfC<~!^gFQ9AVd4mlB>&3+5|)&BSD)pGK6meIzMVeKuIEwv`uggJnf^Ohf13E{t)+ba?R@_D_&E3A)6YNu z^ysf&e*Ja-@XcUwWn?A(=IqFdeFdLEh?*oT)+27;G<=(x86f;=BnSLtv>3QV8w%H+ zhS|tl;Y{Msbd=PO>4$0_A}KXqfjUNz{&tn>s+15Cp{^G>!m)|2nu!<7#v7h~y1t}@ zgIzBwI#=H~F)+Ys7}xN)-P~#cU(A**htCpJGhxb^JvD-(;$%ZrQ4 zi_7cl>)HI$`X`4=U*>N^qOQ$Dy{)kpWn>KxJM1GEe0*giNtE0(ZFeEBvuW|dZB{1S zW`j3ysvg*c4_${NONQp=q;SVCrocl~p^!?alU})qyDl}io8dRr+z@k1U*ai;i_cUP z^AwGB^^GNEobK*tlurZUmG#XR_`C|vm|Q9y>{6A14n9m0=hcMKK^sxOns(03MF}Iq zCMOMp4C2KG-N<-p#u3eAavO!rwM?N<$lUt=+uM7)Ki#_XRXV-y`QejyKYM<4@fDQ4 zwY8OAPN&n^d_JGu-vG|<2iPmdmdS267~Rpz>8>BHS?qyP-@MB`13y#S(*oK69Tdic zFQ%}~i_5OH0`Gu&=sK-tX{?HN_#Gr9y2{)N8QX3oC>g| zXU$OB6#RcscMw^Kv*~O17!*%$4sSn5uWzm2`tIvzpMB-o)yEfC zS5f@(@_KrG=}X+UU-EC{ckGr~cYMSi4bSp6msiLj;2dNjDu$sapwhfG|r#9TaG%npBZ&Y*wR__7PL^>hj{! zhSJLC#F_~K`?Cb1649CKGA>W^Dn~F;<|(Z&;_&32b|L?&+{`hD&N})jI)!MX7MB9v zR3?{!M5FiFNgC)>ByvrE|@PjEy=b-Tkq=Zw-B>wiqn3eAY9GuJ=o(q0QQg?kxmfzA}X_tOpOcW>u!zq_>b<9Ej= z7Z0|+$A+(>7``SsB%8%S6Mug<@ z_U9@EFYy)QV*D)4_2>9iMUC~B&+v=OMM{oLSrRVcs=E3IjZ#=mB^Nc-+X^+f;%C7}i4*&k=@UQ!y7VZb!M;2H&tOT;d zwMPWun}j;R#Ggt87z6!nY_{I(@M>WRTQTe@u-SzaITqDjA+8{EBM`W%DN03v>$DGP zifYEMOpS9C7rKjh`~gKV3WZ=99;hm+;*^x*qhU-bn;N?!mlV~6Zs_}U3u*{Kf1g8Y zq;pmr5gNr)>`zieO;)XyO@7pLKdsJWG8;hn%*Izge3X0b?caV#FMsq00PWqomS2C} z+xbGXzP069U*BTez78Ubw&$~7qI4v2kSKQh2nIe7S-E>}XXCHKjeQ^%@n(GN~bst8Gk zv^}ON<(3z7J={vqAV(uB?<{{+R54s!RD8MnOgX1iQzkA`@I1V+=7(idax=-rt|zDj zJh*yJoj9WS#cr^YO)|G@n$Hd23R`dQppMU!KCx7lAjU0~Lv><~( zR)y4#fw}FPoUC%e?Fg^z+?p<}J=66#)ITdnb`Ybn|1SX6^|F z&1eSc=uzx}EzriYEwckj;no(|Elv)0PS#iq2J7g)*=n=vW(p~)kVGnWb#Wv6F%bd$ zL69v(G6ly$BNz&S4>b;g4Vqg3OqO|ZVwhnD1^PIVIbg8Uq%2<6ESr_LUMzQMhA&<; z)Xpoq+9Ao|YQF{-9GKxzyYJk1xGO0Q07&TG`2bdNVU1f_U+P?6`l_Kd79t@Yc&Icu zD7M*H4$R%_dFry)->(J86Uv+rQ1}ReP!JKs1Vzhn;K0ctArSPA36XVd#!f=APZ%wj z%%U>@qpM>uf?baWM&Yunu|TzziGgJ`PGTbb~05fO#S>Cx;DFzWV-e>SdLCJx8S}7zx{Zv{UQYY#S7-kNwt?-Tcxc@T!3r2Qs8377nzGH zE}xqZ#SaEJ2zbD;fq{At;{A10mGp5?Z9qgk;6j`a(4G!`4L**?F`=2EkOD&gjF6d1 zW`s0>XgGus$)eK=pj;(0QbdemLap=wn;Qu>uAAbmzLy_ODPtXjj z2lIsT1+B1C|4=caxpjATJ>o-Cd)I{@Z~f=>c3535La-0az;#tS-t&?Vg}s4`f>aV2 zd~A%bk3-})yi(XCC7~Q7%2Jodmx16euPg}I*0LZ7`~Xx?0dfXF$38%nb7a3LpWMP^ zeB6lw@^Q%e$T~k_fe$S*B!n1=_uI3V;ep#^>w>p;am3nStT65XKSz7)b)sUeQyi%n zM^f@$yq6``$>bqgGPJ9KL|34T?Z$8jBLp*nNlsvcCK5J+gph;~IzmMJ{MeBRad|LE z!NN;c9ut|O7`J%~u;~JdyF4XJjCU*y*3OG0J z44B5#e#xn9h)t8kN?T>XNz^XQgVUuFAf?cmJ|FnF%CDf@)h0n#Q%~z^UoXpp?p_-Z zP%D707NPw5p*%#a;bN; z2Tsue6a{-7FwR?TtZWWYx42_0tSDRdkQ{+w##p!(6xK!hve^fjG#WdM+!PnVgdhhk zE=Lr~q0>U?en>>X#|e2bO~URRFlKtNYSac9mSf{P7ss_P=3XqkP|n?6n=%HdYv)Zc z&p^Q6ZHIa0;dZ(b>F&mOZZkQrn$Z-#l9Fvq2PU7!x+xN z082&|oIuENO)P{(rW2Z=)FT`=B80IHA_2-CCn16W%4A_)xoJ-QXPa?;_K{9#?C&2m zDM!@mGPQ9eZR}C}eWSu)FkQRVbqgB%H7IizFW!Km2Cj833PATr_zk0A?x>V21vnaI zX29pL$w0}^IW&LhP-|XVUfKK$W4lf+hg}`+k89ugEl9nn))s$_y<2~7QXfN)D&!Qh zXe)_?( z<V}u8invj{s)^GKhDyeJdBx z15F*R@B2SBSw0!c}C!c-R)*O|2u#nh76OfxS zKncajV1S;c7*9$8B{bE^!`ssX>tt1eLQEk(^&sYU^*>3Jn61DZ}9 zP+MlWV3OwvBg8BO5{{W5H1~EDUAlDFtK*V)J@2HFUV8Z0;ZK{7eH#1H_liA`2kj*$5(lN6!%o1&CjZsBdUisW9tJ3Sp4k zJZLTtFqx-;cbK0q4;ULe0u0&5dAgv5T-4`x1_sbbpMimOVBqg*zN`mwy&+%Hlk=6V zb=PR6Od?gG7vwr9OQD^k;@a}Xua_a%KN#$kqet9n)=YU<)x*xs%jTV|xqZDQ{a8%Q zCvDdcx3#n!ON?obilGq;X{^FTRn zt*g9KFk9?NR*s%nU#f4lH6WONb#9R-SSOGs;93aq5a=9)AZGgsLy=H2!Uj|_4i+_3 zyCgg=pDpgXq*R;`Bjw^w+2g_?kHdOY!tmEXg}xjM^zGuOvUF*xKQACC4rpu(2*p=)S?{h?nJ~wwmd|x&@A_M z@h$~=dKMMce>XHYH`m|acDR4I?|O?*>0w&iXKlw~XrC6x96MZ?OLQTVLDwBd!5_{2 z+{MNx%_6!G>F=ojwEixyKK!m{RsG44{)(Ch=O^c;e)j)<>a)Yw zzwj%LE=?uwtWIVGlM16^aG8uuP_*x1WRP5O7^-b<(Wlu(MbUPE+1OfJVh&h=JQzo! zI1_Q3DVsLgSl}66j7WD;=s}?$S-cy80-8+ch&XVIL_$si1Og)D2z>-dZ~}Q}gudOS z{YC!;=wbbGwMO6f$MWLF!zUv*^b3aRq_o%5)MaV%TD9TEjVBK$z}XWMPr&V3fMaC& zNitQXET?ibsZw%?4@3kXjd%$<&8M|WVQ~XgB2I0b)j^zh4yp}Cn*GdE&~LRUd`SPow+4*`|gHqVR$=w@X_Oi6YY;hr3xNXL}?J20+TtEm8CF9r}LIQyWdSD+i^Z0Ip zh{57;(m5glB7lk?3Fx~R+MNDz;B949efHFprWaApu8fS_U!ttNxUgoJrH{9M1;ASD zduj0_7w$Zqm;tX(47^(0))&SvOY1*=Z`|{2R?cLsS~_jt?qF?+-R!Z|0fR}gx3Tnc zv87N*pfJV|8L6R7VJ8w`M@6-1AqdnqA5mgd-(kJEH(eAeM1&%=u?g60(a-&6^KyOk zvHF!+Jx8Hgm^IFuW(^O~QGMDlAOCJ6=x5$BXu;plC*bR0+`z=ZlZ7YaGPJ6rxjmZC zg^y84dQ~MLRg%$GZi9qd2@F*HSnc%MoI)o?Ezg(8%F04K_N|aa|M~KJ;lYU8V4JjbM8Sq z+i-V}Dy#5p=V&UZrl|I|7%I-5LUE!{d~p=Q9yTDmO$F#{B_~d>VUUdo>J$k2MkeRx z^u5xZ@*Ti3&@*a zn0|s*Hz;#Z-Pz+y@BS^7E?wsLr1b!umQ>jQaC919C6Tp$wXyM6Qa-4pK`sgFTAyxM zqf20m&9gk7VRCZy%%A&tHDB(p0JF3FOWr6c>4vkdySt?1_n%I`QF1yftK0uf$-UdR z=lW8EiK&q5(AbaeVK` zwXdsdVu25fLlEv3!bS}1Famw8RI$8r?%cUajY6R?r^6g4>>GO8JEdRg{rTtBOT2Hx zr(Q%1z9>|xwZ^rzsc|JBuWREV2~r;#n;+LgVMjy$`OMWDzb$QyFC=lf@4+bZOa}gj zI9Ewqfp<}D{GooN|4X{7^<_Rlv6ti1?rV*Z>|(`QJ#Tf2cmCA9Q~OV!^4||9YoGrc zZ)}5m8$5xMH_mP=DLGqm<;vOan>YP$-aOM`rqL69`byK&n~RGB1E~&FFDlj1+SwO4 zCwLjc*4fU%5>OkAGsa@eQ5$Q##byegQHLj!@u6fIA(Vx#f=3YsEkV$Su=M(>qAFh1 z$#ds;9V`6`p+dR5I<>qyq*U}j=(yC;vGREJk-}is=+flI1%pw$b_ckIrKEQcjlHim zY@q&zA_snlxPLe@`Vv~2tS5(is3Ephs)F!GOZ?LGqx&;6kH#h3*tFK##@ct@7Iz8} zv(l^>=GClroUAzo4nJSI4N0@-~&5Ot|!i)Me4|u$jypwSAfLEA;UFEiy=YwO-ZFZ3YBk9c=WLC0w5Qrp z9lX7>v#C|#ftXycz})6&-*6Ho5I}3+OgfH32qyRiGt!d_qkf+3Eln?NnLBm<`h(Sb3;XDv?N%%BAI%5@_-83ebk~>T@RGwG$Vw-qJSiT3FEP z{#Y<5hu1E7dCh&>aqq#?@6i9~pM^Sj+nZ<4g5Ccg_z|o=y92(TJqw=i2It?*I&<^P znKL)De(3)+)xtKnnOfxJbk4IV+Z$w(ILqzO-0d*dHh60W-qj6{PjPh2ZT=|g)2No_ z^y@M7QXjDS%8>m&PR7_^Yku>hp;K?Z#+B&Ms9CEa_iee(l||{MSG&#gBc) z?-{>y_2I<8KzsWPkhJTy+Tq2qmHK~~xc0Cn>nJ?#7ZE`q!4v^?6v3Kgk&i_*77q~? z1414GvI#^YY($PGd!~aJw}%aJlb914EH26#A><%Q0^=HD$W1U*KoLO!#qe6a-xk%` zw+s7&Z|`@`dC%o{eqVjQl*OV7cpP5yjq4%?557+E6f-?NJ)m?T)vEp5Z=w3_+wsI_ zToWg!k|OB-B;dRog z^%m>bS-ks6tc8~)3IV!0fnG>g(}z4yitqQPoLion17apFIR(%OA+ABPNDSN}9#5*| zm7x*SpFJ+QIl6TGvj5r9{@RAl+B**)jOE5OE;gcEJJoaIX=SKiT>8Vyqn(`#8SyW7 zd>q*E#es;7^!8n?Wp60POO>Xl>gDsJrMG^6dQc!AJg8(j7c)34*--N}c$g=X$t2jk z#K{BLR@_{Ncm+B%|IgP&S}94Me!a+JNK>6d02lK4QMLj48#W@wZQZ+-MCC(rl6=!_ z;Ok+uFmh5fndTmy6&)Q`m@t29h%(iCZECv2(-W$O1OYle>t4h`GKM$^k(MQv>K2)n znwP$Q<@n{kHiWm%*2k4`s=O-`NMaWoXCFUJeURJU9@p8{x%l=(MY`V>|9DIg#O1|w zv@Q0JOU66fuF7lce;dD3Cn-*1v4nhNFd{L9fru>@F=QY(oF2b|IJu7Db>abcCxGi< z!}y8ILvX@L&*}R^w@Q|WI0agf<>VLh6MdbjW|2lHTS==(_N&&}SeTeZ3E6CFrjW}P z(%5Viz%+FNw;`vu6eTx3^p17uXjKK%y<*D)_ z`nv0DC5pPbHiB+1X0@pM5PkYRE#GvYS@HQ?zKuKj=m&{t%|3JBAm zo_eIA%-t)1ax^gdf}F&}99!E>k(Q=wEDbjxs$1!Y2LwdLCdI}^Me*4o!mO;!LOMHv zoxtU*s|(b<%|GX8TBeFTa84MymSk`cdWZXg{onJuB%{}6iieEduCqct^(np179=wy{~ zCAH_2Wh|*&AlNI&AJKr^f`DI4sGPZ?@a_M(I^K2AbymM(?Fe>|=|^)6j#yKm)p}wM z#MU=5U{k;beLGV-QfRfE`B2|4^N&ZHP>}goJe*yu z?H|1|q34kHNf1` z+|tZo(}p)m&dyXMdd8&i@HC6(9gV}t#$FQ;mgub=xMj_5m z=pFVCJA^(!bTXCzYl}VKb)5R>c*FUg%iV2bJ$)FLscd?XSNRxCn#W(nv`3_>o?(M_ zQ{4Lpki@9c|CsSle^A+1qmY-Dw$}ArJyj!}tdZ|kyeU;4%vWM0qnO8Gh{Uk?AVgFc zJiJYd9l#+vl>(vTy<0?J7H*=!i1yUZ@GOtnJ67_dOWnm zCx$(8cnl4)yxzLw!{2=K<1cq^7D{@$D^*A1;`*AZ;+j-#zy5kW%K+#CUB@ZJB)Z?xm}8IZIlm+$$*K9Fua2M~-oh!PF@Pui*ekK)Aoj zbV`Qawce&fOvsALaS%e7`nMh}_m*$n$5+eusyP~srXYu3Pz~^W-$be}_BfesG_}R* zi%p;YkG|L1HlvxuQk}eFr6Lp~K{~M5FU{ zoz+8hA9N`Vk<>Z0+@=h*OwSF?wJ-=L*FK53&bOuVsR3q2tMyl}F)}hU+(@!=TW9yK z)oM&xJ^$qkn6uj!wQY~hTE~#AtOW49kSpX?bGa9qmy?}}TAGJ?h3cPsZxlV+?g86N zCW>ZM6$LB-kLBz#_|q>xb{wBQ|JLQYhFZm$)GMQ%ss#-FS5)OLl*hEkS1sh_rm6xD zRpf>4%d1fNEq=Oq>HP6$7ZtUF`cmcmhZ9S!1IlWp;2=*a6CcbM33x%GW60QHZn}_4 zq!U_((-HehNMB+1`;Q(?FE2m3Q6ReaX#QHkg&d(!2nWX-4t}I%W@Lbao`Igdsl5To zj*4tf-_lH)BXXc)59zW66$5

^J3SC{O=CWxCY&tzNKiT7Ed?5&{U3B&KGl|Qi^kMOQv-cdv&|b# zHv+SZnT-wAe#7(YZP%L^B$3jDwEgJu(xPef1bPBj%~dC;>1=x8>E5aNpVdk9wEbN6 znfaFOK%PuQ9ON7bZ#)?~79(fcCXQqA`D`Z^Rgu8`diJp@{pdoRYN4v4B4!~qJ-xju zz9IuzeC7N8f2iUny2fVW&qlO$b@fXohTE2YkVtuxm^Lfs2*8}h`MmELTD7An)$top z>)iW4A+RHqf!yXsIQ;4yji&n6bje&nP9`W_hdwjbH)&I*Wh8ZLl=GX0)U9S4oXxg6 zZ{12VGBnnQ1(;YF+gRC~?6xwY(n4ZEb7U-Fc{#E{b-*pmQcv9y{)P@%LPCS`v-JaK zT8IV_uYiNZn#0rZdHL1O0GRqoE^pN`*{DwiyuB!#aE=KF62E}$cw>RQ+gAg zsYe&`UP`U3`0(qQqqLS-DIYLd2FV&Z7OZ9beu-$Fy5@4Pb z6%`PyADnHMZKoHEky+BJHLEtSH`ZHcVG(Ar7F!#4+W1&I9@$}i^N1`Z}+u zyi=Qw=EXF5SA_bhQsc@)(<>q}u&VxP-`GS?*T*03`fjmreyMNxr#i(*y+SY|FB7<- zD&PpDJk~K?2M(O7O=WZpM`W%ZI&sp{EfdLxXo|~@txkZj&oI8f*6T%cbPRVShlPZM z#D<5PS=s3u8DSG|fYF-ZZ2e%+oP!-UfH)X$UQIF%U!9HeWsmU-pG8@J7J`j}&tbIQ z+S<{5tvflT?#xdObSDT|o*GbB3%T4RuJ9Z)`NCCN zY)F{#>hap_GezrY3Wg~|+7OjT3*K0kle_;}|XMc1yy z$2TV>jf%nkGC}`HjgpA$0<@fqWrFW{_|MQg1>#9aGQhu16cF2;{t<%wz=60#_pdGA zQYR#Ex%{7)qSI_)Y)E7XEs7QyYn7N}a?r%~O%u#hSUOW(Tx@r5^^M)@>+4KfV_;-p zVn{O9vr4itNlJ3tZ*K0D7T_2{^9rMxxJSiC(=r>_v}kiWo1c=zEli*{@X2IqA-7<@ zh)L1fBhoDf*e-}C;vkz>3ah^5K?(!o;_$)KVhple11Wk?gIgQTKrF(Zh{Bw!Q8r!I#@`l`!c zi87)Hf^SQ-jfv!w_vWru=OAUhaDO0CSm46;%@k5IU0hBHAa`bPTpq*eA77VFTTbKCQR$>Gl|b{yVw~P=d z3=WBRgDu98<0@Q&37mDX67^AAcaqNd*F>^iooNO>OPEi{rzytxqraRR!ji z@2WTy5$7M1TD7Iz`+zDi=$U9%U8o5M@M-iZal% zBN^G5t}c6CZY*#!^&6N=h@@7dR~*C@GVH9bPHo@K{nFELN^ijCYQ;XLNq^q|ZAdG;UY> z7yj)T54L-~<*q85t>WG@_0-w!Jhz$v$g?NSA(AGJaSUK24kyaZS z6S~$92FY)>vopnp=HNBKo3o9wadS3{FW-IFWY1@M*ztZC8($6|w*Knyw!^q_A0}^K z!IJZ~BZSs>ypnPRAIOfU2cF#Hh|#6wKmeNXc@1bj)45FYd})7AS5Irj<+0)MEA7w9 z;{q!V>}vWvFx6ibxa-0DGgY52e!jR^{_xqK{ffq#$yyYxW&LtQHK|-9Rce$x@cTjM zVsxJwFf3HaI%mff*uFyUcxtuI#N~%=FvaJt-x9KELUuSilg6fj*J&1CW{2BnuUVa~ zA0BL%9gMpX8Ll=Ax4?^Au!Ef$QMo~EoNbc$Nl~_L25xBv_GzT`ULotq`@?tInERwf zoiN$oKqK$ZjHV}?E(|*%bajnAolvd5aPM9+n3u`K`BB*sZi$vHPg9I^zO3eV(s*6P z<+i>jqZzNp9O@`PkP+{HH1yM|R}Y{&^YZ&0!*?@g(2NA;Nu>f?BnFiT=PaItB|G;> z=ES5--_}esVNF_g15yalbVaU?7pNT%0zLHZS;BU$*E=+RI`!3C1&z7ahRpK z>^67a?SlKSP#s*HF&1pR*V64E>CHEd4hGng0vt#VHs(gbdaDuOOh^`MNzd=m!v+HE zD8L;$$e(PpUb_?ffUI4~m`-tb-)a3^iqFny*FrU2-4a9;t#C9k;pssL@;nVoIwGi% zl%lU(+t~fEGriI;9f>>E7xUsUD^%%M?jP^nG1C$8hyTo9fBntVmB%$*#^H@!>>f;H z12$xXjbIXJvXT&*vtSJZW&;HlM}#`=iGi$$h{MWFXAp=MA{BH%fgGiiL(Iz1C`GbE zR8Uu>r9t)Sdxr(_A z0$UfPC8dZcl(ZzN#zR9#%1#wA=?srh4F{cOwo4h4=Bf15d&YWG0|S{`x3a>Y$-p$H z8?=qwpyaoDb@T%dtae+y_h4!S*hBKvy(bTvOs2lsMYIgp4JZ;GI6d@13nO>8Ihnw( zet+?si)Wu)SGw-;xWjSUEtS>#FqvK15w)%B?&_#hKb82;|NZwLf4z06;@zoh7cU(u z1iob+KlIu0fm1$Rst>+3>tN^bI(ha%i^i8c-a}-fMQ_l@CS3MGm}FT zDxgbhRgF$nmkuAN^i~pCUW_u9hD{{YGkFvymndb|OOvE9c%U>C0voo@CbH`JYyqE7 z%S*2CEYRyKWO)@8%8G)#0=-IQsxhgJs9}m~dUI5UT_#zrsl2nc`@0bQVt8IBOba)c zwHV+~a<&1XMEP>;%lS3hn4{W`(k-Q>>(*@BxA}#2G0(>Pw?tJxaO$VvkN*7g?>|33 zG+_Va=g@QZm+}uBXc(M0^6J}fUmE&uMab~b(-&!1cwxpKmO9=0;@?UnC8JJmX1X`b%C`tvlhL}z%z@rEp7uuDZ7 zo<$$Gl;1khlF5Gfo?GK1HdUIjMwb_wuBu7T)bOZ~Tw`L;hv&=lkuZdzzQXkZ$$kOC z$n|O2%Od>He+ zohpx~R0@=t*jO32zFt~Z&u0-Un6P*$5f7P6p=*2yOmdP7kqd<;9*vs97ZN?`PQEOS z0NO0yRiEsu;4|cWb#%HxohH|zLm`Vc%A-{V6Hxle+s-{><48G?%;1a)tMU&70hT^} z43z$k2jSn}*#(yY^;73UVfY7*$tZ=!MTowV<%pH|F1s}$2=HwIR1x^e{OC0 z==YwU>9-rI4wb}6dk-~kZ7eEWud(0*sOyS8&; zc&>Ms5jMW7Hm9%#P*g$kGGWj%1|tX;-jz!ANJ3nPfAb)+rED@Y$q7btLenH^X(>V- zEmT0GS75%AEa3B4L{GN2CoO|U#ZW=`{o?SzFtIpHrVtzC^1KK|pFwX@mk(aXnP+7! z8oRT6vox9u^V{1bMypCAsl8zxw9* z$7fHUzH+7K`1Y^H9{#jzwEEgW|MluLNK{Q8PkB*QTBEsab^$1(E8@Ar7 zF7ND~xl@e5>WnXlzl~NL(oVkvRRz~ZbB}@73dU#flck&A*xUi>(3tHVTJ5%HgCE_p zCU?X3(x{_x4}NcSH*R!K8P!F3=#l2h#C*M{ zx4_$r=HM<%Wf?kF*Kfs@hPs9Xj83f#Uj=x8$lpTJ#r-uU-IhES#r%?&+mEGiN| zt>f3^g$h-n1)&8TPSG+lmm~r^)Pv#bL4iUxh0l~S$xNavmCW^^Q?sF=>cU~r1+FQc z$pWf`&vj)$Zr9h7%kbjyyr_JyVCyMF7E3_jQRyB8 zj#Nlbqthidz8Z-rNuuG1D3Jkv=)TmG>nRjAJBdiFFJqL&l9BV)ds0$(z-TEzZorgx z7evP@#6^4cM!8xXT`up_^_lAA>T&~6!2Y2d-|g7lT$nxS_JG^Ty$2t<*l=Rgqo+3H zLOc|rO3w!G>(Kfi-Wa@YyW_!9d=bQjhaD%6o~-`%D#l&gfW#eWKh)6NFol=@L@7@<{w?&jLA*2zBB*-$ey~||AJ@Q%<>a}Q@s8j`f z9XNn|0fEKl)t9lU0u~oyYAm8hJ(Ec!N{P7pJ`9dX6tFXtK$cK_m?SQbz~zH4D@mb+ z(geb?ydZairy$5PnZyesxeJ1}dMcFqt%|%%gDgxPW&rg-A(NS8261oi$c^K(0H*v# znwkzaVI1(Tu^wnQtSxyorg}@qzK(71aSKmY#xHE{S}18bdb1__e77nA1hADi`t7&u!?%Zj`)z6KO9|{!E|=v5EvO0AUu!;2abZ;J!%oR}qy-Fz*@Pb{W6cI&AVUi?h!Dy01 zDH`aA)9C3W&U(6VXAXTmQzFbGpwZ$*Lr2Q%{&4SSFbR(_st9-3y4p=1CYQ;>6nTIu z4Jz9=#|JL?9Y`Md;;Ge7J2T$Fm#b791N(tK;HhP91BF zIu_pAbk zS-S(1U)(zGyJgmX&TgtxtI-lx$z;Hv-Q9Ii5@oV@JcKS^Ave;6;RE;0b0zWp7#hEH zjt~*tg(&rK@%8g1Joz^3n4M9Yxc$keSe!`>p3!Pa!G>b%cH>%*z1Klykpcl7wEe`);MN3~k)xMMy( zc)oODzO*Z5Avf27F%E^};Dsq66dVdIW~+H;L%U^vW1@L~R^oe!AuC?lvGSKshgYCF zFK%3kt3F<3o|+wAdHc0R@csJS+}vybb~=ZLC&zmSdu^S%U9~!tl{$4@C?b#&Ghc#0 z&sdr_i-+9Yg9y41)rUl<`-;+bl6(S0bQcL-D9TyyD4&vr z18HC8cCGOr{p63cXECSTv1NXrzr!C9E!P3HfyYj@mUJmnqocY88qB*7Ou^dQ3lSX5 z2~#0p<~3XoNf<0nFyF8@6gHb18bcCS+SQkm{W{N#&)vK7<$LbAetUXwdUz#V-1U%g z`|qIqcXroxmm6yhIw?(H5HLGL2_)6*Vb5Nmm=IvvHZTh zvIp*49vybyeXHd!rrwo$R~X3Rtvv%6Xd9R~5_D|MT~TWHJVWZ?f+${KVeVR?mfl7 z-0piizZ~=@>l{q{-a9kXgPnVZ?u0l~8vB_cm1muL$X;%<88P>x(&_6|>FBla^}?JW zjy{0z?Lz|-6z9z#ijc=ZFx`bK(ulYaX(15n^VyhgBqed!n0;Y08H^n0!=q7^EQu5_ z2xU|VchTxuWs5P+J2o%Y9kC-EZ3%qEPIOqRTeL#av^ua!X=oAyyMZXj@hZu;S3cQv zSIdP*$4+gC(w1ob7fRwC{>Qc>Y0q6a)%EBCUe(Q~4t~*}xU;#c%C8;mR15m{K-aAA zCA`^aS&`Lvz4+c6{j0Ke?Hbc2 zd5&>-&X}SuLI$f=DBLqMV#B>-Gh&&sEEXY!$q|yXef@Sy0wmmJWQGQOp>!$R!wJxc z=yZG`0D;S)`vzpY?i7+Dd0bHtTObq&7+!2HE;|Dv2g%7n1VNb~7AZZ-S2(<|5t-HlSzI(7e0Zj5c*b;o$Y_mWDxVqO}v=Zv56rL1F*J)No^O?Ik0Y ze(0A~*2(gkBDL6PFdR<+tqZQs}x>hCBz5#V8BBqIu=AgDw{1J z2v})Mz9^K#$qrZ+8Q?34qz3u1T^NxJczcnb$d%3^Xeb^O3Q-^-5;+7egnCFkBC1va zgF$2D=yM8WLRyeOuY?;>gsJ6jXhALCyF4t_xd7Zm;N#xtgO4=zoE~W(Go?QA(Abx! z$DWFUf@pk8+@_lg59gLdJ#yjZrlx~y@4HK{?;0rF{dDvG#=`61Wi&VMPq2c3idWE> zXjy?9Uwr%Wg#F}QDRSE`paQtiioV&91f;A6gTZ$2xs!8tOLOD6EmIa~f>Odcl|C<1 zta(Ps$gHSvqn9aJK`8`2bhU&OK7~Z(feR~QQlxBbkEhZ2Nz-<6BeNs3G3Vy$=i=*u zP(X!NIFm>&i*@zlk6i_B}5 zZR&JE#YByX|9p=6t-B>8@SXF1-+OzW=l%GjZ_nKG^k2|+$3Tnji;p~X@k@L3;>FtP z?aCs$YYT7qR-a#f7e4K-xh|aY+*DT=>e;yQE*%fc`2JSKoTVw+fw3cr^jfAZCa^X6)+U@~PL)O)#Ma@_ zk-BMk#wIB@7&nPzav9!lP!c4N$Tum(0Rxg*x0UOz#uw6zVCQt=}b3M%P<#DO}=^wwQJyno{aG_O#npRTrR>&@&f{mYzm+QQUoCqb{!~0gC_;(m9y-x@ zGIj!GjuVlcW*yquNi=Ex;gtW~ptjZngsWi%$)zqL6%*92e@$1MtIBvKBE3Y}7+ zCirS2m?6;8KiP1<=>E3G@m7(8GE$-Vc;Yk$jo3gW>%@4ol@>5WAP5zW7CYKcf$jR< z`|n>?UHKmCHSVjQzSn*G@!O9)a(t@2_srzo4}?FYQq|1xam)5XR}N_pkn1CJBW!SX z$Jx2{vj7|eQZWVCec=mNd-J)np8?;hx)|;Fd~d5vQRQ}~W1iaHDOZ?gv(8@$``_O> z+M6~Hj`lmu;nOM2#2pE>O{(_DiMk@Xf=_1Lne}RlWv*C5R__yBoFl(Er)B; zb7iDNA{O(SR6=7=frD<8RuNSpOPt4%fF5O;4w1YtkEp3T-Ij3H&euS(7L6zf8iL(# z@AO0;=vcy;pLf~jPfhmT-G1uMjkmrRqpR}PYu~^2^N-&>c;>Hrx{n{ZxN>}E1yVoJ zUVAtyDpq!{?OxtL+}!y6@7vfqHXuWN=q(qLR~9l?rg96Ffhawi_GY7C8HPNQ2?lh& zbP1u<#`fl=3XLWxy?yCM_1<2^6LP@0)j1RmpmZk3MV3epGE?NKD71?S4#`((b*+fDY-!8hMZ_H9$>L@8byigVrD+5X!j{F_-7#D>IgePfb`w5sTcy0i;qQ zwtxrr#A$XaL@UI+TE}ZdI%S;)o{cGbI%aEGQdsR0v^71Mk!tV6Q1#~RNlL>SE?CkPMOhGRU+#i zf1)ma;=~ET6DRrnNN^|}% zzVo%_9w8BSG>juMktjF{u22BBu8OA$$^t=?P~-FYjP8DGM9kyFd_t*If+lmos_vKh zcy1F3B0pgjNM)ibC~K=ZgqSbm%k&n#$xBA+rS-7;L}NWVG7c!9u%gO#mI!9+)X`BL ztxI`yOgW^}v5=#$fQuONx!;(Ih{YDu>o2@H}ZlV-Ij@E;vLpK`idVg2^v{@m5g z%Kq8)&CM@DDF< zz7YUvOcFgup8*vH-XFIjuocFj%EaXw_;LfGSF4js(l8z&2sW7!iR#deX@-O{jd=s% z5XGy(ejT=U8&t%jo+xhkB31M->GbB=97sZi!qfs&w7q47ce%x`!c-=Au(zfRhs!RHISMnfN9|AvSh9QI zLgv9kqv*u;SC3WV8{1oz-QRv-KL7J@^S4_+EiNx_?e=*0;>}M8>c&ZZBx!ZKNrN!h zUlr6=Nn?DmSR*!wtsF(hs}>uR7>FPxs>mQuC2!)gLmdrLq0GW}TS%Y9q>fFitvqDA zb&wuB(a_WIgrm+F4iTY72jy^eOt#dr2H#G3pvxCFqjZ7d6?$>m&9fsJ@PRTu!|>G0 z5yR_OED&gcud96B-Tihi#@;=!vNQqN@kw(hV{U0~on^ju8*nWQxu*;Zxi=&W8*SlY zI28@iblhz2cbOF~nxb3`?SWt{)9xyJvfG=0bou>`neDAn@3hY`xVw3U zh$x;sp*kT|#mSzWAy6=glPW$J!<_^w+;MV~Po|N;)=2ak^!Y#Uo!dvFWbrwa9G{W~^2>PbSlv zFw_i6n;ENtE0kmQlTfLbgX_!H2o*+!+ejq&GB=QB5v8RLvsxS5+A!Fyrg6BgXFMFH zU1oD_2Oa_>rEN?qA5P^%-n@5g?B?phr9PGn$9AJY5EFSmy&iOE|&5hx!Mn#pR3Uv!a@LI&J zq%tWnka{am&*A6=$YGGjYr*d3Sw-X4NMtBtGVzjDiJAl2A4e#CMmP@VhMSHjs>7(a zfdOZ=4TBRCE(-4VD*z# zNh(HQII#jfxCV$lxmp3EqFpFWQeJ%0*)b-aH-jFBrw{!67eD=9C&%mW>RMmyLSDYx zGU~E7uF&UuYdh|S;_p39XKxz!cadt_e!P%;ys$X3Siq-{dv|Z`^R4UKlv5Y=z%1+@ zT=GtEO=+`E_iR4xW&D0Bn{tHE6v&R2E?+vlus*jxT%P;=8c3=`R_hG-OECfjW_3T= zPg;3$4PWj9S6>^G2@3&;uJJi?0}p3i9MniPY$iYC)9}bDkya|#i?t@ToG;`^)uxmI z_r0}0E>h|e=s%+8UN_JTpo+*G3h7{s9Xe-iEtO5{vi|YWHI_Q?EVjRYlif4BmPgLQ z>T!jYoavH1)lq^(R`gDUeRmf<6J}Q%sy+8#&5c}n90w1sFlQL~>ae)GKeyxYhIQVW zM5?;lHjhcXY#3p4MYAsa-w~oxgIO5BaN_eDxeR=1;b>>`X#JL;rw2bO&{FOs8Plo+ zQf{0b0zk%MrkFMoAZ0k}Ds99>YV=Jp#5QhU@|=Xv#ZCq6h2Y}~v{g#uI38C9Gd+1? zxC$ZScSMNwpty_b@C;hpXh@0M=J8`B9OfFjCdJSc8gY=zSpDkxRd9?B{(kH~FyAZa z!!CB+(RY0VCw3lF*H)a+s_dP(yBjiYQM>0QWGBDP}(GzkarYYh?rCjHA)TGl%*)e+wBj>RD%j*Ti5V^v7;VTf=%W*<20$3;%Gm3?J zlOzc}HNCV-5@Z{VVu{9@F&K@Sq!{pE=*Y_50dQfE$BVg|02I@OZaG4kq+6^}6Odaa z;N4*RBDFMvo&-k$qj$7n?r~y(mA!#SccmE@n(Z@r?@Sh0#npd5V}rQr{*_Z;0anYb zz`~^xqOu~w6uZvjY_q#uEr4TE@DPxe!51$Be#O$n3)lA2X5IF}@-CCWX`*d57l!%R z;Z1A22%siHc0@IfaJ7wULx_KQe-0;v-TgX#Eza%iPWOA+R(gyinvjheG#rglD}f(Z z3%R(^3`%2wi@24S(aVw?+yN%ORm_)T+8GQ&#w!ScAhd{^xTFlqd>kbqtJ4}S2Eu9) zHPqF&wY56f$(V^SokFQ1p{VxK9@-YxnE@;UGI@0sTW8mP9~wi;iw|FTcyS%OpWDha zB!GE}Lbj|Mt%P_5DQ1P#h&Nt)6 zYsY*Wlq$jrue!#I`b1^n@eAu%7ykc^KexUDqw85c*)LNf<(4b8e6%5CVw7xf)$xg> z*raWeD0qA$8NgeYsPr5XnuBhAl2m3C3Tu$i5M;Qi0Dw7Z4`kr zK!kKcI^5`V=&EaR--XjUGt{nXY&Is%i~`fK%C3X!7w)*w*N2}5O!7PSE8BU*qzLzm z9yTy#7d(}{$fQeYJThz@3r4@(_tSxYaOTE~*AMbuzc;R<<90e89S*r@q_1=~)la(+ zEhBjy1Z437yYMX*3+osDTd%;wtv-A1Szl&I4q(PF zEfa`Qs?cOepMfMn`inQ25X%Y`G9^c*!iZ|fOrsnrsy_+8CQ_?J^}@Qk`V&esWcS0T z?}tq7zBe1wRm3u|$%YjJCjVH|9;3N5W-KqF8E42=ZL`tE!E6Yj>*y#N ztOxrnIe#7d1ylY1H~-jeET0hs<)NYB3<->wMr?v`a!^22srWeQZiyRmb9_~VgtnxZ zBr{grX2{mH@*vO`$tGEHIO*o|2m&U-=gZ|nk@}=sWR#?o1kQS6Rr6_J>RN3;*PzMc zBv6-z;+amD_QO>FJ?>bWM}3RzT3*Lz%j-{%tx;YxlP(YX(_z*@+lpx_no6g!^|7(t zo9ve^!?7*w>ZZf~)w184&Fa9i)PaXVowqyB!=WO4s2U& z`}haeZNGrI%5t+oc4C7%nM}q<1xm<^LtwEd5X1$57p=~iK;qZCwI;ci-^7>mtuk&V z7AwRJG6fF0M#fVK|EZ!VJQA7~*Am03C)o*upc9*$){oeO`@BQBUy>GX__i|0_qxU@A z`VA0BaO}62r>6&Z{`>$Zf~e+$r#`s&q;ws83sR6>2q=JcnBErJd+5`V>8+qI`1Dl_ z*f{||eGb%Xgsqhn-L_CnHaWyFU0(N^YZFz~xnwL((xgBg6131ZdDYSl70^e|Z~^jp8?99- zf+o;bJW~dCD#F$h5hBYll9cI)w3yu^67@um1tC;_QQQT8bOYyu(^yQQB0NG5>GIQC zPle|QpnLVzPjSd)tqT9Q6S7TL@bj8eeFwdl;kI#8rmG>0H)Q1Re7XuZcm@DCo(4-) zj~klk^ma<#uG89G-MDeH1!KQC4FUD&;%Dp?JHEH)XYoB;e?Y|w1?$mx0Y#^vrX?fQ zqtl!*Xu9KTa-8C66UjQsg?C-g4=l?9&M7uW>frFAgi2F-(J;6HYLNs{iKeJYSgK9T zr8&iBscd$mg9nth#gMSt9-+@-G+Cmz;TXmYls`pZ%h~y@5ASUpD(BB{?BLwo)vkxQ z{~c{-YZvRC(#}XL4@2>2Yk4+Z{sKMp;mLPj;_rTIhz$nA<8XdJ8Bn^l9$qe|wKZ*M zr)Y?T(sp?YY4*jR&qA*K=dZv1_1Di2W9#AGANT_&9{xUB9FEa2D;Rn^D&PT(SI`_T zHwRsKZK@c>u2E#hT}PFfE5y=dJgz25lgiJefdM~=dr{z%JV;$?u5*CIL%bP=}=a;KtaNQrRra(og&9(q=AOpm(RTIf#V|n{_C_%XR z`Qbl*{R`#Sqn|GR{tGQ;5cB>T+WP@8eu3Yz{Y-O4xs;NQPnuA1Lh(UyLScZ?qQOwa z0OfT)Miyz3)77F%(O?+T_sbt};bLcGGDFtfT6E1_JCKFSmu+1pR;XDd5=H&d&L zcqs*s5a2dyVZHZYxI8*IJy?Eq=ZQC-1E+rZ%iS-ukIPsq*gLrU^_^YxnqS3XLR!)< zjR1|SRqICS?6Z$P`R0@BH~L$3q z7r*`S=bx`09o@e5+fP3}5N`eFyN@5e6>c8eKmBD|w2;NP$X{Zr8Rf50vTWwlF(xnB zU~CD#kkl#FQuRE*zI{lMvo@ut^-!PndX7}{r`J#6M}Toh_aw@% zzVPaE&mBGYI5a3vUHlztxc_+Y=--V$fsrJ4ep)WnisfZvYt#vXdL6<(I$bmisv-%D zO`uoOR%C@UY+)eKFGb^AnpTTNGuE`oLDW!r-t&??i;@h-`f`QGu5-`lG8y!gAF4DjR0kRMZr@qvaw;kP1C+&JGI({(3E~=Skg5 z+l(=;*n%2Mb_oflPMh5Ugn-#ZHkFOU3n9$0IjK`ACjmQXGaKY z?%etiQT62)UmxGRQG&TwtDS1Kj7Je+?8x+9Tn|rk2aOq>P6q)&38~61Dwp^k{;)O* zJ=(}&=JAcncCNjJ(q65f(`q%xA32bghorz0w{hKHeeRxVFYxE>7cMU^PoKb%W9!XO zzx>6szug{>Ay=llZ9bXL<5n}Vg22rXttxSvXdVs@JsIu-`&)a=O}WRIeOAR@%9G<+1wx4{g0&-FdHH#U3>@gCLH<8@TB09RkftxYpb7 zgIDWULwRX+jz;BNVN%KE_P6KPM-V9ew@y!C?>Of%_USGU4(@)t7#}T;76%6t*!x%C zo_~D6T#HeraN>K>sMl*-oJw9Jl>##`b(0Vj+6Kz2a*QWwb<7E~cH50c3rT{@>*z2{ z32KVryL8BNVwwp@Nlm_zVY8vZ1L{Yt?>iPhvCzC#^H$EvIreV`r@vof>p$LUVAe}( zRc^pi{mzbtG;F<&Q-1{M>mztD?S2ptRdBiZyc)p3N4K164UoBAV-P1rH}{BoW@BHh z?>!x^{mnW?=P8r9+^~Eg%OYF{;TkuWFQKb;arVbwf#tdjkW<{@?Ci&jPY)Kcq9CPa zi8c~5j`P4srf6N^lAK&Y=4Oz#>n16~hO(P#Mp>av%5BC-n+j!CKzD$++Cgh>D{SRyg&fsye_-o(ZbBW_DpxnJS7GpF$SF{| zz&pR#`Mrf_xe%OUVaRhCugtu>D?(az72qkNBO8GuRhQ;_Jm#T_Vou!KM1?a zH;}Z!WLJ~c)L#r2i_vl<24F1Ce|qEHJ70h}L_=G@-$DK{*N|?n=N{X{E8&lBJ-WO3 zc7N+JaZ7_veib;Hd!<&p;y7Zb-`^CsH|n_^dMTx2e32K}!R{H+()Oe}DPz-F6(zYjeEdl^$kpscN30$e0ZZPK^~6 z@a)21aOfL4MX8(_L);S?FwL1ODAyz!t>e1dmQB_~>PrhsC6$%3y`CZa_C!HYlj-O7 zYAlE_ZwklO3be)u*wn%}-%o%1;KOG>Z2-A%0LXTyqsAy0l}BQ~ysm9uspFZ7^7>Wa zeHf(y=5WzR>)Ya^b@3r>Tg-@&TneEb7&2$F?ztd$!MF?VcLq``uvZ}K%uAEWVm=8-l#|wg*Yin&Mq?daA$SEE=()TW4@=J343&{s#}A~& zy*URCu(wlNIhug%?Y9r#ci$gU9pz58+YW^{pz9 zZY7Gl;GH&iVC$Rv;W$jhii(&KuB2Fz&y3g&tlUOve}6yq{A99x#-A0erWN?hMH2=O zg_kWi7nUx&NYavwKpFn{`?E3K_GDfj$B9^)_GgwW@LW3S@j8*`p?5L~({!i&6CNl3^kx<8S0G8(+tSyD5tbJO3o%3)HK>lmIX^kWjQ-;rVwesJ@p$Sr{@hV z%UL!cL74`~C*M6EPMzbDgj5SI`8q~-Yfwf$(g(5i8s3lYzo*sj7eVH?MlH+Hq$^@) zd*oo-`?>u(n9pr7ThHw5Z{*P2WP%Epn7zzC5Z;-%!D0f7p9PDtbvTADbul*l1@8Dj zE)-0@?dyUfnZ7Rw7G&y#AMd$QQgta$p4f8CZO0-M4JEUU!c(!yH3x<+I|2h>i^i@+ zT+e_JA!ubN5*2xp(IpTWN=%_BHu1_N5*bj2HJ{AUNvCzfn5SV4{YFsr8h!9aD25!I zfB4~#A0Hq0!)~_Px`&X|Z(Q;EAl2AXsfM=t{^pKWeOj!C>WY@^^u6`|_KV`))4e(l zoXPPWB#C^*scndxn|pxwM7GNoC`rhyIlW%n_bssOiohEK|73h}B+H9yNnQ!8=FIYK zo}keY>bgwNx5m~$kldcsW?WTJx?IJkRLbNqx}i&OwhrqVOhDe|i*YVmk-PFtYQqtN zsRY(jN>>$BicC^0#8Ujk=sv>}1S`D~N#IXuUYX2&WNniMme+Dtojzn{%ex=k`gU=1 zQR7>UPNy^ywd*Sw{Q7IJq1_M*I#Iy;I$lq|TGcQKM%+U6w!B%@#Lj#)8cCyQB1ejQ z<0=pyA=MngBL?Tx_xBPKV@$?lO844|tEdJ#95GGokSom0@R^4q9CKkjwr$oX;+*Tc zV>Vjwe2Dv8zg|=2gE+Mq>V7e z9;mk4uf5ja-0EW(hSq3iOrGjA_@**rT$s~2i$z~T`8hdku`i&%`+tj|qYpaNs3l z(WE3PNLyzzqY|?w*-Yk(BnS+l;M+akgwiz&}U@7Q?QWT}=tit7$bRukmqULN90$RTVB`UY5qa*s9xR2McYi$hM&i~E4prOsJ0oRM5gWb! zQ1qOtr-hFfR2!YGRJDUlESQc&shUf?oQXV?%E61XsZ=(D>ZVuQ$Pl@DCYS3}x*&^y zJM3PD@dR`XFrEk5`Qga{R2*cIv7&83m>HB2c6}FJANu7&P#6pONbwbD9nxxEiI{Vl z7u+_vM)6UBJ0y}S?z#}|mG31xwKz`?j_4Pw@qY7=BM-ELyZUMi9&72RN?G;3QrPtGA&PU8d(y&|)MAk$G2 zF+6AH2b4AI>M=3~^(Xq~6nM;J3^NU4#U#yBf=#FbB(Efcep*U5Q{z;HsnF0&xILnB z)?9{Kai1NHY8`3R8_mzgH-jTopT219=YVIuvM81T@uNBb3_)2AacXTlA?|fHLt0Y| z|1&4To!7TSQ9~gohkvqr8{sUpST04Z3E?MSsjv)~;l%SE%AMB))~o3 z)-nhtN)A!?Ry~2|^dzmsd$qZg%T+p(S7n_lsLhc!!jPY^bej}wUO9s?{<#_gyfu@Ev4vb2#*4xizdX^%)ETV1Nvd5URB1~u=FVlvTqmOFeA;7=$78UE*t=saXJmvTiqJp-X$Z}_G!jXXl|a!J2(nN{ZxIp&$jvK3 z;@@(d1q$v<#(BRM?|Uh~`ugQ-WGQePH-yKC`)cBbLf^fISFq3S zKKb~=4-wF-xI`MU_3CgJsn2;9l{m9`KA?=uuAhGWvic(eA{ z4`~#gyc>2eEpbw8IVmg==ii33iFD+kj^Yg`d3-Q#vqmp}e0=(H_@SvDpK*!$c>nNz zh8t7-^2he~@1MVTzxd?-^ZK(-KF2L+K8nAEJ|jgTPi1$X!kb@bHU56T5I%#fe+YxN ze}fpf`?`4fVe`@)p0^vm(S?l*Nc1>rV;*pQAlqKjJ~}=cGdbp4pYt>NuH3f?lZb%J z3e^rg{5tCZRIa%~A{qg|47p`BCO^PkhIAV!b;IiESt99qq_zzp4`Fn9x+I zBp)J%|3%MQVoz1N9iH|?NGqt`pi0c2t2CyjE{`v@c}e;G;qcStx9#)OSMMG_e;41Y z_?!aJx8HvI?pG-IVfUZjEr6Gsqd(l;;u_Fv4Bvc%d&OsqmaXa)%H-@NTiLJc`h^yX z zdbo>>9#4yxG~&4x-VdcTG>^dWq?!z+~;V$UdQhi!-Wo9r-Q9N z|K=NP$SRHs1XK|(zomaMvVy;bXh;#`Js$4{{v)cqyEvoHw#p{)x^MRVunsPlEZ@E9 zFYA-s zxqI)E?-n7i@38^cgazBb&$zCSXoK*jpab>QT)(qU@V(=;y3OG+0&9J{2~IX|hm(b2=8MRE(@kPy}(F2o+qxmnupIO&6Evx6WT-~E0yI-hH7RWf#`y1iEx%+g9`5Vta1?`uUU<6zYuh;Qnw5~VD zto}61ZeB+&*%U>gNfbp$sFR6`JO#aXsdYq-Y3}n&yM7Z`+f`MUKW%@!ti^K@#UVJG zd$TJ@KTW}Cn>_EDB%=92g^=?#@x2(V?a{bJt(hvK8|l!YCqxG+o#*SOqq2n`8_C#^ z4;>_iYzXHdSUf-k8$u!~j`N(YNKKE$0v*5S<3qDRN2wL5&ft9CKeZ5|dgpws_GGhEoPujA;bY?P0 zZOf`I?(He@e!n3ifBW@f{vaML1N{f7;7 ziu|@ui+gm|85j+;48AnRtTg-zS3hK*!o#nYEite>Rtwt^)DZ}@i6V68*a|$x<0BDV zD99Y8)(Xb#X~LXVhQO?)v>;4*-(8}^o^>6rR$O+;d8kTBtvh(p(H(JvGlw~Q+*Kay zpAtnFE=CM*8YKNKKSM1g`nKiL#g(?2vVv4mCq_x7c0nPuP$rzfJkljq|3+{wMhA^0 zR+54ja3C)!jpGP@B~QasTGUH$-!1GOfnkM5gkiDct3lu5qBbToc(2G_zvfuP$7MHT zQDC6Q@vCKS!U)WAVxfGeDMElF6s5C>b!j347WJPp4L##x_sSWaw>=dHvAUeeFD*#TiIR&DsL3(3mJNkic0@xc9BCP=5XOSI@|Z z1-2^QC4PhylQ=sG`=)l0<~(4#4v;J3P}2B4BE;?U{%i)FwrpnE^-Z%oWV4$NIiZTU z&@wtp>ilk3@`85~6`Y0?Zo@sEqi*DS7+f@~s9 zSLGu2uvK=2-7Uk6C+y)qzQ5@}nSxFNpbL@RUBMO}ixH>Tg48uiC8|`jF%#p81veQ= zly8F*mhhd=&zr;g@K?8f6ts|?SNxE_iTB^x}tLrx2Nn-?w(nPdEFv24!tyhdyL9o1I!nP5lXY@qM1v-L~$JEeG z_gEYe#4cOvk*mm#6tEV-$5kf8Gr}8|&8DW=JexV2R|Vb!cDPn+3X3?BxQpllT}LDV z+xf^Wfy;6ygya(LzzK&mWm)UhroXh@SImMK3N5yWzKPQ`MGbS8&BTo6Rz~5lgYwP3 zP>uI|Pu>hxczy3zm2$9i6GdZV?d)bpgo`&X#p8bDD}0 zGTU)!Rx6#+Xk71_$RNwnhlSV=={@?IMdmQTOtGl-t#FA;TECjjU_ig5bOWOnLuO`C zj%@Ka>f1;(xnG*`nM#KjmTJ9pFG-Mur*HTBU@hl)*Qtn%p;f!C+%9rZU&pB36Qhl2 z0LQJX)=zBvsqfOOHWdCK0&~s`X4+a zNklAA1HZ9x1a~BoX4y*>(He=2KESRI_Bv zO}HKBfU|~1NdihUCL=0k#h8%77zwQrl12#Q{_^JW(F@;oETrH-dx|2%(abf%0mW$M zGF|6P(wX=rE%oc6iCWo`wr3Z;-66M`XrevpqH7eWmO5(k#L3x6m^)4qE*C@z)$WxF z%0pkfrh&q=*4oqy5W{FJ*Tii^Gl6glYr2S*)gb z^9Ehqju71?)@5)}Btw#%#!)6nZcY(!KRD?GZ)~^gd7CUxwP;W-tO|m(QahFo+olkj zGCI{=!nt%aBP6MsCK+r;c+dY7jhqT*g{sf9OXjP)LzZMNrU?AmOok{)4T)@`fHPF8 zYV+0-+aby<#Lh|0C>BfQ0=-t0E72ttv?2#Z$@KVo0|dptBKom z3v>mj3&VgIcXeKGY-ArdDSJIV?6g2^iZ%4%VmXac@YcUt}E&?3f9K0 z9+)o-D-v9cT(8O7OUS2Z&fvD?`w=rFIr0@!YQ~hj(km5AU#FD`-cHlR6pAJrN#1*} z+JZo77-Viz3k2%SVodA*pwF++VgEq~?8UHjvK%5n7q8GU0ev;L%(g%WLipA?Bw4Hw z!pm@GA_igJiefrmwn?8Scz<7YjdHFT1|^ZdRYzhwN$%s!nXaj>lhKTkP50uNKUz`_ z{!H?<8-jl>wpCP_2X@s7ul=1t+Qi0B*20g5GBHuRH11wN-58oBMIr))cUG#Uw0d2u z`zJ!pe1nb+_&;>0Hvlh~WdzNH0eT^D{vYW2)$6zE3=|&FC36;D4?#+8*sSR^P7~fI z_+~>o%D_4#@y?E_^IWw|AQ)}L3f4NP6D2L3qeA6L6wQ-zqvs;`)+V$kz6x8Nzljo= zEv2uGI;;Soslz8{ji84Uu~NA#lzD|%55#d5>;gTYRj>}wDOU84*TW3_sBf;>40#I~ zeT7~da9A(U$zqNWetQMS3!J~117wY-SdPGX#0VD#w?KEV(5ap*1y$hfA|6kHB|t8^ zG4Y)ejZa#pFmG#_pbj#j?K}x8xe!80F+=6mx!JS{8wgvIzf__p8koI;Ac8$$)sn5Q z8nhzwJn67xcq5pCi-oW~bd$9qEHyk7sC5pkkEH$=Ix_~CF$qSqKwr$*8pyF^0u!&$ zg?)uyup3^Oi(a8Kz1Yp`k#r2uCH}qtpo1J@C{ryF3?$__SN_~C#jYPJB?wb3!3>O9 s>SmKTFz#xX%2+j_#T4;&ea^-9Z+8#z7el$et^fc407*qoM6N<$f?|Tx;{X5v diff --git a/vendor/github.com/go-playground/locales/rules.go b/vendor/github.com/go-playground/locales/rules.go deleted file mode 100644 index 92029001..00000000 --- a/vendor/github.com/go-playground/locales/rules.go +++ /dev/null @@ -1,293 +0,0 @@ -package locales - -import ( - "strconv" - "time" - - "github.com/go-playground/locales/currency" -) - -// // ErrBadNumberValue is returned when the number passed for -// // plural rule determination cannot be parsed -// type ErrBadNumberValue struct { -// NumberValue string -// InnerError error -// } - -// // Error returns ErrBadNumberValue error string -// func (e *ErrBadNumberValue) Error() string { -// return fmt.Sprintf("Invalid Number Value '%s' %s", e.NumberValue, e.InnerError) -// } - -// var _ error = new(ErrBadNumberValue) - -// PluralRule denotes the type of plural rules -type PluralRule int - -// PluralRule's -const ( - PluralRuleUnknown PluralRule = iota - PluralRuleZero // zero - PluralRuleOne // one - singular - PluralRuleTwo // two - dual - PluralRuleFew // few - paucal - PluralRuleMany // many - also used for fractions if they have a separate class - PluralRuleOther // other - required—general plural form—also used if the language only has a single form -) - -const ( - pluralsString = "UnknownZeroOneTwoFewManyOther" -) - -// Translator encapsulates an instance of a locale -// NOTE: some values are returned as a []byte just in case the caller -// wishes to add more and can help avoid allocations; otherwise just cast as string -type Translator interface { - - // The following Functions are for overriding, debugging or developing - // with a Translator Locale - - // Locale returns the string value of the translator - Locale() string - - // returns an array of cardinal plural rules associated - // with this translator - PluralsCardinal() []PluralRule - - // returns an array of ordinal plural rules associated - // with this translator - PluralsOrdinal() []PluralRule - - // returns an array of range plural rules associated - // with this translator - PluralsRange() []PluralRule - - // returns the cardinal PluralRule given 'num' and digits/precision of 'v' for locale - CardinalPluralRule(num float64, v uint64) PluralRule - - // returns the ordinal PluralRule given 'num' and digits/precision of 'v' for locale - OrdinalPluralRule(num float64, v uint64) PluralRule - - // returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for locale - RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) PluralRule - - // returns the locales abbreviated month given the 'month' provided - MonthAbbreviated(month time.Month) string - - // returns the locales abbreviated months - MonthsAbbreviated() []string - - // returns the locales narrow month given the 'month' provided - MonthNarrow(month time.Month) string - - // returns the locales narrow months - MonthsNarrow() []string - - // returns the locales wide month given the 'month' provided - MonthWide(month time.Month) string - - // returns the locales wide months - MonthsWide() []string - - // returns the locales abbreviated weekday given the 'weekday' provided - WeekdayAbbreviated(weekday time.Weekday) string - - // returns the locales abbreviated weekdays - WeekdaysAbbreviated() []string - - // returns the locales narrow weekday given the 'weekday' provided - WeekdayNarrow(weekday time.Weekday) string - - // WeekdaysNarrowreturns the locales narrow weekdays - WeekdaysNarrow() []string - - // returns the locales short weekday given the 'weekday' provided - WeekdayShort(weekday time.Weekday) string - - // returns the locales short weekdays - WeekdaysShort() []string - - // returns the locales wide weekday given the 'weekday' provided - WeekdayWide(weekday time.Weekday) string - - // returns the locales wide weekdays - WeekdaysWide() []string - - // The following Functions are common Formatting functionsfor the Translator's Locale - - // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v' - FmtNumber(num float64, v uint64) string - - // returns 'num' with digits/precision of 'v' for locale and handles both Whole and Real numbers based on 'v' - // NOTE: 'num' passed into FmtPercent is assumed to be in percent already - FmtPercent(num float64, v uint64) string - - // returns the currency representation of 'num' with digits/precision of 'v' for locale - FmtCurrency(num float64, v uint64, currency currency.Type) string - - // returns the currency representation of 'num' with digits/precision of 'v' for locale - // in accounting notation. - FmtAccounting(num float64, v uint64, currency currency.Type) string - - // returns the short date representation of 't' for locale - FmtDateShort(t time.Time) string - - // returns the medium date representation of 't' for locale - FmtDateMedium(t time.Time) string - - // returns the long date representation of 't' for locale - FmtDateLong(t time.Time) string - - // returns the full date representation of 't' for locale - FmtDateFull(t time.Time) string - - // returns the short time representation of 't' for locale - FmtTimeShort(t time.Time) string - - // returns the medium time representation of 't' for locale - FmtTimeMedium(t time.Time) string - - // returns the long time representation of 't' for locale - FmtTimeLong(t time.Time) string - - // returns the full time representation of 't' for locale - FmtTimeFull(t time.Time) string -} - -// String returns the string value of PluralRule -func (p PluralRule) String() string { - - switch p { - case PluralRuleZero: - return pluralsString[7:11] - case PluralRuleOne: - return pluralsString[11:14] - case PluralRuleTwo: - return pluralsString[14:17] - case PluralRuleFew: - return pluralsString[17:20] - case PluralRuleMany: - return pluralsString[20:24] - case PluralRuleOther: - return pluralsString[24:] - default: - return pluralsString[:7] - } -} - -// -// Precision Notes: -// -// must specify a precision >= 0, and here is why https://play.golang.org/p/LyL90U0Vyh -// -// v := float64(3.141) -// i := float64(int64(v)) -// -// fmt.Println(v - i) -// -// or -// -// s := strconv.FormatFloat(v-i, 'f', -1, 64) -// fmt.Println(s) -// -// these will not print what you'd expect: 0.14100000000000001 -// and so this library requires a precision to be specified, or -// inaccurate plural rules could be applied. -// -// -// -// n - absolute value of the source number (integer and decimals). -// i - integer digits of n. -// v - number of visible fraction digits in n, with trailing zeros. -// w - number of visible fraction digits in n, without trailing zeros. -// f - visible fractional digits in n, with trailing zeros. -// t - visible fractional digits in n, without trailing zeros. -// -// -// Func(num float64, v uint64) // v = digits/precision and prevents -1 as a special case as this can lead to very unexpected behaviour, see precision note's above. -// -// n := math.Abs(num) -// i := int64(n) -// v := v -// -// -// w := strconv.FormatFloat(num-float64(i), 'f', int(v), 64) // then parse backwards on string until no more zero's.... -// f := strconv.FormatFloat(n, 'f', int(v), 64) // then turn everything after decimal into an int64 -// t := strconv.FormatFloat(n, 'f', int(v), 64) // then parse backwards on string until no more zero's.... -// -// -// -// General Inclusion Rules -// - v will always be available inherently -// - all require n -// - w requires i -// - -// W returns the number of visible fraction digits in N, without trailing zeros. -func W(n float64, v uint64) (w int64) { - - s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) - - // with either be '0' or '0.xxxx', so if 1 then w will be zero - // otherwise need to parse - if len(s) != 1 { - - s = s[2:] - end := len(s) + 1 - - for i := end; i >= 0; i-- { - if s[i] != '0' { - end = i + 1 - break - } - } - - w = int64(len(s[:end])) - } - - return -} - -// F returns the visible fractional digits in N, with trailing zeros. -func F(n float64, v uint64) (f int64) { - - s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) - - // with either be '0' or '0.xxxx', so if 1 then f will be zero - // otherwise need to parse - if len(s) != 1 { - - // ignoring error, because it can't fail as we generated - // the string internally from a real number - f, _ = strconv.ParseInt(s[2:], 10, 64) - } - - return -} - -// T returns the visible fractional digits in N, without trailing zeros. -func T(n float64, v uint64) (t int64) { - - s := strconv.FormatFloat(n-float64(int64(n)), 'f', int(v), 64) - - // with either be '0' or '0.xxxx', so if 1 then t will be zero - // otherwise need to parse - if len(s) != 1 { - - s = s[2:] - end := len(s) + 1 - - for i := end; i >= 0; i-- { - if s[i] != '0' { - end = i + 1 - break - } - } - - // ignoring error, because it can't fail as we generated - // the string internally from a real number - t, _ = strconv.ParseInt(s[:end], 10, 64) - } - - return -} diff --git a/vendor/github.com/go-playground/universal-translator/.gitignore b/vendor/github.com/go-playground/universal-translator/.gitignore deleted file mode 100644 index bc4e07f3..00000000 --- a/vendor/github.com/go-playground/universal-translator/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -*.coverprofile \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/.travis.yml b/vendor/github.com/go-playground/universal-translator/.travis.yml deleted file mode 100644 index 39b8b923..00000000 --- a/vendor/github.com/go-playground/universal-translator/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: go -go: - - 1.13.4 - - tip -matrix: - allow_failures: - - go: tip - -notifications: - email: - recipients: dean.karn@gmail.com - on_success: change - on_failure: always - -before_install: - - go install github.com/mattn/goveralls - -# Only clone the most recent commit. -git: - depth: 1 - -script: - - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... - -after_success: | - [ $TRAVIS_GO_VERSION = 1.13.4 ] && - goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/universal-translator/LICENSE b/vendor/github.com/go-playground/universal-translator/LICENSE deleted file mode 100644 index 8d8aba15..00000000 --- a/vendor/github.com/go-playground/universal-translator/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Go Playground - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/go-playground/universal-translator/README.md b/vendor/github.com/go-playground/universal-translator/README.md deleted file mode 100644 index 071f33ab..00000000 --- a/vendor/github.com/go-playground/universal-translator/README.md +++ /dev/null @@ -1,89 +0,0 @@ -## universal-translator -![Project status](https://img.shields.io/badge/version-0.17.0-green.svg) -[![Build Status](https://travis-ci.org/go-playground/universal-translator.svg?branch=master)](https://travis-ci.org/go-playground/universal-translator) -[![Coverage Status](https://coveralls.io/repos/github/go-playground/universal-translator/badge.svg)](https://coveralls.io/github/go-playground/universal-translator) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/universal-translator)](https://goreportcard.com/report/github.com/go-playground/universal-translator) -[![GoDoc](https://godoc.org/github.com/go-playground/universal-translator?status.svg)](https://godoc.org/github.com/go-playground/universal-translator) -![License](https://img.shields.io/dub/l/vibe-d.svg) -[![Gitter](https://badges.gitter.im/go-playground/universal-translator.svg)](https://gitter.im/go-playground/universal-translator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Universal Translator is an i18n Translator for Go/Golang using CLDR data + pluralization rules - -Why another i18n library? --------------------------- -Because none of the plural rules seem to be correct out there, including the previous implementation of this package, -so I took it upon myself to create [locales](https://github.com/go-playground/locales) for everyone to use; this package -is a thin wrapper around [locales](https://github.com/go-playground/locales) in order to store and translate text for -use in your applications. - -Features --------- -- [x] Rules generated from the [CLDR](http://cldr.unicode.org/index/downloads) data, v30.0.3 -- [x] Contains Cardinal, Ordinal and Range Plural Rules -- [x] Contains Month, Weekday and Timezone translations built in -- [x] Contains Date & Time formatting functions -- [x] Contains Number, Currency, Accounting and Percent formatting functions -- [x] Supports the "Gregorian" calendar only ( my time isn't unlimited, had to draw the line somewhere ) -- [x] Support loading translations from files -- [x] Exporting translations to file(s), mainly for getting them professionally translated -- [ ] Code Generation for translation files -> Go code.. i.e. after it has been professionally translated -- [ ] Tests for all languages, I need help with this, please see [here](https://github.com/go-playground/locales/issues/1) - -Installation ------------ - -Use go get - -```shell -go get github.com/go-playground/universal-translator -``` - -Usage & Documentation -------- - -Please see https://godoc.org/github.com/go-playground/universal-translator for usage docs - -##### Examples: - -- [Basic](https://github.com/go-playground/universal-translator/tree/master/_examples/basic) -- [Full - no files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-no-files) -- [Full - with files](https://github.com/go-playground/universal-translator/tree/master/_examples/full-with-files) - -File formatting --------------- -All types, Plain substitution, Cardinal, Ordinal and Range translations can all be contained withing the same file(s); -they are only separated for easy viewing. - -##### Examples: - -- [Formats](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats) - -##### Basic Makeup -NOTE: not all fields are needed for all translation types, see [examples](https://github.com/go-playground/universal-translator/tree/master/_examples/file-formats) -```json -{ - "locale": "en", - "key": "days-left", - "trans": "You have {0} day left.", - "type": "Cardinal", - "rule": "One", - "override": false -} -``` -|Field|Description| -|---|---| -|locale|The locale for which the translation is for.| -|key|The translation key that will be used to store and lookup each translation; normally it is a string or integer.| -|trans|The actual translation text.| -|type|The type of translation Cardinal, Ordinal, Range or "" for a plain substitution(not required to be defined if plain used)| -|rule|The plural rule for which the translation is for eg. One, Two, Few, Many or Other.(not required to be defined if plain used)| -|override|If you wish to override an existing translation that has already been registered, set this to 'true'. 99% of the time there is no need to define it.| - -Help With Tests ---------------- -To anyone interesting in helping or contributing, I sure could use some help creating tests for each language. -Please see issue [here](https://github.com/go-playground/locales/issues/1) for details. - -License ------- -Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/universal-translator/errors.go b/vendor/github.com/go-playground/universal-translator/errors.go deleted file mode 100644 index 38b163b6..00000000 --- a/vendor/github.com/go-playground/universal-translator/errors.go +++ /dev/null @@ -1,148 +0,0 @@ -package ut - -import ( - "errors" - "fmt" - - "github.com/go-playground/locales" -) - -var ( - // ErrUnknowTranslation indicates the translation could not be found - ErrUnknowTranslation = errors.New("Unknown Translation") -) - -var _ error = new(ErrConflictingTranslation) -var _ error = new(ErrRangeTranslation) -var _ error = new(ErrOrdinalTranslation) -var _ error = new(ErrCardinalTranslation) -var _ error = new(ErrMissingPluralTranslation) -var _ error = new(ErrExistingTranslator) - -// ErrExistingTranslator is the error representing a conflicting translator -type ErrExistingTranslator struct { - locale string -} - -// Error returns ErrExistingTranslator's internal error text -func (e *ErrExistingTranslator) Error() string { - return fmt.Sprintf("error: conflicting translator for locale '%s'", e.locale) -} - -// ErrConflictingTranslation is the error representing a conflicting translation -type ErrConflictingTranslation struct { - locale string - key interface{} - rule locales.PluralRule - text string -} - -// Error returns ErrConflictingTranslation's internal error text -func (e *ErrConflictingTranslation) Error() string { - - if _, ok := e.key.(string); !ok { - return fmt.Sprintf("error: conflicting key '%#v' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale) - } - - return fmt.Sprintf("error: conflicting key '%s' rule '%s' with text '%s' for locale '%s', value being ignored", e.key, e.rule, e.text, e.locale) -} - -// ErrRangeTranslation is the error representing a range translation error -type ErrRangeTranslation struct { - text string -} - -// Error returns ErrRangeTranslation's internal error text -func (e *ErrRangeTranslation) Error() string { - return e.text -} - -// ErrOrdinalTranslation is the error representing an ordinal translation error -type ErrOrdinalTranslation struct { - text string -} - -// Error returns ErrOrdinalTranslation's internal error text -func (e *ErrOrdinalTranslation) Error() string { - return e.text -} - -// ErrCardinalTranslation is the error representing a cardinal translation error -type ErrCardinalTranslation struct { - text string -} - -// Error returns ErrCardinalTranslation's internal error text -func (e *ErrCardinalTranslation) Error() string { - return e.text -} - -// ErrMissingPluralTranslation is the error signifying a missing translation given -// the locales plural rules. -type ErrMissingPluralTranslation struct { - locale string - key interface{} - rule locales.PluralRule - translationType string -} - -// Error returns ErrMissingPluralTranslation's internal error text -func (e *ErrMissingPluralTranslation) Error() string { - - if _, ok := e.key.(string); !ok { - return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%#v' and locale '%s'", e.translationType, e.rule, e.key, e.locale) - } - - return fmt.Sprintf("error: missing '%s' plural rule '%s' for translation with key '%s' and locale '%s'", e.translationType, e.rule, e.key, e.locale) -} - -// ErrMissingBracket is the error representing a missing bracket in a translation -// eg. This is a {0 <-- missing ending '}' -type ErrMissingBracket struct { - locale string - key interface{} - text string -} - -// Error returns ErrMissingBracket error message -func (e *ErrMissingBracket) Error() string { - return fmt.Sprintf("error: missing bracket '{}', in translation. locale: '%s' key: '%v' text: '%s'", e.locale, e.key, e.text) -} - -// ErrBadParamSyntax is the error representing a bad parameter definition in a translation -// eg. This is a {must-be-int} -type ErrBadParamSyntax struct { - locale string - param string - key interface{} - text string -} - -// Error returns ErrBadParamSyntax error message -func (e *ErrBadParamSyntax) Error() string { - return fmt.Sprintf("error: bad parameter syntax, missing parameter '%s' in translation. locale: '%s' key: '%v' text: '%s'", e.param, e.locale, e.key, e.text) -} - -// import/export errors - -// ErrMissingLocale is the error representing an expected locale that could -// not be found aka locale not registered with the UniversalTranslator Instance -type ErrMissingLocale struct { - locale string -} - -// Error returns ErrMissingLocale's internal error text -func (e *ErrMissingLocale) Error() string { - return fmt.Sprintf("error: locale '%s' not registered.", e.locale) -} - -// ErrBadPluralDefinition is the error representing an incorrect plural definition -// usually found within translations defined within files during the import process. -type ErrBadPluralDefinition struct { - tl translation -} - -// Error returns ErrBadPluralDefinition's internal error text -func (e *ErrBadPluralDefinition) Error() string { - return fmt.Sprintf("error: bad plural definition '%#v'", e.tl) -} diff --git a/vendor/github.com/go-playground/universal-translator/go.mod b/vendor/github.com/go-playground/universal-translator/go.mod deleted file mode 100644 index 8079590f..00000000 --- a/vendor/github.com/go-playground/universal-translator/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/go-playground/universal-translator - -go 1.13 - -require github.com/go-playground/locales v0.13.0 diff --git a/vendor/github.com/go-playground/universal-translator/go.sum b/vendor/github.com/go-playground/universal-translator/go.sum deleted file mode 100644 index cbbf3241..00000000 --- a/vendor/github.com/go-playground/universal-translator/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/go-playground/universal-translator/import_export.go b/vendor/github.com/go-playground/universal-translator/import_export.go deleted file mode 100644 index 7bd76f26..00000000 --- a/vendor/github.com/go-playground/universal-translator/import_export.go +++ /dev/null @@ -1,274 +0,0 @@ -package ut - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "io" - - "github.com/go-playground/locales" -) - -type translation struct { - Locale string `json:"locale"` - Key interface{} `json:"key"` // either string or integer - Translation string `json:"trans"` - PluralType string `json:"type,omitempty"` - PluralRule string `json:"rule,omitempty"` - OverrideExisting bool `json:"override,omitempty"` -} - -const ( - cardinalType = "Cardinal" - ordinalType = "Ordinal" - rangeType = "Range" -) - -// ImportExportFormat is the format of the file import or export -type ImportExportFormat uint8 - -// supported Export Formats -const ( - FormatJSON ImportExportFormat = iota -) - -// Export writes the translations out to a file on disk. -// -// NOTE: this currently only works with string or int translations keys. -func (t *UniversalTranslator) Export(format ImportExportFormat, dirname string) error { - - _, err := os.Stat(dirname) - fmt.Println(dirname, err, os.IsNotExist(err)) - if err != nil { - - if !os.IsNotExist(err) { - return err - } - - if err = os.MkdirAll(dirname, 0744); err != nil { - return err - } - } - - // build up translations - var trans []translation - var b []byte - var ext string - - for _, locale := range t.translators { - - for k, v := range locale.(*translator).translations { - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k, - Translation: v.text, - }) - } - - for k, pluralTrans := range locale.(*translator).cardinalTanslations { - - for i, plural := range pluralTrans { - - // leave enough for all plural rules - // but not all are set for all languages. - if plural == nil { - continue - } - - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k.(string), - Translation: plural.text, - PluralType: cardinalType, - PluralRule: locales.PluralRule(i).String(), - }) - } - } - - for k, pluralTrans := range locale.(*translator).ordinalTanslations { - - for i, plural := range pluralTrans { - - // leave enough for all plural rules - // but not all are set for all languages. - if plural == nil { - continue - } - - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k.(string), - Translation: plural.text, - PluralType: ordinalType, - PluralRule: locales.PluralRule(i).String(), - }) - } - } - - for k, pluralTrans := range locale.(*translator).rangeTanslations { - - for i, plural := range pluralTrans { - - // leave enough for all plural rules - // but not all are set for all languages. - if plural == nil { - continue - } - - trans = append(trans, translation{ - Locale: locale.Locale(), - Key: k.(string), - Translation: plural.text, - PluralType: rangeType, - PluralRule: locales.PluralRule(i).String(), - }) - } - } - - switch format { - case FormatJSON: - b, err = json.MarshalIndent(trans, "", " ") - ext = ".json" - } - - if err != nil { - return err - } - - err = ioutil.WriteFile(filepath.Join(dirname, fmt.Sprintf("%s%s", locale.Locale(), ext)), b, 0644) - if err != nil { - return err - } - - trans = trans[0:0] - } - - return nil -} - -// Import reads the translations out of a file or directory on disk. -// -// NOTE: this currently only works with string or int translations keys. -func (t *UniversalTranslator) Import(format ImportExportFormat, dirnameOrFilename string) error { - - fi, err := os.Stat(dirnameOrFilename) - if err != nil { - return err - } - - processFn := func(filename string) error { - - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() - - return t.ImportByReader(format, f) - } - - if !fi.IsDir() { - return processFn(dirnameOrFilename) - } - - // recursively go through directory - walker := func(path string, info os.FileInfo, err error) error { - - if info.IsDir() { - return nil - } - - switch format { - case FormatJSON: - // skip non JSON files - if filepath.Ext(info.Name()) != ".json" { - return nil - } - } - - return processFn(path) - } - - return filepath.Walk(dirnameOrFilename, walker) -} - -// ImportByReader imports the the translations found within the contents read from the supplied reader. -// -// NOTE: generally used when assets have been embedded into the binary and are already in memory. -func (t *UniversalTranslator) ImportByReader(format ImportExportFormat, reader io.Reader) error { - - b, err := ioutil.ReadAll(reader) - if err != nil { - return err - } - - var trans []translation - - switch format { - case FormatJSON: - err = json.Unmarshal(b, &trans) - } - - if err != nil { - return err - } - - for _, tl := range trans { - - locale, found := t.FindTranslator(tl.Locale) - if !found { - return &ErrMissingLocale{locale: tl.Locale} - } - - pr := stringToPR(tl.PluralRule) - - if pr == locales.PluralRuleUnknown { - - err = locale.Add(tl.Key, tl.Translation, tl.OverrideExisting) - if err != nil { - return err - } - - continue - } - - switch tl.PluralType { - case cardinalType: - err = locale.AddCardinal(tl.Key, tl.Translation, pr, tl.OverrideExisting) - case ordinalType: - err = locale.AddOrdinal(tl.Key, tl.Translation, pr, tl.OverrideExisting) - case rangeType: - err = locale.AddRange(tl.Key, tl.Translation, pr, tl.OverrideExisting) - default: - return &ErrBadPluralDefinition{tl: tl} - } - - if err != nil { - return err - } - } - - return nil -} - -func stringToPR(s string) locales.PluralRule { - - switch s { - case "One": - return locales.PluralRuleOne - case "Two": - return locales.PluralRuleTwo - case "Few": - return locales.PluralRuleFew - case "Many": - return locales.PluralRuleMany - case "Other": - return locales.PluralRuleOther - default: - return locales.PluralRuleUnknown - } - -} diff --git a/vendor/github.com/go-playground/universal-translator/logo.png b/vendor/github.com/go-playground/universal-translator/logo.png deleted file mode 100644 index a37aa8c0cd0f6e1b98e0be3eb2531ebc6ac6717b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16598 zcmV(yK*U_<=i=1Q$^7;0v#+eDrK0%p z>%6(N%f`XBv#;pk-N3xJlaY`9`tZ@r#>d0H&B?^Dtf>F`_3`TEoSK)csHK;dl)1LD z{xUb9o}0zMyZALSjf{%1BqI0!{{5jc`1SO`zPq8KpwB5MBz`@`DJHxnB>jUjr=XpP zhJ*ceGX0V>qah&tt}xmxDK3XPA9F;SA|8N$duRs?{%JJ*T{HG>5AcL8I*&O1Ju^KN z1^!Yp@h&apFDzno38}29au*Y6VF#%(B=Pd^`t{{04g#CPRH8PEL>89OH1Y4=wM`?Y+cnsCD|dZGb#-yb zPbYsY6v#U#TTlf1)HKmxCR88|TWkfi;WgJmEa>U!iH1CPzc%zlFUrZIxOpL50SAW2 zHrkRe-Bv8!+}rP-U23*Bp`mB-jzz%dHuKoF($TRq)t%&MEAPFIet}u?$D-;-NTfd? zqGBFudL7@{$H>RCmXS~SDk-e2cr(q3b}2D4;I^fdk8wf@!NHcex`pmIGxX}ykX2Zk zP#l(MXu)GF(Pvk zb5n$3uu@QfLrR3XE#bH{zmF;My}ImfZ|eE@n0GU+i65iC#kVv_JUkHP6q^ z=b4$1KRnawHnN9;XOVD+dTcU@PWtQI+{V7)vVb@}2{~W|d768ob{*KawLyATCMyBY zhk?3y?SQh*YZ(!U#KDNg9qaM-(p?CZPE$X(8z(y`Rk002FaNkl8uC7fajE|-h>jHG2b9lbevz(KOfu`z+X2)PND2t1w1WGFmB z;BZ@Tf}w8eW!d6lVUNJlhe<3w@VLAr5!hqYo=(frj?qrXhNe@r$z?o#)_BC$c#6Tn zw%ibJSrePzu1EE-o7FRWE@Bmr=0#t-W8=a(6GTqoYvcqTWN@=@*0!nMye8HIu2(T+Ak@9J5Z~>D99iw*`m8V%yP8G^_lKA3_-39D4+I+C1zz z%PxAIjtxqC6rEeEoK;TYRK5moFT3e)S;c473ltAKvc{hCWlVc;gKFP7(_^pP+TQSQ zjTnnuLBc{Sdb7KSnYy{T8Mi%*-`7X=bnva_VNVf!d<1rL=-JH6uuGF1?^y5f9AB6q zotFt+&fvKN9wTt?2px9TxG)4b)AV}%MO>l#`PSCbhc8CH z(ahGS3jt5QrHGrvLqpybTd3aT!_Ma3C?0!8iS}-@N4$|3Vjk~Odfkur_B2j4Q=ai9 zwCdFE-MgodJ$v@--@hOJdcD5T)wQs^+~2>veB#83lSsEgpFKBQ8LAYfrz?!j@VGrK zfD?mhnuhu zc6A*>`uqE-yqo0c(WA$Y&khU>p!`akr_C16;qx9(K3}Q48GMs(2|#W(U+C>U+gs?p z^6}jBk0WP#6@}XUG1|MFxifa;Gu`Gf@{^8r3D0vJ&-0ExB2Qql!KaO@u%q%RuxCa- z=nDq{@3OWa?o`}pF?bNzz;Q^nz?4c2d1Yzhk<6eIWaeu#=B8Cm810v^Rke)+e)?h zH``r9!+0zn64TyHj(U9NCw8Ir?OU83bm-%VH;0Wb>dWQso<4o4T$akBA7WgT3iz&_ zN#||w+mrl%lwSPt^Vg61UR6`~YFWHi_l{!JcULueSU zuU#7-U!wAd^F!yiGqsgYce}fpeBa&ns10GwH=8Hj)>BVDk~}BH;~@vhCnx{=D_1_h z9(z4@+Q`0r`z}a*NhgoKotri}dCcg8TMu47d)M~vT^slBr56_$zkgrMPE@N|O(WZ! zsLQ%0YpP1+LKrd6^35*)GUSB5)MzwrJS8#U4D>#RSz-pt?c=lJXO zeSaQ*)aC{sacalkE(o<+>1c~WPfGnKtu-k`2YJOl(N%r)u4fVPB7smYkR!~c!2?5` z13>TVn~)3sx0VVE3qQ8?KZ&MxkE4I%0~`Az9FB(`>c8OVKkXPppkEAHPbYRdx2|$6 zf*j~H;Ex?orIrKyj}eYAQ%S`h#fdpw@Cz<58T?>}2zx?ZT|%y(T{~Xpi=gkZTF;#e z3F=$F{`}PNFa>wR$HyM5Ztd#os_vSakjh6}Iy<|C2zX8|>ielr&R9gEe{Fo0|8gK| zkY8VlfcpEtiRi!U(S93Z-L~--2kINT8Vb8(?fP;$%dGar++*t=TX-4CqacXL~rY1d|=Z=r( zT@Q{j(+PIADfOvY)=!t^b(wRg^=0R7n8aR zGu)okchJ@@r~V1+Ujz8JBY#ZBac;u{>vE*5fRzYXDa*3>N)mKP)O|L;_+)+@W$#W_ z1HCSw0BPQbdWUK^n3k3~2){GaaiQou{J~fvivE1qGekZm14C^s_>uYe_~`Zew$6dh z&dz2jY$hilM;G9l1sq4)7Rn-P`H|OEqLr&S14g)DnOR!8zA!U0bMNinM7RaVpGDl; zY-jGh@Wtt|F$}V_tG&EfzS=j}cU7%lLF4S~p35Z7OJBR(*!bOV-xB?PmY6P)N+eR& zm~-CP8no)@pwxKED3P8YEr^+%?8q=F+vn#4EnG5nUJd7iSCx$h8STYo>M5XqKb%>U znOOtZDR(?fN4Uox1Ub*XkD$wZHf)e>(EIqv@I>f+HsGnMd7^oAVqjvh1vQ|K6RZ%6 zS(agDR(SBQc^!rdmzN8vK88rJqp)LqgEnqF@z805HGQJ@1$%=?VI znx@@zXBFMuwRP&sqPpVZvLw6xjS9oC{Zv}oug2jiu%}ZIcF@Ph^RCBI+pC^=W&^+h zj2nbIz;VS1L`O&K^(`$vP;`|5u!wLu!{jbqrQrBbaLVo`2m4qAM6qoVHq>>S?SyR` z*c}LXS5Tn6g}o`iI4?0VQ5zK%Rio1xlm=zWuo0G1 z^py0Jec*;-d4*BepMTH?oH9ZSY$|#H{6GG`^dbW~(Tbd;`3i5jm;5kK&YSMhLvC&3 zHVlp9eiusn*^WX_1XErv-9)w42ysdA?Q+H zW2CX6=ZBNdm?l$Xli3vMR5s}}x+#0!T+v)!UV9=H(9Y8J_>rsU{BkbR#TC3Ak&M^yN+acyB-!s$e-Ut;vL8ySlm4a z;eC8dRw94`tf=X%Uv6%$8=aRI9J<1TIMbMW6^gFu(4jHQl%}SF=r%{bpn^hWvR;$u# z?d{>=gnV=2*2E~n{(eP81u1Vp-=CRI+4rUIi{BUTb=|}MLKVTK$?cJhCIQZa#yajY zS(}2N?bT>;%*x8uf2KJB_nPh{ry9GsF6g#rFPyoz{6b}Ux%JHA;^J%)xNpWt!c`tW z{u(CNPsL)vuD!{O6hY2%>I8qZSX5O>PtGWEy~`Lmb<%8B>Xe$#4z(JbN}bN!q|z#P z103ko^(ZQx!H{Jz7!K^;PuL-zok!n77@PpuN3`=QIJaXNJwN>xw8No`D|!K~UHql+Qv5HWo# zB}cT^)aaC12QmqJ`hK3=ZTlv`6W5{ViSOGfIrW*|Np9;)2Kq```l9tRy)3$O^iF?{ zPUxJ75m{!I-KK-QaAxVc*K(Nd4R;SXqMht4{NEVX+)5Xg*@A@Hq<~LB?(fg+E!|uH zU3PZ%u1f#x_XH9a#ZAHrAeO}~uDGbkZnqajX~LVrJ32BtOdr;k&6(!Li-vb=RcYZo z`qr(9iCZ7x(X%SDkm@`-$X^FI#FKA=?VA8jd`GrF3{<|9@ts|UOIx>`TRl)x)i(4! zVqK1178248PoY+zy&b-K_%Oy7g$1LI+PVzSss7D$wDbGdl?MTRO~_3yx};tzTQz$r zSe*>=WM;>E0%_2DZ|vGpUk`K^A_F2WgkGGN_tjVSqN1X_;l#xEe>Y_`nRX?JRuvab z&g~`&C+yn9tq{;bzH_ItrY6OpN)iIAqhPS4RrcG0}H-ItzJ63yu82&@oOwU+_mf1X}n+g2RO*VZncK44<-BB z+G+Yq=F+7-dwvP<@5T-$&i;rIO9hgIw?BI0!*bRmde8z!{OebMCn_45k1IEu%%;5w zZ2pLs8`5bugFNbyN1`6vx%0719fnqA*1>c_p8opl;C9=-g_85G(`0|)akx&hT0i8E z*A@6EL~^dPMBnD8U_geo*8BDX#{gcTd}-NoZ9(W=)2}TPcDLmocn>*d*J+ov2jn5X zXFPA=Qd371{#Zkjvdg7$5|ZN*kx0rQ<9P{LJPXA|<1mAld=H zeF6pxh+y>)4x?&9&JdUXE;854k?u3tb-luOx$vDg{YKA04)&K8U7-bQ)+Wt*$g!p+ zd>R)h=2(eXDrI1_slN=}1S%ohp zYxPt}n<|U+ZLLX3DU^`n%%gKDue)jSGZ|@jXG+Vz=eq5l&YUz)X3nM`O}_;8bW6G= z_o!T>E7p}a=o+%+4G~%088Lh6<#L=(cY(ZrFR_KH+jR%FgZ+7u*Ku0ym53ZDlD%;M zDK00U$79jCFr3=+e>+Zd8Kbx^y8rpdw;+ePi0(rEcF{vXXUH9M*J=IbOtmtzv9U2p zZ8n=LDb51T5%B!EI7_u9F0HyYe&&bWyDz1GlxsT+qsKmW{8-WTmSZB|aUiV( zp-$K&$n7N5VfYthn(2a0mpq8WDj|Q##oe9cXkS151>`UX`LAYm5)73sDbrS_7t)At z*5MiTSA0^HksSw%*X)LU1ay357LSh~J$h6Zm8R3Ap?k~D-LOHIy{AFm-Px^**;QYa zRWHuV0((CzdpO8}4s*y3Xwud&^^FK$SLZ;dLr&F+Ft25_rg2cGMHE*=P(hwTxPLCH!Q#wALd+)uu>YY1x z@80P^ABRO1AI(Ks%hl*K+3~t~e6n@AtgJn{^)dCj`q*8&RP*TJAcw=-+1WIg>Og-! zi0R>uof>t-y6A!jjiN=dZvEf4lN?@2@VXN~XWf0N=0ImPpPrm-n>8vX&)n@Ol2R#B znbf1LwNQFh?-AAi|L(|>>jb9nKL5a# z9Oin*V%Hps8x@|4J7>=Pz-uLu-d02$AM6y*6+OQCyoDT5;^I)icc$llc4<5}_oyZ} z9q6GAFnMu9vAj6DbA5(iJ=DU~vNpz>?Ab;zfJ01KKV`b&+4+RMK#-yA2MrCG_ zjasUD`OG&}adz8*Hiir*E=5IYiqq0M(?ZkbGuepsVqLeqJEOB(2kKohauw41-dFoo zTMPU9LH@!E;jl%)zA-iRc}Di9+Jk~xPK8|TB|^jN?%g<&O~C;*1>ZTr|1HqT^~&AZ zt2|$RWm0odWs$lF-$Id8uw<=`?m#1}vaQK}T3tBj~iK{rDR^4%a1L}Fip6pKf zo^E+P(CcIO@2Z!pRH`=%LEgUw>`rv2>e~rA)5v2sH_8=VnBt-*_gW4*wPuqbAjy{F zg8t9slNhyMMJprJo3Y9#Q_FY~k2ZAkutg4!9=0@%*iP77rNsdba<2F7igPm&jID>o z#Kgo_Rqc*a9xqlw4X(wq?9avVNq zlfWb>_yT3k)!mnn1Ko?Cg6jldkn@@v0Zpnql3mf#LUJI^Vez+xlB;b|b15a~Lmi@X zJWG2YK1tUT^v0&MU$F+&){6@@u6Tr zjdB19{%^XtMFoAbLxMTGeca3`Dl2Pk)9Z^WWs<-7woPeKX~Znm6;#ut=)i4DZGI`h zOUtV7N~y{@4xQgO_dr`{X@zvA z9J2{nIpTZ?Ix9NJfxgt`Nv!vrR&C#Sx@&moL?lHYuRFE;i^icGLGYMgK=2as!*F+y zzYB7^=2C^ii(DQ062r07cvB{%yjs=fMwz`zF6@(vkk(-#is~cOIV0CsxT=)reLM7O z{`m-UPzCo=aF7%BcH;2FTvT^-HCu;GT{Si0(*uFSLtPj@?fr^guIS!|F@Y(-mgIM0 zaW8WisqhzQofDQsa1z#?_ca*OC3#HY)*TC(}?XH@?&Z-WxtL~JYjrGCdlLMQysqz8SfFa-G>$_VQx`Nh36<)yN?DnC)#7fB z!>_%4IZIsJ+?=ICB0tL7{@(1QvYaHs45Uw{tXPiEHi zq;9v>)C6A~O&ks3E?4zOPYwjEGlgLhcHN7M-5uy4zvVcsRg7q(#oprRXf3(HQ)IUJ z(u5qhYprT2kK(wXIgT4Cestix!M$rbb2e+FyM>a9riL|Pi${b zWYL!fd*tdHml<@G>e3Yo=eHL4-U>46j7L+xp|&jsyRdcav_GR z?TLwOu)`KNH6uRBVLeKlQl-)kmWV=@sXCVuBE7nXm4b>5UH&(vkkqhs7x<)`RO!=hk@B#+>Rab5%2HV z@qUDT;C_V5J-1;)dF|B@?)S7eM0aW)%WxBPyXuLse{y(u{0LS@BmIVYYLo{hWD2@W zboZVy!GJQ!6dA~Det&WKgV$KiKP2R^X|e|>@v@5htOl`G9KBCW0iDKWi+vohILtX5 z^p*J^*^es_9A7ZZoR6G~M`F*2FVBc^fIH)yC5P$^JM5o4eyi0V`;&p#WgX~oN6;>J z0et0m>jc5dfw0Ihzd--h$)=yy!QEN%TWxJW>+df)pr5|OSDf3oFFG2ZXzc}>q&b_B zMpg&^BI6+advZH0JMHW&ICIl5U)0LyHUE0eet<6}U*hm=L-*YCgZ@xG46Ceyo+d7D zd3%z`xob`i3j~46u;DJPA=%%@|0kPmUi4qEJc4B@?^XHJXFAqO`V1r1zKLtsR*;NE zNzF#Pd#CU{q(+zR9chQO!m{&Hv4xPQX#j3VXTf1#kFu$KhQ1i<)SPUJuM zj6L-LfC+56y*~W^lm#th`;^yuyU3>Y=Bs#gX zxN*THx|cicONSWMm{YK(W-A(|v90N^r041!rU`A>rg4C?uVnZw%yymDml4p z^m^gTU=MovKC&c}*us#r9&ZPCq7Nqfe2aR-pda$Z&s?U*NA?7pOv(Y%6~k)7gUQK0 zPXzxS#^$&-EO5FRvD@!aGJV(U+5=erBbz^6`zYjanHk5nd2`k^-vU{R(Sp&GUG>oM zZ5lf{)4a0iGhRQkVSen#&u&g#tE(%ltE+q2en+0jqO)y0J_P+)(#k#;`K>=vJhLjj zDUys|mm@j;KfzeA0IK^LwAwBofAX$JdD#!-1bxj)vM1(_E%vq6zP{+w){!n8mrh3; zP?>3?t*o`RwXLm94=ZA`CPfMH&zg&g9c98Cs=H{;pvT01{ONu+!|ngfTKN5O>D1Ks z9zV8_B>{)%4%Nf)K|f~~9kP!c9En^VwmOiYuRDl&ySn`A%x**wgO0!UE)4c?Ms(|g2CMy12+&Pq_u%a! ziOWhQZw%-Gfyx`CR6=wgpC=AI^yt$zfZw|H0Q}u;1(u~|^$B3tVn=nvYQ4ed2zgxS zE>vK*U!tfik_qSiodN)Tp2_W+;!qadsW~ZX1U+VRZAlf|$MhE>%)cUcmcFa5x76XP zJduPuW)*eUUzl&>!y);g^^r$>h9i^xfsWT$ICA<@{~MmBOC;O{I_0brprKJlb|J+N zgZ&Vmu|4|e&9I`IX0;XsGxg9iuu zuqIF5#P}!U6;uFJ7mT4u{r~d{{YO5J)tr*#)Qq8zwfTvo#i?CPtTX5!huvS|)--)a zw#q}{A!(XCZ|$>Mts^5NR&tLlRg*lYuGAyZt6S$YJjeGH{cYSNYBb}WgdFH;5svdY zJ~6}?^eSp<6xf?_U?H9R$5?|PZITxa^q>|(e$2hsyTr=+`}M~s1`m^+} zk2rdWpck2C5|LhA$x9JQGc#F_$6+?9IdeQ+jvIysW^EuLAuqlmuUj6mzB@0AxVyL$ z4qu-aJCQT;`sS@0+g~r-xOdA*nUt*3k`V|&2YJh}RphC_r-R6Ig#F?g!ysM&;#ElG zL7#6|M+Tbw0&44d(q-Q%l06rGzZ+>}TLX6*pw|{x?0MNM(^eHS2w6q_?+H`NP_lgzP>mx6aB=_u_k3P+) z?qe7vNjYG^WP0@gS$Q~#=Lw3FI z^kQ#lUte#p+rA4F$6!E4qNPdBj>arwkE;qgrLh@`!#X>ea{d=7=N{8m702;%aa^D< zV6csc@^TEk>mZD>DT%9=&`nn;gh)mlB7!rdB9AJME`b_S!eiwj ztdeHfL{c_bjmTcch>`u}|Hkh*x3{+)Iw$_<;Qj;ar@!axl#^7s(}uH{Y;^fAa2w@GE+?S3Ep z{Oz~%^F4tvUh2BKPS&D;Oly$Rx%c=!JlS~bVug~%%PXR^tFgEVUFh02#JbG1Hj4fs zK|iWiefYX6=Vd3lDs^3Z}T+Ya;&Ni@f!YgQA1J`fWyK%5;X(4!FEX-yLqx}StO zvq`UuOHP2T0^S!C>=UXTiWi?HgPSd*;fB$KaJ9bkRLETcolYqut+(&mx3K>6{O>(6 z(xBB&wIz3z1iCvgYY78VLd(Bg2Z+2ir8OlLRQf6^D$l010h^$|1oUdv`+2I5dGy!v zw0Uo7b($(eu6+&YXc+P65lgLzaR@ILFc;IX>f_gL+Az^7-f8e=hu$F%q3A7}estPl zClWei9YrA0N6X`Y}!prk%Okx6*BdR;WvleVA97X%R&DC&^KGs4G%(E9BPQ3WVdbTMFDE;wHAn3hB92y`<(J4RpFY&niX{j{c{56Ajx2`3ml z3fQ;c>p4Jo)B2IDr>0~gI!SKW&s+)ExP68iybs8Cn>KJ{GmNBl7`%LMaDv`qk|)q8 zHxsyH^j%19*lhfyv{Tm^M^|oc=wK(aO{nJfg)QB^NrbM+Cg#s=d3U|a7w%$7!w0WjnU;tsxcgfeU z!?dyx7KV9G__}WK*;7dg`FeRQjqo#4cN+G;pa+uVW{6GJVKT>Y@9r}s&UvEy?;{8Q z&z$ienRm*$b0Z@-4u%F5>Am6&pQ(Y?1u=tp?;Tih9fz8ispN9RXD5#@M; zUofRC52d6oL`9K%EKJWmrz2O^$de5Sa+{ki%nln=5G-1gS{}57_x38x_&7y$jFZ## zx)WV0t*op2e!iCY`o#BDyx=f6mT!;;VjCm~uFlJ6-XzA55Fs*gIpRz!<4JhY;1C}BLr<47kbpwp6LEtidvj$ud5s%uc(|KfsBujHs zu&DiuCeolf92|`Gx_Pw4UJ1D9V@qY-!+W&I#AW{29FwE2=PFt>@h#h zt83>+6l!>Rt$O|(1e@nSZo3i;tX{b|f1ug3=c{HsbI`g!Gpgm$tGA*1!O`1o2iI&x ze~V5d{Gu)+_2JOdQD)kZ&6#$XrqM%POeS3#xfef}x)b&Uawo^A)iBnHv>qa$3)#(Y zR|nLNF`uH5`Pw=Zv9=FJftcKx8M3trvP+}!MTCi;sSA~5@A^0wGD`#u@a zPY`s4>LQPxrPgNUXj3-qyEOLw<+i9bTa1v~Ku*z7&4C=f5?|kSQ)=pZSd@+)E_k?i zT4z2LVvRNH_2KEyau{9QA$#!gq;zw5EY|%xY(Y?Tu#1U(cRSU3Gql}Tr)Y!D;p>R+ zw(%-nUWEudt==&Ci0tMwJzX_LXTGT6u(Dv*>;aNd?bVmxQmIcUh_B~$Q*>zk{BFCy z%pTQYi!|7RM07$f6{4IEt}wZ~n3}pV7`B(#d)`p&b9#qEXHK?S^3&g(9w0+5GT9D{ zo{2i14x5j6bdF8;-V3=)J5(Y%&2B&sX#e?~Q^vo)NsRsGcy@L+4^NhF5{B*of!({N zr1aDBlG4(W&u9R;Zx5Bg*H2tkDNxI_=3$*$U6)m$%_z_Y_}WHCZGMPxqc+5MF~Ead zK!>mIj*LSIZ(1DGV+O=DsDIvc4_o5X4y&biF6F@NB*$Env3I157c78za&+`6tm$S$ ze7FT2*N~7?+Y>w32|7|a0vn=R8TE4rzCm92=1_5cNsWYotuwTg^)7#}SqeWW=VL&W z&F(X5U%YriMdV_JR;AL`W#y~TvkAJeX|ru=?%Td#qwm~S^`r3rdWmkw(A_ZEroDXB-mrlx2GAF?s==(t${^?w zUiWO9p;$Nv7+M5$C|z)MitbC$BcpUVD^JsFOHju4S{?LWD!ggyMk3}wPEN{}u3wi8 zkUd1N|8nb6fB#&6Z@)!7hCdi0E?dJqLVU;gxrsU|WE*0l z%F)~gbllSvYF?;4p6^DdPo+Iefy}C|^Ia#!LicZx|=kx;>#>W*m5$35-OP}~2($)sWSM+5L zV}#I2OF4kVH+~tA(W`!DFJ@7pL)Lh~OgZ6=68MPisZB)3;w5VTVLA2y%=mIR^!oVN za9o=7%<|Go>#b`m-M`^#21YutbVv5&T}nwX)w)%$9r>>m^wyho>i54Tc5$@-0|-^qv5389|oe03Z9LVZLDo@$A6KChyh0HFb zH|ekA^*^-Xq<(=~-FL`Hb?zd+to(?BY9G`5mrZ$+6K9vnVpwKiz>6mbx@hn2sV$OM zx`58#I~W^2XUVr*-@~%AlU^LLIT;BlEKM=)I%iqUKdFR$1L*kb*CV^R%J|T279Vra znbN;OkGa_B0*5r+_(=H?N}9)@vyFLnOlern>=agSth1P*!@GE9=pzJ1!2Y8(j?VDtI3JWOqCdKV*>@q}he~y2-0s-K{cKKo9a*x=?b8&f7b>u^^`# z%sPvuKfgeogGi~_NSvZWKRhb=lQR0m(e&}y`hKv*ItTLp1ie~L)Q%>VE6@SmrS>9S zop8E9eaLtW=m4kEnA=l$nS}C3RVZb_Q zLr^-sTY=1-lhBT_YrJoOi%O^Huy^;Q?o>K=1xUtEJY7?Lw5zbeUY7t>e@cVp)&9rjhRZL@fiLU zrln!fK{?De4Re>ji@tQZr)STlo*U5|+k?w_7{SVxy8+FklYbz`r^BqH6dUm7(J8rS zCC8(KT(EbX@d`PmvtZT@qCVohi>Ld*B$kaXduBN)RY5fS4+&j-@}B`Z#sT6_jg1|5 zQ#-m;e1nd%<0_h=PNX#j&POZG76Kd8g+`pxtWE^ zON@Zd>}y5+D#o}g10)b5_$AIpgIp6BNR=*F+*~lm}B~8kn%Sz?&C8hFo&_{(Bb_!y|k|xpJD$#tM6v`FKZc zQ~INxPFy{1I_G(iQ*?DcnQ5hw1GXa-K4flvSxOT1azhW<|(3Ixh;XVH5*TL2eCp0E53{WhKEG`gQ5;{d6>n1~Y%ma5 ze%K}aNC~DK+Vp_bAjJX&l~pX!HM@JUkSiCE6(PF9szj`{VmUYnXKNuyYDA-?mnbI= zsh~ZyRfU{fDpf5|C4zE^Q2q(TcV>4o9$LVOR9;-yQ7`@Y`{vD?H?#AWj`#f-Tvb8Q zUxWKlaGD_9;s-W;cL!JpYxaX9{H|njNAxrP{08)3)lS)azB%(9Qkr}U?AFTRqbo-b zTZUFDhsq_bTvp4Lx;{EpLvo`M^rK}B=xpIG%i}ZL;Rk1KDR4;S-xqIb96ccCbGjfp zVqD)Z!Ce(JzK^vBkLS;AqgJx}6XJ(3+PUn0kpH{vllyxveEH@X`^Y5bH zJ^uSU3>{aL@axuK2%L&cu2tNv0bO7hWcOYE(F<#j|L_L}`pfU;&!0?zdu64RR?CK= zOP65uu<`3BHspiAXcZJDAca~fGrg@ zXaUNypPzhv!T|cGVXbP_jO{5Sw?W=(En_)N(2?B$eXCq1IZZ<^LUX_)o>TO(4;^ez zlZuqxP(hyLE{ivC?6?#-Q@L5-8-bNImmP%IEA*pTR~CjEX8 z>A)_?&e&qn8IoWk7-CsWpnHEm4E)p9JqzF|z|j9S{59x_T{BPGjLSp#~jHQiDq zsGg;YW;(C;L2N8*xG7Ur(2`b z8bu!(CFsatG1p-T$UZs|9U086-xhmRX~Aq@w%2m8^k#3-ZFF_ndLtHP`GtGq!0v zF(NuA?-t2{4)Wg*ku4V(*eCs~(j&iZ!r?(axGLfd-NZEC>G{!N$R4mC5ZNI+Vej5I zn}=C>ihe7XZ|1j>Eu(4}O4({!B`sA-!_$vinp{q`q;;za^stn1OfTsG&iSKXRNxrc%gd^^9xB5b@^qq~|8u$i?VRV;s)e zf3rCiOXGobOKn<)Va2d;l?Zwhi&p#<);vsZwwX=Nn-#}|`{(8h+MJ%4vvZD?gEOtE0_g@+bTz-JE3tKTXm%mBT z^LK7yBdUL~7w|#fgS3hXN=v3Unl-gnBF?@MADXTjHBuFI^^8Owlkn`cr-xk~GHVT6 z#mn>-^h(q-l*t_jANT-SAV8EK@>Q9n2(Ueq}&dkrOkQyCnK;ggPO| z!yt^^*Ig{wK!&^Lanorve**{f19reCeD?G>rPnliRX8yXIZHf5&~vKoNYWQ(*fz-* z;M!rwjoWTUpPSd?b=&sliR6qt&>W%*1D%m$NS>BNOZ>WuaL+ZDw=a%ugIoqxhoO$i zPT7Ip&JOh1>l3g~w^?jVcxVAZ8$PIk`gn^Ic*!H^URYH!r*tQ3yJ=+Z`dpMqp7Gq=oE`nlZHw)q z<}8`Pyv9Ty7BW^A+L-Fd;#SWMUWE3$YX$SzC9eC9%Tsndasz)S=<92=XoJ-|7oJLw z{ubjnFh|C`N(Vmp@h9Zzu?)~L%jvq8Fy|4~qlIEtuefH^p6h8iEpuL&)dX@RGsN9F z`N);~?C60q#6BxMSIPP{#5UbJp5PceOX}Lf{8tqHgB#sJ!AgJ^y4)AOy<2b!$cE8t%=oOIDMpsA~@74TSHqZwM`NJLD9VqXm`O76C)V;u~ zRZEY*_`}3`kgxeg8yII7;h9nLG|;s=vi7XrsO$6fLN-&V7xe|#?6KXt9?95quH7GD z)A{Y2ocy^Uxcj0H_yc`-JoMifd%DEn8K5(EA=JU=ucIf&ylJtPPZ13ae}EbQrV zV26r&v4U421KtMG8GFGj7VWNxQ_yGk`{d-P)Sm!n`72G`LEb*lp9=jK8G`zrYrqR+?Y^hyzW7cvbqA4f-Sr5ueUzLvaeN$c zN4~mq=gtS4q#5s%SFUt3c+fwz)XZ9+$XWABkh2YCQFBE14o3Rk8(kf|4|{N)uJ1bFF9hp%-l;Rvb+;eJ;5k1mnn*vn zRR5`tmENP7u0(G#8I97WR;;HNeh)bt=Pb5U&1rCd;(_ZHiyEwno#Y`YP z=)oSiJ!{S?@Z$sdh<6zNiBL0eLe3l2ve3@Qxsb|0^hxP~+r$6B&T?ARtbF0Q@`N77 z;R&Z;nSQP}xQPjUTE$82e&nx658Oi1fxoe{+C1BsAngAEz5qf00MAd3Cq<=4x Z{{;$xH 0 && tarr[rule] != nil && !override { - return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} - } - - } else { - tarr = make([]*transText, 7, 7) - t.cardinalTanslations[key] = tarr - } - - trans := &transText{ - text: text, - indexes: make([]int, 2, 2), - } - - tarr[rule] = trans - - idx := strings.Index(text, paramZero) - if idx == -1 { - tarr[rule] = nil - return &ErrCardinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddCardinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} - } - - trans.indexes[0] = idx - trans.indexes[1] = idx + len(paramZero) - - return nil -} - -// AddOrdinal adds an ordinal plural translation for a particular language/locale -// {0} is the only replacement type accepted and only one variable is accepted as -// multiple cannot be used for a plural rule determination, unless it is a range; -// see AddRange below. -// eg. in locale 'en' one: '{0}st day of spring' other: '{0}nd day of spring' - 1st, 2nd, 3rd... -func (t *translator) AddOrdinal(key interface{}, text string, rule locales.PluralRule, override bool) error { - - var verified bool - - // verify plural rule exists for locale - for _, pr := range t.PluralsOrdinal() { - if pr == rule { - verified = true - break - } - } - - if !verified { - return &ErrOrdinalTranslation{text: fmt.Sprintf("error: ordinal plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} - } - - tarr, ok := t.ordinalTanslations[key] - if ok { - // verify not adding a conflicting record - if len(tarr) > 0 && tarr[rule] != nil && !override { - return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} - } - - } else { - tarr = make([]*transText, 7, 7) - t.ordinalTanslations[key] = tarr - } - - trans := &transText{ - text: text, - indexes: make([]int, 2, 2), - } - - tarr[rule] = trans - - idx := strings.Index(text, paramZero) - if idx == -1 { - tarr[rule] = nil - return &ErrOrdinalTranslation{text: fmt.Sprintf("error: parameter '%s' not found, may want to use 'Add' instead of 'AddOrdinal'. locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} - } - - trans.indexes[0] = idx - trans.indexes[1] = idx + len(paramZero) - - return nil -} - -// AddRange adds a range plural translation for a particular language/locale -// {0} and {1} are the only replacement types accepted and only these are accepted. -// eg. in locale 'nl' one: '{0}-{1} day left' other: '{0}-{1} days left' -func (t *translator) AddRange(key interface{}, text string, rule locales.PluralRule, override bool) error { - - var verified bool - - // verify plural rule exists for locale - for _, pr := range t.PluralsRange() { - if pr == rule { - verified = true - break - } - } - - if !verified { - return &ErrRangeTranslation{text: fmt.Sprintf("error: range plural rule '%s' does not exist for locale '%s' key: '%v' text: '%s'", rule, t.Locale(), key, text)} - } - - tarr, ok := t.rangeTanslations[key] - if ok { - // verify not adding a conflicting record - if len(tarr) > 0 && tarr[rule] != nil && !override { - return &ErrConflictingTranslation{locale: t.Locale(), key: key, rule: rule, text: text} - } - - } else { - tarr = make([]*transText, 7, 7) - t.rangeTanslations[key] = tarr - } - - trans := &transText{ - text: text, - indexes: make([]int, 4, 4), - } - - tarr[rule] = trans - - idx := strings.Index(text, paramZero) - if idx == -1 { - tarr[rule] = nil - return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, are you sure you're adding a Range Translation? locale: '%s' key: '%v' text: '%s'", paramZero, t.Locale(), key, text)} - } - - trans.indexes[0] = idx - trans.indexes[1] = idx + len(paramZero) - - idx = strings.Index(text, paramOne) - if idx == -1 { - tarr[rule] = nil - return &ErrRangeTranslation{text: fmt.Sprintf("error: parameter '%s' not found, a Range Translation requires two parameters. locale: '%s' key: '%v' text: '%s'", paramOne, t.Locale(), key, text)} - } - - trans.indexes[2] = idx - trans.indexes[3] = idx + len(paramOne) - - return nil -} - -// T creates the translation for the locale given the 'key' and params passed in -func (t *translator) T(key interface{}, params ...string) (string, error) { - - trans, ok := t.translations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - b := make([]byte, 0, 64) - - var start, end, count int - - for i := 0; i < len(trans.indexes); i++ { - end = trans.indexes[i] - b = append(b, trans.text[start:end]...) - b = append(b, params[count]...) - i++ - start = trans.indexes[i] - count++ - } - - b = append(b, trans.text[start:]...) - - return string(b), nil -} - -// C creates the cardinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in -func (t *translator) C(key interface{}, num float64, digits uint64, param string) (string, error) { - - tarr, ok := t.cardinalTanslations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - rule := t.CardinalPluralRule(num, digits) - - trans := tarr[rule] - - b := make([]byte, 0, 64) - b = append(b, trans.text[:trans.indexes[0]]...) - b = append(b, param...) - b = append(b, trans.text[trans.indexes[1]:]...) - - return string(b), nil -} - -// O creates the ordinal translation for the locale given the 'key', 'num' and 'digit' arguments and param passed in -func (t *translator) O(key interface{}, num float64, digits uint64, param string) (string, error) { - - tarr, ok := t.ordinalTanslations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - rule := t.OrdinalPluralRule(num, digits) - - trans := tarr[rule] - - b := make([]byte, 0, 64) - b = append(b, trans.text[:trans.indexes[0]]...) - b = append(b, param...) - b = append(b, trans.text[trans.indexes[1]:]...) - - return string(b), nil -} - -// R creates the range translation for the locale given the 'key', 'num1', 'digit1', 'num2' and 'digit2' arguments -// and 'param1' and 'param2' passed in -func (t *translator) R(key interface{}, num1 float64, digits1 uint64, num2 float64, digits2 uint64, param1, param2 string) (string, error) { - - tarr, ok := t.rangeTanslations[key] - if !ok { - return unknownTranslation, ErrUnknowTranslation - } - - rule := t.RangePluralRule(num1, digits1, num2, digits2) - - trans := tarr[rule] - - b := make([]byte, 0, 64) - b = append(b, trans.text[:trans.indexes[0]]...) - b = append(b, param1...) - b = append(b, trans.text[trans.indexes[1]:trans.indexes[2]]...) - b = append(b, param2...) - b = append(b, trans.text[trans.indexes[3]:]...) - - return string(b), nil -} - -// VerifyTranslations checks to ensures that no plural rules have been -// missed within the translations. -func (t *translator) VerifyTranslations() error { - - for k, v := range t.cardinalTanslations { - - for _, rule := range t.PluralsCardinal() { - - if v[rule] == nil { - return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "plural", rule: rule, key: k} - } - } - } - - for k, v := range t.ordinalTanslations { - - for _, rule := range t.PluralsOrdinal() { - - if v[rule] == nil { - return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "ordinal", rule: rule, key: k} - } - } - } - - for k, v := range t.rangeTanslations { - - for _, rule := range t.PluralsRange() { - - if v[rule] == nil { - return &ErrMissingPluralTranslation{locale: t.Locale(), translationType: "range", rule: rule, key: k} - } - } - } - - return nil -} diff --git a/vendor/github.com/go-playground/universal-translator/universal_translator.go b/vendor/github.com/go-playground/universal-translator/universal_translator.go deleted file mode 100644 index dbf707f5..00000000 --- a/vendor/github.com/go-playground/universal-translator/universal_translator.go +++ /dev/null @@ -1,113 +0,0 @@ -package ut - -import ( - "strings" - - "github.com/go-playground/locales" -) - -// UniversalTranslator holds all locale & translation data -type UniversalTranslator struct { - translators map[string]Translator - fallback Translator -} - -// New returns a new UniversalTranslator instance set with -// the fallback locale and locales it should support -func New(fallback locales.Translator, supportedLocales ...locales.Translator) *UniversalTranslator { - - t := &UniversalTranslator{ - translators: make(map[string]Translator), - } - - for _, v := range supportedLocales { - - trans := newTranslator(v) - t.translators[strings.ToLower(trans.Locale())] = trans - - if fallback.Locale() == v.Locale() { - t.fallback = trans - } - } - - if t.fallback == nil && fallback != nil { - t.fallback = newTranslator(fallback) - } - - return t -} - -// FindTranslator trys to find a Translator based on an array of locales -// and returns the first one it can find, otherwise returns the -// fallback translator. -func (t *UniversalTranslator) FindTranslator(locales ...string) (trans Translator, found bool) { - - for _, locale := range locales { - - if trans, found = t.translators[strings.ToLower(locale)]; found { - return - } - } - - return t.fallback, false -} - -// GetTranslator returns the specified translator for the given locale, -// or fallback if not found -func (t *UniversalTranslator) GetTranslator(locale string) (trans Translator, found bool) { - - if trans, found = t.translators[strings.ToLower(locale)]; found { - return - } - - return t.fallback, false -} - -// GetFallback returns the fallback locale -func (t *UniversalTranslator) GetFallback() Translator { - return t.fallback -} - -// AddTranslator adds the supplied translator, if it already exists the override param -// will be checked and if false an error will be returned, otherwise the translator will be -// overridden; if the fallback matches the supplied translator it will be overridden as well -// NOTE: this is normally only used when translator is embedded within a library -func (t *UniversalTranslator) AddTranslator(translator locales.Translator, override bool) error { - - lc := strings.ToLower(translator.Locale()) - _, ok := t.translators[lc] - if ok && !override { - return &ErrExistingTranslator{locale: translator.Locale()} - } - - trans := newTranslator(translator) - - if t.fallback.Locale() == translator.Locale() { - - // because it's optional to have a fallback, I don't impose that limitation - // don't know why you wouldn't but... - if !override { - return &ErrExistingTranslator{locale: translator.Locale()} - } - - t.fallback = trans - } - - t.translators[lc] = trans - - return nil -} - -// VerifyTranslations runs through all locales and identifies any issues -// eg. missing plural rules for a locale -func (t *UniversalTranslator) VerifyTranslations() (err error) { - - for _, trans := range t.translators { - err = trans.VerifyTranslations() - if err != nil { - return - } - } - - return -} diff --git a/vendor/github.com/go-playground/validator/v10/.gitignore b/vendor/github.com/go-playground/validator/v10/.gitignore deleted file mode 100644 index 792ca00d..00000000 --- a/vendor/github.com/go-playground/validator/v10/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -*.test -*.out -*.txt -cover.html -README.html \ No newline at end of file diff --git a/vendor/github.com/go-playground/validator/v10/.travis.yml b/vendor/github.com/go-playground/validator/v10/.travis.yml deleted file mode 100644 index b88bb9fc..00000000 --- a/vendor/github.com/go-playground/validator/v10/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: go -go: - - 1.13.4 - - tip -matrix: - allow_failures: - - go: tip - -notifications: - email: - recipients: dean.karn@gmail.com - on_success: change - on_failure: always - -before_install: - - go install github.com/mattn/goveralls - - mkdir -p $GOPATH/src/gopkg.in - - ln -s $GOPATH/src/github.com/$TRAVIS_REPO_SLUG $GOPATH/src/gopkg.in/validator.v9 - -# Only clone the most recent commit. -git: - depth: 1 - -script: - - go test -v -race -covermode=atomic -coverprofile=coverage.coverprofile ./... - -after_success: | - [ $TRAVIS_GO_VERSION = 1.13.4 ] && - goveralls -coverprofile=coverage.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file diff --git a/vendor/github.com/go-playground/validator/v10/LICENSE b/vendor/github.com/go-playground/validator/v10/LICENSE deleted file mode 100644 index 6a2ae9aa..00000000 --- a/vendor/github.com/go-playground/validator/v10/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Dean Karn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/github.com/go-playground/validator/v10/Makefile b/vendor/github.com/go-playground/validator/v10/Makefile deleted file mode 100644 index 19c91ed7..00000000 --- a/vendor/github.com/go-playground/validator/v10/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -GOCMD=GO111MODULE=on go - -linters-install: - @golangci-lint --version >/dev/null 2>&1 || { \ - echo "installing linting tools..."; \ - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s v1.21.0; \ - } - -lint: linters-install - $(PWD)/bin/golangci-lint run - -test: - $(GOCMD) test -cover -race ./... - -bench: - $(GOCMD) test -bench=. -benchmem ./... - -.PHONY: test lint linters-install \ No newline at end of file diff --git a/vendor/github.com/go-playground/validator/v10/README.md b/vendor/github.com/go-playground/validator/v10/README.md deleted file mode 100644 index daf28f1d..00000000 --- a/vendor/github.com/go-playground/validator/v10/README.md +++ /dev/null @@ -1,153 +0,0 @@ -Package validator -================ -[![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![Project status](https://img.shields.io/badge/version-10.1.0-green.svg) -[![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator) -[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) -[![GoDoc](https://godoc.org/github.com/go-playground/validator?status.svg)](https://godoc.org/github.com/go-playground/validator) -![License](https://img.shields.io/dub/l/vibe-d.svg) - -Package validator implements value validations for structs and individual fields based on tags. - -It has the following **unique** features: - -- Cross Field and Cross Struct validations by using validation tags or custom validators. -- Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated. -- Ability to dive into both map keys and values for validation -- Handles type interface by determining it's underlying type prior to validation. -- Handles custom field types such as sql driver Valuer see [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29) -- Alias validation tags, which allows for mapping of several validations to a single tag for easier defining of validations on structs -- Extraction of custom defined Field Name e.g. can specify to extract the JSON name while validating and have it available in the resulting FieldError -- Customizable i18n aware error messages. -- Default validator for the [gin](https://github.com/gin-gonic/gin) web framework; upgrading from v8 to v9 in gin see [here](https://github.com/go-playground/validator/tree/master/_examples/gin-upgrading-overriding) - -Installation ------------- - -Use go get. - - go get github.com/go-playground/validator/v10 - -Then import the validator package into your own code. - - import "github.com/go-playground/validator/v10" - -Error Return Value -------- - -Validation functions return type error - -They return type error to avoid the issue discussed in the following, where err is always != nil: - -* http://stackoverflow.com/a/29138676/3158232 -* https://github.com/go-playground/validator/issues/134 - -Validator only InvalidValidationError for bad validation input, nil or ValidationErrors as type error; so, in your code all you need to do is check if the error returned is not nil, and if it's not check if error is InvalidValidationError ( if necessary, most of the time it isn't ) type cast it to type ValidationErrors like so: - -```go -err := validate.Struct(mystruct) -validationErrors := err.(validator.ValidationErrors) - ``` - -Usage and documentation ------- - -Please see https://godoc.org/github.com/go-playground/validator for detailed usage docs. - -##### Examples: - -- [Simple](https://github.com/go-playground/validator/blob/master/_examples/simple/main.go) -- [Custom Field Types](https://github.com/go-playground/validator/blob/master/_examples/custom/main.go) -- [Struct Level](https://github.com/go-playground/validator/blob/master/_examples/struct-level/main.go) -- [Translations & Custom Errors](https://github.com/go-playground/validator/blob/master/_examples/translations/main.go) -- [Gin upgrade and/or override validator](https://github.com/go-playground/validator/tree/v9/_examples/gin-upgrading-overriding) -- [wash - an example application putting it all together](https://github.com/bluesuncorp/wash) - -Benchmarks ------- -###### Run on MacBook Pro (15-inch, 2017) go version go1.10.2 darwin/amd64 -```go -goos: darwin -goarch: amd64 -pkg: github.com/go-playground/validator -BenchmarkFieldSuccess-8 20000000 83.6 ns/op 0 B/op 0 allocs/op -BenchmarkFieldSuccessParallel-8 50000000 26.8 ns/op 0 B/op 0 allocs/op -BenchmarkFieldFailure-8 5000000 291 ns/op 208 B/op 4 allocs/op -BenchmarkFieldFailureParallel-8 20000000 107 ns/op 208 B/op 4 allocs/op -BenchmarkFieldArrayDiveSuccess-8 2000000 623 ns/op 201 B/op 11 allocs/op -BenchmarkFieldArrayDiveSuccessParallel-8 10000000 237 ns/op 201 B/op 11 allocs/op -BenchmarkFieldArrayDiveFailure-8 2000000 859 ns/op 412 B/op 16 allocs/op -BenchmarkFieldArrayDiveFailureParallel-8 5000000 335 ns/op 413 B/op 16 allocs/op -BenchmarkFieldMapDiveSuccess-8 1000000 1292 ns/op 432 B/op 18 allocs/op -BenchmarkFieldMapDiveSuccessParallel-8 3000000 467 ns/op 432 B/op 18 allocs/op -BenchmarkFieldMapDiveFailure-8 1000000 1082 ns/op 512 B/op 16 allocs/op -BenchmarkFieldMapDiveFailureParallel-8 5000000 425 ns/op 512 B/op 16 allocs/op -BenchmarkFieldMapDiveWithKeysSuccess-8 1000000 1539 ns/op 480 B/op 21 allocs/op -BenchmarkFieldMapDiveWithKeysSuccessParallel-8 3000000 613 ns/op 480 B/op 21 allocs/op -BenchmarkFieldMapDiveWithKeysFailure-8 1000000 1413 ns/op 721 B/op 21 allocs/op -BenchmarkFieldMapDiveWithKeysFailureParallel-8 3000000 575 ns/op 721 B/op 21 allocs/op -BenchmarkFieldCustomTypeSuccess-8 10000000 216 ns/op 32 B/op 2 allocs/op -BenchmarkFieldCustomTypeSuccessParallel-8 20000000 82.2 ns/op 32 B/op 2 allocs/op -BenchmarkFieldCustomTypeFailure-8 5000000 274 ns/op 208 B/op 4 allocs/op -BenchmarkFieldCustomTypeFailureParallel-8 20000000 116 ns/op 208 B/op 4 allocs/op -BenchmarkFieldOrTagSuccess-8 2000000 740 ns/op 16 B/op 1 allocs/op -BenchmarkFieldOrTagSuccessParallel-8 3000000 474 ns/op 16 B/op 1 allocs/op -BenchmarkFieldOrTagFailure-8 3000000 471 ns/op 224 B/op 5 allocs/op -BenchmarkFieldOrTagFailureParallel-8 3000000 414 ns/op 224 B/op 5 allocs/op -BenchmarkStructLevelValidationSuccess-8 10000000 213 ns/op 32 B/op 2 allocs/op -BenchmarkStructLevelValidationSuccessParallel-8 20000000 91.8 ns/op 32 B/op 2 allocs/op -BenchmarkStructLevelValidationFailure-8 3000000 473 ns/op 304 B/op 8 allocs/op -BenchmarkStructLevelValidationFailureParallel-8 10000000 234 ns/op 304 B/op 8 allocs/op -BenchmarkStructSimpleCustomTypeSuccess-8 5000000 385 ns/op 32 B/op 2 allocs/op -BenchmarkStructSimpleCustomTypeSuccessParallel-8 10000000 161 ns/op 32 B/op 2 allocs/op -BenchmarkStructSimpleCustomTypeFailure-8 2000000 640 ns/op 424 B/op 9 allocs/op -BenchmarkStructSimpleCustomTypeFailureParallel-8 5000000 318 ns/op 440 B/op 10 allocs/op -BenchmarkStructFilteredSuccess-8 2000000 597 ns/op 288 B/op 9 allocs/op -BenchmarkStructFilteredSuccessParallel-8 10000000 266 ns/op 288 B/op 9 allocs/op -BenchmarkStructFilteredFailure-8 3000000 454 ns/op 256 B/op 7 allocs/op -BenchmarkStructFilteredFailureParallel-8 10000000 214 ns/op 256 B/op 7 allocs/op -BenchmarkStructPartialSuccess-8 3000000 502 ns/op 256 B/op 6 allocs/op -BenchmarkStructPartialSuccessParallel-8 10000000 225 ns/op 256 B/op 6 allocs/op -BenchmarkStructPartialFailure-8 2000000 702 ns/op 480 B/op 11 allocs/op -BenchmarkStructPartialFailureParallel-8 5000000 329 ns/op 480 B/op 11 allocs/op -BenchmarkStructExceptSuccess-8 2000000 793 ns/op 496 B/op 12 allocs/op -BenchmarkStructExceptSuccessParallel-8 10000000 193 ns/op 240 B/op 5 allocs/op -BenchmarkStructExceptFailure-8 2000000 639 ns/op 464 B/op 10 allocs/op -BenchmarkStructExceptFailureParallel-8 5000000 300 ns/op 464 B/op 10 allocs/op -BenchmarkStructSimpleCrossFieldSuccess-8 3000000 417 ns/op 72 B/op 3 allocs/op -BenchmarkStructSimpleCrossFieldSuccessParallel-8 10000000 163 ns/op 72 B/op 3 allocs/op -BenchmarkStructSimpleCrossFieldFailure-8 2000000 645 ns/op 304 B/op 8 allocs/op -BenchmarkStructSimpleCrossFieldFailureParallel-8 5000000 285 ns/op 304 B/op 8 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 3000000 588 ns/op 80 B/op 4 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel-8 10000000 221 ns/op 80 B/op 4 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldFailure-8 2000000 868 ns/op 320 B/op 9 allocs/op -BenchmarkStructSimpleCrossStructCrossFieldFailureParallel-8 5000000 337 ns/op 320 B/op 9 allocs/op -BenchmarkStructSimpleSuccess-8 5000000 260 ns/op 0 B/op 0 allocs/op -BenchmarkStructSimpleSuccessParallel-8 20000000 90.6 ns/op 0 B/op 0 allocs/op -BenchmarkStructSimpleFailure-8 2000000 619 ns/op 424 B/op 9 allocs/op -BenchmarkStructSimpleFailureParallel-8 5000000 296 ns/op 424 B/op 9 allocs/op -BenchmarkStructComplexSuccess-8 1000000 1454 ns/op 128 B/op 8 allocs/op -BenchmarkStructComplexSuccessParallel-8 3000000 579 ns/op 128 B/op 8 allocs/op -BenchmarkStructComplexFailure-8 300000 4140 ns/op 3041 B/op 53 allocs/op -BenchmarkStructComplexFailureParallel-8 1000000 2127 ns/op 3041 B/op 53 allocs/op -BenchmarkOneof-8 10000000 140 ns/op 0 B/op 0 allocs/op -BenchmarkOneofParallel-8 20000000 70.1 ns/op 0 B/op 0 allocs/op -``` - -Complementary Software ----------------------- - -Here is a list of software that complements using this library either pre or post validation. - -* [form](https://github.com/go-playground/form) - Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. Dual Array and Full map support. -* [mold](https://github.com/go-playground/mold) - A general library to help modify or set data within data structures and other objects - -How to Contribute ------- - -Make a pull request... - -License ------- -Distributed under MIT License, please see license file within the code for more details. diff --git a/vendor/github.com/go-playground/validator/v10/baked_in.go b/vendor/github.com/go-playground/validator/v10/baked_in.go deleted file mode 100644 index 4124c621..00000000 --- a/vendor/github.com/go-playground/validator/v10/baked_in.go +++ /dev/null @@ -1,2091 +0,0 @@ -package validator - -import ( - "bytes" - "context" - "crypto/sha256" - "encoding/json" - "fmt" - "net" - "net/url" - "os" - "reflect" - "strconv" - "strings" - "sync" - "time" - "unicode/utf8" - - urn "github.com/leodido/go-urn" -) - -// Func accepts a FieldLevel interface for all validation needs. The return -// value should be true when validation succeeds. -type Func func(fl FieldLevel) bool - -// FuncCtx accepts a context.Context and FieldLevel interface for all -// validation needs. The return value should be true when validation succeeds. -type FuncCtx func(ctx context.Context, fl FieldLevel) bool - -// wrapFunc wraps noramal Func makes it compatible with FuncCtx -func wrapFunc(fn Func) FuncCtx { - if fn == nil { - return nil // be sure not to wrap a bad function. - } - return func(ctx context.Context, fl FieldLevel) bool { - return fn(fl) - } -} - -var ( - restrictedTags = map[string]struct{}{ - diveTag: {}, - keysTag: {}, - endKeysTag: {}, - structOnlyTag: {}, - omitempty: {}, - skipValidationTag: {}, - utf8HexComma: {}, - utf8Pipe: {}, - noStructLevelTag: {}, - requiredTag: {}, - isdefault: {}, - } - - // BakedInAliasValidators is a default mapping of a single validation tag that - // defines a common or complex set of validation(s) to simplify - // adding validation to structs. - bakedInAliases = map[string]string{ - "iscolor": "hexcolor|rgb|rgba|hsl|hsla", - } - - // BakedInValidators is the default map of ValidationFunc - // you can add, remove or even replace items to suite your needs, - // or even disregard and use your own map if so desired. - bakedInValidators = map[string]Func{ - "required": hasValue, - "required_with": requiredWith, - "required_with_all": requiredWithAll, - "required_without": requiredWithout, - "required_without_all": requiredWithoutAll, - "isdefault": isDefault, - "len": hasLengthOf, - "min": hasMinOf, - "max": hasMaxOf, - "eq": isEq, - "ne": isNe, - "lt": isLt, - "lte": isLte, - "gt": isGt, - "gte": isGte, - "eqfield": isEqField, - "eqcsfield": isEqCrossStructField, - "necsfield": isNeCrossStructField, - "gtcsfield": isGtCrossStructField, - "gtecsfield": isGteCrossStructField, - "ltcsfield": isLtCrossStructField, - "ltecsfield": isLteCrossStructField, - "nefield": isNeField, - "gtefield": isGteField, - "gtfield": isGtField, - "ltefield": isLteField, - "ltfield": isLtField, - "fieldcontains": fieldContains, - "fieldexcludes": fieldExcludes, - "alpha": isAlpha, - "alphanum": isAlphanum, - "alphaunicode": isAlphaUnicode, - "alphanumunicode": isAlphanumUnicode, - "numeric": isNumeric, - "number": isNumber, - "hexadecimal": isHexadecimal, - "hexcolor": isHEXColor, - "rgb": isRGB, - "rgba": isRGBA, - "hsl": isHSL, - "hsla": isHSLA, - "e164": isE164, - "email": isEmail, - "url": isURL, - "uri": isURI, - "urn_rfc2141": isUrnRFC2141, // RFC 2141 - "file": isFile, - "base64": isBase64, - "base64url": isBase64URL, - "contains": contains, - "containsany": containsAny, - "containsrune": containsRune, - "excludes": excludes, - "excludesall": excludesAll, - "excludesrune": excludesRune, - "startswith": startsWith, - "endswith": endsWith, - "isbn": isISBN, - "isbn10": isISBN10, - "isbn13": isISBN13, - "eth_addr": isEthereumAddress, - "btc_addr": isBitcoinAddress, - "btc_addr_bech32": isBitcoinBech32Address, - "uuid": isUUID, - "uuid3": isUUID3, - "uuid4": isUUID4, - "uuid5": isUUID5, - "uuid_rfc4122": isUUIDRFC4122, - "uuid3_rfc4122": isUUID3RFC4122, - "uuid4_rfc4122": isUUID4RFC4122, - "uuid5_rfc4122": isUUID5RFC4122, - "ascii": isASCII, - "printascii": isPrintableASCII, - "multibyte": hasMultiByteCharacter, - "datauri": isDataURI, - "latitude": isLatitude, - "longitude": isLongitude, - "ssn": isSSN, - "ipv4": isIPv4, - "ipv6": isIPv6, - "ip": isIP, - "cidrv4": isCIDRv4, - "cidrv6": isCIDRv6, - "cidr": isCIDR, - "tcp4_addr": isTCP4AddrResolvable, - "tcp6_addr": isTCP6AddrResolvable, - "tcp_addr": isTCPAddrResolvable, - "udp4_addr": isUDP4AddrResolvable, - "udp6_addr": isUDP6AddrResolvable, - "udp_addr": isUDPAddrResolvable, - "ip4_addr": isIP4AddrResolvable, - "ip6_addr": isIP6AddrResolvable, - "ip_addr": isIPAddrResolvable, - "unix_addr": isUnixAddrResolvable, - "mac": isMAC, - "hostname": isHostnameRFC952, // RFC 952 - "hostname_rfc1123": isHostnameRFC1123, // RFC 1123 - "fqdn": isFQDN, - "unique": isUnique, - "oneof": isOneOf, - "html": isHTML, - "html_encoded": isHTMLEncoded, - "url_encoded": isURLEncoded, - "dir": isDir, - "json": isJSON, - "hostname_port": isHostnamePort, - "lowercase": isLowercase, - "uppercase": isUppercase, - "datetime": isDatetime, - } -) - -var oneofValsCache = map[string][]string{} -var oneofValsCacheRWLock = sync.RWMutex{} - -func parseOneOfParam2(s string) []string { - oneofValsCacheRWLock.RLock() - vals, ok := oneofValsCache[s] - oneofValsCacheRWLock.RUnlock() - if !ok { - oneofValsCacheRWLock.Lock() - vals = splitParamsRegex.FindAllString(s, -1) - for i := 0; i < len(vals); i++ { - vals[i] = strings.Replace(vals[i], "'", "", -1) - } - oneofValsCache[s] = vals - oneofValsCacheRWLock.Unlock() - } - return vals -} - -func isURLEncoded(fl FieldLevel) bool { - return uRLEncodedRegex.MatchString(fl.Field().String()) -} - -func isHTMLEncoded(fl FieldLevel) bool { - return hTMLEncodedRegex.MatchString(fl.Field().String()) -} - -func isHTML(fl FieldLevel) bool { - return hTMLRegex.MatchString(fl.Field().String()) -} - -func isOneOf(fl FieldLevel) bool { - vals := parseOneOfParam2(fl.Param()) - - field := fl.Field() - - var v string - switch field.Kind() { - case reflect.String: - v = field.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - v = strconv.FormatInt(field.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - v = strconv.FormatUint(field.Uint(), 10) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - for i := 0; i < len(vals); i++ { - if vals[i] == v { - return true - } - } - return false -} - -// isUnique is the validation function for validating if each array|slice|map value is unique -func isUnique(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - v := reflect.ValueOf(struct{}{}) - - switch field.Kind() { - case reflect.Slice, reflect.Array: - if param == "" { - m := reflect.MakeMap(reflect.MapOf(field.Type().Elem(), v.Type())) - - for i := 0; i < field.Len(); i++ { - m.SetMapIndex(field.Index(i), v) - } - return field.Len() == m.Len() - } - - sf, ok := field.Type().Elem().FieldByName(param) - if !ok { - panic(fmt.Sprintf("Bad field name %s", param)) - } - - m := reflect.MakeMap(reflect.MapOf(sf.Type, v.Type())) - for i := 0; i < field.Len(); i++ { - m.SetMapIndex(field.Index(i).FieldByName(param), v) - } - return field.Len() == m.Len() - case reflect.Map: - m := reflect.MakeMap(reflect.MapOf(field.Type().Elem(), v.Type())) - - for _, k := range field.MapKeys() { - m.SetMapIndex(field.MapIndex(k), v) - } - return field.Len() == m.Len() - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } -} - -// IsMAC is the validation function for validating if the field's value is a valid MAC address. -func isMAC(fl FieldLevel) bool { - - _, err := net.ParseMAC(fl.Field().String()) - - return err == nil -} - -// IsCIDRv4 is the validation function for validating if the field's value is a valid v4 CIDR address. -func isCIDRv4(fl FieldLevel) bool { - - ip, _, err := net.ParseCIDR(fl.Field().String()) - - return err == nil && ip.To4() != nil -} - -// IsCIDRv6 is the validation function for validating if the field's value is a valid v6 CIDR address. -func isCIDRv6(fl FieldLevel) bool { - - ip, _, err := net.ParseCIDR(fl.Field().String()) - - return err == nil && ip.To4() == nil -} - -// IsCIDR is the validation function for validating if the field's value is a valid v4 or v6 CIDR address. -func isCIDR(fl FieldLevel) bool { - - _, _, err := net.ParseCIDR(fl.Field().String()) - - return err == nil -} - -// IsIPv4 is the validation function for validating if a value is a valid v4 IP address. -func isIPv4(fl FieldLevel) bool { - - ip := net.ParseIP(fl.Field().String()) - - return ip != nil && ip.To4() != nil -} - -// IsIPv6 is the validation function for validating if the field's value is a valid v6 IP address. -func isIPv6(fl FieldLevel) bool { - - ip := net.ParseIP(fl.Field().String()) - - return ip != nil && ip.To4() == nil -} - -// IsIP is the validation function for validating if the field's value is a valid v4 or v6 IP address. -func isIP(fl FieldLevel) bool { - - ip := net.ParseIP(fl.Field().String()) - - return ip != nil -} - -// IsSSN is the validation function for validating if the field's value is a valid SSN. -func isSSN(fl FieldLevel) bool { - - field := fl.Field() - - if field.Len() != 11 { - return false - } - - return sSNRegex.MatchString(field.String()) -} - -// IsLongitude is the validation function for validating if the field's value is a valid longitude coordinate. -func isLongitude(fl FieldLevel) bool { - field := fl.Field() - - var v string - switch field.Kind() { - case reflect.String: - v = field.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - v = strconv.FormatInt(field.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - v = strconv.FormatUint(field.Uint(), 10) - case reflect.Float32: - v = strconv.FormatFloat(field.Float(), 'f', -1, 32) - case reflect.Float64: - v = strconv.FormatFloat(field.Float(), 'f', -1, 64) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - - return longitudeRegex.MatchString(v) -} - -// IsLatitude is the validation function for validating if the field's value is a valid latitude coordinate. -func isLatitude(fl FieldLevel) bool { - field := fl.Field() - - var v string - switch field.Kind() { - case reflect.String: - v = field.String() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - v = strconv.FormatInt(field.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - v = strconv.FormatUint(field.Uint(), 10) - case reflect.Float32: - v = strconv.FormatFloat(field.Float(), 'f', -1, 32) - case reflect.Float64: - v = strconv.FormatFloat(field.Float(), 'f', -1, 64) - default: - panic(fmt.Sprintf("Bad field type %T", field.Interface())) - } - - return latitudeRegex.MatchString(v) -} - -// IsDataURI is the validation function for validating if the field's value is a valid data URI. -func isDataURI(fl FieldLevel) bool { - - uri := strings.SplitN(fl.Field().String(), ",", 2) - - if len(uri) != 2 { - return false - } - - if !dataURIRegex.MatchString(uri[0]) { - return false - } - - return base64Regex.MatchString(uri[1]) -} - -// HasMultiByteCharacter is the validation function for validating if the field's value has a multi byte character. -func hasMultiByteCharacter(fl FieldLevel) bool { - - field := fl.Field() - - if field.Len() == 0 { - return true - } - - return multibyteRegex.MatchString(field.String()) -} - -// IsPrintableASCII is the validation function for validating if the field's value is a valid printable ASCII character. -func isPrintableASCII(fl FieldLevel) bool { - return printableASCIIRegex.MatchString(fl.Field().String()) -} - -// IsASCII is the validation function for validating if the field's value is a valid ASCII character. -func isASCII(fl FieldLevel) bool { - return aSCIIRegex.MatchString(fl.Field().String()) -} - -// IsUUID5 is the validation function for validating if the field's value is a valid v5 UUID. -func isUUID5(fl FieldLevel) bool { - return uUID5Regex.MatchString(fl.Field().String()) -} - -// IsUUID4 is the validation function for validating if the field's value is a valid v4 UUID. -func isUUID4(fl FieldLevel) bool { - return uUID4Regex.MatchString(fl.Field().String()) -} - -// IsUUID3 is the validation function for validating if the field's value is a valid v3 UUID. -func isUUID3(fl FieldLevel) bool { - return uUID3Regex.MatchString(fl.Field().String()) -} - -// IsUUID is the validation function for validating if the field's value is a valid UUID of any version. -func isUUID(fl FieldLevel) bool { - return uUIDRegex.MatchString(fl.Field().String()) -} - -// IsUUID5RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v5 UUID. -func isUUID5RFC4122(fl FieldLevel) bool { - return uUID5RFC4122Regex.MatchString(fl.Field().String()) -} - -// IsUUID4RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v4 UUID. -func isUUID4RFC4122(fl FieldLevel) bool { - return uUID4RFC4122Regex.MatchString(fl.Field().String()) -} - -// IsUUID3RFC4122 is the validation function for validating if the field's value is a valid RFC4122 v3 UUID. -func isUUID3RFC4122(fl FieldLevel) bool { - return uUID3RFC4122Regex.MatchString(fl.Field().String()) -} - -// IsUUIDRFC4122 is the validation function for validating if the field's value is a valid RFC4122 UUID of any version. -func isUUIDRFC4122(fl FieldLevel) bool { - return uUIDRFC4122Regex.MatchString(fl.Field().String()) -} - -// IsISBN is the validation function for validating if the field's value is a valid v10 or v13 ISBN. -func isISBN(fl FieldLevel) bool { - return isISBN10(fl) || isISBN13(fl) -} - -// IsISBN13 is the validation function for validating if the field's value is a valid v13 ISBN. -func isISBN13(fl FieldLevel) bool { - - s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 4), " ", "", 4) - - if !iSBN13Regex.MatchString(s) { - return false - } - - var checksum int32 - var i int32 - - factor := []int32{1, 3} - - for i = 0; i < 12; i++ { - checksum += factor[i%2] * int32(s[i]-'0') - } - - return (int32(s[12]-'0'))-((10-(checksum%10))%10) == 0 -} - -// IsISBN10 is the validation function for validating if the field's value is a valid v10 ISBN. -func isISBN10(fl FieldLevel) bool { - - s := strings.Replace(strings.Replace(fl.Field().String(), "-", "", 3), " ", "", 3) - - if !iSBN10Regex.MatchString(s) { - return false - } - - var checksum int32 - var i int32 - - for i = 0; i < 9; i++ { - checksum += (i + 1) * int32(s[i]-'0') - } - - if s[9] == 'X' { - checksum += 10 * 10 - } else { - checksum += 10 * int32(s[9]-'0') - } - - return checksum%11 == 0 -} - -// IsEthereumAddress is the validation function for validating if the field's value is a valid ethereum address based currently only on the format -func isEthereumAddress(fl FieldLevel) bool { - address := fl.Field().String() - - if !ethAddressRegex.MatchString(address) { - return false - } - - if ethaddressRegexUpper.MatchString(address) || ethAddressRegexLower.MatchString(address) { - return true - } - - // checksum validation is blocked by https://github.com/golang/crypto/pull/28 - - return true -} - -// IsBitcoinAddress is the validation function for validating if the field's value is a valid btc address -func isBitcoinAddress(fl FieldLevel) bool { - address := fl.Field().String() - - if !btcAddressRegex.MatchString(address) { - return false - } - - alphabet := []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") - - decode := [25]byte{} - - for _, n := range []byte(address) { - d := bytes.IndexByte(alphabet, n) - - for i := 24; i >= 0; i-- { - d += 58 * int(decode[i]) - decode[i] = byte(d % 256) - d /= 256 - } - } - - h := sha256.New() - _, _ = h.Write(decode[:21]) - d := h.Sum([]byte{}) - h = sha256.New() - _, _ = h.Write(d) - - validchecksum := [4]byte{} - computedchecksum := [4]byte{} - - copy(computedchecksum[:], h.Sum(d[:0])) - copy(validchecksum[:], decode[21:]) - - return validchecksum == computedchecksum -} - -// IsBitcoinBech32Address is the validation function for validating if the field's value is a valid bech32 btc address -func isBitcoinBech32Address(fl FieldLevel) bool { - address := fl.Field().String() - - if !btcLowerAddressRegexBech32.MatchString(address) && !btcUpperAddressRegexBech32.MatchString(address) { - return false - } - - am := len(address) % 8 - - if am == 0 || am == 3 || am == 5 { - return false - } - - address = strings.ToLower(address) - - alphabet := "qpzry9x8gf2tvdw0s3jn54khce6mua7l" - - hr := []int{3, 3, 0, 2, 3} // the human readable part will always be bc - addr := address[3:] - dp := make([]int, 0, len(addr)) - - for _, c := range addr { - dp = append(dp, strings.IndexRune(alphabet, c)) - } - - ver := dp[0] - - if ver < 0 || ver > 16 { - return false - } - - if ver == 0 { - if len(address) != 42 && len(address) != 62 { - return false - } - } - - values := append(hr, dp...) - - GEN := []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} - - p := 1 - - for _, v := range values { - b := p >> 25 - p = (p&0x1ffffff)<<5 ^ v - - for i := 0; i < 5; i++ { - if (b>>uint(i))&1 == 1 { - p ^= GEN[i] - } - } - } - - if p != 1 { - return false - } - - b := uint(0) - acc := 0 - mv := (1 << 5) - 1 - var sw []int - - for _, v := range dp[1 : len(dp)-6] { - acc = (acc << 5) | v - b += 5 - for b >= 8 { - b -= 8 - sw = append(sw, (acc>>b)&mv) - } - } - - if len(sw) < 2 || len(sw) > 40 { - return false - } - - return true -} - -// ExcludesRune is the validation function for validating that the field's value does not contain the rune specified within the param. -func excludesRune(fl FieldLevel) bool { - return !containsRune(fl) -} - -// ExcludesAll is the validation function for validating that the field's value does not contain any of the characters specified within the param. -func excludesAll(fl FieldLevel) bool { - return !containsAny(fl) -} - -// Excludes is the validation function for validating that the field's value does not contain the text specified within the param. -func excludes(fl FieldLevel) bool { - return !contains(fl) -} - -// ContainsRune is the validation function for validating that the field's value contains the rune specified within the param. -func containsRune(fl FieldLevel) bool { - - r, _ := utf8.DecodeRuneInString(fl.Param()) - - return strings.ContainsRune(fl.Field().String(), r) -} - -// ContainsAny is the validation function for validating that the field's value contains any of the characters specified within the param. -func containsAny(fl FieldLevel) bool { - return strings.ContainsAny(fl.Field().String(), fl.Param()) -} - -// Contains is the validation function for validating that the field's value contains the text specified within the param. -func contains(fl FieldLevel) bool { - return strings.Contains(fl.Field().String(), fl.Param()) -} - -// StartsWith is the validation function for validating that the field's value starts with the text specified within the param. -func startsWith(fl FieldLevel) bool { - return strings.HasPrefix(fl.Field().String(), fl.Param()) -} - -// EndsWith is the validation function for validating that the field's value ends with the text specified within the param. -func endsWith(fl FieldLevel) bool { - return strings.HasSuffix(fl.Field().String(), fl.Param()) -} - -// FieldContains is the validation function for validating if the current field's value contains the field specified by the param's value. -func fieldContains(fl FieldLevel) bool { - field := fl.Field() - - currentField, _, ok := fl.GetStructFieldOK() - - if !ok { - return false - } - - return strings.Contains(field.String(), currentField.String()) -} - -// FieldExcludes is the validation function for validating if the current field's value excludes the field specified by the param's value. -func fieldExcludes(fl FieldLevel) bool { - field := fl.Field() - - currentField, _, ok := fl.GetStructFieldOK() - if !ok { - return true - } - - return !strings.Contains(field.String(), currentField.String()) -} - -// IsNeField is the validation function for validating if the current field's value is not equal to the field specified by the param's value. -func isNeField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - - if !ok || currentKind != kind { - return true - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() != currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() != currentField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() != currentField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) != int64(currentField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return true - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return !fieldTime.Equal(t) - } - - } - - // default reflect.String: - return field.String() != currentField.String() -} - -// IsNe is the validation function for validating that the field's value does not equal the provided param value. -func isNe(fl FieldLevel) bool { - return !isEq(fl) -} - -// IsLteCrossStructField is the validation function for validating if the current field's value is less than or equal to the field, within a separate struct, specified by the param's value. -func isLteCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() <= topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() <= topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() <= topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) <= int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.Before(topTime) || fieldTime.Equal(topTime) - } - } - - // default reflect.String: - return field.String() <= topField.String() -} - -// IsLtCrossStructField is the validation function for validating if the current field's value is less than the field, within a separate struct, specified by the param's value. -// NOTE: This is exposed for use within your own custom functions and not intended to be called directly. -func isLtCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() < topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() < topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() < topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) < int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.Before(topTime) - } - } - - // default reflect.String: - return field.String() < topField.String() -} - -// IsGteCrossStructField is the validation function for validating if the current field's value is greater than or equal to the field, within a separate struct, specified by the param's value. -func isGteCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() >= topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() >= topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() >= topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) >= int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.After(topTime) || fieldTime.Equal(topTime) - } - } - - // default reflect.String: - return field.String() >= topField.String() -} - -// IsGtCrossStructField is the validation function for validating if the current field's value is greater than the field, within a separate struct, specified by the param's value. -func isGtCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() > topField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() > topField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() > topField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) > int64(topField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - fieldTime := field.Interface().(time.Time) - topTime := topField.Interface().(time.Time) - - return fieldTime.After(topTime) - } - } - - // default reflect.String: - return field.String() > topField.String() -} - -// IsNeCrossStructField is the validation function for validating that the current field's value is not equal to the field, within a separate struct, specified by the param's value. -func isNeCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return true - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return topField.Int() != field.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return topField.Uint() != field.Uint() - - case reflect.Float32, reflect.Float64: - return topField.Float() != field.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(topField.Len()) != int64(field.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return true - } - - if fieldType == timeType { - - t := field.Interface().(time.Time) - fieldTime := topField.Interface().(time.Time) - - return !fieldTime.Equal(t) - } - } - - // default reflect.String: - return topField.String() != field.String() -} - -// IsEqCrossStructField is the validation function for validating that the current field's value is equal to the field, within a separate struct, specified by the param's value. -func isEqCrossStructField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - topField, topKind, ok := fl.GetStructFieldOK() - if !ok || topKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return topField.Int() == field.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return topField.Uint() == field.Uint() - - case reflect.Float32, reflect.Float64: - return topField.Float() == field.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(topField.Len()) == int64(field.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != topField.Type() { - return false - } - - if fieldType == timeType { - - t := field.Interface().(time.Time) - fieldTime := topField.Interface().(time.Time) - - return fieldTime.Equal(t) - } - } - - // default reflect.String: - return topField.String() == field.String() -} - -// IsEqField is the validation function for validating if the current field's value is equal to the field specified by the param's value. -func isEqField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return field.Int() == currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return field.Uint() == currentField.Uint() - - case reflect.Float32, reflect.Float64: - return field.Float() == currentField.Float() - - case reflect.Slice, reflect.Map, reflect.Array: - return int64(field.Len()) == int64(currentField.Len()) - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.Equal(t) - } - - } - - // default reflect.String: - return field.String() == currentField.String() -} - -// IsEq is the validation function for validating if the current field's value is equal to the param's value. -func isEq(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - return field.String() == param - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) == p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asInt(param) - - return field.Int() == p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() == p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() == p - - case reflect.Bool: - p := asBool(param) - - return field.Bool() == p - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsBase64 is the validation function for validating if the current field's value is a valid base 64. -func isBase64(fl FieldLevel) bool { - return base64Regex.MatchString(fl.Field().String()) -} - -// IsBase64URL is the validation function for validating if the current field's value is a valid base64 URL safe string. -func isBase64URL(fl FieldLevel) bool { - return base64URLRegex.MatchString(fl.Field().String()) -} - -// IsURI is the validation function for validating if the current field's value is a valid URI. -func isURI(fl FieldLevel) bool { - - field := fl.Field() - - switch field.Kind() { - - case reflect.String: - - s := field.String() - - // checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195 - // emulate browser and strip the '#' suffix prior to validation. see issue-#237 - if i := strings.Index(s, "#"); i > -1 { - s = s[:i] - } - - if len(s) == 0 { - return false - } - - _, err := url.ParseRequestURI(s) - - return err == nil - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsURL is the validation function for validating if the current field's value is a valid URL. -func isURL(fl FieldLevel) bool { - - field := fl.Field() - - switch field.Kind() { - - case reflect.String: - - var i int - s := field.String() - - // checks needed as of Go 1.6 because of change https://github.com/golang/go/commit/617c93ce740c3c3cc28cdd1a0d712be183d0b328#diff-6c2d018290e298803c0c9419d8739885L195 - // emulate browser and strip the '#' suffix prior to validation. see issue-#237 - if i = strings.Index(s, "#"); i > -1 { - s = s[:i] - } - - if len(s) == 0 { - return false - } - - url, err := url.ParseRequestURI(s) - - if err != nil || url.Scheme == "" { - return false - } - - return true - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isUrnRFC2141 is the validation function for validating if the current field's value is a valid URN as per RFC 2141. -func isUrnRFC2141(fl FieldLevel) bool { - field := fl.Field() - - switch field.Kind() { - - case reflect.String: - - str := field.String() - - _, match := urn.Parse([]byte(str)) - - return match - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsFile is the validation function for validating if the current field's value is a valid file path. -func isFile(fl FieldLevel) bool { - field := fl.Field() - - switch field.Kind() { - case reflect.String: - fileInfo, err := os.Stat(field.String()) - if err != nil { - return false - } - - return !fileInfo.IsDir() - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number. -func isE164(fl FieldLevel) bool { - return e164Regex.MatchString(fl.Field().String()) -} - -// IsEmail is the validation function for validating if the current field's value is a valid email address. -func isEmail(fl FieldLevel) bool { - return emailRegex.MatchString(fl.Field().String()) -} - -// IsHSLA is the validation function for validating if the current field's value is a valid HSLA color. -func isHSLA(fl FieldLevel) bool { - return hslaRegex.MatchString(fl.Field().String()) -} - -// IsHSL is the validation function for validating if the current field's value is a valid HSL color. -func isHSL(fl FieldLevel) bool { - return hslRegex.MatchString(fl.Field().String()) -} - -// IsRGBA is the validation function for validating if the current field's value is a valid RGBA color. -func isRGBA(fl FieldLevel) bool { - return rgbaRegex.MatchString(fl.Field().String()) -} - -// IsRGB is the validation function for validating if the current field's value is a valid RGB color. -func isRGB(fl FieldLevel) bool { - return rgbRegex.MatchString(fl.Field().String()) -} - -// IsHEXColor is the validation function for validating if the current field's value is a valid HEX color. -func isHEXColor(fl FieldLevel) bool { - return hexcolorRegex.MatchString(fl.Field().String()) -} - -// IsHexadecimal is the validation function for validating if the current field's value is a valid hexadecimal. -func isHexadecimal(fl FieldLevel) bool { - return hexadecimalRegex.MatchString(fl.Field().String()) -} - -// IsNumber is the validation function for validating if the current field's value is a valid number. -func isNumber(fl FieldLevel) bool { - switch fl.Field().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64: - return true - default: - return numberRegex.MatchString(fl.Field().String()) - } -} - -// IsNumeric is the validation function for validating if the current field's value is a valid numeric value. -func isNumeric(fl FieldLevel) bool { - switch fl.Field().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64: - return true - default: - return numericRegex.MatchString(fl.Field().String()) - } -} - -// IsAlphanum is the validation function for validating if the current field's value is a valid alphanumeric value. -func isAlphanum(fl FieldLevel) bool { - return alphaNumericRegex.MatchString(fl.Field().String()) -} - -// IsAlpha is the validation function for validating if the current field's value is a valid alpha value. -func isAlpha(fl FieldLevel) bool { - return alphaRegex.MatchString(fl.Field().String()) -} - -// IsAlphanumUnicode is the validation function for validating if the current field's value is a valid alphanumeric unicode value. -func isAlphanumUnicode(fl FieldLevel) bool { - return alphaUnicodeNumericRegex.MatchString(fl.Field().String()) -} - -// IsAlphaUnicode is the validation function for validating if the current field's value is a valid alpha unicode value. -func isAlphaUnicode(fl FieldLevel) bool { - return alphaUnicodeRegex.MatchString(fl.Field().String()) -} - -// isDefault is the opposite of required aka hasValue -func isDefault(fl FieldLevel) bool { - return !hasValue(fl) -} - -// HasValue is the validation function for validating if the current field's value is not the default static value. -func hasValue(fl FieldLevel) bool { - field := fl.Field() - switch field.Kind() { - case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: - return !field.IsNil() - default: - if fl.(*validate).fldIsPointer && field.Interface() != nil { - return true - } - return field.IsValid() && field.Interface() != reflect.Zero(field.Type()).Interface() - } -} - -// requireCheckField is a func for check field kind -func requireCheckFieldKind(fl FieldLevel, param string, defaultNotFoundValue bool) bool { - field := fl.Field() - kind := field.Kind() - var nullable, found bool - if len(param) > 0 { - field, kind, nullable, found = fl.GetStructFieldOKAdvanced2(fl.Parent(), param) - if !found { - return defaultNotFoundValue - } - } - switch kind { - case reflect.Invalid: - return defaultNotFoundValue - case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func: - return field.IsNil() - default: - if nullable && field.Interface() != nil { - return false - } - return field.IsValid() && field.Interface() == reflect.Zero(field.Type()).Interface() - } -} - -// RequiredWith is the validation function -// The field under validation must be present and not empty only if any of the other specified fields are present. -func requiredWith(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if !requireCheckFieldKind(fl, param, true) { - return hasValue(fl) - } - } - return true -} - -// RequiredWithAll is the validation function -// The field under validation must be present and not empty only if all of the other specified fields are present. -func requiredWithAll(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if requireCheckFieldKind(fl, param, true) { - return true - } - } - return hasValue(fl) -} - -// RequiredWithout is the validation function -// The field under validation must be present and not empty only when any of the other specified fields are not present. -func requiredWithout(fl FieldLevel) bool { - if requireCheckFieldKind(fl, strings.TrimSpace(fl.Param()), true) { - return hasValue(fl) - } - return true -} - -// RequiredWithoutAll is the validation function -// The field under validation must be present and not empty only when all of the other specified fields are not present. -func requiredWithoutAll(fl FieldLevel) bool { - params := parseOneOfParam2(fl.Param()) - for _, param := range params { - if !requireCheckFieldKind(fl, param, true) { - return true - } - } - return hasValue(fl) -} - -// IsGteField is the validation function for validating if the current field's value is greater than or equal to the field specified by the param's value. -func isGteField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() >= currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() >= currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() >= currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.After(t) || fieldTime.Equal(t) - } - } - - // default reflect.String - return len(field.String()) >= len(currentField.String()) -} - -// IsGtField is the validation function for validating if the current field's value is greater than the field specified by the param's value. -func isGtField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() > currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() > currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() > currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.After(t) - } - } - - // default reflect.String - return len(field.String()) > len(currentField.String()) -} - -// IsGte is the validation function for validating if the current field's value is greater than or equal to the param's value. -func isGte(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) >= p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) >= p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asInt(param) - - return field.Int() >= p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() >= p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() >= p - - case reflect.Struct: - - if field.Type() == timeType { - - now := time.Now().UTC() - t := field.Interface().(time.Time) - - return t.After(now) || t.Equal(now) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsGt is the validation function for validating if the current field's value is greater than the param's value. -func isGt(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) > p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) > p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asInt(param) - - return field.Int() > p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() > p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() > p - case reflect.Struct: - - if field.Type() == timeType { - - return field.Interface().(time.Time).After(time.Now().UTC()) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// HasLengthOf is the validation function for validating if the current field's value is equal to the param's value. -func hasLengthOf(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) == p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) == p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asInt(param) - - return field.Int() == p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() == p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() == p - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// HasMinOf is the validation function for validating if the current field's value is greater than or equal to the param's value. -func hasMinOf(fl FieldLevel) bool { - return isGte(fl) -} - -// IsLteField is the validation function for validating if the current field's value is less than or equal to the field specified by the param's value. -func isLteField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() <= currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() <= currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() <= currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.Before(t) || fieldTime.Equal(t) - } - } - - // default reflect.String - return len(field.String()) <= len(currentField.String()) -} - -// IsLtField is the validation function for validating if the current field's value is less than the field specified by the param's value. -func isLtField(fl FieldLevel) bool { - - field := fl.Field() - kind := field.Kind() - - currentField, currentKind, ok := fl.GetStructFieldOK() - if !ok || currentKind != kind { - return false - } - - switch kind { - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - return field.Int() < currentField.Int() - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - - return field.Uint() < currentField.Uint() - - case reflect.Float32, reflect.Float64: - - return field.Float() < currentField.Float() - - case reflect.Struct: - - fieldType := field.Type() - - // Not Same underlying type i.e. struct and time - if fieldType != currentField.Type() { - return false - } - - if fieldType == timeType { - - t := currentField.Interface().(time.Time) - fieldTime := field.Interface().(time.Time) - - return fieldTime.Before(t) - } - } - - // default reflect.String - return len(field.String()) < len(currentField.String()) -} - -// IsLte is the validation function for validating if the current field's value is less than or equal to the param's value. -func isLte(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) <= p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) <= p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asInt(param) - - return field.Int() <= p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() <= p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() <= p - - case reflect.Struct: - - if field.Type() == timeType { - - now := time.Now().UTC() - t := field.Interface().(time.Time) - - return t.Before(now) || t.Equal(now) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// IsLt is the validation function for validating if the current field's value is less than the param's value. -func isLt(fl FieldLevel) bool { - - field := fl.Field() - param := fl.Param() - - switch field.Kind() { - - case reflect.String: - p := asInt(param) - - return int64(utf8.RuneCountInString(field.String())) < p - - case reflect.Slice, reflect.Map, reflect.Array: - p := asInt(param) - - return int64(field.Len()) < p - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - p := asInt(param) - - return field.Int() < p - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - p := asUint(param) - - return field.Uint() < p - - case reflect.Float32, reflect.Float64: - p := asFloat(param) - - return field.Float() < p - - case reflect.Struct: - - if field.Type() == timeType { - - return field.Interface().(time.Time).Before(time.Now().UTC()) - } - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// HasMaxOf is the validation function for validating if the current field's value is less than or equal to the param's value. -func hasMaxOf(fl FieldLevel) bool { - return isLte(fl) -} - -// IsTCP4AddrResolvable is the validation function for validating if the field's value is a resolvable tcp4 address. -func isTCP4AddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) { - return false - } - - _, err := net.ResolveTCPAddr("tcp4", fl.Field().String()) - return err == nil -} - -// IsTCP6AddrResolvable is the validation function for validating if the field's value is a resolvable tcp6 address. -func isTCP6AddrResolvable(fl FieldLevel) bool { - - if !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveTCPAddr("tcp6", fl.Field().String()) - - return err == nil -} - -// IsTCPAddrResolvable is the validation function for validating if the field's value is a resolvable tcp address. -func isTCPAddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) && !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveTCPAddr("tcp", fl.Field().String()) - - return err == nil -} - -// IsUDP4AddrResolvable is the validation function for validating if the field's value is a resolvable udp4 address. -func isUDP4AddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) { - return false - } - - _, err := net.ResolveUDPAddr("udp4", fl.Field().String()) - - return err == nil -} - -// IsUDP6AddrResolvable is the validation function for validating if the field's value is a resolvable udp6 address. -func isUDP6AddrResolvable(fl FieldLevel) bool { - - if !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveUDPAddr("udp6", fl.Field().String()) - - return err == nil -} - -// IsUDPAddrResolvable is the validation function for validating if the field's value is a resolvable udp address. -func isUDPAddrResolvable(fl FieldLevel) bool { - - if !isIP4Addr(fl) && !isIP6Addr(fl) { - return false - } - - _, err := net.ResolveUDPAddr("udp", fl.Field().String()) - - return err == nil -} - -// IsIP4AddrResolvable is the validation function for validating if the field's value is a resolvable ip4 address. -func isIP4AddrResolvable(fl FieldLevel) bool { - - if !isIPv4(fl) { - return false - } - - _, err := net.ResolveIPAddr("ip4", fl.Field().String()) - - return err == nil -} - -// IsIP6AddrResolvable is the validation function for validating if the field's value is a resolvable ip6 address. -func isIP6AddrResolvable(fl FieldLevel) bool { - - if !isIPv6(fl) { - return false - } - - _, err := net.ResolveIPAddr("ip6", fl.Field().String()) - - return err == nil -} - -// IsIPAddrResolvable is the validation function for validating if the field's value is a resolvable ip address. -func isIPAddrResolvable(fl FieldLevel) bool { - - if !isIP(fl) { - return false - } - - _, err := net.ResolveIPAddr("ip", fl.Field().String()) - - return err == nil -} - -// IsUnixAddrResolvable is the validation function for validating if the field's value is a resolvable unix address. -func isUnixAddrResolvable(fl FieldLevel) bool { - - _, err := net.ResolveUnixAddr("unix", fl.Field().String()) - - return err == nil -} - -func isIP4Addr(fl FieldLevel) bool { - - val := fl.Field().String() - - if idx := strings.LastIndex(val, ":"); idx != -1 { - val = val[0:idx] - } - - ip := net.ParseIP(val) - - return ip != nil && ip.To4() != nil -} - -func isIP6Addr(fl FieldLevel) bool { - - val := fl.Field().String() - - if idx := strings.LastIndex(val, ":"); idx != -1 { - if idx != 0 && val[idx-1:idx] == "]" { - val = val[1 : idx-1] - } - } - - ip := net.ParseIP(val) - - return ip != nil && ip.To4() == nil -} - -func isHostnameRFC952(fl FieldLevel) bool { - return hostnameRegexRFC952.MatchString(fl.Field().String()) -} - -func isHostnameRFC1123(fl FieldLevel) bool { - return hostnameRegexRFC1123.MatchString(fl.Field().String()) -} - -func isFQDN(fl FieldLevel) bool { - val := fl.Field().String() - - if val == "" { - return false - } - - if val[len(val)-1] == '.' { - val = val[0 : len(val)-1] - } - - return strings.ContainsAny(val, ".") && - hostnameRegexRFC952.MatchString(val) -} - -// IsDir is the validation function for validating if the current field's value is a valid directory. -func isDir(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - fileInfo, err := os.Stat(field.String()) - if err != nil { - return false - } - - return fileInfo.IsDir() - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isJSON is the validation function for validating if the current field's value is a valid json string. -func isJSON(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - val := field.String() - return json.Valid([]byte(val)) - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isHostnamePort validates a : combination for fields typically used for socket address. -func isHostnamePort(fl FieldLevel) bool { - val := fl.Field().String() - host, port, err := net.SplitHostPort(val) - if err != nil { - return false - } - // Port must be a iny <= 65535. - if portNum, err := strconv.ParseInt(port, 10, 32); err != nil || portNum > 65535 || portNum < 1 { - return false - } - - // If host is specified, it should match a DNS name - if host != "" { - return hostnameRegexRFC1123.MatchString(host) - } - return true -} - -// isLowercase is the validation function for validating if the current field's value is a lowercase string. -func isLowercase(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - if field.String() == "" { - return false - } - return field.String() == strings.ToLower(field.String()) - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isUppercase is the validation function for validating if the current field's value is an uppercase string. -func isUppercase(fl FieldLevel) bool { - field := fl.Field() - - if field.Kind() == reflect.String { - if field.String() == "" { - return false - } - return field.String() == strings.ToUpper(field.String()) - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} - -// isDatetime is the validation function for validating if the current field's value is a valid datetime string. -func isDatetime(fl FieldLevel) bool { - field := fl.Field() - param := fl.Param() - - if field.Kind() == reflect.String { - _, err := time.Parse(param, field.String()) - if err != nil { - return false - } - - return true - } - - panic(fmt.Sprintf("Bad field type %T", field.Interface())) -} diff --git a/vendor/github.com/go-playground/validator/v10/cache.go b/vendor/github.com/go-playground/validator/v10/cache.go deleted file mode 100644 index 0d18d6ec..00000000 --- a/vendor/github.com/go-playground/validator/v10/cache.go +++ /dev/null @@ -1,322 +0,0 @@ -package validator - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -type tagType uint8 - -const ( - typeDefault tagType = iota - typeOmitEmpty - typeIsDefault - typeNoStructLevel - typeStructOnly - typeDive - typeOr - typeKeys - typeEndKeys -) - -const ( - invalidValidation = "Invalid validation tag on field '%s'" - undefinedValidation = "Undefined validation function '%s' on field '%s'" - keysTagNotDefined = "'" + endKeysTag + "' tag encountered without a corresponding '" + keysTag + "' tag" -) - -type structCache struct { - lock sync.Mutex - m atomic.Value // map[reflect.Type]*cStruct -} - -func (sc *structCache) Get(key reflect.Type) (c *cStruct, found bool) { - c, found = sc.m.Load().(map[reflect.Type]*cStruct)[key] - return -} - -func (sc *structCache) Set(key reflect.Type, value *cStruct) { - m := sc.m.Load().(map[reflect.Type]*cStruct) - nm := make(map[reflect.Type]*cStruct, len(m)+1) - for k, v := range m { - nm[k] = v - } - nm[key] = value - sc.m.Store(nm) -} - -type tagCache struct { - lock sync.Mutex - m atomic.Value // map[string]*cTag -} - -func (tc *tagCache) Get(key string) (c *cTag, found bool) { - c, found = tc.m.Load().(map[string]*cTag)[key] - return -} - -func (tc *tagCache) Set(key string, value *cTag) { - m := tc.m.Load().(map[string]*cTag) - nm := make(map[string]*cTag, len(m)+1) - for k, v := range m { - nm[k] = v - } - nm[key] = value - tc.m.Store(nm) -} - -type cStruct struct { - name string - fields []*cField - fn StructLevelFuncCtx -} - -type cField struct { - idx int - name string - altName string - namesEqual bool - cTags *cTag -} - -type cTag struct { - tag string - aliasTag string - actualAliasTag string - param string - keys *cTag // only populated when using tag's 'keys' and 'endkeys' for map key validation - next *cTag - fn FuncCtx - typeof tagType - hasTag bool - hasAlias bool - hasParam bool // true if parameter used eg. eq= where the equal sign has been set - isBlockEnd bool // indicates the current tag represents the last validation in the block - runValidationWhenNil bool -} - -func (v *Validate) extractStructCache(current reflect.Value, sName string) *cStruct { - v.structCache.lock.Lock() - defer v.structCache.lock.Unlock() // leave as defer! because if inner panics, it will never get unlocked otherwise! - - typ := current.Type() - - // could have been multiple trying to access, but once first is done this ensures struct - // isn't parsed again. - cs, ok := v.structCache.Get(typ) - if ok { - return cs - } - - cs = &cStruct{name: sName, fields: make([]*cField, 0), fn: v.structLevelFuncs[typ]} - - numFields := current.NumField() - - var ctag *cTag - var fld reflect.StructField - var tag string - var customName string - - for i := 0; i < numFields; i++ { - - fld = typ.Field(i) - - if !fld.Anonymous && len(fld.PkgPath) > 0 { - continue - } - - tag = fld.Tag.Get(v.tagName) - - if tag == skipValidationTag { - continue - } - - customName = fld.Name - - if v.hasTagNameFunc { - name := v.tagNameFunc(fld) - if len(name) > 0 { - customName = name - } - } - - // NOTE: cannot use shared tag cache, because tags may be equal, but things like alias may be different - // and so only struct level caching can be used instead of combined with Field tag caching - - if len(tag) > 0 { - ctag, _ = v.parseFieldTagsRecursive(tag, fld.Name, "", false) - } else { - // even if field doesn't have validations need cTag for traversing to potential inner/nested - // elements of the field. - ctag = new(cTag) - } - - cs.fields = append(cs.fields, &cField{ - idx: i, - name: fld.Name, - altName: customName, - cTags: ctag, - namesEqual: fld.Name == customName, - }) - } - v.structCache.Set(typ, cs) - return cs -} - -func (v *Validate) parseFieldTagsRecursive(tag string, fieldName string, alias string, hasAlias bool) (firstCtag *cTag, current *cTag) { - var t string - noAlias := len(alias) == 0 - tags := strings.Split(tag, tagSeparator) - - for i := 0; i < len(tags); i++ { - t = tags[i] - if noAlias { - alias = t - } - - // check map for alias and process new tags, otherwise process as usual - if tagsVal, found := v.aliases[t]; found { - if i == 0 { - firstCtag, current = v.parseFieldTagsRecursive(tagsVal, fieldName, t, true) - } else { - next, curr := v.parseFieldTagsRecursive(tagsVal, fieldName, t, true) - current.next, current = next, curr - - } - continue - } - - var prevTag tagType - - if i == 0 { - current = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true, typeof: typeDefault} - firstCtag = current - } else { - prevTag = current.typeof - current.next = &cTag{aliasTag: alias, hasAlias: hasAlias, hasTag: true} - current = current.next - } - - switch t { - case diveTag: - current.typeof = typeDive - continue - - case keysTag: - current.typeof = typeKeys - - if i == 0 || prevTag != typeDive { - panic(fmt.Sprintf("'%s' tag must be immediately preceded by the '%s' tag", keysTag, diveTag)) - } - - current.typeof = typeKeys - - // need to pass along only keys tag - // need to increment i to skip over the keys tags - b := make([]byte, 0, 64) - - i++ - - for ; i < len(tags); i++ { - - b = append(b, tags[i]...) - b = append(b, ',') - - if tags[i] == endKeysTag { - break - } - } - - current.keys, _ = v.parseFieldTagsRecursive(string(b[:len(b)-1]), fieldName, "", false) - continue - - case endKeysTag: - current.typeof = typeEndKeys - - // if there are more in tags then there was no keysTag defined - // and an error should be thrown - if i != len(tags)-1 { - panic(keysTagNotDefined) - } - return - - case omitempty: - current.typeof = typeOmitEmpty - continue - - case structOnlyTag: - current.typeof = typeStructOnly - continue - - case noStructLevelTag: - current.typeof = typeNoStructLevel - continue - - default: - if t == isdefault { - current.typeof = typeIsDefault - } - // if a pipe character is needed within the param you must use the utf8Pipe representation "0x7C" - orVals := strings.Split(t, orSeparator) - - for j := 0; j < len(orVals); j++ { - vals := strings.SplitN(orVals[j], tagKeySeparator, 2) - if noAlias { - alias = vals[0] - current.aliasTag = alias - } else { - current.actualAliasTag = t - } - - if j > 0 { - current.next = &cTag{aliasTag: alias, actualAliasTag: current.actualAliasTag, hasAlias: hasAlias, hasTag: true} - current = current.next - } - current.hasParam = len(vals) > 1 - - current.tag = vals[0] - if len(current.tag) == 0 { - panic(strings.TrimSpace(fmt.Sprintf(invalidValidation, fieldName))) - } - - if wrapper, ok := v.validations[current.tag]; ok { - current.fn = wrapper.fn - current.runValidationWhenNil = wrapper.runValidatinOnNil - } else { - panic(strings.TrimSpace(fmt.Sprintf(undefinedValidation, current.tag, fieldName))) - } - - if len(orVals) > 1 { - current.typeof = typeOr - } - - if len(vals) > 1 { - current.param = strings.Replace(strings.Replace(vals[1], utf8HexComma, ",", -1), utf8Pipe, "|", -1) - } - } - current.isBlockEnd = true - } - } - return -} - -func (v *Validate) fetchCacheTag(tag string) *cTag { - // find cached tag - ctag, found := v.tagCache.Get(tag) - if !found { - v.tagCache.lock.Lock() - defer v.tagCache.lock.Unlock() - - // could have been multiple trying to access, but once first is done this ensures tag - // isn't parsed again. - ctag, found = v.tagCache.Get(tag) - if !found { - ctag, _ = v.parseFieldTagsRecursive(tag, "", "", false) - v.tagCache.Set(tag, ctag) - } - } - return ctag -} diff --git a/vendor/github.com/go-playground/validator/v10/doc.go b/vendor/github.com/go-playground/validator/v10/doc.go deleted file mode 100644 index 291c629d..00000000 --- a/vendor/github.com/go-playground/validator/v10/doc.go +++ /dev/null @@ -1,1145 +0,0 @@ -/* -Package validator implements value validations for structs and individual fields -based on tags. - -It can also handle Cross-Field and Cross-Struct validation for nested structs -and has the ability to dive into arrays and maps of any type. - -see more examples https://github.com/go-playground/validator/tree/master/_examples - -Validation Functions Return Type error - -Doing things this way is actually the way the standard library does, see the -file.Open method here: - - https://golang.org/pkg/os/#Open. - -The authors return type "error" to avoid the issue discussed in the following, -where err is always != nil: - - http://stackoverflow.com/a/29138676/3158232 - https://github.com/go-playground/validator/issues/134 - -Validator only InvalidValidationError for bad validation input, nil or -ValidationErrors as type error; so, in your code all you need to do is check -if the error returned is not nil, and if it's not check if error is -InvalidValidationError ( if necessary, most of the time it isn't ) type cast -it to type ValidationErrors like so err.(validator.ValidationErrors). - -Custom Validation Functions - -Custom Validation functions can be added. Example: - - // Structure - func customFunc(fl validator.FieldLevel) bool { - - if fl.Field().String() == "invalid" { - return false - } - - return true - } - - validate.RegisterValidation("custom tag name", customFunc) - // NOTES: using the same tag name as an existing function - // will overwrite the existing one - -Cross-Field Validation - -Cross-Field Validation can be done via the following tags: - - eqfield - - nefield - - gtfield - - gtefield - - ltfield - - ltefield - - eqcsfield - - necsfield - - gtcsfield - - gtecsfield - - ltcsfield - - ltecsfield - -If, however, some custom cross-field validation is required, it can be done -using a custom validation. - -Why not just have cross-fields validation tags (i.e. only eqcsfield and not -eqfield)? - -The reason is efficiency. If you want to check a field within the same struct -"eqfield" only has to find the field on the same struct (1 level). But, if we -used "eqcsfield" it could be multiple levels down. Example: - - type Inner struct { - StartDate time.Time - } - - type Outer struct { - InnerStructField *Inner - CreatedAt time.Time `validate:"ltecsfield=InnerStructField.StartDate"` - } - - now := time.Now() - - inner := &Inner{ - StartDate: now, - } - - outer := &Outer{ - InnerStructField: inner, - CreatedAt: now, - } - - errs := validate.Struct(outer) - - // NOTE: when calling validate.Struct(val) topStruct will be the top level struct passed - // into the function - // when calling validate.VarWithValue(val, field, tag) val will be - // whatever you pass, struct, field... - // when calling validate.Field(field, tag) val will be nil - -Multiple Validators - -Multiple validators on a field will process in the order defined. Example: - - type Test struct { - Field `validate:"max=10,min=1"` - } - - // max will be checked then min - -Bad Validator definitions are not handled by the library. Example: - - type Test struct { - Field `validate:"min=10,max=0"` - } - - // this definition of min max will never succeed - -Using Validator Tags - -Baked In Cross-Field validation only compares fields on the same struct. -If Cross-Field + Cross-Struct validation is needed you should implement your -own custom validator. - -Comma (",") is the default separator of validation tags. If you wish to -have a comma included within the parameter (i.e. excludesall=,) you will need to -use the UTF-8 hex representation 0x2C, which is replaced in the code as a comma, -so the above will become excludesall=0x2C. - - type Test struct { - Field `validate:"excludesall=,"` // BAD! Do not include a comma. - Field `validate:"excludesall=0x2C"` // GOOD! Use the UTF-8 hex representation. - } - -Pipe ("|") is the 'or' validation tags deparator. If you wish to -have a pipe included within the parameter i.e. excludesall=| you will need to -use the UTF-8 hex representation 0x7C, which is replaced in the code as a pipe, -so the above will become excludesall=0x7C - - type Test struct { - Field `validate:"excludesall=|"` // BAD! Do not include a a pipe! - Field `validate:"excludesall=0x7C"` // GOOD! Use the UTF-8 hex representation. - } - - -Baked In Validators and Tags - -Here is a list of the current built in validators: - - -Skip Field - -Tells the validation to skip this struct field; this is particularly -handy in ignoring embedded structs from being validated. (Usage: -) - Usage: - - - -Or Operator - -This is the 'or' operator allowing multiple validators to be used and -accepted. (Usage: rgb|rgba) <-- this would allow either rgb or rgba -colors to be accepted. This can also be combined with 'and' for example -( Usage: omitempty,rgb|rgba) - - Usage: | - -StructOnly - -When a field that is a nested struct is encountered, and contains this flag -any validation on the nested struct will be run, but none of the nested -struct fields will be validated. This is useful if inside of your program -you know the struct will be valid, but need to verify it has been assigned. -NOTE: only "required" and "omitempty" can be used on a struct itself. - - Usage: structonly - -NoStructLevel - -Same as structonly tag except that any struct level validations will not run. - - Usage: nostructlevel - -Omit Empty - -Allows conditional validation, for example if a field is not set with -a value (Determined by the "required" validator) then other validation -such as min or max won't run, but if a value is set validation will run. - - Usage: omitempty - -Dive - -This tells the validator to dive into a slice, array or map and validate that -level of the slice, array or map with the validation tags that follow. -Multidimensional nesting is also supported, each level you wish to dive will -require another dive tag. dive has some sub-tags, 'keys' & 'endkeys', please see -the Keys & EndKeys section just below. - - Usage: dive - -Example #1 - - [][]string with validation tag "gt=0,dive,len=1,dive,required" - // gt=0 will be applied to [] - // len=1 will be applied to []string - // required will be applied to string - -Example #2 - - [][]string with validation tag "gt=0,dive,dive,required" - // gt=0 will be applied to [] - // []string will be spared validation - // required will be applied to string - -Keys & EndKeys - -These are to be used together directly after the dive tag and tells the validator -that anything between 'keys' and 'endkeys' applies to the keys of a map and not the -values; think of it like the 'dive' tag, but for map keys instead of values. -Multidimensional nesting is also supported, each level you wish to validate will -require another 'keys' and 'endkeys' tag. These tags are only valid for maps. - - Usage: dive,keys,othertagvalidation(s),endkeys,valuevalidationtags - -Example #1 - - map[string]string with validation tag "gt=0,dive,keys,eg=1|eq=2,endkeys,required" - // gt=0 will be applied to the map itself - // eg=1|eq=2 will be applied to the map keys - // required will be applied to map values - -Example #2 - - map[[2]string]string with validation tag "gt=0,dive,keys,dive,eq=1|eq=2,endkeys,required" - // gt=0 will be applied to the map itself - // eg=1|eq=2 will be applied to each array element in the the map keys - // required will be applied to map values - -Required - -This validates that the value is not the data types default zero value. -For numbers ensures value is not zero. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required - -Required With - -The field under validation must be present and not empty only if any -of the other specified fields are present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_with - -Examples: - - // require the field if the Field1 is present: - Usage: required_with=Field1 - - // require the field if the Field1 or Field2 is present: - Usage: required_with=Field1 Field2 - -Required With All - -The field under validation must be present and not empty only if all -of the other specified fields are present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_with_all - -Example: - - // require the field if the Field1 and Field2 is present: - Usage: required_with_all=Field1 Field2 - -Required Without - -The field under validation must be present and not empty only when any -of the other specified fields are not present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_without - -Examples: - - // require the field if the Field1 is not present: - Usage: required_without=Field1 - - // require the field if the Field1 or Field2 is not present: - Usage: required_without=Field1 Field2 - -Required Without All - -The field under validation must be present and not empty only when all -of the other specified fields are not present. For strings ensures value is -not "". For slices, maps, pointers, interfaces, channels and functions -ensures the value is not nil. - - Usage: required_without_all - -Example: - - // require the field if the Field1 and Field2 is not present: - Usage: required_without_all=Field1 Field2 - -Is Default - -This validates that the value is the default value and is almost the -opposite of required. - - Usage: isdefault - -Length - -For numbers, length will ensure that the value is -equal to the parameter given. For strings, it checks that -the string length is exactly that number of characters. For slices, -arrays, and maps, validates the number of items. - - Usage: len=10 - -Maximum - -For numbers, max will ensure that the value is -less than or equal to the parameter given. For strings, it checks -that the string length is at most that number of characters. For -slices, arrays, and maps, validates the number of items. - - Usage: max=10 - -Minimum - -For numbers, min will ensure that the value is -greater or equal to the parameter given. For strings, it checks that -the string length is at least that number of characters. For slices, -arrays, and maps, validates the number of items. - - Usage: min=10 - -Equals - -For strings & numbers, eq will ensure that the value is -equal to the parameter given. For slices, arrays, and maps, -validates the number of items. - - Usage: eq=10 - -Not Equal - -For strings & numbers, ne will ensure that the value is not -equal to the parameter given. For slices, arrays, and maps, -validates the number of items. - - Usage: ne=10 - -One Of - -For strings, ints, and uints, oneof will ensure that the value -is one of the values in the parameter. The parameter should be -a list of values separated by whitespace. Values may be -strings or numbers. To match strings with spaces in them, include -the target string between single quotes. - - Usage: oneof=red green - oneof='red green' 'blue yellow' - oneof=5 7 9 - -Greater Than - -For numbers, this will ensure that the value is greater than the -parameter given. For strings, it checks that the string length -is greater than that number of characters. For slices, arrays -and maps it validates the number of items. - -Example #1 - - Usage: gt=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is greater than time.Now.UTC(). - - Usage: gt - -Greater Than or Equal - -Same as 'min' above. Kept both to make terminology with 'len' easier. - - -Example #1 - - Usage: gte=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is greater than or equal to time.Now.UTC(). - - Usage: gte - -Less Than - -For numbers, this will ensure that the value is less than the parameter given. -For strings, it checks that the string length is less than that number of -characters. For slices, arrays, and maps it validates the number of items. - -Example #1 - - Usage: lt=10 - -Example #2 (time.Time) -For time.Time ensures the time value is less than time.Now.UTC(). - - Usage: lt - -Less Than or Equal - -Same as 'max' above. Kept both to make terminology with 'len' easier. - -Example #1 - - Usage: lte=10 - -Example #2 (time.Time) - -For time.Time ensures the time value is less than or equal to time.Now.UTC(). - - Usage: lte - -Field Equals Another Field - -This will validate the field value against another fields value either within -a struct or passed in field. - -Example #1: - - // Validation on Password field using: - Usage: eqfield=ConfirmPassword - -Example #2: - - // Validating by field: - validate.VarWithValue(password, confirmpassword, "eqfield") - -Field Equals Another Field (relative) - -This does the same as eqfield except that it validates the field provided relative -to the top level struct. - - Usage: eqcsfield=InnerStructField.Field) - -Field Does Not Equal Another Field - -This will validate the field value against another fields value either within -a struct or passed in field. - -Examples: - - // Confirm two colors are not the same: - // - // Validation on Color field: - Usage: nefield=Color2 - - // Validating by field: - validate.VarWithValue(color1, color2, "nefield") - -Field Does Not Equal Another Field (relative) - -This does the same as nefield except that it validates the field provided -relative to the top level struct. - - Usage: necsfield=InnerStructField.Field - -Field Greater Than Another Field - -Only valid for Numbers and time.Time types, this will validate the field value -against another fields value either within a struct or passed in field. -usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(gtfield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "gtfield") - - -Field Greater Than Another Relative Field - -This does the same as gtfield except that it validates the field provided -relative to the top level struct. - - Usage: gtcsfield=InnerStructField.Field - -Field Greater Than or Equal To Another Field - -Only valid for Numbers and time.Time types, this will validate the field value -against another fields value either within a struct or passed in field. -usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(gtefield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "gtefield") - -Field Greater Than or Equal To Another Relative Field - -This does the same as gtefield except that it validates the field provided relative -to the top level struct. - - Usage: gtecsfield=InnerStructField.Field - -Less Than Another Field - -Only valid for Numbers and time.Time types, this will validate the field value -against another fields value either within a struct or passed in field. -usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(ltfield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "ltfield") - -Less Than Another Relative Field - -This does the same as ltfield except that it validates the field provided relative -to the top level struct. - - Usage: ltcsfield=InnerStructField.Field - -Less Than or Equal To Another Field - -Only valid for Numbers and time.Time types, this will validate the field value -against another fields value either within a struct or passed in field. -usage examples are for validation of a Start and End date: - -Example #1: - - // Validation on End field using: - validate.Struct Usage(ltefield=Start) - -Example #2: - - // Validating by field: - validate.VarWithValue(start, end, "ltefield") - -Less Than or Equal To Another Relative Field - -This does the same as ltefield except that it validates the field provided relative -to the top level struct. - - Usage: ltecsfield=InnerStructField.Field - -Field Contains Another Field - -This does the same as contains except for struct fields. It should only be used -with string types. See the behavior of reflect.Value.String() for behavior on -other types. - - Usage: containsfield=InnerStructField.Field - -Field Excludes Another Field - -This does the same as excludes except for struct fields. It should only be used -with string types. See the behavior of reflect.Value.String() for behavior on -other types. - - Usage: excludesfield=InnerStructField.Field - -Unique - -For arrays & slices, unique will ensure that there are no duplicates. -For maps, unique will ensure that there are no duplicate values. -For slices of struct, unique will ensure that there are no duplicate values -in a field of the struct specified via a parameter. - - // For arrays, slices, and maps: - Usage: unique - - // For slices of struct: - Usage: unique=field - -Alpha Only - -This validates that a string value contains ASCII alpha characters only - - Usage: alpha - -Alphanumeric - -This validates that a string value contains ASCII alphanumeric characters only - - Usage: alphanum - -Alpha Unicode - -This validates that a string value contains unicode alpha characters only - - Usage: alphaunicode - -Alphanumeric Unicode - -This validates that a string value contains unicode alphanumeric characters only - - Usage: alphanumunicode - -Numeric - -This validates that a string value contains a basic numeric value. -basic excludes exponents etc... -for integers or float it returns true. - - Usage: numeric - -Hexadecimal String - -This validates that a string value contains a valid hexadecimal. - - Usage: hexadecimal - -Hexcolor String - -This validates that a string value contains a valid hex color including -hashtag (#) - - Usage: hexcolor - -Lowercase String - -This validates that a string value contains only lowercase characters. An empty string is not a valid lowercase string. - - Usage: lowercase - -Uppercase String - -This validates that a string value contains only uppercase characters. An empty string is not a valid uppercase string. - - Usage: uppercase - -RGB String - -This validates that a string value contains a valid rgb color - - Usage: rgb - -RGBA String - -This validates that a string value contains a valid rgba color - - Usage: rgba - -HSL String - -This validates that a string value contains a valid hsl color - - Usage: hsl - -HSLA String - -This validates that a string value contains a valid hsla color - - Usage: hsla - -E-mail String - -This validates that a string value contains a valid email -This may not conform to all possibilities of any rfc standard, but neither -does any email provider accept all possibilities. - - Usage: email - -JSON String - -This validates that a string value is valid JSON - - Usage: json - -File path - -This validates that a string value contains a valid file path and that -the file exists on the machine. -This is done using os.Stat, which is a platform independent function. - - Usage: file - -URL String - -This validates that a string value contains a valid url -This will accept any url the golang request uri accepts but must contain -a schema for example http:// or rtmp:// - - Usage: url - -URI String - -This validates that a string value contains a valid uri -This will accept any uri the golang request uri accepts - - Usage: uri - -Urn RFC 2141 String - -This validataes that a string value contains a valid URN -according to the RFC 2141 spec. - - Usage: urn_rfc2141 - -Base64 String - -This validates that a string value contains a valid base64 value. -Although an empty string is valid base64 this will report an empty string -as an error, if you wish to accept an empty string as valid you can use -this with the omitempty tag. - - Usage: base64 - -Base64URL String - -This validates that a string value contains a valid base64 URL safe value -according the the RFC4648 spec. -Although an empty string is a valid base64 URL safe value, this will report -an empty string as an error, if you wish to accept an empty string as valid -you can use this with the omitempty tag. - - Usage: base64url - -Bitcoin Address - -This validates that a string value contains a valid bitcoin address. -The format of the string is checked to ensure it matches one of the three formats -P2PKH, P2SH and performs checksum validation. - - Usage: btc_addr - -Bitcoin Bech32 Address (segwit) - -This validates that a string value contains a valid bitcoin Bech32 address as defined -by bip-0173 (https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki) -Special thanks to Pieter Wuille for providng reference implementations. - - Usage: btc_addr_bech32 - -Ethereum Address - -This validates that a string value contains a valid ethereum address. -The format of the string is checked to ensure it matches the standard Ethereum address format -Full validation is blocked by https://github.com/golang/crypto/pull/28 - - Usage: eth_addr - -Contains - -This validates that a string value contains the substring value. - - Usage: contains=@ - -Contains Any - -This validates that a string value contains any Unicode code points -in the substring value. - - Usage: containsany=!@#? - -Contains Rune - -This validates that a string value contains the supplied rune value. - - Usage: containsrune=@ - -Excludes - -This validates that a string value does not contain the substring value. - - Usage: excludes=@ - -Excludes All - -This validates that a string value does not contain any Unicode code -points in the substring value. - - Usage: excludesall=!@#? - -Excludes Rune - -This validates that a string value does not contain the supplied rune value. - - Usage: excludesrune=@ - -Starts With - -This validates that a string value starts with the supplied string value - - Usage: startswith=hello - -Ends With - -This validates that a string value ends with the supplied string value - - Usage: endswith=goodbye - -International Standard Book Number - -This validates that a string value contains a valid isbn10 or isbn13 value. - - Usage: isbn - -International Standard Book Number 10 - -This validates that a string value contains a valid isbn10 value. - - Usage: isbn10 - -International Standard Book Number 13 - -This validates that a string value contains a valid isbn13 value. - - Usage: isbn13 - -Universally Unique Identifier UUID - -This validates that a string value contains a valid UUID. Uppercase UUID values will not pass - use `uuid_rfc4122` instead. - - Usage: uuid - -Universally Unique Identifier UUID v3 - -This validates that a string value contains a valid version 3 UUID. Uppercase UUID values will not pass - use `uuid3_rfc4122` instead. - - Usage: uuid3 - -Universally Unique Identifier UUID v4 - -This validates that a string value contains a valid version 4 UUID. Uppercase UUID values will not pass - use `uuid4_rfc4122` instead. - - Usage: uuid4 - -Universally Unique Identifier UUID v5 - -This validates that a string value contains a valid version 5 UUID. Uppercase UUID values will not pass - use `uuid5_rfc4122` instead. - - Usage: uuid5 - -ASCII - -This validates that a string value contains only ASCII characters. -NOTE: if the string is blank, this validates as true. - - Usage: ascii - -Printable ASCII - -This validates that a string value contains only printable ASCII characters. -NOTE: if the string is blank, this validates as true. - - Usage: printascii - -Multi-Byte Characters - -This validates that a string value contains one or more multibyte characters. -NOTE: if the string is blank, this validates as true. - - Usage: multibyte - -Data URL - -This validates that a string value contains a valid DataURI. -NOTE: this will also validate that the data portion is valid base64 - - Usage: datauri - -Latitude - -This validates that a string value contains a valid latitude. - - Usage: latitude - -Longitude - -This validates that a string value contains a valid longitude. - - Usage: longitude - -Social Security Number SSN - -This validates that a string value contains a valid U.S. Social Security Number. - - Usage: ssn - -Internet Protocol Address IP - -This validates that a string value contains a valid IP Address. - - Usage: ip - -Internet Protocol Address IPv4 - -This validates that a string value contains a valid v4 IP Address. - - Usage: ipv4 - -Internet Protocol Address IPv6 - -This validates that a string value contains a valid v6 IP Address. - - Usage: ipv6 - -Classless Inter-Domain Routing CIDR - -This validates that a string value contains a valid CIDR Address. - - Usage: cidr - -Classless Inter-Domain Routing CIDRv4 - -This validates that a string value contains a valid v4 CIDR Address. - - Usage: cidrv4 - -Classless Inter-Domain Routing CIDRv6 - -This validates that a string value contains a valid v6 CIDR Address. - - Usage: cidrv6 - -Transmission Control Protocol Address TCP - -This validates that a string value contains a valid resolvable TCP Address. - - Usage: tcp_addr - -Transmission Control Protocol Address TCPv4 - -This validates that a string value contains a valid resolvable v4 TCP Address. - - Usage: tcp4_addr - -Transmission Control Protocol Address TCPv6 - -This validates that a string value contains a valid resolvable v6 TCP Address. - - Usage: tcp6_addr - -User Datagram Protocol Address UDP - -This validates that a string value contains a valid resolvable UDP Address. - - Usage: udp_addr - -User Datagram Protocol Address UDPv4 - -This validates that a string value contains a valid resolvable v4 UDP Address. - - Usage: udp4_addr - -User Datagram Protocol Address UDPv6 - -This validates that a string value contains a valid resolvable v6 UDP Address. - - Usage: udp6_addr - -Internet Protocol Address IP - -This validates that a string value contains a valid resolvable IP Address. - - Usage: ip_addr - -Internet Protocol Address IPv4 - -This validates that a string value contains a valid resolvable v4 IP Address. - - Usage: ip4_addr - -Internet Protocol Address IPv6 - -This validates that a string value contains a valid resolvable v6 IP Address. - - Usage: ip6_addr - -Unix domain socket end point Address - -This validates that a string value contains a valid Unix Address. - - Usage: unix_addr - -Media Access Control Address MAC - -This validates that a string value contains a valid MAC Address. - - Usage: mac - -Note: See Go's ParseMAC for accepted formats and types: - - http://golang.org/src/net/mac.go?s=866:918#L29 - -Hostname RFC 952 - -This validates that a string value is a valid Hostname according to RFC 952 https://tools.ietf.org/html/rfc952 - - Usage: hostname - -Hostname RFC 1123 - -This validates that a string value is a valid Hostname according to RFC 1123 https://tools.ietf.org/html/rfc1123 - - Usage: hostname_rfc1123 or if you want to continue to use 'hostname' in your tags, create an alias. - -Full Qualified Domain Name (FQDN) - -This validates that a string value contains a valid FQDN. - - Usage: fqdn - -HTML Tags - -This validates that a string value appears to be an HTML element tag -including those described at https://developer.mozilla.org/en-US/docs/Web/HTML/Element - - Usage: html - -HTML Encoded - -This validates that a string value is a proper character reference in decimal -or hexadecimal format - - Usage: html_encoded - -URL Encoded - -This validates that a string value is percent-encoded (URL encoded) according -to https://tools.ietf.org/html/rfc3986#section-2.1 - - Usage: url_encoded - -Directory - -This validates that a string value contains a valid directory and that -it exists on the machine. -This is done using os.Stat, which is a platform independent function. - - Usage: dir - -HostPort - -This validates that a string value contains a valid DNS hostname and port that -can be used to valiate fields typically passed to sockets and connections. - - Usage: hostname_port - -Datetime - -This validates that a string value is a valid datetime based on the supplied datetime format. -Supplied format must match the official Go time format layout as documented in https://golang.org/pkg/time/ - - Usage: datetime=2006-01-02 - -Alias Validators and Tags - -NOTE: When returning an error, the tag returned in "FieldError" will be -the alias tag unless the dive tag is part of the alias. Everything after the -dive tag is not reported as the alias tag. Also, the "ActualTag" in the before -case will be the actual tag within the alias that failed. - -Here is a list of the current built in alias tags: - - "iscolor" - alias is "hexcolor|rgb|rgba|hsl|hsla" (Usage: iscolor) - -Validator notes: - - regex - a regex validator won't be added because commas and = signs can be part - of a regex which conflict with the validation definitions. Although - workarounds can be made, they take away from using pure regex's. - Furthermore it's quick and dirty but the regex's become harder to - maintain and are not reusable, so it's as much a programming philosophy - as anything. - - In place of this new validator functions should be created; a regex can - be used within the validator function and even be precompiled for better - efficiency within regexes.go. - - And the best reason, you can submit a pull request and we can keep on - adding to the validation library of this package! - -Non standard validators - -A collection of validation rules that are frequently needed but are more -complex than the ones found in the baked in validators. -A non standard validator must be registered manually like you would -with your own custom validation functions. - -Example of registration and use: - - type Test struct { - TestField string `validate:"yourtag"` - } - - t := &Test{ - TestField: "Test" - } - - validate := validator.New() - validate.RegisterValidation("yourtag", validators.NotBlank) - -Here is a list of the current non standard validators: - - NotBlank - This validates that the value is not blank or with length zero. - For strings ensures they do not contain only spaces. For channels, maps, slices and arrays - ensures they don't have zero length. For others, a non empty value is required. - - Usage: notblank - -Panics - -This package panics when bad input is provided, this is by design, bad code like -that should not make it to production. - - type Test struct { - TestField string `validate:"nonexistantfunction=1"` - } - - t := &Test{ - TestField: "Test" - } - - validate.Struct(t) // this will panic -*/ -package validator diff --git a/vendor/github.com/go-playground/validator/v10/errors.go b/vendor/github.com/go-playground/validator/v10/errors.go deleted file mode 100644 index 46c24c9b..00000000 --- a/vendor/github.com/go-playground/validator/v10/errors.go +++ /dev/null @@ -1,272 +0,0 @@ -package validator - -import ( - "bytes" - "fmt" - "reflect" - "strings" - - ut "github.com/go-playground/universal-translator" -) - -const ( - fieldErrMsg = "Key: '%s' Error:Field validation for '%s' failed on the '%s' tag" -) - -// ValidationErrorsTranslations is the translation return type -type ValidationErrorsTranslations map[string]string - -// InvalidValidationError describes an invalid argument passed to -// `Struct`, `StructExcept`, StructPartial` or `Field` -type InvalidValidationError struct { - Type reflect.Type -} - -// Error returns InvalidValidationError message -func (e *InvalidValidationError) Error() string { - - if e.Type == nil { - return "validator: (nil)" - } - - return "validator: (nil " + e.Type.String() + ")" -} - -// ValidationErrors is an array of FieldError's -// for use in custom error messages post validation. -type ValidationErrors []FieldError - -// Error is intended for use in development + debugging and not intended to be a production error message. -// It allows ValidationErrors to subscribe to the Error interface. -// All information to create an error message specific to your application is contained within -// the FieldError found within the ValidationErrors array -func (ve ValidationErrors) Error() string { - - buff := bytes.NewBufferString("") - - var fe *fieldError - - for i := 0; i < len(ve); i++ { - - fe = ve[i].(*fieldError) - buff.WriteString(fe.Error()) - buff.WriteString("\n") - } - - return strings.TrimSpace(buff.String()) -} - -// Translate translates all of the ValidationErrors -func (ve ValidationErrors) Translate(ut ut.Translator) ValidationErrorsTranslations { - - trans := make(ValidationErrorsTranslations) - - var fe *fieldError - - for i := 0; i < len(ve); i++ { - fe = ve[i].(*fieldError) - - // // in case an Anonymous struct was used, ensure that the key - // // would be 'Username' instead of ".Username" - // if len(fe.ns) > 0 && fe.ns[:1] == "." { - // trans[fe.ns[1:]] = fe.Translate(ut) - // continue - // } - - trans[fe.ns] = fe.Translate(ut) - } - - return trans -} - -// FieldError contains all functions to get error details -type FieldError interface { - - // returns the validation tag that failed. if the - // validation was an alias, this will return the - // alias name and not the underlying tag that failed. - // - // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla" - // will return "iscolor" - Tag() string - - // returns the validation tag that failed, even if an - // alias the actual tag within the alias will be returned. - // If an 'or' validation fails the entire or will be returned. - // - // eg. alias "iscolor": "hexcolor|rgb|rgba|hsl|hsla" - // will return "hexcolor|rgb|rgba|hsl|hsla" - ActualTag() string - - // returns the namespace for the field error, with the tag - // name taking precedence over the fields actual name. - // - // eg. JSON name "User.fname" - // - // See StructNamespace() for a version that returns actual names. - // - // NOTE: this field can be blank when validating a single primitive field - // using validate.Field(...) as there is no way to extract it's name - Namespace() string - - // returns the namespace for the field error, with the fields - // actual name. - // - // eq. "User.FirstName" see Namespace for comparison - // - // NOTE: this field can be blank when validating a single primitive field - // using validate.Field(...) as there is no way to extract it's name - StructNamespace() string - - // returns the fields name with the tag name taking precedence over the - // fields actual name. - // - // eq. JSON name "fname" - // see StructField for comparison - Field() string - - // returns the fields actual name from the struct, when able to determine. - // - // eq. "FirstName" - // see Field for comparison - StructField() string - - // returns the actual fields value in case needed for creating the error - // message - Value() interface{} - - // returns the param value, in string form for comparison; this will also - // help with generating an error message - Param() string - - // Kind returns the Field's reflect Kind - // - // eg. time.Time's kind is a struct - Kind() reflect.Kind - - // Type returns the Field's reflect Type - // - // // eg. time.Time's type is time.Time - Type() reflect.Type - - // returns the FieldError's translated error - // from the provided 'ut.Translator' and registered 'TranslationFunc' - // - // NOTE: if no registered translator can be found it returns the same as - // calling fe.Error() - Translate(ut ut.Translator) string -} - -// compile time interface checks -var _ FieldError = new(fieldError) -var _ error = new(fieldError) - -// fieldError contains a single field's validation error along -// with other properties that may be needed for error message creation -// it complies with the FieldError interface -type fieldError struct { - v *Validate - tag string - actualTag string - ns string - structNs string - fieldLen uint8 - structfieldLen uint8 - value interface{} - param string - kind reflect.Kind - typ reflect.Type -} - -// Tag returns the validation tag that failed. -func (fe *fieldError) Tag() string { - return fe.tag -} - -// ActualTag returns the validation tag that failed, even if an -// alias the actual tag within the alias will be returned. -func (fe *fieldError) ActualTag() string { - return fe.actualTag -} - -// Namespace returns the namespace for the field error, with the tag -// name taking precedence over the fields actual name. -func (fe *fieldError) Namespace() string { - return fe.ns -} - -// StructNamespace returns the namespace for the field error, with the fields -// actual name. -func (fe *fieldError) StructNamespace() string { - return fe.structNs -} - -// Field returns the fields name with the tag name taking precedence over the -// fields actual name. -func (fe *fieldError) Field() string { - - return fe.ns[len(fe.ns)-int(fe.fieldLen):] - // // return fe.field - // fld := fe.ns[len(fe.ns)-int(fe.fieldLen):] - - // log.Println("FLD:", fld) - - // if len(fld) > 0 && fld[:1] == "." { - // return fld[1:] - // } - - // return fld -} - -// returns the fields actual name from the struct, when able to determine. -func (fe *fieldError) StructField() string { - // return fe.structField - return fe.structNs[len(fe.structNs)-int(fe.structfieldLen):] -} - -// Value returns the actual fields value in case needed for creating the error -// message -func (fe *fieldError) Value() interface{} { - return fe.value -} - -// Param returns the param value, in string form for comparison; this will -// also help with generating an error message -func (fe *fieldError) Param() string { - return fe.param -} - -// Kind returns the Field's reflect Kind -func (fe *fieldError) Kind() reflect.Kind { - return fe.kind -} - -// Type returns the Field's reflect Type -func (fe *fieldError) Type() reflect.Type { - return fe.typ -} - -// Error returns the fieldError's error message -func (fe *fieldError) Error() string { - return fmt.Sprintf(fieldErrMsg, fe.ns, fe.Field(), fe.tag) -} - -// Translate returns the FieldError's translated error -// from the provided 'ut.Translator' and registered 'TranslationFunc' -// -// NOTE: is not registered translation can be found it returns the same -// as calling fe.Error() -func (fe *fieldError) Translate(ut ut.Translator) string { - - m, ok := fe.v.transTagFunc[ut] - if !ok { - return fe.Error() - } - - fn, ok := m[fe.tag] - if !ok { - return fe.Error() - } - - return fn(ut, fe) -} diff --git a/vendor/github.com/go-playground/validator/v10/field_level.go b/vendor/github.com/go-playground/validator/v10/field_level.go deleted file mode 100644 index f0e2a9a8..00000000 --- a/vendor/github.com/go-playground/validator/v10/field_level.go +++ /dev/null @@ -1,119 +0,0 @@ -package validator - -import "reflect" - -// FieldLevel contains all the information and helper functions -// to validate a field -type FieldLevel interface { - // returns the top level struct, if any - Top() reflect.Value - - // returns the current fields parent struct, if any or - // the comparison value if called 'VarWithValue' - Parent() reflect.Value - - // returns current field for validation - Field() reflect.Value - - // returns the field's name with the tag - // name taking precedence over the fields actual name. - FieldName() string - - // returns the struct field's name - StructFieldName() string - - // returns param for validation against current field - Param() string - - // GetTag returns the current validations tag name - GetTag() string - - // ExtractType gets the actual underlying type of field value. - // It will dive into pointers, customTypes and return you the - // underlying value and it's kind. - ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool) - - // traverses the parent struct to retrieve a specific field denoted by the provided namespace - // in the param and returns the field, field kind and whether is was successful in retrieving - // the field at all. - // - // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field - // could not be retrieved because it didn't exist. - // - // Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable. - GetStructFieldOK() (reflect.Value, reflect.Kind, bool) - - // GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for - // the field and namespace allowing more extensibility for validators. - // - // Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable. - GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) - - // traverses the parent struct to retrieve a specific field denoted by the provided namespace - // in the param and returns the field, field kind, if it's a nullable type and whether is was successful in retrieving - // the field at all. - // - // NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field - // could not be retrieved because it didn't exist. - GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) - - // GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for - // the field and namespace allowing more extensibility for validators. - GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) -} - -var _ FieldLevel = new(validate) - -// Field returns current field for validation -func (v *validate) Field() reflect.Value { - return v.flField -} - -// FieldName returns the field's name with the tag -// name taking precedence over the fields actual name. -func (v *validate) FieldName() string { - return v.cf.altName -} - -// GetTag returns the current validations tag name -func (v *validate) GetTag() string { - return v.ct.tag -} - -// StructFieldName returns the struct field's name -func (v *validate) StructFieldName() string { - return v.cf.name -} - -// Param returns param for validation against current field -func (v *validate) Param() string { - return v.ct.param -} - -// GetStructFieldOK returns Param returns param for validation against current field -// -// Deprecated: Use GetStructFieldOK2() instead which also return if the value is nullable. -func (v *validate) GetStructFieldOK() (reflect.Value, reflect.Kind, bool) { - current, kind, _, found := v.getStructFieldOKInternal(v.slflParent, v.ct.param) - return current, kind, found -} - -// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for -// the field and namespace allowing more extensibility for validators. -// -// Deprecated: Use GetStructFieldOKAdvanced2() instead which also return if the value is nullable. -func (v *validate) GetStructFieldOKAdvanced(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool) { - current, kind, _, found := v.GetStructFieldOKAdvanced2(val, namespace) - return current, kind, found -} - -// GetStructFieldOK returns Param returns param for validation against current field -func (v *validate) GetStructFieldOK2() (reflect.Value, reflect.Kind, bool, bool) { - return v.getStructFieldOKInternal(v.slflParent, v.ct.param) -} - -// GetStructFieldOKAdvanced is the same as GetStructFieldOK except that it accepts the parent struct to start looking for -// the field and namespace allowing more extensibility for validators. -func (v *validate) GetStructFieldOKAdvanced2(val reflect.Value, namespace string) (reflect.Value, reflect.Kind, bool, bool) { - return v.getStructFieldOKInternal(val, namespace) -} diff --git a/vendor/github.com/go-playground/validator/v10/go.mod b/vendor/github.com/go-playground/validator/v10/go.mod deleted file mode 100644 index 21316b3a..00000000 --- a/vendor/github.com/go-playground/validator/v10/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/go-playground/validator/v10 - -go 1.13 - -require ( - github.com/go-playground/assert/v2 v2.0.1 - github.com/go-playground/locales v0.13.0 - github.com/go-playground/universal-translator v0.17.0 - github.com/leodido/go-urn v1.2.0 -) diff --git a/vendor/github.com/go-playground/validator/v10/go.sum b/vendor/github.com/go-playground/validator/v10/go.sum deleted file mode 100644 index dc7dec4d..00000000 --- a/vendor/github.com/go-playground/validator/v10/go.sum +++ /dev/null @@ -1,21 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-playground/validator/v10/logo.png b/vendor/github.com/go-playground/validator/v10/logo.png deleted file mode 100644 index 355000f5247d50e979cf5db5de38188ef4649a34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13443 zcmbVz^LHiB^LK39wrv|5-`KWoTN~T9%?&s9Mte8f*xWeZ`~Lg^&kxU>)6-|>Om|IH zcUM=vsybFxSr!?A009gP3|U@IN*z>Z{#W2&KzAW<*L_e0I`lYd#@osT8GH952<>}$=#%H%txCM^!YLYIPG*~?*PoX}XfpXD#$r$vg% zUJ@M8Sa6}E0bs?J()q&Aj2!Xx^!*X7wf45!j09TZ!t8tmiZrhYa~rM!hkOgG3jNOL z$t%hsiEZp{`uZS=pUq3db%5@e>LpqUR%RzF4Fp&XYtszH3NMj(x&yBfN!B@dDe(i*$ zFaI9z`VK(*+SzZ3Km$V|gFS(NfPUS&ND}#zKM&MsZR;zy@SJwDwy5moK{eH84yz0`{Dhd+jynpps_Wzr*Rl)ctU%7jk!=>D(g}(sK zP}YV(B1|d_4NeR~4qlx?36qk5ng9u-wt+@fOTlvqhk>WQ%HxtjxBspSS(-6OpP;_x z73LX72W9oA=yUj&B*sjt0z}2U44ACNztdo!tbwR&pl8vCLjf!@HDwcP;p{h$JYsrk zE3Pp7L^A>!xwNPSX+2zrQgJ8|CCr11n`u|=C}{? zlHLN%{DxBD;+;&!6Se$BciUB@EQ~Y8_ZT-Q&4p}|A3l`R=AVR9Kt+V~a3a3V{l=)gHBK2op+X}BW7o(X1K2eRTZ^; ziO?#OmuWkXeCj2*{H(1C#qnQ>tz|Kq>*#cF7g)+?3G3(pVB@N37)9YHmYxa}CVb-% z@SHf5CnrEMiI6-&fkkOb9ema$%-Ld}qN54xNf|CDt?#e@Aec&IEcEEpu3Ak5Y z>0@s)b7yHEr~UCsek0JVuF%66MBgBxj-d!wQu4Evlx;p|pZG{&=4VV)*pIE{{f=SO z;V$)QC5ae=-6(Nc68{(S;2ymNVxIiwAs9}A@vA2?55kfV(qK>S6caF|bywd&p8ydL zB}xJ~6Di7u^Xl{s1E&b!{FXH0#>1$=MTNA7+vd;Pm*#B`iYRecX>5H7^iqDqQ{GQH zKNNh0?p}h?nEjh_Ft*^M`+(a;L*rKgPp=E!!}stvVxG|YKY=Yh25?+RloCoyT3T~2 zr1!?YL58}YTlyj1sTl_H(oBl48zJPwJFr9|r(>T7Npe$Hyl7Pm(dZ}|x;n!X(4wtZ zeNCCz4LTygy(gl;pV;dp+-Lpq=weiOW2Z_Lt@RNd_s43tZ>$@23^%6`T}rfexq!%# z)e|oR;kRY~2fW@V(in6QZzE*6TubN0<>|v2xiX)v6->d$no+&np8 z=DZPj>yPVL2Y2U^MJuW`R8R{2@Rg&}`S+$yEgsGihuW$3 z2y*A5Rm-TCh*xaY#R1q)HfzQS_%fPHCL7200}u=S#u`m zvW%z6F_UcmBq~g~s|d}v6$Q?noL`Z(X;@Q$i>kw^bF}I3A8QQyAE_nz-`H~a9o2}- ztPUs0q(DTZ^Yx3oA6C5I?{nHCX0qfW&C2r}h~~slhe!$_Hh1WB`w?_|D{JsF#zpgf z;F^yDTZs-$?`myzyDj@=x}@L4b~_KtUWzV+uiL${48Qh^ZdoywlRNR<*WLFY>v0fq zeWQS`g6{8q<#x){FrCbZlcTAh?+fw^gB-2LpRnlF^}`$D;(KxTOLn;dXs3Yl(uW$g6hyw3{wZdTVg|kdSet`n+SACG=!&%#r zl+Ha_MzD$G>iQb%tW~Uus7-zOMPI__Qo92dK3VKkGgR#;-!`uw++~l5J?MT+BUCv3 zcItfZO)uKXlipj1XD?F|>3frjQWA;$JV>TcHHrcrR=Ql;-B}Bb4;f|uVo(S7xL(QP zE%c8{bnchCJ%aG)3x8gx0`Hqq`eapfWqK`~Ec6Mea`v0{J?4~x(S2D#-7sMBR1X;{ zO-QlMUsyD!#jI^8v6y2J8TinHz_zsU@;3|?TfT0F2b2A7aX&aEQGc;IZ>UV*cToht z27rX9TA$h1ZMxk`KX|$6o$)=$PxIM3k^FhGmiJMaA3fBM6(M#efLJ9ucfbo2TkroP zxE4Dv?B_Nkef;0LYVj3nk|C9-MLv{y^-tY`SD(5phR2KMn}9@?I@SQ^#m* zu>9T8l>)311+yf)qc`Zp%3Cp9FS4PN18t5zZGy-!{f^5eJQA&Fb>Llf4kF^OZ}Tu z=jyadHyzlQLaf@_eAf{CFb}_v=Gj*BLc$VrMAe%hAL@6JaXkt^p&>`#SXjBAX!3#; zZ(sPdwtkoS08=HP@lruhHm*fIlu{y~LTu@+@;u*LBUU~nbQ7S{eH09xc5^_Xtu!q@ z6^P#P!A-(qwW30Th;TBWNp{b1+lP1D!2Y2In`HJ8=DTs8;1)Y~TE2Tco&agHaJGJRtE&{R2y^@Gnpny|$qxXc2=Ps$@$~9mxET{1Q$%i!i#frlzo0UOe_Y zMxNvLk98G99Jhl+-rMB_{OyQsE?70nTDUTZf%>P_;7WAz0a+FG*4EALUD*p3UWt_( z3yZrIM%L#2dleC=K}bD*)-@4195ctqtgM0iQACxJ?F&0O<{t?%^dK1pMJo*-dHj;E z%Vt=-^pa?Z(eb%_rx~$m@yuyvX^t!IvZZ&&LJtY`#;x+PXT-Gb~(3>gv;tf~4N37#aCX z-tW%A@AM^Cf&WBJl*|wp9s0RGq_rCL)=Klfe3e8BUY|7FGZM)#ZdT04zyZ#{*|<&8 z+dsxt9B+krqDfJbykPO==|6C|yAi)*jkV&C{Du7Y#drV0`{jGeFSFOANIz#B-ncz= zB?v}IR2j5eCJ`2>yNMN9<}h!(e$i><|KSPd(Ff^lC-7pg&G~QJ8T0JD-37gq1-K+V z;1?GW_CVrGX3V0m%yvW#+uGLl^01=9zyGrgZ5fJ6GeeULS25^4)YCL=-Z!w`r$tH= zj-ikdG|nI;y1wvvk2)h7^hL0Xvnxw)Y1u}&9Vv%k1};Z0IqW?AQ8)B@QOUa?ayt31 zX^`u?pa(0F6YpbrT;e2^auw#%0BX_ub?}_ieYF;4rGRd*1_vX-+Xv9I&yR@ zZF(3;`kXg0vHdTn$5Ie;gpS4@djPPJ60-Z_1?!DwQz9NO2jKDbkZ^oJbQVc?6v#&0 zAW|kWVx3>tw#eTFT> z$S^|&ZWo)7Lyes7r)@VL=2A|$JW1nr)ed9~F&(_uHC1f;YO_5oj&Afj!0(9M)7c*f z$rra8Ji?1Bc%e|v^CcS{(B7RRCc7Wrrs=I7)f#8IE{rDM)o~`?Y8!;pSaL!lLHCZ% z2RHV1+l?QSk}_AkH)`_s#(xKJ?jwKC`csy*aOGtV&`hmHIG<5hXtzm+=iQkb{pyZ< z%;RxAP~z<%lTo;vNWd4mn;*jW+1tVM*tJ0j)}5|LR4#M7r{PkXJaW;yHBr@9pIuiG z8V1M4Ci1&Z6T1I>(C@#6rJT=}4_MR%kp=0LFD)iInpDCFQ;rm ziA+yF-c%|NyQ8);!vM6)#xu8qylq9(nieBl!@e}S5}R@)8LEU)Q|o0z)Z3vP);l2n zvCG7gtlR2XtjF1}fhC?!r{BZ4#sNRJi-Kgt?Rd(rePR;wmE}rqM-z^#fA_=ptrRR~ zqS-A)prf=s19gdfPBn?#&j;!a+e1!wX7|RMt|@0KQ_^z7My)2imN}+? z&Ro$-#EC#FN(11}WJ|$X)eQ0hf7Xye3AhvowX$0|1+x+uY~g?ccTKswq+io;vFNd6 zr7#C9z4;>@b-tg$UzV@9U5hK{mDW{6%YjDa>FJu9Z8hZyN}pshPN=W>uI!^Q$kMqm z+}IiQA9sdYvoB1IiBfX#m0axM;6c8}N>K$tD8kW56>r1h5t8J!3X0YAj1|Aw&~l@A zxf2^V`F;A0W?i!7*yQ+#;?4!!1ZQrBEI$9+-N z6P_sTrV&}s7MX}77Nq}~KmQy&5T&0ZWX--y(<$MEOLGIm!7k)jQOWggN0!Rg^`Bj3z7;;PquhhFnoqJeAbUfHR~d2;C{_De_Ogp81i65*qU(X5fweyv+B#w>RW0 zm&_w7Zm z`YWfGxm^7MK^A>0nDITy;gz^Lzudv@BC>+^JOVExD%|?aa0W#9qe``&CHjF6vqV zB8&tSqdhz{r4(|w3!g-DZKg>^k=!a74kk`D{P(2>&R~8kXP)^Ns3jTlnM7|b=I@?W z*3YW^eW^H83@t)lUE4LAm#(ICbAZTgW?ohHU;Ok91QJvMGp6fHL|&TQb|ICaXi{OO zrD__`B5>e)a6orX^!P5CsJZqQhI9-E6v4*!cC1vUi2?G|44quG+rfLS+7ZX;meFoT zMa+fb0pH+x{|o<7L^;cM5J4}K*7m~l#N2_qa(YL%G9rt7(fo;z(CaJOODkCKPA9`Bop?dIYFl3wBU&l zdqN~tz4k#i1&+HT_N>0Qm%uxG;}xqfaciIXXK|67VNTu0yzMz6pt6)m~ z7y^EZ+(wMlK9yMiwkhp&>cmXQoRzGf`o{MmkrGaxJY*%s0Dza_WczOvC8IXtY4zGE zoAfaSy~MQoF^;l5RWb}DJq*S_&wp|_lkCAaR~iQkooeXo>yX+1hRw(?%#&k0 zm|IG1?>%mpBmLr(*DC>|Vr>bN;nKsdZLlS4*_h%G1n`;;6|sE0rg^T9KG)Swoz!z& zJra776~H1@daS@C;jzI*0~;x5(E1Fpo!nLAV=SmM;Q>*#bxdaC<;wO{!IV4ONwN}f z8NK=|T>UjQ5%%_C3KAVb1}wC~Feno-GH|l>&?HI*RX~t*0XtJ~S0R6Kst$kD*7mw& z{mR31-KopNO5bKJqku0*PjnBKFE_1y_|tmDtiN7SF!NZpwNb5#sV6w^bu9#1B5K7# z0N}))422cqc#^(uW?wJU*^KLe?VU&(*c6j;U6^LZcQoK4POU1{yKSH^?k2$VGLEWB zog!7!3_Kl%apr)=%d3Rpw_4BDLZf!1tIdN&D;Yg?X2&jp0vSBqbz)XX`Wu2%`IWJS1s3lhZ7H--?PJxQLg$XONw$8qE z@4G(S5}8yFwM`{Rdz9E__ZH{{Gusj%$t#w4+ac&G3wkM0n&qZPP}J9r*av-Zq- z%NdhH1sgs~Oq9{PLkkxDiK6MQo36OTZrr&F7k6+F*a}5hV<;1u+B`QQSF#ti5`pI3 z@gvRFovLjNAri8~54co-plD$yQSX*b95r9t@B%~eI2r9NqXw{mGRKtdG5*|wk~yO zW)?msL*Rlpy{X4OLKx;RTX5`t1RY4!(bJ`a7rJ?=xM7fwcCL;k7j%-*cj9NLfbojM= zsFk;>hWcz(m*MFBO66YXrs>D4!BqdqWy_oZ>c&}P@|L*1a zVk(-?<3wy?;t9XLM*dyTj^XbicaVIM%BJouomO8jaqzV51LbTf>Ywq=#cXFtO*-oC z$O(ezf}G*);p^d{5Cc9apUxWE7RHp-F$ne9h?~C!5ok6%glp3JFOLJd2A-Fm@I}Id-s z30mMGUBh}2LTd&+z4*b8fB8hNy+ke`kmJbFXYm9=Ud96znCvs;Xa*GB`{*jEPp($~+DX+RP*)$prD03Z~ zot>}r&YE}7>5Wkie5E(*NC^ihU`EdF6Ezw%Y_=C72{{2}2gipm z*Kp)Aa`c2J&xYYZ876z^z{Zt5pR2|?72(fT&g8MYt4OgJ8>+ZDr_oB=>9xhEw%27Y zdZWI$a9GrD@5Los+iFbyl507c-TMRH3x)MMT{uczOKy3!ra7;z>2})#CRqJW`Jr@s z)uA36KCgr8c)q);G>N2B3p4kyV4NWuoxzls;Xqq+eg~fI$A3otuea;KAQGd#L@`_H zA12vy0BVLhln8XMstlX5M43pjjcZzAO3GUc$zV-2^wq;7JE(EwPLoa!*2(XgxwSlx z2_J0xvN3`hnHWW^kuO7z`%AW8B~t4yhgSPHzS%y%$=}V7s+fZJ0#{k0^O+*L0|Zg4 zfX#xMrgl!s6Xo=iNk_&jq83fy!YAvDSuT8GO6%m58Pi*2YUR|;TQb;TdN=rqTpKIZ z-p&;$N{lIA6N##--%mV~CtEEa4=)@J`4YoT@$9}xH&qcX>lvW>wj*s%n1(JbS$r*d zK9ca~LMdTQ7v!Y34Q6Zh;50&tLX-E@$j3m@9%{iLEyrjeeM_lyMFuI6_pPMcUemdp z%6;iM!PP84B5GQ70B|+R^|BqipYC7_%BZRXP;eo#KZ6EBvBzlpn}@P3p}|8#I(4 zul0x<>TxI(s0g?8v|a89+n1)Jx##kH*g@FY*niUw?{Sqmm)Xi-;WBKlUieBT&& zR3bfdZ|yI{!e~+H2q@uF@=N3k*$H|RZpj@5hvmw~_Py+wV14-k8ynOVi-{@1gB;!g zop(C8F2W!)$gD|@VYtF3M2`gl44ny?45baF7yCBl4PB@{E_nNFz6{2b zr3nxXdd~S*FLLzzO#wytqw(3PI0_%D56fEkMQPca=JX$gqH9aJ{ZpKvk8&kz zVxpVpl56nj^P5R4Lm_KK_6WeFW0cD?IY zZu%H?$YfA5eBYF>2g^}+ig>LD^PgW_C#jRJ$|LNXlubK_b)pT9uqy)nlg?;4DG*(P@1w56aN4^TZM6bWUyCM1*1Czy}HIA#1w25=*y73 z^<0dmnQg(qFmL~t3lPYXx1H8~Zxg@d(x{4t40F=4{->PSRp{RzUszJHDlXejc7G)lY;8~fKsU-hk(590&9v& zFxr}ZKJqco?V2qb5bnkeLoQVbyu32=?$Kwh?;N0OiGN|7=6`RkdoJ(JT@djZ8dUCb za?z#~&v8Fm?V}L${Zr&aQ8JC0EF>X56u4pkjt-w^+1bG$r9f1OrJ$<6qE&iV7_}kN zQweT&?sbJOanV*#E0|bLjkCC(vOm|{V<5MsimhiSt-uxzjxz9SMUvMQK{`~RZ+v_m ztb%l8kCZHm@?oa?Mb$L;Bv2$(K*V=w5SD>$*ITQ!W*n%SOXJlQO>pLoRxLI#%aHpA zmYUE<8T)d$P6F=j$+`7W&dSV^FR;c5cvU=igm6$Q0Bz?EE|?msF@JEX89DoMOUuTr z`R{3)%|h-VtA7`wTgs8)s;PQ6$6IvQTsUzrO=Y6G!D)=Xx9w0$Gba6n1y?{dK@SoK ze54vzFH|9D2~QbpUTb_H)IYDfa|J}Lq9?%CFHbsIB8(vc1WUKbA`4uL=6b&iurle2 zi(4jg{2hA5K*7uKNnBA0KV4x*3NO0jb^QuEWV&39?%#Ve9aEQ)AWUUwycBSf_o%|` zTcm^fRU(B}U8I(N*#z&8fsGAkKpBAt5@UnRa>N{07@%qaw@bs$K2R5VP#c$2^Q%RQ zVuW0slT(*~U8kk?duR;_jOTpmwrrbx->n}JX^_|@zO|a)Ik@>X7HOQ(!z(#CF@`^7JGf2aEfn1S0v}oHKo%uVUMDjl3<>f#kD$hfw(^nW(aRB6AaG-TDAh%oHjEJ=J$;2s zNEtTUsuZa{ji(_8)1j8gUOb~B9fXBSc)M%Hfsu<`&aJGt{{#rePUQ zno1K;1#~H`?Rd#V$}MtvkS~UOgsP~@^u^u{ua{D3V=Fa{2IKwI7>|!cOUteP#X!Z_ z0=9Z(Y!#lhZpJ0TKxMl6%R?6~lt!EvNztb>dbADO5-ZkYS1f(TlqF6|c^Euh&Dojz z>7lTs0ClkTp5>|*~0 z_E{QdSna;}KOcu@*xbF3xyhffB&XIT`p{6hS*F))v#>=YEtJB9Cr*b2YtK$qd9@hS zP$+_%N43)URxgAF_fx!4#yRV$Y6W06mtQ<`6RwW>A*AaHVyEylR` z2)a@71;tKHeL9Ik*CB!~)Qw;=Fl6gGLG;?;LTeerep>@XsgVh4FN73z`?Z=yj9;v% zBxr{}l;h6)J_enD_Xs$w_!zAMpK(;B2{L7;9924=)DeQQG^=eR>S_sq&5Q6tF?!ZR z5Qknd!5HirCsnTIK}aSQLQ_)EQtb#JSG@QUVD}mpOr(idOXutsza|QP5K1WjdsWrs zkY855Sph`j8nzw^f)v# zwC?)Bwo9-}lWq~G9ow>)3->q?FnXQ<$)Y*Vq?hu8MmH8aL1yGrPXCBBQZxc2c}gM_ zazx&=nWtc(!DSU&y7M>VVWHK|f42Z4$ zgM>V`3TB$s+ZXAeFq65x>B{Mdc~^YySq_px;%mpmr2Huz$C}=8-KJN$50%RxgBJ`5 zP&~~O#I1B_1NXRe11=!ZG+8?m1fW)N1v3M~LuJCB_sLZ){E+CtNyJ{zEW!m2t6~4F z%H681*4phFkdH+Wb0LC&2rz`YF05QDpj#b^CS9c1iNN6yizQhsjIRb7ouDlN!>cKa zg7n0;K8z}XHxXi2Ecua32b&VylFo$*L~5$eud(~1>99o0y8R!-= zN_$<&9xytjEu>6segSMd2}6=@3VVB@GhvK>e5(3kr&=sV&}-F69b-m9?Ip^S&_1rK z)REQFT(LR2P6B9EqR$$Fjhw z@@PRbM9s{1I>jgtQ$A{Too_2xnL(GQD!IAjpSUUis4yB{sY$2}MT}d+!IfS_pu32*B z(%fM}`E)&K1vl5$L@*MaDwYf>96D4c;kb|PKTS;+YgrY9Ko@0Q)3$VlDZzF2D5qzp z3ooIC#iZNaZ8P4)aA|hlnC{a}TPrb~vTu2a+lFss)C;W1zZ926mndG{GXR|B)WfV} z(w*ugyn0Rs7_}^z1)X+M+)NXwrEUSMFwNFX_HD7RuV z!p-X54t?QhInx8)RxXg9Gk>_MaF-=XqAoa3dpy^>ZnMr+Cdt={MR4L zlI?2b=gsG3&Ijqpwy~pkv)Y=9n_|E|4ghMbhOV!U-CR;Kg+YdeFwVdfiyc*SZ33P= z$^Lo3LKgdGzEro#sbQm;1h}cbE=gD;VPV$RSAC(NX#P3$r*wNcQV1ac_8s?7<*v7Pd5{UE zcj<@b8s(}ugB+l6X(Y2RciZYZr@$lnh&EYVD&Q;@IV#m~)&N`>i%eC8QGg&uMXI=s zQLp~@6So9V;*{|ZngyWwRLWwzOCrXEh&`MazZ2wm)kNAKFDMMTX_jGA!oO_hJ-YRa z$^tLI^PHPVUu(o9eNPBKBkY8oY*JvIpawcN$Hq>rF`BD0kq%ngOwjI!^ei&^{U1>= z!^&Yoa|y-vSLjPKIP(7C?$zHcE6TomiB6zAM~x|S=v76w%>=hQ$rVordZSPGH_r!u za~NE4L)9W;Zi;ur8=N=;g2x`9ew-T?zd44CWDowkmcCKC2ZEkwyy{Cgf?DBwA)VTz zfJ;~J*q-_{>l2=#Z#w%BHa5yiZUb#89mRN|$!s*X41Sj}m@%Y%D8!j#oex}HpuLkT zi_70a875WHbj(&5q=Cb3*-Fn-b_=@DxVxh?M%~C#aO%I9A zfDhFlS)5h5m^sgc`qgo&LB;4CbJ+4Do$EQJL-i45cQ|%b4D${*iHS6$Z!lFja4{Z& zm_cQ;+$jmX_Ipjb?|qoQbz3TEQd@UgHO-t8i&2#uH*%Y+@t8HptKD;^>9mRb|w53r?9PIIfP$v|io_ z*cIdNpF96_?%r4O-CUdtgPsVgQ7~>`(Iv=~Vz&=N0I0@6UyQtkp156a;eRI#QPSg> zAcDjr+gD33>K!@@N;gSJr1%xowp?n{?=lK{fWo0V0xrMs(WD=)!hLrQ-FS z@!mYs_Wz~@&+paJijML41V^ce^;23KtbY_xNJKz@7&zTeFEoHm7;$(UI=YQFs#$@ptk!EQ42Y4FfxEf@TOsVt37 z}4AVbnC9Ri){mLjd@o@_vA;wzpV8G_ypN3Y=M08M6ZfM2Xtkpu^=A9}u!A?A z)0NYU%Y#TSSE#tnm?KTmo4 zd|UY(Tqjl;m?`7^R${$QG*ZIW=)p?(%lWYXyf8k9{rdP=)z$ty1cAPSJfgXTOPXN1 z^D-Pknjk$jWsP@0+o&sn#8=lA=)a-i-j|YE5DwZ9s#vk3w-c?}%C?C;Q@<(1;-i>L zl}SN#MAX*71GGR14&RiPaHe@3srrMMPYHjml+|aGSDU_fRi{h1_NlT;MHYR@D(IR3 zt6;N#m)Tdz?)V=$7s!&Z;ZdmJFd0m>InR~Umqz^)eM=coLx(q4tw%~Z0U73ho^=Mj zF)fREGIOlh6`*ARYk?K%ir!a_Yvw9snW){J#zyP<3!#qD8Q_2~d|so+(Xc54smil}_4kGqEK^l7mVKQmM+ zBR70H=a2QXGB!3jg`P(Kg~lE^KQr-y_EVJi%}cMMzb+f?)6-|yp{QzpZdk)-9EhXzQpEZ(ZuvkddnL`d4Y{JQ>J+Eg}}BSGkUqgbqYuem+;8++@MM(|;Eh?pTI_O&4Gy6PBOnIB)^cWfo! V^Rh-@K?jDw` - splitParamsRegexString = `'[^']*'|\S+` -) - -var ( - alphaRegex = regexp.MustCompile(alphaRegexString) - alphaNumericRegex = regexp.MustCompile(alphaNumericRegexString) - alphaUnicodeRegex = regexp.MustCompile(alphaUnicodeRegexString) - alphaUnicodeNumericRegex = regexp.MustCompile(alphaUnicodeNumericRegexString) - numericRegex = regexp.MustCompile(numericRegexString) - numberRegex = regexp.MustCompile(numberRegexString) - hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString) - hexcolorRegex = regexp.MustCompile(hexcolorRegexString) - rgbRegex = regexp.MustCompile(rgbRegexString) - rgbaRegex = regexp.MustCompile(rgbaRegexString) - hslRegex = regexp.MustCompile(hslRegexString) - hslaRegex = regexp.MustCompile(hslaRegexString) - e164Regex = regexp.MustCompile(e164RegexString) - emailRegex = regexp.MustCompile(emailRegexString) - base64Regex = regexp.MustCompile(base64RegexString) - base64URLRegex = regexp.MustCompile(base64URLRegexString) - iSBN10Regex = regexp.MustCompile(iSBN10RegexString) - iSBN13Regex = regexp.MustCompile(iSBN13RegexString) - uUID3Regex = regexp.MustCompile(uUID3RegexString) - uUID4Regex = regexp.MustCompile(uUID4RegexString) - uUID5Regex = regexp.MustCompile(uUID5RegexString) - uUIDRegex = regexp.MustCompile(uUIDRegexString) - uUID3RFC4122Regex = regexp.MustCompile(uUID3RFC4122RegexString) - uUID4RFC4122Regex = regexp.MustCompile(uUID4RFC4122RegexString) - uUID5RFC4122Regex = regexp.MustCompile(uUID5RFC4122RegexString) - uUIDRFC4122Regex = regexp.MustCompile(uUIDRFC4122RegexString) - aSCIIRegex = regexp.MustCompile(aSCIIRegexString) - printableASCIIRegex = regexp.MustCompile(printableASCIIRegexString) - multibyteRegex = regexp.MustCompile(multibyteRegexString) - dataURIRegex = regexp.MustCompile(dataURIRegexString) - latitudeRegex = regexp.MustCompile(latitudeRegexString) - longitudeRegex = regexp.MustCompile(longitudeRegexString) - sSNRegex = regexp.MustCompile(sSNRegexString) - hostnameRegexRFC952 = regexp.MustCompile(hostnameRegexStringRFC952) - hostnameRegexRFC1123 = regexp.MustCompile(hostnameRegexStringRFC1123) - btcAddressRegex = regexp.MustCompile(btcAddressRegexString) - btcUpperAddressRegexBech32 = regexp.MustCompile(btcAddressUpperRegexStringBech32) - btcLowerAddressRegexBech32 = regexp.MustCompile(btcAddressLowerRegexStringBech32) - ethAddressRegex = regexp.MustCompile(ethAddressRegexString) - ethaddressRegexUpper = regexp.MustCompile(ethAddressUpperRegexString) - ethAddressRegexLower = regexp.MustCompile(ethAddressLowerRegexString) - uRLEncodedRegex = regexp.MustCompile(uRLEncodedRegexString) - hTMLEncodedRegex = regexp.MustCompile(hTMLEncodedRegexString) - hTMLRegex = regexp.MustCompile(hTMLRegexString) - splitParamsRegex = regexp.MustCompile(splitParamsRegexString) -) diff --git a/vendor/github.com/go-playground/validator/v10/struct_level.go b/vendor/github.com/go-playground/validator/v10/struct_level.go deleted file mode 100644 index 57691ee3..00000000 --- a/vendor/github.com/go-playground/validator/v10/struct_level.go +++ /dev/null @@ -1,175 +0,0 @@ -package validator - -import ( - "context" - "reflect" -) - -// StructLevelFunc accepts all values needed for struct level validation -type StructLevelFunc func(sl StructLevel) - -// StructLevelFuncCtx accepts all values needed for struct level validation -// but also allows passing of contextual validation information via context.Context. -type StructLevelFuncCtx func(ctx context.Context, sl StructLevel) - -// wrapStructLevelFunc wraps normal StructLevelFunc makes it compatible with StructLevelFuncCtx -func wrapStructLevelFunc(fn StructLevelFunc) StructLevelFuncCtx { - return func(ctx context.Context, sl StructLevel) { - fn(sl) - } -} - -// StructLevel contains all the information and helper functions -// to validate a struct -type StructLevel interface { - - // returns the main validation object, in case one wants to call validations internally. - // this is so you don't have to use anonymous functions to get access to the validate - // instance. - Validator() *Validate - - // returns the top level struct, if any - Top() reflect.Value - - // returns the current fields parent struct, if any - Parent() reflect.Value - - // returns the current struct. - Current() reflect.Value - - // ExtractType gets the actual underlying type of field value. - // It will dive into pointers, customTypes and return you the - // underlying value and its kind. - ExtractType(field reflect.Value) (value reflect.Value, kind reflect.Kind, nullable bool) - - // reports an error just by passing the field and tag information - // - // NOTES: - // - // fieldName and altName get appended to the existing namespace that - // validator is on. e.g. pass 'FirstName' or 'Names[0]' depending - // on the nesting - // - // tag can be an existing validation tag or just something you make up - // and process on the flip side it's up to you. - ReportError(field interface{}, fieldName, structFieldName string, tag, param string) - - // reports an error just by passing ValidationErrors - // - // NOTES: - // - // relativeNamespace and relativeActualNamespace get appended to the - // existing namespace that validator is on. - // e.g. pass 'User.FirstName' or 'Users[0].FirstName' depending - // on the nesting. most of the time they will be blank, unless you validate - // at a level lower the the current field depth - ReportValidationErrors(relativeNamespace, relativeActualNamespace string, errs ValidationErrors) -} - -var _ StructLevel = new(validate) - -// Top returns the top level struct -// -// NOTE: this can be the same as the current struct being validated -// if not is a nested struct. -// -// this is only called when within Struct and Field Level validation and -// should not be relied upon for an acurate value otherwise. -func (v *validate) Top() reflect.Value { - return v.top -} - -// Parent returns the current structs parent -// -// NOTE: this can be the same as the current struct being validated -// if not is a nested struct. -// -// this is only called when within Struct and Field Level validation and -// should not be relied upon for an acurate value otherwise. -func (v *validate) Parent() reflect.Value { - return v.slflParent -} - -// Current returns the current struct. -func (v *validate) Current() reflect.Value { - return v.slCurrent -} - -// Validator returns the main validation object, in case one want to call validations internally. -func (v *validate) Validator() *Validate { - return v.v -} - -// ExtractType gets the actual underlying type of field value. -func (v *validate) ExtractType(field reflect.Value) (reflect.Value, reflect.Kind, bool) { - return v.extractTypeInternal(field, false) -} - -// ReportError reports an error just by passing the field and tag information -func (v *validate) ReportError(field interface{}, fieldName, structFieldName, tag, param string) { - - fv, kind, _ := v.extractTypeInternal(reflect.ValueOf(field), false) - - if len(structFieldName) == 0 { - structFieldName = fieldName - } - - v.str1 = string(append(v.ns, fieldName...)) - - if v.v.hasTagNameFunc || fieldName != structFieldName { - v.str2 = string(append(v.actualNs, structFieldName...)) - } else { - v.str2 = v.str1 - } - - if kind == reflect.Invalid { - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: tag, - actualTag: tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(fieldName)), - structfieldLen: uint8(len(structFieldName)), - param: param, - kind: kind, - }, - ) - return - } - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: tag, - actualTag: tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(fieldName)), - structfieldLen: uint8(len(structFieldName)), - value: fv.Interface(), - param: param, - kind: kind, - typ: fv.Type(), - }, - ) -} - -// ReportValidationErrors reports ValidationErrors obtained from running validations within the Struct Level validation. -// -// NOTE: this function prepends the current namespace to the relative ones. -func (v *validate) ReportValidationErrors(relativeNamespace, relativeStructNamespace string, errs ValidationErrors) { - - var err *fieldError - - for i := 0; i < len(errs); i++ { - - err = errs[i].(*fieldError) - err.ns = string(append(append(v.ns, relativeNamespace...), err.ns...)) - err.structNs = string(append(append(v.actualNs, relativeStructNamespace...), err.structNs...)) - - v.errs = append(v.errs, err) - } -} diff --git a/vendor/github.com/go-playground/validator/v10/translations.go b/vendor/github.com/go-playground/validator/v10/translations.go deleted file mode 100644 index 4d9d75c1..00000000 --- a/vendor/github.com/go-playground/validator/v10/translations.go +++ /dev/null @@ -1,11 +0,0 @@ -package validator - -import ut "github.com/go-playground/universal-translator" - -// TranslationFunc is the function type used to register or override -// custom translations -type TranslationFunc func(ut ut.Translator, fe FieldError) string - -// RegisterTranslationsFunc allows for registering of translations -// for a 'ut.Translator' for use within the 'TranslationFunc' -type RegisterTranslationsFunc func(ut ut.Translator) error diff --git a/vendor/github.com/go-playground/validator/v10/util.go b/vendor/github.com/go-playground/validator/v10/util.go deleted file mode 100644 index 0d3a1810..00000000 --- a/vendor/github.com/go-playground/validator/v10/util.go +++ /dev/null @@ -1,266 +0,0 @@ -package validator - -import ( - "reflect" - "strconv" - "strings" -) - -// extractTypeInternal gets the actual underlying type of field value. -// It will dive into pointers, customTypes and return you the -// underlying value and it's kind. -func (v *validate) extractTypeInternal(current reflect.Value, nullable bool) (reflect.Value, reflect.Kind, bool) { - -BEGIN: - switch current.Kind() { - case reflect.Ptr: - - nullable = true - - if current.IsNil() { - return current, reflect.Ptr, nullable - } - - current = current.Elem() - goto BEGIN - - case reflect.Interface: - - nullable = true - - if current.IsNil() { - return current, reflect.Interface, nullable - } - - current = current.Elem() - goto BEGIN - - case reflect.Invalid: - return current, reflect.Invalid, nullable - - default: - - if v.v.hasCustomFuncs { - - if fn, ok := v.v.customFuncs[current.Type()]; ok { - current = reflect.ValueOf(fn(current)) - goto BEGIN - } - } - - return current, current.Kind(), nullable - } -} - -// getStructFieldOKInternal traverses a struct to retrieve a specific field denoted by the provided namespace and -// returns the field, field kind and whether is was successful in retrieving the field at all. -// -// NOTE: when not successful ok will be false, this can happen when a nested struct is nil and so the field -// could not be retrieved because it didn't exist. -func (v *validate) getStructFieldOKInternal(val reflect.Value, namespace string) (current reflect.Value, kind reflect.Kind, nullable bool, found bool) { - -BEGIN: - current, kind, nullable = v.ExtractType(val) - if kind == reflect.Invalid { - return - } - - if namespace == "" { - found = true - return - } - - switch kind { - - case reflect.Ptr, reflect.Interface: - return - - case reflect.Struct: - - typ := current.Type() - fld := namespace - var ns string - - if typ != timeType { - - idx := strings.Index(namespace, namespaceSeparator) - - if idx != -1 { - fld = namespace[:idx] - ns = namespace[idx+1:] - } else { - ns = "" - } - - bracketIdx := strings.Index(fld, leftBracket) - if bracketIdx != -1 { - fld = fld[:bracketIdx] - - ns = namespace[bracketIdx:] - } - - val = current.FieldByName(fld) - namespace = ns - goto BEGIN - } - - case reflect.Array, reflect.Slice: - idx := strings.Index(namespace, leftBracket) - idx2 := strings.Index(namespace, rightBracket) - - arrIdx, _ := strconv.Atoi(namespace[idx+1 : idx2]) - - if arrIdx >= current.Len() { - return - } - - startIdx := idx2 + 1 - - if startIdx < len(namespace) { - if namespace[startIdx:startIdx+1] == namespaceSeparator { - startIdx++ - } - } - - val = current.Index(arrIdx) - namespace = namespace[startIdx:] - goto BEGIN - - case reflect.Map: - idx := strings.Index(namespace, leftBracket) + 1 - idx2 := strings.Index(namespace, rightBracket) - - endIdx := idx2 - - if endIdx+1 < len(namespace) { - if namespace[endIdx+1:endIdx+2] == namespaceSeparator { - endIdx++ - } - } - - key := namespace[idx:idx2] - - switch current.Type().Key().Kind() { - case reflect.Int: - i, _ := strconv.Atoi(key) - val = current.MapIndex(reflect.ValueOf(i)) - namespace = namespace[endIdx+1:] - - case reflect.Int8: - i, _ := strconv.ParseInt(key, 10, 8) - val = current.MapIndex(reflect.ValueOf(int8(i))) - namespace = namespace[endIdx+1:] - - case reflect.Int16: - i, _ := strconv.ParseInt(key, 10, 16) - val = current.MapIndex(reflect.ValueOf(int16(i))) - namespace = namespace[endIdx+1:] - - case reflect.Int32: - i, _ := strconv.ParseInt(key, 10, 32) - val = current.MapIndex(reflect.ValueOf(int32(i))) - namespace = namespace[endIdx+1:] - - case reflect.Int64: - i, _ := strconv.ParseInt(key, 10, 64) - val = current.MapIndex(reflect.ValueOf(i)) - namespace = namespace[endIdx+1:] - - case reflect.Uint: - i, _ := strconv.ParseUint(key, 10, 0) - val = current.MapIndex(reflect.ValueOf(uint(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint8: - i, _ := strconv.ParseUint(key, 10, 8) - val = current.MapIndex(reflect.ValueOf(uint8(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint16: - i, _ := strconv.ParseUint(key, 10, 16) - val = current.MapIndex(reflect.ValueOf(uint16(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint32: - i, _ := strconv.ParseUint(key, 10, 32) - val = current.MapIndex(reflect.ValueOf(uint32(i))) - namespace = namespace[endIdx+1:] - - case reflect.Uint64: - i, _ := strconv.ParseUint(key, 10, 64) - val = current.MapIndex(reflect.ValueOf(i)) - namespace = namespace[endIdx+1:] - - case reflect.Float32: - f, _ := strconv.ParseFloat(key, 32) - val = current.MapIndex(reflect.ValueOf(float32(f))) - namespace = namespace[endIdx+1:] - - case reflect.Float64: - f, _ := strconv.ParseFloat(key, 64) - val = current.MapIndex(reflect.ValueOf(f)) - namespace = namespace[endIdx+1:] - - case reflect.Bool: - b, _ := strconv.ParseBool(key) - val = current.MapIndex(reflect.ValueOf(b)) - namespace = namespace[endIdx+1:] - - // reflect.Type = string - default: - val = current.MapIndex(reflect.ValueOf(key)) - namespace = namespace[endIdx+1:] - } - - goto BEGIN - } - - // if got here there was more namespace, cannot go any deeper - panic("Invalid field namespace") -} - -// asInt returns the parameter as a int64 -// or panics if it can't convert -func asInt(param string) int64 { - - i, err := strconv.ParseInt(param, 0, 64) - panicIf(err) - - return i -} - -// asUint returns the parameter as a uint64 -// or panics if it can't convert -func asUint(param string) uint64 { - - i, err := strconv.ParseUint(param, 0, 64) - panicIf(err) - - return i -} - -// asFloat returns the parameter as a float64 -// or panics if it can't convert -func asFloat(param string) float64 { - - i, err := strconv.ParseFloat(param, 64) - panicIf(err) - - return i -} - -// asBool returns the parameter as a bool -// or panics if it can't convert -func asBool(param string) bool { - - i, err := strconv.ParseBool(param) - panicIf(err) - - return i -} - -func panicIf(err error) { - if err != nil { - panic(err.Error()) - } -} diff --git a/vendor/github.com/go-playground/validator/v10/validator.go b/vendor/github.com/go-playground/validator/v10/validator.go deleted file mode 100644 index 342e72e3..00000000 --- a/vendor/github.com/go-playground/validator/v10/validator.go +++ /dev/null @@ -1,477 +0,0 @@ -package validator - -import ( - "context" - "fmt" - "reflect" - "strconv" -) - -// per validate construct -type validate struct { - v *Validate - top reflect.Value - ns []byte - actualNs []byte - errs ValidationErrors - includeExclude map[string]struct{} // reset only if StructPartial or StructExcept are called, no need otherwise - ffn FilterFunc - slflParent reflect.Value // StructLevel & FieldLevel - slCurrent reflect.Value // StructLevel & FieldLevel - flField reflect.Value // StructLevel & FieldLevel - cf *cField // StructLevel & FieldLevel - ct *cTag // StructLevel & FieldLevel - misc []byte // misc reusable - str1 string // misc reusable - str2 string // misc reusable - fldIsPointer bool // StructLevel & FieldLevel - isPartial bool - hasExcludes bool -} - -// parent and current will be the same the first run of validateStruct -func (v *validate) validateStruct(ctx context.Context, parent reflect.Value, current reflect.Value, typ reflect.Type, ns []byte, structNs []byte, ct *cTag) { - - cs, ok := v.v.structCache.Get(typ) - if !ok { - cs = v.v.extractStructCache(current, typ.Name()) - } - - if len(ns) == 0 && len(cs.name) != 0 { - - ns = append(ns, cs.name...) - ns = append(ns, '.') - - structNs = append(structNs, cs.name...) - structNs = append(structNs, '.') - } - - // ct is nil on top level struct, and structs as fields that have no tag info - // so if nil or if not nil and the structonly tag isn't present - if ct == nil || ct.typeof != typeStructOnly { - - var f *cField - - for i := 0; i < len(cs.fields); i++ { - - f = cs.fields[i] - - if v.isPartial { - - if v.ffn != nil { - // used with StructFiltered - if v.ffn(append(structNs, f.name...)) { - continue - } - - } else { - // used with StructPartial & StructExcept - _, ok = v.includeExclude[string(append(structNs, f.name...))] - - if (ok && v.hasExcludes) || (!ok && !v.hasExcludes) { - continue - } - } - } - - v.traverseField(ctx, parent, current.Field(f.idx), ns, structNs, f, f.cTags) - } - } - - // check if any struct level validations, after all field validations already checked. - // first iteration will have no info about nostructlevel tag, and is checked prior to - // calling the next iteration of validateStruct called from traverseField. - if cs.fn != nil { - - v.slflParent = parent - v.slCurrent = current - v.ns = ns - v.actualNs = structNs - - cs.fn(ctx, v) - } -} - -// traverseField validates any field, be it a struct or single field, ensures it's validity and passes it along to be validated via it's tag options -func (v *validate) traverseField(ctx context.Context, parent reflect.Value, current reflect.Value, ns []byte, structNs []byte, cf *cField, ct *cTag) { - var typ reflect.Type - var kind reflect.Kind - - current, kind, v.fldIsPointer = v.extractTypeInternal(current, false) - - switch kind { - case reflect.Ptr, reflect.Interface, reflect.Invalid: - - if ct == nil { - return - } - - if ct.typeof == typeOmitEmpty || ct.typeof == typeIsDefault { - return - } - - if ct.hasTag { - if kind == reflect.Invalid { - v.str1 = string(append(ns, cf.altName...)) - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - param: ct.param, - kind: kind, - }, - ) - return - } - - v.str1 = string(append(ns, cf.altName...)) - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - if !ct.runValidationWhenNil { - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: current.Type(), - }, - ) - return - } - } - - case reflect.Struct: - - typ = current.Type() - - if typ != timeType { - - if ct != nil { - - if ct.typeof == typeStructOnly { - goto CONTINUE - } else if ct.typeof == typeIsDefault { - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if !ct.fn(ctx, v) { - v.str1 = string(append(ns, cf.altName...)) - - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - return - } - } - - ct = ct.next - } - - if ct != nil && ct.typeof == typeNoStructLevel { - return - } - - CONTINUE: - // if len == 0 then validating using 'Var' or 'VarWithValue' - // Var - doesn't make much sense to do it that way, should call 'Struct', but no harm... - // VarWithField - this allows for validating against each field within the struct against a specific value - // pretty handy in certain situations - if len(cf.name) > 0 { - ns = append(append(ns, cf.altName...), '.') - structNs = append(append(structNs, cf.name...), '.') - } - - v.validateStruct(ctx, current, current, typ, ns, structNs, ct) - return - } - } - - if !ct.hasTag { - return - } - - typ = current.Type() - -OUTER: - for { - if ct == nil { - return - } - - switch ct.typeof { - - case typeOmitEmpty: - - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if !v.fldIsPointer && !hasValue(v) { - return - } - - ct = ct.next - continue - - case typeEndKeys: - return - - case typeDive: - - ct = ct.next - - // traverse slice or map here - // or panic ;) - switch kind { - case reflect.Slice, reflect.Array: - - var i64 int64 - reusableCF := &cField{} - - for i := 0; i < current.Len(); i++ { - - i64 = int64(i) - - v.misc = append(v.misc[0:0], cf.name...) - v.misc = append(v.misc, '[') - v.misc = strconv.AppendInt(v.misc, i64, 10) - v.misc = append(v.misc, ']') - - reusableCF.name = string(v.misc) - - if cf.namesEqual { - reusableCF.altName = reusableCF.name - } else { - - v.misc = append(v.misc[0:0], cf.altName...) - v.misc = append(v.misc, '[') - v.misc = strconv.AppendInt(v.misc, i64, 10) - v.misc = append(v.misc, ']') - - reusableCF.altName = string(v.misc) - } - v.traverseField(ctx, parent, current.Index(i), ns, structNs, reusableCF, ct) - } - - case reflect.Map: - - var pv string - reusableCF := &cField{} - - for _, key := range current.MapKeys() { - - pv = fmt.Sprintf("%v", key.Interface()) - - v.misc = append(v.misc[0:0], cf.name...) - v.misc = append(v.misc, '[') - v.misc = append(v.misc, pv...) - v.misc = append(v.misc, ']') - - reusableCF.name = string(v.misc) - - if cf.namesEqual { - reusableCF.altName = reusableCF.name - } else { - v.misc = append(v.misc[0:0], cf.altName...) - v.misc = append(v.misc, '[') - v.misc = append(v.misc, pv...) - v.misc = append(v.misc, ']') - - reusableCF.altName = string(v.misc) - } - - if ct != nil && ct.typeof == typeKeys && ct.keys != nil { - v.traverseField(ctx, parent, key, ns, structNs, reusableCF, ct.keys) - // can be nil when just keys being validated - if ct.next != nil { - v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct.next) - } - } else { - v.traverseField(ctx, parent, current.MapIndex(key), ns, structNs, reusableCF, ct) - } - } - - default: - // throw error, if not a slice or map then should not have gotten here - // bad dive tag - panic("dive error! can't dive on a non slice or map") - } - - return - - case typeOr: - - v.misc = v.misc[0:0] - - for { - - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if ct.fn(ctx, v) { - - // drain rest of the 'or' values, then continue or leave - for { - - ct = ct.next - - if ct == nil { - return - } - - if ct.typeof != typeOr { - continue OUTER - } - } - } - - v.misc = append(v.misc, '|') - v.misc = append(v.misc, ct.tag...) - - if ct.hasParam { - v.misc = append(v.misc, '=') - v.misc = append(v.misc, ct.param...) - } - - if ct.isBlockEnd || ct.next == nil { - // if we get here, no valid 'or' value and no more tags - v.str1 = string(append(ns, cf.altName...)) - - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - - if ct.hasAlias { - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.actualAliasTag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - - } else { - - tVal := string(v.misc)[1:] - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: tVal, - actualTag: tVal, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - } - - return - } - - ct = ct.next - } - - default: - - // set Field Level fields - v.slflParent = parent - v.flField = current - v.cf = cf - v.ct = ct - - if !ct.fn(ctx, v) { - - v.str1 = string(append(ns, cf.altName...)) - - if v.v.hasTagNameFunc { - v.str2 = string(append(structNs, cf.name...)) - } else { - v.str2 = v.str1 - } - - v.errs = append(v.errs, - &fieldError{ - v: v.v, - tag: ct.aliasTag, - actualTag: ct.tag, - ns: v.str1, - structNs: v.str2, - fieldLen: uint8(len(cf.altName)), - structfieldLen: uint8(len(cf.name)), - value: current.Interface(), - param: ct.param, - kind: kind, - typ: typ, - }, - ) - - return - } - ct = ct.next - } - } - -} diff --git a/vendor/github.com/go-playground/validator/v10/validator_instance.go b/vendor/github.com/go-playground/validator/v10/validator_instance.go deleted file mode 100644 index 4a89d406..00000000 --- a/vendor/github.com/go-playground/validator/v10/validator_instance.go +++ /dev/null @@ -1,615 +0,0 @@ -package validator - -import ( - "context" - "errors" - "fmt" - "reflect" - "strings" - "sync" - "time" - - ut "github.com/go-playground/universal-translator" -) - -const ( - defaultTagName = "validate" - utf8HexComma = "0x2C" - utf8Pipe = "0x7C" - tagSeparator = "," - orSeparator = "|" - tagKeySeparator = "=" - structOnlyTag = "structonly" - noStructLevelTag = "nostructlevel" - omitempty = "omitempty" - isdefault = "isdefault" - requiredWithoutAllTag = "required_without_all" - requiredWithoutTag = "required_without" - requiredWithTag = "required_with" - requiredWithAllTag = "required_with_all" - skipValidationTag = "-" - diveTag = "dive" - keysTag = "keys" - endKeysTag = "endkeys" - requiredTag = "required" - namespaceSeparator = "." - leftBracket = "[" - rightBracket = "]" - restrictedTagChars = ".[],|=+()`~!@#$%^&*\\\"/?<>{}" - restrictedAliasErr = "Alias '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation" - restrictedTagErr = "Tag '%s' either contains restricted characters or is the same as a restricted tag needed for normal operation" -) - -var ( - timeType = reflect.TypeOf(time.Time{}) - defaultCField = &cField{namesEqual: true} -) - -// FilterFunc is the type used to filter fields using -// StructFiltered(...) function. -// returning true results in the field being filtered/skiped from -// validation -type FilterFunc func(ns []byte) bool - -// CustomTypeFunc allows for overriding or adding custom field type handler functions -// field = field value of the type to return a value to be validated -// example Valuer from sql drive see https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29 -type CustomTypeFunc func(field reflect.Value) interface{} - -// TagNameFunc allows for adding of a custom tag name parser -type TagNameFunc func(field reflect.StructField) string - -type internalValidationFuncWrapper struct { - fn FuncCtx - runValidatinOnNil bool -} - -// Validate contains the validator settings and cache -type Validate struct { - tagName string - pool *sync.Pool - hasCustomFuncs bool - hasTagNameFunc bool - tagNameFunc TagNameFunc - structLevelFuncs map[reflect.Type]StructLevelFuncCtx - customFuncs map[reflect.Type]CustomTypeFunc - aliases map[string]string - validations map[string]internalValidationFuncWrapper - transTagFunc map[ut.Translator]map[string]TranslationFunc // map[]map[]TranslationFunc - tagCache *tagCache - structCache *structCache -} - -// New returns a new instance of 'validate' with sane defaults. -func New() *Validate { - - tc := new(tagCache) - tc.m.Store(make(map[string]*cTag)) - - sc := new(structCache) - sc.m.Store(make(map[reflect.Type]*cStruct)) - - v := &Validate{ - tagName: defaultTagName, - aliases: make(map[string]string, len(bakedInAliases)), - validations: make(map[string]internalValidationFuncWrapper, len(bakedInValidators)), - tagCache: tc, - structCache: sc, - } - - // must copy alias validators for separate validations to be used in each validator instance - for k, val := range bakedInAliases { - v.RegisterAlias(k, val) - } - - // must copy validators for separate validations to be used in each instance - for k, val := range bakedInValidators { - - switch k { - // these require that even if the value is nil that the validation should run, omitempty still overrides this behaviour - case requiredWithTag, requiredWithAllTag, requiredWithoutTag, requiredWithoutAllTag: - _ = v.registerValidation(k, wrapFunc(val), true, true) - default: - // no need to error check here, baked in will always be valid - _ = v.registerValidation(k, wrapFunc(val), true, false) - } - } - - v.pool = &sync.Pool{ - New: func() interface{} { - return &validate{ - v: v, - ns: make([]byte, 0, 64), - actualNs: make([]byte, 0, 64), - misc: make([]byte, 32), - } - }, - } - - return v -} - -// SetTagName allows for changing of the default tag name of 'validate' -func (v *Validate) SetTagName(name string) { - v.tagName = name -} - -// RegisterTagNameFunc registers a function to get alternate names for StructFields. -// -// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names: -// -// validate.RegisterTagNameFunc(func(fld reflect.StructField) string { -// name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] -// if name == "-" { -// return "" -// } -// return name -// }) -func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) { - v.tagNameFunc = fn - v.hasTagNameFunc = true -} - -// RegisterValidation adds a validation with the given tag -// -// NOTES: -// - if the key already exists, the previous validation function will be replaced. -// - this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterValidation(tag string, fn Func, callValidationEvenIfNull ...bool) error { - return v.RegisterValidationCtx(tag, wrapFunc(fn), callValidationEvenIfNull...) -} - -// RegisterValidationCtx does the same as RegisterValidation on accepts a FuncCtx validation -// allowing context.Context validation support. -func (v *Validate) RegisterValidationCtx(tag string, fn FuncCtx, callValidationEvenIfNull ...bool) error { - var nilCheckable bool - if len(callValidationEvenIfNull) > 0 { - nilCheckable = callValidationEvenIfNull[0] - } - return v.registerValidation(tag, fn, false, nilCheckable) -} - -func (v *Validate) registerValidation(tag string, fn FuncCtx, bakedIn bool, nilCheckable bool) error { - if len(tag) == 0 { - return errors.New("Function Key cannot be empty") - } - - if fn == nil { - return errors.New("Function cannot be empty") - } - - _, ok := restrictedTags[tag] - if !bakedIn && (ok || strings.ContainsAny(tag, restrictedTagChars)) { - panic(fmt.Sprintf(restrictedTagErr, tag)) - } - v.validations[tag] = internalValidationFuncWrapper{fn: fn, runValidatinOnNil: nilCheckable} - return nil -} - -// RegisterAlias registers a mapping of a single validation tag that -// defines a common or complex set of validation(s) to simplify adding validation -// to structs. -// -// NOTE: this function is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterAlias(alias, tags string) { - - _, ok := restrictedTags[alias] - - if ok || strings.ContainsAny(alias, restrictedTagChars) { - panic(fmt.Sprintf(restrictedAliasErr, alias)) - } - - v.aliases[alias] = tags -} - -// RegisterStructValidation registers a StructLevelFunc against a number of types. -// -// NOTE: -// - this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterStructValidation(fn StructLevelFunc, types ...interface{}) { - v.RegisterStructValidationCtx(wrapStructLevelFunc(fn), types...) -} - -// RegisterStructValidationCtx registers a StructLevelFuncCtx against a number of types and allows passing -// of contextual validation information via context.Context. -// -// NOTE: -// - this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterStructValidationCtx(fn StructLevelFuncCtx, types ...interface{}) { - - if v.structLevelFuncs == nil { - v.structLevelFuncs = make(map[reflect.Type]StructLevelFuncCtx) - } - - for _, t := range types { - tv := reflect.ValueOf(t) - if tv.Kind() == reflect.Ptr { - t = reflect.Indirect(tv).Interface() - } - - v.structLevelFuncs[reflect.TypeOf(t)] = fn - } -} - -// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types -// -// NOTE: this method is not thread-safe it is intended that these all be registered prior to any validation -func (v *Validate) RegisterCustomTypeFunc(fn CustomTypeFunc, types ...interface{}) { - - if v.customFuncs == nil { - v.customFuncs = make(map[reflect.Type]CustomTypeFunc) - } - - for _, t := range types { - v.customFuncs[reflect.TypeOf(t)] = fn - } - - v.hasCustomFuncs = true -} - -// RegisterTranslation registers translations against the provided tag. -func (v *Validate) RegisterTranslation(tag string, trans ut.Translator, registerFn RegisterTranslationsFunc, translationFn TranslationFunc) (err error) { - - if v.transTagFunc == nil { - v.transTagFunc = make(map[ut.Translator]map[string]TranslationFunc) - } - - if err = registerFn(trans); err != nil { - return - } - - m, ok := v.transTagFunc[trans] - if !ok { - m = make(map[string]TranslationFunc) - v.transTagFunc[trans] = m - } - - m[tag] = translationFn - - return -} - -// Struct validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified. -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) Struct(s interface{}) error { - return v.StructCtx(context.Background(), s) -} - -// StructCtx validates a structs exposed fields, and automatically validates nested structs, unless otherwise specified -// and also allows passing of context.Context for contextual validation information. -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructCtx(ctx context.Context, s interface{}) (err error) { - - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = false - // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept - - vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// StructFiltered validates a structs exposed fields, that pass the FilterFunc check and automatically validates -// nested structs, unless otherwise specified. -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructFiltered(s interface{}, fn FilterFunc) error { - return v.StructFilteredCtx(context.Background(), s, fn) -} - -// StructFilteredCtx validates a structs exposed fields, that pass the FilterFunc check and automatically validates -// nested structs, unless otherwise specified and also allows passing of contextual validation information via -// context.Context -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructFilteredCtx(ctx context.Context, s interface{}, fn FilterFunc) (err error) { - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = true - vd.ffn = fn - // vd.hasExcludes = false // only need to reset in StructPartial and StructExcept - - vd.validateStruct(ctx, top, val, val.Type(), vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// StructPartial validates the fields passed in only, ignoring all others. -// Fields may be provided in a namespaced fashion relative to the struct provided -// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructPartial(s interface{}, fields ...string) error { - return v.StructPartialCtx(context.Background(), s, fields...) -} - -// StructPartialCtx validates the fields passed in only, ignoring all others and allows passing of contextual -// validation validation information via context.Context -// Fields may be provided in a namespaced fashion relative to the struct provided -// eg. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields ...string) (err error) { - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = true - vd.ffn = nil - vd.hasExcludes = false - vd.includeExclude = make(map[string]struct{}) - - typ := val.Type() - name := typ.Name() - - for _, k := range fields { - - flds := strings.Split(k, namespaceSeparator) - if len(flds) > 0 { - - vd.misc = append(vd.misc[0:0], name...) - vd.misc = append(vd.misc, '.') - - for _, s := range flds { - - idx := strings.Index(s, leftBracket) - - if idx != -1 { - for idx != -1 { - vd.misc = append(vd.misc, s[:idx]...) - vd.includeExclude[string(vd.misc)] = struct{}{} - - idx2 := strings.Index(s, rightBracket) - idx2++ - vd.misc = append(vd.misc, s[idx:idx2]...) - vd.includeExclude[string(vd.misc)] = struct{}{} - s = s[idx2:] - idx = strings.Index(s, leftBracket) - } - } else { - - vd.misc = append(vd.misc, s...) - vd.includeExclude[string(vd.misc)] = struct{}{} - } - - vd.misc = append(vd.misc, '.') - } - } - } - - vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// StructExcept validates all fields except the ones passed in. -// Fields may be provided in a namespaced fashion relative to the struct provided -// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructExcept(s interface{}, fields ...string) error { - return v.StructExceptCtx(context.Background(), s, fields...) -} - -// StructExceptCtx validates all fields except the ones passed in and allows passing of contextual -// validation validation information via context.Context -// Fields may be provided in a namespaced fashion relative to the struct provided -// i.e. NestedStruct.Field or NestedArrayField[0].Struct.Name -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -func (v *Validate) StructExceptCtx(ctx context.Context, s interface{}, fields ...string) (err error) { - val := reflect.ValueOf(s) - top := val - - if val.Kind() == reflect.Ptr && !val.IsNil() { - val = val.Elem() - } - - if val.Kind() != reflect.Struct || val.Type() == timeType { - return &InvalidValidationError{Type: reflect.TypeOf(s)} - } - - // good to validate - vd := v.pool.Get().(*validate) - vd.top = top - vd.isPartial = true - vd.ffn = nil - vd.hasExcludes = true - vd.includeExclude = make(map[string]struct{}) - - typ := val.Type() - name := typ.Name() - - for _, key := range fields { - - vd.misc = vd.misc[0:0] - - if len(name) > 0 { - vd.misc = append(vd.misc, name...) - vd.misc = append(vd.misc, '.') - } - - vd.misc = append(vd.misc, key...) - vd.includeExclude[string(vd.misc)] = struct{}{} - } - - vd.validateStruct(ctx, top, val, typ, vd.ns[0:0], vd.actualNs[0:0], nil) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - - v.pool.Put(vd) - - return -} - -// Var validates a single variable using tag style validation. -// eg. -// var i int -// validate.Var(i, "gt=1,lt=10") -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) Var(field interface{}, tag string) error { - return v.VarCtx(context.Background(), field, tag) -} - -// VarCtx validates a single variable using tag style validation and allows passing of contextual -// validation validation information via context.Context. -// eg. -// var i int -// validate.Var(i, "gt=1,lt=10") -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) VarCtx(ctx context.Context, field interface{}, tag string) (err error) { - if len(tag) == 0 || tag == skipValidationTag { - return nil - } - - ctag := v.fetchCacheTag(tag) - val := reflect.ValueOf(field) - vd := v.pool.Get().(*validate) - vd.top = val - vd.isPartial = false - vd.traverseField(ctx, val, val, vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - v.pool.Put(vd) - return -} - -// VarWithValue validates a single variable, against another variable/field's value using tag style validation -// eg. -// s1 := "abcd" -// s2 := "abcd" -// validate.VarWithValue(s1, s2, "eqcsfield") // returns true -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) VarWithValue(field interface{}, other interface{}, tag string) error { - return v.VarWithValueCtx(context.Background(), field, other, tag) -} - -// VarWithValueCtx validates a single variable, against another variable/field's value using tag style validation and -// allows passing of contextual validation validation information via context.Context. -// eg. -// s1 := "abcd" -// s2 := "abcd" -// validate.VarWithValue(s1, s2, "eqcsfield") // returns true -// -// WARNING: a struct can be passed for validation eg. time.Time is a struct or -// if you have a custom type and have registered a custom type handler, so must -// allow it; however unforeseen validations will occur if trying to validate a -// struct that is meant to be passed to 'validate.Struct' -// -// It returns InvalidValidationError for bad values passed in and nil or ValidationErrors as error otherwise. -// You will need to assert the error if it's not nil eg. err.(validator.ValidationErrors) to access the array of errors. -// validate Array, Slice and maps fields which may contain more than one error -func (v *Validate) VarWithValueCtx(ctx context.Context, field interface{}, other interface{}, tag string) (err error) { - if len(tag) == 0 || tag == skipValidationTag { - return nil - } - ctag := v.fetchCacheTag(tag) - otherVal := reflect.ValueOf(other) - vd := v.pool.Get().(*validate) - vd.top = otherVal - vd.isPartial = false - vd.traverseField(ctx, otherVal, reflect.ValueOf(field), vd.ns[0:0], vd.actualNs[0:0], defaultCField, ctag) - - if len(vd.errs) > 0 { - err = vd.errs - vd.errs = nil - } - v.pool.Put(vd) - return -} diff --git a/vendor/github.com/go-redis/redis/.gitignore b/vendor/github.com/go-redis/redis/.gitignore deleted file mode 100644 index ebfe903b..00000000 --- a/vendor/github.com/go-redis/redis/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.rdb -testdata/*/ diff --git a/vendor/github.com/go-redis/redis/.travis.yml b/vendor/github.com/go-redis/redis/.travis.yml deleted file mode 100644 index 06d7897b..00000000 --- a/vendor/github.com/go-redis/redis/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -sudo: false -language: go - -services: - - redis-server - -go: - - 1.9.x - - 1.10.x - - 1.11.x - - 1.12.x - - tip - -matrix: - allow_failures: - - go: tip - -install: - - go get github.com/onsi/ginkgo - - go get github.com/onsi/gomega diff --git a/vendor/github.com/go-redis/redis/CHANGELOG.md b/vendor/github.com/go-redis/redis/CHANGELOG.md deleted file mode 100644 index 19645661..00000000 --- a/vendor/github.com/go-redis/redis/CHANGELOG.md +++ /dev/null @@ -1,25 +0,0 @@ -# Changelog - -## Unreleased - -- Cluster and Ring pipelines process commands for each node in its own goroutine. - -## 6.14 - -- Added Options.MinIdleConns. -- Added Options.MaxConnAge. -- PoolStats.FreeConns is renamed to PoolStats.IdleConns. -- Add Client.Do to simplify creating custom commands. -- Add Cmd.String, Cmd.Int, Cmd.Int64, Cmd.Uint64, Cmd.Float64, and Cmd.Bool helpers. -- Lower memory usage. - -## v6.13 - -- Ring got new options called `HashReplicas` and `Hash`. It is recommended to set `HashReplicas = 1000` for better keys distribution between shards. -- Cluster client was optimized to use much less memory when reloading cluster state. -- PubSub.ReceiveMessage is re-worked to not use ReceiveTimeout so it does not lose data when timeout occurres. In most cases it is recommended to use PubSub.Channel instead. -- Dialer.KeepAlive is set to 5 minutes by default. - -## v6.12 - -- ClusterClient got new option called `ClusterSlots` which allows to build cluster of normal Redis Servers that don't have cluster mode enabled. See https://godoc.org/github.com/go-redis/redis#example-NewClusterClient--ManualSetup diff --git a/vendor/github.com/go-redis/redis/LICENSE b/vendor/github.com/go-redis/redis/LICENSE deleted file mode 100644 index 298bed9b..00000000 --- a/vendor/github.com/go-redis/redis/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2013 The github.com/go-redis/redis Authors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/go-redis/redis/Makefile b/vendor/github.com/go-redis/redis/Makefile deleted file mode 100644 index fa3b4e00..00000000 --- a/vendor/github.com/go-redis/redis/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -all: testdeps - go test ./... - go test ./... -short -race - env GOOS=linux GOARCH=386 go test ./... - go vet - go get github.com/gordonklaus/ineffassign - ineffassign . - -testdeps: testdata/redis/src/redis-server - -bench: testdeps - go test ./... -test.run=NONE -test.bench=. -test.benchmem - -.PHONY: all test testdeps bench - -testdata/redis: - mkdir -p $@ - wget -qO- https://github.com/antirez/redis/archive/5.0.tar.gz | tar xvz --strip-components=1 -C $@ - -testdata/redis/src/redis-server: testdata/redis - sed -i.bak 's/libjemalloc.a/libjemalloc.a -lrt/g' $ -} - -func ExampleClient() { - err := client.Set("key", "value", 0).Err() - if err != nil { - panic(err) - } - - val, err := client.Get("key").Result() - if err != nil { - panic(err) - } - fmt.Println("key", val) - - val2, err := client.Get("key2").Result() - if err == redis.Nil { - fmt.Println("key2 does not exist") - } else if err != nil { - panic(err) - } else { - fmt.Println("key2", val2) - } - // Output: key value - // key2 does not exist -} -``` - -## Howto - -Please go through [examples](https://godoc.org/github.com/go-redis/redis#pkg-examples) to get an idea how to use this package. - -## Look and feel - -Some corner cases: - -```go -// SET key value EX 10 NX -set, err := client.SetNX("key", "value", 10*time.Second).Result() - -// SORT list LIMIT 0 2 ASC -vals, err := client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result() - -// ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2 -vals, err := client.ZRangeByScoreWithScores("zset", redis.ZRangeBy{ - Min: "-inf", - Max: "+inf", - Offset: 0, - Count: 2, -}).Result() - -// ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM -vals, err := client.ZInterStore("out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2").Result() - -// EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello" -vals, err := client.Eval("return {KEYS[1],ARGV[1]}", []string{"key"}, "hello").Result() -``` - -## Benchmark - -go-redis vs redigo: - -``` -BenchmarkSetGoRedis10Conns64Bytes-4 200000 7621 ns/op 210 B/op 6 allocs/op -BenchmarkSetGoRedis100Conns64Bytes-4 200000 7554 ns/op 210 B/op 6 allocs/op -BenchmarkSetGoRedis10Conns1KB-4 200000 7697 ns/op 210 B/op 6 allocs/op -BenchmarkSetGoRedis100Conns1KB-4 200000 7688 ns/op 210 B/op 6 allocs/op -BenchmarkSetGoRedis10Conns10KB-4 200000 9214 ns/op 210 B/op 6 allocs/op -BenchmarkSetGoRedis100Conns10KB-4 200000 9181 ns/op 210 B/op 6 allocs/op -BenchmarkSetGoRedis10Conns1MB-4 2000 583242 ns/op 2337 B/op 6 allocs/op -BenchmarkSetGoRedis100Conns1MB-4 2000 583089 ns/op 2338 B/op 6 allocs/op -BenchmarkSetRedigo10Conns64Bytes-4 200000 7576 ns/op 208 B/op 7 allocs/op -BenchmarkSetRedigo100Conns64Bytes-4 200000 7782 ns/op 208 B/op 7 allocs/op -BenchmarkSetRedigo10Conns1KB-4 200000 7958 ns/op 208 B/op 7 allocs/op -BenchmarkSetRedigo100Conns1KB-4 200000 7725 ns/op 208 B/op 7 allocs/op -BenchmarkSetRedigo10Conns10KB-4 100000 18442 ns/op 208 B/op 7 allocs/op -BenchmarkSetRedigo100Conns10KB-4 100000 18818 ns/op 208 B/op 7 allocs/op -BenchmarkSetRedigo10Conns1MB-4 2000 668829 ns/op 226 B/op 7 allocs/op -BenchmarkSetRedigo100Conns1MB-4 2000 679542 ns/op 226 B/op 7 allocs/op -``` - -Redis Cluster: - -``` -BenchmarkRedisPing-4 200000 6983 ns/op 116 B/op 4 allocs/op -BenchmarkRedisClusterPing-4 100000 11535 ns/op 117 B/op 4 allocs/op -``` - -## See also - -- [Golang PostgreSQL ORM](https://github.com/go-pg/pg) -- [Golang msgpack](https://github.com/vmihailenco/msgpack) -- [Golang message task queue](https://github.com/vmihailenco/taskq) diff --git a/vendor/github.com/go-redis/redis/cluster.go b/vendor/github.com/go-redis/redis/cluster.go deleted file mode 100644 index ab2c76f0..00000000 --- a/vendor/github.com/go-redis/redis/cluster.go +++ /dev/null @@ -1,1627 +0,0 @@ -package redis - -import ( - "context" - "crypto/tls" - "fmt" - "math" - "math/rand" - "net" - "runtime" - "sort" - "sync" - "sync/atomic" - "time" - - "github.com/go-redis/redis/internal" - "github.com/go-redis/redis/internal/hashtag" - "github.com/go-redis/redis/internal/pool" - "github.com/go-redis/redis/internal/proto" -) - -var errClusterNoNodes = fmt.Errorf("redis: cluster has no nodes") - -// ClusterOptions are used to configure a cluster client and should be -// passed to NewClusterClient. -type ClusterOptions struct { - // A seed list of host:port addresses of cluster nodes. - Addrs []string - - // The maximum number of retries before giving up. Command is retried - // on network errors and MOVED/ASK redirects. - // Default is 8 retries. - MaxRedirects int - - // Enables read-only commands on slave nodes. - ReadOnly bool - // Allows routing read-only commands to the closest master or slave node. - // It automatically enables ReadOnly. - RouteByLatency bool - // Allows routing read-only commands to the random master or slave node. - // It automatically enables ReadOnly. - RouteRandomly bool - - // Optional function that returns cluster slots information. - // It is useful to manually create cluster of standalone Redis servers - // and load-balance read/write operations between master and slaves. - // It can use service like ZooKeeper to maintain configuration information - // and Cluster.ReloadState to manually trigger state reloading. - ClusterSlots func() ([]ClusterSlot, error) - - // Optional hook that is called when a new node is created. - OnNewNode func(*Client) - - // Following options are copied from Options struct. - - OnConnect func(*Conn) error - - Password string - - MaxRetries int - MinRetryBackoff time.Duration - MaxRetryBackoff time.Duration - - DialTimeout time.Duration - ReadTimeout time.Duration - WriteTimeout time.Duration - - // PoolSize applies per cluster node and not for the whole cluster. - PoolSize int - MinIdleConns int - MaxConnAge time.Duration - PoolTimeout time.Duration - IdleTimeout time.Duration - IdleCheckFrequency time.Duration - - TLSConfig *tls.Config -} - -func (opt *ClusterOptions) init() { - if opt.MaxRedirects == -1 { - opt.MaxRedirects = 0 - } else if opt.MaxRedirects == 0 { - opt.MaxRedirects = 8 - } - - if (opt.RouteByLatency || opt.RouteRandomly) && opt.ClusterSlots == nil { - opt.ReadOnly = true - } - - if opt.PoolSize == 0 { - opt.PoolSize = 5 * runtime.NumCPU() - } - - switch opt.ReadTimeout { - case -1: - opt.ReadTimeout = 0 - case 0: - opt.ReadTimeout = 3 * time.Second - } - switch opt.WriteTimeout { - case -1: - opt.WriteTimeout = 0 - case 0: - opt.WriteTimeout = opt.ReadTimeout - } - - switch opt.MinRetryBackoff { - case -1: - opt.MinRetryBackoff = 0 - case 0: - opt.MinRetryBackoff = 8 * time.Millisecond - } - switch opt.MaxRetryBackoff { - case -1: - opt.MaxRetryBackoff = 0 - case 0: - opt.MaxRetryBackoff = 512 * time.Millisecond - } -} - -func (opt *ClusterOptions) clientOptions() *Options { - const disableIdleCheck = -1 - - return &Options{ - OnConnect: opt.OnConnect, - - MaxRetries: opt.MaxRetries, - MinRetryBackoff: opt.MinRetryBackoff, - MaxRetryBackoff: opt.MaxRetryBackoff, - Password: opt.Password, - readOnly: opt.ReadOnly, - - DialTimeout: opt.DialTimeout, - ReadTimeout: opt.ReadTimeout, - WriteTimeout: opt.WriteTimeout, - - PoolSize: opt.PoolSize, - MinIdleConns: opt.MinIdleConns, - MaxConnAge: opt.MaxConnAge, - PoolTimeout: opt.PoolTimeout, - IdleTimeout: opt.IdleTimeout, - IdleCheckFrequency: disableIdleCheck, - - TLSConfig: opt.TLSConfig, - } -} - -//------------------------------------------------------------------------------ - -type clusterNode struct { - Client *Client - - latency uint32 // atomic - generation uint32 // atomic - loading uint32 // atomic -} - -func newClusterNode(clOpt *ClusterOptions, addr string) *clusterNode { - opt := clOpt.clientOptions() - opt.Addr = addr - node := clusterNode{ - Client: NewClient(opt), - } - - node.latency = math.MaxUint32 - if clOpt.RouteByLatency { - go node.updateLatency() - } - - if clOpt.OnNewNode != nil { - clOpt.OnNewNode(node.Client) - } - - return &node -} - -func (n *clusterNode) String() string { - return n.Client.String() -} - -func (n *clusterNode) Close() error { - return n.Client.Close() -} - -func (n *clusterNode) updateLatency() { - const probes = 10 - - var latency uint32 - for i := 0; i < probes; i++ { - start := time.Now() - n.Client.Ping() - probe := uint32(time.Since(start) / time.Microsecond) - latency = (latency + probe) / 2 - } - atomic.StoreUint32(&n.latency, latency) -} - -func (n *clusterNode) Latency() time.Duration { - latency := atomic.LoadUint32(&n.latency) - return time.Duration(latency) * time.Microsecond -} - -func (n *clusterNode) MarkAsLoading() { - atomic.StoreUint32(&n.loading, uint32(time.Now().Unix())) -} - -func (n *clusterNode) Loading() bool { - const minute = int64(time.Minute / time.Second) - - loading := atomic.LoadUint32(&n.loading) - if loading == 0 { - return false - } - if time.Now().Unix()-int64(loading) < minute { - return true - } - atomic.StoreUint32(&n.loading, 0) - return false -} - -func (n *clusterNode) Generation() uint32 { - return atomic.LoadUint32(&n.generation) -} - -func (n *clusterNode) SetGeneration(gen uint32) { - for { - v := atomic.LoadUint32(&n.generation) - if gen < v || atomic.CompareAndSwapUint32(&n.generation, v, gen) { - break - } - } -} - -//------------------------------------------------------------------------------ - -type clusterNodes struct { - opt *ClusterOptions - - mu sync.RWMutex - allAddrs []string - allNodes map[string]*clusterNode - clusterAddrs []string - closed bool - - _generation uint32 // atomic -} - -func newClusterNodes(opt *ClusterOptions) *clusterNodes { - return &clusterNodes{ - opt: opt, - - allAddrs: opt.Addrs, - allNodes: make(map[string]*clusterNode), - } -} - -func (c *clusterNodes) Close() error { - c.mu.Lock() - defer c.mu.Unlock() - - if c.closed { - return nil - } - c.closed = true - - var firstErr error - for _, node := range c.allNodes { - if err := node.Client.Close(); err != nil && firstErr == nil { - firstErr = err - } - } - - c.allNodes = nil - c.clusterAddrs = nil - - return firstErr -} - -func (c *clusterNodes) Addrs() ([]string, error) { - var addrs []string - c.mu.RLock() - closed := c.closed - if !closed { - if len(c.clusterAddrs) > 0 { - addrs = c.clusterAddrs - } else { - addrs = c.allAddrs - } - } - c.mu.RUnlock() - - if closed { - return nil, pool.ErrClosed - } - if len(addrs) == 0 { - return nil, errClusterNoNodes - } - return addrs, nil -} - -func (c *clusterNodes) NextGeneration() uint32 { - return atomic.AddUint32(&c._generation, 1) -} - -// GC removes unused nodes. -func (c *clusterNodes) GC(generation uint32) { - var collected []*clusterNode - c.mu.Lock() - for addr, node := range c.allNodes { - if node.Generation() >= generation { - continue - } - - c.clusterAddrs = remove(c.clusterAddrs, addr) - delete(c.allNodes, addr) - collected = append(collected, node) - } - c.mu.Unlock() - - for _, node := range collected { - _ = node.Client.Close() - } -} - -func (c *clusterNodes) Get(addr string) (*clusterNode, error) { - var node *clusterNode - var err error - c.mu.RLock() - if c.closed { - err = pool.ErrClosed - } else { - node = c.allNodes[addr] - } - c.mu.RUnlock() - return node, err -} - -func (c *clusterNodes) GetOrCreate(addr string) (*clusterNode, error) { - node, err := c.Get(addr) - if err != nil { - return nil, err - } - if node != nil { - return node, nil - } - - c.mu.Lock() - defer c.mu.Unlock() - - if c.closed { - return nil, pool.ErrClosed - } - - node, ok := c.allNodes[addr] - if ok { - return node, err - } - - node = newClusterNode(c.opt, addr) - - c.allAddrs = appendIfNotExists(c.allAddrs, addr) - c.clusterAddrs = append(c.clusterAddrs, addr) - c.allNodes[addr] = node - - return node, err -} - -func (c *clusterNodes) All() ([]*clusterNode, error) { - c.mu.RLock() - defer c.mu.RUnlock() - - if c.closed { - return nil, pool.ErrClosed - } - - cp := make([]*clusterNode, 0, len(c.allNodes)) - for _, node := range c.allNodes { - cp = append(cp, node) - } - return cp, nil -} - -func (c *clusterNodes) Random() (*clusterNode, error) { - addrs, err := c.Addrs() - if err != nil { - return nil, err - } - - n := rand.Intn(len(addrs)) - return c.GetOrCreate(addrs[n]) -} - -//------------------------------------------------------------------------------ - -type clusterSlot struct { - start, end int - nodes []*clusterNode -} - -type clusterSlotSlice []*clusterSlot - -func (p clusterSlotSlice) Len() int { - return len(p) -} - -func (p clusterSlotSlice) Less(i, j int) bool { - return p[i].start < p[j].start -} - -func (p clusterSlotSlice) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} - -type clusterState struct { - nodes *clusterNodes - Masters []*clusterNode - Slaves []*clusterNode - - slots []*clusterSlot - - generation uint32 - createdAt time.Time -} - -func newClusterState( - nodes *clusterNodes, slots []ClusterSlot, origin string, -) (*clusterState, error) { - c := clusterState{ - nodes: nodes, - - slots: make([]*clusterSlot, 0, len(slots)), - - generation: nodes.NextGeneration(), - createdAt: time.Now(), - } - - originHost, _, _ := net.SplitHostPort(origin) - isLoopbackOrigin := isLoopback(originHost) - - for _, slot := range slots { - var nodes []*clusterNode - for i, slotNode := range slot.Nodes { - addr := slotNode.Addr - if !isLoopbackOrigin { - addr = replaceLoopbackHost(addr, originHost) - } - - node, err := c.nodes.GetOrCreate(addr) - if err != nil { - return nil, err - } - - node.SetGeneration(c.generation) - nodes = append(nodes, node) - - if i == 0 { - c.Masters = appendUniqueNode(c.Masters, node) - } else { - c.Slaves = appendUniqueNode(c.Slaves, node) - } - } - - c.slots = append(c.slots, &clusterSlot{ - start: slot.Start, - end: slot.End, - nodes: nodes, - }) - } - - sort.Sort(clusterSlotSlice(c.slots)) - - time.AfterFunc(time.Minute, func() { - nodes.GC(c.generation) - }) - - return &c, nil -} - -func replaceLoopbackHost(nodeAddr, originHost string) string { - nodeHost, nodePort, err := net.SplitHostPort(nodeAddr) - if err != nil { - return nodeAddr - } - - nodeIP := net.ParseIP(nodeHost) - if nodeIP == nil { - return nodeAddr - } - - if !nodeIP.IsLoopback() { - return nodeAddr - } - - // Use origin host which is not loopback and node port. - return net.JoinHostPort(originHost, nodePort) -} - -func isLoopback(host string) bool { - ip := net.ParseIP(host) - if ip == nil { - return true - } - return ip.IsLoopback() -} - -func (c *clusterState) slotMasterNode(slot int) (*clusterNode, error) { - nodes := c.slotNodes(slot) - if len(nodes) > 0 { - return nodes[0], nil - } - return c.nodes.Random() -} - -func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) { - nodes := c.slotNodes(slot) - switch len(nodes) { - case 0: - return c.nodes.Random() - case 1: - return nodes[0], nil - case 2: - if slave := nodes[1]; !slave.Loading() { - return slave, nil - } - return nodes[0], nil - default: - var slave *clusterNode - for i := 0; i < 10; i++ { - n := rand.Intn(len(nodes)-1) + 1 - slave = nodes[n] - if !slave.Loading() { - return slave, nil - } - } - - // All slaves are loading - use master. - return nodes[0], nil - } -} - -func (c *clusterState) slotClosestNode(slot int) (*clusterNode, error) { - const threshold = time.Millisecond - - nodes := c.slotNodes(slot) - if len(nodes) == 0 { - return c.nodes.Random() - } - - var node *clusterNode - for _, n := range nodes { - if n.Loading() { - continue - } - if node == nil || node.Latency()-n.Latency() > threshold { - node = n - } - } - return node, nil -} - -func (c *clusterState) slotRandomNode(slot int) *clusterNode { - nodes := c.slotNodes(slot) - n := rand.Intn(len(nodes)) - return nodes[n] -} - -func (c *clusterState) slotNodes(slot int) []*clusterNode { - i := sort.Search(len(c.slots), func(i int) bool { - return c.slots[i].end >= slot - }) - if i >= len(c.slots) { - return nil - } - x := c.slots[i] - if slot >= x.start && slot <= x.end { - return x.nodes - } - return nil -} - -//------------------------------------------------------------------------------ - -type clusterStateHolder struct { - load func() (*clusterState, error) - - state atomic.Value - reloading uint32 // atomic -} - -func newClusterStateHolder(fn func() (*clusterState, error)) *clusterStateHolder { - return &clusterStateHolder{ - load: fn, - } -} - -func (c *clusterStateHolder) Reload() (*clusterState, error) { - state, err := c.load() - if err != nil { - return nil, err - } - c.state.Store(state) - return state, nil -} - -func (c *clusterStateHolder) LazyReload() { - if !atomic.CompareAndSwapUint32(&c.reloading, 0, 1) { - return - } - go func() { - defer atomic.StoreUint32(&c.reloading, 0) - - _, err := c.Reload() - if err != nil { - return - } - time.Sleep(100 * time.Millisecond) - }() -} - -func (c *clusterStateHolder) Get() (*clusterState, error) { - v := c.state.Load() - if v != nil { - state := v.(*clusterState) - if time.Since(state.createdAt) > time.Minute { - c.LazyReload() - } - return state, nil - } - return c.Reload() -} - -func (c *clusterStateHolder) ReloadOrGet() (*clusterState, error) { - state, err := c.Reload() - if err == nil { - return state, nil - } - return c.Get() -} - -//------------------------------------------------------------------------------ - -// ClusterClient is a Redis Cluster client representing a pool of zero -// or more underlying connections. It's safe for concurrent use by -// multiple goroutines. -type ClusterClient struct { - cmdable - - ctx context.Context - - opt *ClusterOptions - nodes *clusterNodes - state *clusterStateHolder - cmdsInfoCache *cmdsInfoCache - - process func(Cmder) error - processPipeline func([]Cmder) error - processTxPipeline func([]Cmder) error -} - -// NewClusterClient returns a Redis Cluster client as described in -// http://redis.io/topics/cluster-spec. -func NewClusterClient(opt *ClusterOptions) *ClusterClient { - opt.init() - - c := &ClusterClient{ - opt: opt, - nodes: newClusterNodes(opt), - } - c.state = newClusterStateHolder(c.loadState) - c.cmdsInfoCache = newCmdsInfoCache(c.cmdsInfo) - - c.process = c.defaultProcess - c.processPipeline = c.defaultProcessPipeline - c.processTxPipeline = c.defaultProcessTxPipeline - - c.init() - if opt.IdleCheckFrequency > 0 { - go c.reaper(opt.IdleCheckFrequency) - } - - return c -} - -func (c *ClusterClient) init() { - c.cmdable.setProcessor(c.Process) -} - -// ReloadState reloads cluster state. If available it calls ClusterSlots func -// to get cluster slots information. -func (c *ClusterClient) ReloadState() error { - _, err := c.state.Reload() - return err -} - -func (c *ClusterClient) Context() context.Context { - if c.ctx != nil { - return c.ctx - } - return context.Background() -} - -func (c *ClusterClient) WithContext(ctx context.Context) *ClusterClient { - if ctx == nil { - panic("nil context") - } - c2 := c.clone() - c2.ctx = ctx - return c2 -} - -func (c *ClusterClient) clone() *ClusterClient { - cp := *c - cp.init() - return &cp -} - -// Options returns read-only Options that were used to create the client. -func (c *ClusterClient) Options() *ClusterOptions { - return c.opt -} - -func (c *ClusterClient) retryBackoff(attempt int) time.Duration { - return internal.RetryBackoff(attempt, c.opt.MinRetryBackoff, c.opt.MaxRetryBackoff) -} - -func (c *ClusterClient) cmdsInfo() (map[string]*CommandInfo, error) { - addrs, err := c.nodes.Addrs() - if err != nil { - return nil, err - } - - var firstErr error - for _, addr := range addrs { - node, err := c.nodes.Get(addr) - if err != nil { - return nil, err - } - if node == nil { - continue - } - - info, err := node.Client.Command().Result() - if err == nil { - return info, nil - } - if firstErr == nil { - firstErr = err - } - } - return nil, firstErr -} - -func (c *ClusterClient) cmdInfo(name string) *CommandInfo { - cmdsInfo, err := c.cmdsInfoCache.Get() - if err != nil { - return nil - } - - info := cmdsInfo[name] - if info == nil { - internal.Logf("info for cmd=%s not found", name) - } - return info -} - -func cmdSlot(cmd Cmder, pos int) int { - if pos == 0 { - return hashtag.RandomSlot() - } - firstKey := cmd.stringArg(pos) - return hashtag.Slot(firstKey) -} - -func (c *ClusterClient) cmdSlot(cmd Cmder) int { - args := cmd.Args() - if args[0] == "cluster" && args[1] == "getkeysinslot" { - return args[2].(int) - } - - cmdInfo := c.cmdInfo(cmd.Name()) - return cmdSlot(cmd, cmdFirstKeyPos(cmd, cmdInfo)) -} - -func (c *ClusterClient) cmdSlotAndNode(cmd Cmder) (int, *clusterNode, error) { - state, err := c.state.Get() - if err != nil { - return 0, nil, err - } - - cmdInfo := c.cmdInfo(cmd.Name()) - slot := c.cmdSlot(cmd) - - if c.opt.ReadOnly && cmdInfo != nil && cmdInfo.ReadOnly { - if c.opt.RouteByLatency { - node, err := state.slotClosestNode(slot) - return slot, node, err - } - - if c.opt.RouteRandomly { - node := state.slotRandomNode(slot) - return slot, node, nil - } - - node, err := state.slotSlaveNode(slot) - return slot, node, err - } - - node, err := state.slotMasterNode(slot) - return slot, node, err -} - -func (c *ClusterClient) slotMasterNode(slot int) (*clusterNode, error) { - state, err := c.state.Get() - if err != nil { - return nil, err - } - - nodes := state.slotNodes(slot) - if len(nodes) > 0 { - return nodes[0], nil - } - return c.nodes.Random() -} - -func (c *ClusterClient) Watch(fn func(*Tx) error, keys ...string) error { - if len(keys) == 0 { - return fmt.Errorf("redis: Watch requires at least one key") - } - - slot := hashtag.Slot(keys[0]) - for _, key := range keys[1:] { - if hashtag.Slot(key) != slot { - err := fmt.Errorf("redis: Watch requires all keys to be in the same slot") - return err - } - } - - node, err := c.slotMasterNode(slot) - if err != nil { - return err - } - - for attempt := 0; attempt <= c.opt.MaxRedirects; attempt++ { - if attempt > 0 { - time.Sleep(c.retryBackoff(attempt)) - } - - err = node.Client.Watch(fn, keys...) - if err == nil { - break - } - if err != Nil { - c.state.LazyReload() - } - - moved, ask, addr := internal.IsMovedError(err) - if moved || ask { - node, err = c.nodes.GetOrCreate(addr) - if err != nil { - return err - } - continue - } - - if err == pool.ErrClosed || internal.IsReadOnlyError(err) { - node, err = c.slotMasterNode(slot) - if err != nil { - return err - } - continue - } - - if internal.IsRetryableError(err, true) { - continue - } - - return err - } - - return err -} - -// Close closes the cluster client, releasing any open resources. -// -// It is rare to Close a ClusterClient, as the ClusterClient is meant -// to be long-lived and shared between many goroutines. -func (c *ClusterClient) Close() error { - return c.nodes.Close() -} - -// Do creates a Cmd from the args and processes the cmd. -func (c *ClusterClient) Do(args ...interface{}) *Cmd { - cmd := NewCmd(args...) - c.Process(cmd) - return cmd -} - -func (c *ClusterClient) WrapProcess( - fn func(oldProcess func(Cmder) error) func(Cmder) error, -) { - c.process = fn(c.process) -} - -func (c *ClusterClient) Process(cmd Cmder) error { - return c.process(cmd) -} - -func (c *ClusterClient) defaultProcess(cmd Cmder) error { - var node *clusterNode - var ask bool - for attempt := 0; attempt <= c.opt.MaxRedirects; attempt++ { - if attempt > 0 { - time.Sleep(c.retryBackoff(attempt)) - } - - if node == nil { - var err error - _, node, err = c.cmdSlotAndNode(cmd) - if err != nil { - cmd.setErr(err) - break - } - } - - var err error - if ask { - pipe := node.Client.Pipeline() - _ = pipe.Process(NewCmd("ASKING")) - _ = pipe.Process(cmd) - _, err = pipe.Exec() - _ = pipe.Close() - ask = false - } else { - err = node.Client.Process(cmd) - } - - // If there is no error - we are done. - if err == nil { - break - } - if err != Nil { - c.state.LazyReload() - } - - // If slave is loading - pick another node. - if c.opt.ReadOnly && internal.IsLoadingError(err) { - node.MarkAsLoading() - node = nil - continue - } - - var moved bool - var addr string - moved, ask, addr = internal.IsMovedError(err) - if moved || ask { - node, err = c.nodes.GetOrCreate(addr) - if err != nil { - break - } - continue - } - - if err == pool.ErrClosed || internal.IsReadOnlyError(err) { - node = nil - continue - } - - if internal.IsRetryableError(err, true) { - // First retry the same node. - if attempt == 0 { - continue - } - - // Second try random node. - node, err = c.nodes.Random() - if err != nil { - break - } - continue - } - - break - } - - return cmd.Err() -} - -// ForEachMaster concurrently calls the fn on each master node in the cluster. -// It returns the first error if any. -func (c *ClusterClient) ForEachMaster(fn func(client *Client) error) error { - state, err := c.state.ReloadOrGet() - if err != nil { - return err - } - - var wg sync.WaitGroup - errCh := make(chan error, 1) - for _, master := range state.Masters { - wg.Add(1) - go func(node *clusterNode) { - defer wg.Done() - err := fn(node.Client) - if err != nil { - select { - case errCh <- err: - default: - } - } - }(master) - } - wg.Wait() - - select { - case err := <-errCh: - return err - default: - return nil - } -} - -// ForEachSlave concurrently calls the fn on each slave node in the cluster. -// It returns the first error if any. -func (c *ClusterClient) ForEachSlave(fn func(client *Client) error) error { - state, err := c.state.ReloadOrGet() - if err != nil { - return err - } - - var wg sync.WaitGroup - errCh := make(chan error, 1) - for _, slave := range state.Slaves { - wg.Add(1) - go func(node *clusterNode) { - defer wg.Done() - err := fn(node.Client) - if err != nil { - select { - case errCh <- err: - default: - } - } - }(slave) - } - wg.Wait() - - select { - case err := <-errCh: - return err - default: - return nil - } -} - -// ForEachNode concurrently calls the fn on each known node in the cluster. -// It returns the first error if any. -func (c *ClusterClient) ForEachNode(fn func(client *Client) error) error { - state, err := c.state.ReloadOrGet() - if err != nil { - return err - } - - var wg sync.WaitGroup - errCh := make(chan error, 1) - worker := func(node *clusterNode) { - defer wg.Done() - err := fn(node.Client) - if err != nil { - select { - case errCh <- err: - default: - } - } - } - - for _, node := range state.Masters { - wg.Add(1) - go worker(node) - } - for _, node := range state.Slaves { - wg.Add(1) - go worker(node) - } - - wg.Wait() - select { - case err := <-errCh: - return err - default: - return nil - } -} - -// PoolStats returns accumulated connection pool stats. -func (c *ClusterClient) PoolStats() *PoolStats { - var acc PoolStats - - state, _ := c.state.Get() - if state == nil { - return &acc - } - - for _, node := range state.Masters { - s := node.Client.connPool.Stats() - acc.Hits += s.Hits - acc.Misses += s.Misses - acc.Timeouts += s.Timeouts - - acc.TotalConns += s.TotalConns - acc.IdleConns += s.IdleConns - acc.StaleConns += s.StaleConns - } - - for _, node := range state.Slaves { - s := node.Client.connPool.Stats() - acc.Hits += s.Hits - acc.Misses += s.Misses - acc.Timeouts += s.Timeouts - - acc.TotalConns += s.TotalConns - acc.IdleConns += s.IdleConns - acc.StaleConns += s.StaleConns - } - - return &acc -} - -func (c *ClusterClient) loadState() (*clusterState, error) { - if c.opt.ClusterSlots != nil { - slots, err := c.opt.ClusterSlots() - if err != nil { - return nil, err - } - return newClusterState(c.nodes, slots, "") - } - - addrs, err := c.nodes.Addrs() - if err != nil { - return nil, err - } - - var firstErr error - for _, addr := range addrs { - node, err := c.nodes.GetOrCreate(addr) - if err != nil { - if firstErr == nil { - firstErr = err - } - continue - } - - slots, err := node.Client.ClusterSlots().Result() - if err != nil { - if firstErr == nil { - firstErr = err - } - continue - } - - return newClusterState(c.nodes, slots, node.Client.opt.Addr) - } - - return nil, firstErr -} - -// reaper closes idle connections to the cluster. -func (c *ClusterClient) reaper(idleCheckFrequency time.Duration) { - ticker := time.NewTicker(idleCheckFrequency) - defer ticker.Stop() - - for range ticker.C { - nodes, err := c.nodes.All() - if err != nil { - break - } - - for _, node := range nodes { - _, err := node.Client.connPool.(*pool.ConnPool).ReapStaleConns() - if err != nil { - internal.Logf("ReapStaleConns failed: %s", err) - } - } - } -} - -func (c *ClusterClient) Pipeline() Pipeliner { - pipe := Pipeline{ - exec: c.processPipeline, - } - pipe.statefulCmdable.setProcessor(pipe.Process) - return &pipe -} - -func (c *ClusterClient) Pipelined(fn func(Pipeliner) error) ([]Cmder, error) { - return c.Pipeline().Pipelined(fn) -} - -func (c *ClusterClient) WrapProcessPipeline( - fn func(oldProcess func([]Cmder) error) func([]Cmder) error, -) { - c.processPipeline = fn(c.processPipeline) - c.processTxPipeline = fn(c.processTxPipeline) -} - -func (c *ClusterClient) defaultProcessPipeline(cmds []Cmder) error { - cmdsMap := newCmdsMap() - err := c.mapCmdsByNode(cmds, cmdsMap) - if err != nil { - setCmdsErr(cmds, err) - return err - } - - for attempt := 0; attempt <= c.opt.MaxRedirects; attempt++ { - if attempt > 0 { - time.Sleep(c.retryBackoff(attempt)) - } - - failedCmds := newCmdsMap() - var wg sync.WaitGroup - - for node, cmds := range cmdsMap.m { - wg.Add(1) - go func(node *clusterNode, cmds []Cmder) { - defer wg.Done() - - cn, err := node.Client.getConn() - if err != nil { - if err == pool.ErrClosed { - c.mapCmdsByNode(cmds, failedCmds) - } else { - setCmdsErr(cmds, err) - } - return - } - - err = c.pipelineProcessCmds(node, cn, cmds, failedCmds) - node.Client.releaseConnStrict(cn, err) - }(node, cmds) - } - - wg.Wait() - if len(failedCmds.m) == 0 { - break - } - cmdsMap = failedCmds - } - - return cmdsFirstErr(cmds) -} - -type cmdsMap struct { - mu sync.Mutex - m map[*clusterNode][]Cmder -} - -func newCmdsMap() *cmdsMap { - return &cmdsMap{ - m: make(map[*clusterNode][]Cmder), - } -} - -func (c *ClusterClient) mapCmdsByNode(cmds []Cmder, cmdsMap *cmdsMap) error { - state, err := c.state.Get() - if err != nil { - setCmdsErr(cmds, err) - return err - } - - cmdsAreReadOnly := c.cmdsAreReadOnly(cmds) - for _, cmd := range cmds { - var node *clusterNode - var err error - if cmdsAreReadOnly { - _, node, err = c.cmdSlotAndNode(cmd) - } else { - slot := c.cmdSlot(cmd) - node, err = state.slotMasterNode(slot) - } - if err != nil { - return err - } - cmdsMap.mu.Lock() - cmdsMap.m[node] = append(cmdsMap.m[node], cmd) - cmdsMap.mu.Unlock() - } - return nil -} - -func (c *ClusterClient) cmdsAreReadOnly(cmds []Cmder) bool { - for _, cmd := range cmds { - cmdInfo := c.cmdInfo(cmd.Name()) - if cmdInfo == nil || !cmdInfo.ReadOnly { - return false - } - } - return true -} - -func (c *ClusterClient) pipelineProcessCmds( - node *clusterNode, cn *pool.Conn, cmds []Cmder, failedCmds *cmdsMap, -) error { - err := cn.WithWriter(c.opt.WriteTimeout, func(wr *proto.Writer) error { - return writeCmd(wr, cmds...) - }) - if err != nil { - setCmdsErr(cmds, err) - failedCmds.mu.Lock() - failedCmds.m[node] = cmds - failedCmds.mu.Unlock() - return err - } - - err = cn.WithReader(c.opt.ReadTimeout, func(rd *proto.Reader) error { - return c.pipelineReadCmds(node, rd, cmds, failedCmds) - }) - return err -} - -func (c *ClusterClient) pipelineReadCmds( - node *clusterNode, rd *proto.Reader, cmds []Cmder, failedCmds *cmdsMap, -) error { - var firstErr error - for _, cmd := range cmds { - err := cmd.readReply(rd) - if err == nil { - continue - } - - if c.checkMovedErr(cmd, err, failedCmds) { - continue - } - - if internal.IsRedisError(err) { - continue - } - - failedCmds.mu.Lock() - failedCmds.m[node] = append(failedCmds.m[node], cmd) - failedCmds.mu.Unlock() - if firstErr == nil { - firstErr = err - } - } - return firstErr -} - -func (c *ClusterClient) checkMovedErr( - cmd Cmder, err error, failedCmds *cmdsMap, -) bool { - moved, ask, addr := internal.IsMovedError(err) - - if moved { - c.state.LazyReload() - - node, err := c.nodes.GetOrCreate(addr) - if err != nil { - return false - } - - failedCmds.mu.Lock() - failedCmds.m[node] = append(failedCmds.m[node], cmd) - failedCmds.mu.Unlock() - return true - } - - if ask { - node, err := c.nodes.GetOrCreate(addr) - if err != nil { - return false - } - - failedCmds.mu.Lock() - failedCmds.m[node] = append(failedCmds.m[node], NewCmd("ASKING"), cmd) - failedCmds.mu.Unlock() - return true - } - - return false -} - -// TxPipeline acts like Pipeline, but wraps queued commands with MULTI/EXEC. -func (c *ClusterClient) TxPipeline() Pipeliner { - pipe := Pipeline{ - exec: c.processTxPipeline, - } - pipe.statefulCmdable.setProcessor(pipe.Process) - return &pipe -} - -func (c *ClusterClient) TxPipelined(fn func(Pipeliner) error) ([]Cmder, error) { - return c.TxPipeline().Pipelined(fn) -} - -func (c *ClusterClient) defaultProcessTxPipeline(cmds []Cmder) error { - state, err := c.state.Get() - if err != nil { - return err - } - - cmdsMap := c.mapCmdsBySlot(cmds) - for slot, cmds := range cmdsMap { - node, err := state.slotMasterNode(slot) - if err != nil { - setCmdsErr(cmds, err) - continue - } - cmdsMap := map[*clusterNode][]Cmder{node: cmds} - - for attempt := 0; attempt <= c.opt.MaxRedirects; attempt++ { - if attempt > 0 { - time.Sleep(c.retryBackoff(attempt)) - } - - failedCmds := newCmdsMap() - var wg sync.WaitGroup - - for node, cmds := range cmdsMap { - wg.Add(1) - go func(node *clusterNode, cmds []Cmder) { - defer wg.Done() - - cn, err := node.Client.getConn() - if err != nil { - if err == pool.ErrClosed { - c.mapCmdsByNode(cmds, failedCmds) - } else { - setCmdsErr(cmds, err) - } - return - } - - err = c.txPipelineProcessCmds(node, cn, cmds, failedCmds) - node.Client.releaseConnStrict(cn, err) - }(node, cmds) - } - - wg.Wait() - if len(failedCmds.m) == 0 { - break - } - cmdsMap = failedCmds.m - } - } - - return cmdsFirstErr(cmds) -} - -func (c *ClusterClient) mapCmdsBySlot(cmds []Cmder) map[int][]Cmder { - cmdsMap := make(map[int][]Cmder) - for _, cmd := range cmds { - slot := c.cmdSlot(cmd) - cmdsMap[slot] = append(cmdsMap[slot], cmd) - } - return cmdsMap -} - -func (c *ClusterClient) txPipelineProcessCmds( - node *clusterNode, cn *pool.Conn, cmds []Cmder, failedCmds *cmdsMap, -) error { - err := cn.WithWriter(c.opt.WriteTimeout, func(wr *proto.Writer) error { - return txPipelineWriteMulti(wr, cmds) - }) - if err != nil { - setCmdsErr(cmds, err) - failedCmds.mu.Lock() - failedCmds.m[node] = cmds - failedCmds.mu.Unlock() - return err - } - - err = cn.WithReader(c.opt.ReadTimeout, func(rd *proto.Reader) error { - err := c.txPipelineReadQueued(rd, cmds, failedCmds) - if err != nil { - setCmdsErr(cmds, err) - return err - } - return pipelineReadCmds(rd, cmds) - }) - return err -} - -func (c *ClusterClient) txPipelineReadQueued( - rd *proto.Reader, cmds []Cmder, failedCmds *cmdsMap, -) error { - // Parse queued replies. - var statusCmd StatusCmd - if err := statusCmd.readReply(rd); err != nil { - return err - } - - for _, cmd := range cmds { - err := statusCmd.readReply(rd) - if err == nil { - continue - } - - if c.checkMovedErr(cmd, err, failedCmds) || internal.IsRedisError(err) { - continue - } - - return err - } - - // Parse number of replies. - line, err := rd.ReadLine() - if err != nil { - if err == Nil { - err = TxFailedErr - } - return err - } - - switch line[0] { - case proto.ErrorReply: - err := proto.ParseErrorReply(line) - for _, cmd := range cmds { - if !c.checkMovedErr(cmd, err, failedCmds) { - break - } - } - return err - case proto.ArrayReply: - // ok - default: - err := fmt.Errorf("redis: expected '*', but got line %q", line) - return err - } - - return nil -} - -func (c *ClusterClient) pubSub() *PubSub { - var node *clusterNode - pubsub := &PubSub{ - opt: c.opt.clientOptions(), - - newConn: func(channels []string) (*pool.Conn, error) { - if node != nil { - panic("node != nil") - } - - var err error - if len(channels) > 0 { - slot := hashtag.Slot(channels[0]) - node, err = c.slotMasterNode(slot) - } else { - node, err = c.nodes.Random() - } - if err != nil { - return nil, err - } - - cn, err := node.Client.newConn() - if err != nil { - node = nil - - return nil, err - } - - return cn, nil - }, - closeConn: func(cn *pool.Conn) error { - err := node.Client.connPool.CloseConn(cn) - node = nil - return err - }, - } - pubsub.init() - - return pubsub -} - -// Subscribe subscribes the client to the specified channels. -// Channels can be omitted to create empty subscription. -func (c *ClusterClient) Subscribe(channels ...string) *PubSub { - pubsub := c.pubSub() - if len(channels) > 0 { - _ = pubsub.Subscribe(channels...) - } - return pubsub -} - -// PSubscribe subscribes the client to the given patterns. -// Patterns can be omitted to create empty subscription. -func (c *ClusterClient) PSubscribe(channels ...string) *PubSub { - pubsub := c.pubSub() - if len(channels) > 0 { - _ = pubsub.PSubscribe(channels...) - } - return pubsub -} - -func appendUniqueNode(nodes []*clusterNode, node *clusterNode) []*clusterNode { - for _, n := range nodes { - if n == node { - return nodes - } - } - return append(nodes, node) -} - -func appendIfNotExists(ss []string, es ...string) []string { -loop: - for _, e := range es { - for _, s := range ss { - if s == e { - continue loop - } - } - ss = append(ss, e) - } - return ss -} - -func remove(ss []string, es ...string) []string { - if len(es) == 0 { - return ss[:0] - } - for _, e := range es { - for i, s := range ss { - if s == e { - ss = append(ss[:i], ss[i+1:]...) - break - } - } - } - return ss -} diff --git a/vendor/github.com/go-redis/redis/cluster_commands.go b/vendor/github.com/go-redis/redis/cluster_commands.go deleted file mode 100644 index dff62c90..00000000 --- a/vendor/github.com/go-redis/redis/cluster_commands.go +++ /dev/null @@ -1,22 +0,0 @@ -package redis - -import "sync/atomic" - -func (c *ClusterClient) DBSize() *IntCmd { - cmd := NewIntCmd("dbsize") - var size int64 - err := c.ForEachMaster(func(master *Client) error { - n, err := master.DBSize().Result() - if err != nil { - return err - } - atomic.AddInt64(&size, n) - return nil - }) - if err != nil { - cmd.setErr(err) - return cmd - } - cmd.val = size - return cmd -} diff --git a/vendor/github.com/go-redis/redis/command.go b/vendor/github.com/go-redis/redis/command.go deleted file mode 100644 index c70973d3..00000000 --- a/vendor/github.com/go-redis/redis/command.go +++ /dev/null @@ -1,1972 +0,0 @@ -package redis - -import ( - "fmt" - "net" - "strconv" - "strings" - "time" - - "github.com/go-redis/redis/internal" - "github.com/go-redis/redis/internal/proto" -) - -type Cmder interface { - Name() string - Args() []interface{} - stringArg(int) string - - readReply(rd *proto.Reader) error - setErr(error) - - readTimeout() *time.Duration - - Err() error -} - -func setCmdsErr(cmds []Cmder, e error) { - for _, cmd := range cmds { - if cmd.Err() == nil { - cmd.setErr(e) - } - } -} - -func cmdsFirstErr(cmds []Cmder) error { - for _, cmd := range cmds { - if err := cmd.Err(); err != nil { - return err - } - } - return nil -} - -func writeCmd(wr *proto.Writer, cmds ...Cmder) error { - for _, cmd := range cmds { - err := wr.WriteArgs(cmd.Args()) - if err != nil { - return err - } - } - return nil -} - -func cmdString(cmd Cmder, val interface{}) string { - var ss []string - for _, arg := range cmd.Args() { - ss = append(ss, fmt.Sprint(arg)) - } - s := strings.Join(ss, " ") - if err := cmd.Err(); err != nil { - return s + ": " + err.Error() - } - if val != nil { - switch vv := val.(type) { - case []byte: - return s + ": " + string(vv) - default: - return s + ": " + fmt.Sprint(val) - } - } - return s - -} - -func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int { - switch cmd.Name() { - case "eval", "evalsha": - if cmd.stringArg(2) != "0" { - return 3 - } - - return 0 - case "publish": - return 1 - } - if info == nil { - return 0 - } - return int(info.FirstKeyPos) -} - -//------------------------------------------------------------------------------ - -type baseCmd struct { - _args []interface{} - err error - - _readTimeout *time.Duration -} - -var _ Cmder = (*Cmd)(nil) - -func (cmd *baseCmd) Err() error { - return cmd.err -} - -func (cmd *baseCmd) Args() []interface{} { - return cmd._args -} - -func (cmd *baseCmd) stringArg(pos int) string { - if pos < 0 || pos >= len(cmd._args) { - return "" - } - s, _ := cmd._args[pos].(string) - return s -} - -func (cmd *baseCmd) Name() string { - if len(cmd._args) > 0 { - // Cmd name must be lower cased. - s := internal.ToLower(cmd.stringArg(0)) - cmd._args[0] = s - return s - } - return "" -} - -func (cmd *baseCmd) readTimeout() *time.Duration { - return cmd._readTimeout -} - -func (cmd *baseCmd) setReadTimeout(d time.Duration) { - cmd._readTimeout = &d -} - -func (cmd *baseCmd) setErr(e error) { - cmd.err = e -} - -//------------------------------------------------------------------------------ - -type Cmd struct { - baseCmd - - val interface{} -} - -func NewCmd(args ...interface{}) *Cmd { - return &Cmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *Cmd) Val() interface{} { - return cmd.val -} - -func (cmd *Cmd) Result() (interface{}, error) { - return cmd.val, cmd.err -} - -func (cmd *Cmd) String() (string, error) { - if cmd.err != nil { - return "", cmd.err - } - switch val := cmd.val.(type) { - case string: - return val, nil - default: - err := fmt.Errorf("redis: unexpected type=%T for String", val) - return "", err - } -} - -func (cmd *Cmd) Int() (int, error) { - if cmd.err != nil { - return 0, cmd.err - } - switch val := cmd.val.(type) { - case int64: - return int(val), nil - case string: - return strconv.Atoi(val) - default: - err := fmt.Errorf("redis: unexpected type=%T for Int", val) - return 0, err - } -} - -func (cmd *Cmd) Int64() (int64, error) { - if cmd.err != nil { - return 0, cmd.err - } - switch val := cmd.val.(type) { - case int64: - return val, nil - case string: - return strconv.ParseInt(val, 10, 64) - default: - err := fmt.Errorf("redis: unexpected type=%T for Int64", val) - return 0, err - } -} - -func (cmd *Cmd) Uint64() (uint64, error) { - if cmd.err != nil { - return 0, cmd.err - } - switch val := cmd.val.(type) { - case int64: - return uint64(val), nil - case string: - return strconv.ParseUint(val, 10, 64) - default: - err := fmt.Errorf("redis: unexpected type=%T for Uint64", val) - return 0, err - } -} - -func (cmd *Cmd) Float32() (float32, error) { - if cmd.err != nil { - return 0, cmd.err - } - switch val := cmd.val.(type) { - case int64: - return float32(val), nil - case string: - f, err := strconv.ParseFloat(val, 32) - if err != nil { - return 0, err - } - return float32(f), nil - default: - err := fmt.Errorf("redis: unexpected type=%T for Float32", val) - return 0, err - } -} - -func (cmd *Cmd) Float64() (float64, error) { - if cmd.err != nil { - return 0, cmd.err - } - switch val := cmd.val.(type) { - case int64: - return float64(val), nil - case string: - return strconv.ParseFloat(val, 64) - default: - err := fmt.Errorf("redis: unexpected type=%T for Float64", val) - return 0, err - } -} - -func (cmd *Cmd) Bool() (bool, error) { - if cmd.err != nil { - return false, cmd.err - } - switch val := cmd.val.(type) { - case int64: - return val != 0, nil - case string: - return strconv.ParseBool(val) - default: - err := fmt.Errorf("redis: unexpected type=%T for Bool", val) - return false, err - } -} - -func (cmd *Cmd) readReply(rd *proto.Reader) error { - cmd.val, cmd.err = rd.ReadReply(sliceParser) - return cmd.err -} - -// Implements proto.MultiBulkParse -func sliceParser(rd *proto.Reader, n int64) (interface{}, error) { - vals := make([]interface{}, 0, n) - for i := int64(0); i < n; i++ { - v, err := rd.ReadReply(sliceParser) - if err != nil { - if err == Nil { - vals = append(vals, nil) - continue - } - if err, ok := err.(proto.RedisError); ok { - vals = append(vals, err) - continue - } - return nil, err - } - - switch v := v.(type) { - case string: - vals = append(vals, v) - default: - vals = append(vals, v) - } - } - return vals, nil -} - -//------------------------------------------------------------------------------ - -type SliceCmd struct { - baseCmd - - val []interface{} -} - -var _ Cmder = (*SliceCmd)(nil) - -func NewSliceCmd(args ...interface{}) *SliceCmd { - return &SliceCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *SliceCmd) Val() []interface{} { - return cmd.val -} - -func (cmd *SliceCmd) Result() ([]interface{}, error) { - return cmd.val, cmd.err -} - -func (cmd *SliceCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *SliceCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(sliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]interface{}) - return nil -} - -//------------------------------------------------------------------------------ - -type StatusCmd struct { - baseCmd - - val string -} - -var _ Cmder = (*StatusCmd)(nil) - -func NewStatusCmd(args ...interface{}) *StatusCmd { - return &StatusCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *StatusCmd) Val() string { - return cmd.val -} - -func (cmd *StatusCmd) Result() (string, error) { - return cmd.val, cmd.err -} - -func (cmd *StatusCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *StatusCmd) readReply(rd *proto.Reader) error { - cmd.val, cmd.err = rd.ReadString() - return cmd.err -} - -//------------------------------------------------------------------------------ - -type IntCmd struct { - baseCmd - - val int64 -} - -var _ Cmder = (*IntCmd)(nil) - -func NewIntCmd(args ...interface{}) *IntCmd { - return &IntCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *IntCmd) Val() int64 { - return cmd.val -} - -func (cmd *IntCmd) Result() (int64, error) { - return cmd.val, cmd.err -} - -func (cmd *IntCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *IntCmd) readReply(rd *proto.Reader) error { - cmd.val, cmd.err = rd.ReadIntReply() - return cmd.err -} - -//------------------------------------------------------------------------------ - -type DurationCmd struct { - baseCmd - - val time.Duration - precision time.Duration -} - -var _ Cmder = (*DurationCmd)(nil) - -func NewDurationCmd(precision time.Duration, args ...interface{}) *DurationCmd { - return &DurationCmd{ - baseCmd: baseCmd{_args: args}, - precision: precision, - } -} - -func (cmd *DurationCmd) Val() time.Duration { - return cmd.val -} - -func (cmd *DurationCmd) Result() (time.Duration, error) { - return cmd.val, cmd.err -} - -func (cmd *DurationCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *DurationCmd) readReply(rd *proto.Reader) error { - var n int64 - n, cmd.err = rd.ReadIntReply() - if cmd.err != nil { - return cmd.err - } - cmd.val = time.Duration(n) * cmd.precision - return nil -} - -//------------------------------------------------------------------------------ - -type TimeCmd struct { - baseCmd - - val time.Time -} - -var _ Cmder = (*TimeCmd)(nil) - -func NewTimeCmd(args ...interface{}) *TimeCmd { - return &TimeCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *TimeCmd) Val() time.Time { - return cmd.val -} - -func (cmd *TimeCmd) Result() (time.Time, error) { - return cmd.val, cmd.err -} - -func (cmd *TimeCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *TimeCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(timeParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.(time.Time) - return nil -} - -// Implements proto.MultiBulkParse -func timeParser(rd *proto.Reader, n int64) (interface{}, error) { - if n != 2 { - return nil, fmt.Errorf("got %d elements, expected 2", n) - } - - sec, err := rd.ReadInt() - if err != nil { - return nil, err - } - - microsec, err := rd.ReadInt() - if err != nil { - return nil, err - } - - return time.Unix(sec, microsec*1000), nil -} - -//------------------------------------------------------------------------------ - -type BoolCmd struct { - baseCmd - - val bool -} - -var _ Cmder = (*BoolCmd)(nil) - -func NewBoolCmd(args ...interface{}) *BoolCmd { - return &BoolCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *BoolCmd) Val() bool { - return cmd.val -} - -func (cmd *BoolCmd) Result() (bool, error) { - return cmd.val, cmd.err -} - -func (cmd *BoolCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *BoolCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadReply(nil) - // `SET key value NX` returns nil when key already exists. But - // `SETNX key value` returns bool (0/1). So convert nil to bool. - // TODO: is this okay? - if cmd.err == Nil { - cmd.val = false - cmd.err = nil - return nil - } - if cmd.err != nil { - return cmd.err - } - switch v := v.(type) { - case int64: - cmd.val = v == 1 - return nil - case string: - cmd.val = v == "OK" - return nil - default: - cmd.err = fmt.Errorf("got %T, wanted int64 or string", v) - return cmd.err - } -} - -//------------------------------------------------------------------------------ - -type StringCmd struct { - baseCmd - - val string -} - -var _ Cmder = (*StringCmd)(nil) - -func NewStringCmd(args ...interface{}) *StringCmd { - return &StringCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *StringCmd) Val() string { - return cmd.val -} - -func (cmd *StringCmd) Result() (string, error) { - return cmd.Val(), cmd.err -} - -func (cmd *StringCmd) Bytes() ([]byte, error) { - return []byte(cmd.val), cmd.err -} - -func (cmd *StringCmd) Int() (int, error) { - if cmd.err != nil { - return 0, cmd.err - } - return strconv.Atoi(cmd.Val()) -} - -func (cmd *StringCmd) Int64() (int64, error) { - if cmd.err != nil { - return 0, cmd.err - } - return strconv.ParseInt(cmd.Val(), 10, 64) -} - -func (cmd *StringCmd) Uint64() (uint64, error) { - if cmd.err != nil { - return 0, cmd.err - } - return strconv.ParseUint(cmd.Val(), 10, 64) -} - -func (cmd *StringCmd) Float32() (float32, error) { - if cmd.err != nil { - return 0, cmd.err - } - f, err := strconv.ParseFloat(cmd.Val(), 32) - if err != nil { - return 0, err - } - return float32(f), nil -} - -func (cmd *StringCmd) Float64() (float64, error) { - if cmd.err != nil { - return 0, cmd.err - } - return strconv.ParseFloat(cmd.Val(), 64) -} - -func (cmd *StringCmd) Scan(val interface{}) error { - if cmd.err != nil { - return cmd.err - } - return proto.Scan([]byte(cmd.val), val) -} - -func (cmd *StringCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *StringCmd) readReply(rd *proto.Reader) error { - cmd.val, cmd.err = rd.ReadString() - return cmd.err -} - -//------------------------------------------------------------------------------ - -type FloatCmd struct { - baseCmd - - val float64 -} - -var _ Cmder = (*FloatCmd)(nil) - -func NewFloatCmd(args ...interface{}) *FloatCmd { - return &FloatCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *FloatCmd) Val() float64 { - return cmd.val -} - -func (cmd *FloatCmd) Result() (float64, error) { - return cmd.Val(), cmd.Err() -} - -func (cmd *FloatCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *FloatCmd) readReply(rd *proto.Reader) error { - cmd.val, cmd.err = rd.ReadFloatReply() - return cmd.err -} - -//------------------------------------------------------------------------------ - -type StringSliceCmd struct { - baseCmd - - val []string -} - -var _ Cmder = (*StringSliceCmd)(nil) - -func NewStringSliceCmd(args ...interface{}) *StringSliceCmd { - return &StringSliceCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *StringSliceCmd) Val() []string { - return cmd.val -} - -func (cmd *StringSliceCmd) Result() ([]string, error) { - return cmd.Val(), cmd.Err() -} - -func (cmd *StringSliceCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *StringSliceCmd) ScanSlice(container interface{}) error { - return proto.ScanSlice(cmd.Val(), container) -} - -func (cmd *StringSliceCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(stringSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]string) - return nil -} - -// Implements proto.MultiBulkParse -func stringSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - ss := make([]string, 0, n) - for i := int64(0); i < n; i++ { - switch s, err := rd.ReadString(); { - case err == Nil: - ss = append(ss, "") - case err != nil: - return nil, err - default: - ss = append(ss, s) - } - } - return ss, nil -} - -//------------------------------------------------------------------------------ - -type BoolSliceCmd struct { - baseCmd - - val []bool -} - -var _ Cmder = (*BoolSliceCmd)(nil) - -func NewBoolSliceCmd(args ...interface{}) *BoolSliceCmd { - return &BoolSliceCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *BoolSliceCmd) Val() []bool { - return cmd.val -} - -func (cmd *BoolSliceCmd) Result() ([]bool, error) { - return cmd.val, cmd.err -} - -func (cmd *BoolSliceCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *BoolSliceCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(boolSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]bool) - return nil -} - -// Implements proto.MultiBulkParse -func boolSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - bools := make([]bool, 0, n) - for i := int64(0); i < n; i++ { - n, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - bools = append(bools, n == 1) - } - return bools, nil -} - -//------------------------------------------------------------------------------ - -type StringStringMapCmd struct { - baseCmd - - val map[string]string -} - -var _ Cmder = (*StringStringMapCmd)(nil) - -func NewStringStringMapCmd(args ...interface{}) *StringStringMapCmd { - return &StringStringMapCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *StringStringMapCmd) Val() map[string]string { - return cmd.val -} - -func (cmd *StringStringMapCmd) Result() (map[string]string, error) { - return cmd.val, cmd.err -} - -func (cmd *StringStringMapCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *StringStringMapCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(stringStringMapParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.(map[string]string) - return nil -} - -// Implements proto.MultiBulkParse -func stringStringMapParser(rd *proto.Reader, n int64) (interface{}, error) { - m := make(map[string]string, n/2) - for i := int64(0); i < n; i += 2 { - key, err := rd.ReadString() - if err != nil { - return nil, err - } - - value, err := rd.ReadString() - if err != nil { - return nil, err - } - - m[key] = value - } - return m, nil -} - -//------------------------------------------------------------------------------ - -type StringIntMapCmd struct { - baseCmd - - val map[string]int64 -} - -var _ Cmder = (*StringIntMapCmd)(nil) - -func NewStringIntMapCmd(args ...interface{}) *StringIntMapCmd { - return &StringIntMapCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *StringIntMapCmd) Val() map[string]int64 { - return cmd.val -} - -func (cmd *StringIntMapCmd) Result() (map[string]int64, error) { - return cmd.val, cmd.err -} - -func (cmd *StringIntMapCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *StringIntMapCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(stringIntMapParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.(map[string]int64) - return nil -} - -// Implements proto.MultiBulkParse -func stringIntMapParser(rd *proto.Reader, n int64) (interface{}, error) { - m := make(map[string]int64, n/2) - for i := int64(0); i < n; i += 2 { - key, err := rd.ReadString() - if err != nil { - return nil, err - } - - n, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - - m[key] = n - } - return m, nil -} - -//------------------------------------------------------------------------------ - -type StringStructMapCmd struct { - baseCmd - - val map[string]struct{} -} - -var _ Cmder = (*StringStructMapCmd)(nil) - -func NewStringStructMapCmd(args ...interface{}) *StringStructMapCmd { - return &StringStructMapCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *StringStructMapCmd) Val() map[string]struct{} { - return cmd.val -} - -func (cmd *StringStructMapCmd) Result() (map[string]struct{}, error) { - return cmd.val, cmd.err -} - -func (cmd *StringStructMapCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *StringStructMapCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(stringStructMapParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.(map[string]struct{}) - return nil -} - -// Implements proto.MultiBulkParse -func stringStructMapParser(rd *proto.Reader, n int64) (interface{}, error) { - m := make(map[string]struct{}, n) - for i := int64(0); i < n; i++ { - key, err := rd.ReadString() - if err != nil { - return nil, err - } - - m[key] = struct{}{} - } - return m, nil -} - -//------------------------------------------------------------------------------ - -type XMessage struct { - ID string - Values map[string]interface{} -} - -type XMessageSliceCmd struct { - baseCmd - - val []XMessage -} - -var _ Cmder = (*XMessageSliceCmd)(nil) - -func NewXMessageSliceCmd(args ...interface{}) *XMessageSliceCmd { - return &XMessageSliceCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *XMessageSliceCmd) Val() []XMessage { - return cmd.val -} - -func (cmd *XMessageSliceCmd) Result() ([]XMessage, error) { - return cmd.val, cmd.err -} - -func (cmd *XMessageSliceCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *XMessageSliceCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(xMessageSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]XMessage) - return nil -} - -// Implements proto.MultiBulkParse -func xMessageSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - msgs := make([]XMessage, 0, n) - for i := int64(0); i < n; i++ { - _, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) { - id, err := rd.ReadString() - if err != nil { - return nil, err - } - - var values map[string]interface{} - - v, err := rd.ReadArrayReply(stringInterfaceMapParser) - if err != nil { - if err != proto.Nil { - return nil, err - } - } else { - values = v.(map[string]interface{}) - } - - msgs = append(msgs, XMessage{ - ID: id, - Values: values, - }) - return nil, nil - }) - if err != nil { - return nil, err - } - } - return msgs, nil -} - -// Implements proto.MultiBulkParse -func stringInterfaceMapParser(rd *proto.Reader, n int64) (interface{}, error) { - m := make(map[string]interface{}, n/2) - for i := int64(0); i < n; i += 2 { - key, err := rd.ReadString() - if err != nil { - return nil, err - } - - value, err := rd.ReadString() - if err != nil { - return nil, err - } - - m[key] = value - } - return m, nil -} - -//------------------------------------------------------------------------------ - -type XStream struct { - Stream string - Messages []XMessage -} - -type XStreamSliceCmd struct { - baseCmd - - val []XStream -} - -var _ Cmder = (*XStreamSliceCmd)(nil) - -func NewXStreamSliceCmd(args ...interface{}) *XStreamSliceCmd { - return &XStreamSliceCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *XStreamSliceCmd) Val() []XStream { - return cmd.val -} - -func (cmd *XStreamSliceCmd) Result() ([]XStream, error) { - return cmd.val, cmd.err -} - -func (cmd *XStreamSliceCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *XStreamSliceCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(xStreamSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]XStream) - return nil -} - -// Implements proto.MultiBulkParse -func xStreamSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - ret := make([]XStream, 0, n) - for i := int64(0); i < n; i++ { - _, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) { - if n != 2 { - return nil, fmt.Errorf("got %d, wanted 2", n) - } - - stream, err := rd.ReadString() - if err != nil { - return nil, err - } - - v, err := rd.ReadArrayReply(xMessageSliceParser) - if err != nil { - return nil, err - } - - ret = append(ret, XStream{ - Stream: stream, - Messages: v.([]XMessage), - }) - return nil, nil - }) - if err != nil { - return nil, err - } - } - return ret, nil -} - -//------------------------------------------------------------------------------ - -type XPending struct { - Count int64 - Lower string - Higher string - Consumers map[string]int64 -} - -type XPendingCmd struct { - baseCmd - val *XPending -} - -var _ Cmder = (*XPendingCmd)(nil) - -func NewXPendingCmd(args ...interface{}) *XPendingCmd { - return &XPendingCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *XPendingCmd) Val() *XPending { - return cmd.val -} - -func (cmd *XPendingCmd) Result() (*XPending, error) { - return cmd.val, cmd.err -} - -func (cmd *XPendingCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *XPendingCmd) readReply(rd *proto.Reader) error { - var info interface{} - info, cmd.err = rd.ReadArrayReply(xPendingParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = info.(*XPending) - return nil -} - -func xPendingParser(rd *proto.Reader, n int64) (interface{}, error) { - if n != 4 { - return nil, fmt.Errorf("got %d, wanted 4", n) - } - - count, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - - lower, err := rd.ReadString() - if err != nil && err != Nil { - return nil, err - } - - higher, err := rd.ReadString() - if err != nil && err != Nil { - return nil, err - } - - pending := &XPending{ - Count: count, - Lower: lower, - Higher: higher, - } - _, err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) { - for i := int64(0); i < n; i++ { - _, err = rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) { - if n != 2 { - return nil, fmt.Errorf("got %d, wanted 2", n) - } - - consumerName, err := rd.ReadString() - if err != nil { - return nil, err - } - - consumerPending, err := rd.ReadInt() - if err != nil { - return nil, err - } - - if pending.Consumers == nil { - pending.Consumers = make(map[string]int64) - } - pending.Consumers[consumerName] = consumerPending - - return nil, nil - }) - if err != nil { - return nil, err - } - } - return nil, nil - }) - if err != nil && err != Nil { - return nil, err - } - - return pending, nil -} - -//------------------------------------------------------------------------------ - -type XPendingExt struct { - Id string - Consumer string - Idle time.Duration - RetryCount int64 -} - -type XPendingExtCmd struct { - baseCmd - val []XPendingExt -} - -var _ Cmder = (*XPendingExtCmd)(nil) - -func NewXPendingExtCmd(args ...interface{}) *XPendingExtCmd { - return &XPendingExtCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *XPendingExtCmd) Val() []XPendingExt { - return cmd.val -} - -func (cmd *XPendingExtCmd) Result() ([]XPendingExt, error) { - return cmd.val, cmd.err -} - -func (cmd *XPendingExtCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *XPendingExtCmd) readReply(rd *proto.Reader) error { - var info interface{} - info, cmd.err = rd.ReadArrayReply(xPendingExtSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = info.([]XPendingExt) - return nil -} - -func xPendingExtSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - ret := make([]XPendingExt, 0, n) - for i := int64(0); i < n; i++ { - _, err := rd.ReadArrayReply(func(rd *proto.Reader, n int64) (interface{}, error) { - if n != 4 { - return nil, fmt.Errorf("got %d, wanted 4", n) - } - - id, err := rd.ReadString() - if err != nil { - return nil, err - } - - consumer, err := rd.ReadString() - if err != nil && err != Nil { - return nil, err - } - - idle, err := rd.ReadIntReply() - if err != nil && err != Nil { - return nil, err - } - - retryCount, err := rd.ReadIntReply() - if err != nil && err != Nil { - return nil, err - } - - ret = append(ret, XPendingExt{ - Id: id, - Consumer: consumer, - Idle: time.Duration(idle) * time.Millisecond, - RetryCount: retryCount, - }) - return nil, nil - }) - if err != nil { - return nil, err - } - } - return ret, nil -} - -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -type ZSliceCmd struct { - baseCmd - - val []Z -} - -var _ Cmder = (*ZSliceCmd)(nil) - -func NewZSliceCmd(args ...interface{}) *ZSliceCmd { - return &ZSliceCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *ZSliceCmd) Val() []Z { - return cmd.val -} - -func (cmd *ZSliceCmd) Result() ([]Z, error) { - return cmd.val, cmd.err -} - -func (cmd *ZSliceCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *ZSliceCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(zSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]Z) - return nil -} - -// Implements proto.MultiBulkParse -func zSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - zz := make([]Z, n/2) - for i := int64(0); i < n; i += 2 { - var err error - - z := &zz[i/2] - - z.Member, err = rd.ReadString() - if err != nil { - return nil, err - } - - z.Score, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - } - return zz, nil -} - -//------------------------------------------------------------------------------ - -type ZWithKeyCmd struct { - baseCmd - - val ZWithKey -} - -var _ Cmder = (*ZWithKeyCmd)(nil) - -func NewZWithKeyCmd(args ...interface{}) *ZWithKeyCmd { - return &ZWithKeyCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *ZWithKeyCmd) Val() ZWithKey { - return cmd.val -} - -func (cmd *ZWithKeyCmd) Result() (ZWithKey, error) { - return cmd.Val(), cmd.Err() -} - -func (cmd *ZWithKeyCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *ZWithKeyCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(zWithKeyParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.(ZWithKey) - return nil -} - -// Implements proto.MultiBulkParse -func zWithKeyParser(rd *proto.Reader, n int64) (interface{}, error) { - if n != 3 { - return nil, fmt.Errorf("got %d elements, expected 3", n) - } - - var z ZWithKey - var err error - - z.Key, err = rd.ReadString() - if err != nil { - return nil, err - } - z.Member, err = rd.ReadString() - if err != nil { - return nil, err - } - z.Score, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - return z, nil -} - -//------------------------------------------------------------------------------ - -type ScanCmd struct { - baseCmd - - page []string - cursor uint64 - - process func(cmd Cmder) error -} - -var _ Cmder = (*ScanCmd)(nil) - -func NewScanCmd(process func(cmd Cmder) error, args ...interface{}) *ScanCmd { - return &ScanCmd{ - baseCmd: baseCmd{_args: args}, - process: process, - } -} - -func (cmd *ScanCmd) Val() (keys []string, cursor uint64) { - return cmd.page, cmd.cursor -} - -func (cmd *ScanCmd) Result() (keys []string, cursor uint64, err error) { - return cmd.page, cmd.cursor, cmd.err -} - -func (cmd *ScanCmd) String() string { - return cmdString(cmd, cmd.page) -} - -func (cmd *ScanCmd) readReply(rd *proto.Reader) error { - cmd.page, cmd.cursor, cmd.err = rd.ReadScanReply() - return cmd.err -} - -// Iterator creates a new ScanIterator. -func (cmd *ScanCmd) Iterator() *ScanIterator { - return &ScanIterator{ - cmd: cmd, - } -} - -//------------------------------------------------------------------------------ - -type ClusterNode struct { - Id string - Addr string -} - -type ClusterSlot struct { - Start int - End int - Nodes []ClusterNode -} - -type ClusterSlotsCmd struct { - baseCmd - - val []ClusterSlot -} - -var _ Cmder = (*ClusterSlotsCmd)(nil) - -func NewClusterSlotsCmd(args ...interface{}) *ClusterSlotsCmd { - return &ClusterSlotsCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *ClusterSlotsCmd) Val() []ClusterSlot { - return cmd.val -} - -func (cmd *ClusterSlotsCmd) Result() ([]ClusterSlot, error) { - return cmd.Val(), cmd.Err() -} - -func (cmd *ClusterSlotsCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *ClusterSlotsCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(clusterSlotsParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.([]ClusterSlot) - return nil -} - -// Implements proto.MultiBulkParse -func clusterSlotsParser(rd *proto.Reader, n int64) (interface{}, error) { - slots := make([]ClusterSlot, n) - for i := 0; i < len(slots); i++ { - n, err := rd.ReadArrayLen() - if err != nil { - return nil, err - } - if n < 2 { - err := fmt.Errorf("redis: got %d elements in cluster info, expected at least 2", n) - return nil, err - } - - start, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - - end, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - - nodes := make([]ClusterNode, n-2) - for j := 0; j < len(nodes); j++ { - n, err := rd.ReadArrayLen() - if err != nil { - return nil, err - } - if n != 2 && n != 3 { - err := fmt.Errorf("got %d elements in cluster info address, expected 2 or 3", n) - return nil, err - } - - ip, err := rd.ReadString() - if err != nil { - return nil, err - } - - port, err := rd.ReadString() - if err != nil { - return nil, err - } - - nodes[j].Addr = net.JoinHostPort(ip, port) - - if n == 3 { - id, err := rd.ReadString() - if err != nil { - return nil, err - } - nodes[j].Id = id - } - } - - slots[i] = ClusterSlot{ - Start: int(start), - End: int(end), - Nodes: nodes, - } - } - return slots, nil -} - -//------------------------------------------------------------------------------ - -// GeoLocation is used with GeoAdd to add geospatial location. -type GeoLocation struct { - Name string - Longitude, Latitude, Dist float64 - GeoHash int64 -} - -// GeoRadiusQuery is used with GeoRadius to query geospatial index. -type GeoRadiusQuery struct { - Radius float64 - // Can be m, km, ft, or mi. Default is km. - Unit string - WithCoord bool - WithDist bool - WithGeoHash bool - Count int - // Can be ASC or DESC. Default is no sort order. - Sort string - Store string - StoreDist string -} - -type GeoLocationCmd struct { - baseCmd - - q *GeoRadiusQuery - locations []GeoLocation -} - -var _ Cmder = (*GeoLocationCmd)(nil) - -func NewGeoLocationCmd(q *GeoRadiusQuery, args ...interface{}) *GeoLocationCmd { - args = append(args, q.Radius) - if q.Unit != "" { - args = append(args, q.Unit) - } else { - args = append(args, "km") - } - if q.WithCoord { - args = append(args, "withcoord") - } - if q.WithDist { - args = append(args, "withdist") - } - if q.WithGeoHash { - args = append(args, "withhash") - } - if q.Count > 0 { - args = append(args, "count", q.Count) - } - if q.Sort != "" { - args = append(args, q.Sort) - } - if q.Store != "" { - args = append(args, "store") - args = append(args, q.Store) - } - if q.StoreDist != "" { - args = append(args, "storedist") - args = append(args, q.StoreDist) - } - return &GeoLocationCmd{ - baseCmd: baseCmd{_args: args}, - q: q, - } -} - -func (cmd *GeoLocationCmd) Val() []GeoLocation { - return cmd.locations -} - -func (cmd *GeoLocationCmd) Result() ([]GeoLocation, error) { - return cmd.locations, cmd.err -} - -func (cmd *GeoLocationCmd) String() string { - return cmdString(cmd, cmd.locations) -} - -func (cmd *GeoLocationCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(newGeoLocationSliceParser(cmd.q)) - if cmd.err != nil { - return cmd.err - } - cmd.locations = v.([]GeoLocation) - return nil -} - -func newGeoLocationParser(q *GeoRadiusQuery) proto.MultiBulkParse { - return func(rd *proto.Reader, n int64) (interface{}, error) { - var loc GeoLocation - var err error - - loc.Name, err = rd.ReadString() - if err != nil { - return nil, err - } - if q.WithDist { - loc.Dist, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - } - if q.WithGeoHash { - loc.GeoHash, err = rd.ReadIntReply() - if err != nil { - return nil, err - } - } - if q.WithCoord { - n, err := rd.ReadArrayLen() - if err != nil { - return nil, err - } - if n != 2 { - return nil, fmt.Errorf("got %d coordinates, expected 2", n) - } - - loc.Longitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - loc.Latitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - } - - return &loc, nil - } -} - -func newGeoLocationSliceParser(q *GeoRadiusQuery) proto.MultiBulkParse { - return func(rd *proto.Reader, n int64) (interface{}, error) { - locs := make([]GeoLocation, 0, n) - for i := int64(0); i < n; i++ { - v, err := rd.ReadReply(newGeoLocationParser(q)) - if err != nil { - return nil, err - } - switch vv := v.(type) { - case string: - locs = append(locs, GeoLocation{ - Name: vv, - }) - case *GeoLocation: - locs = append(locs, *vv) - default: - return nil, fmt.Errorf("got %T, expected string or *GeoLocation", v) - } - } - return locs, nil - } -} - -//------------------------------------------------------------------------------ - -type GeoPos struct { - Longitude, Latitude float64 -} - -type GeoPosCmd struct { - baseCmd - - positions []*GeoPos -} - -var _ Cmder = (*GeoPosCmd)(nil) - -func NewGeoPosCmd(args ...interface{}) *GeoPosCmd { - return &GeoPosCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *GeoPosCmd) Val() []*GeoPos { - return cmd.positions -} - -func (cmd *GeoPosCmd) Result() ([]*GeoPos, error) { - return cmd.Val(), cmd.Err() -} - -func (cmd *GeoPosCmd) String() string { - return cmdString(cmd, cmd.positions) -} - -func (cmd *GeoPosCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(geoPosSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.positions = v.([]*GeoPos) - return nil -} - -func geoPosSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - positions := make([]*GeoPos, 0, n) - for i := int64(0); i < n; i++ { - v, err := rd.ReadReply(geoPosParser) - if err != nil { - if err == Nil { - positions = append(positions, nil) - continue - } - return nil, err - } - switch v := v.(type) { - case *GeoPos: - positions = append(positions, v) - default: - return nil, fmt.Errorf("got %T, expected *GeoPos", v) - } - } - return positions, nil -} - -func geoPosParser(rd *proto.Reader, n int64) (interface{}, error) { - var pos GeoPos - var err error - - pos.Longitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - - pos.Latitude, err = rd.ReadFloatReply() - if err != nil { - return nil, err - } - - return &pos, nil -} - -//------------------------------------------------------------------------------ - -type CommandInfo struct { - Name string - Arity int8 - Flags []string - FirstKeyPos int8 - LastKeyPos int8 - StepCount int8 - ReadOnly bool -} - -type CommandsInfoCmd struct { - baseCmd - - val map[string]*CommandInfo -} - -var _ Cmder = (*CommandsInfoCmd)(nil) - -func NewCommandsInfoCmd(args ...interface{}) *CommandsInfoCmd { - return &CommandsInfoCmd{ - baseCmd: baseCmd{_args: args}, - } -} - -func (cmd *CommandsInfoCmd) Val() map[string]*CommandInfo { - return cmd.val -} - -func (cmd *CommandsInfoCmd) Result() (map[string]*CommandInfo, error) { - return cmd.Val(), cmd.Err() -} - -func (cmd *CommandsInfoCmd) String() string { - return cmdString(cmd, cmd.val) -} - -func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error { - var v interface{} - v, cmd.err = rd.ReadArrayReply(commandInfoSliceParser) - if cmd.err != nil { - return cmd.err - } - cmd.val = v.(map[string]*CommandInfo) - return nil -} - -// Implements proto.MultiBulkParse -func commandInfoSliceParser(rd *proto.Reader, n int64) (interface{}, error) { - m := make(map[string]*CommandInfo, n) - for i := int64(0); i < n; i++ { - v, err := rd.ReadReply(commandInfoParser) - if err != nil { - return nil, err - } - vv := v.(*CommandInfo) - m[vv.Name] = vv - - } - return m, nil -} - -func commandInfoParser(rd *proto.Reader, n int64) (interface{}, error) { - var cmd CommandInfo - var err error - - if n != 6 { - return nil, fmt.Errorf("redis: got %d elements in COMMAND reply, wanted 6", n) - } - - cmd.Name, err = rd.ReadString() - if err != nil { - return nil, err - } - - arity, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - cmd.Arity = int8(arity) - - flags, err := rd.ReadReply(stringSliceParser) - if err != nil { - return nil, err - } - cmd.Flags = flags.([]string) - - firstKeyPos, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - cmd.FirstKeyPos = int8(firstKeyPos) - - lastKeyPos, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - cmd.LastKeyPos = int8(lastKeyPos) - - stepCount, err := rd.ReadIntReply() - if err != nil { - return nil, err - } - cmd.StepCount = int8(stepCount) - - for _, flag := range cmd.Flags { - if flag == "readonly" { - cmd.ReadOnly = true - break - } - } - - return &cmd, nil -} - -//------------------------------------------------------------------------------ - -type cmdsInfoCache struct { - fn func() (map[string]*CommandInfo, error) - - once internal.Once - cmds map[string]*CommandInfo -} - -func newCmdsInfoCache(fn func() (map[string]*CommandInfo, error)) *cmdsInfoCache { - return &cmdsInfoCache{ - fn: fn, - } -} - -func (c *cmdsInfoCache) Get() (map[string]*CommandInfo, error) { - err := c.once.Do(func() error { - cmds, err := c.fn() - if err != nil { - return err - } - c.cmds = cmds - return nil - }) - return c.cmds, err -} diff --git a/vendor/github.com/go-redis/redis/commands.go b/vendor/github.com/go-redis/redis/commands.go deleted file mode 100644 index 653e4abe..00000000 --- a/vendor/github.com/go-redis/redis/commands.go +++ /dev/null @@ -1,2583 +0,0 @@ -package redis - -import ( - "errors" - "io" - "time" - - "github.com/go-redis/redis/internal" -) - -func usePrecise(dur time.Duration) bool { - return dur < time.Second || dur%time.Second != 0 -} - -func formatMs(dur time.Duration) int64 { - if dur > 0 && dur < time.Millisecond { - internal.Logf( - "specified duration is %s, but minimal supported value is %s", - dur, time.Millisecond, - ) - } - return int64(dur / time.Millisecond) -} - -func formatSec(dur time.Duration) int64 { - if dur > 0 && dur < time.Second { - internal.Logf( - "specified duration is %s, but minimal supported value is %s", - dur, time.Second, - ) - } - return int64(dur / time.Second) -} - -func appendArgs(dst, src []interface{}) []interface{} { - if len(src) == 1 { - if ss, ok := src[0].([]string); ok { - for _, s := range ss { - dst = append(dst, s) - } - return dst - } - } - - for _, v := range src { - dst = append(dst, v) - } - return dst -} - -type Cmdable interface { - Pipeline() Pipeliner - Pipelined(fn func(Pipeliner) error) ([]Cmder, error) - - TxPipelined(fn func(Pipeliner) error) ([]Cmder, error) - TxPipeline() Pipeliner - - Command() *CommandsInfoCmd - ClientGetName() *StringCmd - Echo(message interface{}) *StringCmd - Ping() *StatusCmd - Quit() *StatusCmd - Del(keys ...string) *IntCmd - Unlink(keys ...string) *IntCmd - Dump(key string) *StringCmd - Exists(keys ...string) *IntCmd - Expire(key string, expiration time.Duration) *BoolCmd - ExpireAt(key string, tm time.Time) *BoolCmd - Keys(pattern string) *StringSliceCmd - Migrate(host, port, key string, db int64, timeout time.Duration) *StatusCmd - Move(key string, db int64) *BoolCmd - ObjectRefCount(key string) *IntCmd - ObjectEncoding(key string) *StringCmd - ObjectIdleTime(key string) *DurationCmd - Persist(key string) *BoolCmd - PExpire(key string, expiration time.Duration) *BoolCmd - PExpireAt(key string, tm time.Time) *BoolCmd - PTTL(key string) *DurationCmd - RandomKey() *StringCmd - Rename(key, newkey string) *StatusCmd - RenameNX(key, newkey string) *BoolCmd - Restore(key string, ttl time.Duration, value string) *StatusCmd - RestoreReplace(key string, ttl time.Duration, value string) *StatusCmd - Sort(key string, sort *Sort) *StringSliceCmd - SortStore(key, store string, sort *Sort) *IntCmd - SortInterfaces(key string, sort *Sort) *SliceCmd - Touch(keys ...string) *IntCmd - TTL(key string) *DurationCmd - Type(key string) *StatusCmd - Scan(cursor uint64, match string, count int64) *ScanCmd - SScan(key string, cursor uint64, match string, count int64) *ScanCmd - HScan(key string, cursor uint64, match string, count int64) *ScanCmd - ZScan(key string, cursor uint64, match string, count int64) *ScanCmd - Append(key, value string) *IntCmd - BitCount(key string, bitCount *BitCount) *IntCmd - BitOpAnd(destKey string, keys ...string) *IntCmd - BitOpOr(destKey string, keys ...string) *IntCmd - BitOpXor(destKey string, keys ...string) *IntCmd - BitOpNot(destKey string, key string) *IntCmd - BitPos(key string, bit int64, pos ...int64) *IntCmd - Decr(key string) *IntCmd - DecrBy(key string, decrement int64) *IntCmd - Get(key string) *StringCmd - GetBit(key string, offset int64) *IntCmd - GetRange(key string, start, end int64) *StringCmd - GetSet(key string, value interface{}) *StringCmd - Incr(key string) *IntCmd - IncrBy(key string, value int64) *IntCmd - IncrByFloat(key string, value float64) *FloatCmd - MGet(keys ...string) *SliceCmd - MSet(pairs ...interface{}) *StatusCmd - MSetNX(pairs ...interface{}) *BoolCmd - Set(key string, value interface{}, expiration time.Duration) *StatusCmd - SetBit(key string, offset int64, value int) *IntCmd - SetNX(key string, value interface{}, expiration time.Duration) *BoolCmd - SetXX(key string, value interface{}, expiration time.Duration) *BoolCmd - SetRange(key string, offset int64, value string) *IntCmd - StrLen(key string) *IntCmd - HDel(key string, fields ...string) *IntCmd - HExists(key, field string) *BoolCmd - HGet(key, field string) *StringCmd - HGetAll(key string) *StringStringMapCmd - HIncrBy(key, field string, incr int64) *IntCmd - HIncrByFloat(key, field string, incr float64) *FloatCmd - HKeys(key string) *StringSliceCmd - HLen(key string) *IntCmd - HMGet(key string, fields ...string) *SliceCmd - HMSet(key string, fields map[string]interface{}) *StatusCmd - HSet(key, field string, value interface{}) *BoolCmd - HSetNX(key, field string, value interface{}) *BoolCmd - HVals(key string) *StringSliceCmd - BLPop(timeout time.Duration, keys ...string) *StringSliceCmd - BRPop(timeout time.Duration, keys ...string) *StringSliceCmd - BRPopLPush(source, destination string, timeout time.Duration) *StringCmd - LIndex(key string, index int64) *StringCmd - LInsert(key, op string, pivot, value interface{}) *IntCmd - LInsertBefore(key string, pivot, value interface{}) *IntCmd - LInsertAfter(key string, pivot, value interface{}) *IntCmd - LLen(key string) *IntCmd - LPop(key string) *StringCmd - LPush(key string, values ...interface{}) *IntCmd - LPushX(key string, value interface{}) *IntCmd - LRange(key string, start, stop int64) *StringSliceCmd - LRem(key string, count int64, value interface{}) *IntCmd - LSet(key string, index int64, value interface{}) *StatusCmd - LTrim(key string, start, stop int64) *StatusCmd - RPop(key string) *StringCmd - RPopLPush(source, destination string) *StringCmd - RPush(key string, values ...interface{}) *IntCmd - RPushX(key string, value interface{}) *IntCmd - SAdd(key string, members ...interface{}) *IntCmd - SCard(key string) *IntCmd - SDiff(keys ...string) *StringSliceCmd - SDiffStore(destination string, keys ...string) *IntCmd - SInter(keys ...string) *StringSliceCmd - SInterStore(destination string, keys ...string) *IntCmd - SIsMember(key string, member interface{}) *BoolCmd - SMembers(key string) *StringSliceCmd - SMembersMap(key string) *StringStructMapCmd - SMove(source, destination string, member interface{}) *BoolCmd - SPop(key string) *StringCmd - SPopN(key string, count int64) *StringSliceCmd - SRandMember(key string) *StringCmd - SRandMemberN(key string, count int64) *StringSliceCmd - SRem(key string, members ...interface{}) *IntCmd - SUnion(keys ...string) *StringSliceCmd - SUnionStore(destination string, keys ...string) *IntCmd - XAdd(a *XAddArgs) *StringCmd - XDel(stream string, ids ...string) *IntCmd - XLen(stream string) *IntCmd - XRange(stream, start, stop string) *XMessageSliceCmd - XRangeN(stream, start, stop string, count int64) *XMessageSliceCmd - XRevRange(stream string, start, stop string) *XMessageSliceCmd - XRevRangeN(stream string, start, stop string, count int64) *XMessageSliceCmd - XRead(a *XReadArgs) *XStreamSliceCmd - XReadStreams(streams ...string) *XStreamSliceCmd - XGroupCreate(stream, group, start string) *StatusCmd - XGroupCreateMkStream(stream, group, start string) *StatusCmd - XGroupSetID(stream, group, start string) *StatusCmd - XGroupDestroy(stream, group string) *IntCmd - XGroupDelConsumer(stream, group, consumer string) *IntCmd - XReadGroup(a *XReadGroupArgs) *XStreamSliceCmd - XAck(stream, group string, ids ...string) *IntCmd - XPending(stream, group string) *XPendingCmd - XPendingExt(a *XPendingExtArgs) *XPendingExtCmd - XClaim(a *XClaimArgs) *XMessageSliceCmd - XClaimJustID(a *XClaimArgs) *StringSliceCmd - XTrim(key string, maxLen int64) *IntCmd - XTrimApprox(key string, maxLen int64) *IntCmd - BZPopMax(timeout time.Duration, keys ...string) *ZWithKeyCmd - BZPopMin(timeout time.Duration, keys ...string) *ZWithKeyCmd - ZAdd(key string, members ...Z) *IntCmd - ZAddNX(key string, members ...Z) *IntCmd - ZAddXX(key string, members ...Z) *IntCmd - ZAddCh(key string, members ...Z) *IntCmd - ZAddNXCh(key string, members ...Z) *IntCmd - ZAddXXCh(key string, members ...Z) *IntCmd - ZIncr(key string, member Z) *FloatCmd - ZIncrNX(key string, member Z) *FloatCmd - ZIncrXX(key string, member Z) *FloatCmd - ZCard(key string) *IntCmd - ZCount(key, min, max string) *IntCmd - ZLexCount(key, min, max string) *IntCmd - ZIncrBy(key string, increment float64, member string) *FloatCmd - ZInterStore(destination string, store ZStore, keys ...string) *IntCmd - ZPopMax(key string, count ...int64) *ZSliceCmd - ZPopMin(key string, count ...int64) *ZSliceCmd - ZRange(key string, start, stop int64) *StringSliceCmd - ZRangeWithScores(key string, start, stop int64) *ZSliceCmd - ZRangeByScore(key string, opt ZRangeBy) *StringSliceCmd - ZRangeByLex(key string, opt ZRangeBy) *StringSliceCmd - ZRangeByScoreWithScores(key string, opt ZRangeBy) *ZSliceCmd - ZRank(key, member string) *IntCmd - ZRem(key string, members ...interface{}) *IntCmd - ZRemRangeByRank(key string, start, stop int64) *IntCmd - ZRemRangeByScore(key, min, max string) *IntCmd - ZRemRangeByLex(key, min, max string) *IntCmd - ZRevRange(key string, start, stop int64) *StringSliceCmd - ZRevRangeWithScores(key string, start, stop int64) *ZSliceCmd - ZRevRangeByScore(key string, opt ZRangeBy) *StringSliceCmd - ZRevRangeByLex(key string, opt ZRangeBy) *StringSliceCmd - ZRevRangeByScoreWithScores(key string, opt ZRangeBy) *ZSliceCmd - ZRevRank(key, member string) *IntCmd - ZScore(key, member string) *FloatCmd - ZUnionStore(dest string, store ZStore, keys ...string) *IntCmd - PFAdd(key string, els ...interface{}) *IntCmd - PFCount(keys ...string) *IntCmd - PFMerge(dest string, keys ...string) *StatusCmd - BgRewriteAOF() *StatusCmd - BgSave() *StatusCmd - ClientKill(ipPort string) *StatusCmd - ClientKillByFilter(keys ...string) *IntCmd - ClientList() *StringCmd - ClientPause(dur time.Duration) *BoolCmd - ClientID() *IntCmd - ConfigGet(parameter string) *SliceCmd - ConfigResetStat() *StatusCmd - ConfigSet(parameter, value string) *StatusCmd - ConfigRewrite() *StatusCmd - DBSize() *IntCmd - FlushAll() *StatusCmd - FlushAllAsync() *StatusCmd - FlushDB() *StatusCmd - FlushDBAsync() *StatusCmd - Info(section ...string) *StringCmd - LastSave() *IntCmd - Save() *StatusCmd - Shutdown() *StatusCmd - ShutdownSave() *StatusCmd - ShutdownNoSave() *StatusCmd - SlaveOf(host, port string) *StatusCmd - Time() *TimeCmd - Eval(script string, keys []string, args ...interface{}) *Cmd - EvalSha(sha1 string, keys []string, args ...interface{}) *Cmd - ScriptExists(hashes ...string) *BoolSliceCmd - ScriptFlush() *StatusCmd - ScriptKill() *StatusCmd - ScriptLoad(script string) *StringCmd - DebugObject(key string) *StringCmd - Publish(channel string, message interface{}) *IntCmd - PubSubChannels(pattern string) *StringSliceCmd - PubSubNumSub(channels ...string) *StringIntMapCmd - PubSubNumPat() *IntCmd - ClusterSlots() *ClusterSlotsCmd - ClusterNodes() *StringCmd - ClusterMeet(host, port string) *StatusCmd - ClusterForget(nodeID string) *StatusCmd - ClusterReplicate(nodeID string) *StatusCmd - ClusterResetSoft() *StatusCmd - ClusterResetHard() *StatusCmd - ClusterInfo() *StringCmd - ClusterKeySlot(key string) *IntCmd - ClusterGetKeysInSlot(slot int, count int) *StringSliceCmd - ClusterCountFailureReports(nodeID string) *IntCmd - ClusterCountKeysInSlot(slot int) *IntCmd - ClusterDelSlots(slots ...int) *StatusCmd - ClusterDelSlotsRange(min, max int) *StatusCmd - ClusterSaveConfig() *StatusCmd - ClusterSlaves(nodeID string) *StringSliceCmd - ClusterFailover() *StatusCmd - ClusterAddSlots(slots ...int) *StatusCmd - ClusterAddSlotsRange(min, max int) *StatusCmd - GeoAdd(key string, geoLocation ...*GeoLocation) *IntCmd - GeoPos(key string, members ...string) *GeoPosCmd - GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) *GeoLocationCmd - GeoRadiusRO(key string, longitude, latitude float64, query *GeoRadiusQuery) *GeoLocationCmd - GeoRadiusByMember(key, member string, query *GeoRadiusQuery) *GeoLocationCmd - GeoRadiusByMemberRO(key, member string, query *GeoRadiusQuery) *GeoLocationCmd - GeoDist(key string, member1, member2, unit string) *FloatCmd - GeoHash(key string, members ...string) *StringSliceCmd - ReadOnly() *StatusCmd - ReadWrite() *StatusCmd - MemoryUsage(key string, samples ...int) *IntCmd -} - -type StatefulCmdable interface { - Cmdable - Auth(password string) *StatusCmd - Select(index int) *StatusCmd - SwapDB(index1, index2 int) *StatusCmd - ClientSetName(name string) *BoolCmd -} - -var _ Cmdable = (*Client)(nil) -var _ Cmdable = (*Tx)(nil) -var _ Cmdable = (*Ring)(nil) -var _ Cmdable = (*ClusterClient)(nil) - -type cmdable struct { - process func(cmd Cmder) error -} - -func (c *cmdable) setProcessor(fn func(Cmder) error) { - c.process = fn -} - -type statefulCmdable struct { - cmdable - process func(cmd Cmder) error -} - -func (c *statefulCmdable) setProcessor(fn func(Cmder) error) { - c.process = fn - c.cmdable.setProcessor(fn) -} - -//------------------------------------------------------------------------------ - -func (c *statefulCmdable) Auth(password string) *StatusCmd { - cmd := NewStatusCmd("auth", password) - c.process(cmd) - return cmd -} - -func (c *cmdable) Echo(message interface{}) *StringCmd { - cmd := NewStringCmd("echo", message) - c.process(cmd) - return cmd -} - -func (c *cmdable) Ping() *StatusCmd { - cmd := NewStatusCmd("ping") - c.process(cmd) - return cmd -} - -func (c *cmdable) Wait(numSlaves int, timeout time.Duration) *IntCmd { - cmd := NewIntCmd("wait", numSlaves, int(timeout/time.Millisecond)) - c.process(cmd) - return cmd -} - -func (c *cmdable) Quit() *StatusCmd { - panic("not implemented") -} - -func (c *statefulCmdable) Select(index int) *StatusCmd { - cmd := NewStatusCmd("select", index) - c.process(cmd) - return cmd -} - -func (c *statefulCmdable) SwapDB(index1, index2 int) *StatusCmd { - cmd := NewStatusCmd("swapdb", index1, index2) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) Command() *CommandsInfoCmd { - cmd := NewCommandsInfoCmd("command") - c.process(cmd) - return cmd -} - -func (c *cmdable) Del(keys ...string) *IntCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "del" - for i, key := range keys { - args[1+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) Unlink(keys ...string) *IntCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "unlink" - for i, key := range keys { - args[1+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) Dump(key string) *StringCmd { - cmd := NewStringCmd("dump", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) Exists(keys ...string) *IntCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "exists" - for i, key := range keys { - args[1+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) Expire(key string, expiration time.Duration) *BoolCmd { - cmd := NewBoolCmd("expire", key, formatSec(expiration)) - c.process(cmd) - return cmd -} - -func (c *cmdable) ExpireAt(key string, tm time.Time) *BoolCmd { - cmd := NewBoolCmd("expireat", key, tm.Unix()) - c.process(cmd) - return cmd -} - -func (c *cmdable) Keys(pattern string) *StringSliceCmd { - cmd := NewStringSliceCmd("keys", pattern) - c.process(cmd) - return cmd -} - -func (c *cmdable) Migrate(host, port, key string, db int64, timeout time.Duration) *StatusCmd { - cmd := NewStatusCmd( - "migrate", - host, - port, - key, - db, - formatMs(timeout), - ) - cmd.setReadTimeout(timeout) - c.process(cmd) - return cmd -} - -func (c *cmdable) Move(key string, db int64) *BoolCmd { - cmd := NewBoolCmd("move", key, db) - c.process(cmd) - return cmd -} - -func (c *cmdable) ObjectRefCount(key string) *IntCmd { - cmd := NewIntCmd("object", "refcount", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) ObjectEncoding(key string) *StringCmd { - cmd := NewStringCmd("object", "encoding", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) ObjectIdleTime(key string) *DurationCmd { - cmd := NewDurationCmd(time.Second, "object", "idletime", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) Persist(key string) *BoolCmd { - cmd := NewBoolCmd("persist", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) PExpire(key string, expiration time.Duration) *BoolCmd { - cmd := NewBoolCmd("pexpire", key, formatMs(expiration)) - c.process(cmd) - return cmd -} - -func (c *cmdable) PExpireAt(key string, tm time.Time) *BoolCmd { - cmd := NewBoolCmd( - "pexpireat", - key, - tm.UnixNano()/int64(time.Millisecond), - ) - c.process(cmd) - return cmd -} - -func (c *cmdable) PTTL(key string) *DurationCmd { - cmd := NewDurationCmd(time.Millisecond, "pttl", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) RandomKey() *StringCmd { - cmd := NewStringCmd("randomkey") - c.process(cmd) - return cmd -} - -func (c *cmdable) Rename(key, newkey string) *StatusCmd { - cmd := NewStatusCmd("rename", key, newkey) - c.process(cmd) - return cmd -} - -func (c *cmdable) RenameNX(key, newkey string) *BoolCmd { - cmd := NewBoolCmd("renamenx", key, newkey) - c.process(cmd) - return cmd -} - -func (c *cmdable) Restore(key string, ttl time.Duration, value string) *StatusCmd { - cmd := NewStatusCmd( - "restore", - key, - formatMs(ttl), - value, - ) - c.process(cmd) - return cmd -} - -func (c *cmdable) RestoreReplace(key string, ttl time.Duration, value string) *StatusCmd { - cmd := NewStatusCmd( - "restore", - key, - formatMs(ttl), - value, - "replace", - ) - c.process(cmd) - return cmd -} - -type Sort struct { - By string - Offset, Count int64 - Get []string - Order string - Alpha bool -} - -func (sort *Sort) args(key string) []interface{} { - args := []interface{}{"sort", key} - if sort.By != "" { - args = append(args, "by", sort.By) - } - if sort.Offset != 0 || sort.Count != 0 { - args = append(args, "limit", sort.Offset, sort.Count) - } - for _, get := range sort.Get { - args = append(args, "get", get) - } - if sort.Order != "" { - args = append(args, sort.Order) - } - if sort.Alpha { - args = append(args, "alpha") - } - return args -} - -func (c *cmdable) Sort(key string, sort *Sort) *StringSliceCmd { - cmd := NewStringSliceCmd(sort.args(key)...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SortStore(key, store string, sort *Sort) *IntCmd { - args := sort.args(key) - if store != "" { - args = append(args, "store", store) - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SortInterfaces(key string, sort *Sort) *SliceCmd { - cmd := NewSliceCmd(sort.args(key)...) - c.process(cmd) - return cmd -} - -func (c *cmdable) Touch(keys ...string) *IntCmd { - args := make([]interface{}, len(keys)+1) - args[0] = "touch" - for i, key := range keys { - args[i+1] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) TTL(key string) *DurationCmd { - cmd := NewDurationCmd(time.Second, "ttl", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) Type(key string) *StatusCmd { - cmd := NewStatusCmd("type", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) Scan(cursor uint64, match string, count int64) *ScanCmd { - args := []interface{}{"scan", cursor} - if match != "" { - args = append(args, "match", match) - } - if count > 0 { - args = append(args, "count", count) - } - cmd := NewScanCmd(c.process, args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SScan(key string, cursor uint64, match string, count int64) *ScanCmd { - args := []interface{}{"sscan", key, cursor} - if match != "" { - args = append(args, "match", match) - } - if count > 0 { - args = append(args, "count", count) - } - cmd := NewScanCmd(c.process, args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) HScan(key string, cursor uint64, match string, count int64) *ScanCmd { - args := []interface{}{"hscan", key, cursor} - if match != "" { - args = append(args, "match", match) - } - if count > 0 { - args = append(args, "count", count) - } - cmd := NewScanCmd(c.process, args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZScan(key string, cursor uint64, match string, count int64) *ScanCmd { - args := []interface{}{"zscan", key, cursor} - if match != "" { - args = append(args, "match", match) - } - if count > 0 { - args = append(args, "count", count) - } - cmd := NewScanCmd(c.process, args...) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) Append(key, value string) *IntCmd { - cmd := NewIntCmd("append", key, value) - c.process(cmd) - return cmd -} - -type BitCount struct { - Start, End int64 -} - -func (c *cmdable) BitCount(key string, bitCount *BitCount) *IntCmd { - args := []interface{}{"bitcount", key} - if bitCount != nil { - args = append( - args, - bitCount.Start, - bitCount.End, - ) - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) bitOp(op, destKey string, keys ...string) *IntCmd { - args := make([]interface{}, 3+len(keys)) - args[0] = "bitop" - args[1] = op - args[2] = destKey - for i, key := range keys { - args[3+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) BitOpAnd(destKey string, keys ...string) *IntCmd { - return c.bitOp("and", destKey, keys...) -} - -func (c *cmdable) BitOpOr(destKey string, keys ...string) *IntCmd { - return c.bitOp("or", destKey, keys...) -} - -func (c *cmdable) BitOpXor(destKey string, keys ...string) *IntCmd { - return c.bitOp("xor", destKey, keys...) -} - -func (c *cmdable) BitOpNot(destKey string, key string) *IntCmd { - return c.bitOp("not", destKey, key) -} - -func (c *cmdable) BitPos(key string, bit int64, pos ...int64) *IntCmd { - args := make([]interface{}, 3+len(pos)) - args[0] = "bitpos" - args[1] = key - args[2] = bit - switch len(pos) { - case 0: - case 1: - args[3] = pos[0] - case 2: - args[3] = pos[0] - args[4] = pos[1] - default: - panic("too many arguments") - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) Decr(key string) *IntCmd { - cmd := NewIntCmd("decr", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) DecrBy(key string, decrement int64) *IntCmd { - cmd := NewIntCmd("decrby", key, decrement) - c.process(cmd) - return cmd -} - -// Redis `GET key` command. It returns redis.Nil error when key does not exist. -func (c *cmdable) Get(key string) *StringCmd { - cmd := NewStringCmd("get", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) GetBit(key string, offset int64) *IntCmd { - cmd := NewIntCmd("getbit", key, offset) - c.process(cmd) - return cmd -} - -func (c *cmdable) GetRange(key string, start, end int64) *StringCmd { - cmd := NewStringCmd("getrange", key, start, end) - c.process(cmd) - return cmd -} - -func (c *cmdable) GetSet(key string, value interface{}) *StringCmd { - cmd := NewStringCmd("getset", key, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) Incr(key string) *IntCmd { - cmd := NewIntCmd("incr", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) IncrBy(key string, value int64) *IntCmd { - cmd := NewIntCmd("incrby", key, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) IncrByFloat(key string, value float64) *FloatCmd { - cmd := NewFloatCmd("incrbyfloat", key, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) MGet(keys ...string) *SliceCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "mget" - for i, key := range keys { - args[1+i] = key - } - cmd := NewSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) MSet(pairs ...interface{}) *StatusCmd { - args := make([]interface{}, 1, 1+len(pairs)) - args[0] = "mset" - args = appendArgs(args, pairs) - cmd := NewStatusCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) MSetNX(pairs ...interface{}) *BoolCmd { - args := make([]interface{}, 1, 1+len(pairs)) - args[0] = "msetnx" - args = appendArgs(args, pairs) - cmd := NewBoolCmd(args...) - c.process(cmd) - return cmd -} - -// Redis `SET key value [expiration]` command. -// -// Use expiration for `SETEX`-like behavior. -// Zero expiration means the key has no expiration time. -func (c *cmdable) Set(key string, value interface{}, expiration time.Duration) *StatusCmd { - args := make([]interface{}, 3, 4) - args[0] = "set" - args[1] = key - args[2] = value - if expiration > 0 { - if usePrecise(expiration) { - args = append(args, "px", formatMs(expiration)) - } else { - args = append(args, "ex", formatSec(expiration)) - } - } - cmd := NewStatusCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SetBit(key string, offset int64, value int) *IntCmd { - cmd := NewIntCmd( - "setbit", - key, - offset, - value, - ) - c.process(cmd) - return cmd -} - -// Redis `SET key value [expiration] NX` command. -// -// Zero expiration means the key has no expiration time. -func (c *cmdable) SetNX(key string, value interface{}, expiration time.Duration) *BoolCmd { - var cmd *BoolCmd - if expiration == 0 { - // Use old `SETNX` to support old Redis versions. - cmd = NewBoolCmd("setnx", key, value) - } else { - if usePrecise(expiration) { - cmd = NewBoolCmd("set", key, value, "px", formatMs(expiration), "nx") - } else { - cmd = NewBoolCmd("set", key, value, "ex", formatSec(expiration), "nx") - } - } - c.process(cmd) - return cmd -} - -// Redis `SET key value [expiration] XX` command. -// -// Zero expiration means the key has no expiration time. -func (c *cmdable) SetXX(key string, value interface{}, expiration time.Duration) *BoolCmd { - var cmd *BoolCmd - if expiration == 0 { - cmd = NewBoolCmd("set", key, value, "xx") - } else { - if usePrecise(expiration) { - cmd = NewBoolCmd("set", key, value, "px", formatMs(expiration), "xx") - } else { - cmd = NewBoolCmd("set", key, value, "ex", formatSec(expiration), "xx") - } - } - c.process(cmd) - return cmd -} - -func (c *cmdable) SetRange(key string, offset int64, value string) *IntCmd { - cmd := NewIntCmd("setrange", key, offset, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) StrLen(key string) *IntCmd { - cmd := NewIntCmd("strlen", key) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) HDel(key string, fields ...string) *IntCmd { - args := make([]interface{}, 2+len(fields)) - args[0] = "hdel" - args[1] = key - for i, field := range fields { - args[2+i] = field - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) HExists(key, field string) *BoolCmd { - cmd := NewBoolCmd("hexists", key, field) - c.process(cmd) - return cmd -} - -func (c *cmdable) HGet(key, field string) *StringCmd { - cmd := NewStringCmd("hget", key, field) - c.process(cmd) - return cmd -} - -func (c *cmdable) HGetAll(key string) *StringStringMapCmd { - cmd := NewStringStringMapCmd("hgetall", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) HIncrBy(key, field string, incr int64) *IntCmd { - cmd := NewIntCmd("hincrby", key, field, incr) - c.process(cmd) - return cmd -} - -func (c *cmdable) HIncrByFloat(key, field string, incr float64) *FloatCmd { - cmd := NewFloatCmd("hincrbyfloat", key, field, incr) - c.process(cmd) - return cmd -} - -func (c *cmdable) HKeys(key string) *StringSliceCmd { - cmd := NewStringSliceCmd("hkeys", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) HLen(key string) *IntCmd { - cmd := NewIntCmd("hlen", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) HMGet(key string, fields ...string) *SliceCmd { - args := make([]interface{}, 2+len(fields)) - args[0] = "hmget" - args[1] = key - for i, field := range fields { - args[2+i] = field - } - cmd := NewSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) HMSet(key string, fields map[string]interface{}) *StatusCmd { - args := make([]interface{}, 2+len(fields)*2) - args[0] = "hmset" - args[1] = key - i := 2 - for k, v := range fields { - args[i] = k - args[i+1] = v - i += 2 - } - cmd := NewStatusCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) HSet(key, field string, value interface{}) *BoolCmd { - cmd := NewBoolCmd("hset", key, field, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) HSetNX(key, field string, value interface{}) *BoolCmd { - cmd := NewBoolCmd("hsetnx", key, field, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) HVals(key string) *StringSliceCmd { - cmd := NewStringSliceCmd("hvals", key) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) BLPop(timeout time.Duration, keys ...string) *StringSliceCmd { - args := make([]interface{}, 1+len(keys)+1) - args[0] = "blpop" - for i, key := range keys { - args[1+i] = key - } - args[len(args)-1] = formatSec(timeout) - cmd := NewStringSliceCmd(args...) - cmd.setReadTimeout(timeout) - c.process(cmd) - return cmd -} - -func (c *cmdable) BRPop(timeout time.Duration, keys ...string) *StringSliceCmd { - args := make([]interface{}, 1+len(keys)+1) - args[0] = "brpop" - for i, key := range keys { - args[1+i] = key - } - args[len(keys)+1] = formatSec(timeout) - cmd := NewStringSliceCmd(args...) - cmd.setReadTimeout(timeout) - c.process(cmd) - return cmd -} - -func (c *cmdable) BRPopLPush(source, destination string, timeout time.Duration) *StringCmd { - cmd := NewStringCmd( - "brpoplpush", - source, - destination, - formatSec(timeout), - ) - cmd.setReadTimeout(timeout) - c.process(cmd) - return cmd -} - -func (c *cmdable) LIndex(key string, index int64) *StringCmd { - cmd := NewStringCmd("lindex", key, index) - c.process(cmd) - return cmd -} - -func (c *cmdable) LInsert(key, op string, pivot, value interface{}) *IntCmd { - cmd := NewIntCmd("linsert", key, op, pivot, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) LInsertBefore(key string, pivot, value interface{}) *IntCmd { - cmd := NewIntCmd("linsert", key, "before", pivot, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) LInsertAfter(key string, pivot, value interface{}) *IntCmd { - cmd := NewIntCmd("linsert", key, "after", pivot, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) LLen(key string) *IntCmd { - cmd := NewIntCmd("llen", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) LPop(key string) *StringCmd { - cmd := NewStringCmd("lpop", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) LPush(key string, values ...interface{}) *IntCmd { - args := make([]interface{}, 2, 2+len(values)) - args[0] = "lpush" - args[1] = key - args = appendArgs(args, values) - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) LPushX(key string, value interface{}) *IntCmd { - cmd := NewIntCmd("lpushx", key, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) LRange(key string, start, stop int64) *StringSliceCmd { - cmd := NewStringSliceCmd( - "lrange", - key, - start, - stop, - ) - c.process(cmd) - return cmd -} - -func (c *cmdable) LRem(key string, count int64, value interface{}) *IntCmd { - cmd := NewIntCmd("lrem", key, count, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) LSet(key string, index int64, value interface{}) *StatusCmd { - cmd := NewStatusCmd("lset", key, index, value) - c.process(cmd) - return cmd -} - -func (c *cmdable) LTrim(key string, start, stop int64) *StatusCmd { - cmd := NewStatusCmd( - "ltrim", - key, - start, - stop, - ) - c.process(cmd) - return cmd -} - -func (c *cmdable) RPop(key string) *StringCmd { - cmd := NewStringCmd("rpop", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) RPopLPush(source, destination string) *StringCmd { - cmd := NewStringCmd("rpoplpush", source, destination) - c.process(cmd) - return cmd -} - -func (c *cmdable) RPush(key string, values ...interface{}) *IntCmd { - args := make([]interface{}, 2, 2+len(values)) - args[0] = "rpush" - args[1] = key - args = appendArgs(args, values) - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) RPushX(key string, value interface{}) *IntCmd { - cmd := NewIntCmd("rpushx", key, value) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) SAdd(key string, members ...interface{}) *IntCmd { - args := make([]interface{}, 2, 2+len(members)) - args[0] = "sadd" - args[1] = key - args = appendArgs(args, members) - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SCard(key string) *IntCmd { - cmd := NewIntCmd("scard", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) SDiff(keys ...string) *StringSliceCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "sdiff" - for i, key := range keys { - args[1+i] = key - } - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SDiffStore(destination string, keys ...string) *IntCmd { - args := make([]interface{}, 2+len(keys)) - args[0] = "sdiffstore" - args[1] = destination - for i, key := range keys { - args[2+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SInter(keys ...string) *StringSliceCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "sinter" - for i, key := range keys { - args[1+i] = key - } - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SInterStore(destination string, keys ...string) *IntCmd { - args := make([]interface{}, 2+len(keys)) - args[0] = "sinterstore" - args[1] = destination - for i, key := range keys { - args[2+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SIsMember(key string, member interface{}) *BoolCmd { - cmd := NewBoolCmd("sismember", key, member) - c.process(cmd) - return cmd -} - -// Redis `SMEMBERS key` command output as a slice -func (c *cmdable) SMembers(key string) *StringSliceCmd { - cmd := NewStringSliceCmd("smembers", key) - c.process(cmd) - return cmd -} - -// Redis `SMEMBERS key` command output as a map -func (c *cmdable) SMembersMap(key string) *StringStructMapCmd { - cmd := NewStringStructMapCmd("smembers", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) SMove(source, destination string, member interface{}) *BoolCmd { - cmd := NewBoolCmd("smove", source, destination, member) - c.process(cmd) - return cmd -} - -// Redis `SPOP key` command. -func (c *cmdable) SPop(key string) *StringCmd { - cmd := NewStringCmd("spop", key) - c.process(cmd) - return cmd -} - -// Redis `SPOP key count` command. -func (c *cmdable) SPopN(key string, count int64) *StringSliceCmd { - cmd := NewStringSliceCmd("spop", key, count) - c.process(cmd) - return cmd -} - -// Redis `SRANDMEMBER key` command. -func (c *cmdable) SRandMember(key string) *StringCmd { - cmd := NewStringCmd("srandmember", key) - c.process(cmd) - return cmd -} - -// Redis `SRANDMEMBER key count` command. -func (c *cmdable) SRandMemberN(key string, count int64) *StringSliceCmd { - cmd := NewStringSliceCmd("srandmember", key, count) - c.process(cmd) - return cmd -} - -func (c *cmdable) SRem(key string, members ...interface{}) *IntCmd { - args := make([]interface{}, 2, 2+len(members)) - args[0] = "srem" - args[1] = key - args = appendArgs(args, members) - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SUnion(keys ...string) *StringSliceCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "sunion" - for i, key := range keys { - args[1+i] = key - } - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) SUnionStore(destination string, keys ...string) *IntCmd { - args := make([]interface{}, 2+len(keys)) - args[0] = "sunionstore" - args[1] = destination - for i, key := range keys { - args[2+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -type XAddArgs struct { - Stream string - MaxLen int64 // MAXLEN N - MaxLenApprox int64 // MAXLEN ~ N - ID string - Values map[string]interface{} -} - -func (c *cmdable) XAdd(a *XAddArgs) *StringCmd { - args := make([]interface{}, 0, 6+len(a.Values)*2) - args = append(args, "xadd") - args = append(args, a.Stream) - if a.MaxLen > 0 { - args = append(args, "maxlen", a.MaxLen) - } else if a.MaxLenApprox > 0 { - args = append(args, "maxlen", "~", a.MaxLenApprox) - } - if a.ID != "" { - args = append(args, a.ID) - } else { - args = append(args, "*") - } - for k, v := range a.Values { - args = append(args, k) - args = append(args, v) - } - - cmd := NewStringCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) XDel(stream string, ids ...string) *IntCmd { - args := []interface{}{"xdel", stream} - for _, id := range ids { - args = append(args, id) - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) XLen(stream string) *IntCmd { - cmd := NewIntCmd("xlen", stream) - c.process(cmd) - return cmd -} - -func (c *cmdable) XRange(stream, start, stop string) *XMessageSliceCmd { - cmd := NewXMessageSliceCmd("xrange", stream, start, stop) - c.process(cmd) - return cmd -} - -func (c *cmdable) XRangeN(stream, start, stop string, count int64) *XMessageSliceCmd { - cmd := NewXMessageSliceCmd("xrange", stream, start, stop, "count", count) - c.process(cmd) - return cmd -} - -func (c *cmdable) XRevRange(stream, start, stop string) *XMessageSliceCmd { - cmd := NewXMessageSliceCmd("xrevrange", stream, start, stop) - c.process(cmd) - return cmd -} - -func (c *cmdable) XRevRangeN(stream, start, stop string, count int64) *XMessageSliceCmd { - cmd := NewXMessageSliceCmd("xrevrange", stream, start, stop, "count", count) - c.process(cmd) - return cmd -} - -type XReadArgs struct { - Streams []string - Count int64 - Block time.Duration -} - -func (c *cmdable) XRead(a *XReadArgs) *XStreamSliceCmd { - args := make([]interface{}, 0, 5+len(a.Streams)) - args = append(args, "xread") - if a.Count > 0 { - args = append(args, "count") - args = append(args, a.Count) - } - if a.Block >= 0 { - args = append(args, "block") - args = append(args, int64(a.Block/time.Millisecond)) - } - args = append(args, "streams") - for _, s := range a.Streams { - args = append(args, s) - } - - cmd := NewXStreamSliceCmd(args...) - if a.Block >= 0 { - cmd.setReadTimeout(a.Block) - } - c.process(cmd) - return cmd -} - -func (c *cmdable) XReadStreams(streams ...string) *XStreamSliceCmd { - return c.XRead(&XReadArgs{ - Streams: streams, - Block: -1, - }) -} - -func (c *cmdable) XGroupCreate(stream, group, start string) *StatusCmd { - cmd := NewStatusCmd("xgroup", "create", stream, group, start) - c.process(cmd) - return cmd -} - -func (c *cmdable) XGroupCreateMkStream(stream, group, start string) *StatusCmd { - cmd := NewStatusCmd("xgroup", "create", stream, group, start, "mkstream") - c.process(cmd) - return cmd -} - -func (c *cmdable) XGroupSetID(stream, group, start string) *StatusCmd { - cmd := NewStatusCmd("xgroup", "setid", stream, group, start) - c.process(cmd) - return cmd -} - -func (c *cmdable) XGroupDestroy(stream, group string) *IntCmd { - cmd := NewIntCmd("xgroup", "destroy", stream, group) - c.process(cmd) - return cmd -} - -func (c *cmdable) XGroupDelConsumer(stream, group, consumer string) *IntCmd { - cmd := NewIntCmd("xgroup", "delconsumer", stream, group, consumer) - c.process(cmd) - return cmd -} - -type XReadGroupArgs struct { - Group string - Consumer string - // List of streams and ids. - Streams []string - Count int64 - Block time.Duration - NoAck bool -} - -func (c *cmdable) XReadGroup(a *XReadGroupArgs) *XStreamSliceCmd { - args := make([]interface{}, 0, 8+len(a.Streams)) - args = append(args, "xreadgroup", "group", a.Group, a.Consumer) - if a.Count > 0 { - args = append(args, "count", a.Count) - } - if a.Block >= 0 { - args = append(args, "block", int64(a.Block/time.Millisecond)) - } - if a.NoAck { - args = append(args, "noack") - } - args = append(args, "streams") - for _, s := range a.Streams { - args = append(args, s) - } - - cmd := NewXStreamSliceCmd(args...) - if a.Block >= 0 { - cmd.setReadTimeout(a.Block) - } - c.process(cmd) - return cmd -} - -func (c *cmdable) XAck(stream, group string, ids ...string) *IntCmd { - args := []interface{}{"xack", stream, group} - for _, id := range ids { - args = append(args, id) - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) XPending(stream, group string) *XPendingCmd { - cmd := NewXPendingCmd("xpending", stream, group) - c.process(cmd) - return cmd -} - -type XPendingExtArgs struct { - Stream string - Group string - Start string - End string - Count int64 - Consumer string -} - -func (c *cmdable) XPendingExt(a *XPendingExtArgs) *XPendingExtCmd { - args := make([]interface{}, 0, 7) - args = append(args, "xpending", a.Stream, a.Group, a.Start, a.End, a.Count) - if a.Consumer != "" { - args = append(args, a.Consumer) - } - cmd := NewXPendingExtCmd(args...) - c.process(cmd) - return cmd -} - -type XClaimArgs struct { - Stream string - Group string - Consumer string - MinIdle time.Duration - Messages []string -} - -func (c *cmdable) XClaim(a *XClaimArgs) *XMessageSliceCmd { - args := xClaimArgs(a) - cmd := NewXMessageSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) XClaimJustID(a *XClaimArgs) *StringSliceCmd { - args := xClaimArgs(a) - args = append(args, "justid") - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func xClaimArgs(a *XClaimArgs) []interface{} { - args := make([]interface{}, 0, 4+len(a.Messages)) - args = append(args, - "xclaim", - a.Stream, - a.Group, a.Consumer, - int64(a.MinIdle/time.Millisecond)) - for _, id := range a.Messages { - args = append(args, id) - } - return args -} - -func (c *cmdable) XTrim(key string, maxLen int64) *IntCmd { - cmd := NewIntCmd("xtrim", key, "maxlen", maxLen) - c.process(cmd) - return cmd -} - -func (c *cmdable) XTrimApprox(key string, maxLen int64) *IntCmd { - cmd := NewIntCmd("xtrim", key, "maxlen", "~", maxLen) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -// Z represents sorted set member. -type Z struct { - Score float64 - Member interface{} -} - -// ZWithKey represents sorted set member including the name of the key where it was popped. -type ZWithKey struct { - Z - Key string -} - -// ZStore is used as an arg to ZInterStore and ZUnionStore. -type ZStore struct { - Weights []float64 - // Can be SUM, MIN or MAX. - Aggregate string -} - -// Redis `BZPOPMAX key [key ...] timeout` command. -func (c *cmdable) BZPopMax(timeout time.Duration, keys ...string) *ZWithKeyCmd { - args := make([]interface{}, 1+len(keys)+1) - args[0] = "bzpopmax" - for i, key := range keys { - args[1+i] = key - } - args[len(args)-1] = formatSec(timeout) - cmd := NewZWithKeyCmd(args...) - cmd.setReadTimeout(timeout) - c.process(cmd) - return cmd -} - -// Redis `BZPOPMIN key [key ...] timeout` command. -func (c *cmdable) BZPopMin(timeout time.Duration, keys ...string) *ZWithKeyCmd { - args := make([]interface{}, 1+len(keys)+1) - args[0] = "bzpopmin" - for i, key := range keys { - args[1+i] = key - } - args[len(args)-1] = formatSec(timeout) - cmd := NewZWithKeyCmd(args...) - cmd.setReadTimeout(timeout) - c.process(cmd) - return cmd -} - -func (c *cmdable) zAdd(a []interface{}, n int, members ...Z) *IntCmd { - for i, m := range members { - a[n+2*i] = m.Score - a[n+2*i+1] = m.Member - } - cmd := NewIntCmd(a...) - c.process(cmd) - return cmd -} - -// Redis `ZADD key score member [score member ...]` command. -func (c *cmdable) ZAdd(key string, members ...Z) *IntCmd { - const n = 2 - a := make([]interface{}, n+2*len(members)) - a[0], a[1] = "zadd", key - return c.zAdd(a, n, members...) -} - -// Redis `ZADD key NX score member [score member ...]` command. -func (c *cmdable) ZAddNX(key string, members ...Z) *IntCmd { - const n = 3 - a := make([]interface{}, n+2*len(members)) - a[0], a[1], a[2] = "zadd", key, "nx" - return c.zAdd(a, n, members...) -} - -// Redis `ZADD key XX score member [score member ...]` command. -func (c *cmdable) ZAddXX(key string, members ...Z) *IntCmd { - const n = 3 - a := make([]interface{}, n+2*len(members)) - a[0], a[1], a[2] = "zadd", key, "xx" - return c.zAdd(a, n, members...) -} - -// Redis `ZADD key CH score member [score member ...]` command. -func (c *cmdable) ZAddCh(key string, members ...Z) *IntCmd { - const n = 3 - a := make([]interface{}, n+2*len(members)) - a[0], a[1], a[2] = "zadd", key, "ch" - return c.zAdd(a, n, members...) -} - -// Redis `ZADD key NX CH score member [score member ...]` command. -func (c *cmdable) ZAddNXCh(key string, members ...Z) *IntCmd { - const n = 4 - a := make([]interface{}, n+2*len(members)) - a[0], a[1], a[2], a[3] = "zadd", key, "nx", "ch" - return c.zAdd(a, n, members...) -} - -// Redis `ZADD key XX CH score member [score member ...]` command. -func (c *cmdable) ZAddXXCh(key string, members ...Z) *IntCmd { - const n = 4 - a := make([]interface{}, n+2*len(members)) - a[0], a[1], a[2], a[3] = "zadd", key, "xx", "ch" - return c.zAdd(a, n, members...) -} - -func (c *cmdable) zIncr(a []interface{}, n int, members ...Z) *FloatCmd { - for i, m := range members { - a[n+2*i] = m.Score - a[n+2*i+1] = m.Member - } - cmd := NewFloatCmd(a...) - c.process(cmd) - return cmd -} - -// Redis `ZADD key INCR score member` command. -func (c *cmdable) ZIncr(key string, member Z) *FloatCmd { - const n = 3 - a := make([]interface{}, n+2) - a[0], a[1], a[2] = "zadd", key, "incr" - return c.zIncr(a, n, member) -} - -// Redis `ZADD key NX INCR score member` command. -func (c *cmdable) ZIncrNX(key string, member Z) *FloatCmd { - const n = 4 - a := make([]interface{}, n+2) - a[0], a[1], a[2], a[3] = "zadd", key, "incr", "nx" - return c.zIncr(a, n, member) -} - -// Redis `ZADD key XX INCR score member` command. -func (c *cmdable) ZIncrXX(key string, member Z) *FloatCmd { - const n = 4 - a := make([]interface{}, n+2) - a[0], a[1], a[2], a[3] = "zadd", key, "incr", "xx" - return c.zIncr(a, n, member) -} - -func (c *cmdable) ZCard(key string) *IntCmd { - cmd := NewIntCmd("zcard", key) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZCount(key, min, max string) *IntCmd { - cmd := NewIntCmd("zcount", key, min, max) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZLexCount(key, min, max string) *IntCmd { - cmd := NewIntCmd("zlexcount", key, min, max) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZIncrBy(key string, increment float64, member string) *FloatCmd { - cmd := NewFloatCmd("zincrby", key, increment, member) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZInterStore(destination string, store ZStore, keys ...string) *IntCmd { - args := make([]interface{}, 3+len(keys)) - args[0] = "zinterstore" - args[1] = destination - args[2] = len(keys) - for i, key := range keys { - args[3+i] = key - } - if len(store.Weights) > 0 { - args = append(args, "weights") - for _, weight := range store.Weights { - args = append(args, weight) - } - } - if store.Aggregate != "" { - args = append(args, "aggregate", store.Aggregate) - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZPopMax(key string, count ...int64) *ZSliceCmd { - args := []interface{}{ - "zpopmax", - key, - } - - switch len(count) { - case 0: - break - case 1: - args = append(args, count[0]) - default: - panic("too many arguments") - } - - cmd := NewZSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZPopMin(key string, count ...int64) *ZSliceCmd { - args := []interface{}{ - "zpopmin", - key, - } - - switch len(count) { - case 0: - break - case 1: - args = append(args, count[0]) - default: - panic("too many arguments") - } - - cmd := NewZSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) zRange(key string, start, stop int64, withScores bool) *StringSliceCmd { - args := []interface{}{ - "zrange", - key, - start, - stop, - } - if withScores { - args = append(args, "withscores") - } - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRange(key string, start, stop int64) *StringSliceCmd { - return c.zRange(key, start, stop, false) -} - -func (c *cmdable) ZRangeWithScores(key string, start, stop int64) *ZSliceCmd { - cmd := NewZSliceCmd("zrange", key, start, stop, "withscores") - c.process(cmd) - return cmd -} - -type ZRangeBy struct { - Min, Max string - Offset, Count int64 -} - -func (c *cmdable) zRangeBy(zcmd, key string, opt ZRangeBy, withScores bool) *StringSliceCmd { - args := []interface{}{zcmd, key, opt.Min, opt.Max} - if withScores { - args = append(args, "withscores") - } - if opt.Offset != 0 || opt.Count != 0 { - args = append( - args, - "limit", - opt.Offset, - opt.Count, - ) - } - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRangeByScore(key string, opt ZRangeBy) *StringSliceCmd { - return c.zRangeBy("zrangebyscore", key, opt, false) -} - -func (c *cmdable) ZRangeByLex(key string, opt ZRangeBy) *StringSliceCmd { - return c.zRangeBy("zrangebylex", key, opt, false) -} - -func (c *cmdable) ZRangeByScoreWithScores(key string, opt ZRangeBy) *ZSliceCmd { - args := []interface{}{"zrangebyscore", key, opt.Min, opt.Max, "withscores"} - if opt.Offset != 0 || opt.Count != 0 { - args = append( - args, - "limit", - opt.Offset, - opt.Count, - ) - } - cmd := NewZSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRank(key, member string) *IntCmd { - cmd := NewIntCmd("zrank", key, member) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRem(key string, members ...interface{}) *IntCmd { - args := make([]interface{}, 2, 2+len(members)) - args[0] = "zrem" - args[1] = key - args = appendArgs(args, members) - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRemRangeByRank(key string, start, stop int64) *IntCmd { - cmd := NewIntCmd( - "zremrangebyrank", - key, - start, - stop, - ) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRemRangeByScore(key, min, max string) *IntCmd { - cmd := NewIntCmd("zremrangebyscore", key, min, max) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRemRangeByLex(key, min, max string) *IntCmd { - cmd := NewIntCmd("zremrangebylex", key, min, max) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRevRange(key string, start, stop int64) *StringSliceCmd { - cmd := NewStringSliceCmd("zrevrange", key, start, stop) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRevRangeWithScores(key string, start, stop int64) *ZSliceCmd { - cmd := NewZSliceCmd("zrevrange", key, start, stop, "withscores") - c.process(cmd) - return cmd -} - -func (c *cmdable) zRevRangeBy(zcmd, key string, opt ZRangeBy) *StringSliceCmd { - args := []interface{}{zcmd, key, opt.Max, opt.Min} - if opt.Offset != 0 || opt.Count != 0 { - args = append( - args, - "limit", - opt.Offset, - opt.Count, - ) - } - cmd := NewStringSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRevRangeByScore(key string, opt ZRangeBy) *StringSliceCmd { - return c.zRevRangeBy("zrevrangebyscore", key, opt) -} - -func (c *cmdable) ZRevRangeByLex(key string, opt ZRangeBy) *StringSliceCmd { - return c.zRevRangeBy("zrevrangebylex", key, opt) -} - -func (c *cmdable) ZRevRangeByScoreWithScores(key string, opt ZRangeBy) *ZSliceCmd { - args := []interface{}{"zrevrangebyscore", key, opt.Max, opt.Min, "withscores"} - if opt.Offset != 0 || opt.Count != 0 { - args = append( - args, - "limit", - opt.Offset, - opt.Count, - ) - } - cmd := NewZSliceCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZRevRank(key, member string) *IntCmd { - cmd := NewIntCmd("zrevrank", key, member) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZScore(key, member string) *FloatCmd { - cmd := NewFloatCmd("zscore", key, member) - c.process(cmd) - return cmd -} - -func (c *cmdable) ZUnionStore(dest string, store ZStore, keys ...string) *IntCmd { - args := make([]interface{}, 3+len(keys)) - args[0] = "zunionstore" - args[1] = dest - args[2] = len(keys) - for i, key := range keys { - args[3+i] = key - } - if len(store.Weights) > 0 { - args = append(args, "weights") - for _, weight := range store.Weights { - args = append(args, weight) - } - } - if store.Aggregate != "" { - args = append(args, "aggregate", store.Aggregate) - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) PFAdd(key string, els ...interface{}) *IntCmd { - args := make([]interface{}, 2, 2+len(els)) - args[0] = "pfadd" - args[1] = key - args = appendArgs(args, els) - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) PFCount(keys ...string) *IntCmd { - args := make([]interface{}, 1+len(keys)) - args[0] = "pfcount" - for i, key := range keys { - args[1+i] = key - } - cmd := NewIntCmd(args...) - c.process(cmd) - return cmd -} - -func (c *cmdable) PFMerge(dest string, keys ...string) *StatusCmd { - args := make([]interface{}, 2+len(keys)) - args[0] = "pfmerge" - args[1] = dest - for i, key := range keys { - args[2+i] = key - } - cmd := NewStatusCmd(args...) - c.process(cmd) - return cmd -} - -//------------------------------------------------------------------------------ - -func (c *cmdable) BgRewriteAOF() *StatusCmd { - cmd := NewStatusCmd("bgrewriteaof") - c.process(cmd) - return cmd -} - -func (c *cmdable) BgSave() *StatusCmd { - cmd := NewStatusCmd("bgsave") - c.process(cmd) - return cmd -} - -func (c *cmdable) ClientKill(ipPort string) *StatusCmd { - cmd := NewStatusCmd("client", "kill", ipPort) - c.process(cmd) - return cmd -} - -// ClientKillByFilter is new style synx, while the ClientKill is old -// CLIENT KILL